From dde4ef9e197d46542fd2fe7539b82716885869b4 Mon Sep 17 00:00:00 2001 From: quinchs <49576606+quinchs@users.noreply.github.com> Date: Tue, 7 Jul 2020 04:59:50 -0300 Subject: [PATCH 001/494] Added SocketGuildInvites --- .../API/Gateway/InviteCreatedEvent.cs | 32 +++++ .../API/Gateway/InviteDeletedEvent.cs | 19 +++ .../BaseSocketClient.Events.cs | 16 +++ .../DiscordSocketClient.cs | 72 ++++++++++- .../Entities/Guilds/SocketGuild.cs | 18 +++ .../Entities/Invites/ISocketInvite.cs | 42 +++++++ .../Entities/Invites/InviteCache.cs | 47 ++++++++ .../Entities/Invites/SocketGuildInvite.cs | 112 ++++++++++++++++++ .../Entities/Invites/SocketInviteHelper.cs | 17 +++ 9 files changed, 372 insertions(+), 3 deletions(-) create mode 100644 src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs create mode 100644 src/Discord.Net.WebSocket/API/Gateway/InviteDeletedEvent.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs diff --git a/src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs new file mode 100644 index 0000000000..8f8002029f --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs @@ -0,0 +1,32 @@ +using Discord.API; +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 InviteCreatedEvent + { + [JsonProperty("channel_id")] + public ulong ChannelID { get; set; } + [JsonProperty("code")] + public string InviteCode { get; set; } + [JsonProperty("timestamp")] + public Optional RawTimestamp { get; set; } + [JsonProperty("guild_id")] + public ulong? GuildID { get; set; } + [JsonProperty("inviter")] + public Optional inviter { get; set; } + [JsonProperty("max_age")] + public int RawAge { get; set; } + [JsonProperty("max_uses")] + public int MaxUsers { get; set; } + [JsonProperty("temporary")] + public bool TempInvite { get; set; } + [JsonProperty("uses")] + public int Uses { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/API/Gateway/InviteDeletedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/InviteDeletedEvent.cs new file mode 100644 index 0000000000..6bdd337f50 --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/InviteDeletedEvent.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.WebSocket +{ + internal class InviteDeletedEvent + { + [JsonProperty("channel_id")] + public ulong ChannelID { get; set; } + [JsonProperty("guild_id")] + public Optional GuildID { get; set; } + [JsonProperty("code")] + public string Code { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 2cd62b3e8e..221067d224 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -315,6 +315,22 @@ public event Func GuildUpdated { } internal readonly AsyncEvent> _guildUpdatedEvent = new AsyncEvent>(); + //Invites + internal readonly AsyncEvent> _inviteCreatedEvent = new AsyncEvent>(); + /// Fired when a invite is created. + public event Func InviteCreated + { + add { _inviteCreatedEvent.Add(value); } + remove { _inviteCreatedEvent.Remove(value); } + } + internal readonly AsyncEvent, Task>> _inviteDeletedEvent = new AsyncEvent, Task>>(); + /// Fired when a invite is deleted. + public event Func, Task> InviteDeleted + { + add { _inviteDeletedEvent.Add(value); } + remove { _inviteDeletedEvent.Remove(value); } + } + //Users /// Fired when a user joins a guild. public event Func UserJoined { diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 1bfa467b65..f3cb054db2 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -275,7 +275,8 @@ private async Task OnDisconnectingAsync(Exception ex) await heartbeatTask.ConfigureAwait(false); _heartbeatTask = null; - while (_heartbeatTimes.TryDequeue(out _)) { } + while (_heartbeatTimes.TryDequeue(out _)) + { } _lastMessageTime = 0; await _gatewayLogger.DebugAsync("Waiting for guild downloader").ConfigureAwait(false); @@ -286,7 +287,8 @@ private async Task OnDisconnectingAsync(Exception ex) //Clear large guild queue await _gatewayLogger.DebugAsync("Clearing large guild queue").ConfigureAwait(false); - while (_largeGuilds.TryDequeue(out _)) { } + while (_largeGuilds.TryDequeue(out _)) + { } //Raise virtual GUILD_UNAVAILABLEs await _gatewayLogger.DebugAsync("Raising virtual GuildUnavailables").ConfigureAwait(false); @@ -578,7 +580,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } else if (_connection.CancelToken.IsCancellationRequested) return; - + if (BaseConfig.AlwaysDownloadUsers) _ = DownloadUsersAsync(Guilds.Where(x => x.IsAvailable && !x.HasAllMembers)); @@ -1680,6 +1682,70 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th } break; + case "INVITE_CREATE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (INVITE_CREATE)").ConfigureAwait(false); + var data = (payload as JToken).ToObject(_serializer); + if(data.GuildID.HasValue) + { + var guild = State.GetGuild(data.GuildID.Value); + if (guild != null) + { + if (!guild.IsSynced) + { + await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + return; + } + + var channel = guild.GetChannel(data.ChannelID); + + if (channel != null) + { + var invite = new SocketGuildInvite(this, guild, channel, data.InviteCode, data); + guild.AddSocketInvite(invite); + await TimedInvokeAsync(_inviteCreatedEvent, nameof(InviteCreated), invite).ConfigureAwait(false); + } + } + else + { + //add else + } + } + + } + break; + case "INVITE_DELETE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (INVITE_DELETE)").ConfigureAwait(false); + var data = (payload as JToken).ToObject(_serializer); + if(data.GuildID.IsSpecified) + { + var guild = State.GetGuild(data.GuildID.Value); + if (guild != null) + { + if (!guild.IsSynced) + { + await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + return; + } + + var channel = guild.GetChannel(data.ChannelID); + + if (channel != null) + { + var invite = guild.RemoveSocketInvite(data.Code); + var cache = new Cacheable(null, data.Code, invite != null, async () => await guild.GetSocketInviteAsync(data.Code)); + await TimedInvokeAsync(_inviteDeletedEvent, nameof(InviteDeleted), cache).ConfigureAwait(false); + } + } + else + { + //add else + } + } + + } + break; //Ignored (User only) case "CHANNEL_PINS_ACK": diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index d2d759bb36..58a07ff339 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -39,6 +39,7 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable private ImmutableArray _emotes; private ImmutableArray _features; private AudioClient _audioClient; + private InviteCache _invites; #pragma warning restore IDISP002, IDISP006 /// @@ -280,6 +281,7 @@ internal SocketGuild(DiscordSocketClient client, ulong id) _audioLock = new SemaphoreSlim(1, 1); _emotes = ImmutableArray.Create(); _features = ImmutableArray.Create(); + _invites = new InviteCache(client); } internal static SocketGuild Create(DiscordSocketClient discord, ClientState state, ExtendedModel model) { @@ -515,6 +517,22 @@ public Task RemoveBanAsync(IUser user, RequestOptions options = null) public Task RemoveBanAsync(ulong userId, RequestOptions options = null) => GuildHelper.RemoveBanAsync(this, Discord, userId, options); + //Invites + internal void AddSocketInvite(SocketGuildInvite invite) + => _invites.Add(invite); + internal SocketGuildInvite RemoveSocketInvite(string code) + => _invites.Remove(code); + internal async Task GetSocketInviteAsync(string code) + { + var invites = await this.GetInvitesAsync(); + RestInviteMetadata restInvite = invites.First(x => x.Code == code); + if (restInvite == null) + return null; + + var invite = new SocketGuildInvite(Discord, this, this.GetChannel(restInvite.ChannelId), code, restInvite); + return invite; + } + //Channels /// /// Gets a channel in this guild. diff --git a/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs new file mode 100644 index 0000000000..976fa348ab --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.WebSocket +{ + public interface ISocketInvite + { + /// + /// Gets the unique identifier for this invite. + /// + /// + /// A string containing the invite code (e.g. FTqNnyS). + /// + string Code { get; } + /// + /// Gets the URL used to accept this invite using . + /// + /// + /// A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). + /// + string Url { get; } + + /// + /// Gets the channel this invite is linked to. + /// + /// + /// A generic channel that the invite points to. + /// + SocketGuildChannel Channel { get; } + + /// + /// Gets the guild this invite is linked to. + /// + /// + /// A guild object representing the guild that the invite points to. + /// + SocketGuild Guild { get; } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs b/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs new file mode 100644 index 0000000000..2346fb163c --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.WebSocket +{ + internal class InviteCache + { + private readonly ConcurrentDictionary _invites; + private readonly ConcurrentQueue _queue; + private static int _size; + + public InviteCache(DiscordSocketClient client) + { + //NOTE: + //This should be an option in the client config. + _size = client.Guilds.Count * 20; + + _invites = new ConcurrentDictionary(); + _queue = new ConcurrentQueue(); + } + public void Add(SocketGuildInvite invite) + { + if(_invites.TryAdd(invite.Code, invite)) + { + _queue.Enqueue(invite.Code); + + while (_queue.Count > _size && _queue.TryDequeue(out string invCode)) + _invites.TryRemove(invCode, out _); + } + } + public SocketGuildInvite Remove(string inviteCode) + { + _invites.TryRemove(inviteCode, out SocketGuildInvite inv); + return inv; + } + public SocketGuildInvite Get(string inviteCode) + { + if(_invites.TryGetValue(inviteCode, out SocketGuildInvite inv)) + return inv; + return null; + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs new file mode 100644 index 0000000000..35fdf237c9 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs @@ -0,0 +1,112 @@ +using Discord.Rest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization.Formatters; +using System.Text; +using System.Threading.Tasks; +using InviteUpdate = Discord.API.Gateway.InviteCreatedEvent; + +namespace Discord.WebSocket +{ + /// + /// Represents a guild invite + /// + public class SocketGuildInvite : SocketEntity, ISocketInvite + { + public string Code { get; private set; } + public string Url => $"{DiscordConfig.InviteUrl}{Code}"; + public SocketGuildChannel Channel { get; private set; } + public SocketGuild Guild { get; private set; } + /// + /// Gets the unique invite code + /// + /// Returns the unique invite code + /// + /// + public string Id => Code; + /// + /// Gets the user who created the invite + /// + /// Returns the user who created the invite + /// + /// + public SocketGuildUser Inviter { get; private set; } + /// + /// Gets the maximum number of times the invite can be used, if there is no limit then the value will be 0 + /// + /// Returns the maximum number of times the invite can be used, if there is no limit then the value will be 0 + /// + /// + public int? MaxUses { get; private set; } + /// + /// Gets whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) + /// + /// Returns whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) + /// + /// + public bool Temporary { get; private set; } + /// + /// Gets the time at which the invite was created + /// + /// Returns the time at which the invite was created + /// + /// + public DateTimeOffset? CreatedAt { get; private set; } + /// + /// Gets how long the invite is valid for + /// + /// Returns how long the invite is valid for (in seconds) + /// + /// + public TimeSpan? MaxAge { get; private set; } + + internal SocketGuildInvite(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, RestInviteMetadata rest) : base(_client, inviteCode) + { + Code = inviteCode; + Guild = guild; + Channel = channel; + CreatedAt = rest.CreatedAt; + Temporary = rest.IsTemporary; + MaxUses = rest.MaxUses; + Inviter = guild.GetUser(rest.Inviter.Id); + if (rest.MaxAge.HasValue) + MaxAge = TimeSpan.FromSeconds(rest.MaxAge.Value); + } + internal SocketGuildInvite(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, InviteUpdate Update) : base(_client, inviteCode) + { + Code = inviteCode; + Guild = guild; + Channel = channel; + + if (Update.RawTimestamp.IsSpecified) + CreatedAt = Update.RawTimestamp.Value; + else + CreatedAt = DateTimeOffset.Now; + + if (Update.inviter.IsSpecified) + Inviter = guild.GetUser(Update.inviter.Value.Id); + + Temporary = Update.TempInvite; + MaxUses = Update.MaxUsers; + MaxAge = TimeSpan.FromSeconds(Update.RawAge); + } + internal static SocketGuildInvite Create(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, InviteUpdate Update) + { + var invite = new SocketGuildInvite(_client, guild, channel, inviteCode, Update); + return invite; + } + internal static SocketGuildInvite CreateFromRest(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, RestInviteMetadata rest) + { + var invite = new SocketGuildInvite(_client, guild, channel, inviteCode, rest); + return invite; + } + /// + /// Deletes the invite + /// + /// + /// + public Task DeleteAsync(RequestOptions options = null) + => SocketInviteHelper.DeleteAsync(this, Discord, options); + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs b/src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs new file mode 100644 index 0000000000..3781739a93 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.WebSocket +{ + internal class SocketInviteHelper + { + public static async Task DeleteAsync(ISocketInvite invite, BaseSocketClient client, + RequestOptions options) + { + await client.ApiClient.DeleteInviteAsync(invite.Code, options).ConfigureAwait(false); + } + } +} From e4c70d7ad18735a5fd1d0cff9c54ed3e967fb1cf Mon Sep 17 00:00:00 2001 From: quinchs <49576606+quinchs@users.noreply.github.com> Date: Tue, 7 Jul 2020 05:07:02 -0300 Subject: [PATCH 002/494] Fixed a few issues --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 15 ++------------- .../Entities/Invites/ISocketInvite.cs | 2 +- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f3cb054db2..d3a6f5e74a 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -275,8 +275,7 @@ private async Task OnDisconnectingAsync(Exception ex) await heartbeatTask.ConfigureAwait(false); _heartbeatTask = null; - while (_heartbeatTimes.TryDequeue(out _)) - { } + while (_heartbeatTimes.TryDequeue(out _)) { } _lastMessageTime = 0; await _gatewayLogger.DebugAsync("Waiting for guild downloader").ConfigureAwait(false); @@ -287,8 +286,7 @@ private async Task OnDisconnectingAsync(Exception ex) //Clear large guild queue await _gatewayLogger.DebugAsync("Clearing large guild queue").ConfigureAwait(false); - while (_largeGuilds.TryDequeue(out _)) - { } + while (_largeGuilds.TryDequeue(out _)) { } //Raise virtual GUILD_UNAVAILABLEs await _gatewayLogger.DebugAsync("Raising virtual GuildUnavailables").ConfigureAwait(false); @@ -1706,12 +1704,7 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th await TimedInvokeAsync(_inviteCreatedEvent, nameof(InviteCreated), invite).ConfigureAwait(false); } } - else - { - //add else - } } - } break; case "INVITE_DELETE": @@ -1738,10 +1731,6 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th await TimedInvokeAsync(_inviteDeletedEvent, nameof(InviteDeleted), cache).ConfigureAwait(false); } } - else - { - //add else - } } } diff --git a/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs index 976fa348ab..8fe82b089c 100644 --- a/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs +++ b/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs @@ -16,7 +16,7 @@ public interface ISocketInvite /// string Code { get; } /// - /// Gets the URL used to accept this invite using . + /// Gets the URL used to accept this invite /// /// /// A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). From 272c3b7debac7a6c4d1ac33f33009756c14980d8 Mon Sep 17 00:00:00 2001 From: quinchs <49576606+quinchs@users.noreply.github.com> Date: Tue, 7 Jul 2020 05:16:30 -0300 Subject: [PATCH 003/494] Comment update --- src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs b/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs index 2346fb163c..a203b780fb 100644 --- a/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs +++ b/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs @@ -16,7 +16,7 @@ internal class InviteCache public InviteCache(DiscordSocketClient client) { //NOTE: - //This should be an option in the client config. + //This should be an option in the client config. default for now is 20 invites per guild _size = client.Guilds.Count * 20; _invites = new ConcurrentDictionary(); From d35ba91312fccfb2718bde5c2737eef53c7886cb Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 16 Dec 2020 18:49:43 -0400 Subject: [PATCH 004/494] Rest features for ApplicationCommands --- .../Discord.Net.Commands.csproj | 2 +- .../ApplicationCommandOptionType.cs | 23 +++++ .../ApplicationCommandProperties.cs | 15 +++ .../Interactions/IApplicationCommand.cs | 36 ++++++++ .../IApplicationCommandInteractionData.cs | 15 +++ ...ApplicationCommandInteractionDataOption.cs | 16 ++++ .../Interactions/IApplicationCommandOption.cs | 49 ++++++++++ .../IApplicationCommandOptionChoice.cs | 22 +++++ .../Interactions/IDiscordInteraction.cs | 27 ++++++ .../Entities/Interactions/InteractionType.cs | 14 +++ .../API/Common/ApplicationCommand.cs | 17 ++++ .../ApplicationCommandInteractionData.cs | 21 +++++ ...ApplicationCommandInteractionDataOption.cs | 21 +++++ .../API/Common/ApplicationCommandOption.cs | 57 ++++++++++++ .../Common/ApplicationCommandOptionChoice.cs | 18 ++++ .../API/Rest/ApplicationCommandParams.cs | 30 ++++++ src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 92 ++++++++++++++++++- .../ApplicationCommandHelper.cs | 33 +++++++ .../API/Gateway/InteractionCreated.cs | 37 ++++++++ .../Discord.Net.WebSocket.csproj | 2 +- .../DiscordSocketClient.cs | 26 ++++++ .../Entities/Interaction/SocketInteraction.cs | 34 +++++++ 23 files changed, 605 insertions(+), 4 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/InteractionType.cs create mode 100644 src/Discord.Net.Rest/API/Common/ApplicationCommand.cs create mode 100644 src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs create mode 100644 src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs create mode 100644 src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs create mode 100644 src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ApplicationCommandParams.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs create mode 100644 src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 21869d91c2..d64678d7c3 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -1,6 +1,6 @@ - + Discord.Net.Commands Discord.Commands diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs new file mode 100644 index 0000000000..9d876a3bfa --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// The option type of the Slash command parameter, See + /// + public enum ApplicationCommandOptionType : byte + { + SubCommand = 1, + SubCommandGroup = 2, + String = 3, + Integer = 4, + Boolean = 5, + User = 6, + Channel = 7, + Role = 8 + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs new file mode 100644 index 0000000000..5b0c0ecf60 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public class ApplicationCommandProperties + { + public string Name { get; set; } + public string Description { get; set; } + public Optional> Options { get; set; } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs new file mode 100644 index 0000000000..903da5bd48 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// The base command model that belongs to an application. see + /// + public interface IApplicationCommand : ISnowflakeEntity + { + /// + /// Gets the unique id of the command + /// + ulong Id { get; } + + /// + /// Gets the unique id of the parent application + /// + ulong ApplicationId { get; } + + /// + /// The name of the command + /// + string Name { get; } + + /// + /// The description of the command + /// + string Description { get; } + + IEnumerable? Options { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs new file mode 100644 index 0000000000..73d468fe04 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public interface IApplicationCommandInteractionData + { + ulong Id { get; } + string Name { get; } + IEnumerable Options { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs new file mode 100644 index 0000000000..7454e0c99a --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public interface IApplicationCommandInteractionDataOption + { + string Name { get; } + ApplicationCommandOptionType Value { get; } + IEnumerable Options { get; } + + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs new file mode 100644 index 0000000000..466c2a3fcd --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Options for the , see + /// + public interface IApplicationCommandOption + { + /// + /// The type of this + /// + ApplicationCommandOptionType Type { get; } + + /// + /// The name of this command option, 1-32 character name. + /// + string Name { get; } + + /// + /// The discription of this command option, 1-100 character description + /// + string Description { get; } + + /// + /// the first required option for the user to complete--only one option can be default + /// + bool? Default { get; } + + /// + /// if the parameter is required or optional--default + /// + bool? Required { get; } + + /// + /// choices for string and int types for the user to pick from + /// + IEnumerable? Choices { get; } + + /// + /// if the option is a subcommand or subcommand group type, this nested options will be the parameters + /// + IEnumerable? Options { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs new file mode 100644 index 0000000000..7e8e7668d2 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public interface IApplicationCommandOptionChoice + { + /// + /// 1-100 character choice name + /// + string Name { get; } + + /// + /// value of the choice + /// + string Value { get; } + + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs new file mode 100644 index 0000000000..02398a190e --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// An interaction is the base "thing" that is sent when a user invokes a command, and is the same for Slash Commands and other future interaction types. + /// see + /// + public interface IDiscordInteraction : ISnowflakeEntity + { + /// + /// id of the interaction + /// + ulong Id { get; } + InteractionType Type { get; } + IApplicationCommandInteractionData? Data { get; } + ulong GuildId { get; } + ulong ChannelId { get; } + IGuildUser Member { get; } + string Token { get; } + int Version { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs new file mode 100644 index 0000000000..19a5eb8295 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public enum InteractionType : byte + { + Ping = 1, + ApplicationCommand = 2 + } +} diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs new file mode 100644 index 0000000000..8ef109b64c --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ApplicationCommand + { + public ulong Id { get; set; } + public ulong ApplicationId { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public IEnumerable + } +} diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs new file mode 100644 index 0000000000..65c1403f32 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ApplicationCommandInteractionData + { + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("options")] + public Optional> + } +} diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs new file mode 100644 index 0000000000..1d1592bb88 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ApplicationCommandInteractionDataOption + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("value")] + public Optional Value { get; set; } + + [JsonProperty("options")] + public Optional> Options { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs new file mode 100644 index 0000000000..ad7748594f --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -0,0 +1,57 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ApplicationCommandOption + { + [JsonProperty("type")] + public ApplicationCommandOptionType Type { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("description")] + public string Description { get; set; } + + [JsonProperty("default")] + public Optional Default { get; set; } + + [JsonProperty("required")] + public Optional Required { get; set; } + + [JsonProperty("choices")] + public Optional Choices { get; set; } + + [JsonProperty("options")] + public Optional Options { get; set; } + + public ApplicationCommandOption() { } + + public ApplicationCommandOption(IApplicationCommandOption cmd) + { + this.Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice() + { + Name = x.Name, + Value = x.Value + }).ToArray(); + + this.Options = cmd.Options.Select(x => new ApplicationCommandOption(x)).ToArray(); + + this.Required = cmd.Required.HasValue + ? cmd.Required.Value + : Optional.Unspecified; + this.Default = cmd.Default.HasValue + ? cmd.Default.Value + : Optional.Unspecified; + + this.Name = cmd.Name; + this.Type = cmd.Type; + this.Description = cmd.Description; + } + } +} diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs new file mode 100644 index 0000000000..00179dde1b --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ApplicationCommandOptionChoice + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("value")] + public string Value { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/ApplicationCommandParams.cs new file mode 100644 index 0000000000..a674093c51 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ApplicationCommandParams.cs @@ -0,0 +1,30 @@ +using Discord.API; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ApplicationCommandParams + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("description")] + public string Description { get; set; } + + [JsonProperty("options")] + public Optional Options { get; set; } + + public ApplicationCommandParams() { } + public ApplicationCommandParams(string name, string description, ApplicationCommandOption[] options = null) + { + this.Name = name; + this.Description = description; + this.Options = Optional.Create(options); + } + } +} diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 8407abfd68..2737ec0d43 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -1,6 +1,6 @@ - + Discord.Net.Rest Discord.Rest diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 592ad7e920..29e8dca0ef 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -47,7 +47,6 @@ internal class DiscordRestApiClient : IDisposable internal ulong? CurrentUserId { get; set; } public RateLimitPrecision RateLimitPrecision { get; private set; } internal bool UseSystemClock { get; set; } - internal JsonSerializer Serializer => _serializer; /// Unknown OAuth token type. @@ -786,6 +785,97 @@ public async Task RemoveGroupRecipientAsync(ulong channelId, ulong userId, Reque await SendAsync("DELETE", () => $"channels/{channelId}/recipients/{userId}", ids, options: options).ConfigureAwait(false); } + //Interactions + public async Task GetGlobalApplicationCommandsAsync(RequestOptions options = null) + { + try + { + return await SendAsync("GET", $"applications/{this.CurrentUserId}/commands", options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return null; } + } + + public async Task CreateGlobalApplicationCommandAsync(ApplicationCommandParams command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); + Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + + try + { + return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/commands", command, options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return null; } + } + public async Task EditGlobalApplicationCommandAsync(ApplicationCommandParams command, ulong commandId, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); + Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + + try + { + return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/commands/{commandId}", command, options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return null; } + } + public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) + { + try + { + await SendAsync("DELETE", $"applications/{this.CurrentUserId}/commands/{commandId}", options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return; } + } + public async Task GetGuildApplicationCommandAsync(ulong guildId, RequestOptions options = null) + { + try + { + return await SendAsync("GET", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return null; } + } + public async Task CreateGuildApplicationCommandAsync(ApplicationCommandParams command, ulong guildId, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); + Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + + try + { + return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return null; } + } + public async Task EditGuildApplicationCommandAsync(ApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); + Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + + try + { + return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return null; } + } + public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) + { + try + { + await SendAsync("DELETE", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", options: options).ConfigureAwait(false); + } + catch (HttpException ex) { return; } + } + //Guilds public async Task GetGuildAsync(ulong guildId, bool withCounts, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs new file mode 100644 index 0000000000..dd1141d99f --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + internal static class ApplicationCommandHelper + { + public static async Task ModifyAsync(IApplicationCommand command, BaseDiscordClient client, + Action func, RequestOptions options) + { + if (func == null) + throw new ArgumentNullException(nameof(func)); + + var args = new ApplicationCommandProperties(); + func(args); + + var apiArgs = new Discord.API.Rest.ApplicationCommandParams() + { + Description = args.Description, + Name = args.Name, + Options = args.Options.IsSpecified + ? args.Options.Value.Select(x => new API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified, + }; + + return await client.ApiClient.EditGlobalApplicationCommandAsync(apiArgs, command.Id, options); + } + } +} diff --git a/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs b/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs new file mode 100644 index 0000000000..8fb0cbd58a --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs @@ -0,0 +1,37 @@ +using Discord.API; +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 InteractionCreated + { + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("type")] + public InteractionType Type { get; set; } + + [JsonProperty("data")] + public Optional Data { get; set; } + + [JsonProperty("guild_id")] + public ulong GuildId { get; set; } + + [JsonProperty("channel_id")] + public ulong ChannelId { get; set; } + + [JsonProperty("member")] + public GuildMember Member { get; set; } + + [JsonProperty("token")] + public string Token { get; set; } + + [JsonProperty("version")] + public int Version { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 01aece130d..1f65d0a15c 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,6 +1,6 @@ - + Discord.Net.WebSocket Discord.WebSocket diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 0a2123ef21..0d78b405d8 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1778,7 +1778,33 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th } } break; + case "INTERACTION_CREATE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (INVITE_DELETE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + if (State.GetChannel(data.ChannelId) is SocketGuildChannel channel) + { + var guild = channel.Guild; + if (!guild.IsSynced) + { + await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + return; + } + if(data.Type == InteractionType.ApplicationCommand) + { + // TODO: call command + + } + } + else + { + await UnknownChannelAsync(type, data.ChannelId).ConfigureAwait(false); + return; + } + } + break; //Ignored (User only) case "CHANNEL_PINS_ACK": await _gatewayLogger.DebugAsync("Ignored Dispatch (CHANNEL_PINS_ACK)").ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs new file mode 100644 index 0000000000..7786ce3390 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.WebSocket.Entities.Interaction +{ + public class SocketInteraction : SocketEntity, IDiscordInteraction + { + public ulong Id { get; } + + public InteractionType Type { get; } + + public IApplicationCommandInteractionData Data { get; } + + public ulong GuildId { get; } + + public ulong ChannelId { get; } + + public IGuildUser Member { get; } + + public string Token { get; } + + public int Version { get; } + + public DateTimeOffset CreatedAt { get; } + public SocketInteraction(DiscordSocketClient client, ulong id) + : base(client, id) + { + + } + } +} From 27efb7d30d60775c097d32726b40b2d9829be8c0 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 16 Dec 2020 18:58:40 -0400 Subject: [PATCH 005/494] Fixed couple of unfinished properties --- src/Discord.Net.Rest/API/Common/ApplicationCommand.cs | 2 +- .../API/Common/ApplicationCommandInteractionData.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs index 8ef109b64c..9ae240e430 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs @@ -12,6 +12,6 @@ internal class ApplicationCommand public ulong ApplicationId { get; set; } public string Name { get; set; } public string Description { get; set; } - public IEnumerable + public ApplicationCommand[] Options { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index 65c1403f32..b421edf6f7 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -16,6 +16,6 @@ internal class ApplicationCommandInteractionData public string Name { get; set; } [JsonProperty("options")] - public Optional> + public Optional Options { get; set; } } } From fae3fbeda89ef43af501f6f8912e952c3d8ddd05 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 17 Dec 2020 16:48:45 -0400 Subject: [PATCH 006/494] Worked on more rest routes for responding to application commands. Worked on SocketInteraction --- StyleAnalyzer.targets | 4 +- .../ApplicationCommandOptionType.cs | 31 +++++++++ .../ApplicationCommandProperties.cs | 4 ++ .../Interactions/IApplicationCommand.cs | 10 +++ .../IApplicationCommandInteractionData.cs | 16 ++++- ...ApplicationCommandInteractionDataOption.cs | 18 ++++- .../IApplicationCommandOptionChoice.cs | 3 + .../Interactions/IDiscordInteraction.cs | 30 ++++++++- .../Interactions/InteractionResponseType.cs | 39 +++++++++++ .../Entities/Interactions/InteractionType.cs | 10 +++ ...teractionApplicationCommandCallbackData.cs | 24 +++++++ .../API/Common/InteractionFollowupMessage.cs | 20 ++++++ .../API/Common/InteractionResponse.cs | 18 +++++ .../Rest/ModifyInteractionResponseParams.cs | 21 ++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 67 +++++++------------ .../ApplicationCommandHelper.cs | 2 +- .../DiscordSocketClient.cs | 2 +- .../Entities/Interaction/SocketInteraction.cs | 55 ++++++++++----- .../Interaction/SocketInteractionData.cs | 37 ++++++++++ .../SocketInteractionDataOption.cs | 28 ++++++++ 20 files changed, 374 insertions(+), 65 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs create mode 100644 src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs create mode 100644 src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs create mode 100644 src/Discord.Net.Rest/API/Common/InteractionResponse.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs diff --git a/StyleAnalyzer.targets b/StyleAnalyzer.targets index bbb90b800f..2df86122aa 100644 --- a/StyleAnalyzer.targets +++ b/StyleAnalyzer.targets @@ -1,9 +1,9 @@ - + diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs index 9d876a3bfa..3a03e028b0 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -11,13 +11,44 @@ namespace Discord /// public enum ApplicationCommandOptionType : byte { + /// + /// A sub command + /// SubCommand = 1, + + /// + /// A group of sub commands + /// SubCommandGroup = 2, + + /// + /// A of text + /// String = 3, + + /// + /// An + /// Integer = 4, + + /// + /// A + /// Boolean = 5, + + /// + /// A + /// User = 6, + + /// + /// A + /// Channel = 7, + + /// + /// A + /// Role = 8 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 5b0c0ecf60..08406f844e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -6,6 +6,10 @@ namespace Discord { + /// + /// Provides properties that are used to modify a with the specified changes. + /// + /// public class ApplicationCommandProperties { public string Name { get; set; } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index 903da5bd48..cd119cf4b2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -31,6 +31,16 @@ public interface IApplicationCommand : ISnowflakeEntity /// string Description { get; } + /// + /// Modifies this command + /// + /// The delegate containing the properties to modify the command with. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + Task ModifyAsync(Action func, RequestOptions options = null); + IEnumerable? Options { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs index 73d468fe04..c2b00ac4a3 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs @@ -6,10 +6,24 @@ namespace Discord { + /// + /// Represents data of an Interaction Command, see + /// public interface IApplicationCommandInteractionData { + /// + /// The snowflake id of this command + /// ulong Id { get; } + + /// + /// The name of this command + /// string Name { get; } - IEnumerable Options { get; } + + /// + /// The params + values from the user + /// + IReadOnlyCollection Options { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index 7454e0c99a..931c12f2a3 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -6,11 +6,25 @@ namespace Discord { + /// + /// Represents a option group for a command, see + /// public interface IApplicationCommandInteractionDataOption { + /// + /// The name of the parameter + /// string Name { get; } - ApplicationCommandOptionType Value { get; } - IEnumerable Options { get; } + + /// + /// The value of the pair + /// + ApplicationCommandOptionType? Value { get; } + + /// + /// Present if this option is a group or subcommand + /// + IReadOnlyCollection Options { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs index 7e8e7668d2..d7d81ab0d1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs @@ -6,6 +6,9 @@ namespace Discord { + /// + /// Specifies choices for command group + /// public interface IApplicationCommandOptionChoice { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 02398a190e..80b0e91537 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -16,12 +16,40 @@ public interface IDiscordInteraction : ISnowflakeEntity /// id of the interaction /// ulong Id { get; } + + /// + /// The type of this + /// InteractionType Type { get; } + + /// + /// The command data payload + /// IApplicationCommandInteractionData? Data { get; } + + /// + /// The guild it was sent from + /// ulong GuildId { get; } + + /// + /// The channel it was sent from + /// ulong ChannelId { get; } - IGuildUser Member { get; } + + /// + /// Guild member id for the invoking user + /// + ulong MemberId { get; } + + /// + /// A continuation token for responding to the interaction + /// string Token { get; } + + /// + /// read-only property, always 1 + /// int Version { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs new file mode 100644 index 0000000000..afb1ff13c9 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// The response type for an + /// + public enum InteractionResponseType : byte + { + /// + /// ACK a Ping + /// + Pong = 1, + + /// + /// ACK a command without sending a message, eating the user's input + /// + Acknowledge = 2, + + /// + /// Respond with a message, eating the user's input + /// + ChannelMessage = 3, + + /// + /// respond with a message, showing the user's input + /// + ChannelMessageWithSource = 4, + + /// + /// ACK a command without sending a message, showing the user's input + /// + ACKWithSource = 5 + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs index 19a5eb8295..0b5f32f1ff 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs @@ -6,9 +6,19 @@ namespace Discord { + /// + /// Represents a type of Interaction from discord. + /// public enum InteractionType : byte { + /// + /// A ping from discord + /// Ping = 1, + + /// + /// An sent from discord + /// ApplicationCommand = 2 } } diff --git a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs new file mode 100644 index 0000000000..3d9434d942 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class InteractionApplicationCommandCallbackData + { + [JsonProperty("tts")] + public Optional TTS { get; set; } + + [JsonProperty("content")] + public string Content { get; set; } + + [JsonProperty("embeds")] + public Optional Embeds { get; set; } + + [JsonProperty("allowed_mentions")] + public Optional AllowedMentions { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs b/src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs new file mode 100644 index 0000000000..28de67ee6c --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class InteractionFollowupMessage + { + public string Content { get; set; } + public Optional Username { get; set; } + public Optional AvatarUrl { get; set; } + public Optional TTS { get; set; } + public Optional File { get; set; } + public Embed[] Embeds { get; set; } + + } +} diff --git a/src/Discord.Net.Rest/API/Common/InteractionResponse.cs b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs new file mode 100644 index 0000000000..6be48340b3 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class InteractionResponse + { + [JsonProperty("type")] + public InteractionResponseType Type { get; set; } + + [JsonProperty("data")] + public Optional Data { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs new file mode 100644 index 0000000000..4012debd7e --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ModifyInteractionResponseParams + { + [JsonProperty("content")] + public string Content { get; set; } + + [JsonProperty("embeds")] + public Optional Embeds { get; set; } + + [JsonProperty("allowed_mentions")] + public Optional AllowedMentions { get; set; } + } +} diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 29e8dca0ef..60a82d7991 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -803,13 +803,9 @@ public async Task CreateGlobalApplicationCommandAsync(Applic Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - try - { - return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/commands", command, options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return null; } + return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/commands", command, options: options).ConfigureAwait(false); } - public async Task EditGlobalApplicationCommandAsync(ApplicationCommandParams command, ulong commandId, RequestOptions options = null) + public async Task ModifyGlobalApplicationCommandAsync(ApplicationCommandParams command, ulong commandId, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); @@ -817,28 +813,13 @@ public async Task EditGlobalApplicationCommandAsync(Applicat Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - try - { - return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/commands/{commandId}", command, options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return null; } + return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/commands/{commandId}", command, options: options).ConfigureAwait(false); } public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) - { - try - { - await SendAsync("DELETE", $"applications/{this.CurrentUserId}/commands/{commandId}", options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return; } - } + => await SendAsync("DELETE", $"applications/{this.CurrentUserId}/commands/{commandId}", options: options).ConfigureAwait(false); + public async Task GetGuildApplicationCommandAsync(ulong guildId, RequestOptions options = null) - { - try - { - return await SendAsync("GET", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return null; } - } + => await SendAsync("GET", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", options: options).ConfigureAwait(false); public async Task CreateGuildApplicationCommandAsync(ApplicationCommandParams command, ulong guildId, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); @@ -847,13 +828,9 @@ public async Task CreateGuildApplicationCommandAsync(Applica Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - try - { - return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return null; } + return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, options: options).ConfigureAwait(false); } - public async Task EditGuildApplicationCommandAsync(ApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) + public async Task ModifyGuildApplicationCommandAsync(ApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); @@ -861,19 +838,27 @@ public async Task EditGuildApplicationCommandAsync(Applicati Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - try - { - return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return null; } + return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, options: options).ConfigureAwait(false); } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) + => await SendAsync("DELETE", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", options: options).ConfigureAwait(false); + + //Interaction Responses + public async Task CreateInteractionResponse(InteractionResponse response, string interactionId, string interactionToken, RequestOptions options = null) { - try - { - await SendAsync("DELETE", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return; } + if(response.Data.IsSpecified) + Preconditions.AtMost(response.Data.Value.Content.Length, 2000, nameof(response.Data.Value.Content)); + + await SendJsonAsync("POST", $"/interactions/{interactionId}/{interactionToken}/callback", response, options: options); + } + public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) + => await SendJsonAsync("POST", $"/webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, options: options); + public async Task DeleteInteractionResponse(string interactionToken, RequestOptions options = null) + => await SendAsync("DELETE", $"/webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", options: options); + + public async Task CreateInteractionFollowupMessage() + { + } //Guilds diff --git a/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs index dd1141d99f..40dd1f6fc1 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs @@ -27,7 +27,7 @@ public static async Task ModifyAsync(IApplicationCommand command, BaseDis : Optional.Unspecified, }; - return await client.ApiClient.EditGlobalApplicationCommandAsync(apiArgs, command.Id, options); + return await client.ApiClient.ModifyGlobalApplicationCommandAsync(apiArgs, command.Id, options); } } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 0d78b405d8..67e24e616c 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1780,7 +1780,7 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th break; case "INTERACTION_CREATE": { - await _gatewayLogger.DebugAsync("Received Dispatch (INVITE_DELETE)").ConfigureAwait(false); + await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); if (State.GetChannel(data.ChannelId) is SocketGuildChannel channel) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 7786ce3390..dbf2c369b6 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -3,32 +3,55 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using Model = Discord.API.Gateway.InteractionCreated; namespace Discord.WebSocket.Entities.Interaction { public class SocketInteraction : SocketEntity, IDiscordInteraction { - public ulong Id { get; } - - public InteractionType Type { get; } - - public IApplicationCommandInteractionData Data { get; } - - public ulong GuildId { get; } - - public ulong ChannelId { get; } - - public IGuildUser Member { get; } - - public string Token { get; } + public SocketGuild Guild + => Discord.GetGuild(GuildId); + public SocketTextChannel Channel + => Guild.GetTextChannel(ChannelId); + public SocketGuildUser Member + => Guild.GetUser(MemberId); + + public InteractionType Type { get; private set; } + public IApplicationCommandInteractionData Data { get; private set; } + public string Token { get; private set; } + public int Version { get; private set; } + public DateTimeOffset CreatedAt { get; } - public int Version { get; } + public ulong GuildId { get; private set; } + public ulong ChannelId { get; private set; } + public ulong MemberId { get; private set; } - public DateTimeOffset CreatedAt { get; } - public SocketInteraction(DiscordSocketClient client, ulong id) + + internal SocketInteraction(DiscordSocketClient client, ulong id) : base(client, id) { + } + internal static SocketInteraction Create(DiscordSocketClient client, Model model) + { + var entitiy = new SocketInteraction(client, model.Id); + entitiy.Update(model); + return entitiy; } + + internal void Update(Model model) + { + this.Data = model.Data.IsSpecified + ? SocketInteractionData.Create(this.Discord, model.Data.Value) + : null; + + this.GuildId = model.GuildId; + this.ChannelId = model.ChannelId; + this.Token = model.Token; + this.Version = model.Version; + this.MemberId = model.Member.User.Id; + this.Type = model.Type; + } + } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs new file mode 100644 index 0000000000..8e2ae3bf55 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommandInteractionData; + +namespace Discord.WebSocket.Entities.Interaction +{ + public class SocketInteractionData : SocketEntity, IApplicationCommandInteractionData + { + public string Name { get; private set; } + public IReadOnlyCollection Options { get; private set; } + + internal SocketInteractionData(DiscordSocketClient client, ulong id) + : base(client, id) + { + + } + + internal static SocketInteractionData Create(DiscordSocketClient client, Model model) + { + var entity = new SocketInteractionData(client, model.Id); + entity.Update(model); + return entity; + } + internal void Update(Model model) + { + this.Name = model.Name; + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => new SocketInteractionDataOption(x)).ToImmutableArray() + : null; + + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs new file mode 100644 index 0000000000..086ef1b87b --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommandInteractionDataOption; + +namespace Discord.WebSocket.Entities.Interaction +{ + public class SocketInteractionDataOption : IApplicationCommandInteractionDataOption + { + public string Name { get; private set; } + public ApplicationCommandOptionType? Value { get; private set; } + + public IReadOnlyCollection Options { get; private set; } + + internal SocketInteractionDataOption(Model model) + { + this.Name = Name; + this.Value = model.Value.IsSpecified ? model.Value.Value : null; + + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => new SocketInteractionDataOption(x)).ToImmutableArray() + : null; + } + } +} From 670bd923834e7721041301bab4e305bb4e8a89e0 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 18 Dec 2020 18:56:22 -0400 Subject: [PATCH 007/494] Working version of Interactions. All public classes/members now have correct documentation. Added AlwaysAcknowledgeInteractions to the socket client config --- .../ApplicationCommandOptionType.cs | 18 +- .../ApplicationCommandProperties.cs | 12 +- .../Interactions/IApplicationCommand.cs | 19 +- .../IApplicationCommandInteractionData.cs | 8 +- ...ApplicationCommandInteractionDataOption.cs | 13 +- .../Interactions/IApplicationCommandOption.cs | 16 +- .../IApplicationCommandOptionChoice.cs | 6 +- .../Interactions/IDiscordInteraction.cs | 32 ++-- .../Interactions/InteractionResponseType.cs | 12 +- .../Entities/Interactions/InteractionType.cs | 6 +- .../Entities/Messages/MessageType.cs | 7 + ...ApplicationCommandInteractionDataOption.cs | 2 +- ...teractionApplicationCommandCallbackData.cs | 9 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 56 ++++-- .../ApplicationCommandHelper.cs | 33 ---- .../Interactions/InteractionHelper.cs | 21 +++ .../BaseSocketClient.Events.cs | 29 ++- .../DiscordShardedClient.cs | 2 + .../DiscordSocketClient.cs | 13 +- .../DiscordSocketConfig.cs | 23 +++ .../Entities/Interaction/SocketInteraction.cs | 165 +++++++++++++++++- .../Interaction/SocketInteractionData.cs | 2 +- .../SocketInteractionDataOption.cs | 4 +- 23 files changed, 372 insertions(+), 136 deletions(-) delete mode 100644 src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs index 3a03e028b0..97ab54d3d9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -7,47 +7,47 @@ namespace Discord { /// - /// The option type of the Slash command parameter, See + /// The option type of the Slash command parameter, See the discord docs. /// public enum ApplicationCommandOptionType : byte { /// - /// A sub command + /// A sub command. /// SubCommand = 1, /// - /// A group of sub commands + /// A group of sub commands. /// SubCommandGroup = 2, /// - /// A of text + /// A of text. /// String = 3, /// - /// An + /// An . /// Integer = 4, /// - /// A + /// A . /// Boolean = 5, /// - /// A + /// A . /// User = 6, /// - /// A + /// A . /// Channel = 7, /// - /// A + /// A . /// Role = 8 } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 08406f844e..7fa28c8d0e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -9,11 +9,21 @@ namespace Discord /// /// Provides properties that are used to modify a with the specified changes. /// - /// public class ApplicationCommandProperties { + /// + /// Gets or sets the name of this command. + /// public string Name { get; set; } + + /// + /// Gets or sets the discription of this command. + /// public string Description { get; set; } + + /// + /// Gets or sets the options for this command. + /// public Optional> Options { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index cd119cf4b2..122f2c599e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -7,32 +7,37 @@ namespace Discord { /// - /// The base command model that belongs to an application. see + /// The base command model that belongs to an application. see /// public interface IApplicationCommand : ISnowflakeEntity { /// - /// Gets the unique id of the command + /// Gets the unique id of the command. /// ulong Id { get; } /// - /// Gets the unique id of the parent application + /// Gets the unique id of the parent application. /// ulong ApplicationId { get; } /// - /// The name of the command + /// The name of the command. /// string Name { get; } /// - /// The description of the command + /// The description of the command. /// string Description { get; } /// - /// Modifies this command + /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// + IEnumerable? Options { get; } + + /// + /// Modifies this command. /// /// The delegate containing the properties to modify the command with. /// The options to be used when sending the request. @@ -40,7 +45,5 @@ public interface IApplicationCommand : ISnowflakeEntity /// A task that represents the asynchronous modification operation. /// Task ModifyAsync(Action func, RequestOptions options = null); - - IEnumerable? Options { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs index c2b00ac4a3..6f700d898c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs @@ -7,22 +7,22 @@ namespace Discord { /// - /// Represents data of an Interaction Command, see + /// Represents data of an Interaction Command, see /// public interface IApplicationCommandInteractionData { /// - /// The snowflake id of this command + /// The snowflake id of this command /// ulong Id { get; } /// - /// The name of this command + /// The name of this command /// string Name { get; } /// - /// The params + values from the user + /// The params + values from the user /// IReadOnlyCollection Options { get; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index 931c12f2a3..871eb4ae67 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -7,22 +7,25 @@ namespace Discord { /// - /// Represents a option group for a command, see + /// Represents a option group for a command, see /// public interface IApplicationCommandInteractionDataOption { /// - /// The name of the parameter + /// The name of the parameter. /// string Name { get; } /// - /// The value of the pair + /// The value of the pair. + /// + /// This objects type can be any one of the option types in + /// /// - ApplicationCommandOptionType? Value { get; } + object? Value { get; } /// - /// Present if this option is a group or subcommand + /// Present if this option is a group or subcommand. /// IReadOnlyCollection Options { get; } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 466c2a3fcd..14e25a26e2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -7,42 +7,42 @@ namespace Discord { /// - /// Options for the , see + /// Options for the , see The docs. /// public interface IApplicationCommandOption { /// - /// The type of this + /// The type of this . /// ApplicationCommandOptionType Type { get; } /// - /// The name of this command option, 1-32 character name. + /// The name of this command option, 1-32 character name. /// string Name { get; } /// - /// The discription of this command option, 1-100 character description + /// The discription of this command option, 1-100 character description. /// string Description { get; } /// - /// the first required option for the user to complete--only one option can be default + /// The first required option for the user to complete--only one option can be default. /// bool? Default { get; } /// - /// if the parameter is required or optional--default + /// If the parameter is required or optional, default is . /// bool? Required { get; } /// - /// choices for string and int types for the user to pick from + /// Choices for string and int types for the user to pick from. /// IEnumerable? Choices { get; } /// - /// if the option is a subcommand or subcommand group type, this nested options will be the parameters + /// if the option is a subcommand or subcommand group type, this nested options will be the parameters. /// IEnumerable? Options { get; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs index d7d81ab0d1..3b4c7c2492 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs @@ -7,17 +7,17 @@ namespace Discord { /// - /// Specifies choices for command group + /// Specifies choices for command group. /// public interface IApplicationCommandOptionChoice { /// - /// 1-100 character choice name + /// 1-100 character choice name. /// string Name { get; } /// - /// value of the choice + /// value of the choice. /// string Value { get; } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 80b0e91537..2cc0faf4fd 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -7,48 +7,36 @@ namespace Discord { /// - /// An interaction is the base "thing" that is sent when a user invokes a command, and is the same for Slash Commands and other future interaction types. - /// see + /// Represents a discord interaction + /// + /// An interaction is the base "thing" that is sent when a user invokes a command, and is the same for Slash Commands + /// and other future interaction types. see . + /// /// public interface IDiscordInteraction : ISnowflakeEntity { /// - /// id of the interaction + /// The id of the interaction. /// ulong Id { get; } /// - /// The type of this + /// The type of this . /// InteractionType Type { get; } /// - /// The command data payload + /// The command data payload. /// IApplicationCommandInteractionData? Data { get; } /// - /// The guild it was sent from - /// - ulong GuildId { get; } - - /// - /// The channel it was sent from - /// - ulong ChannelId { get; } - - /// - /// Guild member id for the invoking user - /// - ulong MemberId { get; } - - /// - /// A continuation token for responding to the interaction + /// A continuation token for responding to the interaction. /// string Token { get; } /// - /// read-only property, always 1 + /// read-only property, always 1. /// int Version { get; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index afb1ff13c9..99a2283581 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -7,32 +7,32 @@ namespace Discord { /// - /// The response type for an + /// The response type for an . /// public enum InteractionResponseType : byte { /// - /// ACK a Ping + /// ACK a Ping. /// Pong = 1, /// - /// ACK a command without sending a message, eating the user's input + /// ACK a command without sending a message, eating the user's input. /// Acknowledge = 2, /// - /// Respond with a message, eating the user's input + /// Respond with a message, eating the user's input. /// ChannelMessage = 3, /// - /// respond with a message, showing the user's input + /// Respond with a message, showing the user's input. /// ChannelMessageWithSource = 4, /// - /// ACK a command without sending a message, showing the user's input + /// ACK a command without sending a message, showing the user's input. /// ACKWithSource = 5 } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs index 0b5f32f1ff..f95960586a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs @@ -7,17 +7,17 @@ namespace Discord { /// - /// Represents a type of Interaction from discord. + /// Represents a type of Interaction from discord. /// public enum InteractionType : byte { /// - /// A ping from discord + /// A ping from discord. /// Ping = 1, /// - /// An sent from discord + /// An sent from discord. /// ApplicationCommand = 2 } diff --git a/src/Discord.Net.Core/Entities/Messages/MessageType.cs b/src/Discord.Net.Core/Entities/Messages/MessageType.cs index ad1f3a3cd3..e6a117ba5e 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageType.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageType.cs @@ -64,5 +64,12 @@ public enum MessageType /// Only available in API v8. /// Reply = 19, + /// + /// The message is an Application Command + /// + /// + /// Only available in API v8 + /// + ApplicationCommand = 20 } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs index 1d1592bb88..84f2e3f7a2 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs @@ -13,7 +13,7 @@ internal class ApplicationCommandInteractionDataOption public string Name { get; set; } [JsonProperty("value")] - public Optional Value { get; set; } + public Optional Value { get; set; } [JsonProperty("options")] public Optional> Options { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs index 3d9434d942..6637c176c5 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs @@ -13,12 +13,19 @@ internal class InteractionApplicationCommandCallbackData public Optional TTS { get; set; } [JsonProperty("content")] - public string Content { get; set; } + public Optional Content { get; set; } [JsonProperty("embeds")] public Optional Embeds { get; set; } [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } + + public InteractionApplicationCommandCallbackData() { } + public InteractionApplicationCommandCallbackData(string text) + { + this.Content = text; + } + } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 60a82d7991..d9da6503a9 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -787,13 +787,7 @@ public async Task RemoveGroupRecipientAsync(ulong channelId, ulong userId, Reque //Interactions public async Task GetGlobalApplicationCommandsAsync(RequestOptions options = null) - { - try - { - return await SendAsync("GET", $"applications/{this.CurrentUserId}/commands", options: options).ConfigureAwait(false); - } - catch (HttpException ex) { return null; } - } + => await SendAsync("GET", $"applications/{this.CurrentUserId}/commands", options: options).ConfigureAwait(false); public async Task CreateGlobalApplicationCommandAsync(ApplicationCommandParams command, RequestOptions options = null) { @@ -844,21 +838,53 @@ public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong comman => await SendAsync("DELETE", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", options: options).ConfigureAwait(false); //Interaction Responses - public async Task CreateInteractionResponse(InteractionResponse response, string interactionId, string interactionToken, RequestOptions options = null) + public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { - if(response.Data.IsSpecified) - Preconditions.AtMost(response.Data.Value.Content.Length, 2000, nameof(response.Data.Value.Content)); - - await SendJsonAsync("POST", $"/interactions/{interactionId}/{interactionToken}/callback", response, options: options); + if(response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) + Preconditions.AtMost(response.Data.Value.Content.Value.Length, 2000, nameof(response.Data.Value.Content)); + + options = RequestOptions.CreateOrClone(options); + + await SendJsonAsync("POST", () => $"interactions/{interactionId}/{interactionToken}/callback", response, new BucketIds(), options: options); } public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) - => await SendJsonAsync("POST", $"/webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, options: options); + => await SendJsonAsync("POST", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, options: options); public async Task DeleteInteractionResponse(string interactionToken, RequestOptions options = null) - => await SendAsync("DELETE", $"/webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", options: options); + => await SendAsync("DELETE", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", options: options); - public async Task CreateInteractionFollowupMessage() + public async Task CreateInteractionFollowupMessage(CreateWebhookMessageParams args, string token, RequestOptions options = null) { + if (!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) + Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content)); + + if (args.Content?.Length > DiscordConfig.MaxMessageSize) + throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content)); + + options = RequestOptions.CreateOrClone(options); + + return await SendJsonAsync("POST", $"webhooks/{CurrentUserId}/{token}?wait=true", args, options: options).ConfigureAwait(false); + } + + public async Task ModifyInteractionFollowupMessage(CreateWebhookMessageParams args, ulong id, string token, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + Preconditions.NotEqual(id, 0, nameof(id)); + + if (args.Content?.Length > DiscordConfig.MaxMessageSize) + throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content)); + + options = RequestOptions.CreateOrClone(options); + + return await SendJsonAsync("PATCH", $"webhooks/{CurrentUserId}/{token}/messages/{id}", args, options: options).ConfigureAwait(false); + } + + public async Task DeleteInteractionFollowupMessage(ulong id, string token, RequestOptions options = null) + { + Preconditions.NotEqual(id, 0, nameof(id)); + + options = RequestOptions.CreateOrClone(options); + await SendAsync("DELETE", $"webhooks/{CurrentUserId}/{token}/messages/{id}", options: options).ConfigureAwait(false); } //Guilds diff --git a/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs deleted file mode 100644 index 40dd1f6fc1..0000000000 --- a/src/Discord.Net.Rest/Entities/Interactions/ApplicationCommands/ApplicationCommandHelper.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Model = Discord.API.ApplicationCommand; - -namespace Discord.Rest -{ - internal static class ApplicationCommandHelper - { - public static async Task ModifyAsync(IApplicationCommand command, BaseDiscordClient client, - Action func, RequestOptions options) - { - if (func == null) - throw new ArgumentNullException(nameof(func)); - - var args = new ApplicationCommandProperties(); - func(args); - - var apiArgs = new Discord.API.Rest.ApplicationCommandParams() - { - Description = args.Description, - Name = args.Name, - Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified, - }; - - return await client.ApiClient.ModifyGlobalApplicationCommandAsync(apiArgs, command.Id, options); - } - } -} diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs new file mode 100644 index 0000000000..a275a7d0af --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -0,0 +1,21 @@ +using Discord.API; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Rest +{ + internal static class InteractionHelper + { + internal static async Task SendFollowupAsync(BaseDiscordClient client, API.Rest.CreateWebhookMessageParams args, + string token, IMessageChannel channel, RequestOptions options = null) + { + var model = await client.ApiClient.CreateInteractionFollowupMessage(args, token, options); + + var entity = RestUserMessage.Create(client, channel, client.CurrentUser, model); + return entity; + } + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 966aec7fad..7b8a245cc5 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -23,7 +23,7 @@ public partial class BaseSocketClient /// /// - public event Func ChannelCreated + public event Func ChannelCreated { add { _channelCreatedEvent.Add(value); } remove { _channelCreatedEvent.Remove(value); } @@ -70,7 +70,7 @@ public event Func ChannelDestroyed { public event Func ChannelUpdated { add { _channelUpdatedEvent.Add(value); } remove { _channelUpdatedEvent.Remove(value); } - } + } internal readonly AsyncEvent> _channelUpdatedEvent = new AsyncEvent>(); //Messages @@ -351,7 +351,7 @@ public event Func GuildMemberUpdated { add { _guildMemberUpdatedEvent.Add(value); } remove { _guildMemberUpdatedEvent.Remove(value); } } - internal readonly AsyncEvent> _guildMemberUpdatedEvent = new AsyncEvent>(); + internal readonly AsyncEvent> _guildMemberUpdatedEvent = new AsyncEvent>(); /// Fired when a user joins, leaves, or moves voice channels. public event Func UserVoiceStateUpdated { add { _userVoiceStateUpdatedEvent.Add(value); } @@ -361,7 +361,7 @@ public event Func UserVoic /// Fired when the bot connects to a Discord voice server. public event Func VoiceServerUpdated { - add { _voiceServerUpdatedEvent.Add(value); } + add { _voiceServerUpdatedEvent.Add(value); } remove { _voiceServerUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _voiceServerUpdatedEvent = new AsyncEvent>(); @@ -431,5 +431,26 @@ public event Func InviteDeleted remove { _inviteDeletedEvent.Remove(value); } } internal readonly AsyncEvent> _inviteDeletedEvent = new AsyncEvent>(); + + //Interactions + /// + /// Fired when an Interaction is created. + /// + /// + /// + /// This event is fired when an interaction is created. The event handler must return a + /// and accept a as its parameter. + /// + /// + /// The interaction created will be passed into the parameter. + /// + /// + public event Func InteractionCreated + { + add { _interactionCreatedEvent.Add(value); } + remove { _interactionCreatedEvent.Remove(value); } + } + internal readonly AsyncEvent> _interactionCreatedEvent = new AsyncEvent>(); + } } diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index a2c89d4e53..7d62596f7f 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -378,6 +378,8 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.InviteCreated += (invite) => _inviteCreatedEvent.InvokeAsync(invite); client.InviteDeleted += (channel, invite) => _inviteDeletedEvent.InvokeAsync(channel, invite); + + client.InteractionCreated += (interaction) => _interactionCreatedEvent.InvokeAsync(interaction); } //IDiscordClient diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 67e24e616c..e2029e4711 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -73,6 +73,7 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient internal bool AlwaysDownloadUsers { get; private set; } internal int? HandlerTimeout { get; private set; } internal bool? ExclusiveBulkDelete { get; private set; } + internal bool AlwaysAcknowledgeInteractions { get; private set; } internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; /// @@ -134,6 +135,7 @@ private DiscordSocketClient(DiscordSocketConfig config, API.DiscordSocketApiClie UdpSocketProvider = config.UdpSocketProvider; WebSocketProvider = config.WebSocketProvider; AlwaysDownloadUsers = config.AlwaysDownloadUsers; + AlwaysAcknowledgeInteractions = config.AlwaysAcknowledgeInteractions; HandlerTimeout = config.HandlerTimeout; ExclusiveBulkDelete = config.ExclusiveBulkDelete; State = new ClientState(0, 0); @@ -1792,11 +1794,12 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th return; } - if(data.Type == InteractionType.ApplicationCommand) - { - // TODO: call command - - } + var interaction = SocketInteraction.Create(this, data); + + if (this.AlwaysAcknowledgeInteractions) + await interaction.AcknowledgeAsync().ConfigureAwait(false); + + await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); } else { diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index a45d4f5bea..b93f6d33d2 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -105,6 +105,29 @@ public class DiscordSocketConfig : DiscordRestConfig /// public bool AlwaysDownloadUsers { get; set; } = false; + /// + /// Gets or sets whether or not interactions are acknowledge with source. + /// + /// + /// + /// Discord interactions will not go thru in chat until the client responds to them. With this option set to + /// the client will automatically acknowledge the interaction with . + /// see the docs on + /// responding to interactions for more info + /// + /// + /// With this option set to you will have to acknowledge the interaction with + /// , + /// only after the interaction is captured the origional slash command message will be visible. + /// + /// + /// Please note that manually acknowledging the interaction with a message reply will not provide any return data. + /// By autmatically acknowledging the interaction without sending the message will allow for follow up responses to + /// be used, follow up responses return the message data sent. + /// + /// + public bool AlwaysAcknowledgeInteractions { get; set; } = true; + /// /// Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. /// Setting this property to nulldisables this check. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index dbf2c369b6..1eb8fdca06 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -1,3 +1,4 @@ +using Discord.Rest; using System; using System.Collections.Generic; using System.Linq; @@ -5,28 +6,63 @@ using System.Threading.Tasks; using Model = Discord.API.Gateway.InteractionCreated; -namespace Discord.WebSocket.Entities.Interaction +namespace Discord.WebSocket { + /// + /// Represents an Interaction recieved over the gateway + /// public class SocketInteraction : SocketEntity, IDiscordInteraction { + /// + /// The this interaction was used in + /// public SocketGuild Guild => Discord.GetGuild(GuildId); + + /// + /// The this interaction was used in + /// public SocketTextChannel Channel => Guild.GetTextChannel(ChannelId); + + /// + /// The who triggered this interaction + /// public SocketGuildUser Member => Guild.GetUser(MemberId); + /// + /// The type of this interaction + /// public InteractionType Type { get; private set; } + + /// + /// The data associated with this interaction + /// public IApplicationCommandInteractionData Data { get; private set; } + + /// + /// The token used to respond to this interaction + /// public string Token { get; private set; } + + /// + /// The version of this interaction + /// public int Version { get; private set; } + public DateTimeOffset CreatedAt { get; } - public ulong GuildId { get; private set; } - public ulong ChannelId { get; private set; } - public ulong MemberId { get; private set; } + /// + /// if the token is valid for replying to, otherwise + /// + public bool IsValidToken + => CheckToken(); + + private ulong GuildId { get; set; } + private ulong ChannelId { get; set; } + private ulong MemberId { get; set; } - internal SocketInteraction(DiscordSocketClient client, ulong id) : base(client, id) { @@ -52,6 +88,125 @@ internal void Update(Model model) this.MemberId = model.Member.User.Id; this.Type = model.Type; } + private bool CheckToken() + { + // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction + return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes >= 15d; + } + + /// + /// Responds to an Interaction, eating its input + /// + /// If you have set to , this method + /// will be obsolete and will use + /// + /// + /// The text of the message to be sent + /// if the message should be read out by a text-to-speech reader, otherwise + /// A to send with this response + /// The type of response to this Interaction + /// The allowed mentions for this response + /// The request options for this response + /// + /// The sent as the response. If this is the first acknowledgement, it will return null; + /// + /// Message content is too long, length must be less or equal to . + + public async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null) + { + if (Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.Pong) + throw new InvalidOperationException($"Cannot use {Type} on a send message function"); + + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (Discord.AlwaysAcknowledgeInteractions) + return await FollowupAsync(); + + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); + } + } + + + var response = new API.InteractionResponse() + { + Type = Type, + Data = new API.InteractionApplicationCommandCallbackData(text) + { + AllowedMentions = allowedMentions?.ToModel(), + Embeds = embed != null + ? new API.Embed[] { embed.ToModel() } + : Optional.Unspecified, + TTS = isTTS + } + }; + + await Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, Token, options); + return null; + } + + /// + /// Sends a followup message for this interaction + /// + /// The text of the message to be sent + /// if the message should be read out by a text-to-speech reader, otherwise + /// A to send with this response + /// The type of response to this Interaction + /// The allowed mentions for this response + /// The request options for this response + /// + /// The sent message + /// + public async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, + AllowedMentions allowedMentions = null, RequestOptions options = null) + { + if (Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.Pong) + throw new InvalidOperationException($"Cannot use {Type} on a send message function"); + + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + var args = new API.Rest.CreateWebhookMessageParams(text) + { + IsTTS = isTTS, + Embeds = embed != null + ? new API.Embed[] { embed.ToModel() } + : Optional.Unspecified, + }; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + + } + + /// + /// Acknowledges this interaction with the + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction + /// + public async Task AcknowledgeAsync(RequestOptions options = null) + { + var response = new API.InteractionResponse() + { + Type = InteractionResponseType.ACKWithSource, + }; + + await Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, Token, options).ConfigureAwait(false); + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs index 8e2ae3bf55..4ff5824804 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandInteractionData; -namespace Discord.WebSocket.Entities.Interaction +namespace Discord.WebSocket { public class SocketInteractionData : SocketEntity, IApplicationCommandInteractionData { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs index 086ef1b87b..26a7b9659b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs @@ -6,12 +6,12 @@ using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandInteractionDataOption; -namespace Discord.WebSocket.Entities.Interaction +namespace Discord.WebSocket { public class SocketInteractionDataOption : IApplicationCommandInteractionDataOption { public string Name { get; private set; } - public ApplicationCommandOptionType? Value { get; private set; } + public object? Value { get; private set; } public IReadOnlyCollection Options { get; private set; } From a0f9646235fb0aff3e7b4ed14c976ef7f0c4b814 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 19 Dec 2020 14:44:43 -0400 Subject: [PATCH 008/494] Get, modify, and delete Guild/Global commands, New Rest entities: RestApplicationCommand,RestGlobalCommand, RestGuildCommand, RestApplicationCommandOption, RestApplicationCommandChoice, RestApplicationCommandType. Added public methods to the RestClient to fetch/create/edit interactions. --- .../ApplicationCommandProperties.cs | 28 +++- .../Interactions/IApplicationCommand.cs | 11 +- .../Interactions/IApplicationCommandOption.cs | 4 +- .../API/Common/ApplicationCommand.cs | 8 +- src/Discord.Net.Rest/ClientHelper.cs | 19 +++ src/Discord.Net.Rest/DiscordRestClient.cs | 8 ++ .../Interactions/InteractionHelper.cs | 124 +++++++++++++++++- .../Interactions/RestApplicationCommand.cs | 58 ++++++++ .../RestApplicationCommandChoice.cs | 22 ++++ .../RestApplicationCommandOption.cs | 57 ++++++++ .../RestApplicationCommandType.cs | 14 ++ .../Interactions/RestGlobalCommand.cs | 41 ++++++ .../Entities/Interactions/RestGuildCommand.cs | 40 ++++++ .../DiscordSocketConfig.cs | 18 +-- .../Entities/Interaction/SocketInteraction.cs | 9 +- 15 files changed, 434 insertions(+), 27 deletions(-) create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 7fa28c8d0e..990fe2e5ea 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -11,19 +11,41 @@ namespace Discord /// public class ApplicationCommandProperties { + private string _name { get; set; } + private string _description { get; set; } + /// /// Gets or sets the name of this command. /// - public string Name { get; set; } + public string Name + { + get => _name; + set + { + if(value.Length > 32) + throw new ArgumentException("Name length must be less than or equal to 32"); + _name = value; + } + } /// /// Gets or sets the discription of this command. /// - public string Description { get; set; } + public string Description + { + get => _description; + set + { + if (value.Length > 100) + throw new ArgumentException("Description length must be less than or equal to 100"); + _description = value; + } + } + /// /// Gets or sets the options for this command. /// - public Optional> Options { get; set; } + public Optional> Options { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index 122f2c599e..c094efbd87 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -34,16 +34,13 @@ public interface IApplicationCommand : ISnowflakeEntity /// /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// - IEnumerable? Options { get; } + IReadOnlyCollection Options { get; } /// - /// Modifies this command. + /// Deletes this command /// - /// The delegate containing the properties to modify the command with. /// The options to be used when sending the request. - /// - /// A task that represents the asynchronous modification operation. - /// - Task ModifyAsync(Action func, RequestOptions options = null); + /// + Task DeleteAsync(RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 14e25a26e2..960d1571d1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -39,11 +39,11 @@ public interface IApplicationCommandOption /// /// Choices for string and int types for the user to pick from. /// - IEnumerable? Choices { get; } + IReadOnlyCollection? Choices { get; } /// /// if the option is a subcommand or subcommand group type, this nested options will be the parameters. /// - IEnumerable? Options { get; } + IReadOnlyCollection? Options { get; } } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs index 9ae240e430..f428374504 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -8,10 +9,15 @@ namespace Discord.API { internal class ApplicationCommand { + [JsonProperty("id")] public ulong Id { get; set; } + [JsonProperty("application_id")] public ulong ApplicationId { get; set; } + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("description")] public string Description { get; set; } - public ApplicationCommand[] Options { get; set; } + [JsonProperty("options")] + public Optional Options { get; set; } } } diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 8910e999a4..d39fcd7a21 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -201,5 +201,24 @@ public static async Task GetBotGatewayAsync(BaseDiscordClient client } }; } + + public static async Task GetGlobalApplicationCommands(BaseDiscordClient client, RequestOptions options) + { + var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(options).ConfigureAwait(false); + + if (!response.Any()) + return null; + + return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); + } + public static async Task GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, RequestOptions options) + { + var response = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, options).ConfigureAwait(false); + + if (!response.Any()) + return null; + + return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToArray(); + } } } diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 48c40fdfaa..79fb1a5c21 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -107,6 +107,14 @@ public Task GetVoiceRegionAsync(string id, RequestOptions optio => ClientHelper.GetVoiceRegionAsync(this, id, options); public Task GetWebhookAsync(ulong id, RequestOptions options = null) => ClientHelper.GetWebhookAsync(this, id, options); + public Task CreateGobalCommand(Action func, RequestOptions options = null) + => InteractionHelper.CreateGlobalCommand(this, func, options); + public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) + => InteractionHelper.CreateGuildCommand(this, guildId, func, options); + public Task GetGlobalApplicationCommands(RequestOptions options = null) + => ClientHelper.GetGlobalApplicationCommands(this, options); + public Task GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) + => ClientHelper.GetGuildApplicationCommands(this, guildId, options); //IDiscordClient /// diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index a275a7d0af..341087cb4b 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -1,4 +1,5 @@ using Discord.API; +using Discord.API.Rest; using System; using System.Collections.Generic; using System.Linq; @@ -12,10 +13,131 @@ internal static class InteractionHelper internal static async Task SendFollowupAsync(BaseDiscordClient client, API.Rest.CreateWebhookMessageParams args, string token, IMessageChannel channel, RequestOptions options = null) { - var model = await client.ApiClient.CreateInteractionFollowupMessage(args, token, options); + var model = await client.ApiClient.CreateInteractionFollowupMessage(args, token, options).ConfigureAwait(false); var entity = RestUserMessage.Create(client, channel, client.CurrentUser, model); return entity; } + + // Global commands + internal static async Task CreateGlobalCommand(BaseDiscordClient client, + Action func, RequestOptions options = null) + { + var args = new ApplicationCommandProperties(); + func(args); + + if (args.Options.IsSpecified) + { + if (args.Options.Value.Count > 10) + throw new ArgumentException("Option count must be 10 or less"); + } + + var model = new ApplicationCommandParams() + { + Name = args.Name, + Description = args.Description, + Options = args.Options.IsSpecified + ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified + }; + + var cmd = await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); + return RestGlobalCommand.Create(client, cmd); + } + + internal static async Task ModifyGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, + Action func, RequestOptions options = null) + { + ApplicationCommandProperties args = new ApplicationCommandProperties(); + func(args); + + if (args.Options.IsSpecified) + { + if (args.Options.Value.Count > 10) + throw new ArgumentException("Option count must be 10 or less"); + } + + var model = new Discord.API.Rest.ApplicationCommandParams() + { + Name = args.Name, + Description = args.Description, + Options = args.Options.IsSpecified + ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified + }; + + var msg = await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); + command.Update(msg); + return command; + } + + + internal static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); + + await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); + } + + // Guild Commands + internal static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + Action func, RequestOptions options = null) + { + var args = new ApplicationCommandProperties(); + func(args); + + if (args.Options.IsSpecified) + { + if (args.Options.Value.Count > 10) + throw new ArgumentException("Option count must be 10 or less"); + } + + var model = new ApplicationCommandParams() + { + Name = args.Name, + Description = args.Description, + Options = args.Options.IsSpecified + ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified + }; + + var cmd = await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); + return RestGuildCommand.Create(client, cmd, guildId); + } + + internal static async Task ModifyGuildCommand(BaseDiscordClient client, RestGuildCommand command, + Action func, RequestOptions options = null) + { + ApplicationCommandProperties args = new ApplicationCommandProperties(); + func(args); + + if (args.Options.IsSpecified) + { + if (args.Options.Value.Count > 10) + throw new ArgumentException("Option count must be 10 or less"); + } + + var model = new Discord.API.Rest.ApplicationCommandParams() + { + Name = args.Name, + Description = args.Description, + Options = args.Options.IsSpecified + ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified + }; + + var msg = await client.ApiClient.ModifyGuildApplicationCommandAsync(model, command.Id, command.GuildId, options).ConfigureAwait(false); + command.Update(msg); + return command; + } + + internal static async Task DeleteGuildCommand(BaseDiscordClient client, RestGuildCommand command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); + + await client.ApiClient.DeleteGuildApplicationCommandAsync(command.Id, command.GuildId, options).ConfigureAwait(false); + } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs new file mode 100644 index 0000000000..c52d69619f --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + /// + /// Represents a rest implementation of the + /// + public abstract class RestApplicationCommand : RestEntity, IApplicationCommand + { + public ulong ApplicationId { get; private set; } + + public string Name { get; private set; } + + public string Description { get; private set; } + + public IReadOnlyCollection Options { get; private set; } + + public RestApplicationCommandType CommandType { get; private set; } + + public DateTimeOffset CreatedAt + => SnowflakeUtils.FromSnowflake(this.Id); + + internal RestApplicationCommand(BaseDiscordClient client, ulong id) + : base(client, id) + { + + } + + internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, RestApplicationCommandType type, ulong guildId = 0) + { + if (type == RestApplicationCommandType.GlobalCommand) + return RestGlobalCommand.Create(client, model); + + if (type == RestApplicationCommandType.GuildCommand) + return RestGuildCommand.Create(client, model, guildId); + + return null; + } + + internal virtual void Update(Model model) + { + this.ApplicationId = model.ApplicationId; + this.Name = model.Name; + + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() + : null; + } + + public virtual Task DeleteAsync(RequestOptions options = null) => throw new NotImplementedException(); + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs new file mode 100644 index 0000000000..211d2fe124 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommandOptionChoice; + +namespace Discord.Rest +{ + public class RestApplicationCommandChoice : IApplicationCommandOptionChoice + { + public string Name { get; } + + public string Value { get; } + + internal RestApplicationCommandChoice(Model model) + { + this.Name = model.Name; + this.Value = model.Value; + } + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs new file mode 100644 index 0000000000..9463191123 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommandOption; + +namespace Discord.Rest +{ + public class RestApplicationCommandOption : IApplicationCommandOption + { + public ApplicationCommandOptionType Type { get; private set; } + + public string Name { get; private set; } + + public string Description { get; private set; } + + public bool? Default { get; private set; } + + public bool? Required { get; private set; } + + public IReadOnlyCollection Choices { get; private set; } + + public IReadOnlyCollection Options { get; private set; } + + internal RestApplicationCommandOption() { } + + internal static RestApplicationCommandOption Create(Model model) + { + var options = new RestApplicationCommandOption(); + options.Update(model); + return options; + } + + internal void Update(Model model) + { + this.Type = model.Type; + this.Name = model.Name; + this.Description = model.Description; + + if (model.Default.IsSpecified) + this.Default = model.Default.Value; + + if (model.Required.IsSpecified) + this.Required = model.Required.Value; + + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => Create(x)).ToImmutableArray() + : null; + + this.Choices = model.Choices.IsSpecified + ? model.Choices.Value.Select(x => new RestApplicationCommandChoice(x)).ToImmutableArray() + : null; + } + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs new file mode 100644 index 0000000000..7ea7cd9f0a --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Rest +{ + public enum RestApplicationCommandType + { + GlobalCommand, + GuildCommand + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs new file mode 100644 index 0000000000..d44e6819d6 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + /// + /// Represents a global Slash command + /// + public class RestGlobalCommand : RestApplicationCommand + { + internal RestGlobalCommand(BaseDiscordClient client, ulong id) + : base(client, id) + { + + } + + internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) + { + var entity = new RestGlobalCommand(client, model.Id); + entity.Update(model); + return entity; + } + public override async Task DeleteAsync(RequestOptions options = null) + => await InteractionHelper.DeleteGlobalCommand(Discord, this).ConfigureAwait(false); + + /// + /// Modifies this . + /// + /// The delegate containing the properties to modify the command with. + /// The options to be used when sending the request. + /// + /// The modified command + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + => await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs new file mode 100644 index 0000000000..5bf3860512 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + public class RestGuildCommand : RestApplicationCommand + { + public ulong GuildId { get; set; } + internal RestGuildCommand(BaseDiscordClient client, ulong id, ulong guildId) + : base(client, id) + { + this.GuildId = guildId; + } + + internal static RestGuildCommand Create(BaseDiscordClient client, Model model, ulong guildId) + { + var entity = new RestGuildCommand(client, model.Id, guildId); + entity.Update(model); + return entity; + } + + public override async Task DeleteAsync(RequestOptions options = null) + => await InteractionHelper.DeleteGuildCommand(Discord, this).ConfigureAwait(false); + + /// + /// Modifies this . + /// + /// The delegate containing the properties to modify the command with. + /// The options to be used when sending the request. + /// + /// The modified command + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + => await InteractionHelper.ModifyGuildCommand(Discord, this, func, options).ConfigureAwait(false); + } +} diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index b93f6d33d2..171094aded 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -110,20 +110,20 @@ public class DiscordSocketConfig : DiscordRestConfig /// /// /// - /// Discord interactions will not go thru in chat until the client responds to them. With this option set to - /// the client will automatically acknowledge the interaction with . - /// see the docs on - /// responding to interactions for more info + /// Discord interactions will not appear in chat until the client responds to them. With this option set to + /// , the client will automatically acknowledge the interaction with . + /// See the docs on + /// responding to interactions for more info. /// /// - /// With this option set to you will have to acknowledge the interaction with - /// , - /// only after the interaction is captured the origional slash command message will be visible. + /// With this option set to , you will have to acknowledge the interaction with + /// . + /// Only after the interaction is acknowledged, the origional slash command message will be visible. /// /// /// Please note that manually acknowledging the interaction with a message reply will not provide any return data. - /// By autmatically acknowledging the interaction without sending the message will allow for follow up responses to - /// be used, follow up responses return the message data sent. + /// Automatically acknowledging the interaction without sending the message will allow for follow up responses to + /// be used; follow up responses return the message data sent. /// /// public bool AlwaysAcknowledgeInteractions { get; set; } = true; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 1eb8fdca06..f51d0a8f86 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -95,10 +95,10 @@ private bool CheckToken() } /// - /// Responds to an Interaction, eating its input + /// Responds to an Interaction. /// - /// If you have set to , this method - /// will be obsolete and will use + /// If you have set to , You should use + /// instead. /// /// /// The text of the message to be sent @@ -111,10 +111,11 @@ private bool CheckToken() /// The sent as the response. If this is the first acknowledgement, it will return null; /// /// Message content is too long, length must be less or equal to . + /// The parameters provided were invalid or the token was invalid public async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null) { - if (Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.Pong) + if (Type == InteractionResponseType.Pong) throw new InvalidOperationException($"Cannot use {Type} on a send message function"); if (!IsValidToken) From 09f6f3439fdafb31e9c494d9960db5ebd18c4cc0 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 20 Dec 2020 14:22:16 -0400 Subject: [PATCH 009/494] Added APPLICATION_COMMAND_DELETE, APPLICATION_COMMAND_UPDATE, and APPLICATION_COMMAND_CREATE gateway events. Added SocketApplicationCommands, Added method in SocketGuild to fetch that guilds ApplicationCommands. Tested all rest routes and fixed them accordingly. Did more testing and I think its ready to go --- .../Interactions/ApplicationCommandOption.cs | 72 +++++++++ .../ApplicationCommandOptionChoice.cs | 49 ++++++ .../ApplicationCommandProperties.cs | 27 +--- ...ApplicationCommandInteractionDataOption.cs | 2 +- .../Interactions/IApplicationCommandOption.cs | 2 +- .../IApplicationCommandOptionChoice.cs | 2 +- .../SlashCommandCreationProperties.cs | 30 ++++ .../API/Common/ApplicationCommandOption.cs | 23 +++ .../Common/ApplicationCommandOptionChoice.cs | 2 +- ...s.cs => CreateApplicationCommandParams.cs} | 6 +- .../Rest/ModifyApplicationCommandParams.cs | 21 +++ src/Discord.Net.Rest/ClientHelper.cs | 10 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 115 ++++++++++---- src/Discord.Net.Rest/DiscordRestClient.cs | 12 +- .../Interactions/InteractionHelper.cs | 61 ++++--- .../Interactions/RestApplicationCommand.cs | 7 +- .../RestApplicationCommandChoice.cs | 2 +- .../RestApplicationCommandOption.cs | 7 +- .../Interactions/RestGlobalCommand.cs | 2 +- .../Entities/Interactions/RestGuildCommand.cs | 1 + .../ApplicationCommandCreatedUpdatedEvent.cs | 30 ++++ .../BaseSocketClient.Events.cs | 149 ++++++++++++++---- .../DiscordSocketClient.cs | 56 ++++++- .../Entities/Guilds/SocketGuild.cs | 12 ++ .../Interaction/SocketApplicationCommand.cs | 55 +++++++ .../SocketApplicationCommandChoice.cs | 32 ++++ .../SocketApplicationCommandOption.cs | 70 ++++++++ .../Entities/Interaction/SocketInteraction.cs | 4 +- .../Interaction/SocketInteractionData.cs | 4 +- 29 files changed, 737 insertions(+), 128 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs rename src/Discord.Net.Rest/API/Rest/{ApplicationCommandParams.cs => CreateApplicationCommandParams.cs} (74%) create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs create mode 100644 src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs new file mode 100644 index 0000000000..9b4e435cf1 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a for making slash commands. + /// + public class ApplicationCommandOptionProperties + { + private string _name; + private string _description; + + /// + /// The name of this option. + /// + public string Name + { + get => _name; + set + { + if (value?.Length > 32) + throw new ArgumentException("Name length must be less than or equal to 32"); + _name = value; + } + } + + /// + /// The description of this option. + /// + public string Description + { + get => _description; + set + { + if (value?.Length > 100) + throw new ArgumentException("Name length must be less than or equal to 32"); + _description = value; + } + } + + /// + /// The type of this option. + /// + public ApplicationCommandOptionType Type { get; set; } + + /// + /// The first required option for the user to complete. only one option can be default. + /// + public bool? Default { get; set; } + + /// + /// if this option is required for this command, otherwise . + /// + public bool? Required { get; set; } + + /// + /// choices for string and int types for the user to pick from + /// + public List Choices { get; set; } + + /// + /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// + public List Options { get; set; } + + + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs new file mode 100644 index 0000000000..99e3f66d6c --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a choice for a . This class is used when making new commands + /// + public class ApplicationCommandOptionChoiceProperties + { + private string _name; + private object _value; + /// + /// The name of this choice + /// + public string Name + { + get => _name; + set + { + if(value?.Length > 100) + throw new ArgumentException("Name length must be less than or equal to 100"); + _name = value; + } + } + + // Note: discord allows strings & ints as values. how should that be handled? + // should we make this an object and then just type check it? + /// + /// The value of this choice + /// + public object Value + { + get => _value; + set + { + if(value != null) + { + if(!(value is int) && !(value is string)) + throw new ArgumentException("The value of a choice must be a string or int!"); + } + _value = value; + } + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 990fe2e5ea..594a0f3702 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -11,41 +11,20 @@ namespace Discord /// public class ApplicationCommandProperties { - private string _name { get; set; } - private string _description { get; set; } - /// /// Gets or sets the name of this command. /// - public string Name - { - get => _name; - set - { - if(value.Length > 32) - throw new ArgumentException("Name length must be less than or equal to 32"); - _name = value; - } - } + public Optional Name { get; set; } /// /// Gets or sets the discription of this command. /// - public string Description - { - get => _description; - set - { - if (value.Length > 100) - throw new ArgumentException("Description length must be less than or equal to 100"); - _description = value; - } - } + public Optional Description { get; set; } /// /// Gets or sets the options for this command. /// - public Optional> Options { get; set; } + public Optional> Options { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index 871eb4ae67..8ea8378e73 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -22,7 +22,7 @@ public interface IApplicationCommandInteractionDataOption /// This objects type can be any one of the option types in /// /// - object? Value { get; } + object Value { get; } /// /// Present if this option is a group or subcommand. diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 960d1571d1..25e3c7dfcd 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -42,7 +42,7 @@ public interface IApplicationCommandOption IReadOnlyCollection? Choices { get; } /// - /// if the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// IReadOnlyCollection? Options { get; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs index 3b4c7c2492..1f05406561 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs @@ -19,7 +19,7 @@ public interface IApplicationCommandOptionChoice /// /// value of the choice. /// - string Value { get; } + object Value { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs new file mode 100644 index 0000000000..0facc02a15 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to create slash commands + /// + public class SlashCommandCreationProperties + { + /// + /// The name of this command. + /// + public string Name { get; set; } + + /// + /// The discription of this command. + /// + public string Description { get; set; } + + + /// + /// Gets or sets the options for this command. + /// + public Optional> Options { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index ad7748594f..789c5549d3 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -53,5 +53,28 @@ public ApplicationCommandOption(IApplicationCommandOption cmd) this.Type = cmd.Type; this.Description = cmd.Description; } + public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties option) + { + this.Choices = option.Choices != null + ? option.Choices.Select(x => new ApplicationCommandOptionChoice() + { + Name = x.Name, + Value = x.Value + }).ToArray() + : Optional.Unspecified; + + this.Options = option.Options != null + ? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; + + this.Required = option.Required.Value; + this.Default = option.Default.HasValue + ? option.Default.Value + : Optional.Unspecified; + + this.Name = option.Name; + this.Type = option.Type; + this.Description = option.Description; + } } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs index 00179dde1b..b847fceba3 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs @@ -13,6 +13,6 @@ internal class ApplicationCommandOptionChoice public string Name { get; set; } [JsonProperty("value")] - public string Value { get; set; } + public object Value { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/ApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs similarity index 74% rename from src/Discord.Net.Rest/API/Rest/ApplicationCommandParams.cs rename to src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs index a674093c51..4ab6f5a9d3 100644 --- a/src/Discord.Net.Rest/API/Rest/ApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs @@ -8,7 +8,7 @@ namespace Discord.API.Rest { - internal class ApplicationCommandParams + internal class CreateApplicationCommandParams { [JsonProperty("name")] public string Name { get; set; } @@ -19,8 +19,8 @@ internal class ApplicationCommandParams [JsonProperty("options")] public Optional Options { get; set; } - public ApplicationCommandParams() { } - public ApplicationCommandParams(string name, string description, ApplicationCommandOption[] options = null) + public CreateApplicationCommandParams() { } + public CreateApplicationCommandParams(string name, string description, ApplicationCommandOption[] options = null) { this.Name = name; this.Description = description; diff --git a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs new file mode 100644 index 0000000000..1419329552 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ModifyApplicationCommandParams + { + [JsonProperty("name")] + public Optional Name { get; set; } + + [JsonProperty("description")] + public Optional Description { get; set; } + + [JsonProperty("options")] + public Optional Options { get; set; } + } +} diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index d39fcd7a21..4666d645dd 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -202,23 +202,23 @@ public static async Task GetBotGatewayAsync(BaseDiscordClient client }; } - public static async Task GetGlobalApplicationCommands(BaseDiscordClient client, RequestOptions options) + public static async Task> GetGlobalApplicationCommands(BaseDiscordClient client, RequestOptions options) { var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(options).ConfigureAwait(false); if (!response.Any()) - return null; + return new RestGlobalCommand[0]; return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); } - public static async Task GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, RequestOptions options) + public static async Task> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, RequestOptions options) { var response = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, options).ConfigureAwait(false); if (!response.Any()) - return null; + return new RestGuildCommand[0].ToImmutableArray(); - return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToArray(); + return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index d9da6503a9..af33360f4e 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -46,7 +46,7 @@ internal class DiscordRestApiClient : IDisposable internal IRestClient RestClient { get; private set; } internal ulong? CurrentUserId { get; set; } public RateLimitPrecision RateLimitPrecision { get; private set; } - internal bool UseSystemClock { get; set; } + internal bool UseSystemClock { get; set; } internal JsonSerializer Serializer => _serializer; /// Unknown OAuth token type. @@ -58,7 +58,7 @@ public DiscordRestApiClient(RestClientProvider restClientProvider, string userAg DefaultRetryMode = defaultRetryMode; _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver() }; RateLimitPrecision = rateLimitPrecision; - UseSystemClock = useSystemClock; + UseSystemClock = useSystemClock; RequestQueue = new RequestQueue(); _stateLock = new SemaphoreSlim(1, 1); @@ -262,8 +262,8 @@ private async Task SendInternalAsync(string method, string endpoint, Res CheckState(); if (request.Options.RetryMode == null) request.Options.RetryMode = DefaultRetryMode; - if (request.Options.UseSystemClock == null) - request.Options.UseSystemClock = UseSystemClock; + if (request.Options.UseSystemClock == null) + request.Options.UseSystemClock = UseSystemClock; var stopwatch = Stopwatch.StartNew(); var responseStream = await RequestQueue.SendAsync(request).ConfigureAwait(false); @@ -787,9 +787,14 @@ public async Task RemoveGroupRecipientAsync(ulong channelId, ulong userId, Reque //Interactions public async Task GetGlobalApplicationCommandsAsync(RequestOptions options = null) - => await SendAsync("GET", $"applications/{this.CurrentUserId}/commands", options: options).ConfigureAwait(false); + { + options = RequestOptions.CreateOrClone(options); + + return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/commands", new BucketIds(), options: options).ConfigureAwait(false); + } - public async Task CreateGlobalApplicationCommandAsync(ApplicationCommandParams command, RequestOptions options = null) + + public async Task CreateGlobalApplicationCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); @@ -797,24 +802,45 @@ public async Task CreateGlobalApplicationCommandAsync(Applic Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/commands", command, options: options).ConfigureAwait(false); + options = RequestOptions.CreateOrClone(options); + + return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyGlobalApplicationCommandAsync(ApplicationCommandParams command, ulong commandId, RequestOptions options = null) + public async Task ModifyGlobalApplicationCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); - Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); - Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); - Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/commands/{commandId}", command, options: options).ConfigureAwait(false); + if (command.Name.IsSpecified) + { + Preconditions.AtMost(command.Name.Value.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Value.Length, 3, nameof(command.Name)); + } + if (command.Description.IsSpecified) + { + Preconditions.AtMost(command.Description.Value.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Value.Length, 1, nameof(command.Description)); + } + + options = RequestOptions.CreateOrClone(options); + + return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options).ConfigureAwait(false); } public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) - => await SendAsync("DELETE", $"applications/{this.CurrentUserId}/commands/{commandId}", options: options).ConfigureAwait(false); + { + options = RequestOptions.CreateOrClone(options); + + await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/commands/{commandId}", new BucketIds(), options: options).ConfigureAwait(false); + } public async Task GetGuildApplicationCommandAsync(ulong guildId, RequestOptions options = null) - => await SendAsync("GET", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", options: options).ConfigureAwait(false); - public async Task CreateGuildApplicationCommandAsync(ApplicationCommandParams command, ulong guildId, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", bucket, options: options).ConfigureAwait(false); + } + public async Task CreateGuildApplicationCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); @@ -822,20 +848,41 @@ public async Task CreateGuildApplicationCommandAsync(Applica Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - return await SendJsonAsync("POST", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, options: options).ConfigureAwait(false); + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options).ConfigureAwait(false); } - public async Task ModifyGuildApplicationCommandAsync(ApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) + public async Task ModifyGuildApplicationCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); - Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); - Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); - Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); - return await SendJsonAsync("PATCH", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, options: options).ConfigureAwait(false); + if (command.Name.IsSpecified) + { + Preconditions.AtMost(command.Name.Value.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Value.Length, 3, nameof(command.Name)); + } + if (command.Description.IsSpecified) + { + Preconditions.AtMost(command.Description.Value.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Value.Length, 1, nameof(command.Description)); + } + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) - => await SendAsync("DELETE", $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", options: options).ConfigureAwait(false); + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options).ConfigureAwait(false); + } //Interaction Responses public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) @@ -845,12 +892,20 @@ public async Task CreateInteractionResponse(InteractionResponse response, ulong options = RequestOptions.CreateOrClone(options); - await SendJsonAsync("POST", () => $"interactions/{interactionId}/{interactionToken}/callback", response, new BucketIds(), options: options); + await SendJsonAsync("POST", () => $"interactions/{interactionId}/{interactionToken}/callback", response, new BucketIds(), options: options); } public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) - => await SendJsonAsync("POST", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, options: options); + { + options = RequestOptions.CreateOrClone(options); + + await SendJsonAsync("POST", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, new BucketIds(), options: options); + } public async Task DeleteInteractionResponse(string interactionToken, RequestOptions options = null) - => await SendAsync("DELETE", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", options: options); + { + options = RequestOptions.CreateOrClone(options); + + await SendAsync("DELETE", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options); + } public async Task CreateInteractionFollowupMessage(CreateWebhookMessageParams args, string token, RequestOptions options = null) { @@ -862,7 +917,7 @@ public async Task CreateInteractionFollowupMessage(CreateWebhookMessage options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("POST", $"webhooks/{CurrentUserId}/{token}?wait=true", args, options: options).ConfigureAwait(false); + return await SendJsonAsync("POST", () => $"webhooks/{CurrentUserId}/{token}?wait=true", args, new BucketIds(), options: options).ConfigureAwait(false); } public async Task ModifyInteractionFollowupMessage(CreateWebhookMessageParams args, ulong id, string token, RequestOptions options = null) @@ -875,7 +930,7 @@ public async Task ModifyInteractionFollowupMessage(CreateWebhookMessage options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("PATCH", $"webhooks/{CurrentUserId}/{token}/messages/{id}", args, options: options).ConfigureAwait(false); + return await SendJsonAsync("PATCH", () => $"webhooks/{CurrentUserId}/{token}/messages/{id}", args, new BucketIds(), options: options).ConfigureAwait(false); } public async Task DeleteInteractionFollowupMessage(ulong id, string token, RequestOptions options = null) @@ -884,7 +939,7 @@ public async Task DeleteInteractionFollowupMessage(ulong id, string token, Reque options = RequestOptions.CreateOrClone(options); - await SendAsync("DELETE", $"webhooks/{CurrentUserId}/{token}/messages/{id}", options: options).ConfigureAwait(false); + await SendAsync("DELETE", () => $"webhooks/{CurrentUserId}/{token}/messages/{id}", new BucketIds(), options: options).ConfigureAwait(false); } //Guilds diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 79fb1a5c21..d62a83d2d0 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -107,13 +107,17 @@ public Task GetVoiceRegionAsync(string id, RequestOptions optio => ClientHelper.GetVoiceRegionAsync(this, id, options); public Task GetWebhookAsync(ulong id, RequestOptions options = null) => ClientHelper.GetWebhookAsync(this, id, options); - public Task CreateGobalCommand(Action func, RequestOptions options = null) + public Task CreateGlobalCommand(SlashCommandCreationProperties properties, RequestOptions options = null) + => InteractionHelper.CreateGlobalCommand(this, properties, options); + public Task CreateGlobalCommand(Action func, RequestOptions options = null) => InteractionHelper.CreateGlobalCommand(this, func, options); - public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) + public Task CreateGuildCommand(SlashCommandCreationProperties properties, ulong guildId, RequestOptions options = null) + => InteractionHelper.CreateGuildCommand(this, guildId, properties, options); + public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildCommand(this, guildId, func, options); - public Task GetGlobalApplicationCommands(RequestOptions options = null) + public Task> GetGlobalApplicationCommands(RequestOptions options = null) => ClientHelper.GetGlobalApplicationCommands(this, options); - public Task GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) + public Task> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) => ClientHelper.GetGuildApplicationCommands(this, guildId, options); //IDiscordClient diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 341087cb4b..46d92f8158 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -21,30 +21,35 @@ internal static async Task SendFollowupAsync(BaseDiscordClient // Global commands internal static async Task CreateGlobalCommand(BaseDiscordClient client, - Action func, RequestOptions options = null) + Action func, RequestOptions options = null) { - var args = new ApplicationCommandProperties(); + var args = new SlashCommandCreationProperties(); func(args); - + return await CreateGlobalCommand(client, args, options).ConfigureAwait(false); + } + internal static async Task CreateGlobalCommand(BaseDiscordClient client, + SlashCommandCreationProperties args, RequestOptions options = null) + { if (args.Options.IsSpecified) { if (args.Options.Value.Count > 10) throw new ArgumentException("Option count must be 10 or less"); } - var model = new ApplicationCommandParams() + + + var model = new CreateApplicationCommandParams() { Name = args.Name, Description = args.Description, Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified }; var cmd = await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); return RestGlobalCommand.Create(client, cmd); } - internal static async Task ModifyGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, Action func, RequestOptions options = null) { @@ -57,13 +62,13 @@ internal static async Task ModifyGlobalCommand(BaseDiscordCli throw new ArgumentException("Option count must be 10 or less"); } - var model = new Discord.API.Rest.ApplicationCommandParams() + var model = new Discord.API.Rest.ModifyApplicationCommandParams() { Name = args.Name, Description = args.Description, Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified }; var msg = await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); @@ -82,30 +87,44 @@ internal static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGlo // Guild Commands internal static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, - Action func, RequestOptions options = null) + Action func, RequestOptions options = null) { - var args = new ApplicationCommandProperties(); + var args = new SlashCommandCreationProperties(); func(args); + return await CreateGuildCommand(client, guildId, args, options).ConfigureAwait(false); + } + internal static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + SlashCommandCreationProperties args, RequestOptions options = null) + { + Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); + Preconditions.NotNullOrEmpty(args.Description, nameof(args.Description)); + + if (args.Options.IsSpecified) { if (args.Options.Value.Count > 10) throw new ArgumentException("Option count must be 10 or less"); + + foreach(var item in args.Options.Value) + { + Preconditions.NotNullOrEmpty(item.Name, nameof(item.Name)); + Preconditions.NotNullOrEmpty(item.Description, nameof(item.Description)); + } } - var model = new ApplicationCommandParams() + var model = new CreateApplicationCommandParams() { Name = args.Name, Description = args.Description, Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified }; var cmd = await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); return RestGuildCommand.Create(client, cmd, guildId); } - internal static async Task ModifyGuildCommand(BaseDiscordClient client, RestGuildCommand command, Action func, RequestOptions options = null) { @@ -118,16 +137,16 @@ internal static async Task ModifyGuildCommand(BaseDiscordClien throw new ArgumentException("Option count must be 10 or less"); } - var model = new Discord.API.Rest.ApplicationCommandParams() + var model = new Discord.API.Rest.ModifyApplicationCommandParams() { Name = args.Name, Description = args.Description, Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified }; - var msg = await client.ApiClient.ModifyGuildApplicationCommandAsync(model, command.Id, command.GuildId, options).ConfigureAwait(false); + var msg = await client.ApiClient.ModifyGuildApplicationCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); command.Update(msg); return command; } @@ -137,7 +156,7 @@ internal static async Task DeleteGuildCommand(BaseDiscordClient client, RestGuil Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); - await client.ApiClient.DeleteGuildApplicationCommandAsync(command.Id, command.GuildId, options).ConfigureAwait(false); + await client.ApiClient.DeleteGuildApplicationCommandAsync(command.GuildId, command.Id, options).ConfigureAwait(false); } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index c52d69619f..5e0852b298 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -19,9 +19,9 @@ public abstract class RestApplicationCommand : RestEntity, IApplicationCo public string Description { get; private set; } - public IReadOnlyCollection Options { get; private set; } + public IReadOnlyCollection Options { get; private set; } - public RestApplicationCommandType CommandType { get; private set; } + public RestApplicationCommandType CommandType { get; internal set; } public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(this.Id); @@ -47,12 +47,15 @@ internal virtual void Update(Model model) { this.ApplicationId = model.ApplicationId; this.Name = model.Name; + this.Description = model.Description; this.Options = model.Options.IsSpecified ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() : null; } + IReadOnlyCollection IApplicationCommand.Options => Options; + public virtual Task DeleteAsync(RequestOptions options = null) => throw new NotImplementedException(); } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs index 211d2fe124..f9ab50f60b 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs @@ -11,7 +11,7 @@ public class RestApplicationCommandChoice : IApplicationCommandOptionChoice { public string Name { get; } - public string Value { get; } + public object Value { get; } internal RestApplicationCommandChoice(Model model) { diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 9463191123..120fe0c29e 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -20,9 +20,9 @@ public class RestApplicationCommandOption : IApplicationCommandOption public bool? Required { get; private set; } - public IReadOnlyCollection Choices { get; private set; } + public IReadOnlyCollection Choices { get; private set; } - public IReadOnlyCollection Options { get; private set; } + public IReadOnlyCollection Options { get; private set; } internal RestApplicationCommandOption() { } @@ -53,5 +53,8 @@ internal void Update(Model model) ? model.Choices.Value.Select(x => new RestApplicationCommandChoice(x)).ToImmutableArray() : null; } + + IReadOnlyCollection IApplicationCommandOption.Options => Options; + IReadOnlyCollection IApplicationCommandOption.Choices => Choices; } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs index d44e6819d6..5223c069c1 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -15,7 +15,7 @@ public class RestGlobalCommand : RestApplicationCommand internal RestGlobalCommand(BaseDiscordClient client, ulong id) : base(client, id) { - + this.CommandType = RestApplicationCommandType.GlobalCommand; } internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index 5bf3860512..73737dcd2f 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -13,6 +13,7 @@ public class RestGuildCommand : RestApplicationCommand internal RestGuildCommand(BaseDiscordClient client, ulong id, ulong guildId) : base(client, id) { + this.CommandType = RestApplicationCommandType.GuildCommand; this.GuildId = guildId; } diff --git a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs new file mode 100644 index 0000000000..94b3470e7f --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs @@ -0,0 +1,30 @@ +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 ApplicationCommandCreatedUpdatedEvent + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("description")] + public string Description { get; set; } + + [JsonProperty("application_id")] + public ulong ApplicationId { get; set; } + + [JsonProperty("guild_id")] + public ulong GuildId { get; set; } + + [JsonProperty("options")] + public List Options { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 7b8a245cc5..af1a9f1477 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -45,7 +45,8 @@ public event Func ChannelCreated /// /// - public event Func ChannelDestroyed { + public event Func ChannelDestroyed + { add { _channelDestroyedEvent.Add(value); } remove { _channelDestroyedEvent.Remove(value); } } @@ -67,7 +68,8 @@ public event Func ChannelDestroyed { /// /// - public event Func ChannelUpdated { + public event Func ChannelUpdated + { add { _channelUpdatedEvent.Add(value); } remove { _channelUpdatedEvent.Remove(value); } } @@ -92,7 +94,8 @@ public event Func ChannelUpdated { /// /// - public event Func MessageReceived { + public event Func MessageReceived + { add { _messageReceivedEvent.Add(value); } remove { _messageReceivedEvent.Remove(value); } } @@ -124,7 +127,8 @@ public event Func MessageReceived { /// /// - public event Func, ISocketMessageChannel, Task> MessageDeleted { + public event Func, ISocketMessageChannel, Task> MessageDeleted + { add { _messageDeletedEvent.Add(value); } remove { _messageDeletedEvent.Remove(value); } } @@ -182,7 +186,8 @@ public event Func>, ISocketMessag /// parameter. /// /// - public event Func, SocketMessage, ISocketMessageChannel, Task> MessageUpdated { + public event Func, SocketMessage, ISocketMessageChannel, Task> MessageUpdated + { add { _messageUpdatedEvent.Add(value); } remove { _messageUpdatedEvent.Remove(value); } } @@ -217,19 +222,22 @@ public event Func, SocketMessage, ISocketMessageChann /// /// - public event Func, ISocketMessageChannel, SocketReaction, Task> ReactionAdded { + public event Func, ISocketMessageChannel, SocketReaction, Task> ReactionAdded + { add { _reactionAddedEvent.Add(value); } remove { _reactionAddedEvent.Remove(value); } } internal readonly AsyncEvent, ISocketMessageChannel, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent, ISocketMessageChannel, SocketReaction, Task>>(); /// Fired when a reaction is removed from a message. - public event Func, ISocketMessageChannel, SocketReaction, Task> ReactionRemoved { + public event Func, ISocketMessageChannel, SocketReaction, Task> ReactionRemoved + { add { _reactionRemovedEvent.Add(value); } remove { _reactionRemovedEvent.Remove(value); } } internal readonly AsyncEvent, ISocketMessageChannel, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent, ISocketMessageChannel, SocketReaction, Task>>(); /// Fired when all reactions to a message are cleared. - public event Func, ISocketMessageChannel, Task> ReactionsCleared { + public event Func, ISocketMessageChannel, Task> ReactionsCleared + { add { _reactionsClearedEvent.Add(value); } remove { _reactionsClearedEvent.Remove(value); } } @@ -259,19 +267,22 @@ public event Func, ISocketMessageChannel, IEmote, //Roles /// Fired when a role is created. - public event Func RoleCreated { + public event Func RoleCreated + { add { _roleCreatedEvent.Add(value); } remove { _roleCreatedEvent.Remove(value); } } internal readonly AsyncEvent> _roleCreatedEvent = new AsyncEvent>(); /// Fired when a role is deleted. - public event Func RoleDeleted { + public event Func RoleDeleted + { add { _roleDeletedEvent.Add(value); } remove { _roleDeletedEvent.Remove(value); } } internal readonly AsyncEvent> _roleDeletedEvent = new AsyncEvent>(); /// Fired when a role is updated. - public event Func RoleUpdated { + public event Func RoleUpdated + { add { _roleUpdatedEvent.Add(value); } remove { _roleUpdatedEvent.Remove(value); } } @@ -279,37 +290,43 @@ public event Func RoleUpdated { //Guilds /// Fired when the connected account joins a guild. - public event Func JoinedGuild { + public event Func JoinedGuild + { add { _joinedGuildEvent.Add(value); } remove { _joinedGuildEvent.Remove(value); } } internal readonly AsyncEvent> _joinedGuildEvent = new AsyncEvent>(); /// Fired when the connected account leaves a guild. - public event Func LeftGuild { + public event Func LeftGuild + { add { _leftGuildEvent.Add(value); } remove { _leftGuildEvent.Remove(value); } } internal readonly AsyncEvent> _leftGuildEvent = new AsyncEvent>(); /// Fired when a guild becomes available. - public event Func GuildAvailable { + public event Func GuildAvailable + { add { _guildAvailableEvent.Add(value); } remove { _guildAvailableEvent.Remove(value); } } internal readonly AsyncEvent> _guildAvailableEvent = new AsyncEvent>(); /// Fired when a guild becomes unavailable. - public event Func GuildUnavailable { + public event Func GuildUnavailable + { add { _guildUnavailableEvent.Add(value); } remove { _guildUnavailableEvent.Remove(value); } } internal readonly AsyncEvent> _guildUnavailableEvent = new AsyncEvent>(); /// Fired when offline guild members are downloaded. - public event Func GuildMembersDownloaded { + public event Func GuildMembersDownloaded + { add { _guildMembersDownloadedEvent.Add(value); } remove { _guildMembersDownloadedEvent.Remove(value); } } internal readonly AsyncEvent> _guildMembersDownloadedEvent = new AsyncEvent>(); /// Fired when a guild is updated. - public event Func GuildUpdated { + public event Func GuildUpdated + { add { _guildUpdatedEvent.Add(value); } remove { _guildUpdatedEvent.Remove(value); } } @@ -317,43 +334,50 @@ public event Func GuildUpdated { //Users /// Fired when a user joins a guild. - public event Func UserJoined { + public event Func UserJoined + { add { _userJoinedEvent.Add(value); } remove { _userJoinedEvent.Remove(value); } } internal readonly AsyncEvent> _userJoinedEvent = new AsyncEvent>(); /// Fired when a user leaves a guild. - public event Func UserLeft { + public event Func UserLeft + { add { _userLeftEvent.Add(value); } remove { _userLeftEvent.Remove(value); } } internal readonly AsyncEvent> _userLeftEvent = new AsyncEvent>(); /// Fired when a user is banned from a guild. - public event Func UserBanned { + public event Func UserBanned + { add { _userBannedEvent.Add(value); } remove { _userBannedEvent.Remove(value); } } internal readonly AsyncEvent> _userBannedEvent = new AsyncEvent>(); /// Fired when a user is unbanned from a guild. - public event Func UserUnbanned { + public event Func UserUnbanned + { add { _userUnbannedEvent.Add(value); } remove { _userUnbannedEvent.Remove(value); } } internal readonly AsyncEvent> _userUnbannedEvent = new AsyncEvent>(); /// Fired when a user is updated. - public event Func UserUpdated { + public event Func UserUpdated + { add { _userUpdatedEvent.Add(value); } remove { _userUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _userUpdatedEvent = new AsyncEvent>(); /// Fired when a guild member is updated, or a member presence is updated. - public event Func GuildMemberUpdated { + public event Func GuildMemberUpdated + { add { _guildMemberUpdatedEvent.Add(value); } remove { _guildMemberUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _guildMemberUpdatedEvent = new AsyncEvent>(); /// Fired when a user joins, leaves, or moves voice channels. - public event Func UserVoiceStateUpdated { + public event Func UserVoiceStateUpdated + { add { _userVoiceStateUpdatedEvent.Add(value); } remove { _userVoiceStateUpdatedEvent.Remove(value); } } @@ -366,25 +390,29 @@ public event Func VoiceServerUpdated } internal readonly AsyncEvent> _voiceServerUpdatedEvent = new AsyncEvent>(); /// Fired when the connected account is updated. - public event Func CurrentUserUpdated { + public event Func CurrentUserUpdated + { add { _selfUpdatedEvent.Add(value); } remove { _selfUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _selfUpdatedEvent = new AsyncEvent>(); /// Fired when a user starts typing. - public event Func UserIsTyping { + public event Func UserIsTyping + { add { _userIsTypingEvent.Add(value); } remove { _userIsTypingEvent.Remove(value); } } internal readonly AsyncEvent> _userIsTypingEvent = new AsyncEvent>(); /// Fired when a user joins a group channel. - public event Func RecipientAdded { + public event Func RecipientAdded + { add { _recipientAddedEvent.Add(value); } remove { _recipientAddedEvent.Remove(value); } } internal readonly AsyncEvent> _recipientAddedEvent = new AsyncEvent>(); /// Fired when a user is removed from a group channel. - public event Func RecipientRemoved { + public event Func RecipientRemoved + { add { _recipientRemovedEvent.Add(value); } remove { _recipientRemovedEvent.Remove(value); } } @@ -452,5 +480,70 @@ public event Func InteractionCreated } internal readonly AsyncEvent> _interactionCreatedEvent = new AsyncEvent>(); + /// + /// Fired when a guild application command is created. + /// + /// + /// + /// This event is fired when an application command is created. The event handler must return a + /// and accept a as its parameter. + /// + /// + /// The command that was deleted will be passed into the parameter. + /// + /// + /// This event is an undocumented discord event and may break at any time, its not recommended to rely on this event + /// + /// + public event Func ApplicationCommandCreated + { + add { _applicationCommandCreated.Add(value); } + remove { _applicationCommandCreated.Remove(value); } + } + internal readonly AsyncEvent> _applicationCommandCreated = new AsyncEvent>(); + + /// + /// Fired when a guild application command is updated. + /// + /// + /// + /// This event is fired when an application command is updated. The event handler must return a + /// and accept a as its parameter. + /// + /// + /// The command that was deleted will be passed into the parameter. + /// + /// + /// This event is an undocumented discord event and may break at any time, its not recommended to rely on this event + /// + /// + public event Func ApplicationCommandUpdated + { + add { _applicationCommandUpdated.Add(value); } + remove { _applicationCommandUpdated.Remove(value); } + } + internal readonly AsyncEvent> _applicationCommandUpdated = new AsyncEvent>(); + + /// + /// Fired when a guild application command is deleted. + /// + /// + /// + /// This event is fired when an application command is deleted. The event handler must return a + /// and accept a as its parameter. + /// + /// + /// The command that was deleted will be passed into the parameter. + /// + /// + /// This event is an undocumented discord event and may break at any time, its not recommended to rely on this event + /// + /// + public event Func ApplicationCommandDeleted + { + add { _applicationCommandDeleted.Add(value); } + remove { _applicationCommandDeleted.Remove(value); } + } + internal readonly AsyncEvent> _applicationCommandDeleted = new AsyncEvent>(); } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index e2029e4711..115367e6f0 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -613,7 +613,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } else if (_connection.CancelToken.IsCancellationRequested) return; - + if (BaseConfig.AlwaysDownloadUsers) _ = DownloadUsersAsync(Guilds.Where(x => x.IsAvailable && !x.HasAllMembers)); @@ -1808,6 +1808,60 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th } } break; + case "APPLICATION_COMMAND_CREATE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (APPLICATION_COMMAND_CREATE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + if(guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var applicationCommand = SocketApplicationCommand.Create(this, data); + + await TimedInvokeAsync(_applicationCommandCreated, nameof(ApplicationCommandCreated), applicationCommand).ConfigureAwait(false); + } + break; + case "APPLICATION_COMMAND_UPDATE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (APPLICATION_COMMAND_UPDATE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var applicationCommand = SocketApplicationCommand.Create(this, data); + + await TimedInvokeAsync(_applicationCommandUpdated, nameof(ApplicationCommandUpdated), applicationCommand).ConfigureAwait(false); + } + break; + case "APPLICATION_COMMAND_DELETE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (APPLICATION_COMMAND_DELETE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var applicationCommand = SocketApplicationCommand.Create(this, data); + + await TimedInvokeAsync(_applicationCommandDeleted, nameof(ApplicationCommandDeleted), applicationCommand).ConfigureAwait(false); + } + break; //Ignored (User only) case "CHANNEL_PINS_ACK": await _gatewayLogger.DebugAsync("Ignored Dispatch (CHANNEL_PINS_ACK)").ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index e9e5359985..35797dc783 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1006,6 +1006,18 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null public Task> GetWebhooksAsync(RequestOptions options = null) => GuildHelper.GetWebhooksAsync(this, Discord, options); + //Interactions + /// + /// Gets this guilds slash commands commands + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of application commands found within the guild. + /// + public async Task> GetApplicationCommandsAsync(RequestOptions options = null) + => await Discord.Rest.GetGuildApplicationCommands(this.Id, options); + //Emotes /// public Task GetEmoteAsync(ulong id, RequestOptions options = null) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs new file mode 100644 index 0000000000..c8cc4d3a2e --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Gateway.ApplicationCommandCreatedUpdatedEvent; + +namespace Discord.WebSocket +{ + public class SocketApplicationCommand : SocketEntity, IApplicationCommand + { + public ulong ApplicationId { get; private set; } + + public string Name { get; private set; } + + public string Description { get; private set; } + + public IReadOnlyCollection Options { get; private set; } + + public DateTimeOffset CreatedAt + => SnowflakeUtils.FromSnowflake(this.Id); + + public SocketGuild Guild + => Discord.GetGuild(this.GuildId); + private ulong GuildId { get; set; } + + internal SocketApplicationCommand(DiscordSocketClient client, ulong id) + : base(client, id) + { + + } + internal static SocketApplicationCommand Create(DiscordSocketClient client, Model model) + { + var entity = new SocketApplicationCommand(client, model.Id); + entity.Update(model); + return entity; + } + + internal void Update(Model model) + { + this.ApplicationId = model.ApplicationId; + this.Description = model.Description; + this.Name = model.Name; + this.GuildId = model.GuildId; + + this.Options = model.Options.Any() + ? model.Options.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() + : new ImmutableArray(); + } + + public Task DeleteAsync(RequestOptions options = null) => throw new NotImplementedException(); + IReadOnlyCollection IApplicationCommand.Options => Options; + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs new file mode 100644 index 0000000000..f82f9e6c46 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommandOptionChoice; + +namespace Discord.WebSocket +{ + /// + /// Represents a choice for a + /// + public class SocketApplicationCommandChoice : IApplicationCommandOptionChoice + { + public string Name { get; private set; } + + public object Value { get; private set; } + + internal SocketApplicationCommandChoice() { } + internal static SocketApplicationCommandChoice Create(Model model) + { + var entity = new SocketApplicationCommandChoice(); + entity.Update(model); + return entity; + } + internal void Update(Model model) + { + this.Name = model.Name; + this.Value = model.Value; + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs new file mode 100644 index 0000000000..e856bce423 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommandOption; + +namespace Discord.WebSocket +{ + /// + /// Represents an option for a + /// + public class SocketApplicationCommandOption : IApplicationCommandOption + { + public string Name { get; private set; } + + public ApplicationCommandOptionType Type { get; private set; } + + public string Description { get; private set; } + + public bool? Default { get; private set; } + + public bool? Required { get; private set; } + + /// + /// Choices for string and int types for the user to pick from. + /// + public IReadOnlyCollection Choices { get; private set; } + + /// + /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// + public IReadOnlyCollection Options { get; private set; } + + internal SocketApplicationCommandOption() { } + internal static SocketApplicationCommandOption Create(Model model) + { + var entity = new SocketApplicationCommandOption(); + entity.Update(model); + return entity; + } + + internal void Update(Model model) + { + this.Name = model.Name; + this.Type = model.Type; + this.Description = model.Description; + + this.Default = model.Default.IsSpecified + ? model.Default.Value + : null; + + this.Required = model.Required.IsSpecified + ? model.Required.Value + : null; + + this.Choices = model.Choices.IsSpecified + ? model.Choices.Value.Select(x => SocketApplicationCommandChoice.Create(x)).ToImmutableArray() + : new ImmutableArray(); + + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() + : new ImmutableArray(); + } + + IReadOnlyCollection IApplicationCommandOption.Choices => Choices; + IReadOnlyCollection IApplicationCommandOption.Options => Options; + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index f51d0a8f86..f8c2c62bd2 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -39,7 +39,7 @@ public SocketGuildUser Member /// /// The data associated with this interaction /// - public IApplicationCommandInteractionData Data { get; private set; } + public SocketInteractionData Data { get; private set; } /// /// The token used to respond to this interaction @@ -209,5 +209,7 @@ public async Task AcknowledgeAsync(RequestOptions options = null) await Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, Token, options).ConfigureAwait(false); } + + IApplicationCommandInteractionData IDiscordInteraction.Data => Data; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs index 4ff5824804..b6dfd2f8e0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs @@ -11,7 +11,7 @@ namespace Discord.WebSocket public class SocketInteractionData : SocketEntity, IApplicationCommandInteractionData { public string Name { get; private set; } - public IReadOnlyCollection Options { get; private set; } + public IReadOnlyCollection Options { get; private set; } internal SocketInteractionData(DiscordSocketClient client, ulong id) : base(client, id) @@ -33,5 +33,7 @@ internal void Update(Model model) : null; } + + IReadOnlyCollection IApplicationCommandInteractionData.Options => Options; } } From 18ffc40e5434d230cc7623b9bab87dd1a25e8fba Mon Sep 17 00:00:00 2001 From: quinchs <49576606+quinchs@users.noreply.github.com> Date: Mon, 21 Dec 2020 14:27:55 -0400 Subject: [PATCH 010/494] Create application-commands.md --- docs/guides/commands/application-commands.md | 216 +++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 docs/guides/commands/application-commands.md diff --git a/docs/guides/commands/application-commands.md b/docs/guides/commands/application-commands.md new file mode 100644 index 0000000000..a1247417a4 --- /dev/null +++ b/docs/guides/commands/application-commands.md @@ -0,0 +1,216 @@ +# Application commands + +Application commands are a new feature thats still a work in progress, this guide will show you how to make the best of em. + + + + +## Getting started + +### Configuring + +There is a new configuration setting for your DiscordSocketClient called `AlwaysAcknowledgeInteractions`, It's default value is true. +Interactions work off of the Recieve -> Respond pipeline, meaning if you dont acknowledge the interaction within 3 seconds its gone forever. +With `AlwaysAcknowledgeInteractions` set to true, the client will automatically acknowledge the interaction as its recieved, +letting you wait up to 15 minutes before responding with a message. + +With `AlwaysAcknowledgeInteractions` set to false you will have to acknowledge the interaction yourself via the `InteractionCreated` event + +### Registering commands + +While there is no "easy" way to register command right now, in the future I plan to write a command service to help with that, but right now you have to use the rest +client to create your command: + +```cs +_client.Ready += RegisterCommands + +... + +private async Task RegisterCommands() +{ + // Creating a global command + var myGlobalCommand = await _client.Rest.CreateGlobalCommand(new Discord.SlashCommandCreationProperties() + { + Name = "example", + Description = "Runs the example command", + Options = new List() + { + new ApplicationCommandOptionProperties() + { + Name = "Example option", + Required = false, + Description = "Option Description", + Type = Discord.ApplicationCommandOptionType.String, + } + } + }); + + // Creating a guild command + var myGuildCommand = await _client.Rest.CreateGuildCommand(new Discord.SlashCommandCreationProperties() + { + Name = "guildExample", + Description = "Runs the guild example command", + Options = new List() + { + new ApplicationCommandOptionProperties() + { + Name = "Guild example option", + Required = false, + Description = "Guild option description", + Type = Discord.ApplicationCommandOptionType.String, + } + } + }, 1234567890); // <- the guild id +} +``` +CreateGuildCommand returns a `RestGuildCommand` class which can be used to modify/delete your command on the fly, it also contains details about your command. +CreateGlobalCOmmand returns a `RestGlobalCommand` class which can be used to modify/delete your command on the fly, it also contains details about your command. + +### Getting a list of all your commands +You can fetch a list of all your global commands via rest: +```cs +var commands = _client.Rest.GetGlobalApplicationCommands(); +``` +This returns a `IReadOnlyCollection`. + +You can also fetch guild specific commands: +```cs +var commands = _client.Rest.GetGuildApplicationCommands(1234567890) +``` +This returns all the application commands in that guild. + +### Responding + +First thing we want to do is listen to the `InteractionCreated` event. This event is fired when a socket interaction is recieved via the gateway, It looks somthing like this +```cs +_client.InteractionCreated += MyEventHandler; + +... + +private async Task MyEventHandler(SocketInteraction arg) +{ + // handle the interaction here +} +``` + +A socket interaction is made up of these properties and methods: + +| Name | Description | +|--------|--------------| +| Guild | The `SocketGuild` this interaction was used in | +| Channel | The `SocketTextChannel` this interaction was used in | +| Member | The `SocketGuildUser` that executed the interaction | +| Type | The [InteractionType](https://discord.com/developers/docs/interactions/slash-commands#interaction-interactiontype) of this interaction | +| Data | The `SocketInteractionData` associated with this interaction | +| Token | The token used to respond to this interaction | +| Version | The version of this interaction | +| CreatedAt | The time this interaction was created | +| IsValidToken | Whether or not the token to respond to this interaction is still valid | +| RespondAsync | Responds to the interaction | +| FollowupAsync | Sends a followup message to the interaction | + + + +#### Whats the difference between `FollowupAsync` and `RespondAsync`? +RespondAsync is the initial responce to the interaction, its used to "capture" the interaction, while followup is used to send more messages to the interaction. +Basically, you want to first use `RespondAsync` to acknowledge the interaction, then if you need to send anything else regarding that interaction you would use `FollowupAsync` +If you have `AlwaysAcknowledgeInteractions` set to true in your client config then it will automatically acknowledge the interaction without sending a message, +in this case you can use either or to respond. + +#### Example ping pong command +```cs +_client.InteractionCreated += MyEventHandler; +_client.Ready += CreateCommands + +... + +private async Task CreateCommands() +{ + await _client.Rest.CreateGlobalCommand(new Discord.SlashCommandCreationProperties() + { + Name = "ping", + Description = "ping for a pong!", + }); +} + +private async Task MyEventHandler(SocketInteraction arg) +{ + switch(arg.Type) // We want to check the type of this interaction + { + case InteractionType.ApplicationCommand: // If it is a command + await MySlashCommandHandler(arg); // Handle the command somewhere + break; + default: // We dont support it + Console.WriteLine("Unsupported interaction type: " + arg.Type); + break; + } +} + +private async Task MySlashCommandHandler(SocketInteraction arg) +{ + switch(arg.Name) + { + case "ping": + await arg.RespondAsync("Pong!"); + break; + } +} +``` + +#### Example hug command +```cs +_client.InteractionCreated += MyEventHandler; +_client.Ready += CreateCommands; + +... + +private async Task CreateCommands() +{ + await _client.Rest.CreateGlobalCommand(new Discord.SlashCommandCreationProperties() + { + Name = "hug", + Description = "Hugs a user!", + Options = new List() + { + new ApplicationCommandOptionProperties() + { + Name = "User", + Required = true, + Description = "The user to hug", + Type = Discord.ApplicationCommandOptionType.User, + } + } + }); +} + +private async Task MyEventHandler(SocketInteraction arg) +{ + switch(arg.Type) // We want to check the type of this interaction + { + case InteractionType.ApplicationCommand: // If it is a command + await MySlashCommandHandler(arg); // Handle the command somewhere + break; + default: // We dont support it + Console.WriteLine("Unsupported interaction type: " + arg.Type); + break; + } +} + +private async Task MySlashCommandHandler(SocketInteraction arg) +{ + switch(arg.Name) + { + case "hug": + // Get the user argument + var option = arg.Data.Options.First(x => x.Name == "user"); + // We know that the options value must be a user + if(option.Value is SocketGuildUser user) + { + await arg.RespondAsync($"Hugged {user.Mention}"); + } + break; + } +} +``` + + From ff08f3477991a92991c771f4961f957896c22ea4 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 27 Dec 2020 07:42:12 -0400 Subject: [PATCH 011/494] Comment updates and explicit conversions for SocketInteractionDataOption's --- .../Interactions/ApplicationCommandOption.cs | 2 +- .../ApplicationCommandOptionChoice.cs | 6 +- .../Interactions/IApplicationCommand.cs | 2 +- .../IApplicationCommandInteractionData.cs | 8 +- ...ApplicationCommandInteractionDataOption.cs | 2 +- .../SlashCommandCreationProperties.cs | 2 +- .../Interactions/RestApplicationCommand.cs | 12 ++- .../RestApplicationCommandChoice.cs | 5 ++ .../RestApplicationCommandOption.cs | 14 ++++ .../RestApplicationCommandType.cs | 10 +++ .../Interactions/RestGlobalCommand.cs | 6 +- .../Entities/Interactions/RestGuildCommand.cs | 8 ++ .../Interaction/SocketApplicationCommand.cs | 12 +++ .../SocketApplicationCommandChoice.cs | 4 +- .../SocketApplicationCommandOption.cs | 7 +- .../Entities/Interaction/SocketInteraction.cs | 54 ++++++------- .../Interaction/SocketInteractionData.cs | 18 +++-- .../SocketInteractionDataOption.cs | 78 ++++++++++++++++++- 18 files changed, 198 insertions(+), 52 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index 9b4e435cf1..f9e34362c3 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -58,7 +58,7 @@ public string Description public bool? Required { get; set; } /// - /// choices for string and int types for the user to pick from + /// choices for string and int types for the user to pick from. /// public List Choices { get; set; } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs index 99e3f66d6c..53332c74b8 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -7,14 +7,14 @@ namespace Discord { /// - /// Represents a choice for a . This class is used when making new commands + /// Represents a choice for a . This class is used when making new commands. /// public class ApplicationCommandOptionChoiceProperties { private string _name; private object _value; /// - /// The name of this choice + /// The name of this choice. /// public string Name { @@ -30,7 +30,7 @@ public string Name // Note: discord allows strings & ints as values. how should that be handled? // should we make this an object and then just type check it? /// - /// The value of this choice + /// The value of this choice. /// public object Value { diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index c094efbd87..cf13953289 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -40,7 +40,7 @@ public interface IApplicationCommand : ISnowflakeEntity /// Deletes this command /// /// The options to be used when sending the request. - /// + /// A task that represents the asynchronous delete operation. Task DeleteAsync(RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs index 6f700d898c..ec452180aa 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs @@ -7,22 +7,22 @@ namespace Discord { /// - /// Represents data of an Interaction Command, see + /// Represents data of an Interaction Command, see . /// public interface IApplicationCommandInteractionData { /// - /// The snowflake id of this command + /// The snowflake id of this command. /// ulong Id { get; } /// - /// The name of this command + /// The name of this command. /// string Name { get; } /// - /// The params + values from the user + /// The params + values from the user. /// IReadOnlyCollection Options { get; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index 8ea8378e73..ffc94c428e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -7,7 +7,7 @@ namespace Discord { /// - /// Represents a option group for a command, see + /// Represents a option group for a command, see . /// public interface IApplicationCommandInteractionDataOption { diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs index 0facc02a15..df9f398091 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs @@ -7,7 +7,7 @@ namespace Discord { /// - /// A class used to create slash commands + /// A class used to create slash commands. /// public class SlashCommandCreationProperties { diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 5e0852b298..67a530d500 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -9,20 +9,30 @@ namespace Discord.Rest { /// - /// Represents a rest implementation of the + /// Represents a Rest-based implementation of the . /// public abstract class RestApplicationCommand : RestEntity, IApplicationCommand { + /// public ulong ApplicationId { get; private set; } + /// public string Name { get; private set; } + /// public string Description { get; private set; } + /// + /// The options of this command. + /// public IReadOnlyCollection Options { get; private set; } + /// + /// The type of this rest application command. + /// public RestApplicationCommandType CommandType { get; internal set; } + /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(this.Id); diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs index f9ab50f60b..902afdd44e 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs @@ -7,10 +7,15 @@ namespace Discord.Rest { + /// + /// Represents a Rest-based implementation of . + /// public class RestApplicationCommandChoice : IApplicationCommandOptionChoice { + /// public string Name { get; } + /// public object Value { get; } internal RestApplicationCommandChoice(Model model) diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 120fe0c29e..a8e37873e0 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -8,20 +8,34 @@ namespace Discord.Rest { + /// + /// Represents a Rest-based implementation of . + /// public class RestApplicationCommandOption : IApplicationCommandOption { + /// public ApplicationCommandOptionType Type { get; private set; } + /// public string Name { get; private set; } + /// public string Description { get; private set; } + /// public bool? Default { get; private set; } + /// public bool? Required { get; private set; } + /// + /// A collection of 's for this command. + /// public IReadOnlyCollection Choices { get; private set; } + /// + /// A collection of 's for this command. + /// public IReadOnlyCollection Options { get; private set; } internal RestApplicationCommandOption() { } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs index 7ea7cd9f0a..96ba070534 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs @@ -6,9 +6,19 @@ namespace Discord.Rest { + /// + /// Represents a type of Rest-based command. + /// public enum RestApplicationCommandType { + /// + /// Specifies that this command is a Global command. + /// GlobalCommand, + + /// + /// Specifies that this command is a Guild specific command. + /// GuildCommand } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs index 5223c069c1..230243c7a3 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -8,7 +8,7 @@ namespace Discord.Rest { /// - /// Represents a global Slash command + /// Represents a global Slash command. /// public class RestGlobalCommand : RestApplicationCommand { @@ -24,6 +24,8 @@ internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) entity.Update(model); return entity; } + + /// public override async Task DeleteAsync(RequestOptions options = null) => await InteractionHelper.DeleteGlobalCommand(Discord, this).ConfigureAwait(false); @@ -33,7 +35,7 @@ public override async Task DeleteAsync(RequestOptions options = null) /// The delegate containing the properties to modify the command with. /// The options to be used when sending the request. /// - /// The modified command + /// The modified command. /// public async Task ModifyAsync(Action func, RequestOptions options = null) => await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index 73737dcd2f..5e0efbf8dd 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -7,9 +7,16 @@ namespace Discord.Rest { + /// + /// Represents a Rest-based guild command. + /// public class RestGuildCommand : RestApplicationCommand { + /// + /// The guild Id where this command originates. + /// public ulong GuildId { get; set; } + internal RestGuildCommand(BaseDiscordClient client, ulong id, ulong guildId) : base(client, id) { @@ -24,6 +31,7 @@ internal static RestGuildCommand Create(BaseDiscordClient client, Model model, u return entity; } + /// public override async Task DeleteAsync(RequestOptions options = null) => await InteractionHelper.DeleteGuildCommand(Discord, this).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs index c8cc4d3a2e..3c44fa9918 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs @@ -8,19 +8,31 @@ namespace Discord.WebSocket { + /// + /// Represends a Websocket-based recieved over the gateway. + /// public class SocketApplicationCommand : SocketEntity, IApplicationCommand { + /// public ulong ApplicationId { get; private set; } + /// public string Name { get; private set; } + /// public string Description { get; private set; } + /// + /// A collection of 's recieved over the gateway. + /// public IReadOnlyCollection Options { get; private set; } public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(this.Id); + /// + /// The where this application was created. + /// public SocketGuild Guild => Discord.GetGuild(this.GuildId); private ulong GuildId { get; set; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs index f82f9e6c46..e9809b7ba2 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs @@ -8,12 +8,14 @@ namespace Discord.WebSocket { /// - /// Represents a choice for a + /// Represents a choice for a . /// public class SocketApplicationCommandChoice : IApplicationCommandOptionChoice { + /// public string Name { get; private set; } + /// public object Value { get; private set; } internal SocketApplicationCommandChoice() { } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs index e856bce423..0a90a8073b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs @@ -9,18 +9,23 @@ namespace Discord.WebSocket { /// - /// Represents an option for a + /// Represents an option for a . /// public class SocketApplicationCommandOption : IApplicationCommandOption { + /// public string Name { get; private set; } + /// public ApplicationCommandOptionType Type { get; private set; } + /// public string Description { get; private set; } + /// public bool? Default { get; private set; } + /// public bool? Required { get; private set; } /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index f8c2c62bd2..4a8277fd4b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -9,52 +9,52 @@ namespace Discord.WebSocket { /// - /// Represents an Interaction recieved over the gateway + /// Represents an Interaction recieved over the gateway. /// public class SocketInteraction : SocketEntity, IDiscordInteraction { /// - /// The this interaction was used in + /// The this interaction was used in. /// public SocketGuild Guild => Discord.GetGuild(GuildId); /// - /// The this interaction was used in + /// The this interaction was used in. /// public SocketTextChannel Channel => Guild.GetTextChannel(ChannelId); /// - /// The who triggered this interaction + /// The who triggered this interaction. /// public SocketGuildUser Member => Guild.GetUser(MemberId); /// - /// The type of this interaction + /// The type of this interaction. /// public InteractionType Type { get; private set; } /// - /// The data associated with this interaction + /// The data associated with this interaction. /// public SocketInteractionData Data { get; private set; } /// - /// The token used to respond to this interaction + /// The token used to respond to this interaction. /// public string Token { get; private set; } /// - /// The version of this interaction + /// The version of this interaction. /// public int Version { get; private set; } public DateTimeOffset CreatedAt { get; } /// - /// if the token is valid for replying to, otherwise + /// if the token is valid for replying to, otherwise . /// public bool IsValidToken => CheckToken(); @@ -78,7 +78,7 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model internal void Update(Model model) { this.Data = model.Data.IsSpecified - ? SocketInteractionData.Create(this.Discord, model.Data.Value) + ? SocketInteractionData.Create(this.Discord, model.Data.Value, model.GuildId) : null; this.GuildId = model.GuildId; @@ -101,17 +101,17 @@ private bool CheckToken() /// instead. /// /// - /// The text of the message to be sent - /// if the message should be read out by a text-to-speech reader, otherwise - /// A to send with this response - /// The type of response to this Interaction - /// The allowed mentions for this response - /// The request options for this response + /// The text of the message to be sent. + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A to send with this response. + /// The type of response to this Interaction. + /// The allowed mentions for this response. + /// The request options for this response. /// - /// The sent as the response. If this is the first acknowledgement, it will return null; + /// The sent as the response. If this is the first acknowledgement, it will return null. /// /// Message content is too long, length must be less or equal to . - /// The parameters provided were invalid or the token was invalid + /// The parameters provided were invalid or the token was invalid. public async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null) { @@ -162,16 +162,16 @@ public async Task RespondAsync(string text = null, bool isTTS = false, } /// - /// Sends a followup message for this interaction + /// Sends a followup message for this interaction. /// /// The text of the message to be sent - /// if the message should be read out by a text-to-speech reader, otherwise - /// A to send with this response - /// The type of response to this Interaction - /// The allowed mentions for this response - /// The request options for this response + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A to send with this response. + /// The type of response to this Interaction. + /// The allowed mentions for this response. + /// The request options for this response. /// - /// The sent message + /// The sent message. /// public async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null) @@ -195,10 +195,10 @@ public async Task FollowupAsync(string text = null, bool isTTS = false } /// - /// Acknowledges this interaction with the + /// Acknowledges this interaction with the . /// /// - /// A task that represents the asynchronous operation of acknowledging the interaction + /// A task that represents the asynchronous operation of acknowledging the interaction. /// public async Task AcknowledgeAsync(RequestOptions options = null) { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs index b6dfd2f8e0..eef7e5ab47 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs @@ -10,28 +10,36 @@ namespace Discord.WebSocket { public class SocketInteractionData : SocketEntity, IApplicationCommandInteractionData { + /// public string Name { get; private set; } + + /// + /// The 's recieved with this interaction. + /// public IReadOnlyCollection Options { get; private set; } + private ulong guildId; + internal SocketInteractionData(DiscordSocketClient client, ulong id) : base(client, id) { } - internal static SocketInteractionData Create(DiscordSocketClient client, Model model) + internal static SocketInteractionData Create(DiscordSocketClient client, Model model, ulong guildId) { var entity = new SocketInteractionData(client, model.Id); - entity.Update(model); + entity.Update(model, guildId); return entity; } - internal void Update(Model model) + internal void Update(Model model, ulong guildId) { this.Name = model.Name; + this.guildId = guildId; + this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketInteractionDataOption(x)).ToImmutableArray() + ? model.Options.Value.Select(x => new SocketInteractionDataOption(x, this.Discord, guildId)).ToImmutableArray() : null; - } IReadOnlyCollection IApplicationCommandInteractionData.Options => Options; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs index 26a7b9659b..62097689d1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs @@ -8,21 +8,91 @@ namespace Discord.WebSocket { + /// + /// Represents a Websocket-based recieved by the gateway + /// public class SocketInteractionDataOption : IApplicationCommandInteractionDataOption { + /// public string Name { get; private set; } - public object? Value { get; private set; } - public IReadOnlyCollection Options { get; private set; } + /// + public object Value { get; private set; } - internal SocketInteractionDataOption(Model model) + /// + /// The sub command options recieved for this sub command group. + /// + public IReadOnlyCollection Options { get; private set; } + + private DiscordSocketClient discord; + private ulong guild; + + internal SocketInteractionDataOption() { } + internal SocketInteractionDataOption(Model model, DiscordSocketClient discord, ulong guild) { this.Name = Name; this.Value = model.Value.IsSpecified ? model.Value.Value : null; + this.discord = discord; + this.guild = guild; this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketInteractionDataOption(x)).ToImmutableArray() + ? model.Options.Value.Select(x => new SocketInteractionDataOption(x, discord, guild)).ToImmutableArray() : null; } + + // Converters + public static explicit operator bool(SocketInteractionDataOption option) + => (bool)option.Value; + public static explicit operator int(SocketInteractionDataOption option) + => (int)option.Value; + public static explicit operator string(SocketInteractionDataOption option) + => option.Value.ToString(); + + public static explicit operator SocketGuildChannel(SocketInteractionDataOption option) + { + if (option.Value is ulong id) + { + var guild = option.discord.GetGuild(option.guild); + + if (guild == null) + return null; + + return guild.GetChannel(id); + } + + return null; + } + + public static explicit operator SocketRole(SocketInteractionDataOption option) + { + if (option.Value is ulong id) + { + var guild = option.discord.GetGuild(option.guild); + + if (guild == null) + return null; + + return guild.GetRole(id); + } + + return null; + } + + public static explicit operator SocketGuildUser(SocketInteractionDataOption option) + { + if(option.Value is ulong id) + { + var guild = option.discord.GetGuild(option.guild); + + if (guild == null) + return null; + + return guild.GetUser(id); + } + + return null; + } + + IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options; } } From eabf270eacdd2d448615446aa5ebcc18a9491491 Mon Sep 17 00:00:00 2001 From: quinchs <49576606+quinchs@users.noreply.github.com> Date: Mon, 22 Mar 2021 14:03:31 -0300 Subject: [PATCH 012/494] Fix slash command doc --- docs/guides/commands/application-commands.md | 21 ++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/guides/commands/application-commands.md b/docs/guides/commands/application-commands.md index a1247417a4..817b4b44be 100644 --- a/docs/guides/commands/application-commands.md +++ b/docs/guides/commands/application-commands.md @@ -1,9 +1,10 @@ -# Application commands - -Application commands are a new feature thats still a work in progress, this guide will show you how to make the best of em. +# Warning +Slash commands and interactions are still under development and are subject to change at any time. This doccument is temporary and is only here to help those who wish to use the interaction features in the development state. +# Application commands +Application commands are a new feature thats still a work in progress, this guide will show you how to make the best of em. ## Getting started @@ -64,7 +65,7 @@ private async Task RegisterCommands() } ``` CreateGuildCommand returns a `RestGuildCommand` class which can be used to modify/delete your command on the fly, it also contains details about your command. -CreateGlobalCOmmand returns a `RestGlobalCommand` class which can be used to modify/delete your command on the fly, it also contains details about your command. +CreateGlobalCommand returns a `RestGlobalCommand` class which can be used to modify/delete your command on the fly, it also contains details about your command. ### Getting a list of all your commands You can fetch a list of all your global commands via rest: @@ -203,14 +204,14 @@ private async Task MySlashCommandHandler(SocketInteraction arg) case "hug": // Get the user argument var option = arg.Data.Options.First(x => x.Name == "user"); - // We know that the options value must be a user - if(option.Value is SocketGuildUser user) - { - await arg.RespondAsync($"Hugged {user.Mention}"); - } + + // We know that the options value must be a user. Types of user, channel, and role return the snowflake id of that object. + // For this case we can just mention the user with the id + await arg.RespondAsync($"Hugged <@{user.Value}>"); break; } } ``` - +# Wrapping up +These examples are soon to change as there is currently a command service being written that will support slash commands. These examples are written for [#1717](https://github.com/discord-net/Discord.Net/pull/1717). You can see the progress of slash commands on pull [#1733](https://github.com/discord-net/Discord.Net/pull/1733) From 4f9b48c417c6016adb1c8b0a6638e8e7d00c3c8a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 5 Apr 2021 02:39:16 -0300 Subject: [PATCH 013/494] Fix invalid parsing of the name field on `SocketInteractionDataOption`. Changed `Member` to `User` on SocketInteraction. --- .../Entities/Interaction/SocketInteraction.cs | 8 ++++---- .../Entities/Interaction/SocketInteractionDataOption.cs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 4a8277fd4b..eebb590fe7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -28,8 +28,8 @@ public SocketTextChannel Channel /// /// The who triggered this interaction. /// - public SocketGuildUser Member - => Guild.GetUser(MemberId); + public SocketGuildUser User + => Guild.GetUser(UserId); /// /// The type of this interaction. @@ -61,7 +61,7 @@ public bool IsValidToken private ulong GuildId { get; set; } private ulong ChannelId { get; set; } - private ulong MemberId { get; set; } + private ulong UserId { get; set; } internal SocketInteraction(DiscordSocketClient client, ulong id) : base(client, id) @@ -85,7 +85,7 @@ internal void Update(Model model) this.ChannelId = model.ChannelId; this.Token = model.Token; this.Version = model.Version; - this.MemberId = model.Member.User.Id; + this.UserId = model.Member.User.Id; this.Type = model.Type; } private bool CheckToken() diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs index 62097689d1..c4908bc4df 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs @@ -30,7 +30,7 @@ public class SocketInteractionDataOption : IApplicationCommandInteractionDataOpt internal SocketInteractionDataOption() { } internal SocketInteractionDataOption(Model model, DiscordSocketClient discord, ulong guild) { - this.Name = Name; + this.Name = model.Name; this.Value = model.Value.IsSpecified ? model.Value.Value : null; this.discord = discord; this.guild = guild; From b631a113185e89135c1607234cde909557526648 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 5 Apr 2021 03:05:09 -0300 Subject: [PATCH 014/494] Fixed public setter in RestGuildCommand --- src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index 5e0efbf8dd..87e7bc886b 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -15,7 +15,7 @@ public class RestGuildCommand : RestApplicationCommand /// /// The guild Id where this command originates. /// - public ulong GuildId { get; set; } + public ulong GuildId { get; private set; } internal RestGuildCommand(BaseDiscordClient client, ulong id, ulong guildId) : base(client, id) From ead960961be070172c76c3ca5fc912f5eb884a6f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 14 Apr 2021 15:30:20 -0300 Subject: [PATCH 015/494] Added flags to interaction response and webhook message. see https://discord.com/developers/docs/interactions/slash-commands#interaction-response-interactionapplicationcommandcallbackdata. Interaction response types 2 and 3 have been deprecated. --- .../Interactions/InteractionResponseType.cs | 16 ++++++--- ...teractionApplicationCommandCallbackData.cs | 4 +++ .../API/Rest/CreateWebhookMessageParams.cs | 8 +++++ .../Entities/Interaction/SocketInteraction.cs | 33 ++++++++++++------- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index 99a2283581..7160be9761 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -9,6 +9,12 @@ namespace Discord /// /// The response type for an . /// + /// + /// After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using + /// or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, + /// and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. + /// You can read more about Response types Here + /// public enum InteractionResponseType : byte { /// @@ -16,24 +22,26 @@ public enum InteractionResponseType : byte /// Pong = 1, + [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or ACKWithSource", true)] /// /// ACK a command without sending a message, eating the user's input. /// Acknowledge = 2, + [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or ACKWithSource", true)] /// - /// Respond with a message, eating the user's input. + /// Respond with a message, showing the user's input. /// ChannelMessage = 3, /// - /// Respond with a message, showing the user's input. + /// Respond to an interaction with a message. /// ChannelMessageWithSource = 4, /// - /// ACK a command without sending a message, showing the user's input. + /// ACK an interaction and edit a response later, the user sees a loading state. /// - ACKWithSource = 5 + DeferredChannelMessageWithSource = 5 } } diff --git a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs index 6637c176c5..24da5bf7e6 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs @@ -21,6 +21,10 @@ internal class InteractionApplicationCommandCallbackData [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } + // New flags prop. this make the response "ephemeral". see https://discord.com/developers/docs/interactions/slash-commands#interaction-response-interactionapplicationcommandcallbackdata + [JsonProperty("flags")] + public Optional Flags { get; set; } + public InteractionApplicationCommandCallbackData() { } public InteractionApplicationCommandCallbackData(string text) { diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index 0a4f80a3c4..3e201d8ebb 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -11,17 +11,25 @@ internal class CreateWebhookMessageParams [JsonProperty("nonce")] public Optional Nonce { get; set; } + [JsonProperty("tts")] public Optional IsTTS { get; set; } + [JsonProperty("embeds")] public Optional Embeds { get; set; } + [JsonProperty("username")] public Optional Username { get; set; } + [JsonProperty("avatar_url")] public Optional AvatarUrl { get; set; } + [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } + [JsonProperty("flags")] + public Optional Flags { get; set; } + public CreateWebhookMessageParams(string content) { Content = content; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index eebb590fe7..6e7efaf66b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -104,7 +104,8 @@ private bool CheckToken() /// The text of the message to be sent. /// if the message should be read out by a text-to-speech reader, otherwise . /// A to send with this response. - /// The type of response to this Interaction. + /// The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. /// @@ -113,16 +114,17 @@ private bool CheckToken() /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - public async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null) + public async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null) { - if (Type == InteractionResponseType.Pong) + if (type == InteractionResponseType.Pong) throw new InvalidOperationException($"Cannot use {Type} on a send message function"); if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); if (Discord.AlwaysAcknowledgeInteractions) - return await FollowupAsync(); + return await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); // The arguments should be passed? What was i thinking... Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -146,17 +148,20 @@ public async Task RespondAsync(string text = null, bool isTTS = false, var response = new API.InteractionResponse() { - Type = Type, + Type = type, Data = new API.InteractionApplicationCommandCallbackData(text) { AllowedMentions = allowedMentions?.ToModel(), Embeds = embed != null ? new API.Embed[] { embed.ToModel() } : Optional.Unspecified, - TTS = isTTS + TTS = isTTS, } }; + if (ephemeral) + response.Data.Value.Flags = 64; + await Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, Token, options); return null; } @@ -168,15 +173,17 @@ public async Task RespondAsync(string text = null, bool isTTS = false, /// if the message should be read out by a text-to-speech reader, otherwise . /// A to send with this response. /// The type of response to this Interaction. + /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. /// /// The sent message. /// - public async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, + public async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null) { - if (Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.ACKWithSource || Type == InteractionResponseType.Pong) + if (Type == InteractionResponseType.DeferredChannelMessageWithSource || Type == InteractionResponseType.DeferredChannelMessageWithSource || Type == InteractionResponseType.Pong) throw new InvalidOperationException($"Cannot use {Type} on a send message function"); if (!IsValidToken) @@ -189,13 +196,15 @@ public async Task FollowupAsync(string text = null, bool isTTS = false ? new API.Embed[] { embed.ToModel() } : Optional.Unspecified, }; - + + if (ephemeral) + args.Flags = 64; + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); - } /// - /// Acknowledges this interaction with the . + /// Acknowledges this interaction with the . /// /// /// A task that represents the asynchronous operation of acknowledging the interaction. @@ -204,7 +213,7 @@ public async Task AcknowledgeAsync(RequestOptions options = null) { var response = new API.InteractionResponse() { - Type = InteractionResponseType.ACKWithSource, + Type = InteractionResponseType.DeferredChannelMessageWithSource, }; await Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, Token, options).ConfigureAwait(false); From 350d0f91ff99bd4625dfd5311ac0964f413ad18b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 14 Apr 2021 15:46:43 -0300 Subject: [PATCH 016/494] default_permission props on create/modify appliaction command rest entities --- .../API/Rest/CreateApplicationCommandParams.cs | 3 +++ .../API/Rest/ModifyApplicationCommandParams.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs index 4ab6f5a9d3..2e66245d7b 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs @@ -19,6 +19,9 @@ internal class CreateApplicationCommandParams [JsonProperty("options")] public Optional Options { get; set; } + [JsonProperty("default_permission")] + public Optional DefaultPermission { get; set; } + public CreateApplicationCommandParams() { } public CreateApplicationCommandParams(string name, string description, ApplicationCommandOption[] options = null) { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs index 1419329552..2ed9466c07 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs @@ -17,5 +17,8 @@ internal class ModifyApplicationCommandParams [JsonProperty("options")] public Optional Options { get; set; } + + [JsonProperty("default_permission")] + public Optional DefaultPermission { get; set; } } } From 7e9ee8bb1ed5b96a5b5d7d93c76263c04f255f70 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 15 Apr 2021 21:32:47 -0300 Subject: [PATCH 017/494] Add RestFollowupMessage and RestInteractionMessage. Guild command permission routes Bug fixes and general improvements --- .../ApplicationCommandProperties.cs | 5 + .../Interactions/IDiscordInteraction.cs | 2 +- .../Interactions/InteractionResponseType.cs | 6 +- .../SlashCommandCreationProperties.cs | 5 + .../ApplicationCommandPermissions.cs | 62 +++++++++ .../GuildApplicationCommandPermissions.cs | 42 ++++++ .../Net/ApplicationCommandException.cs | 68 +++++++++ src/Discord.Net.Core/Net/HttpException.cs | 10 +- .../Common/ApplicationCommandPermissions.cs | 21 +++ .../GuildApplicationCommandPermissions.cs | 24 ++++ ...odifyGuildApplicationCommandPermissions.cs | 18 +++ .../Rest/ModifyInteractionResponseParams.cs | 2 +- src/Discord.Net.Rest/ClientHelper.cs | 1 + src/Discord.Net.Rest/DiscordRestApiClient.cs | 129 +++++++++++++++++- .../Interactions/InteractionHelper.cs | 92 ++++++++++++- .../Entities/Interactions/RestGuildCommand.cs | 3 + .../Entities/Messages/RestFollowupMessage.cs | 82 +++++++++++ .../Messages/RestInteractionMessage.cs | 81 +++++++++++ .../Net/Queue/RequestQueueBucket.cs | 4 +- .../DiscordSocketConfig.cs | 2 +- .../Entities/Interaction/SocketInteraction.cs | 6 +- 21 files changed, 642 insertions(+), 23 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs create mode 100644 src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs create mode 100644 src/Discord.Net.Core/Net/ApplicationCommandException.cs create mode 100644 src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs create mode 100644 src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs create mode 100644 src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs create mode 100644 src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 594a0f3702..e0d10af873 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -26,5 +26,10 @@ public class ApplicationCommandProperties /// Gets or sets the options for this command. /// public Optional> Options { get; set; } + + /// + /// Whether the command is enabled by default when the app is added to a guild. Default is + /// + public Optional DefaultPermission { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 2cc0faf4fd..3979e8835e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -18,7 +18,7 @@ public interface IDiscordInteraction : ISnowflakeEntity /// /// The id of the interaction. /// - ulong Id { get; } + new ulong Id { get; } /// /// The type of this . diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index 7160be9761..eca4fdff67 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -11,7 +11,7 @@ namespace Discord /// /// /// After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using - /// or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, + /// or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, /// and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. /// You can read more about Response types Here /// @@ -22,13 +22,13 @@ public enum InteractionResponseType : byte /// Pong = 1, - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or ACKWithSource", true)] + [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] /// /// ACK a command without sending a message, eating the user's input. /// Acknowledge = 2, - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or ACKWithSource", true)] + [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] /// /// Respond with a message, showing the user's input. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs index df9f398091..7f4a3a62d6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs @@ -26,5 +26,10 @@ public class SlashCommandCreationProperties /// Gets or sets the options for this command. /// public Optional> Options { get; set; } + + /// + /// Whether the command is enabled by default when the app is added to a guild. Default is + /// + public Optional DefaultPermission { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs new file mode 100644 index 0000000000..86dbd57900 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs @@ -0,0 +1,62 @@ +namespace Discord +{ + /// + /// Application command permissions allow you to enable or disable commands for specific users or roles within a guild. + /// + public class ApplicationCommandPermission + { + /// + /// The id of the role or user. + /// + public ulong Id { get; } + + /// + /// The target of this permission. + /// + public PermissionTarget Type { get; } + + /// + /// to allow, otherwise . + /// + public bool Value { get; } + + internal ApplicationCommandPermission() { } + + /// + /// Creates a new . + /// + /// The id you want to target this permission value for. + /// The type of the targetId parameter. + /// The value of this permission. + public ApplicationCommandPermission(ulong targetId, PermissionTarget targetType, bool allow) + { + this.Id = targetId; + this.Type = targetType; + this.Value = allow; + } + + /// + /// Creates a new targeting . + /// + /// The user you want to target this permission value for. + /// The value of this permission. + public ApplicationCommandPermission(IUser target, bool allow) + { + this.Id = target.Id; + this.Value = allow; + this.Type = PermissionTarget.User; + } + + /// + /// Creates a new targeting . + /// + /// The role you want to target this permission value for. + /// The value of this permission. + public ApplicationCommandPermission(IRole target, bool allow) + { + this.Id = target.Id; + this.Value = allow; + this.Type = PermissionTarget.Role; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs new file mode 100644 index 0000000000..c91bfd59ed --- /dev/null +++ b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Returned when fetching the permissions for a command in a guild. + /// + public class GuildApplicationCommandPermissions + { + /// + /// The id of the command. + /// + public ulong Id { get; } + + /// + /// The id of the application the command belongs to. + /// + public ulong ApplicationId { get; } + + /// + /// The id of the guild. + /// + public ulong GuildId { get; } + + /// + /// The permissions for the command in the guild. + /// + public IReadOnlyCollection Permissions { get; } + + internal GuildApplicationCommandPermissions(ulong id, ulong appId, ulong guildId, List permissions) + { + this.Id = id; + this.ApplicationId = appId; + this.GuildId = guildId; + this.Permissions = permissions.ToReadOnlyCollection(); + } + } +} diff --git a/src/Discord.Net.Core/Net/ApplicationCommandException.cs b/src/Discord.Net.Core/Net/ApplicationCommandException.cs new file mode 100644 index 0000000000..7e94293f4a --- /dev/null +++ b/src/Discord.Net.Core/Net/ApplicationCommandException.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Net +{ + public class ApplicationCommandException : Exception + { + /// + /// Gets the JSON error code returned by Discord. + /// + /// + /// A + /// JSON error code + /// from Discord, or null if none. + /// + public int? DiscordCode { get; } + + /// + /// Gets the reason of the exception. + /// + public string Reason { get; } + + /// + /// Gets the request object used to send the request. + /// + public IRequest Request { get; } + + /// + /// The error object returned from discord. + /// + /// + /// Note: This object can be null if discord didn't provide it. + /// + public object Error { get; } + + /// + /// The request json used to create the application command. This is useful for checking your commands for any format errors. + /// + public string RequestJson { get; } + + /// + /// The underlying that caused this exception to be thrown. + /// + public HttpException InnerHttpException { get; } + /// + /// Initializes a new instance of the class. + /// + /// The request that was sent prior to the exception. + /// + /// + /// The Discord status code returned. + /// The reason behind the exception. + /// + public ApplicationCommandException(string requestJson, HttpException httpError) + : base("The application command failed to be created!", httpError) + { + Request = httpError.Request; + DiscordCode = httpError.DiscordCode; + Reason = httpError.Reason; + Error = httpError.Error; + RequestJson = requestJson; + InnerHttpException = httpError; + } + } +} diff --git a/src/Discord.Net.Core/Net/HttpException.cs b/src/Discord.Net.Core/Net/HttpException.cs index ff9cf91f2f..568562b61a 100644 --- a/src/Discord.Net.Core/Net/HttpException.cs +++ b/src/Discord.Net.Core/Net/HttpException.cs @@ -34,6 +34,13 @@ public class HttpException : Exception /// Gets the request object used to send the request. /// public IRequest Request { get; } + /// + /// The error object returned from discord. + /// + /// + /// Note: This object can be null if discord didn't provide it. + /// + public object Error { get; } /// /// Initializes a new instance of the class. @@ -42,13 +49,14 @@ public class HttpException : Exception /// The request that was sent prior to the exception. /// The Discord status code returned. /// The reason behind the exception. - public HttpException(HttpStatusCode httpCode, IRequest request, int? discordCode = null, string reason = null) + public HttpException(HttpStatusCode httpCode, IRequest request, int? discordCode = null, string reason = null, object errors = null) : base(CreateMessage(httpCode, discordCode, reason)) { HttpCode = httpCode; Request = request; DiscordCode = discordCode; Reason = reason; + Error = errors; } private static string CreateMessage(HttpStatusCode httpCode, int? discordCode = null, string reason = null) diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs new file mode 100644 index 0000000000..105913adc5 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + public class ApplicationCommandPermissions + { + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("type")] + public PermissionTarget Type { get; set; } + + [JsonProperty("permission")] + public bool Permission { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs new file mode 100644 index 0000000000..f64c14ffff --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + public class GuildApplicationCommandPermission + { + [JsonProperty("id")] + public ulong Id { get; } + + [JsonProperty("application_id")] + public ulong ApplicationId { get; } + + [JsonProperty("guild_id")] + public ulong GuildId { get; } + + [JsonProperty("permissions")] + public API.ApplicationCommandPermissions[] Permissions { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs new file mode 100644 index 0000000000..0d1792c94c --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ModifyGuildApplicationCommandPermissions + { + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("permissions")] + public ApplicationCommandPermission[] Permissions { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs index 4012debd7e..04817f90ce 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs @@ -10,7 +10,7 @@ namespace Discord.API.Rest internal class ModifyInteractionResponseParams { [JsonProperty("content")] - public string Content { get; set; } + public Optional Content { get; set; } [JsonProperty("embeds")] public Optional Embeds { get; set; } diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 4666d645dd..f998b72f4a 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -211,6 +211,7 @@ public static async Task> GetGlobalApplic return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); } + public static async Task> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, RequestOptions options) { var response = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index af33360f4e..171a0eaf0d 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -804,7 +804,21 @@ public async Task CreateGlobalApplicationCommandAsync(Create options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options).ConfigureAwait(false); + try + { + return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options).ConfigureAwait(false); + } + catch (HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } + + // Re-throw the http exception + throw; + } } public async Task ModifyGlobalApplicationCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { @@ -823,7 +837,21 @@ public async Task ModifyGlobalApplicationCommandAsync(Modify options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options).ConfigureAwait(false); + try + { + return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options).ConfigureAwait(false); + } + catch (HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } + + // Re-throw the http exception + throw; + } } public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) { @@ -852,7 +880,21 @@ public async Task CreateGuildApplicationCommandAsync(CreateA var bucket = new BucketIds(guildId: guildId); - return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options).ConfigureAwait(false); + try + { + return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options).ConfigureAwait(false); + } + catch (HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } + + // Re-throw the http exception + throw; + } } public async Task ModifyGuildApplicationCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { @@ -873,7 +915,21 @@ public async Task ModifyGuildApplicationCommandAsync(ModifyA var bucket = new BucketIds(guildId: guildId); - return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); + try + { + return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); + } + catch (HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } + + // Re-throw the http exception + throw; + } } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) { @@ -894,6 +950,14 @@ public async Task CreateInteractionResponse(InteractionResponse response, ulong await SendJsonAsync("POST", () => $"interactions/{interactionId}/{interactionToken}/callback", response, new BucketIds(), options: options); } + public async Task GetInteractionResponse(string interactionToken, RequestOptions options = null) + { + Preconditions.NotNullOrEmpty(interactionToken, nameof(interactionToken)); + + options = RequestOptions.CreateOrClone(options); + + return await SendAsync("GET", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original").ConfigureAwait(false); + } public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); @@ -920,13 +984,14 @@ public async Task CreateInteractionFollowupMessage(CreateWebhookMessage return await SendJsonAsync("POST", () => $"webhooks/{CurrentUserId}/{token}?wait=true", args, new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyInteractionFollowupMessage(CreateWebhookMessageParams args, ulong id, string token, RequestOptions options = null) + public async Task ModifyInteractionFollowupMessage(ModifyInteractionResponseParams args, ulong id, string token, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(id, 0, nameof(id)); - if (args.Content?.Length > DiscordConfig.MaxMessageSize) - throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content)); + if(args.Content.IsSpecified) + if (args.Content.Value.Length > DiscordConfig.MaxMessageSize) + throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content)); options = RequestOptions.CreateOrClone(options); @@ -942,6 +1007,56 @@ public async Task DeleteInteractionFollowupMessage(ulong id, string token, Reque await SendAsync("DELETE", () => $"webhooks/{CurrentUserId}/{token}/messages/{id}", new BucketIds(), options: options).ConfigureAwait(false); } + // Application Command permissions + public async Task GetGuildApplicationCommandPermissions(ulong guildId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + + options = RequestOptions.CreateOrClone(options); + + return await SendAsync("GET", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", new BucketIds(), options: options).ConfigureAwait(false); + } + + public async Task GetGuildApplicationCommandPermission(ulong guildId, ulong commandId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + Preconditions.NotEqual(commandId, 0, nameof(commandId)); + + options = RequestOptions.CreateOrClone(options); + + return await SendAsync("GET", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", new BucketIds(), options: options).ConfigureAwait(false); + } + + public async Task ModifyApplicationCommandPermissions(ApplicationCommandPermissions[] permissions, ulong guildId, ulong commandId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + Preconditions.NotEqual(commandId, 0, nameof(commandId)); + + options = RequestOptions.CreateOrClone(options); + + await SendJsonAsync("PUT", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); + } + + public async Task BatchModifyApplicationCommandPermissions(ModifyGuildApplicationCommandPermissions[] permissions, ulong guildId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + Preconditions.NotNull(permissions, nameof(permissions)); + + options = RequestOptions.CreateOrClone(options); + + await SendJsonAsync("PUT", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/premissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); + } + + public async Task BulkOverrideGuildApplicationCommand(API.ApplicationCommand[] commands, ulong guildId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + Preconditions.NotNull(commands, nameof(commands)); + + options = RequestOptions.CreateOrClone(options); + + await SendJsonAsync("PUT", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, new BucketIds(), options: options).ConfigureAwait(false); + } + //Guilds public async Task GetGuildAsync(ulong guildId, bool withCounts, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 46d92f8158..c5a8347c7b 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -10,12 +10,25 @@ namespace Discord.Rest { internal static class InteractionHelper { - internal static async Task SendFollowupAsync(BaseDiscordClient client, API.Rest.CreateWebhookMessageParams args, + internal static async Task SendInteractionResponse(BaseDiscordClient client, IMessageChannel channel, InteractionResponse response, + ulong interactionId, string interactionToken, RequestOptions options = null) + { + await client.ApiClient.CreateInteractionResponse(response, interactionId, interactionToken, options).ConfigureAwait(false); + + // get the original message + var msg = await client.ApiClient.GetInteractionResponse(interactionToken).ConfigureAwait(false); + + var entity = RestInteractionMessage.Create(client, msg, interactionToken, channel); + + return entity; + } + + internal static async Task SendFollowupAsync(BaseDiscordClient client, API.Rest.CreateWebhookMessageParams args, string token, IMessageChannel channel, RequestOptions options = null) { var model = await client.ApiClient.CreateInteractionFollowupMessage(args, token, options).ConfigureAwait(false); - var entity = RestUserMessage.Create(client, channel, client.CurrentUser, model); + RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); return entity; } @@ -44,7 +57,10 @@ internal static async Task CreateGlobalCommand(BaseDiscordCli Description = args.Description, Options = args.Options.IsSpecified ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + : Optional.Unspecified, + DefaultPermission = args.DefaultPermission.IsSpecified + ? args.DefaultPermission.Value + : Optional.Unspecified }; var cmd = await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); @@ -68,7 +84,10 @@ internal static async Task ModifyGlobalCommand(BaseDiscordCli Description = args.Description, Options = args.Options.IsSpecified ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + : Optional.Unspecified, + DefaultPermission = args.DefaultPermission.IsSpecified + ? args.DefaultPermission.Value + : Optional.Unspecified }; var msg = await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); @@ -119,7 +138,10 @@ internal static async Task CreateGuildCommand(BaseDiscordClien Description = args.Description, Options = args.Options.IsSpecified ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + : Optional.Unspecified, + DefaultPermission = args.DefaultPermission.IsSpecified + ? args.DefaultPermission.Value + : Optional.Unspecified }; var cmd = await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); @@ -143,7 +165,10 @@ internal static async Task ModifyGuildCommand(BaseDiscordClien Description = args.Description, Options = args.Options.IsSpecified ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified + : Optional.Unspecified, + DefaultPermission = args.DefaultPermission.IsSpecified + ? args.DefaultPermission.Value + : Optional.Unspecified }; var msg = await client.ApiClient.ModifyGuildApplicationCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); @@ -158,5 +183,60 @@ internal static async Task DeleteGuildCommand(BaseDiscordClient client, RestGuil await client.ApiClient.DeleteGuildApplicationCommandAsync(command.GuildId, command.Id, options).ConfigureAwait(false); } + + internal static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, + RequestOptions options = null) + { + var args = new MessageProperties(); + func(args); + + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(message.Content); + bool hasEmbed = args.Embed.IsSpecified ? args.Embed.Value != null : message.Embeds.Any(); + if (!hasText && !hasEmbed) + Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + + var apiArgs = new API.Rest.ModifyInteractionResponseParams + { + Content = args.Content, + Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create() + }; + + return await client.ApiClient.ModifyInteractionFollowupMessage(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); + } + + internal static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) + => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); + + internal static async Task ModifyInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, Action func, + RequestOptions options = null) + { + var args = new MessageProperties(); + func(args); + + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(message.Content); + bool hasEmbed = args.Embed.IsSpecified ? args.Embed.Value != null : message.Embeds.Any(); + if (!hasText && !hasEmbed) + Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + + var apiArgs = new API.Rest.ModifyInteractionResponseParams + { + Content = args.Content, + Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create() + }; + + return await client.ApiClient.ModifyInteractionFollowupMessage(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); + } + + internal static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) + => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); + + // Guild permissions + internal static async Task> GetCommandGuildPermissions(BaseDiscordClient client, + RestGuildCommand command) + { + // TODO + return null; + } + } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index 87e7bc886b..90e9989779 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -45,5 +45,8 @@ public override async Task DeleteAsync(RequestOptions options = null) /// public async Task ModifyAsync(Action func, RequestOptions options = null) => await InteractionHelper.ModifyGuildCommand(Discord, this, func, options).ConfigureAwait(false); + + public async Task> GetCommandPermissions() + => await InteractionHelper.GetCommandGuildPermissions(Discord, this); } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs new file mode 100644 index 0000000000..a7c65b3a13 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Message; + + +namespace Discord.Rest +{ + /// + /// Represents a REST-based follow up message sent by a bot responding to a slash command. + /// + public class RestFollowupMessage : RestUserMessage + { + // Token used to delete/modify this followup message + internal string Token { get; } + + internal RestFollowupMessage(BaseDiscordClient discord, ulong id, IUser author, string token, IMessageChannel channel) + : base(discord, id, channel, author, MessageSource.Bot) + { + this.Token = token; + } + + internal static RestFollowupMessage Create(BaseDiscordClient discord, Model model, string token, IMessageChannel channel) + { + var entity = new RestFollowupMessage(discord, model.Id, model.Author.IsSpecified ? RestUser.Create(discord, model.Author.Value) : discord.CurrentUser, token, channel); + entity.Update(model); + return entity; + } + + internal new void Update(Model model) + { + base.Update(model); + } + + /// + /// Deletes this object and all of it's childern. + /// + /// A task that represents the asynchronous delete operation. + public Task DeleteAsync() + => InteractionHelper.DeleteFollowupMessage(Discord, this); + + /// + /// Modifies this interaction followup message. + /// + /// + /// This method modifies this message with the specified properties. To see an example of this + /// method and what properties are available, please refer to . + /// + /// + /// The following example replaces the content of the message with Hello World!. + /// + /// await msg.ModifyAsync(x => x.Content = "Hello World!"); + /// + /// + /// A delegate containing the properties to modify the message with. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + /// The token used to modify/delete this message expired. + /// /// Somthing went wrong during the request. + public new async Task ModifyAsync(Action func, RequestOptions options = null) + { + try + { + var model = await InteractionHelper.ModifyFollowupMessage(Discord, this, func, options).ConfigureAwait(false); + this.Update(model); + } + catch (Discord.Net.HttpException x) + { + if(x.HttpCode == System.Net.HttpStatusCode.NotFound) + { + throw new InvalidOperationException("The token of this message has expired!", x); + } + + throw; + } + } + } +} diff --git a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs new file mode 100644 index 0000000000..6733966ad6 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Message; + +namespace Discord.Rest +{ + /// + /// Represents the initial REST-based response to a slash command. + /// + public class RestInteractionMessage : RestUserMessage + { + // Token used to delete/modify this followup message + internal string Token { get; } + + internal RestInteractionMessage(BaseDiscordClient discord, ulong id, IUser author, string token, IMessageChannel channel) + : base(discord, id, channel, author, MessageSource.Bot) + { + this.Token = token; + } + + internal static RestInteractionMessage Create(BaseDiscordClient discord, Model model, string token, IMessageChannel channel) + { + var entity = new RestInteractionMessage(discord, model.Id, model.Author.IsSpecified ? RestUser.Create(discord, model.Author.Value) : discord.CurrentUser, token, channel); + entity.Update(model); + return entity; + } + + internal new void Update(Model model) + { + base.Update(model); + } + + /// + /// Deletes this object and all of it's childern. + /// + /// A task that represents the asynchronous delete operation. + public Task DeleteAsync() + => InteractionHelper.DeletedInteractionResponse(Discord, this); + + /// + /// Modifies this interaction response + /// + /// + /// This method modifies this message with the specified properties. To see an example of this + /// method and what properties are available, please refer to . + /// + /// + /// The following example replaces the content of the message with Hello World!. + /// + /// await msg.ModifyAsync(x => x.Content = "Hello World!"); + /// + /// + /// A delegate containing the properties to modify the message with. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + /// The token used to modify/delete this message expired. + /// /// Somthing went wrong during the request. + public new async Task ModifyAsync(Action func, RequestOptions options = null) + { + try + { + var model = await InteractionHelper.ModifyInteractionResponse(Discord, this, func, options).ConfigureAwait(false); + this.Update(model); + } + catch (Discord.Net.HttpException x) + { + if (x.HttpCode == System.Net.HttpStatusCode.NotFound) + { + throw new InvalidOperationException("The token of this message has expired!", x); + } + + throw; + } + } + } +} diff --git a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs index 3fb45e55d9..d986f5c372 100644 --- a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs +++ b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs @@ -99,6 +99,7 @@ public async Task SendAsync(RestRequest request) default: int? code = null; string reason = null; + object errors = null; if (response.Stream != null) { try @@ -109,11 +110,12 @@ public async Task SendAsync(RestRequest request) var json = JToken.Load(jsonReader); try { code = json.Value("code"); } catch { }; try { reason = json.Value("message"); } catch { }; + try { errors = json.Value("errors"); } catch { }; } } catch { } } - throw new HttpException(response.StatusCode, request, code, reason); + throw new HttpException(response.StatusCode, request, code, reason, errors); } } else diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index 171094aded..e234240ef3 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -111,7 +111,7 @@ public class DiscordSocketConfig : DiscordRestConfig /// /// /// Discord interactions will not appear in chat until the client responds to them. With this option set to - /// , the client will automatically acknowledge the interaction with . + /// , the client will automatically acknowledge the interaction with . /// See the docs on /// responding to interactions for more info. /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 6e7efaf66b..92bc679d8d 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -28,8 +28,7 @@ public SocketTextChannel Channel /// /// The who triggered this interaction. /// - public SocketGuildUser User - => Guild.GetUser(UserId); + public SocketGuildUser User { get; private set; } /// /// The type of this interaction. @@ -87,6 +86,9 @@ internal void Update(Model model) this.Version = model.Version; this.UserId = model.Member.User.Id; this.Type = model.Type; + + if (this.User == null) + this.User = SocketGuildUser.Create(this.Guild, Discord.State, model.Member); // Change from getter. } private bool CheckToken() { From f3684477294f1869d0c408e15f1ace0129b943f7 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 11 May 2021 19:58:51 -0300 Subject: [PATCH 018/494] Pull d.net/dev Merged Discord.Net/dev into here --- src/Discord.Net.Commands/CommandService.cs | 4 +- .../Entities/Channels/IMessageChannel.cs | 15 +++++ .../Entities/Guilds/IGuild.cs | 9 +++ .../Entities/Messages/EmbedBuilder.cs | 56 ++-------------- .../Entities/Messages/IMessage.cs | 8 +++ .../Entities/Messages/ISticker.cs | 67 +++++++++++++++++++ .../Entities/Messages/SticketFormatType.cs | 15 +++++ .../Entities/Users/IGuildUser.cs | 37 +++++++++- src/Discord.Net.Core/Utils/SnowflakeUtils.cs | 2 +- .../API/Common/AuditLogEntry.cs | 2 +- src/Discord.Net.Rest/API/Common/Message.cs | 2 + src/Discord.Net.Rest/API/Common/Sticker.cs | 25 +++++++ .../API/Rest/ModifyWebhookMessageParams.cs | 16 +++++ src/Discord.Net.Rest/ClientHelper.cs | 16 +++-- src/Discord.Net.Rest/DiscordRestApiClient.cs | 46 +++++++++++++ src/Discord.Net.Rest/DiscordRestClient.cs | 14 +++- .../AuditLogs/DataTypes/ChannelInfo.cs | 10 ++- .../DataTypes/ChannelUpdateAuditLogData.cs | 7 +- .../DataTypes/MessagePinAuditLogData.cs | 14 ++-- .../DataTypes/MessageUnpinAuditLogData.cs | 14 ++-- .../Entities/AuditLogs/RestAuditLogEntry.cs | 2 +- .../Entities/Channels/ChannelHelper.cs | 7 ++ .../Entities/Channels/RestDMChannel.cs | 4 ++ .../Entities/Channels/RestGroupChannel.cs | 4 ++ .../Entities/Channels/RestTextChannel.cs | 4 ++ .../Entities/Guilds/GuildHelper.cs | 5 ++ .../Entities/Guilds/RestGuild.cs | 3 + .../Entities/Messages/MessageHelper.cs | 62 +++++++++++++++++ .../Entities/Messages/RestMessage.cs | 4 ++ .../Entities/Messages/RestUserMessage.cs | 17 +++++ .../Entities/Messages/Sticker.cs | 48 +++++++++++++ .../Entities/Users/RestGuildUser.cs | 20 ++++-- .../Entities/Users/RestWebhookUser.cs | 28 +++++--- .../Entities/Users/UserHelper.cs | 12 ++-- .../Entities/Webhooks/RestWebhook.cs | 6 +- .../API/Gateway/Reaction.cs | 4 +- .../BaseSocketClient.Events.cs | 16 ----- src/Discord.Net.WebSocket/BaseSocketClient.cs | 10 +++ .../DiscordSocketClient.cs | 65 +++--------------- .../Entities/Channels/SocketDMChannel.cs | 4 ++ .../Entities/Channels/SocketGroupChannel.cs | 4 ++ .../Entities/Channels/SocketTextChannel.cs | 4 ++ .../Entities/Guilds/SocketGuild.cs | 21 +----- .../Entities/Messages/SocketMessage.cs | 4 ++ .../Entities/Messages/SocketUserMessage.cs | 17 +++++ .../Entities/Users/SocketGuildUser.cs | 22 ++++-- .../Entities/Users/SocketWebhookUser.cs | 34 ++++++++-- .../DiscordWebhookClient.cs | 29 ++++++++ .../Messages/WebhookMessageProperties.cs | 26 +++++++ .../Entities/Webhooks/RestInternalWebhook.cs | 6 +- .../WebhookClientHelper.cs | 54 ++++++++++++++- src/Discord.Net/Discord.Net.nuspec | 32 ++++----- 52 files changed, 739 insertions(+), 218 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Messages/ISticker.cs create mode 100644 src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs create mode 100644 src/Discord.Net.Rest/API/Common/Sticker.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs create mode 100644 src/Discord.Net.Rest/Entities/Messages/Sticker.cs create mode 100644 src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 1d4b0e15a0..8659b01307 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -408,7 +408,7 @@ internal bool HasDefaultTypeReader(Type type) var typeInfo = type.GetTypeInfo(); if (typeInfo.IsEnum) return true; - return _entityTypeReaders.Any(x => type == x.EntityType || typeInfo.ImplementedInterfaces.Contains(x.TypeReaderType)); + return _entityTypeReaders.Any(x => type == x.EntityType || typeInfo.ImplementedInterfaces.Contains(x.EntityType)); } internal void AddNullableTypeReader(Type valueType, TypeReader valueTypeReader) { @@ -511,7 +511,7 @@ public async Task ExecuteAsync(ICommandContext context, string input, I await _commandExecutedEvent.InvokeAsync(Optional.Create(), context, searchResult).ConfigureAwait(false); return searchResult; } - + var commands = searchResult.Commands; var preconditionResults = new Dictionary(); diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index abd20e4f03..e60eb9c132 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -257,6 +257,21 @@ IAsyncEnumerable> GetMessagesAsync(IMessage fromMe /// Task DeleteMessageAsync(IMessage message, RequestOptions options = null); + /// + /// Modifies a message. + /// + /// + /// This method modifies this message with the specified properties. To see an example of this + /// method and what properties are available, please refer to . + /// + /// The snowflake identifier of the message that would be changed. + /// A delegate containing the properties to modify the message with. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null); + /// /// Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. /// diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 6283508e57..36d7351572 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -892,6 +892,15 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// Task> GetWebhooksAsync(RequestOptions options = null); + /// + /// Gets a collection of emotes from this guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of emotes found within the guild. + /// + Task> GetEmotesAsync(RequestOptions options = null); /// /// Gets a specific emote from this guild. /// diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 555fd95df3..f1238ddcf1 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -12,7 +12,6 @@ public class EmbedBuilder { private string _title; private string _description; - private string _url; private EmbedImage? _image; private EmbedThumbnail? _thumbnail; private List _fields; @@ -70,26 +69,14 @@ public string Description /// Gets or sets the URL of an . /// Url is not a well-formed . /// The URL of the embed. - public string Url - { - get => _url; - set - { - if (!value.IsNullOrUri()) throw new ArgumentException(message: "Url must be a well-formed URI.", paramName: nameof(Url)); - _url = value; - } - } + public string Url { get; set; } /// Gets or sets the thumbnail URL of an . /// Url is not a well-formed . /// The thumbnail URL of the embed. public string ThumbnailUrl { get => _thumbnail?.Url; - set - { - if (!value.IsNullOrUri()) throw new ArgumentException(message: "Url must be a well-formed URI.", paramName: nameof(ThumbnailUrl)); - _thumbnail = new EmbedThumbnail(value, null, null, null); - } + set => _thumbnail = new EmbedThumbnail(value, null, null, null); } /// Gets or sets the image URL of an . /// Url is not a well-formed . @@ -97,11 +84,7 @@ public string ThumbnailUrl public string ImageUrl { get => _image?.Url; - set - { - if (!value.IsNullOrUri()) throw new ArgumentException(message: "Url must be a well-formed URI.", paramName: nameof(ImageUrl)); - _image = new EmbedImage(value, null, null, null); - } + set => _image = new EmbedImage(value, null, null, null); } /// Gets or sets the list of of an . @@ -553,8 +536,6 @@ public EmbedField Build() public class EmbedAuthorBuilder { private string _name; - private string _url; - private string _iconUrl; /// /// Gets the maximum author name length allowed by Discord. /// @@ -585,15 +566,7 @@ public string Name /// /// The URL of the author field. /// - public string Url - { - get => _url; - set - { - if (!value.IsNullOrUri()) throw new ArgumentException(message: "Url must be a well-formed URI.", paramName: nameof(Url)); - _url = value; - } - } + public string Url { get; set; } /// /// Gets or sets the icon URL of the author field. /// @@ -601,15 +574,7 @@ public string Url /// /// The icon URL of the author field. /// - public string IconUrl - { - get => _iconUrl; - set - { - if (!value.IsNullOrUri()) throw new ArgumentException(message: "Url must be a well-formed URI.", paramName: nameof(IconUrl)); - _iconUrl = value; - } - } + public string IconUrl { get; set; } /// /// Sets the name of the author field. @@ -671,7 +636,6 @@ public EmbedAuthor Build() public class EmbedFooterBuilder { private string _text; - private string _iconUrl; /// /// Gets the maximum footer length allowed by Discord. @@ -703,15 +667,7 @@ public string Text /// /// The icon URL of the footer field. /// - public string IconUrl - { - get => _iconUrl; - set - { - if (!value.IsNullOrUri()) throw new ArgumentException(message: "Url must be a well-formed URI.", paramName: nameof(IconUrl)); - _iconUrl = value; - } - } + public string IconUrl { get; set; } /// /// Sets the name of the footer field. diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index 80b1ffa687..eb135768cb 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -164,6 +164,14 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// IReadOnlyDictionary Reactions { get; } + /// + /// Gets all stickers included in this message. + /// + /// + /// A read-only collection of sticker objects. + /// + IReadOnlyCollection Stickers { get; } + /// /// Gets the flags related to this message. /// diff --git a/src/Discord.Net.Core/Entities/Messages/ISticker.cs b/src/Discord.Net.Core/Entities/Messages/ISticker.cs new file mode 100644 index 0000000000..e7e4405b63 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/ISticker.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; + +namespace Discord +{ + /// + /// Represents a discord sticker. + /// + public interface ISticker + { + /// + /// Gets the ID of this sticker. + /// + /// + /// A snowflake ID associated with this sticker. + /// + ulong Id { get; } + /// + /// Gets the ID of the pack of this sticker. + /// + /// + /// A snowflake ID associated with the pack of this sticker. + /// + ulong PackId { get; } + /// + /// Gets the name of this sticker. + /// + /// + /// A with the name of this sticker. + /// + string Name { get; } + /// + /// Gets the description of this sticker. + /// + /// + /// A with the description of this sticker. + /// + string Description { get; } + /// + /// Gets the list of tags of this sticker. + /// + /// + /// A read-only list with the tags of this sticker. + /// + IReadOnlyCollection Tags { get; } + /// + /// Gets the asset hash of this sticker. + /// + /// + /// A with the asset hash of this sticker. + /// + string Asset { get; } + /// + /// Gets the preview asset hash of this sticker. + /// + /// + /// A with the preview asset hash of this sticker. + /// + string PreviewAsset { get; } + /// + /// Gets the format type of this sticker. + /// + /// + /// A with the format type of this sticker. + /// + StickerFormatType FormatType { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs b/src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs new file mode 100644 index 0000000000..d24a38534c --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs @@ -0,0 +1,15 @@ +namespace Discord +{ + /// Defines the types of formats for stickers. + public enum StickerFormatType + { + /// Default value for a sticker format type. + None = 0, + /// The sticker format type is png. + Png = 1, + /// The sticker format type is apng. + Apng = 2, + /// The sticker format type is lottie. + Lottie = 3, + } +} diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs index 582e9e7a7f..492cb95666 100644 --- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs @@ -113,7 +113,15 @@ public interface IGuildUser : IUser, IVoiceState /// A task that represents the asynchronous modification operation. /// Task ModifyAsync(Action func, RequestOptions options = null); - + /// + /// Adds the specified role to this user in the guild. + /// + /// The role to be added to the user. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous role addition operation. + /// + Task AddRoleAsync(ulong roleId, RequestOptions options = null); /// /// Adds the specified role to this user in the guild. /// @@ -124,6 +132,15 @@ public interface IGuildUser : IUser, IVoiceState /// Task AddRoleAsync(IRole role, RequestOptions options = null); /// + /// Adds the specified to this user in the guild. + /// + /// The roles to be added to the user. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous role addition operation. + /// + Task AddRolesAsync(IEnumerable roleIds, RequestOptions options = null); + /// /// Adds the specified to this user in the guild. /// /// The roles to be added to the user. @@ -133,6 +150,15 @@ public interface IGuildUser : IUser, IVoiceState /// Task AddRolesAsync(IEnumerable roles, RequestOptions options = null); /// + /// Removes the specified from this user in the guild. + /// + /// The role to be removed from the user. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous role removal operation. + /// + Task RemoveRoleAsync(ulong roleId, RequestOptions options = null); + /// /// Removes the specified from this user in the guild. /// /// The role to be removed from the user. @@ -142,6 +168,15 @@ public interface IGuildUser : IUser, IVoiceState /// Task RemoveRoleAsync(IRole role, RequestOptions options = null); /// + /// Removes the specified from this user in the guild. + /// + /// The roles to be removed from the user. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous role removal operation. + /// + Task RemoveRolesAsync(IEnumerable roleIds, RequestOptions options = null); + /// /// Removes the specified from this user in the guild. /// /// The roles to be removed from the user. diff --git a/src/Discord.Net.Core/Utils/SnowflakeUtils.cs b/src/Discord.Net.Core/Utils/SnowflakeUtils.cs index dd8f8ca663..e52c99376f 100644 --- a/src/Discord.Net.Core/Utils/SnowflakeUtils.cs +++ b/src/Discord.Net.Core/Utils/SnowflakeUtils.cs @@ -12,7 +12,7 @@ public static class SnowflakeUtils /// /// The snowflake identifier to resolve. /// - /// A representing the time for when the object is geenrated. + /// A representing the time for when the object is generated. /// public static DateTimeOffset FromSnowflake(ulong value) => DateTimeOffset.FromUnixTimeMilliseconds((long)((value >> 22) + 1420070400000UL)); diff --git a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs index 80d9a9e975..7458a19cbf 100644 --- a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs +++ b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs @@ -7,7 +7,7 @@ internal class AuditLogEntry [JsonProperty("target_id")] public ulong? TargetId { get; set; } [JsonProperty("user_id")] - public ulong UserId { get; set; } + public ulong? UserId { get; set; } [JsonProperty("changes")] public AuditLogChange[] Changes { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index b781de3460..6ea2c29ff7 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -58,5 +58,7 @@ internal class Message public Optional AllowedMentions { get; set; } [JsonProperty("referenced_message")] public Optional ReferencedMessage { get; set; } + [JsonProperty("stickers")] + public Optional Stickers { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/Sticker.cs b/src/Discord.Net.Rest/API/Common/Sticker.cs new file mode 100644 index 0000000000..0d1cac9749 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/Sticker.cs @@ -0,0 +1,25 @@ +#pragma warning disable CS1591 +using Newtonsoft.Json; + +namespace Discord.API +{ + internal class Sticker + { + [JsonProperty("id")] + public ulong Id { get; set; } + [JsonProperty("pack_id")] + public ulong PackId { get; set; } + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("description")] + public string Desription { get; set; } + [JsonProperty("tags")] + public Optional Tags { get; set; } + [JsonProperty("asset")] + public string Asset { get; set; } + [JsonProperty("preview_asset")] + public string PreviewAsset { get; set; } + [JsonProperty("format_type")] + public StickerFormatType FormatType { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs new file mode 100644 index 0000000000..ba8fcbb4e1 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs @@ -0,0 +1,16 @@ +#pragma warning disable CS1591 +using Newtonsoft.Json; + +namespace Discord.API.Rest +{ + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + internal class ModifyWebhookMessageParams + { + [JsonProperty("content")] + public Optional Content { get; set; } + [JsonProperty("embeds")] + public Optional Embeds { get; set; } + [JsonProperty("allowed_mentions")] + public Optional AllowedMentions { get; set; } + } +} diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 8910e999a4..b60c02cab4 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -17,7 +17,7 @@ public static async Task GetApplicationInfoAsync(BaseDiscordCli return RestApplication.Create(client, model); } - public static async Task GetChannelAsync(BaseDiscordClient client, + public static async Task GetChannelAsync(BaseDiscordClient client, ulong id, RequestOptions options) { var model = await client.ApiClient.GetChannelAsync(id, options).ConfigureAwait(false); @@ -45,13 +45,13 @@ public static async Task> GetGroupChannels .Where(x => x.Type == ChannelType.Group) .Select(x => RestGroupChannel.Create(client, x)).ToImmutableArray(); } - + public static async Task> GetConnectionsAsync(BaseDiscordClient client, RequestOptions options) { var models = await client.ApiClient.GetMyConnectionsAsync(options).ConfigureAwait(false); return models.Select(RestConnection.Create).ToImmutableArray(); } - + public static async Task GetInviteAsync(BaseDiscordClient client, string inviteId, RequestOptions options) { @@ -60,7 +60,7 @@ public static async Task GetInviteAsync(BaseDiscordClient cl return RestInviteMetadata.Create(client, null, null, model); return null; } - + public static async Task GetGuildAsync(BaseDiscordClient client, ulong id, bool withCounts, RequestOptions options) { @@ -85,7 +85,7 @@ public static async Task GetGuildAsync(BaseDiscordClient client, return RestGuildWidget.Create(model); return null; } - public static IAsyncEnumerable> GetGuildSummariesAsync(BaseDiscordClient client, + public static IAsyncEnumerable> GetGuildSummariesAsync(BaseDiscordClient client, ulong? fromGuildId, int? limit, RequestOptions options) { return new PagedAsyncEnumerable( @@ -136,7 +136,7 @@ public static async Task CreateGuildAsync(BaseDiscordClient client, var model = await client.ApiClient.CreateGuildAsync(args, options).ConfigureAwait(false); return RestGuild.Create(client, model); } - + public static async Task GetUserAsync(BaseDiscordClient client, ulong id, RequestOptions options) { @@ -201,5 +201,9 @@ public static async Task GetBotGatewayAsync(BaseDiscordClient client } }; } + public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) + => client.ApiClient.AddRoleAsync(guildId, userId, roleId, options); + public static Task RemoveRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) + => client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options); } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 592ad7e920..d3e4aa5157 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -523,6 +523,43 @@ public async Task CreateWebhookMessageAsync(ulong webhookId, CreateWebh var ids = new BucketIds(webhookId: webhookId); return await SendJsonAsync("POST", () => $"webhooks/{webhookId}/{AuthToken}?wait=true", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); } + + /// Message content is too long, length must be less or equal to . + /// This operation may only be called with a token. + public async Task ModifyWebhookMessageAsync(ulong webhookId, ulong messageId, ModifyWebhookMessageParams args, RequestOptions options = null) + { + if (AuthTokenType != TokenType.Webhook) + throw new InvalidOperationException($"This operation may only be called with a {nameof(TokenType.Webhook)} token."); + + Preconditions.NotNull(args, nameof(args)); + Preconditions.NotEqual(webhookId, 0, nameof(webhookId)); + Preconditions.NotEqual(messageId, 0, nameof(messageId)); + + if (args.Embeds.IsSpecified) + Preconditions.AtMost(args.Embeds.Value.Length, 10, nameof(args.Embeds), "A max of 10 Embeds are allowed."); + if (args.Content.IsSpecified && args.Content.Value.Length > DiscordConfig.MaxMessageSize) + throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content)); + options = RequestOptions.CreateOrClone(options); + + var ids = new BucketIds(webhookId: webhookId); + await SendJsonAsync("PATCH", () => $"webhooks/{webhookId}/{AuthToken}/messages/{messageId}", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); + } + + /// This operation may only be called with a token. + public async Task DeleteWebhookMessageAsync(ulong webhookId, ulong messageId, RequestOptions options = null) + { + if (AuthTokenType != TokenType.Webhook) + throw new InvalidOperationException($"This operation may only be called with a {nameof(TokenType.Webhook)} token."); + + Preconditions.NotEqual(webhookId, 0, nameof(webhookId)); + Preconditions.NotEqual(messageId, 0, nameof(messageId)); + + options = RequestOptions.CreateOrClone(options); + + var ids = new BucketIds(webhookId: webhookId); + await SendAsync("DELETE", () => $"webhooks/{webhookId}/{AuthToken}/messages/{messageId}", ids, options: options).ConfigureAwait(false); + } + /// Message content is too long, length must be less or equal to . public async Task UploadFileAsync(ulong channelId, UploadFileParams args, RequestOptions options = null) { @@ -1243,6 +1280,15 @@ public async Task> ModifyGuildRolesAsync(ulong guildId } //Guild emoji + public async Task> GetGuildEmotesAsync(ulong guildId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + options = RequestOptions.CreateOrClone(options); + + var ids = new BucketIds(guildId: guildId); + return await SendAsync>("GET", () => $"guilds/{guildId}/emojis", ids, options: options).ConfigureAwait(false); + } + public async Task GetGuildEmoteAsync(ulong guildId, ulong emoteId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 48c40fdfaa..7eff7363c0 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -107,7 +107,19 @@ public Task GetVoiceRegionAsync(string id, RequestOptions optio => ClientHelper.GetVoiceRegionAsync(this, id, options); public Task GetWebhookAsync(ulong id, RequestOptions options = null) => ClientHelper.GetWebhookAsync(this, id, options); - + public Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId) + => ClientHelper.AddRoleAsync(this, guildId, userId, roleId); + public Task RemoveRoleAsync(ulong guildId, ulong userId, ulong roleId) + => ClientHelper.RemoveRoleAsync(this, guildId, userId, roleId); + + public Task AddReactionAsync(ulong channelId, ulong messageId, IEmote emote, RequestOptions options = null) + => MessageHelper.AddReactionAsync(channelId, messageId, emote, this, options); + public Task RemoveReactionAsync(ulong channelId, ulong messageId, ulong userId, IEmote emote, RequestOptions options = null) + => MessageHelper.RemoveReactionAsync(channelId, messageId, userId, emote, this, options); + public Task RemoveAllReactionsAsync(ulong channelId, ulong messageId, RequestOptions options = null) + => MessageHelper.RemoveAllReactionsAsync(channelId, messageId, this, options); + public Task RemoveAllReactionsForEmoteAsync(ulong channelId, ulong messageId, IEmote emote, RequestOptions options = null) + => MessageHelper.RemoveAllReactionsForEmoteAsync(channelId, messageId, emote, this, options); //IDiscordClient /// async Task IDiscordClient.GetApplicationInfoAsync(RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelInfo.cs index 0284b63f57..f50d9eeb3c 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelInfo.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelInfo.cs @@ -5,13 +5,14 @@ namespace Discord.Rest /// public struct ChannelInfo { - internal ChannelInfo(string name, string topic, int? rateLimit, bool? nsfw, int? bitrate) + internal ChannelInfo(string name, string topic, int? rateLimit, bool? nsfw, int? bitrate, ChannelType? type) { Name = name; Topic = topic; SlowModeInterval = rateLimit; IsNsfw = nsfw; Bitrate = bitrate; + ChannelType = type; } /// @@ -53,5 +54,12 @@ internal ChannelInfo(string name, string topic, int? rateLimit, bool? nsfw, int? /// null if this is not mentioned in this entry. /// public int? Bitrate { get; } + /// + /// Gets the type of this channel. + /// + /// + /// The channel type of this channel; null if not applicable. + /// + public ChannelType? ChannelType { get; } } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs index fa5233145e..b2294f1830 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs @@ -26,6 +26,7 @@ internal static ChannelUpdateAuditLogData Create(BaseDiscordClient discord, Mode var rateLimitPerUserModel = changes.FirstOrDefault(x => x.ChangedProperty == "rate_limit_per_user"); var nsfwModel = changes.FirstOrDefault(x => x.ChangedProperty == "nsfw"); var bitrateModel = changes.FirstOrDefault(x => x.ChangedProperty == "bitrate"); + var typeModel = changes.FirstOrDefault(x => x.ChangedProperty == "type"); string oldName = nameModel?.OldValue?.ToObject(discord.ApiClient.Serializer), newName = nameModel?.NewValue?.ToObject(discord.ApiClient.Serializer); @@ -37,9 +38,11 @@ internal static ChannelUpdateAuditLogData Create(BaseDiscordClient discord, Mode newNsfw = nsfwModel?.NewValue?.ToObject(discord.ApiClient.Serializer); int? oldBitrate = bitrateModel?.OldValue?.ToObject(discord.ApiClient.Serializer), newBitrate = bitrateModel?.NewValue?.ToObject(discord.ApiClient.Serializer); + ChannelType? oldType = typeModel?.OldValue?.ToObject(discord.ApiClient.Serializer), + newType = typeModel?.NewValue?.ToObject(discord.ApiClient.Serializer); - var before = new ChannelInfo(oldName, oldTopic, oldRateLimitPerUser, oldNsfw, oldBitrate); - var after = new ChannelInfo(newName, newTopic, newRateLimitPerUser, newNsfw, newBitrate); + var before = new ChannelInfo(oldName, oldTopic, oldRateLimitPerUser, oldNsfw, oldBitrate, oldType); + var after = new ChannelInfo(newName, newTopic, newRateLimitPerUser, newNsfw, newBitrate, newType); return new ChannelUpdateAuditLogData(entry.TargetId.Value, before, after); } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessagePinAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessagePinAuditLogData.cs index 020171152f..be66ac846f 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessagePinAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessagePinAuditLogData.cs @@ -19,8 +19,14 @@ private MessagePinAuditLogData(ulong messageId, ulong channelId, IUser user) internal static MessagePinAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) { - var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); - return new MessagePinAuditLogData(entry.Options.MessageId.Value, entry.Options.ChannelId.Value, RestUser.Create(discord, userInfo)); + RestUser user = null; + if (entry.TargetId.HasValue) + { + var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); + user = RestUser.Create(discord, userInfo); + } + + return new MessagePinAuditLogData(entry.Options.MessageId.Value, entry.Options.ChannelId.Value, user); } /// @@ -38,10 +44,10 @@ internal static MessagePinAuditLogData Create(BaseDiscordClient discord, Model l /// public ulong ChannelId { get; } /// - /// Gets the user of the message that was pinned. + /// Gets the user of the message that was pinned if available. /// /// - /// A user object representing the user that created the pinned message. + /// A user object representing the user that created the pinned message or . /// public IUser Target { get; } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageUnpinAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageUnpinAuditLogData.cs index 1b3ff96f33..b4fa389cc0 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageUnpinAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageUnpinAuditLogData.cs @@ -19,8 +19,14 @@ private MessageUnpinAuditLogData(ulong messageId, ulong channelId, IUser user) internal static MessageUnpinAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) { - var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); - return new MessageUnpinAuditLogData(entry.Options.MessageId.Value, entry.Options.ChannelId.Value, RestUser.Create(discord, userInfo)); + RestUser user = null; + if (entry.TargetId.HasValue) + { + var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); + user = RestUser.Create(discord, userInfo); + } + + return new MessageUnpinAuditLogData(entry.Options.MessageId.Value, entry.Options.ChannelId.Value, user); } /// @@ -38,10 +44,10 @@ internal static MessageUnpinAuditLogData Create(BaseDiscordClient discord, Model /// public ulong ChannelId { get; } /// - /// Gets the user of the message that was unpinned. + /// Gets the user of the message that was unpinned if available. /// /// - /// A user object representing the user that created the unpinned message. + /// A user object representing the user that created the unpinned message or . /// public IUser Target { get; } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs b/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs index d604077f43..2176eab710 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs @@ -22,7 +22,7 @@ private RestAuditLogEntry(BaseDiscordClient discord, Model fullLog, EntryModel m internal static RestAuditLogEntry Create(BaseDiscordClient discord, Model fullLog, EntryModel model) { - var userInfo = fullLog.Users.FirstOrDefault(x => x.Id == model.UserId); + var userInfo = model.UserId != null ? fullLog.Users.FirstOrDefault(x => x.Id == model.UserId) : null; IUser user = null; if (userInfo != null) user = RestUser.Create(discord, userInfo); diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index c1d0ac2944..7c4edb43e7 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -286,6 +286,13 @@ public static async Task SendFileAsync(IMessageChannel channel, return RestUserMessage.Create(client, channel, client.CurrentUser, model); } + public static async Task ModifyMessageAsync(IMessageChannel channel, ulong messageId, Action func, + BaseDiscordClient client, RequestOptions options) + { + var msgModel = await MessageHelper.ModifyAsync(channel.Id, messageId, client, func, options).ConfigureAwait(false); + return RestUserMessage.Create(client, channel, msgModel.Author.IsSpecified ? RestUser.Create(client, msgModel.Author.Value) : client.CurrentUser, msgModel); + } + public static Task DeleteMessageAsync(IMessageChannel channel, ulong messageId, BaseDiscordClient client, RequestOptions options) => MessageHelper.DeleteAsync(channel.Id, messageId, client, options); diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index d59a10fb5f..6ccfd204c2 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -135,6 +135,10 @@ public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) public Task DeleteMessageAsync(IMessage message, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, message.Id, Discord, options); + /// + public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); + /// public Task TriggerTypingAsync(RequestOptions options = null) => ChannelHelper.TriggerTypingAsync(this, Discord, options); diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index 666d6a4f48..2b0ab8b421 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -93,6 +93,10 @@ public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) public Task DeleteMessageAsync(IMessage message, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, message.Id, Discord, options); + /// + public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); + /// /// Message content is too long, length must be less or equal to . public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index fdc4b7988f..c6d0b0509a 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -152,6 +152,10 @@ public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions o public Task DeleteMessagesAsync(IEnumerable messageIds, RequestOptions options = null) => ChannelHelper.DeleteMessagesAsync(this, Discord, messageIds, options); + /// + public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); + /// public Task TriggerTypingAsync(RequestOptions options = null) => ChannelHelper.TriggerTypingAsync(this, Discord, options); diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 04ec279308..d10d046ee6 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -496,6 +496,11 @@ public static async Task> GetWebhooksAsync(IGui } //Emotes + public static async Task> GetEmotesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) + { + var models = await client.ApiClient.GetGuildEmotesAsync(guild.Id, options).ConfigureAwait(false); + return models.Select(x => x.ToEntity()).ToImmutableArray(); + } public static async Task GetEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) { var emote = await client.ApiClient.GetGuildEmoteAsync(guild.Id, id, options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index c74e128a85..57918a1e7e 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -828,6 +828,9 @@ public Task> GetWebhooksAsync(RequestOptions op //Emotes /// + public Task> GetEmotesAsync(RequestOptions options = null) + => GuildHelper.GetEmotesAsync(this, Discord, options); + /// public Task GetEmoteAsync(ulong id, RequestOptions options = null) => GuildHelper.GetEmoteAsync(this, Discord, id, options); /// diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index e22ae71cd4..1bc284836a 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -71,6 +71,48 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie return await client.ApiClient.ModifyMessageAsync(msg.Channel.Id, msg.Id, apiArgs, options).ConfigureAwait(false); } + public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDiscordClient client, Action func, + RequestOptions options) + { + var args = new MessageProperties(); + func(args); + + if ((args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value)) && (args.Embed.IsSpecified && args.Embed.Value == null)) + Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + + if (args.AllowedMentions.IsSpecified) + { + AllowedMentions allowedMentions = args.AllowedMentions.Value; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); + } + } + } + + var apiArgs = new API.Rest.ModifyMessageParams + { + Content = args.Content, + Embed = args.Embed.IsSpecified ? args.Embed.Value.ToModel() : Optional.Create(), + Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), + }; + return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); + } + public static Task DeleteAsync(IMessage msg, BaseDiscordClient client, RequestOptions options) => DeleteAsync(msg.Channel.Id, msg.Id, client, options); @@ -89,21 +131,41 @@ public static async Task SuppressEmbedsAsync(IMessage msg, BaseDiscordClient cli await client.ApiClient.SuppressEmbedAsync(msg.Channel.Id, msg.Id, apiArgs, options).ConfigureAwait(false); } + public static async Task AddReactionAsync(ulong channelId, ulong messageId, IEmote emote, BaseDiscordClient client, RequestOptions options) + { + await client.ApiClient.AddReactionAsync(channelId, messageId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); + } + public static async Task AddReactionAsync(IMessage msg, IEmote emote, BaseDiscordClient client, RequestOptions options) { await client.ApiClient.AddReactionAsync(msg.Channel.Id, msg.Id, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); } + public static async Task RemoveReactionAsync(ulong channelId, ulong messageId, ulong userId, IEmote emote, BaseDiscordClient client, RequestOptions options) + { + await client.ApiClient.RemoveReactionAsync(channelId, messageId, userId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); + } + public static async Task RemoveReactionAsync(IMessage msg, ulong userId, IEmote emote, BaseDiscordClient client, RequestOptions options) { await client.ApiClient.RemoveReactionAsync(msg.Channel.Id, msg.Id, userId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); } + public static async Task RemoveAllReactionsAsync(ulong channelId, ulong messageId, BaseDiscordClient client, RequestOptions options) + { + await client.ApiClient.RemoveAllReactionsAsync(channelId, messageId, options).ConfigureAwait(false); + } + public static async Task RemoveAllReactionsAsync(IMessage msg, BaseDiscordClient client, RequestOptions options) { await client.ApiClient.RemoveAllReactionsAsync(msg.Channel.Id, msg.Id, options).ConfigureAwait(false); } + public static async Task RemoveAllReactionsForEmoteAsync(ulong channelId, ulong messageId, IEmote emote, BaseDiscordClient client, RequestOptions options) + { + await client.ApiClient.RemoveAllReactionsForEmoteAsync(channelId, messageId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); + } + public static async Task RemoveAllReactionsForEmoteAsync(IMessage msg, IEmote emote, BaseDiscordClient client, RequestOptions options) { await client.ApiClient.RemoveAllReactionsForEmoteAsync(msg.Channel.Id, msg.Id, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index b2a7459809..793e89dff8 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -58,6 +58,8 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); + /// + public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); /// public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); @@ -173,6 +175,8 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.Embeds => Embeds; /// IReadOnlyCollection IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); + /// + IReadOnlyCollection IMessage.Stickers => Stickers; /// public IReadOnlyDictionary Reactions => _reactions.ToDictionary(x => x.Emote, x => new ReactionMetadata { ReactionCount = x.Count, IsMe = x.Me }); diff --git a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs index cf025aea10..1274f1fd36 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs @@ -21,6 +21,7 @@ public class RestUserMessage : RestMessage, IUserMessage private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentionIds = ImmutableArray.Create(); private ImmutableArray _userMentions = ImmutableArray.Create(); + private ImmutableArray _stickers = ImmutableArray.Create(); /// public override bool IsTTS => _isTTS; @@ -45,6 +46,8 @@ public class RestUserMessage : RestMessage, IUserMessage /// public override IReadOnlyCollection Tags => _tags; /// + public override IReadOnlyCollection Stickers => _stickers; + /// public IUserMessage ReferencedMessage => _referencedMessage; internal RestUserMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source) @@ -132,6 +135,20 @@ internal override void Update(Model model) IUser refMsgAuthor = MessageHelper.GetAuthor(Discord, guild, refMsg.Author.Value, refMsg.WebhookId.ToNullable()); _referencedMessage = RestUserMessage.Create(Discord, Channel, refMsgAuthor, refMsg); } + + if (model.Stickers.IsSpecified) + { + var value = model.Stickers.Value; + if (value.Length > 0) + { + var stickers = ImmutableArray.CreateBuilder(value.Length); + for (int i = 0; i < value.Length; i++) + stickers.Add(Sticker.Create(value[i])); + _stickers = stickers.ToImmutable(); + } + else + _stickers = ImmutableArray.Create(); + } } /// diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs new file mode 100644 index 0000000000..5482bed740 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.Diagnostics; +using Model = Discord.API.Sticker; + +namespace Discord +{ + /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] + public class Sticker : ISticker + { + /// + public ulong Id { get; } + /// + public ulong PackId { get; } + /// + public string Name { get; } + /// + public string Description { get; } + /// + public IReadOnlyCollection Tags { get; } + /// + public string Asset { get; } + /// + public string PreviewAsset { get; } + /// + public StickerFormatType FormatType { get; } + + internal Sticker(ulong id, ulong packId, string name, string description, string[] tags, string asset, string previewAsset, StickerFormatType formatType) + { + Id = id; + PackId = packId; + Name = name; + Description = description; + Tags = tags.ToReadOnlyCollection(); + Asset = asset; + PreviewAsset = previewAsset; + FormatType = formatType; + } + internal static Sticker Create(Model model) + { + return new Sticker(model.Id, model.PackId, model.Name, model.Desription, + model.Tags.IsSpecified ? model.Tags.Value.Split(',') : new string[0], + model.Asset, model.PreviewAsset, model.FormatType); + } + + private string DebuggerDisplay => $"{Name} ({Id})"; + } +} diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index 4a6bc1025c..6e6bbe09cf 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -112,17 +112,29 @@ public async Task ModifyAsync(Action func, RequestOptions o public Task KickAsync(string reason = null, RequestOptions options = null) => UserHelper.KickAsync(this, Discord, reason, options); /// + public Task AddRoleAsync(ulong roleId, RequestOptions options = null) + => AddRolesAsync(new[] { roleId }, options); + /// public Task AddRoleAsync(IRole role, RequestOptions options = null) - => AddRolesAsync(new[] { role }, options); + => AddRoleAsync(role.Id, options); + /// + public Task AddRolesAsync(IEnumerable roleIds, RequestOptions options = null) + => UserHelper.AddRolesAsync(this, Discord, roleIds, options); /// public Task AddRolesAsync(IEnumerable roles, RequestOptions options = null) - => UserHelper.AddRolesAsync(this, Discord, roles, options); + => AddRolesAsync(roles.Select(x => x.Id), options); + /// + public Task RemoveRoleAsync(ulong roleId, RequestOptions options = null) + => RemoveRolesAsync(new[] { roleId }, options); /// public Task RemoveRoleAsync(IRole role, RequestOptions options = null) - => RemoveRolesAsync(new[] { role }, options); + => RemoveRoleAsync(role.Id, options); + /// + public Task RemoveRolesAsync(IEnumerable roleIds, RequestOptions options = null) + => UserHelper.RemoveRolesAsync(this, Discord, roleIds, options); /// public Task RemoveRolesAsync(IEnumerable roles, RequestOptions options = null) - => UserHelper.RemoveRolesAsync(this, Discord, roles, options); + => RemoveRolesAsync(roles.Select(x => x.Id)); /// /// Resolving permissions requires the parent guild to be downloaded. diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs index a06916c9bf..2131fec93d 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs @@ -59,27 +59,35 @@ IGuild IGuildUser.Guild /// ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue); /// - Task IGuildUser.KickAsync(string reason, RequestOptions options) => + Task IGuildUser.KickAsync(string reason, RequestOptions options) => throw new NotSupportedException("Webhook users cannot be kicked."); /// - Task IGuildUser.ModifyAsync(Action func, RequestOptions options) => + Task IGuildUser.ModifyAsync(Action func, RequestOptions options) => throw new NotSupportedException("Webhook users cannot be modified."); - /// - Task IGuildUser.AddRoleAsync(IRole role, RequestOptions options) => + Task IGuildUser.AddRoleAsync(ulong role, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); - /// - Task IGuildUser.AddRolesAsync(IEnumerable roles, RequestOptions options) => + Task IGuildUser.AddRoleAsync(IRole role, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); - /// - Task IGuildUser.RemoveRoleAsync(IRole role, RequestOptions options) => + Task IGuildUser.AddRolesAsync(IEnumerable roles, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + /// + Task IGuildUser.AddRolesAsync(IEnumerable roles, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + /// + Task IGuildUser.RemoveRoleAsync(ulong role, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + /// + Task IGuildUser.RemoveRoleAsync(IRole role, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + /// + Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); - /// - Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => + Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); //IVoiceState diff --git a/src/Discord.Net.Rest/Entities/Users/UserHelper.cs b/src/Discord.Net.Rest/Entities/Users/UserHelper.cs index 58e8cd4179..3a19fcfc11 100644 --- a/src/Discord.Net.Rest/Entities/Users/UserHelper.cs +++ b/src/Discord.Net.Rest/Entities/Users/UserHelper.cs @@ -73,16 +73,16 @@ public static async Task CreateDMChannelAsync(IUser user, BaseDis return RestDMChannel.Create(client, await client.ApiClient.CreateDMChannelAsync(args, options).ConfigureAwait(false)); } - public static async Task AddRolesAsync(IGuildUser user, BaseDiscordClient client, IEnumerable roles, RequestOptions options) + public static async Task AddRolesAsync(IGuildUser user, BaseDiscordClient client, IEnumerable roleIds, RequestOptions options) { - foreach (var role in roles) - await client.ApiClient.AddRoleAsync(user.Guild.Id, user.Id, role.Id, options).ConfigureAwait(false); + foreach (var roleId in roleIds) + await client.ApiClient.AddRoleAsync(user.Guild.Id, user.Id, roleId, options).ConfigureAwait(false); } - public static async Task RemoveRolesAsync(IGuildUser user, BaseDiscordClient client, IEnumerable roles, RequestOptions options) + public static async Task RemoveRolesAsync(IGuildUser user, BaseDiscordClient client, IEnumerable roleIds, RequestOptions options) { - foreach (var role in roles) - await client.ApiClient.RemoveRoleAsync(user.Guild.Id, user.Id, role.Id, options).ConfigureAwait(false); + foreach (var roleId in roleIds) + await client.ApiClient.RemoveRoleAsync(user.Guild.Id, user.Id, roleId, options).ConfigureAwait(false); } } } diff --git a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs index 1fdc95a63d..9baddf003d 100644 --- a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs +++ b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs @@ -11,11 +11,11 @@ public class RestWebhook : RestEntity, IWebhook, IUpdateable internal IGuild Guild { get; private set; } internal ITextChannel Channel { get; private set; } - /// - public ulong ChannelId { get; } /// public string Token { get; } + /// + public ulong ChannelId { get; private set; } /// public string Name { get; private set; } /// @@ -56,6 +56,8 @@ internal static RestWebhook Create(BaseDiscordClient discord, ITextChannel chann internal void Update(Model model) { + if (ChannelId != model.ChannelId) + ChannelId = model.ChannelId; if (model.Avatar.IsSpecified) AvatarId = model.Avatar.Value; if (model.Creator.IsSpecified) diff --git a/src/Discord.Net.WebSocket/API/Gateway/Reaction.cs b/src/Discord.Net.WebSocket/API/Gateway/Reaction.cs index 62de456e24..a0a740868b 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/Reaction.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/Reaction.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; namespace Discord.API.Gateway { @@ -12,5 +12,7 @@ internal class Reaction public ulong ChannelId { get; set; } [JsonProperty("emoji")] public Emoji Emoji { get; set; } + [JsonProperty("member")] + public Optional Member { get; set; } } } diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 1105179991..966aec7fad 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -315,22 +315,6 @@ public event Func GuildUpdated { } internal readonly AsyncEvent> _guildUpdatedEvent = new AsyncEvent>(); - //Invites - internal readonly AsyncEvent> _inviteCreatedEvent = new AsyncEvent>(); - /// Fired when a invite is created. - public event Func InviteCreated - { - add { _inviteCreatedEvent.Add(value); } - remove { _inviteCreatedEvent.Remove(value); } - } - internal readonly AsyncEvent, Task>> _inviteDeletedEvent = new AsyncEvent, Task>>(); - /// Fired when a invite is deleted. - public event Func, Task> InviteDeleted - { - add { _inviteDeletedEvent.Add(value); } - remove { _inviteDeletedEvent.Remove(value); } - } - //Users /// Fired when a user joins a guild. public event Func UserJoined { diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.cs b/src/Discord.Net.WebSocket/BaseSocketClient.cs index 425889613c..36e6c02a93 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.cs @@ -209,6 +209,12 @@ private static DiscordSocketApiClient CreateApiClient(DiscordSocketConfig config /// The name of the game. /// If streaming, the URL of the stream. Must be a valid Twitch URL. /// The type of the game. + /// + /// + /// Bot accounts cannot set as their activity + /// type and it will have no effect. + /// + /// /// /// A task that represents the asynchronous set operation. /// @@ -222,6 +228,10 @@ private static DiscordSocketApiClient CreateApiClient(DiscordSocketConfig config /// Discord will only accept setting of name and the type of activity. /// /// + /// Bot accounts cannot set as their activity + /// type and it will have no effect. + /// + /// /// Rich Presence cannot be set via this method or client. Rich Presence is strictly limited to RPC /// clients only. /// diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f3a8a6c2ed..e284fd883b 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1384,6 +1384,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty ? Optional.Create() : Optional.Create(cachedMsg); + if (data.Member.IsSpecified) + { + var guild = (channel as SocketGuildChannel)?.Guild; + + if (guild != null) + user = guild.AddOrUpdateUser(data.Member.Value); + } + var optionalUser = user is null ? Optional.Create() : Optional.Create(user); @@ -1474,7 +1482,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var cacheable = new Cacheable(cachedMsg, data.MessageId, isCached, async () => await channel.GetMessageAsync(data.MessageId).ConfigureAwait(false) as IUserMessage); var emote = data.Emoji.ToIEmote(); - cachedMsg?.RemoveAllReactionsForEmoteAsync(emote); + cachedMsg?.RemoveReactionsForEmote(emote); await TimedInvokeAsync(_reactionsRemovedForEmoteEvent, nameof(ReactionsRemovedForEmote), cacheable, channel, emote).ConfigureAwait(false); } @@ -1741,61 +1749,6 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th } break; - case "INVITE_CREATE": - { - await _gatewayLogger.DebugAsync("Received Dispatch (INVITE_CREATE)").ConfigureAwait(false); - var data = (payload as JToken).ToObject(_serializer); - if(data.GuildID.HasValue) - { - var guild = State.GetGuild(data.GuildID.Value); - if (guild != null) - { - if (!guild.IsSynced) - { - await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); - return; - } - - var channel = guild.GetChannel(data.ChannelID); - - if (channel != null) - { - var invite = new SocketGuildInvite(this, guild, channel, data.InviteCode, data); - guild.AddSocketInvite(invite); - await TimedInvokeAsync(_inviteCreatedEvent, nameof(InviteCreated), invite).ConfigureAwait(false); - } - } - } - } - break; - case "INVITE_DELETE": - { - await _gatewayLogger.DebugAsync("Received Dispatch (INVITE_DELETE)").ConfigureAwait(false); - var data = (payload as JToken).ToObject(_serializer); - if(data.GuildID.IsSpecified) - { - var guild = State.GetGuild(data.GuildID.Value); - if (guild != null) - { - if (!guild.IsSynced) - { - await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); - return; - } - - var channel = guild.GetChannel(data.ChannelID); - - if (channel != null) - { - var invite = guild.RemoveSocketInvite(data.Code); - var cache = new Cacheable(null, data.Code, invite != null, async () => await guild.GetSocketInviteAsync(data.Code)); - await TimedInvokeAsync(_inviteDeletedEvent, nameof(InviteDeleted), cache).ConfigureAwait(false); - } - } - } - - } - break; //Invites case "INVITE_CREATE": diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs index c123a9d4ea..5de4170362 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs @@ -152,6 +152,10 @@ public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) public Task DeleteMessageAsync(IMessage message, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, message.Id, Discord, options); + /// + public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); + /// public Task TriggerTypingAsync(RequestOptions options = null) => ChannelHelper.TriggerTypingAsync(this, Discord, options); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index dc5ac4222e..ab8c76aebc 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -180,6 +180,10 @@ public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) public Task DeleteMessageAsync(IMessage message, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, message.Id, Discord, options); + /// + public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); + /// public Task TriggerTypingAsync(RequestOptions options = null) => ChannelHelper.TriggerTypingAsync(this, Discord, options); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index d7d918f9fe..71a20c198e 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -180,6 +180,10 @@ public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions o public Task DeleteMessagesAsync(IEnumerable messageIds, RequestOptions options = null) => ChannelHelper.DeleteMessagesAsync(this, Discord, messageIds, options); + /// + public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); + /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 59dfbed2dc..0e36c6b507 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -39,7 +39,6 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable private ImmutableArray _emotes; private ImmutableArray _features; private AudioClient _audioClient; - private InviteCache _invites; #pragma warning restore IDISP002, IDISP006 /// @@ -361,7 +360,6 @@ internal SocketGuild(DiscordSocketClient client, ulong id) _audioLock = new SemaphoreSlim(1, 1); _emotes = ImmutableArray.Create(); _features = ImmutableArray.Create(); - _invites = new InviteCache(client); } internal static SocketGuild Create(DiscordSocketClient discord, ClientState state, ExtendedModel model) { @@ -617,22 +615,6 @@ public Task RemoveBanAsync(IUser user, RequestOptions options = null) public Task RemoveBanAsync(ulong userId, RequestOptions options = null) => GuildHelper.RemoveBanAsync(this, Discord, userId, options); - //Invites - internal void AddSocketInvite(SocketGuildInvite invite) - => _invites.Add(invite); - internal SocketGuildInvite RemoveSocketInvite(string code) - => _invites.Remove(code); - internal async Task GetSocketInviteAsync(string code) - { - var invites = await this.GetInvitesAsync(); - RestInviteMetadata restInvite = invites.First(x => x.Code == code); - if (restInvite == null) - return null; - - var invite = new SocketGuildInvite(Discord, this, this.GetChannel(restInvite.ChannelId), code, restInvite); - return invite; - } - //Channels /// /// Gets a channel in this guild. @@ -1026,6 +1008,9 @@ public Task> GetWebhooksAsync(RequestOptions op //Emotes /// + public Task> GetEmotesAsync(RequestOptions options = null) + => GuildHelper.GetEmotesAsync(this, Discord, options); + /// public Task GetEmoteAsync(ulong id, RequestOptions options = null) => GuildHelper.GetEmoteAsync(this, Discord, id, options); /// diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 2ca53cbb97..8b45d882b1 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -99,6 +99,8 @@ public abstract class SocketMessage : SocketEntity, IMessage /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); /// + public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); + /// public IReadOnlyDictionary Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); /// @@ -194,6 +196,8 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.MentionedRoleIds => MentionedRoles.Select(x => x.Id).ToImmutableArray(); /// IReadOnlyCollection IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); + /// + IReadOnlyCollection IMessage.Stickers => Stickers; internal void AddReaction(SocketReaction reaction) { diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 859b1b80a7..2a8b45ca1f 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -23,6 +23,7 @@ public class SocketUserMessage : SocketMessage, IUserMessage private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentions = ImmutableArray.Create(); private ImmutableArray _userMentions = ImmutableArray.Create(); + private ImmutableArray _stickers = ImmutableArray.Create(); /// public override bool IsTTS => _isTTS; @@ -47,6 +48,8 @@ public class SocketUserMessage : SocketMessage, IUserMessage /// public override IReadOnlyCollection MentionedUsers => _userMentions; /// + public override IReadOnlyCollection Stickers => _stickers; + /// public IUserMessage ReferencedMessage => _referencedMessage; internal SocketUserMessage(DiscordSocketClient discord, ulong id, ISocketMessageChannel channel, SocketUser author, MessageSource source) @@ -158,6 +161,20 @@ internal override void Update(ClientState state, Model model) refMsgAuthor = new SocketUnknownUser(Discord, id: 0); _referencedMessage = SocketUserMessage.Create(Discord, state, refMsgAuthor, Channel, refMsg); } + + if (model.Stickers.IsSpecified) + { + var value = model.Stickers.Value; + if (value.Length > 0) + { + var stickers = ImmutableArray.CreateBuilder(value.Length); + for (int i = 0; i < value.Length; i++) + stickers.Add(Sticker.Create(value[i])); + _stickers = stickers.ToImmutable(); + } + else + _stickers = ImmutableArray.Create(); + } } /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index c0a681d9dd..9263fe642c 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -63,7 +63,7 @@ public class SocketGuildUser : SocketUser, IGuildUser /// /// Returns a collection of roles that the user possesses. /// - public IReadOnlyCollection Roles + public IReadOnlyCollection Roles => _roleIds.Select(id => Guild.GetRole(id)).Where(x => x != null).ToReadOnlyCollection(() => _roleIds.Length); /// /// Returns the voice channel the user is in, or null if none. @@ -177,17 +177,29 @@ public Task ModifyAsync(Action func, RequestOptions options public Task KickAsync(string reason = null, RequestOptions options = null) => UserHelper.KickAsync(this, Discord, reason, options); /// + public Task AddRoleAsync(ulong roleId, RequestOptions options = null) + => AddRolesAsync(new[] { roleId }, options); + /// public Task AddRoleAsync(IRole role, RequestOptions options = null) - => AddRolesAsync(new[] { role }, options); + => AddRoleAsync(role.Id, options); + /// + public Task AddRolesAsync(IEnumerable roleIds, RequestOptions options = null) + => UserHelper.AddRolesAsync(this, Discord, roleIds, options); /// public Task AddRolesAsync(IEnumerable roles, RequestOptions options = null) - => UserHelper.AddRolesAsync(this, Discord, roles, options); + => AddRolesAsync(roles.Select(x => x.Id), options); + /// + public Task RemoveRoleAsync(ulong roleId, RequestOptions options = null) + => RemoveRolesAsync(new[] { roleId }, options); /// public Task RemoveRoleAsync(IRole role, RequestOptions options = null) - => RemoveRolesAsync(new[] { role }, options); + => RemoveRoleAsync(role.Id, options); + /// + public Task RemoveRolesAsync(IEnumerable roleIds, RequestOptions options = null) + => UserHelper.RemoveRolesAsync(this, Discord, roleIds, options); /// public Task RemoveRolesAsync(IEnumerable roles, RequestOptions options = null) - => UserHelper.RemoveRolesAsync(this, Discord, roles, options); + => RemoveRolesAsync(roles.Select(x => x.Id)); /// public ChannelPermissions GetPermissions(IGuildChannel channel) diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index 5103aa8b31..c22164f959 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -31,7 +31,7 @@ public class SocketWebhookUser : SocketUser, IWebhookUser public override bool IsWebhook => true; /// internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null, null, null); } set { } } - internal override SocketGlobalUser GlobalUser => + internal override SocketGlobalUser GlobalUser => throw new NotSupportedException(); internal SocketWebhookUser(SocketGuild guild, ulong id, ulong webhookId) @@ -73,32 +73,52 @@ internal static SocketWebhookUser Create(SocketGuild guild, ClientState state, M ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue); /// /// Webhook users cannot be kicked. - Task IGuildUser.KickAsync(string reason, RequestOptions options) => + Task IGuildUser.KickAsync(string reason, RequestOptions options) => throw new NotSupportedException("Webhook users cannot be kicked."); /// /// Webhook users cannot be modified. - Task IGuildUser.ModifyAsync(Action func, RequestOptions options) => + Task IGuildUser.ModifyAsync(Action func, RequestOptions options) => throw new NotSupportedException("Webhook users cannot be modified."); /// /// Roles are not supported on webhook users. - Task IGuildUser.AddRoleAsync(IRole role, RequestOptions options) => + Task IGuildUser.AddRoleAsync(ulong roleId, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); /// /// Roles are not supported on webhook users. - Task IGuildUser.AddRolesAsync(IEnumerable roles, RequestOptions options) => + Task IGuildUser.AddRoleAsync(IRole role, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); /// /// Roles are not supported on webhook users. - Task IGuildUser.RemoveRoleAsync(IRole role, RequestOptions options) => + Task IGuildUser.AddRolesAsync(IEnumerable roleIds, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); /// /// Roles are not supported on webhook users. - Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => + Task IGuildUser.AddRolesAsync(IEnumerable roles, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + + /// + /// Roles are not supported on webhook users. + Task IGuildUser.RemoveRoleAsync(ulong roleId, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + + /// + /// Roles are not supported on webhook users. + Task IGuildUser.RemoveRoleAsync(IRole role, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + + /// + /// Roles are not supported on webhook users. + Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => + throw new NotSupportedException("Roles are not supported on webhook users."); + + /// + /// Roles are not supported on webhook users. + Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); //IVoiceState diff --git a/src/Discord.Net.Webhook/DiscordWebhookClient.cs b/src/Discord.Net.Webhook/DiscordWebhookClient.cs index a6d4ef1831..91d0774114 100644 --- a/src/Discord.Net.Webhook/DiscordWebhookClient.cs +++ b/src/Discord.Net.Webhook/DiscordWebhookClient.cs @@ -91,6 +91,35 @@ public Task SendMessageAsync(string text = null, bool isTTS = false, IEnu string username = null, string avatarUrl = null, RequestOptions options = null, AllowedMentions allowedMentions = null) => WebhookClientHelper.SendMessageAsync(this, text, isTTS, embeds, username, avatarUrl, allowedMentions, options); + /// + /// Modifies a message posted using this webhook. + /// + /// + /// This method can only modify messages that were sent using the same webhook. + /// + /// ID of the modified message. + /// A delegate containing the properties to modify the message with. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + public Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => WebhookClientHelper.ModifyMessageAsync(this, messageId, func, options); + + /// + /// Deletes a message posted using this webhook. + /// + /// + /// This method can only delete messages that were sent using the same webhook. + /// + /// ID of the deleted message. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous deletion operation. + /// + public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) + => WebhookClientHelper.DeleteMessageAsync(this, messageId, options); + /// Sends a message to the channel for this webhook with an attachment. /// Returns the ID of the created message. public Task SendFileAsync(string filePath, string text, bool isTTS = false, diff --git a/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs b/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs new file mode 100644 index 0000000000..dec7b6e3b4 --- /dev/null +++ b/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace Discord.Webhook +{ + /// + /// Properties that are used to modify an Webhook message with the specified changes. + /// + public class WebhookMessageProperties + { + /// + /// Gets or sets the content of the message. + /// + /// + /// This must be less than the constant defined by . + /// + public Optional Content { get; set; } + /// + /// Gets or sets the embed array that the message should display. + /// + public Optional> Embeds { get; set; } + /// + /// Gets or sets the allowed mentions of the message. + /// + public Optional AllowedMentions { get; set; } + } +} diff --git a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs index 60cb89ee26..bbb160fcd5 100644 --- a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs +++ b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.Webhook; @@ -11,9 +11,9 @@ internal class RestInternalWebhook : IWebhook private DiscordWebhookClient _client; public ulong Id { get; } - public ulong ChannelId { get; } public string Token { get; } + public ulong ChannelId { get; private set; } public string Name { get; private set; } public string AvatarId { get; private set; } public ulong? GuildId { get; private set; } @@ -36,6 +36,8 @@ internal static RestInternalWebhook Create(DiscordWebhookClient client, Model mo internal void Update(Model model) { + if (ChannelId != model.ChannelId) + ChannelId = model.ChannelId; if (model.Avatar.IsSpecified) AvatarId = model.Avatar.Value; if (model.GuildId.IsSpecified) diff --git a/src/Discord.Net.Webhook/WebhookClientHelper.cs b/src/Discord.Net.Webhook/WebhookClientHelper.cs index 4bc2eaca98..886ff234df 100644 --- a/src/Discord.Net.Webhook/WebhookClientHelper.cs +++ b/src/Discord.Net.Webhook/WebhookClientHelper.cs @@ -36,7 +36,59 @@ public static async Task SendMessageAsync(DiscordWebhookClient client, var model = await client.ApiClient.CreateWebhookMessageAsync(client.Webhook.Id, args, options: options).ConfigureAwait(false); return model.Id; } - public static async Task SendFileAsync(DiscordWebhookClient client, string filePath, string text, bool isTTS, + public static async Task ModifyMessageAsync(DiscordWebhookClient client, ulong messageId, + Action func, RequestOptions options) + { + var args = new WebhookMessageProperties(); + func(args); + + if (args.AllowedMentions.IsSpecified) + { + var allowedMentions = args.AllowedMentions.Value; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), + "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), + "A max of 100 user Ids are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions?.AllowedTypes != null) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", + nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", + nameof(allowedMentions)); + } + } + } + + var apiArgs = new ModifyWebhookMessageParams + { + Content = args.Content.IsSpecified ? args.Content.Value : Optional.Create(), + Embeds = + args.Embeds.IsSpecified + ? args.Embeds.Value.Select(embed => embed.ToModel()).ToArray() + : Optional.Create(), + AllowedMentions = args.AllowedMentions.IsSpecified + ? args.AllowedMentions.Value.ToModel() + : Optional.Create() + }; + + await client.ApiClient.ModifyWebhookMessageAsync(client.Webhook.Id, messageId, apiArgs, options) + .ConfigureAwait(false); + } + public static async Task DeleteMessageAsync(DiscordWebhookClient client, ulong messageId, RequestOptions options) + { + await client.ApiClient.DeleteWebhookMessageAsync(client.Webhook.Id, messageId, options).ConfigureAwait(false); + } + public static async Task SendFileAsync(DiscordWebhookClient client, string filePath, string text, bool isTTS, IEnumerable embeds, string username, string avatarUrl, AllowedMentions allowedMentions, RequestOptions options, bool isSpoiler) { string filename = Path.GetFileName(filePath); diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 494e3ea437..b0fe17439f 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net - 2.3.1-dev$suffix$ + 2.4.0$suffix$ Discord.Net Discord.Net Contributors foxbot @@ -14,25 +14,25 @@ https://github.com/RogueException/Discord.Net/raw/dev/docs/marketing/logo/PackageLogo.png - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From 0bdede8bc3b21225527b93190bc1784494675f9d Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 12 May 2021 03:43:42 -0300 Subject: [PATCH 019/494] Update README.md --- README.md | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 34a633f72e..dffbdb32cf 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,5 @@ -# Discord.Net -[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net) -[![MyGet](https://img.shields.io/myget/discord-net/vpre/Discord.Net.svg)](https://www.myget.org/feed/Packages/discord-net) -[![Build Status](https://dev.azure.com/discord-net/Discord.Net/_apis/build/status/discord-net.Discord.Net?branchName=dev)](https://dev.azure.com/discord-net/Discord.Net/_build/latest?definitionId=1&branchName=dev) -[![Discord](https://discord.com/api/guilds/81384788765712384/widget.png)](https://discord.gg/jkrBmQR) - -An unofficial .NET API Wrapper for the Discord client (https://discord.com). +# Discord.Net Labs +The development version of [Discord.Net](https://github.com/discord-net/Discord.Net). This version of the README is a placeholder for now. ## Documentation @@ -13,22 +8,8 @@ An unofficial .NET API Wrapper for the Discord client (https://discord.com). - [Nightly](https://docs.stillu.cc/) - [Latest CI repo](https://github.com/discord-net/docs-static) -## Installation -### Stable (NuGet) -Our stable builds available from NuGet through the Discord.Net metapackage: -- [Discord.Net](https://www.nuget.org/packages/Discord.Net/) - -The individual components may also be installed from NuGet: -- [Discord.Net.Commands](https://www.nuget.org/packages/Discord.Net.Commands/) -- [Discord.Net.Rest](https://www.nuget.org/packages/Discord.Net.Rest/) -- [Discord.Net.WebSocket](https://www.nuget.org/packages/Discord.Net.WebSocket/) -- [Discord.Net.Webhook](https://www.nuget.org/packages/Discord.Net.Webhook/) - -### Unstable (MyGet) -Nightly builds are available through our MyGet feed (`https://www.myget.org/F/discord-net/api/v3/index.json`). - ## Compiling -In order to compile Discord.Net, you require the following: +In order to compile Discord.Net Labs, you require the following: ### Using Visual Studio - [Visual Studio 2017](https://www.microsoft.com/net/core#windowsvs2017) @@ -50,7 +31,7 @@ This library generally abides by [Semantic Versioning](https://semver.org). Pack An increment of the PATCH component always indicates that an internal-only change was made, generally a bugfix. These changes will not affect the public-facing API in any way, and are always guaranteed to be forward- and backwards-compatible with your codebase, any pre-compiled dependencies of your codebase. -An increment of the MINOR component indicates that some addition was made to the library, and this addition is not backwards-compatible with prior versions. However, Discord.Net **does not guarantee forward-compatibility** on minor additions. In other words, we permit a limited set of breaking changes on a minor version bump. +An increment of the MINOR component indicates that some addition was made to the library, and this addition is not backwards-compatible with prior versions. However, Discord.Net Labs **does not guarantee forward-compatibility** on minor additions. In other words, we permit a limited set of breaking changes on a minor version bump. Due to the nature of the Discord API, we will oftentimes need to add a property to an entity to support the latest API changes. Discord.Net provides interfaces as a method of consuming entities; and as such, introducing a new field to an entity is technically a breaking change. Major version bumps generally indicate some major change to the library, and as such we are hesitant to bump the major version for every minor addition to the library. To compromise, we have decided that interfaces should be treated as **consumable only**, and your applications should typically not be implementing interfaces. (For applications where interfaces are implemented, such as in test mocks, we apologize for this inconsistency with SemVer). From 610bafca7a33fe780035d7aa3a8300baa3e582d9 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 05:33:57 -0300 Subject: [PATCH 020/494] Creating Message components --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- .../Entities/Channels/IMessageChannel.cs | 9 +- .../Message Components/ActionRowComponent.cs | 21 ++ .../Message Components/ButtonComponent.cs | 35 +++ .../Message Components/ButtonStyle.cs | 39 ++++ .../Message Components/ComponentBuilder.cs | 201 ++++++++++++++++++ .../Message Components/ComponentType.cs | 24 +++ .../Message Components/IMessageComponent.cs | 16 ++ .../Message Components/MessageComponent.cs | 24 +++ .../API/Rest/CreateMessageParams.cs | 6 + .../API/Rest/UploadFileParams.cs | 3 + .../Entities/Channels/ChannelHelper.cs | 12 +- .../Entities/Channels/IRestMessageChannel.cs | 6 +- .../Entities/Channels/RestDMChannel.cs | 24 +-- .../Entities/Channels/RestGroupChannel.cs | 24 +-- .../Entities/Channels/RestTextChannel.cs | 24 +-- .../Channels/ISocketMessageChannel.cs | 9 +- .../Entities/Channels/SocketDMChannel.cs | 24 +-- .../Entities/Channels/SocketGroupChannel.cs | 24 +-- .../Entities/Channels/SocketTextChannel.cs | 24 +-- 20 files changed, 463 insertions(+), 88 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index bc513390c1..bfdab248f9 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,6 +1,6 @@ - + Discord.Net.Core Discord diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index abd20e4f03..656b67a61c 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -28,11 +28,12 @@ public interface IMessageChannel : IChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -65,11 +66,12 @@ public interface IMessageChannel : IChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -99,11 +101,12 @@ public interface IMessageChannel : IChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs new file mode 100644 index 0000000000..6fd74a6f9a --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public class ActionRowComponent : IMessageComponent + { + public ComponentType Type { get; } = ComponentType.ActionRow; + + public IReadOnlyCollection Components { get; internal set; } + + internal ActionRowComponent() { } + internal ActionRowComponent(IReadOnlyCollection components) + { + this.Components = components; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs new file mode 100644 index 0000000000..514f45a62c --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public class ButtonComponent : IMessageComponent + { + public ComponentType Type { get; } = ComponentType.Button; + + public ButtonStyle Style { get; } + + public string Label { get; } + + public IEmote Emote { get; } + + public string CustomId { get; } + + public string Url { get; } + + public bool Disabled { get; } + + internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) + { + this.Style = style; + this.Label = label; + this.Emote = emote; + this.CustomId = customId; + this.Url = url; + this.Disabled = disabled; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs new file mode 100644 index 0000000000..c72767cbd0 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents different styles to use with buttons. You can see an example of the different styles at + /// + public enum ButtonStyle + { + /// + /// A Blurple button + /// + Primary = 1, + + /// + /// A Grey (or gray) button + /// + Secondary = 2, + + /// + /// A Green button + /// + Success = 3, + + /// + /// A Red button + /// + Danger = 4, + + /// + /// A button with a little popup box indicating that this button is a link. + /// + Link = 5 + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs new file mode 100644 index 0000000000..e081bace8f --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public class ComponentBuilder + { + public const int MaxActionRowCount = 5; + + public List ActionRows + { + get => _actionRows; + set + { + if (value == null) + throw new ArgumentNullException(paramName: nameof(ActionRows), message: "Cannot set an component builder's components collection to null."); + if (value.Count > MaxActionRowCount) + throw new ArgumentException(message: $"Action row count must be less than or equal to {MaxActionRowCount}.", paramName: nameof(ActionRows)); + _actionRows = value; + } + } + + private List _actionRows { get; set; } + + public ComponentBuilder WithButton( + string label, + ButtonStyle style = ButtonStyle.Primary, + IEmote emote = null, + string customId = null, + string url = null, + bool disabled = false, + int row = 0) + { + var button = new ButtonBuilder() + .WithLabel(label) + .WithStyle(style) + .WithEmote(emote) + .WithCustomId(customId) + .WithUrl(url) + .WithDisabled(disabled); + + return this.WithButton(button, row); + } + + public ComponentBuilder WithButton(ButtonBuilder button) + => this.WithButton(button, 0); + + public ComponentBuilder WithButton(ButtonBuilder button, int row) + { + var builtButton = button.Build(); + + if (_actionRows == null) + { + _actionRows = new List(); + _actionRows.Add(new ActionRowBuilder().WithComponent(builtButton)); + } + else + { + if (_actionRows.Count + 1 == row) + _actionRows.Add(new ActionRowBuilder().WithComponent(builtButton)); + else + { + if (_actionRows.Count > row) + _actionRows[row].WithComponent(builtButton); + else + { + _actionRows.First().WithComponent(builtButton); + } + } + } + + return this; + } + + public MessageComponent Build() + { + if (this._actionRows != null) + return new MessageComponent(this._actionRows.Select(x => x.Build()).ToList()); + else + return MessageComponent.Empty; + } + } + + public class ActionRowBuilder + { + public const int MaxChildCount = 5; + public List Components + { + get => _components; + set + { + if (value != null) + if (value.Count > MaxChildCount) + throw new ArgumentException(message: $"Action row can only contain {MaxChildCount} child components!", paramName: nameof(Components)); + _components = value; + } + } + + private List _components { get; set; } + + public ActionRowBuilder WithComponents(List components) + { + this.Components = components; + return this; + } + + public ActionRowBuilder WithComponent(IMessageComponent component) + { + if (this.Components == null) + this.Components = new List(); + + this.Components.Add(component); + + return this; + } + + public ActionRowComponent Build() + => new ActionRowComponent(this._components); + } + + public class ButtonBuilder + { + public const int MaxLabelLength = 80; + public const int MaxCustomIdLength = 100; + + public string Label + { + get => _label; + set + { + if(value != null) + if (value.Length > MaxLabelLength) + throw new ArgumentException(message: $"Button label must be {MaxLabelLength} characters or less!", paramName: nameof(Label)); + + _label = value; + } + } + + public string CustomId + { + get => _customId; + set + { + if (value != null) + if (value.Length > MaxCustomIdLength) + throw new ArgumentException(message: $"Custom Id must be {MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + _customId = value; + } + } + + public ButtonStyle Style { get; set; } + public IEmote Emote { get; set; } + public string Url { get; set; } + public bool Disabled { get; set; } + + + private string _label; + private string _customId; + + public ButtonBuilder WithLabel(string label) + { + this.Label = label; + return this; + } + + public ButtonBuilder WithStyle(ButtonStyle style) + { + this.Style = style; + return this; + } + + public ButtonBuilder WithEmote(IEmote emote) + { + this.Emote = emote; + return this; + } + + public ButtonBuilder WithUrl(string url) + { + this.Url = url; + return this; + } + + public ButtonBuilder WithCustomId(string id) + { + this.CustomId = id; + return this; + } + public ButtonBuilder WithDisabled(bool disabled) + { + this.Disabled = disabled; + return this; + } + + public ButtonComponent Build() + => new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs new file mode 100644 index 0000000000..9b75599c99 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a type of a component + /// + public enum ComponentType + { + /// + /// A container for other components + /// + ActionRow = 1, + + /// + /// A clickable button + /// + Button = 2 + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs new file mode 100644 index 0000000000..cc54722951 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public interface IMessageComponent + { + /// + /// The of this Message Component. + /// + public ComponentType Type { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs new file mode 100644 index 0000000000..1ee8dd953b --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public class MessageComponent + { + public IReadOnlyCollection Components { get; } + + internal MessageComponent(List components) + { + this.Components = components; + } + + internal static MessageComponent Empty + => new MessageComponent(new List()); + + internal IMessageComponent[] ToModel() + => this.Components.ToArray(); + } +} diff --git a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs index e645328647..7031013134 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs @@ -11,15 +11,21 @@ internal class CreateMessageParams [JsonProperty("nonce")] public Optional Nonce { get; set; } + [JsonProperty("tts")] public Optional IsTTS { get; set; } + [JsonProperty("embed")] public Optional Embed { get; set; } + [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } + [JsonProperty("message_reference")] public Optional MessageReference { get; set; } + [JsonProperty("components")] + public Optional Components { get; set; } public CreateMessageParams(string content) { Content = content; diff --git a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs index a7d19b4ef3..3b78489aab 100644 --- a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs +++ b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs @@ -21,6 +21,7 @@ internal class UploadFileParams public Optional Embed { get; set; } public Optional AllowedMentions { get; set; } public Optional MessageReference { get; set; } + public Optional MessageComponent { get; set; } public bool IsSpoiler { get; set; } = false; public UploadFileParams(Stream file) @@ -47,6 +48,8 @@ public IReadOnlyDictionary ToDictionary() payload["embed"] = Embed.Value; if (AllowedMentions.IsSpecified) payload["allowed_mentions"] = AllowedMentions.Value; + if (MessageComponent.IsSpecified) + payload["components"] = MessageComponent.Value; if (IsSpoiler) payload["hasSpoiler"] = IsSpoiler.ToString(); diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index c1d0ac2944..69fcd2cb48 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -200,7 +200,7 @@ public static async Task> GetPinnedMessagesAsyn /// Message content is too long, length must be less or equal to . public static async Task SendMessageAsync(IMessageChannel channel, BaseDiscordClient client, - string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, RequestOptions options) + string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, RequestOptions options) { Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -221,7 +221,7 @@ public static async Task SendMessageAsync(IMessageChannel chann } } - var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel() }; + var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.ToModel() }; var model = await client.ApiClient.CreateMessageAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } @@ -251,16 +251,16 @@ public static async Task SendMessageAsync(IMessageChannel chann /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, - string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, RequestOptions options, bool isSpoiler) + string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, RequestOptions options, bool isSpoiler) { string filename = Path.GetFileName(filePath); using (var file = File.OpenRead(filePath)) - return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler).ConfigureAwait(false); + return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler).ConfigureAwait(false); } /// Message content is too long, length must be less or equal to . public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, - Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, RequestOptions options, bool isSpoiler) + Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, RequestOptions options, bool isSpoiler) { Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -281,7 +281,7 @@ public static async Task SendFileAsync(IMessageChannel channel, } } - var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embed = embed?.ToModel() ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, IsSpoiler = isSpoiler }; + var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embed = embed?.ToModel() ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.ToModel() ?? Optional.Unspecified, IsSpoiler = isSpoiler }; var model = await client.ApiClient.UploadFileAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } diff --git a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs index 09404d8361..919360ce83 100644 --- a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs @@ -29,7 +29,7 @@ public interface IRestMessageChannel : IMessageChannel /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -53,7 +53,7 @@ public interface IRestMessageChannel : IMessageChannel /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -77,7 +77,7 @@ public interface IRestMessageChannel : IMessageChannel /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index d59a10fb5f..1d12ee9444 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -93,8 +93,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); /// /// @@ -121,12 +121,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -200,14 +200,14 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); //IChannel /// diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index 666d6a4f48..0f814a2d5e 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -95,8 +95,8 @@ public Task DeleteMessageAsync(IMessage message, RequestOptions options = null) /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); /// /// @@ -123,12 +123,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// public Task TriggerTypingAsync(RequestOptions options = null) @@ -178,14 +178,14 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); //IAudioChannel /// diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index fdc4b7988f..cd2230a613 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -102,8 +102,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); /// /// @@ -130,13 +130,13 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -267,15 +267,15 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); //IGuildChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs index b4625f7997..873e803f2b 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs @@ -34,11 +34,12 @@ public interface ISocketMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -57,11 +58,12 @@ public interface ISocketMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -81,11 +83,12 @@ public interface ISocketMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null); + new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); /// /// Gets a cached message from this channel. diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs index c123a9d4ea..cfc93e139c 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs @@ -135,16 +135,16 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); @@ -229,14 +229,14 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); //IChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index dc5ac4222e..93f2fde109 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -163,15 +163,15 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -293,14 +293,14 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); //IAudioChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index d7d918f9fe..c085f65da7 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -161,17 +161,17 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); /// public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions options = null) @@ -302,14 +302,14 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); // INestedChannel /// From 80ab30e12f790f4f047e853c061c5a25f548a735 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 07:20:47 -0300 Subject: [PATCH 021/494] Component alpha build! --- .../Interactions/IDiscordInteraction.cs | 4 +- .../Interactions/InteractionResponseType.cs | 12 +- .../Entities/Interactions/InteractionType.cs | 9 +- .../Message Components/ActionRowComponent.cs | 3 + .../Message Components/ButtonComponent.cs | 8 + ...teractionApplicationCommandCallbackData.cs | 3 + .../Common/MessageComponentInteractionData.cs | 18 ++ .../API/Rest/CreateWebhookMessageParams.cs | 3 + .../API/Gateway/InteractionCreated.cs | 2 +- .../SocketMessageComponent.cs | 156 +++++++++++++++++ .../SocketMessageComponentData.cs | 28 +++ .../SocketApplicationCommand.cs | 0 .../SocketApplicationCommandChoice.cs | 0 .../SocketApplicationCommandOption.cs | 0 .../Slash Commands/SocketSlashCommand.cs | 161 ++++++++++++++++++ .../SocketSlashCommandData.cs} | 14 +- .../SocketSlashCommandDataOption.cs} | 22 +-- .../Entities/Interaction/SocketInteraction.cs | 125 ++++---------- 18 files changed, 450 insertions(+), 118 deletions(-) create mode 100644 src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs rename src/Discord.Net.WebSocket/Entities/Interaction/{ => Slash Commands}/SocketApplicationCommand.cs (100%) rename src/Discord.Net.WebSocket/Entities/Interaction/{ => Slash Commands}/SocketApplicationCommandChoice.cs (100%) rename src/Discord.Net.WebSocket/Entities/Interaction/{ => Slash Commands}/SocketApplicationCommandOption.cs (100%) create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs rename src/Discord.Net.WebSocket/Entities/Interaction/{SocketInteractionData.cs => Slash Commands/SocketSlashCommandData.cs} (57%) rename src/Discord.Net.WebSocket/Entities/Interaction/{SocketInteractionDataOption.cs => Slash Commands/SocketSlashCommandDataOption.cs} (71%) diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 3979e8835e..5c409e837b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -26,9 +26,9 @@ public interface IDiscordInteraction : ISnowflakeEntity InteractionType Type { get; } /// - /// The command data payload. + /// Represents the data sent within this interaction. /// - IApplicationCommandInteractionData? Data { get; } + object Data { get; } /// /// A continuation token for responding to the interaction. diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index eca4fdff67..1b103f491b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -42,6 +42,16 @@ public enum InteractionResponseType : byte /// /// ACK an interaction and edit a response later, the user sees a loading state. /// - DeferredChannelMessageWithSource = 5 + DeferredChannelMessageWithSource = 5, + + /// + /// for components: ACK an interaction and edit the original message later; the user does not see a loading state + /// + DeferredUpdateMessage = 6, + + /// + /// for components: edit the message the component was attached to + /// + UpdateMessage = 7 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs index f95960586a..4da39b58ec 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs @@ -17,8 +17,13 @@ public enum InteractionType : byte Ping = 1, /// - /// An sent from discord. + /// A sent from discord. /// - ApplicationCommand = 2 + ApplicationCommand = 2, + + /// + /// A sent from discord. + /// + MessageComponent = 3, } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index 6fd74a6f9a..7151cc5af3 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -8,8 +9,10 @@ namespace Discord { public class ActionRowComponent : IMessageComponent { + [JsonProperty("type")] public ComponentType Type { get; } = ComponentType.ActionRow; + [JsonProperty("components")] public IReadOnlyCollection Components { get; internal set; } internal ActionRowComponent() { } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index 514f45a62c..2e2b98f98b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -8,18 +9,25 @@ namespace Discord { public class ButtonComponent : IMessageComponent { + [JsonProperty("type")] public ComponentType Type { get; } = ComponentType.Button; + [JsonProperty("style")] public ButtonStyle Style { get; } + [JsonProperty("label")] public string Label { get; } + [JsonProperty("emoji")] public IEmote Emote { get; } + [JsonProperty("custom_id")] public string CustomId { get; } + [JsonProperty("url")] public string Url { get; } + [JsonProperty("disabled")] public bool Disabled { get; } internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) diff --git a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs index 24da5bf7e6..f5ce752508 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs @@ -25,6 +25,9 @@ internal class InteractionApplicationCommandCallbackData [JsonProperty("flags")] public Optional Flags { get; set; } + [JsonProperty("components")] + public Optional Components { get; set; } + public InteractionApplicationCommandCallbackData() { } public InteractionApplicationCommandCallbackData(string text) { diff --git a/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs new file mode 100644 index 0000000000..cdb4e7d5cf --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class MessageComponentInteractionData + { + [JsonProperty("custom_id")] + public string CustomId { get; set; } + + [JsonProperty("component_type")] + public ComponentType ComponentType { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index 3e201d8ebb..c668ee484c 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -30,6 +30,9 @@ internal class CreateWebhookMessageParams [JsonProperty("flags")] public Optional Flags { get; set; } + [JsonProperty("components")] + public Optional Components { get; set; } + public CreateWebhookMessageParams(string content) { Content = content; diff --git a/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs b/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs index 8fb0cbd58a..8c451a552b 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs @@ -17,7 +17,7 @@ internal class InteractionCreated public InteractionType Type { get; set; } [JsonProperty("data")] - public Optional Data { get; set; } + public Optional Data { get; set; } [JsonProperty("guild_id")] public ulong GuildId { get; set; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs new file mode 100644 index 0000000000..a05fae3cc0 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Gateway.InteractionCreated; +using DataModel = Discord.API.MessageComponentInteractionData; +using Newtonsoft.Json.Linq; +using Discord.Rest; + +namespace Discord.WebSocket +{ + public class SocketMessageComponent : SocketInteraction + { + new public SocketMessageComponentData Data { get; } + + internal SocketMessageComponent(DiscordSocketClient client, Model model) + : base(client, model.Id) + { + var dataModel = model.Data.IsSpecified ? + (model.Data.Value as JToken).ToObject() + : null; + + this.Data = new SocketMessageComponentData(dataModel); + } + + new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model) + { + var entity = new SocketMessageComponent(client, model); + entity.Update(model); + return entity; + } + + /// + /// Responds to an Interaction. + /// + /// If you have set to , You should use + /// instead. + /// + /// + /// The text of the message to be sent. + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A to send with this response. + /// The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// + /// The sent as the response. If this is the first acknowledgement, it will return null. + /// + /// Message content is too long, length must be less or equal to . + /// The parameters provided were invalid or the token was invalid. + + public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + { + if (type == InteractionResponseType.Pong) + throw new InvalidOperationException($"Cannot use {Type} on a send message function"); + + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (Discord.AlwaysAcknowledgeInteractions) + return await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); + + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); + } + } + + + var response = new API.InteractionResponse() + { + Type = type, + Data = new API.InteractionApplicationCommandCallbackData(text) + { + AllowedMentions = allowedMentions?.ToModel(), + Embeds = embed != null + ? new API.Embed[] { embed.ToModel() } + : Optional.Unspecified, + TTS = isTTS, + Components = component?.ToModel() ?? Optional.Unspecified + } + }; + + if (ephemeral) + response.Data.Value.Flags = 64; + + return await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); + } + + /// + /// Sends a followup message for this interaction. + /// + /// The text of the message to be sent + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A to send with this response. + /// The type of response to this Interaction. + /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// + /// The sent message. + /// + public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + { + if (type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.Pong) + throw new InvalidOperationException($"Cannot use {type} on a slash command!"); + + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + var args = new API.Rest.CreateWebhookMessageParams(text) + { + IsTTS = isTTS, + Embeds = embed != null + ? new API.Embed[] { embed.ToModel() } + : Optional.Unspecified, + Components = component?.ToModel() ?? Optional.Unspecified + }; + + if (ephemeral) + args.Flags = 64; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + + public override Task AcknowledgeAsync(RequestOptions options = null) + { + var response = new API.InteractionResponse() + { + Type = InteractionResponseType.DeferredUpdateMessage, + }; + + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs new file mode 100644 index 0000000000..fad959e1de --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.MessageComponentInteractionData; + +namespace Discord.WebSocket +{ + public class SocketMessageComponentData + { + /// + /// The components Custom Id that was clicked + /// + public string CustomId { get; } + + /// + /// The type of the component clicked + /// + public ComponentType Type { get; } + + internal SocketMessageComponentData(Model model) + { + this.CustomId = model.CustomId; + this.Type = model.ComponentType; + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs similarity index 100% rename from src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommand.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandChoice.cs similarity index 100% rename from src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandChoice.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandChoice.cs diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandOption.cs similarity index 100% rename from src/Discord.Net.WebSocket/Entities/Interaction/SocketApplicationCommandOption.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandOption.cs diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs new file mode 100644 index 0000000000..da94c46256 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -0,0 +1,161 @@ +using Discord.Rest; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Gateway.InteractionCreated; +using DataModel = Discord.API.ApplicationCommandInteractionData; + +namespace Discord.WebSocket +{ + public class SocketSlashCommand : SocketInteraction + { + /// + /// The data associated with this interaction. + /// + new public SocketSlashCommandData Data { get; private set; } + + internal SocketSlashCommand(DiscordSocketClient client, Model model) + : base(client, model.Id) + { + var dataModel = model.Data.IsSpecified ? + (model.Data.Value as JToken).ToObject() + : null; + + Data = SocketSlashCommandData.Create(client, dataModel, model.GuildId); + } + + new internal static SocketInteraction Create(DiscordSocketClient client, Model model) + { + var entity = new SocketSlashCommand(client, model); + entity.Update(model); + return entity; + } + + internal override void Update(Model model) + { + var data = model.Data.IsSpecified ? + (model.Data.Value as JToken).ToObject() + : null; + + this.Data.Update(data, this.Guild.Id); + + base.Update(model); + } + + /// + /// Responds to an Interaction. + /// + /// If you have set to , You should use + /// instead. + /// + /// + /// The text of the message to be sent. + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A to send with this response. + /// The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// + /// The sent as the response. If this is the first acknowledgement, it will return null. + /// + /// Message content is too long, length must be less or equal to . + /// The parameters provided were invalid or the token was invalid. + + public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + { + if (type == InteractionResponseType.Pong) + throw new InvalidOperationException($"Cannot use {Type} on a send message function"); + + if(type == InteractionResponseType.DeferredUpdateMessage || type == InteractionResponseType.UpdateMessage) + throw new InvalidOperationException($"Cannot use {Type} on a slash command!"); + + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (Discord.AlwaysAcknowledgeInteractions) + return await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); // The arguments should be passed? What was i thinking... + + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); + } + } + + + var response = new API.InteractionResponse() + { + Type = type, + Data = new API.InteractionApplicationCommandCallbackData(text) + { + AllowedMentions = allowedMentions?.ToModel(), + Embeds = embed != null + ? new API.Embed[] { embed.ToModel() } + : Optional.Unspecified, + TTS = isTTS, + Components = component?.ToModel() ?? Optional.Unspecified + } + }; + + if (ephemeral) + response.Data.Value.Flags = 64; + + return await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); + } + + /// + /// Sends a followup message for this interaction. + /// + /// The text of the message to be sent + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A to send with this response. + /// The type of response to this Interaction. + /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// + /// The sent message. + /// + public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + { + if (type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.Pong || type == InteractionResponseType.DeferredUpdateMessage || type == InteractionResponseType.UpdateMessage) + throw new InvalidOperationException($"Cannot use {type} on a slash command!"); + + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + var args = new API.Rest.CreateWebhookMessageParams(text) + { + IsTTS = isTTS, + Embeds = embed != null + ? new API.Embed[] { embed.ToModel() } + : Optional.Unspecified, + Components = component?.ToModel() ?? Optional.Unspecified + }; + + if (ephemeral) + args.Flags = 64; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs similarity index 57% rename from src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index eef7e5ab47..098d81b865 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -8,27 +8,27 @@ namespace Discord.WebSocket { - public class SocketInteractionData : SocketEntity, IApplicationCommandInteractionData + public class SocketSlashCommandData : SocketEntity, IApplicationCommandInteractionData { /// public string Name { get; private set; } /// - /// The 's recieved with this interaction. + /// The 's recieved with this interaction. /// - public IReadOnlyCollection Options { get; private set; } + public IReadOnlyCollection Options { get; private set; } private ulong guildId; - internal SocketInteractionData(DiscordSocketClient client, ulong id) + internal SocketSlashCommandData(DiscordSocketClient client, ulong id) : base(client, id) { } - internal static SocketInteractionData Create(DiscordSocketClient client, Model model, ulong guildId) + internal static SocketSlashCommandData Create(DiscordSocketClient client, Model model, ulong guildId) { - var entity = new SocketInteractionData(client, model.Id); + var entity = new SocketSlashCommandData(client, model.Id); entity.Update(model, guildId); return entity; } @@ -38,7 +38,7 @@ internal void Update(Model model, ulong guildId) this.guildId = guildId; this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketInteractionDataOption(x, this.Discord, guildId)).ToImmutableArray() + ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, this.Discord, guildId)).ToImmutableArray() : null; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs similarity index 71% rename from src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index c4908bc4df..89f1443bee 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteractionDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -11,7 +11,7 @@ namespace Discord.WebSocket /// /// Represents a Websocket-based recieved by the gateway /// - public class SocketInteractionDataOption : IApplicationCommandInteractionDataOption + public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOption { /// public string Name { get; private set; } @@ -22,13 +22,13 @@ public class SocketInteractionDataOption : IApplicationCommandInteractionDataOpt /// /// The sub command options recieved for this sub command group. /// - public IReadOnlyCollection Options { get; private set; } + public IReadOnlyCollection Options { get; private set; } private DiscordSocketClient discord; private ulong guild; - internal SocketInteractionDataOption() { } - internal SocketInteractionDataOption(Model model, DiscordSocketClient discord, ulong guild) + internal SocketSlashCommandDataOption() { } + internal SocketSlashCommandDataOption(Model model, DiscordSocketClient discord, ulong guild) { this.Name = model.Name; this.Value = model.Value.IsSpecified ? model.Value.Value : null; @@ -36,19 +36,19 @@ internal SocketInteractionDataOption(Model model, DiscordSocketClient discord, u this.guild = guild; this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketInteractionDataOption(x, discord, guild)).ToImmutableArray() + ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, discord, guild)).ToImmutableArray() : null; } // Converters - public static explicit operator bool(SocketInteractionDataOption option) + public static explicit operator bool(SocketSlashCommandDataOption option) => (bool)option.Value; - public static explicit operator int(SocketInteractionDataOption option) + public static explicit operator int(SocketSlashCommandDataOption option) => (int)option.Value; - public static explicit operator string(SocketInteractionDataOption option) + public static explicit operator string(SocketSlashCommandDataOption option) => option.Value.ToString(); - public static explicit operator SocketGuildChannel(SocketInteractionDataOption option) + public static explicit operator SocketGuildChannel(SocketSlashCommandDataOption option) { if (option.Value is ulong id) { @@ -63,7 +63,7 @@ public static explicit operator SocketGuildChannel(SocketInteractionDataOption o return null; } - public static explicit operator SocketRole(SocketInteractionDataOption option) + public static explicit operator SocketRole(SocketSlashCommandDataOption option) { if (option.Value is ulong id) { @@ -78,7 +78,7 @@ public static explicit operator SocketRole(SocketInteractionDataOption option) return null; } - public static explicit operator SocketGuildUser(SocketInteractionDataOption option) + public static explicit operator SocketGuildUser(SocketSlashCommandDataOption option) { if(option.Value is ulong id) { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 92bc679d8d..96f0bca109 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -11,7 +11,7 @@ namespace Discord.WebSocket /// /// Represents an Interaction recieved over the gateway. /// - public class SocketInteraction : SocketEntity, IDiscordInteraction + public abstract class SocketInteraction : SocketEntity, IDiscordInteraction { /// /// The this interaction was used in. @@ -36,14 +36,14 @@ public SocketTextChannel Channel public InteractionType Type { get; private set; } /// - /// The data associated with this interaction. + /// The token used to respond to this interaction. /// - public SocketInteractionData Data { get; private set; } + public string Token { get; private set; } /// - /// The token used to respond to this interaction. + /// The data sent with this interaction. /// - public string Token { get; private set; } + public object Data { get; private set; } /// /// The version of this interaction. @@ -69,15 +69,18 @@ internal SocketInteraction(DiscordSocketClient client, ulong id) internal static SocketInteraction Create(DiscordSocketClient client, Model model) { - var entitiy = new SocketInteraction(client, model.Id); - entitiy.Update(model); - return entitiy; + if (model.Type == InteractionType.ApplicationCommand) + return SocketSlashCommand.Create(client, model); + if (model.Type == InteractionType.MessageComponent) + return SocketMessageComponent.Create(client, model); + else + return null; } - internal void Update(Model model) + internal virtual void Update(Model model) { this.Data = model.Data.IsSpecified - ? SocketInteractionData.Create(this.Discord, model.Data.Value, model.GuildId) + ? model.Data.Value : null; this.GuildId = model.GuildId; @@ -90,14 +93,9 @@ internal void Update(Model model) if (this.User == null) this.User = SocketGuildUser.Create(this.Guild, Discord.State, model.Member); // Change from getter. } - private bool CheckToken() - { - // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction - return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes >= 15d; - } /// - /// Responds to an Interaction. + /// Responds to an Interaction. /// /// If you have set to , You should use /// instead. @@ -110,63 +108,16 @@ private bool CheckToken() /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. + /// A to be sent with this response /// /// The sent as the response. If this is the first acknowledgement, it will return null. /// /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - public async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null) - { - if (type == InteractionResponseType.Pong) - throw new InvalidOperationException($"Cannot use {Type} on a send message function"); - - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - if (Discord.AlwaysAcknowledgeInteractions) - return await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); // The arguments should be passed? What was i thinking... - - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - - // check that user flag and user Id list are exclusive, same with role flag and role Id list - if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) - { - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && - allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) - { - throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); - } - - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && - allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) - { - throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); - } - } - - - var response = new API.InteractionResponse() - { - Type = type, - Data = new API.InteractionApplicationCommandCallbackData(text) - { - AllowedMentions = allowedMentions?.ToModel(), - Embeds = embed != null - ? new API.Embed[] { embed.ToModel() } - : Optional.Unspecified, - TTS = isTTS, - } - }; - - if (ephemeral) - response.Data.Value.Flags = 64; - - await Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, Token, options); - return null; - } + public virtual Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + { return null; } /// /// Sends a followup message for this interaction. @@ -174,36 +125,18 @@ public async Task RespondAsync(string text = null, bool isTTS = false, /// The text of the message to be sent /// if the message should be read out by a text-to-speech reader, otherwise . /// A to send with this response. - /// The type of response to this Interaction. + /// The type of response to this Interaction. /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. + /// A to be sent with this response /// /// The sent message. /// - public async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, - InteractionResponseType Type = InteractionResponseType.ChannelMessageWithSource, - AllowedMentions allowedMentions = null, RequestOptions options = null) - { - if (Type == InteractionResponseType.DeferredChannelMessageWithSource || Type == InteractionResponseType.DeferredChannelMessageWithSource || Type == InteractionResponseType.Pong) - throw new InvalidOperationException($"Cannot use {Type} on a send message function"); - - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - var args = new API.Rest.CreateWebhookMessageParams(text) - { - IsTTS = isTTS, - Embeds = embed != null - ? new API.Embed[] { embed.ToModel() } - : Optional.Unspecified, - }; - - if (ephemeral) - args.Flags = 64; - - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); - } + public virtual Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + { return null; } /// /// Acknowledges this interaction with the . @@ -211,16 +144,20 @@ public async Task FollowupAsync(string text = null, bool isTTS = false /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public async Task AcknowledgeAsync(RequestOptions options = null) + public virtual Task AcknowledgeAsync(RequestOptions options = null) { var response = new API.InteractionResponse() { Type = InteractionResponseType.DeferredChannelMessageWithSource, }; - await Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, Token, options).ConfigureAwait(false); + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); } - IApplicationCommandInteractionData IDiscordInteraction.Data => Data; + private bool CheckToken() + { + // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction + return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes >= 15d; + } } } From 1ce712c673bf54e37505de79a28434c44e40b25d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 07:46:08 -0300 Subject: [PATCH 022/494] meta: update package for nuget --- src/Discord.Net.Core/Discord.Net.Core.csproj | 13 +++++- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 13 +++++- .../Discord - Backup.Net.WebSocket.csproj | 27 ++++++++++++ .../Discord.Net.WebSocket.csproj | 13 +++++- src/Discord.Net/Discord.Net.nuspec | 42 +++++++++---------- .../MockedEntities/MockedDMChannel.cs | 6 +-- .../MockedEntities/MockedGroupChannel.cs | 6 +-- .../MockedEntities/MockedTextChannel.cs | 6 +-- 8 files changed, 93 insertions(+), 33 deletions(-) create mode 100644 src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index bfdab248f9..19b6435f17 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -4,9 +4,14 @@ Discord.Net.Core Discord - The core components for the Discord.Net library. + The core components for the Discord.Net Labs library. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 + Discord.Net.Labs.Core + 2.3.1 + Discord.Net.Labs.Core + https://github.com/Discord-Net-Labs/Discord.Net-Labs + Temporary.png @@ -16,4 +21,10 @@ all + + + True + + + diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 2737ec0d43..457b7c6890 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -4,9 +4,14 @@ Discord.Net.Rest Discord.Rest - A core Discord.Net library containing the REST client and models. + A core Discord.Net Labs library containing the REST client and models. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 + Temporary.png + https://github.com/Discord-Net-Labs/Discord.Net-Labs + 2.3.1 + Discord.Net.Labs.Rest + https://github.com/Discord-Net-Labs/Discord.Net-Labs @@ -14,4 +19,10 @@ + + + True + + + diff --git a/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj new file mode 100644 index 0000000000..e3a5104e7c --- /dev/null +++ b/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj @@ -0,0 +1,27 @@ + + + + + Discord.Net.WebSocket + Discord.WebSocket + A core Discord.Net Labs library containing the WebSocket client and models. + net461;netstandard2.0;netstandard2.1 + netstandard2.0;netstandard2.1 + true + 2.3.1 + https://github.com/Discord-Net-Labs/Discord.Net-Labs + https://github.com/Discord-Net-Labs/Discord.Net-Labs + Temporary.png + Discord.Net.Labs.WebSocket + + + + + + + + True + + + + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 1f65d0a15c..e3a5104e7c 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -4,13 +4,24 @@ Discord.Net.WebSocket Discord.WebSocket - A core Discord.Net library containing the WebSocket client and models. + A core Discord.Net Labs library containing the WebSocket client and models. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true + 2.3.1 + https://github.com/Discord-Net-Labs/Discord.Net-Labs + https://github.com/Discord-Net-Labs/Discord.Net-Labs + Temporary.png + Discord.Net.Labs.WebSocket + + + True + + + diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 5c5ea4072e..cfbbb797ab 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -1,38 +1,38 @@ - Discord.Net - 2.3.0-dev$suffix$ - Discord.Net + Discord.Net Labs + 2.3.1$suffix$ + Discord.Net Labs Discord.Net Contributors foxbot - An asynchronous API wrapper for Discord. This metapackage includes all of the optional Discord.Net components. + An experimental fork of Discord.NET that adds all the new discord features to play around with! discord;discordapp - https://github.com/RogueException/Discord.Net + https://github.com/Discord-Net-Labs/Discord.Net-Labs http://opensource.org/licenses/MIT false - https://github.com/RogueException/Discord.Net/raw/dev/docs/marketing/logo/PackageLogo.png + https://avatars.githubusercontent.com/u/84047264 - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs index f169fb717b..f0d393af37 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs @@ -73,17 +73,17 @@ public IAsyncEnumerable> GetUsersAsync(CacheMode mode throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs index e662d628ae..4650a67082 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs @@ -81,17 +81,17 @@ public Task LeaveAsync(RequestOptions options = null) throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs index fbaaf9a185..c8c328d667 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs @@ -167,17 +167,17 @@ public Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { throw new NotImplementedException(); } From 9a81f02cdaf7d3eebd317242f045e6f37031a381 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 27 May 2021 08:02:37 -0300 Subject: [PATCH 023/494] Update README.md --- README.md | 102 +++++++++++++++++++++++++----------------------------- 1 file changed, 48 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 9ace4f22e4..6452d54b6c 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,48 @@ -# Discord.Net -[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net) -[![MyGet](https://img.shields.io/myget/discord-net/vpre/Discord.Net.svg)](https://www.myget.org/feed/Packages/discord-net) -[![Build Status](https://dev.azure.com/discord-net/Discord.Net/_apis/build/status/discord-net.Discord.Net?branchName=dev)](https://dev.azure.com/discord-net/Discord.Net/_build/latest?definitionId=1&branchName=dev) -[![Discord](https://discord.com/api/guilds/81384788765712384/widget.png)](https://discord.gg/jkrBmQR) - -An unofficial .NET API Wrapper for the Discord client (https://discord.com). - -Check out the [documentation](https://discord.foxbot.me/) or join the [Discord API Chat](https://discord.gg/jkrBmQR). - -## Installation -### Stable (NuGet) -Our stable builds available from NuGet through the Discord.Net metapackage: -- [Discord.Net](https://www.nuget.org/packages/Discord.Net/) - -The individual components may also be installed from NuGet: -- [Discord.Net.Commands](https://www.nuget.org/packages/Discord.Net.Commands/) -- [Discord.Net.Rest](https://www.nuget.org/packages/Discord.Net.Rest/) -- [Discord.Net.WebSocket](https://www.nuget.org/packages/Discord.Net.WebSocket/) -- [Discord.Net.Webhook](https://www.nuget.org/packages/Discord.Net.Webhook/) - -### Unstable (MyGet) -Nightly builds are available through our MyGet feed (`https://www.myget.org/F/discord-net/api/v3/index.json`). - -## Compiling -In order to compile Discord.Net, you require the following: - -### Using Visual Studio -- [Visual Studio 2017](https://www.microsoft.com/net/core#windowsvs2017) -- [.NET Core SDK](https://www.microsoft.com/net/download/core) - -The .NET Core workload must be selected during Visual Studio installation. - -### Using Command Line -- [.NET Core SDK](https://www.microsoft.com/net/download/core) - -## Known Issues - -### WebSockets (Win7 and earlier) -.NET Core 1.1 does not support WebSockets on Win7 and earlier. This issue has been fixed since the release of .NET Core 2.1. It is recommended to target .NET Core 2.1 or above for your project if you wish to run your bot on legacy platforms; alternatively, you may choose to install the [Discord.Net.Providers.WS4Net](https://www.nuget.org/packages/Discord.Net.Providers.WS4Net/) package. - -## Versioning Guarantees - -This library generally abides by [Semantic Versioning](https://semver.org). Packages are published in MAJOR.MINOR.PATCH version format. - -An increment of the PATCH component always indicates that an internal-only change was made, generally a bugfix. These changes will not affect the public-facing API in any way, and are always guaranteed to be forward- and backwards-compatible with your codebase, any pre-compiled dependencies of your codebase. - -An increment of the MINOR component indicates that some addition was made to the library, and this addition is not backwards-compatible with prior versions. However, Discord.Net **does not guarantee forward-compatibility** on minor additions. In other words, we permit a limited set of breaking changes on a minor version bump. - -Due to the nature of the Discord API, we will oftentimes need to add a property to an entity to support the latest API changes. Discord.Net provides interfaces as a method of consuming entities; and as such, introducing a new field to an entity is technically a breaking change. Major version bumps generally indicate some major change to the library, and as such we are hesitant to bump the major version for every minor addition to the library. To compromise, we have decided that interfaces should be treated as **consumable only**, and your applications should typically not be implementing interfaces. (For applications where interfaces are implemented, such as in test mocks, we apologize for this inconsistency with SemVer). - -Furthermore, while we will never break the API (outside of interface changes) on minor builds, we will occasionally need to break the ABI, by introducing parameters to a method to match changes upstream with Discord. As such, a minor version increment may require you to recompile your code, and dependencies, such as addons, may also need to be recompiled and republished on the newer version. When a binary breaking change is made, the change will be noted in the release notes. - -An increment of the MAJOR component indicates that breaking changes have been made to the library; consumers should check the release notes to determine what changes need to be made. +# Discord.Net Labs +This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs + +## Branches +### Dev +The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch + +### Interactions +This branch is for anything todo with Discord Interactions, such as [Slash commands](https://discord.com/developers/docs/interactions/slash-commands) and [Message Components](https://discord.com/developers/docs/interactions/message-components). This branch is stable enough to use but does not contain all the features of interactions. + +### SlashCommandService +This branch is on pause and does not work currently, Once everything is stable with the Interaction branch we will continue working on a slash command service for it. + +### web/SlashCommandService +webmilio's spin on the SlashCommandService branch, again the state of this is unknown. + + +## Message Components +So, you want to use Message components? Well you're in luck! Below is a quick overview of how to use them + +#### Listening for button presses +```cs +// Subscribe to the InteractionCreated event +client.InteractionCreated += Client_InteractionCreated; + +... +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + // If the type of the interaction is a message component + if(arg.Type == Discord.InteractionType.MessageComponent) + { + // parse the args + var parsedArg = (SocketMessageComponent)arg; + // respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. + await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage); + } +} +``` + +#### Sending messages with buttons +Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: +```cs +var builder = new ComponentBuilder().WithButton("Hello!", ButtonStyle.Primary, customId: "id_1"); +await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); +``` + +## Slash commands +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From 2e9c6df7b5c0e00f82092b208816f4c3e6849030 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 27 May 2021 08:03:11 -0300 Subject: [PATCH 024/494] Update README.md --- README.md | 86 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index dffbdb32cf..6452d54b6c 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,48 @@ # Discord.Net Labs -The development version of [Discord.Net](https://github.com/discord-net/Discord.Net). This version of the README is a placeholder for now. - -## Documentation - -- [Stable](https://discord.foxbot.me/) - - Hosted by @foxbot -- [Nightly](https://docs.stillu.cc/) - - [Latest CI repo](https://github.com/discord-net/docs-static) - -## Compiling -In order to compile Discord.Net Labs, you require the following: - -### Using Visual Studio -- [Visual Studio 2017](https://www.microsoft.com/net/core#windowsvs2017) -- [.NET Core SDK](https://www.microsoft.com/net/download/core) - -The .NET Core workload must be selected during Visual Studio installation. - -### Using Command Line -- [.NET Core SDK](https://www.microsoft.com/net/download/core) - -## Known Issues - -### WebSockets (Win7 and earlier) -.NET Core 1.1 does not support WebSockets on Win7 and earlier. This issue has been fixed since the release of .NET Core 2.1. It is recommended to target .NET Core 2.1 or above for your project if you wish to run your bot on legacy platforms; alternatively, you may choose to install the [Discord.Net.Providers.WS4Net](https://www.nuget.org/packages/Discord.Net.Providers.WS4Net/) package. - -## Versioning Guarantees - -This library generally abides by [Semantic Versioning](https://semver.org). Packages are published in MAJOR.MINOR.PATCH version format. - -An increment of the PATCH component always indicates that an internal-only change was made, generally a bugfix. These changes will not affect the public-facing API in any way, and are always guaranteed to be forward- and backwards-compatible with your codebase, any pre-compiled dependencies of your codebase. - -An increment of the MINOR component indicates that some addition was made to the library, and this addition is not backwards-compatible with prior versions. However, Discord.Net Labs **does not guarantee forward-compatibility** on minor additions. In other words, we permit a limited set of breaking changes on a minor version bump. - -Due to the nature of the Discord API, we will oftentimes need to add a property to an entity to support the latest API changes. Discord.Net provides interfaces as a method of consuming entities; and as such, introducing a new field to an entity is technically a breaking change. Major version bumps generally indicate some major change to the library, and as such we are hesitant to bump the major version for every minor addition to the library. To compromise, we have decided that interfaces should be treated as **consumable only**, and your applications should typically not be implementing interfaces. (For applications where interfaces are implemented, such as in test mocks, we apologize for this inconsistency with SemVer). - -Furthermore, while we will never break the API (outside of interface changes) on minor builds, we will occasionally need to break the ABI, by introducing parameters to a method to match changes upstream with Discord. As such, a minor version increment may require you to recompile your code, and dependencies, such as addons, may also need to be recompiled and republished on the newer version. When a binary breaking change is made, the change will be noted in the release notes. - -An increment of the MAJOR component indicates that breaking changes have been made to the library; consumers should check the release notes to determine what changes need to be made. +This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs + +## Branches +### Dev +The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch + +### Interactions +This branch is for anything todo with Discord Interactions, such as [Slash commands](https://discord.com/developers/docs/interactions/slash-commands) and [Message Components](https://discord.com/developers/docs/interactions/message-components). This branch is stable enough to use but does not contain all the features of interactions. + +### SlashCommandService +This branch is on pause and does not work currently, Once everything is stable with the Interaction branch we will continue working on a slash command service for it. + +### web/SlashCommandService +webmilio's spin on the SlashCommandService branch, again the state of this is unknown. + + +## Message Components +So, you want to use Message components? Well you're in luck! Below is a quick overview of how to use them + +#### Listening for button presses +```cs +// Subscribe to the InteractionCreated event +client.InteractionCreated += Client_InteractionCreated; + +... +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + // If the type of the interaction is a message component + if(arg.Type == Discord.InteractionType.MessageComponent) + { + // parse the args + var parsedArg = (SocketMessageComponent)arg; + // respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. + await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage); + } +} +``` + +#### Sending messages with buttons +Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: +```cs +var builder = new ComponentBuilder().WithButton("Hello!", ButtonStyle.Primary, customId: "id_1"); +await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); +``` + +## Slash commands +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From a75f8a21f1e3618184db618c74d5d37b5cca2547 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 10:33:06 -0300 Subject: [PATCH 025/494] #2 Add check for url button types as well as add static builders --- .../Message Components/ComponentBuilder.cs | 61 ++++++++++++++++++- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index e081bace8f..4a468d68d9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -131,7 +131,7 @@ public string Label get => _label; set { - if(value != null) + if (value != null) if (value.Length > MaxLabelLength) throw new ArgumentException(message: $"Button label must be {MaxLabelLength} characters or less!", paramName: nameof(Label)); @@ -155,11 +155,61 @@ public string CustomId public IEmote Emote { get; set; } public string Url { get; set; } public bool Disabled { get; set; } - + private string _label; private string _customId; + public static ButtonBuilder CreateLinkButton(string label, string url) + { + var builder = new ButtonBuilder() + .WithStyle(ButtonStyle.Link) + .WithUrl(url) + .WithLabel(label); + + return builder; + } + + public static ButtonBuilder CreateDangerButton(string label, string customId) + { + var builder = new ButtonBuilder() + .WithStyle(ButtonStyle.Danger) + .WithCustomId(customId) + .WithLabel(label); + + return builder; + } + + public static ButtonBuilder CreatePrimaryButton(string label, string customId) + { + var builder = new ButtonBuilder() + .WithStyle(ButtonStyle.Primary) + .WithCustomId(customId) + .WithLabel(label); + + return builder; + } + + public static ButtonBuilder CreateSecondaryButton(string label, string customId) + { + var builder = new ButtonBuilder() + .WithStyle(ButtonStyle.Secondary) + .WithCustomId(customId) + .WithLabel(label); + + return builder; + } + + public static ButtonBuilder CreateSuccessButton(string label, string customId) + { + var builder = new ButtonBuilder() + .WithStyle(ButtonStyle.Success) + .WithCustomId(customId) + .WithLabel(label); + + return builder; + } + public ButtonBuilder WithLabel(string label) { this.Label = label; @@ -196,6 +246,11 @@ public ButtonBuilder WithDisabled(bool disabled) } public ButtonComponent Build() - => new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); + { + if (!string.IsNullOrEmpty(this.Url) && !string.IsNullOrEmpty(this.CustomId)) + throw new InvalidOperationException("A button cannot contain a URL and a CustomId"); + + return new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); + } } } From 79a12c4e4e34a28df945f129f697ee090acb9afc Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 27 May 2021 10:56:56 -0300 Subject: [PATCH 026/494] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6452d54b6c..ecc8113425 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # Discord.Net Labs +[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.Core.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs.Core/ "Core") + This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs ## Branches From 4f372cbb9f655c86ba86c5c178ee4a9b43db3662 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 11:17:28 -0300 Subject: [PATCH 027/494] meta: Update command and webhook package --- .../Discord.Net.Commands.csproj | 13 ++++++- .../Discord.Net.Webhook.csproj | 15 ++++++-- src/Discord.Net/Discord.Net.nuspec | 36 +++++++++---------- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index d64678d7c3..592a7f651c 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -4,12 +4,23 @@ Discord.Net.Commands Discord.Commands - A Discord.Net extension adding support for bot commands. + A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 + 2.3.1 + Discord.Net.Labs.Commands + https://github.com/Discord-Net-Labs/Discord.Net-Labs + https://github.com/Discord-Net-Labs/Discord.Net-Labs + Temporary.png + + + True + + + diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 24ae442d70..e5374067ed 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -1,14 +1,25 @@ - + Discord.Net.Webhook Discord.Webhook - A core Discord.Net library containing the Webhook client and models. + A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 + 2.3.1 + Discord.Net.Labs.Webhook + https://github.com/Discord-Net-Labs/Discord.Net-Labs + https://github.com/Discord-Net-Labs/Discord.Net-Labs + Temporary.png + + + True + + + diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index cfbbb797ab..2c2e7b56b8 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -1,12 +1,12 @@ - Discord.Net Labs + Discord.Net.Labs 2.3.1$suffix$ Discord.Net Labs Discord.Net Contributors - foxbot - An experimental fork of Discord.NET that adds all the new discord features to play around with! + quinchs + An experimental fork of Discord.NET that adds all the new discord features to play around with! This metapackage includes all of the optional Discord.Net Labs components. discord;discordapp https://github.com/Discord-Net-Labs/Discord.Net-Labs http://opensource.org/licenses/MIT @@ -14,25 +14,25 @@ https://avatars.githubusercontent.com/u/84047264 - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From db2ead2d78b83d8495071d3381fd6b5d91d80397 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 11:25:30 -0300 Subject: [PATCH 028/494] meta: bump code version --- src/Discord.Net.Core/Discord.Net.Core.csproj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 19b6435f17..9a54654189 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,10 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.1 + 2.3.1-dev Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png + 2.3.1.1 + 2.3.1.1 From 783a2d05fff680a560bee2006e0508c44be1854f Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 27 May 2021 11:26:21 -0300 Subject: [PATCH 029/494] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ecc8113425..8e2b5fe02e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Discord.Net Labs -[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.Core.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs.Core/ "Core") +[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs) This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs From b8ba5b94c85e58bf5ad9afa1fa217fae03d3ae69 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 12:07:52 -0300 Subject: [PATCH 030/494] Added more enforcement checks on builder. Closes #3 --- .../Interactions/Message Components/ComponentBuilder.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 4a468d68d9..147667e72c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -247,9 +247,17 @@ public ButtonBuilder WithDisabled(bool disabled) public ButtonComponent Build() { + if (string.IsNullOrEmpty(this.Label) && this.Emote == null) + throw new ArgumentException("A button must have an Emote or a label!"); + if (!string.IsNullOrEmpty(this.Url) && !string.IsNullOrEmpty(this.CustomId)) throw new InvalidOperationException("A button cannot contain a URL and a CustomId"); + if (this.Style == ButtonStyle.Link && !string.IsNullOrEmpty(this.CustomId)) + this.CustomId = null; + else if (!string.IsNullOrEmpty(this.Url)) + this.Url = null; + return new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); } } From 9eb684a2426fd1d010fac568230f4ecc5aee0525 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 12:09:00 -0300 Subject: [PATCH 031/494] meta: update core version --- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 9a54654189..9b7e7115be 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.1-dev + 2.3.2 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 2.3.1.1 - 2.3.1.1 + 2.3.2 + 2.3.2 From edc0bf35ae5d0f75d7c0d2ca995422b2d47b942b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 12:35:50 -0300 Subject: [PATCH 032/494] Add components to messages --- .../Entities/Messages/IMessage.cs | 4 ++++ src/Discord.Net.Rest/API/Common/Message.cs | 2 ++ .../Entities/Messages/RestMessage.cs | 17 +++++++++++++++-- .../Entities/Messages/SocketMessage.cs | 15 ++++++++++++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index 35458d87dc..d13b6b592b 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -164,6 +164,10 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// IReadOnlyDictionary Reactions { get; } + /// + /// The 's attached to this message + /// + IReadOnlyCollection Components { get; } /// /// Adds a reaction to this message. /// diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index b781de3460..c3d88eedb6 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -58,5 +58,7 @@ internal class Message public Optional AllowedMentions { get; set; } [JsonProperty("referenced_message")] public Optional ReferencedMessage { get; set; } + [JsonProperty("components")] + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 0169c9b8bb..068ed15115 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -68,6 +68,9 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable /// public MessageReference Reference { get; private set; } + /// + public IReadOnlyCollection Components { get; private set; } + internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source) : base(discord, id) { @@ -113,7 +116,7 @@ internal virtual void Update(Model model) }; } - if(model.Reference.IsSpecified) + if (model.Reference.IsSpecified) { // Creates a new Reference from the API model Reference = new MessageReference @@ -124,6 +127,15 @@ internal virtual void Update(Model model) }; } + if (model.Components.IsSpecified) + { + Components = model.Components.Value.Select(x => + (x as Newtonsoft.Json.Linq.JToken).ToObject() + ).ToList(); + } + else + Components = new List(); + if (model.Reactions.IsSpecified) { var value = model.Reactions.Value; @@ -168,7 +180,8 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.Embeds => Embeds; /// IReadOnlyCollection IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); - + /// + IReadOnlyCollection IMessage.Components => Components; /// public IReadOnlyDictionary Reactions => _reactions.ToDictionary(x => x.Emote, x => new ReactionMetadata { ReactionCount = x.Count, IsMe = x.Me }); diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 98fd4af079..5df2d1acb0 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -58,6 +58,9 @@ public abstract class SocketMessage : SocketEntity, IMessage /// public MessageReference Reference { get; private set; } + /// + public IReadOnlyCollection Components { get; private set; } + /// /// Returns all attachments included in this message. /// @@ -156,6 +159,15 @@ internal virtual void Update(ClientState state, Model model) MessageId = model.Reference.Value.MessageId }; } + + if (model.Components.IsSpecified) + { + Components = model.Components.Value.Select(x => + (x as Newtonsoft.Json.Linq.JToken).ToObject() + ).ToList(); + } + else + Components = new List(); } /// @@ -188,7 +200,8 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.MentionedRoleIds => MentionedRoles.Select(x => x.Id).ToImmutableArray(); /// IReadOnlyCollection IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); - + /// + IReadOnlyCollection IMessage.Components => Components; internal void AddReaction(SocketReaction reaction) { _reactions.Add(reaction); From 814dd777e71c4a34ba5c716631396d3b2ec3f147 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 27 May 2021 12:38:56 -0300 Subject: [PATCH 033/494] meta: bump core, rest, and websocket version --- src/Discord.Net.Core/Discord.Net.Core.csproj | 4 ++-- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 9b7e7115be..b164aad27c 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.2 + 2.3.3 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 457b7c6890..66a25c9180 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.1 + 2.3.2 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index e3a5104e7c..de066aefe3 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.1 + 2.3.2 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png From 01594cf989d2311eaf8b7a86ba1201955cb9c9a9 Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Thu, 27 May 2021 15:45:17 -0500 Subject: [PATCH 034/494] Fix check of content length in CreateInteractionResponse() --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 171a0eaf0d..da34108072 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -944,7 +944,7 @@ public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong comman public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { if(response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) - Preconditions.AtMost(response.Data.Value.Content.Value.Length, 2000, nameof(response.Data.Value.Content)); + Preconditions.AtMost(response.Data.Value.Content.Value?.Length ?? 0, 2000, nameof(response.Data.Value.Content)); options = RequestOptions.CreateOrClone(options); From f506b9878043aa7396a07d30ff46034420656049 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 05:07:36 -0300 Subject: [PATCH 035/494] Closes #6. Closes #4. Fix emote parsing, added components to socket and rest messages. --- .../Message Components/ActionRowComponent.cs | 6 +- .../Message Components/ButtonComponent.cs | 9 +-- .../Message Components/ComponentBuilder.cs | 20 ++++-- .../Message Components/MessageComponent.cs | 5 +- .../API/Common/ActionRowComponent.cs | 25 ++++++++ .../API/Common/ButtonComponent.cs | 64 +++++++++++++++++++ ...teractionApplicationCommandCallbackData.cs | 2 +- src/Discord.Net.Rest/API/Common/Message.cs | 2 +- .../API/Rest/CreateMessageParams.cs | 2 +- .../API/Rest/CreateWebhookMessageParams.cs | 2 +- .../API/Rest/UploadFileParams.cs | 2 +- .../Entities/Channels/ChannelHelper.cs | 4 +- .../Entities/Messages/RestMessage.cs | 13 +++- .../SocketMessageComponent.cs | 4 +- .../Slash Commands/SocketSlashCommand.cs | 4 +- .../Entities/Messages/SocketMessage.cs | 13 +++- 16 files changed, 139 insertions(+), 38 deletions(-) create mode 100644 src/Discord.Net.Rest/API/Common/ActionRowComponent.cs create mode 100644 src/Discord.Net.Rest/API/Common/ButtonComponent.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index 7151cc5af3..fb6168218c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -9,14 +9,12 @@ namespace Discord { public class ActionRowComponent : IMessageComponent { - [JsonProperty("type")] public ComponentType Type { get; } = ComponentType.ActionRow; - [JsonProperty("components")] - public IReadOnlyCollection Components { get; internal set; } + public IReadOnlyCollection Components { get; internal set; } internal ActionRowComponent() { } - internal ActionRowComponent(IReadOnlyCollection components) + internal ActionRowComponent(List components) { this.Components = components; } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index 2e2b98f98b..973e24da54 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -9,25 +9,18 @@ namespace Discord { public class ButtonComponent : IMessageComponent { - [JsonProperty("type")] public ComponentType Type { get; } = ComponentType.Button; - [JsonProperty("style")] public ButtonStyle Style { get; } - [JsonProperty("label")] public string Label { get; } - [JsonProperty("emoji")] public IEmote Emote { get; } - [JsonProperty("custom_id")] public string CustomId { get; } - [JsonProperty("url")] public string Url { get; } - [JsonProperty("disabled")] public bool Disabled { get; } internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) @@ -39,5 +32,7 @@ internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string c this.Url = url; this.Disabled = disabled; } + + } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 147667e72c..e4937a795f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -87,7 +87,7 @@ public MessageComponent Build() public class ActionRowBuilder { public const int MaxChildCount = 5; - public List Components + public List Components { get => _components; set @@ -99,18 +99,18 @@ public List Components } } - private List _components { get; set; } + private List _components { get; set; } - public ActionRowBuilder WithComponents(List components) + public ActionRowBuilder WithComponents(List components) { this.Components = components; return this; } - public ActionRowBuilder WithComponent(IMessageComponent component) + public ActionRowBuilder WithComponent(ButtonComponent component) { if (this.Components == null) - this.Components = new List(); + this.Components = new List(); this.Components.Add(component); @@ -118,7 +118,15 @@ public ActionRowBuilder WithComponent(IMessageComponent component) } public ActionRowComponent Build() - => new ActionRowComponent(this._components); + { + if (this.Components == null) + throw new ArgumentNullException($"{nameof(Components)} cannot be null!"); + + if (this.Components.Count == 0) + throw new ArgumentException("There must be at least 1 component in a row"); + + return new ActionRowComponent(this._components); + } } public class ButtonBuilder diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs index 1ee8dd953b..7356b8c5b1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -8,7 +8,7 @@ namespace Discord { public class MessageComponent { - public IReadOnlyCollection Components { get; } + public IReadOnlyCollection Components { get; } internal MessageComponent(List components) { @@ -17,8 +17,5 @@ internal MessageComponent(List components) internal static MessageComponent Empty => new MessageComponent(new List()); - - internal IMessageComponent[] ToModel() - => this.Components.ToArray(); } } diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs new file mode 100644 index 0000000000..7fddac1cf5 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ActionRowComponent + { + [JsonProperty("type")] + public ComponentType Type { get; set; } + + [JsonProperty("components")] + public List Components { get; set; } + + internal ActionRowComponent() { } + internal ActionRowComponent(Discord.ActionRowComponent c) + { + this.Type = c.Type; + this.Components = c.Components?.Select(x => new ButtonComponent(x)).ToList(); + } + } +} diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs new file mode 100644 index 0000000000..3c8fcca8ca --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -0,0 +1,64 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ButtonComponent + { + [JsonProperty("type")] + public ComponentType Type { get; set; } + + [JsonProperty("style")] + public ButtonStyle Style { get; set; } + + [JsonProperty("label")] + public string Label { get; set; } + + [JsonProperty("emoji")] + public Emoji Emote { get; set; } + + [JsonProperty("custom_id")] + public string CustomId { get; set; } + + [JsonProperty("url")] + public string Url { get; set; } + + [JsonProperty("disabled")] + public bool Disabled { get; set; } + + + public ButtonComponent() { } + + public ButtonComponent(Discord.ButtonComponent c) + { + this.Type = c.Type; + this.Style = c.Style; + this.Label = c.Label; + this.CustomId = c.CustomId; + this.Url = c.Url; + this.Disabled = c.Disabled; + + if (c.Emote is Emote e) + { + this.Emote = new Emoji() + { + Name = e.Name, + Animated = e.Animated, + Id = e.Id, + }; + } + else + { + this.Emote = new Emoji() + { + Name = c.Emote.Name + }; + } + + } + } +} diff --git a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs index f5ce752508..3f7cf93e00 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs @@ -26,7 +26,7 @@ internal class InteractionApplicationCommandCallbackData public Optional Flags { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } public InteractionApplicationCommandCallbackData() { } public InteractionApplicationCommandCallbackData(string text) diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index c3d88eedb6..4ce8956eb9 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -59,6 +59,6 @@ internal class Message [JsonProperty("referenced_message")] public Optional ReferencedMessage { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs index 7031013134..0d6710a036 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs @@ -25,7 +25,7 @@ internal class CreateMessageParams public Optional MessageReference { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } public CreateMessageParams(string content) { Content = content; diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index c668ee484c..528bf8e077 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -31,7 +31,7 @@ internal class CreateWebhookMessageParams public Optional Flags { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } public CreateWebhookMessageParams(string content) { diff --git a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs index 3b78489aab..27336a11a6 100644 --- a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs +++ b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs @@ -21,7 +21,7 @@ internal class UploadFileParams public Optional Embed { get; set; } public Optional AllowedMentions { get; set; } public Optional MessageReference { get; set; } - public Optional MessageComponent { get; set; } + public Optional MessageComponent { get; set; } public bool IsSpoiler { get; set; } = false; public UploadFileParams(Stream file) diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 69fcd2cb48..894b820c86 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -221,7 +221,7 @@ public static async Task SendMessageAsync(IMessageChannel chann } } - var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.ToModel() }; + var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; var model = await client.ApiClient.CreateMessageAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } @@ -281,7 +281,7 @@ public static async Task SendFileAsync(IMessageChannel channel, } } - var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embed = embed?.ToModel() ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.ToModel() ?? Optional.Unspecified, IsSpoiler = isSpoiler }; + var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embed = embed?.ToModel() ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, IsSpoiler = isSpoiler }; var model = await client.ApiClient.UploadFileAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 068ed15115..1a568992bf 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -129,9 +129,16 @@ internal virtual void Update(Model model) if (model.Components.IsSpecified) { - Components = model.Components.Value.Select(x => - (x as Newtonsoft.Json.Linq.JToken).ToObject() - ).ToList(); + Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(x => + new ButtonComponent( + x.Style, + x.Label, + x.Emote.Id.HasValue ? new Emote(x.Emote.Id.Value, x.Emote.Name, x.Emote.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Name), + x.CustomId, + x.Url, + x.Disabled) + ).ToList() + )).ToList(); } else Components = new List(); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index a05fae3cc0..7d5ddfb170 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -94,7 +94,7 @@ public override async Task RespondAsync(string text = null, boo ? new API.Embed[] { embed.ToModel() } : Optional.Unspecified, TTS = isTTS, - Components = component?.ToModel() ?? Optional.Unspecified + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified } }; @@ -134,7 +134,7 @@ public override async Task FollowupAsync(string text = null Embeds = embed != null ? new API.Embed[] { embed.ToModel() } : Optional.Unspecified, - Components = component?.ToModel() ?? Optional.Unspecified + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; if (ephemeral) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index da94c46256..9010d1eeac 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -110,7 +110,7 @@ public override async Task RespondAsync(string text = null, boo ? new API.Embed[] { embed.ToModel() } : Optional.Unspecified, TTS = isTTS, - Components = component?.ToModel() ?? Optional.Unspecified + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified } }; @@ -149,7 +149,7 @@ public override async Task FollowupAsync(string text = null Embeds = embed != null ? new API.Embed[] { embed.ToModel() } : Optional.Unspecified, - Components = component?.ToModel() ?? Optional.Unspecified + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; if (ephemeral) diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 5df2d1acb0..e6052c1798 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -162,9 +162,16 @@ internal virtual void Update(ClientState state, Model model) if (model.Components.IsSpecified) { - Components = model.Components.Value.Select(x => - (x as Newtonsoft.Json.Linq.JToken).ToObject() - ).ToList(); + Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(x => + new ButtonComponent( + x.Style, + x.Label, + x.Emote.Id.HasValue ? new Emote(x.Emote.Id.Value, x.Emote.Name, x.Emote.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Name), + x.CustomId, + x.Url, + x.Disabled) + ).ToList() + )).ToList(); } else Components = new List(); From 18d93a2192ff7f00b9053d049f1e355025884730 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 05:50:26 -0300 Subject: [PATCH 036/494] Closes #5. Added message components to ModifyMessageArgs, abstracted SocketInteraction for #8 --- .../Entities/Messages/MessageProperties.cs | 5 ++ .../API/Rest/ModifyMessageParams.cs | 4 +- .../Entities/Messages/MessageHelper.cs | 3 +- .../API/Gateway/InteractionCreated.cs | 16 +++++-- .../DiscordSocketClient.cs | 31 +++++++----- .../SocketMessageComponent.cs | 21 ++++++++ .../Slash Commands/SocketSlashCommand.cs | 4 +- .../Slash Commands/SocketSlashCommandData.cs | 12 ++--- .../SocketSlashCommandDataOption.cs | 12 ++--- .../Entities/Interaction/SocketInteraction.cs | 48 ++++++++++++------- 10 files changed, 104 insertions(+), 52 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs index b632d6a180..1e4846a947 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs @@ -21,5 +21,10 @@ public class MessageProperties /// Gets or sets the embed the message should display. /// public Optional Embed { get; set; } + + /// + /// Gets or sets the components for this message. + /// + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs index fdff4de153..195525afce 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs @@ -1,4 +1,4 @@ -#pragma warning disable CS1591 +#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest @@ -10,5 +10,7 @@ internal class ModifyMessageParams public Optional Content { get; set; } [JsonProperty("embed")] public Optional Embed { get; set; } + [JsonProperty("components")] + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index b86a5dbf3a..b66ac1a019 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -41,7 +41,8 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie var apiArgs = new API.Rest.ModifyMessageParams { Content = args.Content, - Embed = args.Embed.IsSpecified ? args.Embed.Value.ToModel() : Optional.Create() + Embed = args.Embed.IsSpecified ? args.Embed.Value.ToModel() : Optional.Create(), + Components = args?.Components.GetValueOrDefault()?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; return await client.ApiClient.ModifyMessageAsync(msg.Channel.Id, msg.Id, apiArgs, options).ConfigureAwait(false); } diff --git a/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs b/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs index 8c451a552b..6e9ebb4fbd 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs @@ -13,6 +13,9 @@ internal class InteractionCreated [JsonProperty("id")] public ulong Id { get; set; } + [JsonProperty("application_id")] + public ulong ApplicationId { get; set; } + [JsonProperty("type")] public InteractionType Type { get; set; } @@ -20,18 +23,25 @@ internal class InteractionCreated public Optional Data { get; set; } [JsonProperty("guild_id")] - public ulong GuildId { get; set; } + public Optional GuildId { get; set; } [JsonProperty("channel_id")] - public ulong ChannelId { get; set; } + public Optional ChannelId { get; set; } [JsonProperty("member")] - public GuildMember Member { get; set; } + public Optional Member { get; set; } + + [JsonProperty("user")] + public Optional User { get; set; } [JsonProperty("token")] public string Token { get; set; } [JsonProperty("version")] public int Version { get; set; } + + [JsonProperty("message")] + public Optional Message { get; set; } + } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 115367e6f0..df8e796386 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1785,26 +1785,33 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - if (State.GetChannel(data.ChannelId) is SocketGuildChannel channel) + if (data.Member.IsSpecified && data.ChannelId.IsSpecified) { - var guild = channel.Guild; - if (!guild.IsSynced) + if (State.GetChannel(data.ChannelId.Value) is SocketGuildChannel channel) { - await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); - return; - } + var guild = channel.Guild; + if (!guild.IsSynced) + { + await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + return; + } - var interaction = SocketInteraction.Create(this, data); + var interaction = SocketInteraction.Create(this, data); - if (this.AlwaysAcknowledgeInteractions) - await interaction.AcknowledgeAsync().ConfigureAwait(false); + if (this.AlwaysAcknowledgeInteractions) + await interaction.AcknowledgeAsync().ConfigureAwait(false); - await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); + await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); + } + else + { + await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false); + return; + } } else { - await UnknownChannelAsync(type, data.ChannelId).ConfigureAwait(false); - return; + // DM TODO } } break; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 7d5ddfb170..6e97f9edd5 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -14,6 +14,8 @@ public class SocketMessageComponent : SocketInteraction { new public SocketMessageComponentData Data { get; } + public SocketMessage Message { get; private set; } + internal SocketMessageComponent(DiscordSocketClient client, Model model) : base(client, model.Id) { @@ -22,6 +24,8 @@ internal SocketMessageComponent(DiscordSocketClient client, Model model) : null; this.Data = new SocketMessageComponentData(dataModel); + + } new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model) @@ -31,6 +35,23 @@ internal SocketMessageComponent(DiscordSocketClient client, Model model) return entity; } + internal override void Update(Model model) + { + base.Update(model); + + if (model.Message.IsSpecified) + { + if (this.Message == null) + { + this.Message = SocketMessage.Create(this.Discord, this.Discord.State, this.User, this.Channel, model.Message.Value); + } + else + { + this.Message.Update(this.Discord.State, model.Message.Value); + } + } + } + /// /// Responds to an Interaction. /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 9010d1eeac..644b7c3fcd 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -24,7 +24,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model) (model.Data.Value as JToken).ToObject() : null; - Data = SocketSlashCommandData.Create(client, dataModel, model.GuildId); + Data = SocketSlashCommandData.Create(client, dataModel, model.Id); } new internal static SocketInteraction Create(DiscordSocketClient client, Model model) @@ -40,7 +40,7 @@ internal override void Update(Model model) (model.Data.Value as JToken).ToObject() : null; - this.Data.Update(data, this.Guild.Id); + this.Data.Update(data); base.Update(model); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 098d81b865..79a2cfd539 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -18,27 +18,23 @@ public class SocketSlashCommandData : SocketEntity, IApplicationCommandIn /// public IReadOnlyCollection Options { get; private set; } - private ulong guildId; - internal SocketSlashCommandData(DiscordSocketClient client, ulong id) : base(client, id) { } - internal static SocketSlashCommandData Create(DiscordSocketClient client, Model model, ulong guildId) + internal static SocketSlashCommandData Create(DiscordSocketClient client, Model model, ulong id) { var entity = new SocketSlashCommandData(client, model.Id); - entity.Update(model, guildId); + entity.Update(model); return entity; } - internal void Update(Model model, ulong guildId) + internal void Update(Model model) { this.Name = model.Name; - this.guildId = guildId; - this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, this.Discord, guildId)).ToImmutableArray() + ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, this.Discord)).ToImmutableArray() : null; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index 89f1443bee..691d8951cf 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -25,18 +25,16 @@ public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOp public IReadOnlyCollection Options { get; private set; } private DiscordSocketClient discord; - private ulong guild; internal SocketSlashCommandDataOption() { } - internal SocketSlashCommandDataOption(Model model, DiscordSocketClient discord, ulong guild) + internal SocketSlashCommandDataOption(Model model, DiscordSocketClient discord) { this.Name = model.Name; this.Value = model.Value.IsSpecified ? model.Value.Value : null; this.discord = discord; - this.guild = guild; this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, discord, guild)).ToImmutableArray() + ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, discord)).ToImmutableArray() : null; } @@ -52,7 +50,7 @@ public static explicit operator SocketGuildChannel(SocketSlashCommandDataOption { if (option.Value is ulong id) { - var guild = option.discord.GetGuild(option.guild); + var guild = option.discord.GetGuild(id); if (guild == null) return null; @@ -67,7 +65,7 @@ public static explicit operator SocketRole(SocketSlashCommandDataOption option) { if (option.Value is ulong id) { - var guild = option.discord.GetGuild(option.guild); + var guild = option.discord.GetGuild(id); if (guild == null) return null; @@ -82,7 +80,7 @@ public static explicit operator SocketGuildUser(SocketSlashCommandDataOption opt { if(option.Value is ulong id) { - var guild = option.discord.GetGuild(option.guild); + var guild = option.discord.GetGuild(id); if (guild == null) return null; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 96f0bca109..62f0debefc 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -14,21 +14,14 @@ namespace Discord.WebSocket public abstract class SocketInteraction : SocketEntity, IDiscordInteraction { /// - /// The this interaction was used in. + /// The this interaction was used in. /// - public SocketGuild Guild - => Discord.GetGuild(GuildId); + public ISocketMessageChannel Channel { get; private set; } /// - /// The this interaction was used in. + /// The who triggered this interaction. /// - public SocketTextChannel Channel - => Guild.GetTextChannel(ChannelId); - - /// - /// The who triggered this interaction. - /// - public SocketGuildUser User { get; private set; } + public SocketUser User { get; private set; } /// /// The type of this interaction. @@ -58,9 +51,8 @@ public SocketTextChannel Channel public bool IsValidToken => CheckToken(); - private ulong GuildId { get; set; } - private ulong ChannelId { get; set; } - private ulong UserId { get; set; } + private ulong? GuildId { get; set; } + private ulong? ChannelId { get; set; } internal SocketInteraction(DiscordSocketClient client, ulong id) : base(client, id) @@ -83,15 +75,35 @@ internal virtual void Update(Model model) ? model.Data.Value : null; - this.GuildId = model.GuildId; - this.ChannelId = model.ChannelId; + this.GuildId = model.GuildId.ToNullable(); + this.ChannelId = model.ChannelId.ToNullable(); this.Token = model.Token; this.Version = model.Version; - this.UserId = model.Member.User.Id; this.Type = model.Type; if (this.User == null) - this.User = SocketGuildUser.Create(this.Guild, Discord.State, model.Member); // Change from getter. + { + if (model.Member.IsSpecified && model.GuildId.IsSpecified) + { + this.User = SocketGuildUser.Create(Discord.State.GetGuild(this.GuildId.Value), Discord.State, model.Member.Value); + } + else + { + this.User = SocketGlobalUser.Create(this.Discord, this.Discord.State, model.User.Value); + } + } + + if (this.Channel == null) + { + if (model.ChannelId.IsSpecified) + { + this.Channel = Discord.State.GetChannel(model.ChannelId.Value) as ISocketMessageChannel; + } + else + { + this.Channel = Discord.State.GetDMChannel(this.User.Id); + } + } } /// From a5d2b33bcc6caa1c2a0bb61a49b02e8a93d12132 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 05:56:25 -0300 Subject: [PATCH 037/494] meta: bump versions --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index b164aad27c..346c49f2f3 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.3 + 2.3.4 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 66a25c9180..562cb2d74f 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.2 + 2.3.3 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index de066aefe3..a218ca36a8 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.2 + 2.3.3 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png From 6203c48c11be56bdb1acf2a20c41e96d89fa6e0a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 06:47:10 -0300 Subject: [PATCH 038/494] Added documentation for all the new classes --- .../Message Components/ActionRowComponent.cs | 7 + .../Message Components/ButtonComponent.cs | 25 +++ .../Message Components/ComponentBuilder.cs | 161 +++++++++++++++++- .../Message Components/MessageComponent.cs | 9 + .../SocketMessageComponent.cs | 10 +- .../SocketMessageComponentData.cs | 3 + 6 files changed, 213 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index fb6168218c..c29ef44a25 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -7,10 +7,17 @@ namespace Discord { + /// + /// Represents a Row for child components to live in. + /// public class ActionRowComponent : IMessageComponent { + /// public ComponentType Type { get; } = ComponentType.ActionRow; + /// + /// The child components in this row. + /// public IReadOnlyCollection Components { get; internal set; } internal ActionRowComponent() { } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index 973e24da54..aede746878 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -7,20 +7,45 @@ namespace Discord { + /// + /// Represents a Button. + /// public class ButtonComponent : IMessageComponent { + /// public ComponentType Type { get; } = ComponentType.Button; + /// + /// The of this button, example buttons with each style can be found Here. + /// public ButtonStyle Style { get; } + /// + /// The label of the button, this is the text that is shown. + /// public string Label { get; } + /// + /// A that will be displayed with this button. + /// public IEmote Emote { get; } + /// + /// A unique id that will be sent with a . This is how you know what button was pressed. + /// public string CustomId { get; } + /// + /// A URL for a button. + /// + /// + /// You cannot have a button with a URL and a CustomId. + /// public string Url { get; } + /// + /// Whether this button is disabled or not. + /// public bool Disabled { get; } internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index e4937a795f..532e0b2e51 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -6,10 +6,19 @@ namespace Discord { + /// + /// Represents a builder for creating a . + /// public class ComponentBuilder { + /// + /// The max amount of rows a message can have. + /// public const int MaxActionRowCount = 5; + /// + /// Gets or sets the Action Rows for this Component Builder. + /// public List ActionRows { get => _actionRows; @@ -25,11 +34,22 @@ public List ActionRows private List _actionRows { get; set; } + /// + /// Adds a button to the specified row. + /// + /// The label text for the newly added button. + /// The style of this newly added button. + /// A to be used with this button. + /// The custom id of the newly added button. + /// A URL to be used only if the is a Link. + /// Whether or not the newly created button is disabled. + /// The row the button should be placed on. + /// The current builder. public ComponentBuilder WithButton( string label, + string customId, ButtonStyle style = ButtonStyle.Primary, IEmote emote = null, - string customId = null, string url = null, bool disabled = false, int row = 0) @@ -45,9 +65,20 @@ public ComponentBuilder WithButton( return this.WithButton(button, row); } + /// + /// Adds a button to the first row. + /// + /// The button to add to the first row. + /// The current builder. public ComponentBuilder WithButton(ButtonBuilder button) => this.WithButton(button, 0); + /// + /// Adds a button to the specified row. + /// + /// The button to add. + /// The row to add the button. + /// The current builder. public ComponentBuilder WithButton(ButtonBuilder button, int row) { var builtButton = button.Build(); @@ -75,6 +106,10 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row) return this; } + /// + /// Builds this builder into a used to send your components. + /// + /// A that can be sent with public MessageComponent Build() { if (this._actionRows != null) @@ -84,9 +119,19 @@ public MessageComponent Build() } } + /// + /// Represents a class used to build Action rows. + /// public class ActionRowBuilder { + /// + /// The max amount of child components this row can hold. + /// public const int MaxChildCount = 5; + + /// + /// Gets or sets the components inside this row. + /// public List Components { get => _components; @@ -101,12 +146,22 @@ public List Components private List _components { get; set; } + /// + /// Adds a list of components to the current row. + /// + /// The list of components to add. + /// The current builder. public ActionRowBuilder WithComponents(List components) { this.Components = components; return this; } + /// + /// Adds a component at the end of the current row. + /// + /// The component to add. + /// The current builder. public ActionRowBuilder WithComponent(ButtonComponent component) { if (this.Components == null) @@ -117,6 +172,12 @@ public ActionRowBuilder WithComponent(ButtonComponent component) return this; } + /// + /// Builds the current builder to a that can be used within a + /// + /// A that can be used within a + /// cannot be null. + /// There must be at least 1 component in a row. public ActionRowComponent Build() { if (this.Components == null) @@ -129,11 +190,24 @@ public ActionRowComponent Build() } } + /// + /// Represents a class used to build 's. + /// public class ButtonBuilder { + /// + /// The max length of a . + /// public const int MaxLabelLength = 80; + + /// + /// The max length of a . + /// public const int MaxCustomIdLength = 100; + /// + /// Gets or sets the label of the current button. + /// public string Label { get => _label; @@ -147,6 +221,9 @@ public string Label } } + /// + /// Gets or sets the custom id of the current button. + /// public string CustomId { get => _customId; @@ -159,15 +236,36 @@ public string CustomId } } + /// + /// Gets or sets the of the current button. + /// public ButtonStyle Style { get; set; } + + /// + /// Gets or sets the of the current button. + /// public IEmote Emote { get; set; } + + /// + /// Gets or sets the url of the current button. + /// public string Url { get; set; } + + /// + /// Gets or sets whether the current button is disabled. + /// public bool Disabled { get; set; } private string _label; private string _customId; + /// + /// Creates a button with the style. + /// + /// The label to use on the newly created link button. + /// The url for this link button to go to. + /// A builder with the newly created button. public static ButtonBuilder CreateLinkButton(string label, string url) { var builder = new ButtonBuilder() @@ -178,6 +276,12 @@ public static ButtonBuilder CreateLinkButton(string label, string url) return builder; } + /// + /// Creates a button with the style. + /// + /// The label for this danger button. + /// The custom id for this danger button. + /// A builder with the newly created button. public static ButtonBuilder CreateDangerButton(string label, string customId) { var builder = new ButtonBuilder() @@ -188,6 +292,12 @@ public static ButtonBuilder CreateDangerButton(string label, string customId) return builder; } + /// + /// Creates a button with the style. + /// + /// The label for this primary button. + /// The custom id for this primary button. + /// A builder with the newly created button. public static ButtonBuilder CreatePrimaryButton(string label, string customId) { var builder = new ButtonBuilder() @@ -198,6 +308,12 @@ public static ButtonBuilder CreatePrimaryButton(string label, string customId) return builder; } + /// + /// Creates a button with the style. + /// + /// The label for this secondary button. + /// The custom id for this secondary button. + /// A builder with the newly created button. public static ButtonBuilder CreateSecondaryButton(string label, string customId) { var builder = new ButtonBuilder() @@ -208,6 +324,12 @@ public static ButtonBuilder CreateSecondaryButton(string label, string customId) return builder; } + /// + /// Creates a button with the style. + /// + /// The label for this success button. + /// The custom id for this success button. + /// A builder with the newly created button. public static ButtonBuilder CreateSuccessButton(string label, string customId) { var builder = new ButtonBuilder() @@ -218,41 +340,78 @@ public static ButtonBuilder CreateSuccessButton(string label, string customId) return builder; } + /// + /// Sets the current buttons label to the specified text. + /// + /// The text for the label + /// The current builder. public ButtonBuilder WithLabel(string label) { this.Label = label; return this; } + /// + /// Sets the current buttons style. + /// + /// The style for this builders button. + /// The current builder. public ButtonBuilder WithStyle(ButtonStyle style) { this.Style = style; return this; } + /// + /// Sets the current buttons emote. + /// + /// The emote to use for the current button. + /// The current builder. public ButtonBuilder WithEmote(IEmote emote) { this.Emote = emote; return this; } + /// + /// Sets the current buttons url. + /// + /// The url to use for the current button. + /// The current builder. public ButtonBuilder WithUrl(string url) { this.Url = url; return this; } + /// + /// Sets the custom id of the current button. + /// + /// The id to use for the current button. + /// The current builder. public ButtonBuilder WithCustomId(string id) { this.CustomId = id; return this; } + + /// + /// Sets whether the current button is disabled. + /// + /// Whether the current button is disabled or not. + /// The current builder. public ButtonBuilder WithDisabled(bool disabled) { this.Disabled = disabled; return this; } + /// + /// Builds this builder into a to be used in a . + /// + /// A to be used in a . + /// A button cannot contain a URL and a CustomId. + /// A button must have an Emote or a label. public ButtonComponent Build() { if (string.IsNullOrEmpty(this.Label) && this.Emote == null) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs index 7356b8c5b1..82df2550e3 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -6,8 +6,14 @@ namespace Discord { + /// + /// Represents a component object used to send components with messages. + /// public class MessageComponent { + /// + /// The components to be used in a message. + /// public IReadOnlyCollection Components { get; } internal MessageComponent(List components) @@ -15,6 +21,9 @@ internal MessageComponent(List components) this.Components = components; } + /// + /// Returns a empty . + /// internal static MessageComponent Empty => new MessageComponent(new List()); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 6e97f9edd5..0b077fda50 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -10,10 +10,19 @@ namespace Discord.WebSocket { + /// + /// Represents a Websocket-based interaction type for Message Components. + /// public class SocketMessageComponent : SocketInteraction { + /// + /// The data received with this interaction, contains the button that was clicked. + /// new public SocketMessageComponentData Data { get; } + /// + /// The message that contained the trigger for this interaction. + /// public SocketMessage Message { get; private set; } internal SocketMessageComponent(DiscordSocketClient client, Model model) @@ -72,7 +81,6 @@ internal override void Update(Model model) /// /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs index fad959e1de..8477432c79 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs @@ -7,6 +7,9 @@ namespace Discord.WebSocket { + /// + /// Represents the data sent with a . + /// public class SocketMessageComponentData { /// From 31278377cd572588d48a7e26debf220ac07db0cc Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 07:28:12 -0300 Subject: [PATCH 039/494] Fix null ex --- .../API/Common/ButtonComponent.cs | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index 3c8fcca8ca..dd10bcd44f 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -42,23 +42,25 @@ public ButtonComponent(Discord.ButtonComponent c) this.Url = c.Url; this.Disabled = c.Disabled; - if (c.Emote is Emote e) + if (c.Emote != null) { - this.Emote = new Emoji() + if (c.Emote is Emote e) { - Name = e.Name, - Animated = e.Animated, - Id = e.Id, - }; - } - else - { - this.Emote = new Emoji() + this.Emote = new Emoji() + { + Name = e.Name, + Animated = e.Animated, + Id = e.Id, + }; + } + else { - Name = c.Emote.Name - }; - } - + this.Emote = new Emoji() + { + Name = c.Emote.Name + }; + } + } } } } From dbc13d58b6db0b58cece228c0e63dc3811523b8d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 07:48:50 -0300 Subject: [PATCH 040/494] Fix null ref for emotes --- .../API/Common/ButtonComponent.cs | 10 +++++----- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- .../Entities/Messages/RestMessage.cs | 10 +++++----- .../Entities/Messages/SocketMessage.cs | 12 +++++------ src/Discord.Net/Discord.Net.nuspec | 20 +++++++++---------- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index dd10bcd44f..775f781015 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -16,19 +16,19 @@ internal class ButtonComponent public ButtonStyle Style { get; set; } [JsonProperty("label")] - public string Label { get; set; } + public Optional Label { get; set; } [JsonProperty("emoji")] - public Emoji Emote { get; set; } + public Optional Emote { get; set; } [JsonProperty("custom_id")] - public string CustomId { get; set; } + public Optional CustomId { get; set; } [JsonProperty("url")] - public string Url { get; set; } + public Optional Url { get; set; } [JsonProperty("disabled")] - public bool Disabled { get; set; } + public Optional Disabled { get; set; } public ButtonComponent() { } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 562cb2d74f..770ef3bdc4 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.3 + 2.3.4 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 1a568992bf..90bdc8636f 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -132,11 +132,11 @@ internal virtual void Update(Model model) Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(x => new ButtonComponent( x.Style, - x.Label, - x.Emote.Id.HasValue ? new Emote(x.Emote.Id.Value, x.Emote.Name, x.Emote.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Name), - x.CustomId, - x.Url, - x.Disabled) + x.Label.GetValueOrDefault(), + x.Emote.IsSpecified ? x.Emote.Value.Id.HasValue ? new Emote(x.Emote.Value.Id.Value, x.Emote.Value.Name, x.Emote.Value.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Value.Name) : null, + x.CustomId.GetValueOrDefault(), + x.Url.GetValueOrDefault(), + x.Disabled.GetValueOrDefault()) ).ToList() )).ToList(); } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index e6052c1798..e201d3e975 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -163,13 +163,13 @@ internal virtual void Update(ClientState state, Model model) if (model.Components.IsSpecified) { Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(x => - new ButtonComponent( + new ButtonComponent( x.Style, - x.Label, - x.Emote.Id.HasValue ? new Emote(x.Emote.Id.Value, x.Emote.Name, x.Emote.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Name), - x.CustomId, - x.Url, - x.Disabled) + x.Label.GetValueOrDefault(), + x.Emote.IsSpecified ? x.Emote.Value.Id.HasValue ? new Emote(x.Emote.Value.Id.Value, x.Emote.Value.Name, x.Emote.Value.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Value.Name) : null, + x.CustomId.GetValueOrDefault(), + x.Url.GetValueOrDefault(), + x.Disabled.GetValueOrDefault()) ).ToList() )).ToList(); } diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 2c2e7b56b8..8694a1ff78 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.1$suffix$ + 2.3.2$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From ad611dcafa192bc931ed7b87261897ff6aeaadf3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 07:53:23 -0300 Subject: [PATCH 041/494] meta: bump patch --- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 4 +++- .../Discord.Net.WebSocket.csproj | 2 +- src/Discord.Net/Discord.Net.nuspec | 14 +++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 770ef3bdc4..3efa4dda71 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,9 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.4 + 2.3.5 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs + 2.3.4 + 2.3.4 diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index a218ca36a8..8ee51c0f08 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.3 + 2.3.4 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 8694a1ff78..8112773733 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.2$suffix$ + 2.3.3$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -15,22 +15,22 @@ - - + + - - + + - - + + From 75b10e9195940059dacc6b497d8ffddfbb4fbf8b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 28 May 2021 10:46:13 -0300 Subject: [PATCH 042/494] Fix incorrect URL checks --- .../Interactions/Message Components/ComponentBuilder.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 532e0b2e51..a7da0d9362 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -422,7 +422,8 @@ public ButtonComponent Build() if (this.Style == ButtonStyle.Link && !string.IsNullOrEmpty(this.CustomId)) this.CustomId = null; - else if (!string.IsNullOrEmpty(this.Url)) + + else if (this.Style != ButtonStyle.Link && !string.IsNullOrEmpty(this.Url)) // Thanks 𝑴𝒓𝑪𝒂𝒌𝒆𝑺𝒍𝒂𝒚𝒆𝒓 :D this.Url = null; return new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); From 69c734808d8d4a71b4c81696adf36ee185b77eb9 Mon Sep 17 00:00:00 2001 From: Matt Smith Date: Fri, 28 May 2021 13:06:52 -0500 Subject: [PATCH 043/494] Initial pass at making slash commands respond as expected --- .../API/Common/ApplicationCommandInteractionData.cs | 6 +----- .../Common/ApplicationCommandInteractionDataOption.cs | 6 +----- .../Interaction/Slash Commands/SocketSlashCommand.cs | 7 ++----- .../Interaction/Slash Commands/SocketSlashCommandData.cs | 9 +++------ .../Slash Commands/SocketSlashCommandDataOption.cs | 9 +++------ 5 files changed, 10 insertions(+), 27 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index b421edf6f7..118dcc0f09 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -16,6 +12,6 @@ internal class ApplicationCommandInteractionData public string Name { get; set; } [JsonProperty("options")] - public Optional Options { get; set; } + public List Options { get; set; } = new(); } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs index 84f2e3f7a2..33d04800f8 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -16,6 +12,6 @@ internal class ApplicationCommandInteractionDataOption public Optional Value { get; set; } [JsonProperty("options")] - public Optional> Options { get; set; } + public List Options { get; set; } = new(); } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index da94c46256..c3f760ebcf 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -1,12 +1,9 @@ using Discord.Rest; using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; -using Model = Discord.API.Gateway.InteractionCreated; using DataModel = Discord.API.ApplicationCommandInteractionData; +using Model = Discord.API.Gateway.InteractionCreated; namespace Discord.WebSocket { @@ -40,7 +37,7 @@ internal override void Update(Model model) (model.Data.Value as JToken).ToObject() : null; - this.Data.Update(data, this.Guild.Id); + this.Data.Update(data, model.GuildId); base.Update(model); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 098d81b865..eebc18a9a7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandInteractionData; namespace Discord.WebSocket @@ -14,7 +11,7 @@ public class SocketSlashCommandData : SocketEntity, IApplicationCommandIn public string Name { get; private set; } /// - /// The 's recieved with this interaction. + /// The 's received with this interaction. /// public IReadOnlyCollection Options { get; private set; } @@ -37,8 +34,8 @@ internal void Update(Model model, ulong guildId) this.Name = model.Name; this.guildId = guildId; - this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, this.Discord, guildId)).ToImmutableArray() + this.Options = model.Options.Any() + ? model.Options.Select(x => new SocketSlashCommandDataOption(x, this.Discord, guildId)).ToImmutableArray() : null; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index 89f1443bee..e3f7d520d7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandInteractionDataOption; namespace Discord.WebSocket @@ -20,7 +17,7 @@ public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOp public object Value { get; private set; } /// - /// The sub command options recieved for this sub command group. + /// The sub command options received for this sub command group. /// public IReadOnlyCollection Options { get; private set; } @@ -35,8 +32,8 @@ internal SocketSlashCommandDataOption(Model model, DiscordSocketClient discord, this.discord = discord; this.guild = guild; - this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(x, discord, guild)).ToImmutableArray() + this.Options = model.Options.Any() + ? model.Options.Select(x => new SocketSlashCommandDataOption(x, discord, guild)).ToImmutableArray() : null; } From 1a2753d25771b1e699ab288722cf108f5479d66b Mon Sep 17 00:00:00 2001 From: Matt Smith Date: Fri, 28 May 2021 13:30:51 -0500 Subject: [PATCH 044/494] Addition of required library missed in merge --- .../Entities/Interaction/Slash Commands/SocketSlashCommand.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 69b18c44dc..72e8a0d6a5 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -1,6 +1,7 @@ using Discord.Rest; using Newtonsoft.Json.Linq; using System; +using System.Linq; using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Gateway.InteractionCreated; From 142f9cc485f918ad7e4d59f5fe9d3a6b87972eb3 Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Fri, 28 May 2021 17:04:52 -0500 Subject: [PATCH 045/494] Add missing bucket ids and RequestOptions in GetInteractionResponse() --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index da34108072..55b482aaf4 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -956,7 +956,7 @@ public async Task GetInteractionResponse(string interactionToken, Reque options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original").ConfigureAwait(false); + return await SendAsync("GET", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options).ConfigureAwait(false); } public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) { From 98027c387ce8319f501e31530ca8ed07d4bd0e58 Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Fri, 28 May 2021 17:29:18 -0500 Subject: [PATCH 046/494] Add lambda --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 55b482aaf4..9f2e90730f 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -956,7 +956,7 @@ public async Task GetInteractionResponse(string interactionToken, Reque options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options).ConfigureAwait(false); } public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) { From cb288ba2356ed206b28865511a04936e92552bbb Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 29 May 2021 06:38:41 -0300 Subject: [PATCH 047/494] Closes #11. Added DM support for message components and slash command. Fixed incorrect author for messages --- .../DiscordSocketClient.cs | 47 ++++++++++--------- .../SocketMessageComponent.cs | 13 ++++- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index df8e796386..ad58c19ac2 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1785,34 +1785,35 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - if (data.Member.IsSpecified && data.ChannelId.IsSpecified) - { - if (State.GetChannel(data.ChannelId.Value) is SocketGuildChannel channel) - { - var guild = channel.Guild; - if (!guild.IsSynced) - { - await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); - return; - } - var interaction = SocketInteraction.Create(this, data); - - if (this.AlwaysAcknowledgeInteractions) - await interaction.AcknowledgeAsync().ConfigureAwait(false); - - await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); - } - else - { - await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false); - return; - } + SocketChannel channel; + if(data.ChannelId.IsSpecified) + { + channel = State.GetChannel(data.ChannelId.Value); + } + else if (data.User.IsSpecified) + { + channel = State.GetDMChannel(data.User.Value.Id); } else { - // DM TODO + await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false); + return; } + + var guild = (channel as SocketGuildChannel)?.Guild; + if (guild != null && !guild.IsSynced) + { + await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + return; + } + + var interaction = SocketInteraction.Create(this, data); + + if (this.AlwaysAcknowledgeInteractions) + await interaction.AcknowledgeAsync().ConfigureAwait(false); + + await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); } break; case "APPLICATION_COMMAND_CREATE": diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 0b077fda50..2afc474c17 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -52,7 +52,18 @@ internal override void Update(Model model) { if (this.Message == null) { - this.Message = SocketMessage.Create(this.Discord, this.Discord.State, this.User, this.Channel, model.Message.Value); + SocketUser author = null; + if (this.Channel is SocketGuildChannel channel) + { + if (model.Message.Value.WebhookId.IsSpecified) + author = SocketWebhookUser.Create(channel.Guild, Discord.State, model.Message.Value.Author.Value, model.Message.Value.WebhookId.Value); + else + author = channel.Guild.GetUser(model.Message.Value.Author.Value.Id); + } + else + author = (this.Channel as SocketChannel).GetUser(model.Message.Value.Author.Value.Id); + + this.Message = SocketMessage.Create(this.Discord, this.Discord.State, author, this.Channel, model.Message.Value); } else { From 689c77d476b23503a54ed1b7d399e9d3db2ebf2d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 29 May 2021 07:07:55 -0300 Subject: [PATCH 048/494] Closes #8. Added DM support for buttons and slash commands. Added SlashCommandBuilder --- .../Interactions/ApplicationCommandOption.cs | 12 +- .../Interactions/SlashCommandBuilder.cs | 489 ++++++++++++++++++ .../Slash Commands/SocketSlashCommand.cs | 3 + .../Slash Commands/SocketSlashCommandData.cs | 3 + 4 files changed, 505 insertions(+), 2 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index f9e34362c3..d33990da10 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Discord @@ -22,8 +23,15 @@ public string Name get => _name; set { - if (value?.Length > 32) - throw new ArgumentException("Name length must be less than or equal to 32"); + if (value == null) + throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); + + if (value.Length > 32) + throw new ArgumentException($"{nameof(Name)} length must be less than or equal to 32"); + + if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) + throw new ArgumentException($"{nameof(Name)} must match the regex ^[\\w-]{{1,32}}$"); + _name = value; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs new file mode 100644 index 0000000000..c3c1aaa7fd --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -0,0 +1,489 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to build slash commands. + /// + public class SlashCommandBuilder + { + /// + /// Returns the maximun length a commands name allowed by Discord + /// + public const int MaxNameLength = 32; + /// + /// Returns the maximum length of a commands description allowed by Discord. + /// + public const int MaxDescriptionLength = 100; + /// + /// Returns the maximum count of command options allowed by Discord + /// + public const int MaxOptionsCount = 10; + + /// + /// The name of this slash command. + /// + public string Name + { + get + { + return _name; + } + set + { + Preconditions.NotNullOrEmpty(value, nameof(Name)); + Preconditions.AtLeast(value.Length, 3, nameof(Name)); + Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); + + // Discord updated the docs, this regex prevents special characters like @!$%(... etc, + // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand + if (!Regex.IsMatch(value, @"^[\w-]{3,32}$")) + throw new ArgumentException("Command name cannot contian any special characters or whitespaces!"); + + _name = value; + } + } + + /// + /// A 1-100 length description of this slash command + /// + public string Description + { + get + { + return _description; + } + set + { + Preconditions.AtLeast(value.Length, 1, nameof(Description)); + Preconditions.AtMost(value.Length, MaxDescriptionLength, nameof(Description)); + + _description = value; + } + } + + /// + /// Gets or sets the options for this command. + /// + public List Options + { + get => _options; + set + { + if (value != null) + if (value.Count > MaxOptionsCount) + throw new ArgumentException(message: $"Option count must be less than or equal to {MaxOptionsCount}.", paramName: nameof(Options)); + + _options = value; + } + } + private string _name { get; set; } + private string _description { get; set; } + private List _options { get; set; } + + public SlashCommandCreationProperties Build() + { + SlashCommandCreationProperties props = new SlashCommandCreationProperties() + { + Name = this.Name, + Description = this.Description, + }; + + if (this.Options != null && this.Options.Any()) + { + var options = new List(); + + this.Options.ForEach(x => options.Add(x.Build())); + + props.Options = options; + } + + return props; + + } + + public SlashCommandBuilder WithName(string Name) + { + this.Name = Name; + return this; + } + + /// + /// Sets the description of the current command. + /// + /// The description of this command. + /// The current builder. + public SlashCommandBuilder WithDescription(string Description) + { + this.Description = Description; + return this; + } + + /// + /// Adds an option to the current slash command. + /// + /// The name of the option to add. + /// The type of this option. + /// The description of this option. + /// If this option is required for this command. + /// If this option is the default option. + /// The options of the option to add. + /// The choices of this option. + /// The current builder. + public SlashCommandBuilder AddOption(string Name, ApplicationCommandOptionType Type, + string Description, bool Required = true, bool Default = false, List Options = null, params ApplicationCommandOptionChoiceProperties[] Choices) + { + // Make sure the name matches the requirements from discord + Preconditions.NotNullOrEmpty(Name, nameof(Name)); + Preconditions.AtLeast(Name.Length, 3, nameof(Name)); + Preconditions.AtMost(Name.Length, MaxNameLength, nameof(Name)); + + // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, + // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand + if (!Regex.IsMatch(Name, @"^[\w-]{3,32}$")) + throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(Name)); + + // same with description + Preconditions.NotNullOrEmpty(Description, nameof(Description)); + Preconditions.AtLeast(Description.Length, 3, nameof(Description)); + Preconditions.AtMost(Description.Length, MaxDescriptionLength, nameof(Description)); + + // make sure theres only one option with default set to true + if (Default) + { + if (this.Options != null) + if (this.Options.Any(x => x.Default)) + throw new ArgumentException("There can only be one command option with default set to true!", nameof(Default)); + } + + SlashCommandOptionBuilder option = new SlashCommandOptionBuilder(); + option.Name = Name; + option.Description = Description; + option.Required = Required; + option.Default = Default; + option.Options = Options; + option.Choices = Choices != null ? new List(Choices) : null; + + return AddOption(option); + } + + /// + /// Adds an option to the current slash command. + /// + /// The name of the option to add. + /// The type of this option. + /// The description of this option. + /// If this option is required for this command. + /// If this option is the default option. + /// The choices of this option. + /// The current builder. + public SlashCommandBuilder AddOption(string Name, ApplicationCommandOptionType Type, + string Description, bool Required = true, bool Default = false, params ApplicationCommandOptionChoiceProperties[] Choices) + => AddOption(Name, Type, Description, Required, Default, null, Choices); + + /// + /// Adds an option to the current slash command. + /// + /// The name of the option to add. + /// The type of this option. + /// The sescription of this option. + /// The current builder. + public SlashCommandBuilder AddOption(string Name, ApplicationCommandOptionType Type, string Description) + => AddOption(Name, Type, Description, Options: null, Choices: null); + + /// + /// Adds an option to this slash command. + /// + /// The option to add. + /// The current builder. + public SlashCommandBuilder AddOption(SlashCommandOptionBuilder Option) + { + if (this.Options == null) + this.Options = new List(); + + if (this.Options.Count >= MaxOptionsCount) + throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); + + if (Option == null) + throw new ArgumentNullException(nameof(Option), "Option cannot be null"); + + this.Options.Add(Option); + return this; + } + /// + /// Adds a collection of options to the current slash command. + /// + /// The collection of options to add. + /// The current builder. + public SlashCommandBuilder AddOptions(params SlashCommandOptionBuilder[] Options) + { + if (Options == null) + throw new ArgumentNullException(nameof(Options), "Options cannot be null!"); + + if (Options.Length == 0) + throw new ArgumentException(nameof(Options), "Options cannot be empty!"); + + if (this.Options == null) + this.Options = new List(); + + if (this.Options.Count + Options.Length > MaxOptionsCount) + throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); + + this.Options.AddRange(Options); + return this; + } + } + + /// + /// Represents a class used to build options for the . + /// + public class SlashCommandOptionBuilder + { + /// + /// The max length of a choice's name allowed by Discord. + /// + public const int ChoiceNameMaxLength = 100; + + /// + /// The maximum number of choices allowed by Discord. + /// + public const int MaxChoiceCount = 10; + + private string _name; + private string _description; + + /// + /// The name of this option. + /// + public string Name + { + get => _name; + set + { + if (value?.Length > SlashCommandBuilder.MaxNameLength) + throw new ArgumentException("Name length must be less than or equal to 32"); + if (value?.Length < 1) + throw new ArgumentException("Name length must at least 1 characters in length"); + + if (value != null) + if (!Regex.IsMatch(value, @"^[\w-]{3,32}$")) + throw new ArgumentException("Option name cannot contian any special characters or whitespaces!"); + + _name = value; + } + } + + /// + /// The description of this option. + /// + public string Description + { + get => _description; + set + { + if (value?.Length > SlashCommandBuilder.MaxDescriptionLength) + throw new ArgumentException("Description length must be less than or equal to 100"); + if (value?.Length < 1) + throw new ArgumentException("Name length must at least 1 character in length"); + + _description = value; + } + } + + /// + /// The type of this option. + /// + public ApplicationCommandOptionType Type { get; set; } + + /// + /// The first required option for the user to complete. only one option can be default. + /// + public bool Default { get; set; } + + /// + /// if this option is required for this command, otherwise . + /// + public bool Required { get; set; } + + /// + /// choices for string and int types for the user to pick from. + /// + public List Choices { get; set; } + + /// + /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// + public List Options { get; set; } + + /// + /// Builds the current option. + /// + /// The built version of this option. + public ApplicationCommandOptionProperties Build() + { + bool isSubType = this.Type == ApplicationCommandOptionType.SubCommand || this.Type == ApplicationCommandOptionType.SubCommandGroup; + + if (isSubType && (Options == null || !Options.Any())) + throw new ArgumentException(nameof(Options), "SubCommands/SubCommandGroups must have at least one option"); + + if (!isSubType && (Options != null && Options.Any())) + throw new ArgumentException(nameof(Options), $"Cannot have options on {Type} type"); + + return new ApplicationCommandOptionProperties() + { + Name = this.Name, + Description = this.Description, + Default = this.Default, + Required = this.Required, + Type = this.Type, + Options = new List(this.Options.Select(x => x.Build())), + Choices = this.Choices + }; + } + + /// + /// Adds a sub option to the current option. + /// + /// The sub option to add. + /// The current builder. + public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) + { + if (this.Options == null) + this.Options = new List(); + + if (this.Options.Count >= SlashCommandBuilder.MaxOptionsCount) + throw new ArgumentOutOfRangeException(nameof(Choices), $"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); + + if (option == null) + throw new ArgumentNullException(nameof(option), "Option cannot be null"); + + Options.Add(option); + return this; + } + + /// + /// Adds a choice to the current option. + /// + /// The name of the choice. + /// The value of the choice. + /// The current builder. + public SlashCommandOptionBuilder AddChoice(string Name, int Value) + { + if (Choices == null) + Choices = new List(); + + if (Choices.Count >= MaxChoiceCount) + throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); + + if (Name == null) + throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); + + Preconditions.AtLeast(Name.Length, 1, nameof(Name)); + Preconditions.AtMost(Name.Length, 100, nameof(Name)); + + Choices.Add(new ApplicationCommandOptionChoiceProperties() + { + Name = Name, + Value = Value + }); + + return this; + } + + /// + /// Adds a choice to the current option. + /// + /// The name of the choice. + /// The value of the choice. + /// The current builder. + public SlashCommandOptionBuilder AddChoice(string Name, string Value) + { + if (Choices == null) + Choices = new List(); + + if (Choices.Count >= MaxChoiceCount) + throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); + + if (Name == null) + throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); + + if (Value == null) + throw new ArgumentNullException($"{nameof(Value)} cannot be null!"); + + Preconditions.AtLeast(Name.Length, 1, nameof(Name)); + Preconditions.AtMost(Name.Length, 100, nameof(Name)); + + Preconditions.AtLeast(Value.Length, 1, nameof(Value)); + Preconditions.AtMost(Value.Length, 100, nameof(Value)); + + Choices.Add(new ApplicationCommandOptionChoiceProperties() + { + Name = Name, + Value = Value + }); + + return this; + } + + /// + /// Sets the current builders name. + /// + /// The name to set the current option builder. + /// The current builder. + public SlashCommandOptionBuilder WithName(string Name) + { + this.Name = Name; + + return this; + } + + /// + /// Sets the current builders description. + /// + /// The description to set. + /// The current builder. + public SlashCommandOptionBuilder WithDescription(string Description) + { + this.Description = Description; + return this; + } + + /// + /// Sets the current builders required field. + /// + /// The value to set. + /// The current builder. + public SlashCommandOptionBuilder WithRequired(bool value) + { + this.Required = value; + return this; + } + + /// + /// Sets the current builders default field. + /// + /// The value to set. + /// The current builder. + public SlashCommandOptionBuilder WithDefault(bool value) + { + this.Default = value; + return this; + } + + /// + /// Sets the current type of this builder. + /// + /// The type to set. + /// The current builder. + public SlashCommandOptionBuilder WithType(ApplicationCommandOptionType Type) + { + this.Type = Type; + return this; + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 72e8a0d6a5..3561ac8c03 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -8,6 +8,9 @@ namespace Discord.WebSocket { + /// + /// Represents a Websocket-based slash command received over the gateway. + /// public class SocketSlashCommand : SocketInteraction { /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 3ef6678e1e..b3cb5ddd20 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -5,6 +5,9 @@ namespace Discord.WebSocket { + /// + /// Represents the data tied with the interaction. + /// public class SocketSlashCommandData : SocketEntity, IApplicationCommandInteractionData { /// From 72d0470600c20ad34c0ddf5311bc43a59f9c28c9 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 29 May 2021 07:15:26 -0300 Subject: [PATCH 049/494] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 8e2b5fe02e..f9b8049c6b 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,15 @@ This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs +## Known issues +Labs will not work with Playwo's [InteractivityAddon](https://github.com/Playwo/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib, you can get around this by cloning his repo and building it with discord.net labs instead of discord.net. + +## How to use +Setting up labs in your project is really simple, here's how to do it: +1) Remove Discord.Net from your project +2) Add Discord.Net Labs nuget to your project +3) Enjoy! + ## Branches ### Dev The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch From 4bc4f2ae95f2815eb8c01e5ae3a009ec2d5ba59a Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 29 May 2021 07:15:34 -0300 Subject: [PATCH 050/494] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 6452d54b6c..f9b8049c6b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,17 @@ # Discord.Net Labs +[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs) + This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs +## Known issues +Labs will not work with Playwo's [InteractivityAddon](https://github.com/Playwo/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib, you can get around this by cloning his repo and building it with discord.net labs instead of discord.net. + +## How to use +Setting up labs in your project is really simple, here's how to do it: +1) Remove Discord.Net from your project +2) Add Discord.Net Labs nuget to your project +3) Enjoy! + ## Branches ### Dev The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch From 26bc709ca600345073fbabe88d027d4860d7e2fd Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 29 May 2021 07:16:25 -0300 Subject: [PATCH 051/494] Update application-commands.md --- docs/guides/commands/application-commands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/commands/application-commands.md b/docs/guides/commands/application-commands.md index 817b4b44be..aa73f66770 100644 --- a/docs/guides/commands/application-commands.md +++ b/docs/guides/commands/application-commands.md @@ -38,7 +38,7 @@ private async Task RegisterCommands() { new ApplicationCommandOptionProperties() { - Name = "Example option", + Name = "example_option", Required = false, Description = "Option Description", Type = Discord.ApplicationCommandOptionType.String, From b9efd9869802020937ad72728e44c1b826247173 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 29 May 2021 11:09:26 -0300 Subject: [PATCH 052/494] Closes #12. Implemented MessageComponent to ReplyAsync meta: bump versions from dev to minor --- .../Discord.Net.Commands.csproj | 2 +- src/Discord.Net.Commands/ModuleBase.cs | 4 +-- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- .../Discord.Net.WebSocket.csproj | 2 +- src/Discord.Net/Discord.Net.nuspec | 26 +++++++++---------- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 592a7f651c..04305056a1 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -7,7 +7,7 @@ A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 2.3.1 + 2.3.2 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index 6ec2db54d4..366cab4509 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -36,9 +36,9 @@ public abstract class ModuleBase : IModuleBase /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - protected virtual async Task ReplyAsync(string message = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null) + protected virtual async Task ReplyAsync(string message = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) { - return await Context.Channel.SendMessageAsync(message, isTTS, embed, options, allowedMentions, messageReference).ConfigureAwait(false); + return await Context.Channel.SendMessageAsync(message, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); } /// /// The method to execute before executing the command. diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 346c49f2f3..64ad2229d7 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.4 + 2.3.5 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 3efa4dda71..f1b258b75c 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.5 + 2.3.6 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 8ee51c0f08..62d245c4e8 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.4 + 2.3.5 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 8112773733..d1591cc80a 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.3$suffix$ + 2.3.4$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,24 +14,24 @@ https://avatars.githubusercontent.com/u/84047264 - - - - + + + + - - - - + + + + - - - - + + + + From 55355ce65ba1426056cf5820cb83e7b3162ad254 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 29 May 2021 11:12:19 -0300 Subject: [PATCH 053/494] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f9b8049c6b..9811089823 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Discord.Net Labs [![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs) +[![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dvSfUTet3K) This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs From cc4d1411955a122acdf68a6eebc5f0f2aee88f35 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 29 May 2021 11:12:27 -0300 Subject: [PATCH 054/494] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f9b8049c6b..9811089823 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Discord.Net Labs [![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs) +[![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dvSfUTet3K) This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs From 84d011a1f6ec6539e677d67bbfcc847ab75dca4a Mon Sep 17 00:00:00 2001 From: Z3RYX <39765816+Z3RYX@users.noreply.github.com> Date: Sat, 29 May 2021 22:46:11 +0200 Subject: [PATCH 055/494] Fixes issue where ComponentBuilder wouldn't add more than one button to a new row --- .../Interactions/Message Components/ComponentBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index a7da0d9362..e8b0ce19c2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -90,7 +90,7 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row) } else { - if (_actionRows.Count + 1 == row) + if (_actionRows.Count == row) _actionRows.Add(new ActionRowBuilder().WithComponent(builtButton)); else { From 515bd4dbd565e5fddff2d382fe48f541be008e3b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 30 May 2021 08:21:02 -0300 Subject: [PATCH 056/494] Added components to UserExtentions --- .../Extensions/UserExtensions.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Extensions/UserExtensions.cs b/src/Discord.Net.Core/Extensions/UserExtensions.cs index 90f26828a0..fdcc122950 100644 --- a/src/Discord.Net.Core/Extensions/UserExtensions.cs +++ b/src/Discord.Net.Core/Extensions/UserExtensions.cs @@ -40,9 +40,10 @@ public static async Task SendMessageAsync(this IUser user, bool isTTS = false, Embed embed = null, RequestOptions options = null, - AllowedMentions allowedMentions = null) + AllowedMentions allowedMentions = null, + MessageComponent component = null) { - return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(text, isTTS, embed, options, allowedMentions).ConfigureAwait(false); + return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(text, isTTS, embed, options, allowedMentions, component: component).ConfigureAwait(false); } /// @@ -91,10 +92,10 @@ public static async Task SendFileAsync(this IUser user, string text = null, bool isTTS = false, Embed embed = null, - RequestOptions options = null - ) + RequestOptions options = null, + MessageComponent component = null) { - return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false); + return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(stream, filename, text, isTTS, embed, options, component: component).ConfigureAwait(false); } /// @@ -147,9 +148,10 @@ public static async Task SendFileAsync(this IUser user, string text = null, bool isTTS = false, Embed embed = null, - RequestOptions options = null) + RequestOptions options = null, + MessageComponent component = null) { - return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false); + return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(filePath, text, isTTS, embed, options, component: component).ConfigureAwait(false); } /// From e17794e58e551b0ef193e7d0d9c3367c6c8846a9 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 30 May 2021 08:58:33 -0300 Subject: [PATCH 057/494] Update channel on SocketInteraction --- .../DiscordSocketClient.cs | 7 +++-- .../SocketMessageComponent.cs | 8 ++--- .../Slash Commands/SocketSlashCommand.cs | 8 ++--- .../Entities/Interaction/SocketInteraction.cs | 31 ++++++------------- 4 files changed, 21 insertions(+), 33 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index ad58c19ac2..f4a862998b 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1786,7 +1786,7 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th var data = (payload as JToken).ToObject(_serializer); - SocketChannel channel; + SocketChannel channel = null; if(data.ChannelId.IsSpecified) { channel = State.GetChannel(data.ChannelId.Value); @@ -1795,7 +1795,8 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th { channel = State.GetDMChannel(data.User.Value.Id); } - else + + if(channel == null) { await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false); return; @@ -1808,7 +1809,7 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th return; } - var interaction = SocketInteraction.Create(this, data); + var interaction = SocketInteraction.Create(this, data, channel as ISocketMessageChannel); if (this.AlwaysAcknowledgeInteractions) await interaction.AcknowledgeAsync().ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 2afc474c17..a6ad7ed1c0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -25,8 +25,8 @@ public class SocketMessageComponent : SocketInteraction /// public SocketMessage Message { get; private set; } - internal SocketMessageComponent(DiscordSocketClient client, Model model) - : base(client, model.Id) + internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + : base(client, model.Id, channel) { var dataModel = model.Data.IsSpecified ? (model.Data.Value as JToken).ToObject() @@ -37,9 +37,9 @@ internal SocketMessageComponent(DiscordSocketClient client, Model model) } - new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model) + new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { - var entity = new SocketMessageComponent(client, model); + var entity = new SocketMessageComponent(client, model, channel); entity.Update(model); return entity; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 3561ac8c03..faf50e38e4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -18,8 +18,8 @@ public class SocketSlashCommand : SocketInteraction /// new public SocketSlashCommandData Data { get; private set; } - internal SocketSlashCommand(DiscordSocketClient client, Model model) - : base(client, model.Id) + internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + : base(client, model.Id, channel) { var dataModel = model.Data.IsSpecified ? (model.Data.Value as JToken).ToObject() @@ -28,9 +28,9 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model) Data = SocketSlashCommandData.Create(client, dataModel, model.Id); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model) + new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { - var entity = new SocketSlashCommand(client, model); + var entity = new SocketSlashCommand(client, model, channel); entity.Update(model); return entity; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 62f0debefc..4b213f4ecc 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -54,17 +54,18 @@ public bool IsValidToken private ulong? GuildId { get; set; } private ulong? ChannelId { get; set; } - internal SocketInteraction(DiscordSocketClient client, ulong id) + internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) { + this.Channel = channel; } - internal static SocketInteraction Create(DiscordSocketClient client, Model model) + internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { if (model.Type == InteractionType.ApplicationCommand) - return SocketSlashCommand.Create(client, model); + return SocketSlashCommand.Create(client, model, channel); if (model.Type == InteractionType.MessageComponent) - return SocketMessageComponent.Create(client, model); + return SocketMessageComponent.Create(client, model, channel); else return null; } @@ -92,18 +93,6 @@ internal virtual void Update(Model model) this.User = SocketGlobalUser.Create(this.Discord, this.Discord.State, model.User.Value); } } - - if (this.Channel == null) - { - if (model.ChannelId.IsSpecified) - { - this.Channel = Discord.State.GetChannel(model.ChannelId.Value) as ISocketMessageChannel; - } - else - { - this.Channel = Discord.State.GetDMChannel(this.User.Id); - } - } } /// @@ -127,9 +116,8 @@ internal virtual void Update(Model model) /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - public virtual Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) - { return null; } + public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); /// /// Sends a followup message for this interaction. @@ -145,10 +133,9 @@ public virtual Task RespondAsync(string text = null, bool isTTS /// /// The sent message. /// - public virtual Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + public abstract Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) - { return null; } + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); /// /// Acknowledges this interaction with the . From a96f2500755e9a4dd28e9c29bec1a9ebb3df300a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 30 May 2021 09:16:22 -0300 Subject: [PATCH 058/494] meta: bump version. --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- .../Discord.Net.WebSocket.csproj | 2 +- .../DiscordSocketClient.cs | 30 ++++++++++--------- src/Discord.Net/Discord.Net.nuspec | 14 ++++----- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 64ad2229d7..3de56281fb 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.5 + 2.3.6 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 62d245c4e8..b091978751 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.5 + 2.3.6 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f4a862998b..ef696a5ba1 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1796,25 +1796,27 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th channel = State.GetDMChannel(data.User.Value.Id); } - if(channel == null) + if(channel is ISocketMessageChannel textChannel) { - await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false); - return; - } + var guild = (channel as SocketGuildChannel)?.Guild; + if (guild != null && !guild.IsSynced) + { + await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + return; + } - var guild = (channel as SocketGuildChannel)?.Guild; - if (guild != null && !guild.IsSynced) + var interaction = SocketInteraction.Create(this, data, channel as ISocketMessageChannel); + + if (this.AlwaysAcknowledgeInteractions) + await interaction.AcknowledgeAsync().ConfigureAwait(false); + + await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); + } + else { - await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false); return; } - - var interaction = SocketInteraction.Create(this, data, channel as ISocketMessageChannel); - - if (this.AlwaysAcknowledgeInteractions) - await interaction.AcknowledgeAsync().ConfigureAwait(false); - - await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); } break; case "APPLICATION_COMMAND_CREATE": diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index d1591cc80a..0a6fa257f7 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.4$suffix$ + 2.3.5$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - + - + - + - + - + - + From 737a400e085cee6bb9aa33e11ce79eae37a7b485 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 30 May 2021 09:28:26 -0300 Subject: [PATCH 059/494] Rest based fetch for interactions that are not in cache --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index ef696a5ba1..76c17a2ecb 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1796,7 +1796,19 @@ await _gatewayLogger.WarningAsync("A bulk delete event has been received, but th channel = State.GetDMChannel(data.User.Value.Id); } - if(channel is ISocketMessageChannel textChannel) + if (channel == null) + { + var channelModel = await this.Rest.ApiClient.GetChannelAsync(data.ChannelId.Value); + + if (data.GuildId.IsSpecified) + channel = SocketTextChannel.Create(State.GetGuild(data.GuildId.Value), this.State, channelModel); + else + channel = (SocketChannel)SocketChannel.CreatePrivate(this, State, channelModel); + + this.State.AddChannel(channel); + } + + if (channel is ISocketMessageChannel textChannel) { var guild = (channel as SocketGuildChannel)?.Guild; if (guild != null && !guild.IsSynced) From da907b66cd76859fb3361c5c8e7ff7f2f5b0c78e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 30 May 2021 09:58:28 -0300 Subject: [PATCH 060/494] meta: bump version --- .../Discord.Net.Analyzers.csproj | 3 + .../Discord.Net.Commands.csproj | 5 +- .../Discord.Net.Commands.xml | 1494 +++ src/Discord.Net.Core/Discord.Net.Core.csproj | 5 +- src/Discord.Net.Core/Discord.Net.Core.xml | 10550 ++++++++++++++++ src/Discord.Net.Rest/Discord.Net.Rest.csproj | 5 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 4382 +++++++ .../Discord.Net.WebSocket.csproj | 5 +- .../Discord.Net.WebSocket.xml | 4607 +++++++ .../Discord.Net.Webhook.csproj | 5 +- .../Discord.Net.Webhook.xml | 56 + src/Discord.Net/Discord.Net.nuspec | 32 +- 12 files changed, 21128 insertions(+), 21 deletions(-) create mode 100644 src/Discord.Net.Commands/Discord.Net.Commands.xml create mode 100644 src/Discord.Net.Core/Discord.Net.Core.xml create mode 100644 src/Discord.Net.Rest/Discord.Net.Rest.xml create mode 100644 src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml create mode 100644 src/Discord.Net.Webhook/Discord.Net.Webhook.xml diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj index 1b2ee45bf7..3f986a639e 100644 --- a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj +++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj @@ -6,6 +6,9 @@ A Discord.Net extension adding support for design-time analysis of the API usage. netstandard2.0;netstandard2.1 + + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Analyzers\Discord.Net.Analyzers.xml + diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 04305056a1..183493d292 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -7,12 +7,15 @@ A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 2.3.2 + 2.3.3 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png + + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Commands\Discord.Net.Commands.xml + diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml new file mode 100644 index 0000000000..7da918622b --- /dev/null +++ b/src/Discord.Net.Commands/Discord.Net.Commands.xml @@ -0,0 +1,1494 @@ + + + + Discord.Net.Commands + + + + + Marks the aliases for a command. + + + This attribute allows a command to have one or multiple aliases. In other words, the base command can have + multiple aliases when triggering the command itself, giving the end-user more freedom of choices when giving + hot-words to trigger the desired command. See the example for a better illustration. + + + In the following example, the command can be triggered with the base name, "stats", or either "stat" or + "info". + + [Command("stats")] + [Alias("stat", "info")] + public async Task GetStatsAsync(IUser user) + { + // ...pull stats + } + + + + + + Gets the aliases which have been defined for the command. + + + + + Creates a new with the given aliases. + + + + + Marks the execution information for a command. + + + + + Gets the text that has been set to be recognized as a command. + + + + + Specifies the of the command. This affects how the command is executed. + + + + + + + + Initializes a new attribute with the specified name. + + The name of the command. + + + + Prevents the marked module from being loaded automatically. + + + This attribute tells to ignore the marked module from being loaded + automatically (e.g. the method). If a non-public module marked + with this attribute is attempted to be loaded manually, the loading process will also fail. + + + + + Prevents the marked property from being injected into a module. + + + This attribute prevents the marked member from being injected into its parent module. Useful when you have a + public property that you do not wish to invoke the library's dependency injection service. + + + In the following example, DatabaseService will not be automatically injected into the module and will + not throw an error message if the dependency fails to be resolved. + + public class MyModule : ModuleBase + { + [DontInject] + public DatabaseService DatabaseService; + public MyModule() + { + DatabaseService = DatabaseFactory.Generate(); + } + } + + + + + + Marks the module as a command group. + + + + + Gets the prefix set for the module. + + + + + + + + Initializes a new with the provided prefix. + + The prefix of the module group. + + + + Marks the public name of a command, module, or parameter. + + + + + Gets the name of the command. + + + + + Marks the public name of a command, module, or parameter with the provided name. + + The public name of the object. + + + + Instructs the command system to treat command parameters of this type + as a collection of named arguments matching to its properties. + + + + + Marks the to be read by the specified . + + + This attribute will override the to be used when parsing for the + desired type in the command. This is useful when one wishes to use a particular + without affecting other commands that are using the same target + type. + + If the given type reader does not inherit from , an + will be thrown. + + + + In this example, the will be read by a custom + , FriendlyTimeSpanTypeReader, instead of the + shipped by Discord.Net. + + [Command("time")] + public Task GetTimeAsync([OverrideTypeReader(typeof(FriendlyTimeSpanTypeReader))]TimeSpan time) + => ReplyAsync(time); + + + + + + Gets the specified of the parameter. + + + + + The to be used with the parameter. + The given does not inherit from . + + + + Requires the parameter to pass the specified precondition before execution can begin. + + + + + + Checks whether the condition is met before execution of the command. + + The context of the command. + The parameter of the command being checked against. + The raw value of the parameter. + The service collection used for dependency injection. + + + + Requires the module or class to pass the specified precondition before execution can begin. + + + + + + Specifies a group that this precondition belongs to. + + + of the same group require only one of the preconditions to pass in order to + be successful (A || B). Specifying = null or not at all will + require *all* preconditions to pass, just like normal (A && B). + + + + + When overridden in a derived class, uses the supplied string + as the error message if the precondition doesn't pass. + Setting this for a class that doesn't override + this property is a no-op. + + + + + Checks if the has the sufficient permission to be executed. + + The context of the command. + The command being executed. + The service collection used for dependency injection. + + + + Requires the bot to have a specific permission in the channel a command is invoked in. + + + + + Gets the specified of the precondition. + + + + + Gets the specified of the precondition. + + + + + + + + Gets or sets the error message if the precondition + fails due to being run outside of a Guild channel. + + + + + Requires the bot account to have a specific . + + + This precondition will always fail if the command is being invoked in a . + + + The that the bot must have. Multiple permissions can be specified + by ORing the permissions together. + + + + + Requires that the bot account to have a specific . + + + The that the bot must have. Multiple permissions can be + specified by ORing the permissions together. + + + + + + + + Defines the type of command context (i.e. where the command is being executed). + + + + + Specifies the command to be executed within a guild. + + + + + Specifies the command to be executed within a DM. + + + + + Specifies the command to be executed within a group. + + + + + Requires the command to be invoked in a specified context (e.g. in guild, DM). + + + + + Gets the context required to execute the command. + + + + + + + Requires the command to be invoked in the specified context. + The type of context the command can be invoked in. Multiple contexts can be specified by ORing the contexts together. + + + [Command("secret")] + [RequireContext(ContextType.DM | ContextType.Group)] + public Task PrivateOnlyAsync() + { + return ReplyAsync("shh, this command is a secret"); + } + + + + + + + + + Requires the command to be invoked in a channel marked NSFW. + + + The precondition will restrict the access of the command or module to be accessed within a guild channel + that has been marked as mature or NSFW. If the channel is not of type or the + channel is not marked as NSFW, the precondition will fail with an erroneous . + + + The following example restricts the command too-cool to an NSFW-enabled channel only. + + public class DankModule : ModuleBase + { + [Command("cool")] + public Task CoolAsync() + => ReplyAsync("I'm cool for everyone."); + + [RequireNsfw] + [Command("too-cool")] + public Task TooCoolAsync() + => ReplyAsync("You can only see this if you're cool enough."); + } + + + + + + + + + + + + Requires the command to be invoked by the owner of the bot. + + + This precondition will restrict the access of the command or module to the owner of the Discord application. + If the precondition fails to be met, an erroneous will be returned with the + message "Command can only be run by the owner of the bot." + + This precondition will only work if the account has a of + ;otherwise, this precondition will always fail. + + + + The following example restricts the command to a set of sensitive commands that only the owner of the bot + application should be able to access. + + [RequireOwner] + [Group("admin")] + public class AdminModule : ModuleBase + { + [Command("exit")] + public async Task ExitAsync() + { + Environment.Exit(0); + } + } + + + + + + + + + + + + Requires the user invoking the command to have a specified permission. + + + + + Gets the specified of the precondition. + + + + + Gets the specified of the precondition. + + + + + + + + Gets or sets the error message if the precondition + fails due to being run outside of a Guild channel. + + + + + Requires that the user invoking the command to have a specific . + + + This precondition will always fail if the command is being invoked in a . + + + The that the user must have. Multiple permissions can be + specified by ORing the permissions together. + + + + + Requires that the user invoking the command to have a specific . + + + The that the user must have. Multiple permissions can be + specified by ORing the permissions together. + + + + + + + + Sets priority of commands. + + + + + Gets the priority which has been set for the command. + + + + + Initializes a new attribute with the given priority. + + + + + Marks the input to not be parsed by the parser. + + + + + Attaches remarks to your commands. + + + + + Attaches a summary to your command. + + + + Only the last parameter in a command may have the Remainder or Multiple flag. + + + The context of a command which may contain the client, user, guild, channel, and message. + + + + + + + + + + + + + + + + + + Indicates whether the channel that the command is executed in is a private channel. + + + + Initializes a new class with the provided client and message. + + The underlying client. + The underlying message. + + + Defines the type of error a command can throw. + + + + Thrown when the command is unknown. + + + + + Thrown when the command fails to be parsed. + + + + + Thrown when the input text has too few or too many arguments. + + + + + Thrown when the object cannot be found by the . + + + + + Thrown when more than one object is matched by . + + + + + Thrown when the command fails to meet a 's conditions. + + + + + Thrown when an exception occurs mid-command execution. + + + + + Thrown when the command is not successfully executed on runtime. + + + + + The exception that is thrown if another exception occurs during a command execution. + + + + Gets the command that caused the exception. + + + Gets the command context of the exception. + + + + Initializes a new instance of the class using a + information, a context, and the exception that + interrupted the execution. + + The command information. + The context of the command. + The exception that interrupted the command execution. + + + The command that matches the search result. + + + The alias of the command. + + + + Provides a framework for building Discord commands. + + + + The service provides a framework for building Discord commands both dynamically via runtime builders or + statically via compile-time modules. To create a command module at compile-time, see + (most common); otherwise, see . + + + This service also provides several events for monitoring command usages; such as + for any command-related log events, and + for information about commands that have + been successfully executed. + + + + + + Occurs when a command-related information is received. + + + + + Occurs when a command is executed. + + + This event is fired when a command has been executed, successfully or not. When a command fails to + execute during parsing or precondition stage, the CommandInfo may not be returned. + + + + + Represents all modules loaded within . + + + + + Represents all commands loaded within . + + + + + Represents all loaded within . + + + + + Initializes a new class. + + + + + Initializes a new class with the provided configuration. + + The configuration class. + + The cannot be set to . + + + + + Add a command module from a . + + + The following example registers the module MyModule to commandService. + + await commandService.AddModuleAsync<MyModule>(serviceProvider); + + + The type of module. + The for your dependency injection solution if using one; otherwise, pass null. + This module has already been added. + + The fails to be built; an invalid type may have been provided. + + + A task that represents the asynchronous operation for adding the module. The task result contains the + built module. + + + + + Adds a command module from a . + + The type of module. + The for your dependency injection solution if using one; otherwise, pass null . + This module has already been added. + + The fails to be built; an invalid type may have been provided. + + + A task that represents the asynchronous operation for adding the module. The task result contains the + built module. + + + + + Add command modules from an . + + The containing command modules. + The for your dependency injection solution if using one; otherwise, pass null. + + A task that represents the asynchronous operation for adding the command modules. The task result + contains an enumerable collection of modules added. + + + + + Removes the command module. + + The to be removed from the service. + + A task that represents the asynchronous removal operation. The task result contains a value that + indicates whether the is successfully removed. + + + + + Removes the command module. + + The of the module. + + A task that represents the asynchronous removal operation. The task result contains a value that + indicates whether the module is successfully removed. + + + + + Removes the command module. + + The of the module. + + A task that represents the asynchronous removal operation. The task result contains a value that + indicates whether the module is successfully removed. + + + + + Adds a custom to this for the supplied object + type. + If is a , a nullable will + also be added. + If a default exists for , a warning will be logged + and the default will be replaced. + + The object type to be read by the . + An instance of the to be added. + + + + Adds a custom to this for the supplied object + type. + If is a , a nullable for the + value type will also be added. + If a default exists for , a warning will be logged and + the default will be replaced. + + A instance for the type to be read. + An instance of the to be added. + + + + Adds a custom to this for the supplied object + type. + If is a , a nullable will + also be added. + + The object type to be read by the . + An instance of the to be added. + + Defines whether the should replace the default one for + if it exists. + + + + + Adds a custom to this for the supplied object + type. + If is a , a nullable for the + value type will also be added. + + A instance for the type to be read. + An instance of the to be added. + + Defines whether the should replace the default one for if + it exists. + + + + + Searches for the command. + + The context of the command. + The position of which the command starts at. + The result containing the matching commands. + + + + Searches for the command. + + The context of the command. + The command string. + The result containing the matching commands. + + + + Executes the command. + + The context of the command. + The position of which the command starts at. + The service to be used in the command's dependency injection. + The handling mode when multiple command matches are found. + + A task that represents the asynchronous execution operation. The task result contains the result of the + command execution. + + + + + Executes the command. + + The context of the command. + The command string. + The service to be used in the command's dependency injection. + The handling mode when multiple command matches are found. + + A task that represents the asynchronous execution operation. The task result contains the result of the + command execution. + + + + + Represents a configuration class for . + + + + + Gets or sets the default commands should have, if one is not specified on the + Command attribute or builder. + + + + + Gets or sets the that separates an argument with another. + + + + + Gets or sets whether commands should be case-sensitive. + + + + + Gets or sets the minimum log level severity that will be sent to the event. + + + + + Gets or sets whether commands should push exceptions up to the caller. + + + + + Collection of aliases for matching pairs of string delimiters. + The dictionary stores the opening delimiter as a key, and the matching closing delimiter as the value. + If no value is supplied will be used, which contains + many regional equivalents. + Only values that are specified in this map will be used as string delimiters, so if " is removed then + it won't be used. + If this map is set to null or empty, the default delimiter of " will be used. + + + + QuotationMarkAliasMap = new Dictionary<char, char>() + { + {'\"', '\"' }, + {'“', '”' }, + {'「', '」' }, + } + + + + + + Gets or sets a value that indicates whether extra parameters should be ignored. + + + + + Provides extension methods for the class. + + + + + Returns commands that can be executed under the current context. + + The set of commands to be checked against. + The current command context. + The service provider used for dependency injection upon precondition check. + + A read-only collection of commands that can be executed under the current context. + + + + + Returns commands that can be executed under the current context. + + The desired command service class to check against. + The current command context. + The service provider used for dependency injection upon precondition check. + + A read-only collection of commands that can be executed under the current context. + + + + + Returns commands that can be executed under the current context. + + The module to be checked against. + The current command context. + The service provider used for dependency injection upon precondition check. + + A read-only collection of commands that can be executed under the current context. + + + + + Provides extension methods for that relates to commands. + + + + + Gets whether the message starts with the provided character. + + The message to check against. + The char prefix. + References where the command starts. + + true if the message begins with the char ; otherwise false. + + + + + Gets whether the message starts with the provided string. + + + + + Gets whether the message starts with the user's mention string. + + + + + Provides the information of a command. + + + This object contains the information of a command. This can include the module of the command, various + descriptions regarding the command, and its . + + + + + Gets the module that the command belongs in. + + + + + Gets the name of the command. If none is set, the first alias is used. + + + + + Gets the summary of the command. + + + This field returns the summary of the command. and can be + useful in help commands and various implementation that fetches details of the command for the user. + + + + + Gets the remarks of the command. + + + This field returns the summary of the command. and can be + useful in help commands and various implementation that fetches details of the command for the user. + + + + + Gets the priority of the command. This is used when there are multiple overloads of the command. + + + + + Indicates whether the command accepts a [] for its + parameter. + + + + + Indicates whether extra arguments should be ignored for this command. + + + + + Gets the that is being used for the command. + + + + + Gets a list of aliases defined by the of the command. + + + + + Gets a list of information about the parameters of the command. + + + + + Gets a list of preconditions defined by the of the command. + + + + + Gets a list of attributes of the command. + + + + + Provides the information of a module. + + + + + Gets the command service associated with this module. + + + + + Gets the name of this module. + + + + + Gets the summary of this module. + + + + + Gets the remarks of this module. + + + + + Gets the group name (main prefix) of this module. + + + + + Gets a read-only list of aliases associated with this module. + + + + + Gets a read-only list of commands associated with this module. + + + + + Gets a read-only list of preconditions that apply to this module. + + + + + Gets a read-only list of attributes that apply to this module. + + + + + Gets a read-only list of submodules associated with this module. + + + + + Gets the parent module of this submodule if applicable. + + + + + Gets a value that indicates whether this module is a submodule or not. + + + + + Provides the information of a parameter. + + + + + Gets the command that associates with this parameter. + + + + + Gets the name of this parameter. + + + + + Gets the summary of this parameter. + + + + + Gets a value that indicates whether this parameter is optional or not. + + + + + Gets a value that indicates whether this parameter is a remainder parameter or not. + + + + + Gets the type of the parameter. + + + + + Gets the default value for this optional parameter if applicable. + + + + + Gets a read-only list of precondition that apply to this parameter. + + + + + Gets a read-only list of attributes that apply to this parameter. + + + + Cannot add commands to the root node. + + + + Provides a base class for a command module to inherit from. + + + + + Provides a base class for a command module to inherit from. + + A class that implements . + + + + The underlying context of the command. + + + + + + + Sends a message to the source channel. + + + Contents of the message; optional only if is specified. + + Specifies if Discord should read this aloud using text-to-speech. + An embed to be displayed alongside the . + + Specifies if notifications are sent for mentioned users and roles in the . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + + + + The method to execute before executing the command. + + The of the command to be executed. + + + + The method to execute after executing the command. + + The of the command to be executed. + + + + The method to execute when building the module. + + The used to create the module. + The builder used to build the module. + + + + Specifies the behavior when multiple matches are found during the command parsing stage. + + + + Indicates that when multiple results are found, an exception should be thrown. + + + Indicates that when multiple results are found, the best result should be chosen. + + + + A for parsing objects implementing . + + + This is shipped with Discord.Net and is used by default to parse any + implemented object within a command. The TypeReader will attempt to first parse the + input by mention, then the snowflake identifier, then by name; the highest candidate will be chosen as the + final output; otherwise, an erroneous is returned. + + The type to be checked; must implement . + + + + + + + + + + A for parsing objects implementing . + + The type to be checked; must implement . + + + + + + + + + must be within the range [0, 1]. + + + must be within the range [0, 1]. + + + + A for parsing objects implementing . + + The type to be checked; must implement . + + + + + + + + + + Defines a reader class that parses user input into a specified type. + + + + + Attempts to parse the into the desired type. + + The context of the command. + The raw input of the command. + The service collection used for dependency injection. + + A task that represents the asynchronous parsing operation. The task result contains the parsing result. + + + + + A for parsing objects implementing . + + The type to be checked; must implement . + + + + + + + Contains information of the command's overall execution result. + + + + + Gets the exception that may have occurred during the command execution. + + + + + + + + + + + + + + Initializes a new with no error, indicating a successful execution. + + + A that does not contain any errors. + + + + + Initializes a new with a specified and its + reason, indicating an unsuccessful execution. + + The type of error. + The reason behind the error. + + A that contains a and reason. + + + + + Initializes a new with a specified exception, indicating an unsuccessful + execution. + + The exception that caused the command execution to fail. + + A that contains the exception that caused the unsuccessful execution, along + with a of type Exception as well as the exception message as the + reason. + + + + + Initializes a new with a specified result; this may or may not be an + successful execution depending on the and + specified. + + The result to inherit from. + + A that inherits the error type and reason. + + + + + Gets a string that indicates the execution result. + + + Success if is true; otherwise ": + ". + + + + + Contains information of the result related to a command. + + + + + Describes the error type that may have occurred during the operation. + + + A indicating the type of error that may have occurred during the operation; + null if the operation was successful. + + + + + Describes the reason for the error. + + + A string containing the error reason. + + + + + Indicates whether the operation was successful or not. + + + true if the result is positive; otherwise false. + + + + + Contains information for the parsing result from the command service's parser. + + + + + + + + + + + Provides information about the parameter that caused the parsing error. + + + A indicating the parameter info of the error that may have occurred during parsing; + null if the parsing was successful or the parsing error is not specific to a single parameter. + + + + + + + + Represents a result type for command preconditions. + + + + + + + + + + + + + + Initializes a new class with the command type + and reason. + + The type of failure. + The reason of failure. + + + + Returns a with no errors. + + + + + Returns a with and the + specified reason. + + The reason of failure. + + + + Returns a with the specified type. + + The result of failure. + + + + Returns a string indicating whether the is successful. + + + + + Initializes a new class with the type of error and reason. + + The type of failure, or null if none. + The reason of failure. + + + + + + Describes the execution reason or result. + + + + + + + + + + + + + + + + + + + + + + + + + + + TypeReaderResult was not successful. + + + + Specifies the behavior of the command execution workflow. + + + + + + + The default behaviour set in . + + + + + Executes the command on the same thread as gateway one. + + + + + Executes the command on a different thread from the gateway one. + + + + + Utility class which contains the default matching pairs of quotation marks for CommandServiceConfig + + + + + A default map of open-close pairs of quotation marks. + Contains many regional and Unicode equivalents. + Used in the . + + + + + diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 3de56281fb..38cc03c8ff 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,13 +8,16 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.6 + 2.3.7 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png 2.3.2 2.3.2 + + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Core\Discord.Net.Core.xml + diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml new file mode 100644 index 0000000000..53e74814b1 --- /dev/null +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -0,0 +1,10550 @@ + + + + Discord.Net.Core + + + + + Reading this stream is not supported. + + + + Setting the length to this stream is not supported. + + + + Seeking this stream is not supported.. + + + This stream does not accept headers. + + + + Reading stream length is not supported. + + + + Getting or setting this stream position is not supported. + + + + Reading this stream is not supported. + + + + Setting the length to this stream is not supported. + + + + Seeking this stream is not supported.. + + + Gets the current connection state of this client. + + + Gets the estimated round-trip latency, in milliseconds, to the voice WebSocket server. + + + Gets the estimated round-trip latency, in milliseconds, to the voice UDP server. + + + Gets the current audio streams. + + + Creates a new outgoing stream accepting Opus-encoded data. + + + Creates a new outgoing stream accepting Opus-encoded data. This is a direct stream with no internal timer. + + + Creates a new outgoing stream accepting PCM (raw) data. + + + Creates a new direct outgoing stream accepting PCM (raw) data. This is a direct stream with no internal timer. + + + + Represents a class containing the strings related to various Content Delivery Networks (CDNs). + + + + + Returns a team icon URL. + + The team identifier. + The icon identifier. + + A URL pointing to the team's icon. + + + + + Returns an application icon URL. + + The application identifier. + The icon identifier. + + A URL pointing to the application's icon. + + + + + Returns a user avatar URL. + + The user snowflake identifier. + The avatar identifier. + The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. + The format to return. + + A URL pointing to the user's avatar in the specified size. + + + + + Returns the default user avatar URL. + + The discriminator value of a user. + + A URL pointing to the user's default avatar when one isn't set. + + + + + Returns an icon URL. + + The guild snowflake identifier. + The icon identifier. + + A URL pointing to the guild's icon. + + + + + Returns a guild splash URL. + + The guild snowflake identifier. + The splash icon identifier. + + A URL pointing to the guild's splash. + + + + + Returns a guild discovery splash URL. + + The guild snowflake identifier. + The discovery splash icon identifier. + + A URL pointing to the guild's discovery splash. + + + + + Returns a channel icon URL. + + The channel snowflake identifier. + The icon identifier. + + A URL pointing to the channel's icon. + + + + + Returns a guild banner URL. + + The guild snowflake identifier. + The banner image identifier. + The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048 inclusive. + + A URL pointing to the guild's banner image. + + + + + Returns an emoji URL. + + The emoji snowflake identifier. + Whether this emoji is animated. + + A URL pointing to the custom emote. + + + + + Returns a Rich Presence asset URL. + + The application identifier. + The asset identifier. + The size of the image to return in. This can be any power of two between 16 and 2048. + The format to return. + + A URL pointing to the asset image in the specified size. + + + + + Returns a Spotify album URL. + + The identifier for the album art (e.g. 6be8f4c8614ecf4f1dd3ebba8d8692d8ce4951ac). + + A URL pointing to the Spotify album art. + + + + + Returns a Spotify direct URL for a track. + + The identifier for the track (e.g. 4uLU6hMCjMI75M1A2tKUQC). + + A URL pointing to the Spotify track. + + + + + Represents a context of a command. This may include the client, guild, channel, user, and message. + + + + + Gets the that the command is executed with. + + + + + Gets the that the command is executed in. + + + + + Gets the that the command is executed in. + + + + + Gets the who executed the command. + + + + + Gets the that the command is interpreted from. + + + + Specifies the connection state of a client. + + + The client has disconnected from Discord. + + + The client is connecting to Discord. + + + The client has established a connection to Discord. + + + The client is disconnecting from Discord. + + + + Defines various behaviors of Discord.Net. + + + + + Returns the API version Discord.Net uses. + + + An representing the API version that Discord.Net uses to communicate with Discord. + A list of available API version can be seen on the official + Discord API documentation + . + + + + + Returns the Voice API version Discord.Net uses. + + + An representing the API version that Discord.Net uses to communicate with Discord's + voice server. + + + + + Gets the Discord.Net version, including the build number. + + + A string containing the detailed version information, including its build number; Unknown when + the version fails to be fetched. + + + + + Gets the user agent that Discord.Net uses in its clients. + + + The user agent used in each Discord.Net request. + + + + + Returns the base Discord API URL. + + + The Discord API URL using . + + + + + Returns the base Discord CDN URL. + + + The base Discord Content Delivery Network (CDN) URL. + + + + + Returns the base Discord invite URL. + + + The base Discord invite URL. + + + + + Returns the default timeout for requests. + + + The amount of time it takes in milliseconds before a request is timed out. + + + + + Returns the max length for a Discord message. + + + The maximum length of a message allowed by Discord. + + + + + Returns the max messages allowed to be in a request. + + + The maximum number of messages that can be gotten per-batch. + + + + + Returns the max users allowed to be in a request. + + + The maximum number of users that can be gotten per-batch. + + + + + Returns the max guilds allowed to be in a request. + + + The maximum number of guilds that can be gotten per-batch. + + + + + Returns the max user reactions allowed to be in a request. + + + The maximum number of user reactions that can be gotten per-batch. + + + + + Returns the max audit log entries allowed to be in a request. + + + The maximum number of audit log entries that can be gotten per-batch. + + + + + Gets or sets how a request should act in the case of an error, by default. + + + The currently set . + + + + + Gets or sets the minimum log level severity that will be sent to the Log event. + + + The currently set for logging level. + + + + + Gets or sets whether the initial log entry should be printed. + + + If set to true, the library will attempt to print the current version of the library, as well as + the API version it uses on startup. + + + + + Gets or sets the level of precision of the rate limit reset response. + + + If set to , this value will be rounded up to the + nearest second. + + + The currently set . + + + + + Gets or sets whether or not rate-limits should use the system clock. + + + If set to false, we will use the X-RateLimit-Reset-After header + to determine when a rate-limit expires, rather than comparing the + X-RateLimit-Reset timestamp to the system time. + + This should only be changed to false if the system is known to have + a clock that is out of sync. Relying on the Reset-After header will + incur network lag. + + Regardless of this property, we still rely on the system's wall-clock + to determine if a bucket is rate-limited; we do not use any monotonic + clock. Your system will still need a stable clock. + + + + + Flags for the property, that are ORd together. + These describe what the activity payload includes. + + + + + Indicates that no actions on this activity can be taken. + + + + + Indicates that this activity can be joined. + + + + + Indicates that this activity can be spectated. + + + + + Indicates that a user may request to join an activity. + + + + + Indicates that a user can listen along in Spotify. + + + + + Indicates that a user can play this song. + + + + + Specifies a Discord user's activity type. + + + + + The user is playing a game. + + + + + The user is streaming online. + + + + + The user is listening to a song. + + + + + The user is watching some form of media. + + + + + The user has set a custom status. + + + + + A user's activity for their custom status. + + + + + Gets the emote, if it is set. + + + An containing the or set by the user. + + + + + Gets the timestamp of when this status was created. + + + A containing the time when this status was created. + + + + + Gets the state of the status. + + + + + A user's game status. + + + + + + + + + + + + + + + + + Creates a with the provided name and . + + The name of the game. + The type of activity. + + + Returns the name of the . + + + + An asset for a object containing the text and image. + + + + + Gets the description of the asset. + + + A string containing the description of the asset. + + + + + Gets the image ID of the asset. + + + A string containing the unique image identifier of the asset. + + + + + Returns the image URL of the asset. + + The size of the image to return in. This can be any power of two between 16 and 2048. + The format to return. + + A string pointing to the image URL of the asset; null when the application ID does not exist. + + + + + Party information for a object. + + + + + Gets the ID of the party. + + + A string containing the unique identifier of the party. + + + + + Gets the party's current and maximum size. + + + A representing the capacity of the party. + + + + + Party secret for a object. + + + + + Gets the secret for a specific instanced match. + + + + + Gets the secret for joining a party. + + + + + Gets the secret for spectating a game. + + + + + Timestamps for a object. + + + + + Gets when the activity started. + + + + + Gets when the activity ends. + + + + + A user's activity status, typically a . + + + + + Gets the name of the activity. + + + A string containing the name of the activity that the user is doing. + + + + + Gets the type of the activity. + + + The type of activity. + + + + + Gets the flags that are relevant to this activity. + + + This value is determined by bitwise OR-ing values together. + + + The value of flags for this activity. + + + + + Gets the details on what the player is currently doing. + + + A string describing what the player is doing. + + + + + A user's Rich Presence status. + + + + + Gets the user's current party status. + + + + + Gets the application ID for the game. + + + + + Gets the small image for the presence and their hover texts. + + + + + Gets the large image for the presence and their hover texts. + + + + + Gets the information for the current party of the player. + + + + + Gets the secrets for Rich Presence joining and spectating. + + + + + Gets the timestamps for start and/or end of the game. + + + + + Returns the name of the Rich Presence. + + + + + A user's activity for listening to a song on Spotify. + + + + + Gets the song's artist(s). + + + A collection of string containing all artists featured in the track (e.g. Avicii; Rita Ora). + + + + + Gets the Spotify album title of the song. + + + A string containing the name of the album (e.g. AVĪCI (01)). + + + + + Gets the track title of the song. + + + A string containing the name of the song (e.g. Lonely Together (feat. Rita Ora)). + + + + + Gets the date when the track started playing. + + + A containing the start timestamp of the song. + + + + + Gets the date when the track ends. + + + A containing the finish timestamp of the song. + + + + + Gets the duration of the song. + + + A containing the duration of the song. + + + + + Gets the elapsed duration of the song. + + + A containing the elapsed duration of the song. + + + + + Gets the remaining duration of the song. + + + A containing the remaining duration of the song. + + + + + Gets the track ID of the song. + + + A string containing the Spotify ID of the track (e.g. 7DoN0sCGIT9IcLrtBDm4f0). + + + + + Gets the session ID of the song. + + + The purpose of this property is currently unknown. + + + A string containing the session ID. + + + + + Gets the URL of the album art. + + + A URL pointing to the album art of the track (e.g. + https://i.scdn.co/image/ba2fd8823d42802c2f8738db0b33a4597f2f39e7). + + + + + Gets the direct Spotify URL of the track. + + + A URL pointing directly to the track on Spotify. (e.g. + https://open.spotify.com/track/7DoN0sCGIT9IcLrtBDm4f0). + + + + + Gets the full information of the song. + + + A string containing the full information of the song (e.g. + Avicii, Rita Ora - Lonely Together (feat. Rita Ora) (3:08) + + + + + A user's activity for streaming on services such as Twitch. + + + + + Gets the URL of the stream. + + + + + Creates a new based on the on the stream URL. + + The name of the stream. + The URL of the stream. + + + + Gets the name of the stream. + + + + + Representing a type of action within an . + + + + + this guild was updated. + + + + + A channel was created. + + + + + A channel was updated. + + + + + A channel was deleted. + + + + + A permission overwrite was created for a channel. + + + + + A permission overwrite was updated for a channel. + + + + + A permission overwrite was deleted for a channel. + + + + + A user was kicked from this guild. + + + + + A prune took place in this guild. + + + + + A user banned another user from this guild. + + + + + A user unbanned another user from this guild. + + + + + A guild member whose information was updated. + + + + + A guild member's role collection was updated. + + + + + A guild member moved to a voice channel. + + + + + A guild member disconnected from a voice channel. + + + + + A bot was added to this guild. + + + + + A role was created in this guild. + + + + + A role was updated in this guild. + + + + + A role was deleted from this guild. + + + + + An invite was created in this guild. + + + + + An invite was updated in this guild. + + + + + An invite was deleted from this guild. + + + + + A Webhook was created in this guild. + + + + + A Webhook was updated in this guild. + + + + + A Webhook was deleted from this guild. + + + + + An emoji was created in this guild. + + + + + An emoji was updated in this guild. + + + + + An emoji was deleted from this guild. + + + + + A message was deleted from this guild. + + + + + Multiple messages were deleted from this guild. + + + + + A message was pinned from this guild. + + + + + A message was unpinned from this guild. + + + + + Represents data applied to an . + + + + + Represents a generic audit log entry. + + + + + Gets the action which occurred to create this entry. + + + The type of action for this audit log entry. + + + + + Gets the data for this entry. + + + An for this audit log entry; null if no data is available. + + + + + Gets the user responsible for causing the changes. + + + A user object. + + + + + Gets the reason behind the change. + + + A string containing the reason for the change; null if none is provided. + + + + + Specifies the cache mode that should be used. + + + + + Allows the object to be downloaded if it does not exist in the current cache. + + + + + Only allows the object to be pulled from the existing cache. + + + + Defines the types of channels. + + + The channel is a text channel. + + + The channel is a Direct Message channel. + + + The channel is a voice channel. + + + The channel is a group channel. + + + The channel is a category channel. + + + The channel is a news channel. + + + + Specifies the direction of where message(s) should be retrieved from. + + + This enum is used to specify the direction for retrieving messages. + + At the time of writing, is not yet implemented into + . + Attempting to use the method with will throw + a . + + + + + + The message(s) should be retrieved before a message. + + + + + The message(s) should be retrieved after a message. + + + + + The message(s) should be retrieved around a message. + + + + + Properties that are used to modify an with the specified changes. + + + + + + Gets or sets the channel to this name. + + + This property defines the new name for this channel. + + When modifying an , the must be alphanumeric with + dashes. It must match the RegEx [a-z0-9-_]{2,100}. + + + + + + Moves the channel to the following position. This property is zero-based. + + + + + Gets or sets the category ID for this channel. + + + Setting this value to a category's snowflake identifier will change or set this channel's parent to the + specified channel; setting this value to will detach this channel from its parent if one + is set. + + + + + Gets or sets the permission overwrites for this channel. + + + + + Represents a generic audio channel. + + + + + Connects to this audio channel. + + Determines whether the client should deaf itself upon connection. + Determines whether the client should mute itself upon connection. + Determines whether the audio client is an external one or not. + + A task representing the asynchronous connection operation. The task result contains the + responsible for the connection. + + + + + Disconnects from this audio channel. + + + A task representing the asynchronous operation for disconnecting from the audio channel. + + + + + Represents a generic category channel. + + + + + Represents a generic channel. + + + + + Gets the name of this channel. + + + A string containing the name of this channel. + + + + + Gets a collection of users that are able to view the channel or are currently in this channel. + + + + The returned collection is an asynchronous enumerable object; one must call + to access the individual messages as a + collection. + + This method will attempt to fetch all users that is able to view this channel or is currently in this channel. + The library will attempt to split up the requests according to and . + In other words, if there are 3000 users, and the constant + is 1000, the request will be split into 3 individual requests; thus returning 53individual asynchronous + responses, hence the need of flattening. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + Paged collection of users. + + + + + Gets a user in this channel. + + The snowflake identifier of the user (e.g. 168693960628371456). + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a user object that + represents the found user; null if none is found. + + + + + Represents a generic direct-message channel. + + + + + Gets the recipient of all messages in this channel. + + + A user object that represents the other user in this channel. + + + + + Closes this private channel, removing it from your channel list. + + The options to be used when sending the request. + + A task that represents the asynchronous close operation. + + + + + Represents a generic private group channel. + + + + + Leaves this group. + + The options to be used when sending the request. + + A task that represents the asynchronous leave operation. + + + + + Represents a generic guild channel. + + + + + + + + Gets the position of this channel. + + + An representing the position of this channel in the guild's channel list relative to + others of the same type. + + + + + Gets the guild associated with this channel. + + + A guild object that this channel belongs to. + + + + + Gets the guild ID associated with this channel. + + + An representing the guild snowflake identifier for the guild that this channel + belongs to. + + + + + Gets a collection of permission overwrites for this channel. + + + A collection of overwrites associated with this channel. + + + + + Modifies this guild channel. + + + This method modifies the current guild channel with the specified properties. To see an example of this + method and what properties are available, please refer to . + + The delegate containing the properties to modify the channel with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Gets the permission overwrite for a specific role. + + The role to get the overwrite from. + + An overwrite object for the targeted role; null if none is set. + + + + + Gets the permission overwrite for a specific user. + + The user to get the overwrite from. + + An overwrite object for the targeted user; null if none is set. + + + + + Removes the permission overwrite for the given role, if one exists. + + The role to remove the overwrite from. + The options to be used when sending the request. + + A task representing the asynchronous operation for removing the specified permissions from the channel. + + + + + Removes the permission overwrite for the given user, if one exists. + + The user to remove the overwrite from. + The options to be used when sending the request. + + A task representing the asynchronous operation for removing the specified permissions from the channel. + + + + + Adds or updates the permission overwrite for the given role. + + + The following example fetches a role via and a channel via + . Next, it checks if an overwrite had already been set via + ; if not, it denies the role from sending any + messages to the channel. + + + The role to add the overwrite to. + The overwrite to add to the role. + The options to be used when sending the request. + + A task representing the asynchronous permission operation for adding the specified permissions to the + channel. + + + + + Adds or updates the permission overwrite for the given user. + + + The following example fetches a user via and a channel via + . Next, it checks if an overwrite had already been set via + ; if not, it denies the user from sending any + messages to the channel. + + + The user to add the overwrite to. + The overwrite to add to the user. + The options to be used when sending the request. + + A task representing the asynchronous permission operation for adding the specified permissions to the channel. + + + + + Gets a collection of users that are able to view the channel or are currently in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + Paged collection of users. + + + + + Gets a user in this channel. + + The snowflake identifier of the user. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task representing the asynchronous get operation. The task result contains a guild user object that + represents the user; null if none is found. + + + + + Represents a generic channel that can send and receive messages. + + + + + Sends a message to this message channel. + + + The following example sends a message with the current system time in RFC 1123 format to the channel and + deletes itself after 5 seconds. + + + The message to be sent. + Determines whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Sends a file to this message channel with an optional caption. + + + The following example uploads a local file called wumpus.txt along with the text + good discord boi to the channel. + + The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the + channel. + + + + This method sends a file as if you are uploading an attachment directly from your Discord client. + + If you wish to upload an image and have it embedded in a embed, + you may upload the file and refer to the file with "attachment://filename.ext" in the + . See the example section for its usage. + + + The file path of the file. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + Whether the message attachment should be hidden as a spoiler. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Sends a file to this message channel with an optional caption. + + + The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a + rich embed to the channel. + + + + This method sends a file as if you are uploading an attachment directly from your Discord client. + + If you wish to upload an image and have it embedded in a embed, + you may upload the file and refer to the file with "attachment://filename.ext" in the + . See the example section for its usage. + + + The of the file to be sent. + The name of the attachment. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + Whether the message attachment should be hidden as a spoiler. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Gets a message from this message channel. + + The snowflake identifier of the message. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents an asynchronous get operation for retrieving the message. The task result contains + the retrieved message; null if no message is found with the specified identifier. + + + + + Gets the last N messages from this message channel. + + + + The returned collection is an asynchronous enumerable object; one must call + to access the individual messages as a + collection. + + + Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual + rate limit, causing your bot to freeze! + + This method will attempt to fetch the number of messages specified under . The + library will attempt to split up the requests according to your and + . In other words, should the user request 500 messages, + and the constant is 100, the request will + be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need + of flattening. + + + The following example downloads 300 messages and gets messages that belong to the user + 53905483156684800. + + + The numbers of message to be gotten from. + The that determines whether the object should be fetched from + cache. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + + The returned collection is an asynchronous enumerable object; one must call + to access the individual messages as a + collection. + + + Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual + rate limit, causing your bot to freeze! + + This method will attempt to fetch the number of messages specified under around + the message depending on the . The library will + attempt to split up the requests according to your and + . In other words, should the user request 500 messages, + and the constant is 100, the request will + be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need + of flattening. + + + The following example gets 5 message prior to the message identifier 442012544660537354. + + The following example attempts to retrieve messageCount number of messages from the + beginning of the channel and prints them to the console. + + + The ID of the starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The that determines whether the object should be fetched from + cache. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + + The returned collection is an asynchronous enumerable object; one must call + to access the individual messages as a + collection. + + + Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual + rate limit, causing your bot to freeze! + + This method will attempt to fetch the number of messages specified under around + the message depending on the . The library will + attempt to split up the requests according to your and + . In other words, should the user request 500 messages, + and the constant is 100, the request will + be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need + of flattening. + + + The following example gets 5 message prior to a specific message, oldMessage. + + + The starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The that determines whether the object should be fetched from + cache. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of pinned messages in this channel. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation for retrieving pinned messages in this channel. + The task result contains a collection of messages found in the pinned messages. + + + + + Deletes a message. + + The snowflake identifier of the message that would be removed. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + + + Deletes a message based on the provided message in this channel. + The message that would be removed. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + + + + Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. + + The options to be used when sending the request. + + A task that represents the asynchronous operation that triggers the broadcast. + + + + + Continuously broadcasts the "user is typing" message to all users in this channel until the returned + object is disposed. + + + The following example keeps the client in the typing state until LongRunningAsync has finished. + + + The options to be used when sending the request. + + A disposable object that, upon its disposal, will stop the client from broadcasting its typing state in + this channel. + + + + + Represents a type of guild channel that can be nested within a category. + + + + + Gets the parent (category) ID of this channel in the guild's channel list. + + + A representing the snowflake identifier of the parent of this channel; + null if none is set. + + + + + Gets the parent (category) channel of this channel. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the category channel + representing the parent of this channel; null if none is set. + + + + + Syncs the permissions of this nested channel with its parent's. + + The options to be used when sending the request. + + A task that represents the asynchronous operation for syncing channel permissions with its parent's. + + + + + Creates a new invite to this channel. + + + The following example creates a new invite to this channel; the invite lasts for 12 hours and can only + be used 3 times throughout its lifespan. + + await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); + + + The time (in seconds) until the invite expires. Set to null to never expire. + The max amount of times this invite may be used. Set to null to have unlimited uses. + If true, the user accepting this invite will be kicked from the guild after closing their client. + If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). + The options to be used when sending the request. + + A task that represents the asynchronous invite creation operation. The task result contains an invite + metadata object containing information for the created invite. + + + + + Gets a collection of all invites to this channel. + B + + The following example gets all of the invites that have been created in this channel and selects the + most used invite. + + var invites = await channel.GetInvitesAsync(); + if (invites.Count == 0) return; + var invite = invites.OrderByDescending(x => x.Uses).FirstOrDefault(); + + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of invite metadata that are created for this channel. + + + + + Represents a generic news channel in a guild that can send and receive messages. + + + + + Represents a generic channel that is private to select recipients. + + + + + Gets the users that can access this channel. + + + A read-only collection of users that can access this channel. + + + + + Represents a generic channel in a guild that can send and receive messages. + + + + + Gets a value that indicates whether the channel is NSFW. + + + true if the channel has the NSFW flag enabled; otherwise false. + + + + + Gets the current topic for this text channel. + + + A string representing the topic set in the channel; null if none is set. + + + + + Gets the current slow-mode delay for this channel. + + + An representing the time in seconds required before the user can send another + message; 0 if disabled. + + + + + Bulk-deletes multiple messages. + + + The following example gets 250 messages from the channel and deletes them. + + var messages = await textChannel.GetMessagesAsync(250).FlattenAsync(); + await textChannel.DeleteMessagesAsync(messages); + + + + This method attempts to remove the messages specified in bulk. + + Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! + + + The messages to be bulk-deleted. + The options to be used when sending the request. + + A task that represents the asynchronous bulk-removal operation. + + + + + Bulk-deletes multiple messages. + + + This method attempts to remove the messages specified in bulk. + + Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! + + + The snowflake identifier of the messages to be bulk-deleted. + The options to be used when sending the request. + + A task that represents the asynchronous bulk-removal operation. + + + + + Modifies this text channel. + + The delegate containing the properties to modify the channel with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + + Creates a webhook in this text channel. + + The name of the webhook. + The avatar of the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + webhook. + + + + + Gets a webhook available in this text channel. + + The identifier of the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a webhook associated + with the identifier; null if the webhook is not found. + + + + + Gets the webhooks available in this text channel. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of webhooks that is available in this channel. + + + + + Represents a generic voice channel in a guild. + + + + + Gets the bit-rate that the clients in this voice channel are requested to use. + + + An representing the bit-rate (bps) that this voice channel defines and requests the + client(s) to use. + + + + + Gets the max number of users allowed to be connected to this channel at once. + + + An representing the maximum number of users that are allowed to be connected to this + channel at once; null if a limit is not set. + + + + + Modifies this voice channel. + + The properties to modify the channel with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + + Provides properties that are used to reorder an . + + + + + Gets the ID of the channel to apply this position to. + + + A representing the snowflake identifier of this channel. + + + + + Gets the new zero-based position of this channel. + + + An representing the new position of this channel. + + + + Initializes a new instance of the class used to reorder a channel. + Sets the ID of the channel to apply this position to. + Sets the new zero-based position of this channel. + + + + Provides properties that are used to modify an with the specified changes. + + + + + + Gets or sets the topic of the channel. + + + Setting this value to any string other than null or will set the + channel topic or description to the desired value. + + + + + Gets or sets whether this channel should be flagged as NSFW. + + + Setting this value to true will mark the channel as NSFW (Not Safe For Work) and will prompt the + user about its possibly mature nature before they may view the channel; setting this value to false will + remove the NSFW indicator. + + + + + Gets or sets the slow-mode ratelimit in seconds for this channel. + + + Setting this value to anything above zero will require each user to wait X seconds before + sending another message; setting this value to 0 will disable slow-mode for this channel. + + Users with or + will be exempt from slow-mode. + + + Thrown if the value does not fall within [0, 21600]. + + + + Provides properties that are used to modify an with the specified changes. + + + + + Gets or sets the bitrate of the voice connections in this channel. Must be greater than 8000. + + + + + Gets or sets the maximum number of users that can be present in a channel, or null if none. + + + + + A Unicode emoji. + + + + + + + + Gets the Unicode representation of this emote. + + + A string that resolves to . + + + + + Initializes a new class with the provided Unicode. + + The pure UTF-8 encoding of an emoji. + + + + Determines whether the specified emoji is equal to the current one. + + The object to compare with the current object. + + + + + + + A custom image-based emote. + + + + + + + + + + + Gets whether this emote is animated. + + + A boolean that determines whether or not this emote is an animated one. + + + + + + + + Gets the image URL of this emote. + + + A string that points to the URL of this emote. + + + + + Determines whether the specified emote is equal to the current emote. + + The object to compare with the current object. + + + + + + Parses an from its raw format. + The raw encoding of an emote (e.g. <:dab:277855270321782784>). + An emote. + Invalid emote format. + + + Tries to parse an from its raw format. + The raw encoding of an emote; for example, <:dab:277855270321782784>. + An emote. + + + + Returns the raw representation of the emote. + + + A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). + + + + + Provides properties that are used to modify an with the specified changes. + + + + + + Gets or sets the name of the . + + + + + Gets or sets the roles that can access this . + + + + + An image-based emote that is attached to a guild. + + + + + Gets whether this emoji is managed by an integration. + + + A boolean that determines whether or not this emote is managed by a Twitch integration. + + + + + Gets whether this emoji must be wrapped in colons. + + + A boolean that determines whether or not this emote requires the use of colons in chat to be used. + + + + + Gets the roles that are allowed to use this emoji. + + + A read-only list containing snowflake identifiers for roles that are allowed to use this emoji. + + + + + Gets the user ID associated with the creation of this emoji. + + + An snowflake identifier representing the user who created this emoji; + null if unknown. + + + + + Gets the raw representation of the emote. + + + A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). + + + + + Represents a general container for any type of emote in a message. + + + + + Gets the display name or Unicode representation of this emote. + + + A string representing the display name or the Unicode representation (e.g. 🤔) of this emote. + + + + + Stores the gateway information related to the current bot. + + + + + Gets the WSS URL that can be used for connecting to the gateway. + + + + + Gets the recommended number of shards to use when connecting. + + + + + Gets the that contains the information + about the current session start limit. + + + + + Stores the information related to the gateway identify request. + + + + + Gets the total number of session starts the current user is allowed. + + + The maximum amount of session starts the current user is allowed. + + + + + Gets the remaining number of session starts the current user is allowed. + + + The remaining amount of session starts the current user is allowed. + + + + + Gets the number of milliseconds after which the limit resets. + + + The milliseconds until the limit resets back to the . + + + + + Gets the maximum concurrent identify requests in a time window. + + + The maximum concurrent identify requests in a time window, + limited to the same rate limit key. + + + + + Specifies the default message notification behavior the guild uses. + + + + + By default, all messages will trigger notifications. + + + + + By default, only mentions will trigger notifications. + + + + No messages will be scanned. + + + Scans messages from all guild members that do not have a role. + Recommented option for servers that use roles for trusted membership. + + + Scan messages sent by all guild members. + + + + Provides properties that are used to modify the widget of an with the specified changes. + + + + + Sets whether the widget should be enabled. + + + + + Sets the channel that the invite should place its users in, if not null. + + + + + Sets the channel the invite should place its users in, if not null. + + + + + Provides properties used to modify an with the specified changes. + + + + + Gets or sets the behavior when an integration subscription lapses. + + + + + Gets or sets the period (in seconds) where the integration will ignore lapsed subscriptions. + + + + + Gets or sets whether emoticons should be synced for this integration. + + + + + Provides properties that are used to modify an with the specified changes. + + + + + + Gets or sets the name of the guild. Must be within 100 characters. + + + + + Gets or sets the region for the guild's voice connections. + + + + + Gets or sets the ID of the region for the guild's voice connections. + + + + + Gets or sets the verification level new users need to achieve before speaking. + + + + + Gets or sets the default message notification state for the guild. + + + + + Gets or sets how many seconds before a user is sent to AFK. This value MUST be one of: (60, 300, 900, + 1800, 3600). + + + + + Gets or sets the icon of the guild. + + + + + Gets or sets the banner of the guild. + + + + + Gets or sets the guild's splash image. + + + The guild must be partnered for this value to have any effect. + + + + + Gets or sets the where AFK users should be sent. + + + + + Gets or sets the ID of the where AFK users should be sent. + + + + + Gets or sets the where system messages should be sent. + + + + + Gets or sets the ID of the where system messages should be sent. + + + + + Gets or sets the owner of this guild. + + + + + Gets or sets the ID of the owner of this guild. + + + + + Gets or sets the explicit content filter level of this guild. + + + + + Gets or sets the flags that DISABLE types of system channel messages. + + + These flags are inverted. Setting a flag will disable that system channel message from being sent. + A value of will allow all system channel message types to be sent, + given that the has also been set. + A value of will deny guild boost messages from being sent, and allow all + other types of messages. + Refer to the extension methods and + to check if these system channel message types + are enabled, without the need to manipulate the logic of the flag. + + + + + Gets or sets the preferred locale of the guild in IETF BCP 47 language tag format. + + + This property takes precedence over . + When it is set, the value of + will not be used. + + + + + Gets or sets the preferred locale of the guild. + + + The property takes precedence + over this property. When is set, + the value of will be unused. + + + + + Provides properties that are used to modify the widget of an with the specified changes. + + + + + Sets whether the widget should be enabled. + + + + + Sets the channel that the invite should place its users in, if not . + + + + + Sets the channel that the invite should place its users in, if not . + + + + + Represents a generic ban object. + + + + + Gets the banned user. + + + A user that was banned. + + + + + Gets the reason why the user is banned if specified. + + + A string containing the reason behind the ban; null if none is specified. + + + + + Represents a generic guild/server. + + + + + Gets the name of this guild. + + + A string containing the name of this guild. + + + + + Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are + automatically moved to the AFK voice channel. + + + An representing the amount of time in seconds for a user to be marked as inactive + and moved into the AFK voice channel. + + + + + Gets a value that indicates whether this guild is embeddable (i.e. can use widget). + + + if this guild has a widget enabled; otherwise . + + + + + Gets a value that indicates whether this guild has the widget enabled. + + + if this guild has a widget enabled; otherwise . + + + + + Gets the default message notifications for users who haven't explicitly set their notification settings. + + + + + Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to + perform administrative actions in this guild. + + + The level of MFA requirement. + + + + + Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. + + + The level of requirements. + + + + + Gets the level of content filtering applied to user's content in a Guild. + + + The level of explicit content filtering. + + + + + Gets the ID of this guild's icon. + + + An identifier for the splash image; if none is set. + + + + + Gets the URL of this guild's icon. + + + A URL pointing to the guild's icon; if none is set. + + + + + Gets the ID of this guild's splash image. + + + An identifier for the splash image; if none is set. + + + + + Gets the URL of this guild's splash image. + + + A URL pointing to the guild's splash image; if none is set. + + + + + Gets the ID of this guild's discovery splash image. + + + An identifier for the discovery splash image; if none is set. + + + + + Gets the URL of this guild's discovery splash image. + + + A URL pointing to the guild's discovery splash image; if none is set. + + + + + Determines if this guild is currently connected and ready to be used. + + + + This property only applies to a WebSocket-based client. + + This boolean is used to determine if the guild is currently connected to the WebSocket and is ready to be used/accessed. + + + true if this guild is currently connected and ready to be used; otherwise . + + + + + Gets the ID of the AFK voice channel for this guild. + + + A representing the snowflake identifier of the AFK voice channel; if + none is set. + + + + + Gets the ID of the default channel for this guild. + + + This property retrieves the snowflake identifier of the first viewable text channel for this guild. + + This channel does not guarantee the user can send message to it, as it only looks for the first viewable + text channel. + + + + A representing the snowflake identifier of the default text channel; 0 if + none can be found. + + + + + Gets the ID of the widget embed channel of this guild. + + + A representing the snowflake identifier of the embedded channel found within the + widget settings of this guild; if none is set. + + + + + Gets the ID of the channel assigned to the widget of this guild. + + + A representing the snowflake identifier of the channel assigned to the widget found + within the widget settings of this guild; if none is set. + + + + + Gets the ID of the channel where randomized welcome messages are sent. + + + A representing the snowflake identifier of the system channel where randomized + welcome messages are sent; if none is set. + + + + + Gets the ID of the channel with the rules. + + + A representing the snowflake identifier of the channel that contains the rules; + if none is set. + + + + + Gets the ID of the channel where admins and moderators of Community guilds receive notices from Discord. + + + A representing the snowflake identifier of the channel where admins and moderators + of Community guilds receive notices from Discord; if none is set. + + + + + Gets the ID of the user that owns this guild. + + + A representing the snowflake identifier of the user that owns this guild. + + + + + Gets the application ID of the guild creator if it is bot-created. + + + A representing the snowflake identifier of the application ID that created this guild, or if it was not bot-created. + + + + + Gets the ID of the region hosting this guild's voice channels. + + + A string containing the identifier for the voice region that this guild uses (e.g. eu-central). + + + + + Gets the currently associated with this guild. + + + An currently associated with this guild. + + + + + Gets the built-in role containing all users in this guild. + + + A role object that represents an @everyone role in this guild. + + + + + Gets a collection of all custom emotes for this guild. + + + A read-only collection of all custom emotes for this guild. + + + + + Gets a collection of all extra features added to this guild. + + + A read-only collection of enabled features in this guild. + + + + + Gets a collection of all roles in this guild. + + + A read-only collection of roles found within this guild. + + + + + Gets the tier of guild boosting in this guild. + + + The tier of guild boosting in this guild. + + + + + Gets the identifier for this guilds banner image. + + + An identifier for the banner image; if none is set. + + + + + Gets the URL of this guild's banner image. + + + A URL pointing to the guild's banner image; if none is set. + + + + + Gets the code for this guild's vanity invite URL. + + + A string containing the vanity invite code for this guild; if none is set. + + + + + Gets the flags for the types of system channel messages that are disabled. + + + The flags for the types of system channel messages that are disabled. + + + + + Gets the description for the guild. + + + The description for the guild; if none is set. + + + + + Gets the number of premium subscribers of this guild. + + + This is the number of users who have boosted this guild. + + + The number of premium subscribers of this guild; if not available. + + + + + Gets the maximum number of presences for the guild. + + + The maximum number of presences for the guild. + + + + + Gets the maximum number of members for the guild. + + + The maximum number of members for the guild. + + + + + Gets the maximum amount of users in a video channel. + + + The maximum amount of users in a video channel. + + + + + Gets the approximate number of members in this guild. + + + Only available when getting a guild via REST when `with_counts` is true. + + + The approximate number of members in this guild. + + + + + Gets the approximate number of non-offline members in this guild. + + + Only available when getting a guild via REST when `with_counts` is true. + + + The approximate number of non-offline members in this guild. + + + + + Gets the preferred locale of this guild in IETF BCP 47 + language tag format. + + + The preferred locale of the guild in IETF BCP 47 + language tag format. + + + + + Gets the preferred culture of this guild. + + + The preferred culture information of this guild. + + + + + Modifies this guild. + + The delegate containing the properties to modify the guild with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Modifies this guild's embed channel. + + The delegate containing the properties to modify the guild widget with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Modifies this guild's widget. + + The delegate containing the properties to modify the guild widget with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Bulk-modifies the order of channels in this guild. + + The properties used to modify the channel positions with. + The options to be used when sending the request. + + A task that represents the asynchronous reorder operation. + + + + + Bulk-modifies the order of roles in this guild. + + The properties used to modify the role positions with. + The options to be used when sending the request. + + A task that represents the asynchronous reorder operation. + + + + + Leaves this guild. + + + This method will make the currently logged-in user leave the guild. + + If the user is the owner of this guild, use instead. + + + The options to be used when sending the request. + + A task that represents the asynchronous leave operation. + + + + + Gets a collection of all users banned in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + ban objects that this guild currently possesses, with each object containing the user banned and reason + behind the ban. + + + + + Gets a ban object for a banned user. + + The banned user. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a ban object, which + contains the user information and the reason for the ban; if the ban entry cannot be found. + + + + + Gets a ban object for a banned user. + + The snowflake identifier for the banned user. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a ban object, which + contains the user information and the reason for the ban; if the ban entry cannot be found. + + + + + Bans the user from this guild and optionally prunes their recent messages. + + The user to ban. + The number of days to remove messages from this user for, and this number must be between [0, 7]. + The reason of the ban to be written in the audit log. + The options to be used when sending the request. + is not between 0 to 7. + + A task that represents the asynchronous add operation for the ban. + + + + + Bans the user from this guild and optionally prunes their recent messages. + + The snowflake ID of the user to ban. + The number of days to remove messages from this user for, and this number must be between [0, 7]. + The reason of the ban to be written in the audit log. + The options to be used when sending the request. + is not between 0 to 7. + + A task that represents the asynchronous add operation for the ban. + + + + + Unbans the user if they are currently banned. + + The user to be unbanned. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation for the ban. + + + + + Unbans the user if they are currently banned. + + The snowflake identifier of the user to be unbanned. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation for the ban. + + + + + Gets a collection of all channels in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + generic channels found within this guild. + + + + + Gets a channel in this guild. + + The snowflake identifier for the channel. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the generic channel + associated with the specified ; if none is found. + + + + + Gets a collection of all text channels in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + message channels found within this guild. + + + + + Gets a text channel in this guild. + + The snowflake identifier for the text channel. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel + associated with the specified ; if none is found. + + + + + Gets a collection of all voice channels in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + voice channels found within this guild. + + + + + Gets a collection of all category channels in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + category channels found within this guild. + + + + + Gets a voice channel in this guild. + + The snowflake identifier for the voice channel. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the voice channel associated + with the specified ; if none is found. + + + + + Gets the AFK voice channel in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the voice channel that the + AFK users will be moved to after they have idled for too long; if none is set. + + + + + Gets the system channel where randomized welcome messages are sent in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel where + randomized welcome messages will be sent to; if none is set. + + + + + Gets the first viewable text channel in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the first viewable text + channel in this guild; if none is found. + + + + + Gets the embed channel (i.e. the channel set in the guild's widget settings) in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the embed channel set + within the server's widget settings; if none is set. + + + + + Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the widget channel set + within the server's widget settings; if none is set. + + + + + Gets the text channel where Community guilds can display rules and/or guidelines. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel + where Community guilds can display rules and/or guidelines; if none is set. + + + + + Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel channel where + admins and moderators of Community guilds receive notices from Discord; if none is set. + + + + + Creates a new text channel in this guild. + + + The following example creates a new text channel under an existing category named Wumpus with a set topic. + + + The new name for the text channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + text channel. + + + + + Creates a new voice channel in this guild. + + The new name for the voice channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + voice channel. + + + + + Creates a new channel category in this guild. + + The new name for the category. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + category channel. + + + + + Gets a collection of all the voice regions this guild can access. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + voice regions the guild can access. + + + + + Gets a collection of all invites in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + invite metadata, each representing information for an invite found within this guild. + + + + + Gets the vanity invite URL of this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the partial metadata of + the vanity invite found within this guild; if none is found. + + + + + Gets a role in this guild. + + The snowflake identifier for the role. + + A role that is associated with the specified ; if none is found. + + + + + Creates a new role with the provided name. + + The new name for the role. + The guild permission that the role should possess. + The color of the role. + Whether the role is separated from others on the sidebar. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + role. + + + + + Creates a new role with the provided name. + + The new name for the role. + The guild permission that the role should possess. + The color of the role. + Whether the role is separated from others on the sidebar. + Whether the role can be mentioned. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + role. + + + + + Adds a user to this guild. + + + This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. + + The snowflake identifier of the user. + The OAuth2 access token for the user, requested with the guilds.join scope. + The delegate containing the properties to be applied to the user upon being added to the guild. + The options to be used when sending the request. + A guild user associated with the specified ; if the user is already in the guild. + + + + Gets a collection of all users in this guild. + + + This method retrieves all users found within this guild. + + This may return an incomplete collection in the WebSocket implementation due to how Discord does not + send a complete user list for large guilds. + + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a collection of guild + users found within this guild. + + + + + Gets a user from this guild. + + + This method retrieves a user found within this guild. + + This may return in the WebSocket implementation due to incomplete user collection in + large guilds. + + + The snowflake identifier of the user. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the guild user + associated with the specified ; if none is found. + + + + + Gets the current user for this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the currently logged-in + user within this guild. + + + + + Gets the owner of this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the owner of this guild. + + + + + Downloads all users for this guild if the current list is incomplete. + + + This method downloads all users found within this guild throught the Gateway and caches them. + + + A task that represents the asynchronous download operation. + + + + + Prunes inactive users. + + + + This method removes all users that have not logged on in the provided number of . + + + If is true, this method will only return the number of users that + would be removed without kicking the users. + + + The number of days required for the users to be kicked. + Whether this prune action is a simulation. + The options to be used when sending the request. + An array of role IDs to be included in the prune of users who do not have any additional roles. + + A task that represents the asynchronous prune operation. The task result contains the number of users to + be or has been removed from this guild. + + + + + Gets a collection of users in this guild that the name or nickname starts with the + provided at . + + + The can not be higher than . + + The partial name or nickname to search. + The maximum number of users to be gotten. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a collection of guild + users that the name or nickname starts with the provided at . + + + + + Gets the specified number of audit log entries for this guild. + + The number of audit log entries to fetch. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + The audit log entry ID to get entries before. + The type of actions to filter. + The user ID to filter entries for. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of the requested audit log entries. + + + + + Gets a webhook found within this guild. + + The identifier for the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the webhook with the + specified ; if none is found. + + + + + Gets a collection of all webhook from this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of webhooks found within the guild. + + + + + Gets a specific emote from this guild. + + The snowflake identifier for the guild emote. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the emote found with the + specified ; if none is found. + + + + + Creates a new in this guild. + + The name of the guild emote. + The image of the new emote. + The roles to limit the emote usage to. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created emote. + + + + + Modifies an existing in this guild. + + The emote to be modified. + The delegate containing the properties to modify the emote with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. The task result contains the modified + emote. + + + + + Deletes an existing from this guild. + + The emote to delete. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + + + + Holds information for a guild integration feature. + + + + + Gets the integration ID. + + + An representing the unique identifier value of this integration. + + + + + Gets the integration name. + + + A string containing the name of this integration. + + + + + Gets the integration type (Twitch, YouTube, etc). + + + A string containing the name of the type of integration. + + + + + Gets a value that indicates whether this integration is enabled or not. + + + true if this integration is enabled; otherwise false. + + + + + Gets a value that indicates whether this integration is syncing or not. + + + An integration with syncing enabled will update its "subscribers" on an interval, while one with syncing + disabled will not. A user must manually choose when sync the integration if syncing is disabled. + + + true if this integration is syncing; otherwise false. + + + + + Gets the ID that this integration uses for "subscribers". + + + + + Gets the grace period before expiring "subscribers". + + + + + Gets when this integration was last synced. + + + A containing a date and time of day when the integration was last synced. + + + + + Gets integration account information. + + + + Gets the ID of the account. + A unique identifier of this integration account. + + + Gets the name of the account. + A string containing the name of this integration account. + + + + Gets the name of this guild. + + + + + Gets the icon URL associated with this guild, or null if one is not set. + + + + + Returns true if the current user owns this guild. + + + + + Returns the current user's permissions for this guild. + + + + + Represents a region of which the user connects to when using voice. + + + + + Gets the unique identifier for this voice region. + + + A string that represents the identifier for this voice region (e.g. eu-central). + + + + + Gets the name of this voice region. + + + A string that represents the human-readable name of this voice region (e.g. Central Europe). + + + + + Gets a value that indicates whether or not this voice region is exclusive to partnered servers. + + + true if this voice region is exclusive to VIP accounts; otherwise false. + + + + + Gets a value that indicates whether this voice region is optimal for your client in terms of latency. + + + true if this voice region is the closest to your machine; otherwise false . + + + + + Gets a value that indicates whether this voice region is no longer being maintained. + + + true if this is a deprecated voice region; otherwise false. + + + + + Gets a value that indicates whether this voice region is custom-made for events. + + + true if this is a custom voice region (used for events/etc); otherwise false/ + + + + + Specifies the guild's Multi-Factor Authentication (MFA) level requirement. + + + + + Users have no additional MFA restriction on this guild. + + + + + Users must have MFA enabled on their account to perform administrative actions. + + + + + Specifies the target of the permission. + + + + + The target of the permission is a role. + + + + + The target of the permission is a user. + + + + + Used for guilds that have no guild boosts. + + + + + Used for guilds that have Tier 1 guild boosts. + + + + + Used for guilds that have Tier 2 guild boosts. + + + + + Used for guilds that have Tier 3 guild boosts. + + + + + Deny none of the system channel messages. + This will enable all of the system channel messages. + + + + + Deny the messages that are sent when a user joins the guild. + + + + + Deny the messages that are sent when a user boosts the guild. + + + + + Specifies the verification level the guild uses. + + + + + Users have no additional restrictions on sending messages to this guild. + + + + + Users must have a verified email on their account. + + + + + Users must fulfill the requirements of Low and be registered on Discord for at least 5 minutes. + + + + + Users must fulfill the requirements of Medium and be a member of this guild for at least 10 minutes. + + + + + Users must fulfill the requirements of High and must have a verified phone on their Discord account. + + + + + Represents a Discord application created via the developer portal. + + + + + Gets the name of the application. + + + + + Gets the description of the application. + + + + + Gets the RPC origins of the application. + + + + + Gets the icon URL of the application. + + + + + Gets if the bot is public. + + + + + Gets if the bot requires code grant. + + + + + Gets the team associated with this application if there is one. + + + + + Gets the partial user object containing info on the owner of the application. + + + + + Determines whether the object is deletable or not. + + + + + Deletes this object and all its children. + + The options to be used when sending the request. + + + + Gets the unique identifier for this object. + + + + + An image that will be uploaded to Discord. + + + + + Gets the stream to be uploaded to Discord. + + + + + Create the image with a . + + + The to create the image with. Note that this must be some type of stream + with the contents of a file in it. + + + + + Create the image from a file path. + + + This file path is NOT validated and is passed directly into a + . + + The path to the file. + + is a zero-length string, contains only white space, or contains one or more invalid + characters as defined by . + + is null. + + The specified path, file name, or both exceed the system-defined maximum length. For example, on + Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 + characters. + + is in an invalid format. + + The specified is invalid, (for example, it is on an unmapped drive). + + + specified a directory.-or- The caller does not have the required permission. + + The file specified in was not found. + + An I/O error occurred while opening the file. + + + + + + + Specifies the type of format the image should return in. + + + + + Use automatically detected format. + + + + + Use Google's WebP image format. + + + + + Use PNG. + + + + + Use JPEG. + + + + + Use GIF. + + + + + Determines whether the object is mentionable or not. + + + + + Returns a special string used to mention this object. + + + A string that is recognized by Discord as a mention (e.g. <@168693960628371456>). + + + + + Represents a for making slash commands. + + + + + The name of this option. + + + + + The description of this option. + + + + + The type of this option. + + + + + The first required option for the user to complete. only one option can be default. + + + + + if this option is required for this command, otherwise . + + + + + choices for string and int types for the user to pick from. + + + + + If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + + + Represents a choice for a . This class is used when making new commands. + + + + + The name of this choice. + + + + + The value of this choice. + + + + + The option type of the Slash command parameter, See the discord docs. + + + + + A sub command. + + + + + A group of sub commands. + + + + + A of text. + + + + + An . + + + + + A . + + + + + A . + + + + + A . + + + + + A . + + + + + Provides properties that are used to modify a with the specified changes. + + + + + Gets or sets the name of this command. + + + + + Gets or sets the discription of this command. + + + + + Gets or sets the options for this command. + + + + + Whether the command is enabled by default when the app is added to a guild. Default is + + + + + The base command model that belongs to an application. see + + + + + Gets the unique id of the command. + + + + + Gets the unique id of the parent application. + + + + + The name of the command. + + + + + The description of the command. + + + + + If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + + + Deletes this command + + The options to be used when sending the request. + A task that represents the asynchronous delete operation. + + + + Represents data of an Interaction Command, see . + + + + + The snowflake id of this command. + + + + + The name of this command. + + + + + The params + values from the user. + + + + + Represents a option group for a command, see . + + + + + The name of the parameter. + + + + + The value of the pair. + + This objects type can be any one of the option types in + + + + + + Present if this option is a group or subcommand. + + + + + + The type of this . + + + + + The name of this command option, 1-32 character name. + + + + + The discription of this command option, 1-100 character description. + + + + + The first required option for the user to complete--only one option can be default. + + + + + If the parameter is required or optional, default is . + + + + + Choices for string and int types for the user to pick from. + + + + + If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + + + Specifies choices for command group. + + + + + 1-100 character choice name. + + + + + value of the choice. + + + + + Represents a discord interaction + + An interaction is the base "thing" that is sent when a user invokes a command, and is the same for Slash Commands + and other future interaction types. see . + + + + + + The id of the interaction. + + + + + The type of this . + + + + + Represents the data sent within this interaction. + + + + + A continuation token for responding to the interaction. + + + + + read-only property, always 1. + + + + + The response type for an . + + + After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using + or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, + and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. + You can read more about Response types Here + + + + + ACK a Ping. + + + + + Respond to an interaction with a message. + + + + + ACK an interaction and edit a response later, the user sees a loading state. + + + + + for components: ACK an interaction and edit the original message later; the user does not see a loading state + + + + + for components: edit the message the component was attached to + + + + + Represents a type of Interaction from discord. + + + + + A ping from discord. + + + + + A sent from discord. + + + + + A sent from discord. + + + + + Represents a Row for child components to live in. + + + + + + + + The child components in this row. + + + + + Represents a Button. + + + + + + + + The of this button, example buttons with each style can be found Here. + + + + + The label of the button, this is the text that is shown. + + + + + A that will be displayed with this button. + + + + + A unique id that will be sent with a . This is how you know what button was pressed. + + + + + A URL for a button. + + + You cannot have a button with a URL and a CustomId. + + + + + Whether this button is disabled or not. + + + + + Represents different styles to use with buttons. You can see an example of the different styles at + + + + + A Blurple button + + + + + A Grey (or gray) button + + + + + A Green button + + + + + A Red button + + + + + A button with a little popup box indicating that this button is a link. + + + + + Represents a builder for creating a . + + + + + The max amount of rows a message can have. + + + + + Gets or sets the Action Rows for this Component Builder. + + + + + Adds a button to the specified row. + + The label text for the newly added button. + The style of this newly added button. + A to be used with this button. + The custom id of the newly added button. + A URL to be used only if the is a Link. + Whether or not the newly created button is disabled. + The row the button should be placed on. + The current builder. + + + + Adds a button to the first row. + + The button to add to the first row. + The current builder. + + + + Adds a button to the specified row. + + The button to add. + The row to add the button. + The current builder. + + + + Builds this builder into a used to send your components. + + A that can be sent with + + + + Represents a class used to build Action rows. + + + + + The max amount of child components this row can hold. + + + + + Gets or sets the components inside this row. + + + + + Adds a list of components to the current row. + + The list of components to add. + The current builder. + + + + Adds a component at the end of the current row. + + The component to add. + The current builder. + + + + Builds the current builder to a that can be used within a + + A that can be used within a + cannot be null. + There must be at least 1 component in a row. + + + + Represents a class used to build 's. + + + + + The max length of a . + + + + + The max length of a . + + + + + Gets or sets the label of the current button. + + + + + Gets or sets the custom id of the current button. + + + + + Gets or sets the of the current button. + + + + + Gets or sets the of the current button. + + + + + Gets or sets the url of the current button. + + + + + Gets or sets whether the current button is disabled. + + + + + Creates a button with the style. + + The label to use on the newly created link button. + The url for this link button to go to. + A builder with the newly created button. + + + + Creates a button with the style. + + The label for this danger button. + The custom id for this danger button. + A builder with the newly created button. + + + + Creates a button with the style. + + The label for this primary button. + The custom id for this primary button. + A builder with the newly created button. + + + + Creates a button with the style. + + The label for this secondary button. + The custom id for this secondary button. + A builder with the newly created button. + + + + Creates a button with the style. + + The label for this success button. + The custom id for this success button. + A builder with the newly created button. + + + + Sets the current buttons label to the specified text. + + The text for the label + The current builder. + + + + Sets the current buttons style. + + The style for this builders button. + The current builder. + + + + Sets the current buttons emote. + + The emote to use for the current button. + The current builder. + + + + Sets the current buttons url. + + The url to use for the current button. + The current builder. + + + + Sets the custom id of the current button. + + The id to use for the current button. + The current builder. + + + + Sets whether the current button is disabled. + + Whether the current button is disabled or not. + The current builder. + + + + Builds this builder into a to be used in a . + + A to be used in a . + A button cannot contain a URL and a CustomId. + A button must have an Emote or a label. + + + + Represents a type of a component + + + + + A container for other components + + + + + A clickable button + + + + + The of this Message Component. + + + + + Represents a component object used to send components with messages. + + + + + The components to be used in a message. + + + + + Returns a empty . + + + + + A class used to build slash commands. + + + + + Returns the maximun length a commands name allowed by Discord + + + + + Returns the maximum length of a commands description allowed by Discord. + + + + + Returns the maximum count of command options allowed by Discord + + + + + The name of this slash command. + + + + + A 1-100 length description of this slash command + + + + + Gets or sets the options for this command. + + + + + Sets the description of the current command. + + The description of this command. + The current builder. + + + + Adds an option to the current slash command. + + The name of the option to add. + The type of this option. + The description of this option. + If this option is required for this command. + If this option is the default option. + The options of the option to add. + The choices of this option. + The current builder. + + + + Adds an option to the current slash command. + + The name of the option to add. + The type of this option. + The description of this option. + If this option is required for this command. + If this option is the default option. + The choices of this option. + The current builder. + + + + Adds an option to the current slash command. + + The name of the option to add. + The type of this option. + The sescription of this option. + The current builder. + + + + Adds an option to this slash command. + + The option to add. + The current builder. + + + + Adds a collection of options to the current slash command. + + The collection of options to add. + The current builder. + + + + Represents a class used to build options for the . + + + + + The max length of a choice's name allowed by Discord. + + + + + The maximum number of choices allowed by Discord. + + + + + The name of this option. + + + + + The description of this option. + + + + + The type of this option. + + + + + The first required option for the user to complete. only one option can be default. + + + + + if this option is required for this command, otherwise . + + + + + choices for string and int types for the user to pick from. + + + + + If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + + + Builds the current option. + + The built version of this option. + + + + Adds a sub option to the current option. + + The sub option to add. + The current builder. + + + + Adds a choice to the current option. + + The name of the choice. + The value of the choice. + The current builder. + + + + Adds a choice to the current option. + + The name of the choice. + The value of the choice. + The current builder. + + + + Sets the current builders name. + + The name to set the current option builder. + The current builder. + + + + Sets the current builders description. + + The description to set. + The current builder. + + + + Sets the current builders required field. + + The value to set. + The current builder. + + + + Sets the current builders default field. + + The value to set. + The current builder. + + + + Sets the current type of this builder. + + The type to set. + The current builder. + + + + A class used to create slash commands. + + + + + The name of this command. + + + + + The discription of this command. + + + + + Gets or sets the options for this command. + + + + + Whether the command is enabled by default when the app is added to a guild. Default is + + + + + Represents a generic invite object. + + + + + Gets the unique identifier for this invite. + + + A string containing the invite code (e.g. FTqNnyS). + + + + + Gets the URL used to accept this invite using . + + + A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). + + + + + Gets the channel this invite is linked to. + + + A generic channel that the invite points to. + + + + + Gets the type of the channel this invite is linked to. + + + + + Gets the ID of the channel this invite is linked to. + + + An representing the channel snowflake identifier that the invite points to. + + + + + Gets the name of the channel this invite is linked to. + + + A string containing the name of the channel that the invite points to. + + + + + Gets the guild this invite is linked to. + + + A guild object representing the guild that the invite points to. + + + + + Gets the ID of the guild this invite is linked to. + + + An representing the guild snowflake identifier that the invite points to. + + + + + Gets the name of the guild this invite is linked to. + + + A string containing the name of the guild that the invite points to. + + + + + Gets the approximated count of online members in the guild. + + + An representing the approximated online member count of the guild that the + invite points to; null if one cannot be obtained. + + + + + Gets the approximated count of total members in the guild. + + + An representing the approximated total member count of the guild that the + invite points to; null if one cannot be obtained. + + + + + Represents additional information regarding the generic invite object. + + + + + Gets the user that created this invite. + + + A user that created this invite. + + + + + Gets a value that indicates whether the invite has been revoked. + + + true if this invite was revoked; otherwise false. + + + + + Gets a value that indicates whether the invite is a temporary one. + + + true if users accepting this invite will be removed from the guild when they log off; otherwise + false. + + + + + Gets the time (in seconds) until the invite expires. + + + An representing the time in seconds until this invite expires; null if this + invite never expires. + + + + + Gets the max number of uses this invite may have. + + + An representing the number of uses this invite may be accepted until it is removed + from the guild; null if none is set. + + + + + Gets the number of times this invite has been used. + + + An representing the number of times this invite has been used. + + + + + Gets when this invite was created. + + + A representing the time of which the invite was first created. + + + + + The invite whose target user type is not defined. + + + + + The invite is for a Go Live stream. + + + + Represents a Discord snowflake entity. + + + + Gets when the snowflake was created. + + + A representing when the entity was first created. + + + + + Defines whether the object is updateable or not. + + + + + Updates this object's properties with its current state. + + The options to be used when sending the request. + + + + Defines which mentions and types of mentions that will notify users from the message content. + + + + + Gets a value which indicates that no mentions in the message content should notify users. + + + + + Gets a value which indicates that all mentions in the message content should notify users. + + + + + Gets or sets the type of mentions that will be parsed from the message content. + + + The flag is mutually exclusive with the + property, and the flag is mutually exclusive with the + property. + If null, only the ids specified in and will be mentioned. + + + + + Gets or sets the list of all role ids that will be mentioned. + This property is mutually exclusive with the + flag of the property. If the flag is set, the value of this property + must be null or empty. + + + + + Gets or sets the list of all user ids that will be mentioned. + This property is mutually exclusive with the + flag of the property. If the flag is set, the value of this property + must be null or empty. + + + + + Gets or sets whether to mention the author of the message you are replying to or not. + + + Specifically for inline replies. + + + + + Initializes a new instance of the class. + + + The types of mentions to parse from the message content. + If null, only the ids specified in and will be mentioned. + + + + + Specifies the type of mentions that will be notified from the message content. + + + + + No flag is set. + + + This flag is not used to control mentions. + + It will always be present and does not mean mentions will not be allowed. + + + + + + Controls role mentions. + + + + + Controls user mentions. + + + + + Controls @everyone and @here mentions. + + + + + Represents an embed object seen in an . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the total length of all embed properties. + + + + + Gets the title of the embed. + + + + + A author field of an . + + + + + Gets the name of the author field. + + + + + Gets the URL of the author field. + + + + + Gets the icon URL of the author field. + + + + + Gets the proxified icon URL of the author field. + + + + + Gets the name of the author field. + + + + + + + + Represents a builder class for creating a . + + + + + Returns the maximum number of fields allowed by Discord. + + + + + Returns the maximum length of title allowed by Discord. + + + + + Returns the maximum length of description allowed by Discord. + + + + + Returns the maximum length of total characters allowed by Discord. + + + + Initializes a new class. + + + Gets or sets the title of an . + Title length exceeds . + + The title of the embed. + + + Gets or sets the description of an . + Description length exceeds . + The description of the embed. + + + Gets or sets the URL of an . + Url is not a well-formed . + The URL of the embed. + + + Gets or sets the thumbnail URL of an . + Url is not a well-formed . + The thumbnail URL of the embed. + + + Gets or sets the image URL of an . + Url is not a well-formed . + The image URL of the embed. + + + Gets or sets the list of of an . + An embed builder's fields collection is set to + null. + Description length exceeds . + + The list of existing . + + + + Gets or sets the timestamp of an . + + + The timestamp of the embed, or null if none is set. + + + + + Gets or sets the sidebar color of an . + + + The color of the embed, or null if none is set. + + + + + Gets or sets the of an . + + + The author field builder of the embed, or null if none is set. + + + + + Gets or sets the of an . + + + The footer field builder of the embed, or null if none is set. + + + + + Gets the total length of all embed properties. + + + The combined length of , , , + , , and . + + + + + Sets the title of an . + + The title to be set. + + The current builder. + + + + + Sets the description of an . + + The description to be set. + + The current builder. + + + + + Sets the URL of an . + + The URL to be set. + + The current builder. + + + + + Sets the thumbnail URL of an . + + The thumbnail URL to be set. + + The current builder. + + + + + Sets the image URL of an . + + The image URL to be set. + + The current builder. + + + + + Sets the timestamp of an to the current time. + + + The current builder. + + + + + Sets the timestamp of an . + + The timestamp to be set. + + The current builder. + + + + + Sets the sidebar color of an . + + The color to be set. + + The current builder. + + + + + Sets the of an . + + The author builder class containing the author field properties. + + The current builder. + + + + + Sets the author field of an with the provided properties. + + The delegate containing the author field properties. + + The current builder. + + + + + Sets the author field of an with the provided name, icon URL, and URL. + + The title of the author field. + The icon URL of the author field. + The URL of the author field. + + The current builder. + + + + + Sets the of an . + + The footer builder class containing the footer field properties. + + The current builder. + + + + + Sets the footer field of an with the provided properties. + + The delegate containing the footer field properties. + + The current builder. + + + + + Sets the footer field of an with the provided name, icon URL. + + The title of the footer field. + The icon URL of the footer field. + + The current builder. + + + + + Adds an field with the provided name and value. + + The title of the field. + The value of the field. + Indicates whether the field is in-line or not. + + The current builder. + + + + + Adds a field with the provided to an + . + + The field builder class containing the field properties. + Field count exceeds . + + The current builder. + + + + + Adds an field with the provided properties. + + The delegate containing the field properties. + + The current builder. + + + + + Builds the into a Rich Embed ready to be sent. + + + The built embed object. + + Total embed length exceeds . + + + + Represents a builder class for an embed field. + + + + + Gets the maximum field length for name allowed by Discord. + + + + + Gets the maximum field length for value allowed by Discord. + + + + + Gets or sets the field name. + + + Field name is null, empty or entirely whitespace. + - or - + Field name length exceeds . + + + The name of the field. + + + + + Gets or sets the field value. + + + Field value is null, empty or entirely whitespace. + - or - + Field value length exceeds . + + + The value of the field. + + + + + Gets or sets a value that indicates whether the field should be in-line with each other. + + + + + Sets the field name. + + The name to set the field name to. + + The current builder. + + + + + Sets the field value. + + The value to set the field value to. + + The current builder. + + + + + Determines whether the field should be in-line with each other. + + + The current builder. + + + + + Builds the field builder into a class. + + + The current builder. + + + or is null, empty or entirely whitespace. + - or - + or exceeds the maximum length allowed by Discord. + + + + + Represents a builder class for a author field. + + + + + Gets the maximum author name length allowed by Discord. + + + + + Gets or sets the author name. + + + Author name length is longer than . + + + The author name. + + + + + Gets or sets the URL of the author field. + + Url is not a well-formed . + + The URL of the author field. + + + + + Gets or sets the icon URL of the author field. + + Url is not a well-formed . + + The icon URL of the author field. + + + + + Sets the name of the author field. + + The name of the author field. + + The current builder. + + + + + Sets the URL of the author field. + + The URL of the author field. + + The current builder. + + + + + Sets the icon URL of the author field. + + The icon URL of the author field. + + The current builder. + + + + + Builds the author field to be used. + + + Author name length is longer than . + - or - + is not a well-formed . + - or - + is not a well-formed . + + + The built author field. + + + + + Represents a builder class for an embed footer. + + + + + Gets the maximum footer length allowed by Discord. + + + + + Gets or sets the footer text. + + + Author name length is longer than . + + + The footer text. + + + + + Gets or sets the icon URL of the footer field. + + Url is not a well-formed . + + The icon URL of the footer field. + + + + + Sets the name of the footer field. + + The text of the footer field. + + The current builder. + + + + + Sets the icon URL of the footer field. + + The icon URL of the footer field. + + The current builder. + + + + + Builds the footer field to be used. + + + + length is longer than . + - or - + is not a well-formed . + + + A built footer field. + + + + + A field for an . + + + + + Gets the name of the field. + + + + + Gets the value of the field. + + + + + Gets a value that indicates whether the field should be in-line with each other. + + + + + Gets the name of the field. + + + A string that resolves to . + + + + A footer field for an . + + + + Gets the text of the footer field. + + + A string containing the text of the footer field. + + + + + Gets the URL of the footer icon. + + + A string containing the URL of the footer icon. + + + + + Gets the proxied URL of the footer icon link. + + + A string containing the proxied URL of the footer icon. + + + + + Gets the text of the footer field. + + + A string that resolves to . + + + + An image for an . + + + + Gets the URL of the image. + + + A string containing the URL of the image. + + + + + Gets a proxied URL of this image. + + + A string containing the proxied URL of this image. + + + + + Gets the height of this image. + + + A representing the height of this image if it can be retrieved; otherwise + null. + + + + + Gets the width of this image. + + + A representing the width of this image if it can be retrieved; otherwise + null. + + + + + Gets the URL of the thumbnail. + + + A string that resolves to . + + + + A provider field for an . + + + + Gets the name of the provider. + + + A string representing the name of the provider. + + + + + Gets the URL of the provider. + + + A string representing the link to the provider. + + + + + Gets the name of the provider. + + + A string that resolves to . + + + + A thumbnail featured in an . + + + + Gets the URL of the thumbnail. + + + A string containing the URL of the thumbnail. + + + + + Gets a proxied URL of this thumbnail. + + + A string containing the proxied URL of this thumbnail. + + + + + Gets the height of this thumbnail. + + + A representing the height of this thumbnail if it can be retrieved; otherwise + null. + + + + + Gets the width of this thumbnail. + + + A representing the width of this thumbnail if it can be retrieved; otherwise + null. + + + + + Gets the URL of the thumbnail. + + + A string that resolves to . + + + + + Specifies the type of embed. + + + + + An unknown embed type. + + + + + A rich embed type. + + + + + A link embed type. + + + + + A video embed type. + + + + + An image embed type. + + + + + A GIFV embed type. + + + + + An article embed type. + + + + + A tweet embed type. + + + + + A HTML embed type. + + + + + A video featured in an . + + + + + Gets the URL of the video. + + + A string containing the URL of the image. + + + + + Gets the height of the video. + + + A representing the height of this video if it can be retrieved; otherwise + null. + + + + + Gets the weight of the video. + + + A representing the width of this video if it can be retrieved; otherwise + null. + + + + + Gets the URL of the video. + + + A string that resolves to . + + + + + Represents a message attachment found in a . + + + + + Gets the ID of this attachment. + + + A snowflake ID associated with this attachment. + + + + + Gets the filename of this attachment. + + + A string containing the full filename of this attachment (e.g. textFile.txt). + + + + + Gets the URL of this attachment. + + + A string containing the URL of this attachment. + + + + + Gets a proxied URL of this attachment. + + + A string containing the proxied URL of this attachment. + + + + + Gets the file size of this attachment. + + + The size of this attachment in bytes. + + + + + Gets the height of this attachment. + + + The height of this attachment if it is a picture; otherwise null. + + + + + Gets the width of this attachment. + + + The width of this attachment if it is a picture; otherwise null. + + + + + Represents a Discord embed object. + + + + + Gets the title URL of this embed. + + + A string containing the URL set in a title of the embed. + + + + + Gets the title of this embed. + + + The title of the embed. + + + + + Gets the description of this embed. + + + The description field of the embed. + + + + + Gets the type of this embed. + + + The type of the embed. + + + + + Gets the timestamp of this embed. + + + A based on the timestamp present at the bottom left of the embed, or + null if none is set. + + + + + Gets the color of this embed. + + + The color of the embed present on the side of the embed, or null if none is set. + + + + + Gets the image of this embed. + + + The image of the embed, or null if none is set. + + + + + Gets the video of this embed. + + + The video of the embed, or null if none is set. + + + + + Gets the author field of this embed. + + + The author field of the embed, or null if none is set. + + + + + Gets the footer field of this embed. + + + The author field of the embed, or null if none is set. + + + + + Gets the provider of this embed. + + + The source of the embed, or null if none is set. + + + + + Gets the thumbnail featured in this embed. + + + The thumbnail featured in the embed, or null if none is set. + + + + + Gets the fields of the embed. + + + An array of the fields of the embed. + + + + + Represents a message object. + + + + + Gets the type of this system message. + + + + + Gets the source type of this message. + + + + + Gets the value that indicates whether this message was meant to be read-aloud by Discord. + + + true if this message was sent as a text-to-speech message; otherwise false. + + + + + Gets the value that indicates whether this message is pinned. + + + true if this message was added to its channel's pinned messages; otherwise false. + + + + + Gets the value that indicates whether or not this message's embeds are suppressed. + + + true if the embeds in this message have been suppressed (made invisible); otherwise false. + + + + + Gets the value that indicates whether this message mentioned everyone. + + + true if this message mentioned everyone; otherwise false. + + + + + Gets the content for this message. + + + A string that contains the body of the message; note that this field may be empty if there is an embed. + + + + + Gets the time this message was sent. + + + Time of when the message was sent. + + + + + Gets the time of this message's last edit. + + + Time of when the message was last edited; null if the message is never edited. + + + + + Gets the source channel of the message. + + + + + Gets the author of this message. + + + + + Gets all attachments included in this message. + + + This property gets a read-only collection of attachments associated with this message. Depending on the + user's end-client, a sent message may contain one or more attachments. For example, mobile users may + attach more than one file in their message, while the desktop client only allows for one. + + + A read-only collection of attachments. + + + + + Gets all embeds included in this message. + + + + This property gets a read-only collection of embeds associated with this message. Depending on the + message, a sent message may contain one or more embeds. This is usually true when multiple link previews + are generated; however, only one can be featured. + + A read-only collection of embed objects. + + + + + Gets all tags included in this message's content. + + + + + Gets the IDs of channels mentioned in this message. + + + A read-only collection of channel IDs. + + + + + Gets the IDs of roles mentioned in this message. + + + A read-only collection of role IDs. + + + + + Gets the IDs of users mentioned in this message. + + + A read-only collection of user IDs. + + + + + Gets the activity associated with a message. + + + Sent with Rich Presence-related chat embeds. This often refers to activity that requires end-user's + interaction, such as a Spotify Invite activity. + + + A message's activity, if any is associated. + + + + + Gets the application associated with a message. + + + Sent with Rich-Presence-related chat embeds. + + + A message's application, if any is associated. + + + + + Gets the reference to the original message if it is a crosspost, channel follow add, pin, or reply message. + + + Sent with cross-posted messages, meaning they were published from news channels + and received by subscriber channels, channel follow adds, pins, and message replies. + + + A message's reference, if any is associated. + + + + + Gets all reactions included in this message. + + + + + The 's attached to this message + + + + + Adds a reaction to this message. + + + The following example adds the reaction, 💕, to the message. + + await msg.AddReactionAsync(new Emoji("\U0001f495")); + + + The emoji used to react to this message. + The options to be used when sending the request. + + A task that represents the asynchronous operation for adding a reaction to this message. + + + + + + Removes a reaction from message. + + + The following example removes the reaction, 💕, added by the message author from the message. + + await msg.RemoveReactionAsync(new Emoji("\U0001f495"), msg.Author); + + + The emoji used to react to this message. + The user that added the emoji. + The options to be used when sending the request. + + A task that represents the asynchronous operation for removing a reaction to this message. + + + + + + Removes a reaction from message. + + + The following example removes the reaction, 💕, added by the user with ID 84291986575613952 from the message. + + await msg.RemoveReactionAsync(new Emoji("\U0001f495"), 84291986575613952); + + + The emoji used to react to this message. + The ID of the user that added the emoji. + The options to be used when sending the request. + + A task that represents the asynchronous operation for removing a reaction to this message. + + + + + + Removes all reactions from this message. + + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + + + + Removes all reactions with a specific emoji from this message. + + The emoji used to react to this message. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + + + + Gets all users that reacted to a message with a given emote. + + + + The returned collection is an asynchronous enumerable object; one must call + to access the users as a + collection. + + + Do not fetch too many users at once! This may cause unwanted preemptive rate limit or even actual + rate limit, causing your bot to freeze! + + This method will attempt to fetch the number of reactions specified under . + The library will attempt to split up the requests according to your and + . In other words, should the user request 500 reactions, + and the constant is 100, the request will + be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need + of flattening. + + + The following example gets the users that have reacted with the emoji 💕 to the message. + + var emoji = new Emoji("\U0001f495"); + var reactedUsers = await message.GetReactionUsersAsync(emoji, 100).FlattenAsync(); + + + The emoji that represents the reaction that you wish to get. + The number of users to request. + The options to be used when sending the request. + + Paged collection of users. + + + + + Represents a generic reaction object. + + + + + The used in the reaction. + + + + + Represents a generic message sent by the system. + + + + + Represents a generic message sent by a user. + + + + + Gets the referenced message if it is a crosspost, channel follow add, pin, or reply message. + + + The referenced message, if any is associated and still exists. + + + + + Modifies this message. + + + This method modifies this message with the specified properties. To see an example of this + method and what properties are available, please refer to . + + + The following example replaces the content of the message with Hello World!. + + await msg.ModifyAsync(x => x.Content = "Hello World!"); + + + A delegate containing the properties to modify the message with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Modifies the suppression of this message. + + + This method modifies whether or not embeds in this message are suppressed (hidden). + + Whether or not embeds in this message should be suppressed. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Adds this message to its channel's pinned messages. + + The options to be used when sending the request. + + A task that represents the asynchronous operation for pinning this message. + + + + + Removes this message from its channel's pinned messages. + + The options to be used when sending the request. + + A task that represents the asynchronous operation for unpinning this message. + + + + + Publishes (crossposts) this message. + + The options to be used when sending the request. + + A task that represents the asynchronous operation for publishing this message. + + + + This call will throw an if attempted in a non-news channel. + + This method will publish (crosspost) the message. Please note, publishing (crossposting), is only available in news channels. + + + + + Transforms this message's text into a human-readable form by resolving its tags. + + Determines how the user tag should be handled. + Determines how the channel tag should be handled. + Determines how the role tag should be handled. + Determines how the @everyone tag should be handled. + Determines how the emoji tag should be handled. + + + + An activity object found in a sent message. + + + + This class refers to an activity object, visually similar to an embed within a message. However, a message + activity is interactive as opposed to a standard static embed. + + For example, a Spotify party invitation counts as a message activity. + + + + + Gets the type of activity of this message. + + + + + Gets the party ID of this activity, if any. + + + + + Gets the snowflake ID of the application. + + + + + Gets the ID of the embed's image asset. + + + + + Gets the application's description. + + + + + Gets the ID of the application's icon. + + + + + Gets the Url of the application's icon. + + + + + Gets the name of the application. + + + + + Properties that are used to modify an with the specified changes. + + + The content of a message can be cleared with if and only if an + is present. + + + + + + Gets or sets the content of the message. + + + This must be less than the constant defined by . + + + + + Gets or sets the embed the message should display. + + + + + Gets or sets the components for this message. + + + + + Contains the IDs sent from a crossposted message or inline reply. + + + + + Gets the Message ID of the original message. + + + + + Gets the Channel ID of the original message. + + + It only will be the default value (zero) if it was instantiated with a in the constructor. + + + + + Gets the Guild ID of the original message. + + + + + Initializes a new instance of the class. + + + The ID of the message that will be referenced. Used to reply to specific messages and the only parameter required for it. + + + The ID of the channel that will be referenced. It will be validated if sent. + + + The ID of the guild that will be referenced. It will be validated if sent. + + + + + Specifies the source of the Discord message. + + + + + The message is sent by the system. + + + + + The message is sent by a user. + + + + + The message is sent by a bot. + + + + + The message is sent by a webhook. + + + + + Specifies the type of message. + + + + + The default message type. + + + + + The message when a recipient is added. + + + + + The message when a recipient is removed. + + + + + The message when a user is called. + + + + + The message when a channel name is changed. + + + + + The message when a channel icon is changed. + + + + + The message when another message is pinned. + + + + + The message when a new member joined. + + + + + The message for when a user boosts a guild. + + + + + The message for when a guild reaches Tier 1 of Nitro boosts. + + + + + The message for when a guild reaches Tier 2 of Nitro boosts. + + + + + The message for when a guild reaches Tier 3 of Nitro boosts. + + + + + The message for when a news channel subscription is added to a text channel. + + + + + The message is an inline reply. + + + Only available in API v8. + + + + + The message is an Application Command + + + Only available in API v8 + + + + + A metadata containing reaction information. + + + + + Gets the number of reactions. + + + An representing the number of this reactions that has been added to this message. + + + + + Gets a value that indicates whether the current user has reacted to this. + + + true if the user has reacted to the message; otherwise false. + + + + + Specifies the handling type the tag should use. + + + + + + + Tag handling is ignored (e.g. <@53905483156684800> -> <@53905483156684800>). + + + + + Removes the tag entirely. + + + + + Resolves to username (e.g. <@53905483156684800> -> @Voltana). + + + + + Resolves to username without mention prefix (e.g. <@53905483156684800> -> Voltana). + + + + + Resolves to username with discriminator value. (e.g. <@53905483156684800> -> @Voltana#8252). + + + + + Resolves to username with discriminator value without mention prefix. (e.g. <@53905483156684800> -> Voltana#8252). + + + + + Sanitizes the tag (e.g. <@53905483156684800> -> <@53905483156684800> (w/ nbsp)). + + + + Specifies the type of Discord tag. + + + The object is an user mention. + + + The object is a channel mention. + + + The object is a role mention. + + + The object is an everyone mention. + + + The object is a here mention. + + + The object is an emoji. + + + + Application command permissions allow you to enable or disable commands for specific users or roles within a guild. + + + + + The id of the role or user. + + + + + The target of this permission. + + + + + to allow, otherwise . + + + + + Creates a new . + + The id you want to target this permission value for. + The type of the targetId parameter. + The value of this permission. + + + + Creates a new targeting . + + The user you want to target this permission value for. + The value of this permission. + + + + Creates a new targeting . + + The role you want to target this permission value for. + The value of this permission. + + + Defines the available permissions for a channel. + + + + Allows creation of instant invites. + + + + + Allows management and editing of channels. + + + + + Allows for the addition of reactions to messages. + + + + + Allows for reading of messages. This flag is obsolete, use instead. + + + + + Allows guild members to view a channel, which includes reading messages in text channels. + + + + + Allows for sending messages in a channel. + + + + + Allows for sending of text-to-speech messages. + + + + + Allows for deletion of other users messages. + + + + + Allows links sent by users with this permission will be auto-embedded. + + + + + Allows for uploading images and files. + + + + + Allows for reading of message history. + + + + + Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all + online users in a channel. + + + + + Allows the usage of custom emojis from other servers. + + + + + Allows for joining of a voice channel. + + + + + Allows for speaking in a voice channel. + + + + + Allows for muting members in a voice channel. + + + + + Allows for deafening of members in a voice channel. + + + + + Allows for moving of members between voice channels. + + + + + Allows for using voice-activity-detection in a voice channel. + + + + + Allows video streaming in a voice channel. + + + + + Allows management and editing of roles. + + + + + Allows management and editing of webhooks. + + + + Gets a blank that grants no permissions. + A structure that does not contain any set permissions. + + + Gets a that grants all permissions for text channels. + + + Gets a that grants all permissions for voice channels. + + + Gets a that grants all permissions for category channels. + + + Gets a that grants all permissions for direct message channels. + + + Gets a that grants all permissions for group channels. + + + Gets a that grants all permissions for a given channel type. + Unknown channel type. + + + Gets a packed value representing all the permissions in this . + + + If true, a user may create invites. + + + If true, a user may create, delete and modify this channel. + + + If true, a user may add reactions. + + + If true, a user may join channels. + + + If true, a user may view channels. + + + If true, a user may send messages. + + + If true, a user may send text-to-speech messages. + + + If true, a user may delete messages. + + + If true, Discord will auto-embed links sent by this user. + + + If true, a user may send files. + + + If true, a user may read previous messages. + + + If true, a user may mention @everyone. + + + If true, a user may use custom emoji from other guilds. + + + If true, a user may connect to a voice channel. + + + If true, a user may speak in a voice channel. + + + If true, a user may mute users. + + + If true, a user may deafen users. + + + If true, a user may move other users between voice channels. + + + If true, a user may use voice-activity-detection rather than push-to-talk. + + + If true, a user may use priority speaker in a voice channel. + + + If true, a user may stream video in a voice channel. + + + If true, a user may adjust role permissions. This also implictly grants all other permissions. + + + If true, a user may edit the webhooks for this channel. + + + Creates a new with the provided packed value. + + + Creates a new with the provided permissions. + + + Creates a new from this one, changing the provided non-null permissions. + + + + Returned when fetching the permissions for a command in a guild. + + + + + The id of the command. + + + + + The id of the application the command belongs to. + + + + + The id of the guild. + + + + + The permissions for the command in the guild. + + + + Defines the available permissions for a channel. + + + + Allows creation of instant invites. + + + + + Allows kicking members. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows banning members. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows all permissions and bypasses channel permission overwrites. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows management and editing of channels. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows management and editing of the guild. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows for viewing of guild insights + + + + + Allows for the addition of reactions to messages. + + + + + Allows for viewing of audit logs. + + + + + Allows for sending of text-to-speech messages. + + + + + Allows for deletion of other users messages. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows links sent by users with this permission will be auto-embedded. + + + + + Allows for uploading images and files. + + + + + Allows for reading of message history. + + + + + Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all + online users in a channel. + + + + + Allows the usage of custom emojis from other servers. + + + + + Allows for joining of a voice channel. + + + + + Allows for speaking in a voice channel. + + + + + Allows for muting members in a voice channel. + + + + + Allows for deafening of members in a voice channel. + + + + + Allows for moving of members between voice channels. + + + + + Allows for using voice-activity-detection in a voice channel. + + + + + Allows video streaming in a voice channel. + + + + + Allows for modification of own nickname. + + + + + Allows for modification of other users nicknames. + + + + + Allows management and editing of roles. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows management and editing of webhooks. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows management and editing of emojis. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + Gets a blank that grants no permissions. + + + Gets a that grants all guild permissions for webhook users. + + + Gets a that grants all guild permissions. + + + Gets a packed value representing all the permissions in this . + + + If true, a user may create invites. + + + If true, a user may ban users from the guild. + + + If true, a user may kick users from the guild. + + + If true, a user is granted all permissions, and cannot have them revoked via channel permissions. + + + If true, a user may create, delete and modify channels. + + + If true, a user may adjust guild properties. + + + If true, a user may add reactions. + + + If true, a user may view the audit log. + + + If true, a user may view the guild insights. + + + If True, a user may join channels. + + + If True, a user may view channels. + + + If True, a user may send messages. + + + If true, a user may send text-to-speech messages. + + + If true, a user may delete messages. + + + If true, Discord will auto-embed links sent by this user. + + + If true, a user may send files. + + + If true, a user may read previous messages. + + + If true, a user may mention @everyone. + + + If true, a user may use custom emoji from other guilds. + + + If true, a user may connect to a voice channel. + + + If true, a user may speak in a voice channel. + + + If true, a user may mute users. + + + If true, a user may deafen users. + + + If true, a user may move other users between voice channels. + + + If true, a user may use voice-activity-detection rather than push-to-talk. + + + If True, a user may use priority speaker in a voice channel. + + + If True, a user may stream video in a voice channel. + + + If true, a user may change their own nickname. + + + If true, a user may change the nickname of other users. + + + If true, a user may adjust roles. + + + If true, a user may edit the webhooks for this guild. + + + If true, a user may edit the emojis for this guild. + + + Creates a new with the provided packed value. + + + Creates a new structure with the provided permissions. + + + Creates a new from this one, changing the provided non-null permissions. + + + + Returns a value that indicates if a specific is enabled + in these permissions. + + The permission value to check for. + true if the permission is enabled, false otherwise. + + + + Returns a containing all of the + flags that are enabled. + + A containing flags. Empty if none are enabled. + + + + Represent a permission object. + + + + + Gets the unique identifier for the object this overwrite is targeting. + + + + + Gets the type of object this overwrite is targeting. + + + + + Gets the permissions associated with this overwrite entry. + + + + + Initializes a new with provided target information and modified permissions. + + + + + Represents a container for a series of overwrite permissions. + + + + + Gets a blank that inherits all permissions. + + + + + Gets a that grants all permissions for the given channel. + + Unknown channel type. + + + + Gets a that denies all permissions for the given channel. + + Unknown channel type. + + + + Gets a packed value representing all the allowed permissions in this . + + + + + Gets a packed value representing all the denied permissions in this . + + + + If Allowed, a user may create invites. + + + If Allowed, a user may create, delete and modify this channel. + + + If Allowed, a user may add reactions. + + + If Allowed, a user may join channels. + + + If Allowed, a user may join channels. + + + If Allowed, a user may send messages. + + + If Allowed, a user may send text-to-speech messages. + + + If Allowed, a user may delete messages. + + + If Allowed, Discord will auto-embed links sent by this user. + + + If Allowed, a user may send files. + + + If Allowed, a user may read previous messages. + + + If Allowed, a user may mention @everyone. + + + If Allowed, a user may use custom emoji from other guilds. + + + If Allowed, a user may connect to a voice channel. + + + If Allowed, a user may speak in a voice channel. + + + If Allowed, a user may mute users. + + + If Allowed, a user may deafen users. + + + If Allowed, a user may move other users between voice channels. + + + If Allowed, a user may use voice-activity-detection rather than push-to-talk. + + + If Allowed, a user may use priority speaker in a voice channel. + + + If Allowed, a user may go live in a voice channel. + + + If Allowed, a user may adjust role permissions. This also implicitly grants all other permissions. + + + If True, a user may edit the webhooks for this channel. + + + Creates a new OverwritePermissions with the provided allow and deny packed values. + + + + Initializes a new struct with the provided permissions. + + + + + Initializes a new from the current one, changing the provided + non-null permissions. + + + + + Creates a of all the values that are allowed. + + A of all allowed flags. If none, the list will be empty. + + + + Creates a of all the values that are denied. + + A of all denied flags. If none, the list will be empty. + + + Specifies the permission value. + + + Allows this permission. + + + Denies this permission. + + + Inherits the permission settings. + + + + Represents a color used in Discord. + + + + Gets the default user color value. + + + Gets the teal color value. + A color struct with the hex value of 1ABC9C. + + + Gets the dark teal color value. + A color struct with the hex value of 11806A. + + + Gets the green color value. + A color struct with the hex value of 2ECC71. + + + Gets the dark green color value. + A color struct with the hex value of 1F8B4C. + + + Gets the blue color value. + A color struct with the hex value of 3498DB. + + + Gets the dark blue color value. + A color struct with the hex value of 206694. + + + Gets the purple color value. + A color struct with the hex value of 9B59B6. + + + Gets the dark purple color value. + A color struct with the hex value of 71368A. + + + Gets the magenta color value. + A color struct with the hex value of E91E63. + + + Gets the dark magenta color value. + A color struct with the hex value of AD1457. + + + Gets the gold color value. + A color struct with the hex value of F1C40F. + + + Gets the light orange color value. + A color struct with the hex value of C27C0E. + + + Gets the orange color value. + A color struct with the hex value of E67E22. + + + Gets the dark orange color value. + A color struct with the hex value of A84300. + + + Gets the red color value. + A color struct with the hex value of E74C3C. + + + Gets the dark red color value. + A color struct with the hex value of 992D22. + + + Gets the light grey color value. + A color struct with the hex value of 979C9F. + + + Gets the lighter grey color value. + A color struct with the hex value of 95A5A6. + + + Gets the dark grey color value. + A color struct with the hex value of 607D8B. + + + Gets the darker grey color value. + A color struct with the hex value of 546E7A. + + + Gets the encoded value for this color. + + This value is encoded as an unsigned integer value. The most-significant 8 bits contain the red value, + the middle 8 bits contain the green value, and the least-significant 8 bits contain the blue value. + + + + Gets the red component for this color. + + + Gets the green component for this color. + + + Gets the blue component for this color. + + + + Initializes a struct with the given raw value. + + + The following will create a color that has a hex value of + #607D8B. + + Color darkGrey = new Color(0x607D8B); + + + The raw value of the color (e.g. 0x607D8B). + + + + Initializes a struct with the given RGB bytes. + + + The following will create a color that has a value of + #607D8B. + + Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); + + + The byte that represents the red color. + The byte that represents the green color. + The byte that represents the blue color. + + + + Initializes a struct with the given RGB value. + + + The following will create a color that has a value of + #607D8B. + + Color darkGrey = new Color(96, 125, 139); + + + The value that represents the red color. Must be within 0~255. + The value that represents the green color. Must be within 0~255. + The value that represents the blue color. Must be within 0~255. + The argument value is not between 0 to 255. + + + + Initializes a struct with the given RGB float value. + + + The following will create a color that has a value of + #607c8c. + + Color darkGrey = new Color(0.38f, 0.49f, 0.55f); + + + The value that represents the red color. Must be within 0~1. + The value that represents the green color. Must be within 0~1. + The value that represents the blue color. Must be within 0~1. + The argument value is not between 0 to 1. + + + + Gets the hexadecimal representation of the color (e.g. #000ccc). + + + A hexadecimal string of the color. + + + + + Represents a generic role object to be given to a guild user. + + + + + Gets the guild that owns this role. + + + A guild representing the parent guild of this role. + + + + + Gets the color given to users of this role. + + + A struct representing the color of this role. + + + + + Gets a value that indicates whether the role can be separated in the user list. + + + true if users of this role are separated in the user list; otherwise false. + + + + + Gets a value that indicates whether the role is managed by Discord. + + + true if this role is automatically managed by Discord; otherwise false. + + + + + Gets a value that indicates whether the role is mentionable. + + + true if this role may be mentioned in messages; otherwise false. + + + + + Gets the name of this role. + + + A string containing the name of this role. + + + + + Gets the permissions granted to members of this role. + + + A struct that this role possesses. + + + + + Gets this role's position relative to other roles in the same guild. + + + An representing the position of the role in the role list of the guild. + + + + + Modifies this role. + + + This method modifies this role with the specified properties. To see an example of this + method and what properties are available, please refer to . + + A delegate containing the properties to modify the role with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Properties that are used to reorder an . + + + + + Gets the identifier of the role to be edited. + + + A representing the snowflake identifier of the role to be modified. + + + + + Gets the new zero-based position of the role. + + + An representing the new zero-based position of the role. + + + + + Initializes a with the given role ID and position. + + The ID of the role to be edited. + The new zero-based position of the role. + + + + Properties that are used to modify an with the specified changes. + + + The following example modifies the role to a mentionable one, renames the role into Sonic, and + changes the color to a light-blue. + + await role.ModifyAsync(x => + { + x.Name = "Sonic"; + x.Color = new Color(0x1A50BC); + x.Mentionable = true; + }); + + + + + + + Gets or sets the name of the role. + + + This value may not be set if the role is an @everyone role. + + + + + Gets or sets the role's . + + + + + Gets or sets the position of the role. This is 0-based! + + + This value may not be set if the role is an @everyone role. + + + + + Gets or sets the color of the role. + + + This value may not be set if the role is an @everyone role. + + + + + Gets or sets whether or not this role should be displayed independently in the user list. + + + This value may not be set if the role is an @everyone role. + + + + + Gets or sets whether or not this role can be mentioned. + + + This value may not be set if the role is an @everyone role. + + + + + Represents a Discord Team. + + + + + Gets the team icon url. + + + + + Gets the team unique identifier. + + + + + Gets the members of this team. + + + + + Gets the user identifier that owns this team. + + + + + Represents a Discord Team member. + + + + + Gets the membership state of this team member. + + + + + Gets the permissions of this team member. + + + + + Gets the team unique identifier for this team member. + + + + + Gets the Discord user of this team member. + + + + + Represents the membership state of a team member. + + + + + Properties that are used to add a new to the guild with the following parameters. + + + + + + Gets or sets the user's nickname. + + + To clear the user's nickname, this value can be set to null or + . + + + + + Gets or sets whether the user should be muted in a voice channel. + + + If this value is set to true, no user will be able to hear this user speak in the guild. + + + + + Gets or sets whether the user should be deafened in a voice channel. + + + If this value is set to true, this user will not be able to hear anyone speak in the guild. + + + + + Gets or sets the roles the user should have. + + + + To add a role to a user: + + + + To remove a role from a user: + + + + + + + Gets or sets the roles the user should have. + + + + To add a role to a user: + + + + To remove a role from a user: + + + + + + + Defines the types of clients a user can be active on. + + + + + The user is active using the mobile application. + + + + + The user is active using the desktop application. + + + + + The user is active using the web application. + + + + + Properties that are used to modify an with the following parameters. + + + + + + Gets or sets whether the user should be muted in a voice channel. + + + If this value is set to true, no user will be able to hear this user speak in the guild. + + + + + Gets or sets whether the user should be deafened in a voice channel. + + + If this value is set to true, this user will not be able to hear anyone speak in the guild. + + + + + Gets or sets the user's nickname. + + + To clear the user's nickname, this value can be set to null or + . + + + + + Gets or sets the roles the user should have. + + + + To add a role to a user: + + + + To remove a role from a user: + + + + + + + Gets or sets the roles the user should have. + + + + To add a role to a user: + + + + To remove a role from a user: + + + + + + + Moves a user to a voice channel. If null, this user will be disconnected from their current voice channel. + + + This user MUST already be in a for this to work. + When set, this property takes precedence over . + + + + + Moves a user to a voice channel. Set to null to disconnect this user from their current voice channel. + + + This user MUST already be in a for this to work. + + + + Gets the ID of the connection account. + A representing the unique identifier value of this connection. + + + Gets the service of the connection (twitch, youtube). + A string containing the name of this type of connection. + + + Gets the username of the connection account. + A string containing the name of this connection. + + + Gets whether the connection is revoked. + A value which if true indicates that this connection has been revoked, otherwise false. + + + Gets a of integration IDs. + + An containing + representations of unique identifier values of integrations. + + + + + Represents a Discord user that is in a group. + + + + + Represents a generic guild user. + + + + + Gets when this user joined the guild. + + + A representing the time of which the user has joined the guild; + null when it cannot be obtained. + + + + + Gets the nickname for this user. + + + A string representing the nickname of the user; null if none is set. + + + + + Gets the guild-level permissions for this user. + + + A structure for this user, representing what + permissions this user has in the guild. + + + + + Gets the guild for this user. + + + A guild object that this user belongs to. + + + + + Gets the ID of the guild for this user. + + + An representing the snowflake identifier of the guild that this user belongs to. + + + + + Gets the date and time for when this user's guild boost began. + + + A for when the user began boosting this guild; null if they are not boosting the guild. + + + + + Gets a collection of IDs for the roles that this user currently possesses in the guild. + + + This property returns a read-only collection of the identifiers of the roles that this user possesses. + For WebSocket users, a Roles property can be found in place of this property. Due to the REST + implementation, only a collection of identifiers can be retrieved instead of the full role objects. + + + A read-only collection of , each representing a snowflake identifier for a role that + this user possesses. + + + + + Gets the level permissions granted to this user to a given channel. + + + The following example checks if the current user has the ability to send a message with attachment in + this channel; if so, uploads a file via . + + if (currentUser?.GetPermissions(targetChannel)?.AttachFiles) + await targetChannel.SendFileAsync("fortnite.png"); + + + The channel to get the permission from. + + A structure representing the permissions that a user has in the + specified channel. + + + + + Kicks this user from this guild. + + The reason for the kick which will be recorded in the audit log. + The options to be used when sending the request. + + A task that represents the asynchronous kick operation. + + + + + Modifies this user's properties in this guild. + + + This method modifies the current guild user with the specified properties. To see an example of this + method and what properties are available, please refer to . + + The delegate containing the properties to modify the user with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Adds the specified role to this user in the guild. + + The role to be added to the user. + The options to be used when sending the request. + + A task that represents the asynchronous role addition operation. + + + + + Adds the specified to this user in the guild. + + The roles to be added to the user. + The options to be used when sending the request. + + A task that represents the asynchronous role addition operation. + + + + + Removes the specified from this user in the guild. + + The role to be removed from the user. + The options to be used when sending the request. + + A task that represents the asynchronous role removal operation. + + + + + Removes the specified from this user in the guild. + + The roles to be removed from the user. + The options to be used when sending the request. + + A task that represents the asynchronous role removal operation. + + + + + Represents the user's presence status. This may include their online status and their activity. + + + + + Gets the activity this user is currently doing. + + + + + Gets the current status of this user. + + + + + Gets the set of clients where this user is currently active. + + + + + Gets the list of activities that this user currently has available. + + + + + Represents the logged-in Discord user. + + + + + Gets the email associated with this user. + + + + + Indicates whether or not this user has their email verified. + + + true if this user's email has been verified; false if not. + + + + + Indicates whether or not this user has MFA enabled on their account. + + + true if this user has enabled multi-factor authentication on their account; false if not. + + + + + Gets the flags that are applied to a user's account. + + + This value is determined by bitwise OR-ing values together. + + + The value of flags for this user. + + + + + Gets the type of Nitro subscription that is active on this user's account. + + + This information may only be available with the identify OAuth scope. + + + The type of Nitro subscription the user subscribes to, if any. + + + + + Gets the user's chosen language option. + + + The IETF language tag of the user's chosen region, if provided. + For example, a locale of "English, US" is "en-US", "Chinese (Taiwan)" is "zh-TW", etc. + + + + + Modifies the user's properties. + + + + + Represents a generic user. + + + + + Gets the identifier of this user's avatar. + + + + + Gets the avatar URL for this user. + + + This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar + (i.e. their avatar identifier is not set), this property will return null. If you wish to + retrieve the default avatar for this user, consider using (see + example). + + + 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. + + + The format to return. + The size of the image to return in. This can be any power of two between 16 and 2048. + + + A string representing the user's avatar URL; null if the user does not have an avatar in place. + + + + + Gets the default avatar URL for this user. + + + This property retrieves a URL for this user's default avatar generated by Discord (Discord logo followed + by a random color as its background). This property will always return a value as it is calculated based + on the user's (discriminator % 5). + + + A string representing the user's avatar URL. + + + + + Gets the per-username unique ID for this user. + + + + + Gets the per-username unique ID for this user. + + + + + Gets a value that indicates whether this user is identified as a bot. + + + This property retrieves a value that indicates whether this user is a registered bot application + (indicated by the blue BOT tag within the official chat client). + + + true if the user is a bot application; otherwise false. + + + + + Gets a value that indicates whether this user is a webhook user. + + + true if the user is a webhook; otherwise false. + + + + + Gets the username for this user. + + + + + Gets the direct message channel of this user, or create one if it does not already exist. + + + This method is used to obtain or create a channel used to send a direct message. + + In event that the current user cannot send a message to the target user, a channel can and will + still be created by Discord. However, attempting to send a message will yield a + with a 403 as its + . There are currently no official workarounds by + Discord. + + + + The following example attempts to send a direct message to the target user and logs the incident should + it fail. + + + The options to be used when sending the request. + + A task that represents the asynchronous operation for getting or creating a DM channel. The task result + contains the DM channel associated with this user. + + + + + Represents a user's voice connection status. + + + + + Gets a value that indicates whether this user is deafened by the guild. + + + true if the user is deafened (i.e. not permitted to listen to or speak to others) by the guild; + otherwise false. + + + + + Gets a value that indicates whether this user is muted (i.e. not permitted to speak via voice) by the + guild. + + + true if this user is muted by the guild; otherwise false. + + + + + Gets a value that indicates whether this user has marked themselves as deafened. + + + true if this user has deafened themselves (i.e. not permitted to listen to or speak to others); otherwise false. + + + + + Gets a value that indicates whether this user has marked themselves as muted (i.e. not permitted to + speak via voice). + + + true if this user has muted themselves; otherwise false. + + + + + Gets a value that indicates whether the user is muted by the current user. + + + true if the guild is temporarily blocking audio to/from this user; otherwise false. + + + + + Gets the voice channel this user is currently in. + + + A generic voice channel object representing the voice channel that the user is currently in; null + if none. + + + + + Gets the unique identifier for this user's voice session. + + + + + Gets a value that indicates if this user is streaming in a voice channel. + + + true if the user is streaming; otherwise false. + + + + Represents a Webhook Discord user. + + + Gets the ID of a webhook. + + + + Specifies the type of subscription a user is subscribed to. + + + + + No subscription. + + + + + Nitro Classic subscription. Includes app perks like animated emojis and avatars, but not games. + + + + + Nitro subscription. Includes app perks as well as the games subscription service. + + + + + Properties that are used to modify the with the specified changes. + + + + + + Gets or sets the username. + + + + + Gets or sets the avatar. + + + + + Default value for flags, when none are given to an account. + + + + + Flag given to Discord staff. + + + + + Flag given to Discord partners. + + + + + Flag given to users who have participated in the bug report program. + + + + + Flag given to users who are in the HypeSquad House of Bravery. + + + + + Flag given to users who are in the HypeSquad House of Brilliance. + + + + + Flag given to users who are in the HypeSquad House of Balance. + + + + + Flag given to users who subscribed to Nitro before games were added. + + + + + Defines the available Discord user status. + + + + + The user is offline. + + + + + The user is online. + + + + + The user is idle. + + + + + The user is AFK. + + + + + The user is busy. + + + + + The user is invisible. + + + + + Represents a webhook object on Discord. + + + + + Gets the token of this webhook. + + + + + Gets the default name of this webhook. + + + + + Gets the ID of this webhook's default avatar. + + + + + Gets the URL to this webhook's default avatar. + + + + + Gets the channel for this webhook. + + + + + Gets the ID of the channel for this webhook. + + + + + Gets the guild owning this webhook. + + + + + Gets the ID of the guild owning this webhook. + + + + + Gets the user that created this webhook. + + + + + Modifies this webhook. + + + + + Properties used to modify an with the specified changes. + + + + + + Gets or sets the default name of the webhook. + + + + + Gets or sets the default avatar of the webhook. + + + + + Gets or sets the channel for this webhook. + + + This field is not used when authenticated with . + + + + + Gets or sets the channel ID for this webhook. + + + This field is not used when authenticated with . + + + + + Represents the type of a webhook. + + + This type is currently unused, and is only returned in audit log responses. + + + + An incoming webhook + + + An extension class for squashing . + + This set of extension methods will squash an into a + single . This is often associated with requests that has a + set limit when requesting. + + + + Flattens the specified pages into one asynchronously. + + + Flattens the specified pages into one . + + + + The prefix applied to files to indicate that it is a spoiler. + + + + + Gets whether the message's attachments are spoilers or not. + + + + An extension class for the Discord client. + + + Gets the private channel with the provided ID. + + + Gets the DM channel with the provided ID. + + + Gets all available DM channels for the client. + + + Gets the group channel with the provided ID. + + + Gets all available group channels for the client. + + + Gets the most optimal voice region for the client. + + + An extension class for building an embed. + + + Adds embed color based on the provided raw value. + + + Adds embed color based on the provided RGB value. + + + Adds embed color based on the provided RGB value. + The argument value is not between 0 to 255. + + + Adds embed color based on the provided RGB value. + The argument value is not between 0 to 1. + + + Fills the embed author field with the provided user's full username and avatar URL. + + + Converts a object to a . + The embed type is not . + + + + Adds the specified fields into this . + + Field count exceeds . + + + + Adds the specified fields into this . + + + + + An extension class for . + + + + + Gets if welcome system messages are enabled. + + The guild to check. + A bool indicating if the welcome messages are enabled in the system channel. + + + + Gets if guild boost system messages are enabled. + + The guild to check. + A bool indicating if the guild boost messages are enabled in the system channel. + + + + Provides extension methods for . + + + + + Gets a URL that jumps to the message. + + The message to jump to. + + A string that contains a URL for jumping to the message in chat. + + + + + Add multiple reactions to a message. + + + This method does not bulk add reactions! It will send a request for each reaction inculded. + + + + IEmote A = new Emoji("🅰"); + IEmote B = new Emoji("🅱"); + await msg.AddReactionsAsync(new[] { A, B }); + + + The message to add reactions to. + An array of reactions to add to the message + The options to be used when sending the request. + + A task that represents the asynchronous operation for adding a reaction to this message. + + + + + + + Remove multiple reactions from a message. + + + This method does not bulk remove reactions! If you want to clear reactions from a message, + + + + + await msg.RemoveReactionsAsync(currentUser, new[] { A, B }); + + + The message to remove reactions from. + An array of reactions to remove from the message + The options to be used when sending the request. + + A task that represents the asynchronous operation for removing a reaction to this message. + + + + + + + Sends an inline reply that references a message. + + The message to be sent. + Determines whether the message should be read aloud by Discord or not. + The to be sent. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The options to be used when sending the request. + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + An extension class for various Discord user objects. + + + + Sends a message via DM. + + + This method attempts to send a direct-message to the user. + + + Please note that this method will throw an + if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. + + + You may want to consider catching for + 50007 when using this method. + + + + The user to send the DM to. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + + A task that represents the asynchronous send operation. The task result contains the sent message. + + + + + Sends a file to this message channel with an optional caption. + + + The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a + rich embed to the channel. + + await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", + embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); + + + + This method attempts to send an attachment as a direct-message to the user. + + + Please note that this method will throw an + if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. + + + You may want to consider catching for + 50007 when using this method. + + + + If you wish to upload an image and have it embedded in a embed, + you may upload the file and refer to the file with "attachment://filename.ext" in the + . See the example section for its usage. + + + The user to send the DM to. + The of the file to be sent. + The name of the attachment. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Sends a file via DM with an optional caption. + + + The following example uploads a local file called wumpus.txt along with the text + good discord boi to the channel. + + await channel.SendFileAsync("wumpus.txt", "good discord boi"); + + + The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the + channel. + + await channel.SendFileAsync("b1nzy.jpg", + embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); + + + + This method attempts to send an attachment as a direct-message to the user. + + + Please note that this method will throw an + if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. + + + You may want to consider catching for + 50007 when using this method. + + + + If you wish to upload an image and have it embedded in a embed, + you may upload the file and refer to the file with "attachment://filename.ext" in the + . See the example section for its usage. + + + The user to send the DM to. + The file path of the file. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Bans the user from the guild and optionally prunes their recent messages. + + The user to ban. + The number of days to remove messages from this for - must be between [0, 7] + The reason of the ban to be written in the audit log. + The options to be used when sending the request. + is not between 0 to 7. + + A task that represents the asynchronous operation for banning a user. + + + + A helper class for formatting characters. + + + Returns a markdown-formatted string with bold formatting. + + + Returns a markdown-formatted string with italics formatting. + + + Returns a markdown-formatted string with underline formatting. + + + Returns a markdown-formatted string with strikethrough formatting. + + + Returns a string with spoiler formatting. + + + Returns a markdown-formatted URL. Only works in descriptions and fields. + + + Escapes a URL so that a preview is not generated. + + + Returns a markdown-formatted string with codeblock formatting. + + + Sanitizes the string, safely escaping any Markdown sequences. + + + + Formats a string as a quote. + + The text to format. + Gets the formatted quote text. + + + + Formats a string as a block quote. + + The text to format. + Gets the formatted block quote text. + + + This intent includes no events + + + This intent includes GUILD_CREATE, GUILD_UPDATE, GUILD_DELETE, GUILD_ROLE_CREATE, GUILD_ROLE_UPDATE, GUILD_ROLE_DELETE, CHANNEL_CREATE, CHANNEL_UPDATE, CHANNEL_DELETE, CHANNEL_PINS_UPDATE + + + This intent includes GUILD_MEMBER_ADD, GUILD_MEMBER_UPDATE, GUILD_MEMBER_REMOVE + This is a privileged intent and must be enabled in the Developer Portal. + + + This intent includes GUILD_BAN_ADD, GUILD_BAN_REMOVE + + + This intent includes GUILD_EMOJIS_UPDATE + + + This intent includes GUILD_INTEGRATIONS_UPDATE + + + This intent includes WEBHOOKS_UPDATE + + + This intent includes INVITE_CREATE, INVITE_DELETE + + + This intent includes VOICE_STATE_UPDATE + + + This intent includes PRESENCE_UPDATE + This is a privileged intent and must be enabled in the Developer Portal. + + + This intent includes MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, MESSAGE_DELETE_BULK + + + This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI + + + This intent includes TYPING_START + + + This intent includes CHANNEL_CREATE, MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, CHANNEL_PINS_UPDATE + + + This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI + + + This intent includes TYPING_START + + + + Represents a generic Discord client. + + + + + Gets the current state of connection. + + + + + Gets the currently logged-in user. + + + + + Gets the token type of the logged-in user. + + + + + Starts the connection between Discord and the client.. + + + This method will initialize the connection between the client and Discord. + + This method will immediately return after it is called, as it will initialize the connection on + another thread. + + + + A task that represents the asynchronous start operation. + + + + + Stops the connection between Discord and the client. + + + A task that represents the asynchronous stop operation. + + + + + Gets a Discord application information for the logged-in user. + + + This method reflects your application information you submitted when creating a Discord application via + the Developer Portal. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the application + information. + + + + + Gets a generic channel. + + + + var channel = await _client.GetChannelAsync(381889909113225237); + if (channel != null && channel is IMessageChannel msgChannel) + { + await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); + } + + + The snowflake identifier of the channel (e.g. `381889909113225237`). + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the channel associated + with the snowflake identifier; null when the channel cannot be found. + + + + + Gets a collection of private channels opened in this session. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + This method will retrieve all private channels (including direct-message, group channel and such) that + are currently opened in this session. + + This method will not return previously opened private channels outside of the current session! If + you have just started the client, this may return an empty collection. + + + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of private channels that the user currently partakes in. + + + + + Gets a collection of direct message channels opened in this session. + + + This method returns a collection of currently opened direct message channels. + + This method will not return previously opened DM channels outside of the current session! If you + have just started the client, this may return an empty collection. + + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of direct-message channels that the user currently partakes in. + + + + + Gets a collection of group channels opened in this session. + + + This method returns a collection of currently opened group channels. + + This method will not return previously opened group channels outside of the current session! If you + have just started the client, this may return an empty collection. + + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of group channels that the user currently partakes in. + + + + + Gets the connections that the user has set up. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. + + + + + Gets a guild. + + The guild snowflake identifier. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the guild associated + with the snowflake identifier; null when the guild cannot be found. + + + + + Gets a collection of guilds that the user is currently in. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of guilds that the current user is in. + + + + + Creates a guild for the logged-in user who is in less than 10 active guilds. + + + This method creates a new guild on behalf of the logged-in user. + + Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. + + + The name of the new guild. + The voice region to create the guild with. + The icon of the guild. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created guild. + + + + + Gets an invite. + + The invitation identifier. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the invite information. + + + + + Gets a user. + + + + var user = await _client.GetUserAsync(168693960628371456); + if (user != null) + Console.WriteLine($"{user} is created at {user.CreatedAt}."; + + + The snowflake identifier of the user (e.g. `168693960628371456`). + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the user associated with + the snowflake identifier; null if the user is not found. + + + + + Gets a user. + + + + var user = await _client.GetUserAsync("Still", "2876"); + if (user != null) + Console.WriteLine($"{user} is created at {user.CreatedAt}."; + + + The name of the user (e.g. `Still`). + The discriminator value of the user (e.g. `2876`). + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the user associated with + the name and the discriminator; null if the user is not found. + + + + + Gets a collection of the available voice regions. + + + The following example gets the most optimal voice region from the collection. + + var regions = await client.GetVoiceRegionsAsync(); + var optimalRegion = regions.FirstOrDefault(x => x.IsOptimal); + + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + with all of the available voice regions in this session. + + + + + Gets a voice region. + + The identifier of the voice region (e.g. eu-central ). + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the voice region + associated with the identifier; null if the voice region is not found. + + + + + Gets a webhook available. + + The identifier of the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a webhook associated + with the identifier; null if the webhook is not found. + + + + + Gets the recommended shard count as suggested by Discord. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains an + that represents the number of shards that should be used with this account. + + + + + Gets the gateway information related to the bot. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a + that represents the gateway information related to the bot. + + + + + Provides a message object used for logging purposes. + + + + + Gets the severity of the log entry. + + + A enum to indicate the severeness of the incident or event. + + + + + Gets the source of the log entry. + + + A string representing the source of the log entry. + + + + + Gets the message of this log entry. + + + A string containing the message of this log entry. + + + + + Gets the exception of this log entry. + + + An object associated with an incident; otherwise null. + + + + + Initializes a new struct with the severity, source, message of the event, and + optionally, an exception. + + The severity of the event. + The source of the event. + The message of the event. + The exception of the event. + + + + Specifies the severity of the log message. + + + + + Logs that contain the most severe level of error. This type of error indicate that immediate attention + may be required. + + + + + Logs that highlight when the flow of execution is stopped due to a failure. + + + + + Logs that highlight an abnormal activity in the flow of execution. + + + + + Logs that track the general flow of the application. + + + + + Logs that are used for interactive investigation during development. + + + + + Logs that contain the most detailed messages. + + + + Specifies the state of the client's login status. + + + The client is currently logged out. + + + The client is currently logging in. + + + The client is currently logged in. + + + The client is currently logging out. + + + + Gets the JSON error code returned by Discord. + + + A + JSON error code + from Discord, or null if none. + + + + + Gets the reason of the exception. + + + + + Gets the request object used to send the request. + + + + + The error object returned from discord. + + + Note: This object can be null if discord didn't provide it. + + + + + The request json used to create the application command. This is useful for checking your commands for any format errors. + + + + + The underlying that caused this exception to be thrown. + + + + + Initializes a new instance of the class. + + The request that was sent prior to the exception. + + + The Discord status code returned. + The reason behind the exception. + + + + + Represents a ratelimit bucket. + + + + + Gets the http method used to make the request if available. + + + + + Gets the endpoint that is going to be requested if available. + + + + + Gets the major parameters of the route. + + + + + Gets the hash of this bucket. + + + The hash is provided by Discord to group ratelimits. + + + + + Gets if this bucket is a hash type. + + + + + Creates a new based on the + and . + + Http method used to make the request. + Endpoint that is going to receive requests. + Major parameters of the route of this endpoint. + + A based on the + and the with the provided data. + + + + + Creates a new based on a + and a previous . + + Bucket hash provided by Discord. + that is going to be upgraded to a hash type. + + A based on the + and . + + + + + Gets the string that will define this bucket as a hash based one. + + + A that defines this bucket as a hash based one. + + + + + Gets the string that will define this bucket as an endpoint based one. + + + A that defines this bucket as an endpoint based one. + + + + + The exception that is thrown if an error occurs while processing an Discord HTTP request. + + + + + Gets the HTTP status code returned by Discord. + + + An + HTTP status code + from Discord. + + + + + Gets the JSON error code returned by Discord. + + + A + JSON error code + from Discord, or null if none. + + + + + Gets the reason of the exception. + + + + + Gets the request object used to send the request. + + + + + The error object returned from discord. + + + Note: This object can be null if discord didn't provide it. + + + + + Initializes a new instance of the class. + + The HTTP status code returned. + The request that was sent prior to the exception. + The Discord status code returned. + The reason behind the exception. + + + + Represents a generic request to be sent to Discord. + + + + + The exception that is thrown when the user is being rate limited by Discord. + + + + + Gets the request object used to send the request. + + + + + Initializes a new instance of the class using the + sent. + + + + + Represents a generic REST-based client. + + + + + Sets the HTTP header of this client for all requests. + + The field name of the header. + The value of the header. + + + + Sets the cancellation token for this client. + + The cancellation token. + + + + Sends a REST request. + + The method used to send this request (i.e. HTTP verb such as GET, POST). + The endpoint to send this request to. + The cancellation token used to cancel the task. + Indicates whether to send the header only. + The audit log reason. + + + + + The exception that is thrown when the WebSocket session is closed by Discord. + + + + + Gets the close code sent by Discord. + + + A + close code + from Discord. + + + + + Gets the reason of the interruption. + + + + + Initializes a new instance of the using a Discord close code + and an optional reason. + + + + + Specifies the level of precision to request in the rate limit + response header. + + + + + Specifies precision rounded up to the nearest whole second + + + + + Specifies precision rounded to the nearest millisecond. + + + + + Represents options that should be used when sending a request. + + + + + Creates a new class with its default settings. + + + + + Gets or sets the maximum time to wait for for this request to complete. + + + Gets or set the max time, in milliseconds, to wait for for this request to complete. If + null, a request will not time out. If a rate limit has been triggered for this request's bucket + and will not be unpaused in time, this request will fail immediately. + + + A in milliseconds for when the request times out. + + + + + Gets or sets the cancellation token for this request. + + + A for this request. + + + + + Gets or sets the retry behavior when the request fails. + + + + + Gets or sets the reason for this action in the guild's audit log. + + + Gets or sets the reason that will be written to the guild's audit log if applicable. This may not apply + to all actions. + + + + + Gets or sets whether or not this request should use the system + clock for rate-limiting. Defaults to true. + + + This property can also be set in . + On a per-request basis, the system clock should only be disabled + when millisecond precision is especially important, and the + hosting system is known to have a desynced clock. + + + + + Initializes a new class with the default request timeout set in + . + + + + Specifies how a request should act in the case of an error. + + + If a request fails, an exception is thrown immediately. + + + Retry if a request timed out. + + + Retry if a request failed due to a rate-limit. + + + Retry if a request failed due to an HTTP error 502. + + + Continuously retry a request until it times out, its cancel token is triggered, or the server responds with a non-502 error. + + + Specifies the type of token to use with the client. + + + + An OAuth2 token type. + + + + + A bot token type. + + + + + A webhook token type. + + + + + Represents a cached entity. + + The type of entity that is cached. + The type of this entity's ID. + + + + Gets whether this entity is cached. + + + + + Gets the ID of this entity. + + + + + Gets the entity if it could be pulled from cache. + + + This value is not guaranteed to be set; in cases where the entity cannot be pulled from cache, it is + null. + + + + + Downloads this entity to cache. + + Thrown when used from a user account. + Thrown when the message is deleted. + + A task that represents the asynchronous download operation. The task result contains the downloaded + entity. + + + + + Returns the cached entity if it exists; otherwise downloads it. + + Thrown when used from a user account. + Thrown when the message is deleted and is not in cache. + + A task that represents the asynchronous operation that attempts to get the message via cache or to + download the message. The task result contains the downloaded entity. + + + + + Represents a collection of for various Discord objects. + + + + + Gets an to be used to compare users. + + + + + Gets an to be used to compare guilds. + + + + + Gets an to be used to compare channels. + + + + + Gets an to be used to compare roles. + + + + + Gets an to be used to compare messages. + + + + is null + + + + or is null + + + + is null + + + is null + + + is null + + + + + + + Provides a series of helper methods for parsing mentions. + + + + + Returns a mention string based on the user ID. + + + A user mention string (e.g. <@80351110224678912>). + + + + + Returns a mention string based on the channel ID. + + + A channel mention string (e.g. <#103735883630395392>). + + + + + Returns a mention string based on the role ID. + + + A role mention string (e.g. <@&165511591545143296>). + + + + + Parses a provided user mention string. + + Invalid mention format. + + + + Tries to parse a provided user mention string. + + + + + Parses a provided channel mention string. + + Invalid mention format. + + + + Tries to parse a provided channel mention string. + + + + + Parses a provided role mention string. + + Invalid mention format. + + + + Tries to parse a provided role mention string. + + + + Gets the value for this parameter. + This property has no value set. + + + Returns true if this value has been specified. + + + Creates a new Parameter with the provided value. + + + must not be . + + + must not be . + + + cannot be blank. + + + cannot be blank. + + + cannot be blank. + must not be . + + + cannot be blank. + must not be . + + + cannot be blank. + must not be . + + + cannot be blank. + must not be . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value may not be equal to . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be at least . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be greater than . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be at most . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Value must be less than . + + + Messages are younger than 2 weeks. + + + The everyone role cannot be assigned to a user. + + + + Provides a series of helper methods for handling snowflake identifiers. + + + + + Resolves the time of which the snowflake is generated. + + The snowflake identifier to resolve. + + A representing the time for when the object is geenrated. + + + + + Generates a pseudo-snowflake identifier with a . + + The time to be used in the new snowflake. + + A representing the newly generated snowflake identifier. + + + + + Provides a series of helper methods for handling Discord login tokens. + + + + + The minimum length of a Bot token. + + + This value was determined by comparing against the examples in the Discord + documentation, and pre-existing tokens. + + + + + Pads a base64-encoded string with 0, 1, or 2 '=' characters, + if the string is not a valid multiple of 4. + Does not ensure that the provided string contains only valid base64 characters. + Strings that already contain padding will not have any more padding applied. + + + A string that would require 3 padding characters is considered to be already corrupt. + Some older bot tokens may require padding, as the format provided by Discord + does not include this padding in the token. + + The base64 encoded string to pad with characters. + A string containing the base64 padding. + + Thrown if would require an invalid number of padding characters. + + + Thrown if is null, empty, or whitespace. + + + + + Decodes a base 64 encoded string into a ulong value. + + A base 64 encoded string containing a User Id. + A ulong containing the decoded value of the string, or null if the value was invalid. + + + + Checks the validity of a bot token by attempting to decode a ulong userid + from the bot token. + + + The bot token to validate. + + + True if the bot token was valid, false if it was not. + + + + + The set of all characters that are not allowed inside of a token. + + + + + Checks if the given token contains a whitespace or newline character + that would fail to log in. + + The token to validate. + + True if the token contains a whitespace or newline character. + + + + + Checks the validity of the supplied token of a specific type. + + The type of token to validate. + The token value to validate. + Thrown when the supplied token string is null, empty, or contains only whitespace. + Thrown when the supplied or token value is invalid. + + + diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index f1b258b75c..906e0a1100 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,12 +9,15 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.6 + 2.3.7 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 2.3.4 + + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Rest\Discord.Net.Rest.xml + diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml new file mode 100644 index 0000000000..e194609733 --- /dev/null +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -0,0 +1,4382 @@ + + + + Discord.Net.Rest + + + + + Gets the snowflake ID of the application. + + + + + Gets the ID of the embed's image asset. + + + + + Gets the application's description. + + + + + Gets the ID of the application's icon. + + + + + Gets the name of the application. + + + + Unknown OAuth token type. + + + Unknown OAuth token type. + + + Unknown OAuth token type. + + + + must not be equal to zero. + -and- + must be greater than zero. + + + must not be . + -and- + must not be or empty. + + + + Message content is too long, length must be less or equal to . + + + Message content is too long, length must be less or equal to . + This operation may only be called with a token. + + + Message content is too long, length must be less or equal to . + + + Message content is too long, length must be less or equal to . + This operation may only be called with a token. + + + Message content is too long, length must be less or equal to . + + + + and must not be equal to zero. + -and- + must be between 0 to 7. + + must not be . + + + and must not be equal to zero. + + + must not be equal to zero. + + + must not be equal to zero. + must not be . + + + must not be equal to zero. + + + must not be equal to zero. + must not be . + + + must not be equal to zero. + + + and must not be equal to zero. + must not be . + + + cannot be blank. + must not be . + + + may not be equal to zero. + + + may not be equal to zero. + + + may not be equal to zero. + + + + may not be equal to zero. + -and- + and must be greater than zero. + -and- + must be lesser than 86400. + + must not be . + + + Client is not logged in. + + + Unsupported param type. + + + The default RestClientProvider is not supported on this platform. + + + Cannot read from image. + + + Unknown permission target. + + + Invalid permission target. + + + + Gets the login state of the client. + + + + + Gets the logged-in user. + + + + + + + Creates a new REST-only Discord client. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Creating a guild is not supported with the base client. + + + + + + + + + + + + + + + + + + + + + + + + Unexpected channel type. + + + + Provides a client to send REST-based requests to Discord. + + + + + Gets the logged-in user. + + + + + + + + Initializes a new with the provided configuration. + + The configuration to be used with the client. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a configuration class for . + + + + Gets or sets the provider used to generate new REST connections. + + + + Contains a piece of audit log data related to a ban. + + + + + Gets the user that was banned. + + + A user object representing the banned user. + + + + + Contains a piece of audit log data related to a adding a bot to a guild. + + + + + Gets the bot that was added. + + + A user object representing the bot. + + + + + Contains a piece of audit log data related to a channel creation. + + + + + Gets the snowflake ID of the created channel. + + + A representing the snowflake identifier for the created channel. + + + + + Gets the name of the created channel. + + + A string containing the name of the created channel. + + + + + Gets the type of the created channel. + + + The type of channel that was created. + + + + + Gets the current slow-mode delay of the created channel. + + + An representing the time in seconds required before the user can send another + message; 0 if disabled. + null if this is not mentioned in this entry. + + + + + Gets the value that indicates whether the created channel is NSFW. + + + true if the created channel has the NSFW flag enabled; otherwise false. + null if this is not mentioned in this entry. + + + + + Gets the bit-rate that the clients in the created voice channel are requested to use. + + + An representing the bit-rate (bps) that the created voice channel defines and requests the + client(s) to use. + null if this is not mentioned in this entry. + + + + + Gets a collection of permission overwrites that was assigned to the created channel. + + + A collection of permission , containing the permission overwrites that were + assigned to the created channel. + + + + + Contains a piece of audit log data related to a channel deletion. + + + + + Gets the snowflake ID of the deleted channel. + + + A representing the snowflake identifier for the deleted channel. + + + + + Gets the name of the deleted channel. + + + A string containing the name of the deleted channel. + + + + + Gets the type of the deleted channel. + + + The type of channel that was deleted. + + + + + Gets the slow-mode delay of the deleted channel. + + + An representing the time in seconds required before the user can send another + message; 0 if disabled. + null if this is not mentioned in this entry. + + + + + Gets the value that indicates whether the deleted channel was NSFW. + + + true if this channel had the NSFW flag enabled; otherwise false. + null if this is not mentioned in this entry. + + + + + Gets the bit-rate of this channel if applicable. + + + An representing the bit-rate set of the voice channel. + null if this is not mentioned in this entry. + + + + + Gets a collection of permission overwrites that was assigned to the deleted channel. + + + A collection of permission . + + + + + Represents information for a channel. + + + + + Gets the name of this channel. + + + A string containing the name of this channel. + + + + + Gets the topic of this channel. + + + A string containing the topic of this channel, if any. + + + + + Gets the current slow-mode delay of this channel. + + + An representing the time in seconds required before the user can send another + message; 0 if disabled. + null if this is not mentioned in this entry. + + + + + Gets the value that indicates whether this channel is NSFW. + + + true if this channel has the NSFW flag enabled; otherwise false. + null if this is not mentioned in this entry. + + + + + Gets the bit-rate of this channel if applicable. + + + An representing the bit-rate set for the voice channel; + null if this is not mentioned in this entry. + + + + + Contains a piece of audit log data related to a channel update. + + + + + Gets the snowflake ID of the updated channel. + + + A representing the snowflake identifier for the updated channel. + + + + + Gets the channel information before the changes. + + + An information object containing the original channel information before the changes were made. + + + + + Gets the channel information after the changes. + + + An information object containing the channel information after the changes were made. + + + + + Contains a piece of audit log data related to an emoji creation. + + + + + Gets the snowflake ID of the created emoji. + + + A representing the snowflake identifier for the created emoji. + + + + + Gets the name of the created emoji. + + + A string containing the name of the created emoji. + + + + + Contains a piece of audit log data related to an emoji deletion. + + + + + Gets the snowflake ID of the deleted emoji. + + + A representing the snowflake identifier for the deleted emoji. + + + + + Gets the name of the deleted emoji. + + + A string containing the name of the deleted emoji. + + + + + Contains a piece of audit log data related to an emoji update. + + + + + Gets the snowflake ID of the updated emoji. + + + A representing the snowflake identifier of the updated emoji. + + + + + Gets the new name of the updated emoji. + + + A string containing the new name of the updated emoji. + + + + + Gets the old name of the updated emoji. + + + A string containing the old name of the updated emoji. + + + + + Represents information for a guild. + + + + + Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are + automatically moved to the AFK voice channel. + + + An representing the amount of time in seconds for a user to be marked as inactive + and moved into the AFK voice channel. + null if this is not mentioned in this entry. + + + + + Gets the default message notifications for users who haven't explicitly set their notification settings. + + + The default message notifications setting of this guild. + null if this is not mentioned in this entry. + + + + + Gets the ID of the AFK voice channel for this guild. + + + A representing the snowflake identifier of the AFK voice channel; null if + none is set. + + + + + Gets the name of this guild. + + + A string containing the name of this guild. + + + + + Gets the ID of the region hosting this guild's voice channels. + + + + + Gets the ID of this guild's icon. + + + A string containing the identifier for the splash image; null if none is set. + + + + + Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. + + + The level of requirements. + null if this is not mentioned in this entry. + + + + + Gets the owner of this guild. + + + A user object representing the owner of this guild. + + + + + Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to + perform administrative actions in this guild. + + + The level of MFA requirement. + null if this is not mentioned in this entry. + + + + + Gets the level of content filtering applied to user's content in a Guild. + + + The level of explicit content filtering. + + + + + Gets the ID of the channel where system messages are sent. + + + A representing the snowflake identifier of the channel where system + messages are sent; null if none is set. + + + + + Gets the ID of the widget embed channel of this guild. + + + A representing the snowflake identifier of the embedded channel found within the + widget settings of this guild; null if none is set. + + + + + Gets a value that indicates whether this guild is embeddable (i.e. can use widget). + + + true if this guild can be embedded via widgets; otherwise false. + null if this is not mentioned in this entry. + + + + + Contains a piece of audit log data related to a guild update. + + + + + Gets the guild information before the changes. + + + An information object containing the original guild information before the changes were made. + + + + + Gets the guild information after the changes. + + + An information object containing the guild information after the changes were made. + + + + + Contains a piece of audit log data related to an invite creation. + + + + + Gets the time (in seconds) until the invite expires. + + + An representing the time in seconds until this invite expires. + + + + + Gets the unique identifier for this invite. + + + A string containing the invite code (e.g. FTqNnyS). + + + + + Gets a value that determines whether the invite is a temporary one. + + + true if users accepting this invite will be removed from the guild when they log off; otherwise + false. + + + + + Gets the user that created this invite if available. + + + A user that created this invite or . + + + + + Gets the ID of the channel this invite is linked to. + + + A representing the channel snowflake identifier that the invite points to. + + + + + Gets the number of times this invite has been used. + + + An representing the number of times this invite was used. + + + + + Gets the max number of uses this invite may have. + + + An representing the number of uses this invite may be accepted until it is removed + from the guild; null if none is set. + + + + + Contains a piece of audit log data related to an invite removal. + + + + + Gets the time (in seconds) until the invite expires. + + + An representing the time in seconds until this invite expires. + + + + + Gets the unique identifier for this invite. + + + A string containing the invite code (e.g. FTqNnyS). + + + + + Gets a value that indicates whether the invite is a temporary one. + + + true if users accepting this invite will be removed from the guild when they log off; otherwise + false. + + + + + Gets the user that created this invite if available. + + + A user that created this invite or . + + + + + Gets the ID of the channel this invite is linked to. + + + A representing the channel snowflake identifier that the invite points to. + + + + + Gets the number of times this invite has been used. + + + An representing the number of times this invite has been used. + + + + + Gets the max number of uses this invite may have. + + + An representing the number of uses this invite may be accepted until it is removed + from the guild; null if none is set. + + + + + Represents information for an invite. + + + + + Gets the time (in seconds) until the invite expires. + + + An representing the time in seconds until this invite expires; null if this + invite never expires or not specified. + + + + + Gets the unique identifier for this invite. + + + A string containing the invite code (e.g. FTqNnyS). + + + + + Gets a value that indicates whether the invite is a temporary one. + + + true if users accepting this invite will be removed from the guild when they log off, + false if not; null if not specified. + + + + + Gets the ID of the channel this invite is linked to. + + + A representing the channel snowflake identifier that the invite points to; + null if not specified. + + + + + Gets the max number of uses this invite may have. + + + An representing the number of uses this invite may be accepted until it is removed + from the guild; null if none is specified. + + + + + Contains a piece of audit log data relating to an invite update. + + + + + Gets the invite information before the changes. + + + An information object containing the original invite information before the changes were made. + + + + + Gets the invite information after the changes. + + + An information object containing the invite information after the changes were made. + + + + + Contains a piece of audit log data related to a kick. + + + + + Gets the user that was kicked. + + + A user object representing the kicked user. + + + + + Contains a piece of audit log data related to disconnecting members from voice channels. + + + + + Gets the number of members that were disconnected. + + + An representing the number of members that were disconnected from a voice channel. + + + + + Represents information for a member. + + + + + Gets the nickname of the updated member. + + + A string representing the nickname of the updated member; null if none is set. + + + + + Gets a value that indicates whether the updated member is deafened by the guild. + + + true if the updated member is deafened (i.e. not permitted to listen to or speak to others) by the guild; + otherwise false. + null if this is not mentioned in this entry. + + + + + Gets a value that indicates whether the updated member is muted (i.e. not permitted to speak via voice) by the + guild. + + + true if the updated member is muted by the guild; otherwise false. + null if this is not mentioned in this entry. + + + + + Contains a piece of audit log data related to moving members between voice channels. + + + + + Gets the ID of the channel that the members were moved to. + + + A representing the snowflake identifier for the channel that the members were moved to. + + + + + Gets the number of members that were moved. + + + An representing the number of members that were moved to another voice channel. + + + + + Contains a piece of audit log data related to a change in a guild member's roles. + + + + + Gets a collection of role changes that were performed on the member. + + + A read-only collection of , containing the roles that were changed on + the member. + + + + + Gets the user that the roles changes were performed on. + + + A user object representing the user that the role changes were performed on. + + + + + An information object representing a change in one of a guild member's roles. + + + + + Gets the name of the role that was changed. + + + A string containing the name of the role that was changed. + + + + + Gets the ID of the role that was changed. + + + A representing the snowflake identifier of the role that was changed. + + + + + Gets a value that indicates whether the role was added to the user. + + + true if the role was added to the user; otherwise false. + + + + + Contains a piece of audit log data related to a change in a guild member. + + + + + Gets the user that the changes were performed on. + + + A user object representing the user who the changes were performed on. + + + + + Gets the member information before the changes. + + + An information object containing the original member information before the changes were made. + + + + + Gets the member information after the changes. + + + An information object containing the member information after the changes were made. + + + + + Contains a piece of audit log data related to message deletion(s). + + + + + Gets the ID of the channel that the messages were deleted from. + + + A representing the snowflake identifier for the channel that the messages were + deleted from. + + + + + Gets the number of messages that were deleted. + + + An representing the number of messages that were deleted from the channel. + + + + + Contains a piece of audit log data related to message deletion(s). + + + + + Gets the number of messages that were deleted. + + + An representing the number of messages that were deleted from the channel. + + + + + Gets the ID of the channel that the messages were deleted from. + + + A representing the snowflake identifier for the channel that the messages were + deleted from. + + + + + Gets the user of the messages that were deleted. + + + A user object representing the user that created the deleted messages. + + + + + Contains a piece of audit log data related to a pinned message. + + + + + Gets the ID of the messages that was pinned. + + + A representing the snowflake identifier for the messages that was pinned. + + + + + Gets the ID of the channel that the message was pinned from. + + + A representing the snowflake identifier for the channel that the message was pinned from. + + + + + Gets the user of the message that was pinned. + + + A user object representing the user that created the pinned message. + + + + + Contains a piece of audit log data related to an unpinned message. + + + + + Gets the ID of the messages that was unpinned. + + + A representing the snowflake identifier for the messages that was unpinned. + + + + + Gets the ID of the channel that the message was unpinned from. + + + A representing the snowflake identifier for the channel that the message was unpinned from. + + + + + Gets the user of the message that was unpinned. + + + A user object representing the user that created the unpinned message. + + + + + Contains a piece of audit log data for a permissions overwrite creation. + + + + + Gets the ID of the channel that the overwrite was created from. + + + A representing the snowflake identifier for the channel that the overwrite was + created from. + + + + + Gets the permission overwrite object that was created. + + + An object representing the overwrite that was created. + + + + + Contains a piece of audit log data related to the deletion of a permission overwrite. + + + + + Gets the ID of the channel that the overwrite was deleted from. + + + A representing the snowflake identifier for the channel that the overwrite was + deleted from. + + + + + Gets the permission overwrite object that was deleted. + + + An object representing the overwrite that was deleted. + + + + + Contains a piece of audit log data related to the update of a permission overwrite. + + + + + Gets the ID of the channel that the overwrite was updated from. + + + A representing the snowflake identifier for the channel that the overwrite was + updated from. + + + + + Gets the overwrite permissions before the changes. + + + An overwrite permissions object representing the overwrite permissions that the overwrite had before + the changes were made. + + + + + Gets the overwrite permissions after the changes. + + + An overwrite permissions object representing the overwrite permissions that the overwrite had after the + changes. + + + + + Gets the ID of the overwrite that was updated. + + + A representing the snowflake identifier of the overwrite that was updated. + + + + + Gets the target of the updated permission overwrite. + + + The target of the updated permission overwrite. + + + + + Contains a piece of audit log data related to a guild prune. + + + + + Gets the threshold for a guild member to not be kicked. + + + An representing the amount of days that a member must have been seen in the server, + to avoid being kicked. (i.e. If a user has not been seen for more than , they will be + kicked from the server) + + + + + Gets the number of members that were kicked during the purge. + + + An representing the number of members that were removed from this guild for having + not been seen within . + + + + + Contains a piece of audit log data related to a role creation. + + + + + Gets the ID of the role that was created. + + + A representing the snowflake identifier to the role that was created. + + + + + Gets the role information that was created. + + + An information object representing the properties of the role that was created. + + + + + Contains a piece of audit log data relating to a role deletion. + + + + + Gets the ID of the role that was deleted. + + + A representing the snowflake identifier to the role that was deleted. + + + + + Gets the role information that was deleted. + + + An information object representing the properties of the role that was deleted. + + + + + Represents information for a role edit. + + + + + Gets the color of this role. + + + A color object representing the color assigned to this role; null if this role does not have a + color. + + + + + Gets a value that indicates whether this role is mentionable. + + + true if other members can mention this role in a text channel; otherwise false; + null if this is not mentioned in this entry. + + + + + Gets a value that indicates whether this role is hoisted (i.e. its members will appear in a separate + section on the user list). + + + true if this role's members will appear in a separate section in the user list; otherwise + false; null if this is not mentioned in this entry. + + + + + Gets the name of this role. + + + A string containing the name of this role. + + + + + Gets the permissions assigned to this role. + + + A guild permissions object representing the permissions that have been assigned to this role; null + if no permissions have been assigned. + + + + + Contains a piece of audit log data related to a role update. + + + + + Gets the ID of the role that was changed. + + + A representing the snowflake identifier of the role that was changed. + + + + + Gets the role information before the changes. + + + A role information object containing the role information before the changes were made. + + + + + Gets the role information after the changes. + + + A role information object containing the role information after the changes were made. + + + + + Contains a piece of audit log data related to an unban. + + + + + Gets the user that was unbanned. + + + A user object representing the user that was unbanned. + + + + + Contains a piece of audit log data related to a webhook creation. + + + + + Gets the webhook that was created if it still exists. + + + A webhook object representing the webhook that was created if it still exists, otherwise returns null. + + + + + Gets the webhook id. + + + The webhook identifier. + + + + + Gets the type of webhook that was created. + + + The type of webhook that was created. + + + + + Gets the name of the webhook. + + + A string containing the name of the webhook. + + + + + Gets the ID of the channel that the webhook could send to. + + + A representing the snowflake identifier of the channel that the webhook could send + to. + + + + + Contains a piece of audit log data related to a webhook deletion. + + + + + Gets the ID of the webhook that was deleted. + + + A representing the snowflake identifier of the webhook that was deleted. + + + + + Gets the ID of the channel that the webhook could send to. + + + A representing the snowflake identifier of the channel that the webhook could send + to. + + + + + Gets the type of the webhook that was deleted. + + + The type of webhook that was deleted. + + + + + Gets the name of the webhook that was deleted. + + + A string containing the name of the webhook that was deleted. + + + + + Gets the hash value of the webhook's avatar. + + + A string containing the hash of the webhook's avatar. + + + + + Represents information for a webhook. + + + + + Gets the name of this webhook. + + + A string containing the name of this webhook. + + + + + Gets the ID of the channel that this webhook sends to. + + + A representing the snowflake identifier of the channel that this webhook can send + to. + + + + + Gets the hash value of this webhook's avatar. + + + A string containing the hash of this webhook's avatar. + + + + + Contains a piece of audit log data related to a webhook update. + + + + + Gets the webhook that was updated. + + + A webhook object representing the webhook that was updated. + + + + + Gets the webhook information before the changes. + + + A webhook information object representing the webhook before the changes were made. + + + + + Gets the webhook information after the changes. + + + A webhook information object representing the webhook after the changes were made. + + + + + Represents a REST-based audit log entry. + + + + + + + + + + + + + + + + + + + + may not be equal to zero. + -and- + and must be greater than zero. + -and- + must be lesser than 86400. + + + + Message content is too long, length must be less or equal to . + + + + is a zero-length string, contains only white space, or contains one or more + invalid characters as defined by . + + + is null. + + + The specified path, file name, or both exceed the system-defined maximum length. For example, on + Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 + characters. + + + The specified path is invalid, (for example, it is on an unmapped drive). + + + specified a directory.-or- The caller does not have the required permission. + + + The file specified in was not found. + + is in an invalid format. + An I/O error occurred while opening the file. + Message content is too long, length must be less or equal to . + + + Message content is too long, length must be less or equal to . + + + Resolving permissions requires the parent guild to be downloaded. + + + Resolving permissions requires the parent guild to be downloaded. + + + This channel does not have a parent channel. + + + + Represents a REST-based channel that can send and receive messages. + + + + + Sends a message to this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The message to be sent. + Determines whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Sends a file to this message channel with an optional caption. + + + This method follows the same behavior as described in + . Please visit + its documentation for more details on this method. + + The file path of the file. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + Whether the message attachment should be hidden as a spoiler. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Sends a file to this message channel with an optional caption. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The of the file to be sent. + The name of the attachment. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + Whether the message attachment should be hidden as a spoiler. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Gets a message from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The snowflake identifier of the message. + The options to be used when sending the request. + + A task that represents an asynchronous get operation for retrieving the message. The task result contains + the retrieved message; null if no message is found with the specified identifier. + + + + + Gets the last N messages from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The ID of the starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of pinned messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation for retrieving pinned messages in this channel. + The task result contains a collection of messages found in the pinned messages. + + + + + Represents a REST-based channel that is private to select recipients. + + + + + Users that can access this channel. + + + + + Represents a REST-based category channel. + + + + + This method is not supported with category channels. + + + + This method is not supported with category channels. + + + + Represents a generic REST-based channel. + + + + + + + Unexpected channel type. + + + Unexpected channel type. + + + + + + + + + + + + + + + + Represents a REST-based direct-message channel. + + + + + Gets the current logged-in user. + + + + + Gets the recipient of the channel. + + + + + Gets a collection that is the current logged-in user and the recipient. + + + + + + + + + + + Gets a user in this channel from the provided . + + The snowflake identifier of the user. + + A object that is a recipient of this channel; otherwise null. + + + + + + + + + + + + + + + + + + + + Message content is too long, length must be less or equal to . + + + + + is a zero-length string, contains only white space, or contains one or more + invalid characters as defined by . + + + is null. + + + The specified path, file name, or both exceed the system-defined maximum length. For example, on + Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 + characters. + + + The specified path is invalid, (for example, it is on an unmapped drive). + + + specified a directory.-or- The caller does not have the required permission. + + + The file specified in was not found. + + is in an invalid format. + An I/O error occurred while opening the file. + Message content is too long, length must be less or equal to . + + + + Message content is too long, length must be less or equal to . + + + + + + + + + + + + + + + + Gets a string that represents the Username#Discriminator of the recipient. + + + A string that resolves to the Recipient of this channel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a REST-based group-message channel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Message content is too long, length must be less or equal to . + + + + + is a zero-length string, contains only white space, or contains one or more + invalid characters as defined by . + + + is null. + + + The specified path, file name, or both exceed the system-defined maximum length. For example, on + Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 + characters. + + + The specified path is invalid, (for example, it is on an unmapped drive). + + + specified a directory.-or- The caller does not have the required permission. + + + The file specified in was not found. + + is in an invalid format. + An I/O error occurred while opening the file. + Message content is too long, length must be less or equal to . + + + + Message content is too long, length must be less or equal to . + + + + + + + + + + Connecting to a group channel is not supported. + + + + Represents a private REST-based group channel. + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the permission overwrite for a specific user. + + The user to get the overwrite from. + + An overwrite object for the targeted user; null if none is set. + + + + + Gets the permission overwrite for a specific role. + + The role to get the overwrite from. + + An overwrite object for the targeted role; null if none is set. + + + + + Adds or updates the permission overwrite for the given user. + + The user to add the overwrite to. + The overwrite to add to the user. + The options to be used when sending the request. + + A task representing the asynchronous permission operation for adding the specified permissions to the channel. + + + + + Adds or updates the permission overwrite for the given role. + + The role to add the overwrite to. + The overwrite to add to the role. + The options to be used when sending the request. + + A task representing the asynchronous permission operation for adding the specified permissions to the channel. + + + + + Removes the permission overwrite for the given user, if one exists. + + The user to remove the overwrite from. + The options to be used when sending the request. + + A task representing the asynchronous operation for removing the specified permissions from the channel. + + + + + Removes the permission overwrite for the given role, if one exists. + + The role to remove the overwrite from. + The options to be used when sending the request. + + A task representing the asynchronous operation for removing the specified permissions from the channel. + + + + + Gets the name of this channel. + + + A string that is the name of this channel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a REST-based news channel in a guild that has the same properties as a . + + + + + Represents a REST-based channel in a guild that can send and receive messages. + + + + + + + + + + + + + + + + + + + + + + + + + + Gets a user in this channel. + + The snowflake identifier of the user. + The options to be used when sending the request. + + Resolving permissions requires the parent guild to be downloaded. + + + A task representing the asynchronous get operation. The task result contains a guild user object that + represents the user; null if none is found. + + + + + Gets a collection of users that are able to view the channel. + + The options to be used when sending the request. + + Resolving permissions requires the parent guild to be downloaded. + + + A paged collection containing a collection of guild users that can access this channel. Flattening the + paginated response into a collection of users with + is required if you wish to access the users. + + + + + + + + + + + + + + + + + + + + Message content is too long, length must be less or equal to . + + + + + is a zero-length string, contains only white space, or contains one or more + invalid characters as defined by . + + + is null. + + + The specified path, file name, or both exceed the system-defined maximum length. For example, on + Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 + characters. + + + The specified path is invalid, (for example, it is on an unmapped drive). + + + specified a directory.-or- The caller does not have the required permission. + + + The file specified in was not found. + + is in an invalid format. + An I/O error occurred while opening the file. + Message content is too long, length must be less or equal to . + + + + Message content is too long, length must be less or equal to . + + + + + + + + + + + + + + + + + + + + + + Creates a webhook in this text channel. + + The name of the webhook. + The avatar of the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + webhook. + + + + + Gets a webhook available in this text channel. + + The identifier of the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a webhook associated + with the identifier; null if the webhook is not found. + + + + + Gets the webhooks available in this text channel. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of webhooks that is available in this channel. + + + + + Gets the parent (category) channel of this channel. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the category channel + representing the parent of this channel; null if none is set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a REST-based voice channel in a guild. + + + + + + + + + + + + + + + + + + + + Gets the parent (category) channel of this channel. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the category channel + representing the parent of this channel; null if none is set. + + + + + + + + + + + + + + Connecting to a REST-based channel is not supported. + + + + + + + + + + + + is null. + + + is null. + + + is null. + + + is null. + + + is null. + + + is null. + + + is null. + + + is null. + + + + Represents a REST-based ban object. + + + + + Gets the banned user. + + + A generic object that was banned. + + + + + + + + Gets the name of the banned user. + + + A string containing the name of the user that was banned. + + + + + + + + Represents a REST-based guild/server. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the built-in role containing all users in this guild. + + + + + Gets a collection of all roles in this guild. + + + + + + + + + + + + + + Updates this object's properties with its current state. + + + If true, and + will be updated as well. + + The options to be used when sending the request. + + If is true, and + will be updated as well. + + + + + + + + is . + + + + is . + + + + is . + + + + is . + + + + + + + + + + Gets a collection of all users banned in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + ban objects that this guild currently possesses, with each object containing the user banned and reason + behind the ban. + + + + + Gets a ban object for a banned user. + + The banned user. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a ban object, which + contains the user information and the reason for the ban; if the ban entry cannot be found. + + + + + Gets a ban object for a banned user. + + The snowflake identifier for the banned user. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a ban object, which + contains the user information and the reason for the ban; if the ban entry cannot be found. + + + + + + + + + + + + + + + + + Gets a collection of all channels in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + generic channels found within this guild. + + + + + Gets a channel in this guild. + + The snowflake identifier for the channel. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the generic channel + associated with the specified ; if none is found. + + + + + Gets a text channel in this guild. + + The snowflake identifier for the text channel. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel + associated with the specified ; if none is found. + + + + + Gets a collection of all text channels in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + message channels found within this guild. + + + + + Gets a voice channel in this guild. + + The snowflake identifier for the voice channel. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the voice channel associated + with the specified ; if none is found. + + + + + Gets a collection of all voice channels in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + voice channels found within this guild. + + + + + Gets a collection of all category channels in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + category channels found within this guild. + + + + + Gets the AFK voice channel in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the voice channel that the + AFK users will be moved to after they have idled for too long; if none is set. + + + + + Gets the first viewable text channel in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the first viewable text + channel in this guild; if none is found. + + + + + Gets the embed channel (i.e. the channel set in the guild's widget settings) in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the embed channel set + within the server's widget settings; if none is set. + + + + + Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the widget channel set + within the server's widget settings; if none is set. + + + + + Gets the text channel where guild notices such as welcome messages and boost events are posted. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel + where guild notices such as welcome messages and boost events are poste; if none is found. + + + + + Gets the text channel where Community guilds can display rules and/or guidelines. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel + where Community guilds can display rules and/or guidelines; if none is set. + + + + + Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the text channel channel where + admins and moderators of Community guilds receive notices from Discord; if none is set. + + + + + Creates a new text channel in this guild. + + + The following example creates a new text channel under an existing category named Wumpus with a set topic. + + 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}."; + }); + + + The new name for the text channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + text channel. + + + + + Creates a voice channel with the provided name. + + The name of the new channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + is . + + The created voice channel. + + + + + Creates a category channel with the provided name. + + The name of the new channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + is . + + The created category channel. + + + + + Gets a collection of all the voice regions this guild can access. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + voice regions the guild can access. + + + + + Gets a collection of all invites in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + invite metadata, each representing information for an invite found within this guild. + + + + + Gets the vanity invite URL of this guild. + + The options to be used when sending the request. + + A partial metadata of the vanity invite found within this guild. + + + + + Gets a role in this guild. + + The snowflake identifier for the role. + + A role that is associated with the specified ; if none is found. + + + + + + + + Creates a new role with the provided name. + + The new name for the role. + The guild permission that the role should possess. + The color of the role. + Whether the role is separated from others on the sidebar. + The options to be used when sending the request. + Whether the role can be mentioned. + + A task that represents the asynchronous creation operation. The task result contains the newly created + role. + + + + + Gets a collection of all users in this guild. + + + This method retrieves all users found within this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a collection of guild + users found within this guild. + + + + + + + + Gets a user from this guild. + + + This method retrieves a user found within this guild. + + The snowflake identifier of the user. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the guild user + associated with the specified ; if none is found. + + + + + Gets the current user for this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the currently logged-in + user within this guild. + + + + + Gets the owner of this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the owner of this guild. + + + + + + Prunes inactive users. + + + + This method removes all users that have not logged on in the provided number of . + + + If is true, this method will only return the number of users that + would be removed without kicking the users. + + + The number of days required for the users to be kicked. + Whether this prune action is a simulation. + The options to be used when sending the request. + + A task that represents the asynchronous prune operation. The task result contains the number of users to + be or has been removed from this guild. + + + + + Gets a collection of users in this guild that the name or nickname starts with the + provided at . + + + The can not be higher than . + + The partial name or nickname to search. + The maximum number of users to be gotten. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a collection of guild + users that the name or nickname starts with the provided at . + + + + + Gets the specified number of audit log entries for this guild. + + The number of audit log entries to fetch. + The options to be used when sending the request. + The audit log entry ID to get entries before. + The type of actions to filter. + The user ID to filter entries for. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of the requested audit log entries. + + + + + Gets a webhook found within this guild. + + The identifier for the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the webhook with the + specified ; if none is found. + + + + + Gets a collection of all webhook from this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of webhooks found within the guild. + + + + + Returns the name of the guild. + + + The name of the guild. + + + + + + + + + + + is . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Downloading users is not supported for a REST-based guild. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a REST-based voice region. + + + + + + + + + + + + + + + + + + + + Represents a Rest-based implementation of the . + + + + + + + + + + + + + + The options of this command. + + + + + The type of this rest application command. + + + + + + + + Represents a Rest-based implementation of . + + + + + + + + + + + Represents a Rest-based implementation of . + + + + + + + + + + + + + + + + + + + + A collection of 's for this command. + + + + + A collection of 's for this command. + + + + + Represents a type of Rest-based command. + + + + + Specifies that this command is a Global command. + + + + + Specifies that this command is a Guild specific command. + + + + + Represents a global Slash command. + + + + + + + + Modifies this . + + The delegate containing the properties to modify the command with. + The options to be used when sending the request. + + The modified command. + + + + + Represents a Rest-based guild command. + + + + + The guild Id where this command originates. + + + + + + + + Modifies this . + + The delegate containing the properties to modify the command with. + The options to be used when sending the request. + + The modified command + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the URL of the invite. + + + A string that resolves to the Url of the invite. + + + + + + + + + + Represents additional information regarding the REST-based invite object. + + + + + + + + + + + + + + + + + + + Gets the user that created this invite. + + + + + + + + + + + Regex used to check if some text is formatted as inline code. + + + + + Regex used to check if some text is formatted as a code block. + + + + Only the author of a message may modify the message. + Message content is too long, length must be less or equal to . + + + + Represents a REST-based follow up message sent by a bot responding to a slash command. + + + + + Deletes this object and all of it's childern. + + A task that represents the asynchronous delete operation. + + + + Modifies this interaction followup message. + + + This method modifies this message with the specified properties. To see an example of this + method and what properties are available, please refer to . + + + The following example replaces the content of the message with Hello World!. + + await msg.ModifyAsync(x => x.Content = "Hello World!"); + + + A delegate containing the properties to modify the message with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + The token used to modify/delete this message expired. + /// Somthing went wrong during the request. + + + + Represents the initial REST-based response to a slash command. + + + + + Deletes this object and all of it's childern. + + A task that represents the asynchronous delete operation. + + + + Modifies this interaction response + + + This method modifies this message with the specified properties. To see an example of this + method and what properties are available, please refer to . + + + The following example replaces the content of the message with Hello World!. + + await msg.ModifyAsync(x => x.Content = "Hello World!"); + + + A delegate containing the properties to modify the message with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + The token used to modify/delete this message expired. + /// Somthing went wrong during the request. + + + + Represents a REST-based message. + + + + + + + + Gets the Author of the message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets a collection of the 's on the message. + + + + + Gets a collection of the 's on the message. + + + + + + + + + + + Gets a collection of the mentioned users in the message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the of the message. + + + A string that is the of the message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a REST reaction object. + + + + + + + + Gets the number of reactions added. + + + + + Gets whether the reactions is added by the user. + + + + + Represents a REST-based system message. + + + + + + + + Represents a REST-based message sent by a user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This operation may only be called on a channel. + + + + Represents a REST-based entity that contains information about a Discord application created via the developer portal. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unable to update this object from a different application token. + + + + Gets the name of the application. + + + Name of the application. + + + + + Represents a REST-based role. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets if this role is the @everyone role of the guild or not. + + + + + + + + + + + + + + + + + Gets the name of the role. + + + A string that is the name of the role. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the name of the connection. + + + Name of the connection. + + + + + Represents a REST-based group user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a REST-based guild user. + + + + + + + + + + + + + + + + + + + + Resolving permissions requires the parent guild to be downloaded. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Resolving permissions requires the parent guild to be downloaded. + + + + + + + + + + + + + + + + + + + + + + + + + Represents the logged-in REST-based user. + + + + + + + + + + + + + + + + + + + + + + + + + + Unable to update this object using a different token. + + + + Unable to modify this object using a different token. + + + + Represents a REST-based user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns a direct message channel to this user, or create one if it does not already exist. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a rest DM channel where the user is the recipient. + + + + + + + + + + + Gets the Username#Discriminator of the user. + + + A string that resolves to Username#Discriminator of the user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adds a user to the specified guild. + + + This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. + + The Discord client object. + The snowflake identifier of the guild. + The snowflake identifier of the user. + The OAuth2 access token for the user, requested with the guilds.join scope. + The delegate containing the properties to be applied to the user upon being added to the guild. + The options to be used when sending the request. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns the filename of this attachment. + + + A string containing the filename of this attachment. + + + + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index b091978751..ebd0dd2572 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,12 +8,15 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.6 + 2.3.7 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png Discord.Net.Labs.WebSocket + + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.WebSocket\Discord.Net.WebSocket.xml + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml new file mode 100644 index 0000000000..4e9113a97b --- /dev/null +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -0,0 +1,4607 @@ + + + + Discord.Net.WebSocket + + + + C←S - Used to send most events. + + + C↔S - Used to keep the connection alive and measure latency. + + + C→S - Used to associate a connection with a token and specify configuration. + + + C→S - Used to update client's status and current game id. + + + C→S - Used to join a particular voice channel. + + + C→S - Used to ensure the guild's voice server is alive. + + + C→S - Used to resume a connection after a redirect occurs. + + + C←S - Used to notify a client that they must reconnect to another gateway. + + + C→S - Used to request members that were withheld by large_threshold + + + C←S - Used to notify the client that their session has expired and cannot be resumed. + + + C←S - Used to provide information to the client immediately on connection. + + + C←S - Used to reply to a client's heartbeat. + + + C→S - Used to request presence updates from particular guilds. + + + C→S - Used to associate a connection with a token. + + + C→S - Used to specify configuration. + + + C←S - Used to notify that the voice connection was successful and informs the client of available protocols. + + + C→S - Used to keep the connection alive and measure latency. + + + C←S - Used to provide an encryption key to the client. + + + C↔S - Used to inform that a certain user is speaking. + + + C←S - Used to reply to a client's heartbeat. + + + C→S - Used to resume a connection. + + + C←S - Used to inform the client the heartbeat interval. + + + C←S - Used to acknowledge a resumed connection. + + + C←S - Used to notify that a client has disconnected. + + + The client must be logged in before connecting. + This client is not configured with WebSocket support. + + + This client is not configured with WebSocket support. + + + Creates a new REST/WebSocket discord client. + + + + + + Wraps another stream with a timed buffer. + + + Reads the payload from an RTP frame + + + Converts Opus to PCM + + + Header received with no payload. + + + Received payload without an RTP header. + + + Converts PCM to Opus + + + Wraps an IAudioClient, sending voice data on write. + + + Reads the payload from an RTP frame + + + The token has had cancellation requested. + The associated has been disposed. + + + Wraps data in an RTP frame + + + + Decrypts an RTP frame using libsodium. + + + + + Encrypts an RTP frame using libsodium. + + + + Header received with no payload. + + + Received payload without an RTP header. + The token has had cancellation requested. + The associated has been disposed. + + + + Represents the base of a WebSocket-based Discord client. + + + + + Gets the estimated round-trip latency, in milliseconds, to the gateway server. + + + An that represents the round-trip latency to the WebSocket server. Please + note that this value does not represent a "true" latency for operations such as sending a message. + + + + + Gets the status for the logged-in user. + + + A status object that represents the user's online presence status. + + + + + Gets the activity for the logged-in user. + + + An activity object that represents the user's current activity. + + + + + Provides access to a REST-only client with a shared state from this client. + + + + + Gets the current logged-in user. + + + + + Gets a collection of guilds that the user is currently in. + + + A read-only collection of guilds that the current user is in. + + + + + Gets a collection of private channels opened in this session. + + + This method will retrieve all private channels (including direct-message, group channel and such) that + are currently opened in this session. + + This method will not return previously opened private channels outside of the current session! If + you have just started the client, this may return an empty collection. + + + + A read-only collection of private channels that the user currently partakes in. + + + + + Gets a collection of available voice regions. + + + A read-only collection of voice regions that the user has access to. + + + + + Gets a Discord application information for the logged-in user. + + + This method reflects your application information you submitted when creating a Discord application via + the Developer Portal. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the application + information. + + + + + Gets a generic user. + + The user snowflake ID. + + This method gets the user present in the WebSocket cache with the given condition. + + Sometimes a user may return null 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 . + + + 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 + . + + + + A generic WebSocket-based user; null when the user cannot be found. + + + + + Gets a user. + + + This method gets the user present in the WebSocket cache with the given condition. + + Sometimes a user may return null 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 . + + + 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 + . + + + The name of the user. + The discriminator value of the user. + + A generic WebSocket-based user; null when the user cannot be found. + + + + + Gets a channel. + + The snowflake identifier of the channel (e.g. `381889909113225237`). + + A generic WebSocket-based channel object (voice, text, category, etc.) associated with the identifier; + null when the channel cannot be found. + + + + + Gets a guild. + + The guild snowflake identifier. + + A WebSocket-based guild associated with the snowflake identifier; null when the guild cannot be + found. + + + + + Gets a voice region. + + The identifier of the voice region (e.g. eu-central ). + + A REST-based voice region associated with the identifier; null if the voice region is not + found. + + + + + + + + + + + Sets the current status of the user (e.g. Online, Do not Disturb). + + The new status to be set. + + A task that represents the asynchronous set operation. + + + + + Sets the game of the user. + + The name of the game. + If streaming, the URL of the stream. Must be a valid Twitch URL. + The type of the game. + + A task that represents the asynchronous set operation. + + + + + Sets the of the logged-in user. + + + This method sets the of the user. + + Discord will only accept setting of name and the type of activity. + + + Rich Presence cannot be set via this method or client. Rich Presence is strictly limited to RPC + clients only. + + + The activity to be set. + + A task that represents the asynchronous set operation. + + + + + Attempts to download users into the user cache for the selected guilds. + + The guilds to download the members from. + + A task that represents the asynchronous download operation. + + + + + Creates a guild for the logged-in user who is in less than 10 active guilds. + + + This method creates a new guild on behalf of the logged-in user. + + Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. + + + The name of the new guild. + The voice region to create the guild with. + The icon of the guild. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created guild. + + + + + Gets the connections that the user has set up. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. + + + + + Gets an invite. + + The invitation identifier. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the invite information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fired when a channel is created. + + + This event is fired when a generic channel has been created. The event handler must return a + and accept a as its parameter. + + + The newly created channel is passed into the event handler parameter. The given channel type may + include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); + see the derived classes of for more details. + + + + + + + + Fired when a channel is destroyed. + + + This event is fired when a generic channel has been destroyed. The event handler must return a + and accept a as its parameter. + + + The destroyed channel is passed into the event handler parameter. The given channel type may + include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); + see the derived classes of for more details. + + + + + + + + Fired when a channel is updated. + + + This event is fired when a generic channel has been destroyed. The event handler must return a + and accept 2 as its parameters. + + + The original (prior to update) channel is passed into the first , while + the updated channel is passed into the second. The given channel type may include, but not limited + to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); see the derived classes of + for more details. + + + + + + + + Fired when a message is received. + + + This event is fired when a message is received. The event handler must return a + and accept a as its parameter. + + + The message that is sent to the client is passed into the event handler parameter as + . This message may be a system message (i.e. + ) or a user message (i.e. . See the + derived classes of for more details. + + + + The example below checks if the newly received message contains the target user. + + + + + Fired when a message is deleted. + + + This event is fired when a message is deleted. The event handler must return a + and accept a and + as its parameters. + + + + It is not possible to retrieve the message via + ; the message cannot be retrieved by Discord + after the message has been deleted. + + If caching is enabled via , the + entity will contain the deleted message; otherwise, in event + that the message cannot be retrieved, the snowflake ID of the message is preserved in the + . + + + The source channel of the removed message will be passed into the + parameter. + + + + + + + + Fired when multiple messages are bulk deleted. + + + The event will not be fired for individual messages contained in this event. + + + This event is fired when multiple messages are bulk deleted. The event handler must return a + and accept an and + as its parameters. + + + + It is not possible to retrieve the message via + ; the message cannot be retrieved by Discord + after the message has been deleted. + + If caching is enabled via , the + entity will contain the deleted message; otherwise, in event + that the message cannot be retrieved, the snowflake ID of the message is preserved in the + . + + + The source channel of the removed message will be passed into the + parameter. + + + + + Fired when a message is updated. + + + This event is fired when a message is updated. The event handler must return a + and accept a , , + and as its parameters. + + + If caching is enabled via , the + entity will contain the original message; otherwise, in event + that the message cannot be retrieved, the snowflake ID of the message is preserved in the + . + + + The updated message will be passed into the parameter. + + + The source channel of the updated message will be passed into the + parameter. + + + + + Fired when a reaction is added to a message. + + + This event is fired when a reaction is added to a user message. The event handler must return a + and accept a , an + , and a as its parameter. + + + If caching is enabled via , the + entity will contain the original message; otherwise, in event + that the message cannot be retrieved, the snowflake ID of the message is preserved in the + . + + + The source channel of the reaction addition will be passed into the + parameter. + + + The reaction that was added will be passed into the parameter. + + + When fetching the reaction from this event, a user may not be provided under + . Please see the documentation of the property for more + information. + + + + + + + + Fired when a reaction is removed from a message. + + + Fired when all reactions to a message are cleared. + + + + Fired when all reactions to a message with a specific emote are removed. + + + + This event is fired when all reactions to a message with a specific emote are removed. + The event handler must return a and accept a and + a as its parameters. + + + The channel where this message was sent will be passed into the parameter. + + + The emoji that all reactions had and were removed will be passed into the parameter. + + + + + Fired when a role is created. + + + Fired when a role is deleted. + + + Fired when a role is updated. + + + Fired when the connected account joins a guild. + + + Fired when the connected account leaves a guild. + + + Fired when a guild becomes available. + + + Fired when a guild becomes unavailable. + + + Fired when offline guild members are downloaded. + + + Fired when a guild is updated. + + + Fired when a user joins a guild. + + + Fired when a user leaves a guild. + + + Fired when a user is banned from a guild. + + + Fired when a user is unbanned from a guild. + + + Fired when a user is updated. + + + Fired when a guild member is updated, or a member presence is updated. + + + Fired when a user joins, leaves, or moves voice channels. + + + Fired when the bot connects to a Discord voice server. + + + Fired when the connected account is updated. + + + Fired when a user starts typing. + + + Fired when a user joins a group channel. + + + Fired when a user is removed from a group channel. + + + + Fired when an invite is created. + + + + This event is fired when an invite is created. The event handler must return a + and accept a as its parameter. + + + The invite created will be passed into the parameter. + + + + + + Fired when an invite is deleted. + + + + This event is fired when an invite is deleted. The event handler must return + a and accept a and + as its parameter. + + + The channel where this invite was created will be passed into the parameter. + + + The code of the deleted invite will be passed into the parameter. + + + + + + Fired when an Interaction is created. + + + + This event is fired when an interaction is created. The event handler must return a + and accept a as its parameter. + + + The interaction created will be passed into the parameter. + + + + + + Fired when a guild application command is created. + + + + This event is fired when an application command is created. The event handler must return a + and accept a as its parameter. + + + The command that was deleted will be passed into the parameter. + + + This event is an undocumented discord event and may break at any time, its not recommended to rely on this event + + + + + + Fired when a guild application command is updated. + + + + This event is fired when an application command is updated. The event handler must return a + and accept a as its parameter. + + + The command that was deleted will be passed into the parameter. + + + This event is an undocumented discord event and may break at any time, its not recommended to rely on this event + + + + + + Fired when a guild application command is deleted. + + + + This event is fired when an application command is deleted. The event handler must return a + and accept a as its parameter. + + + The command that was deleted will be passed into the parameter. + + + This event is an undocumented discord event and may break at any time, its not recommended to rely on this event + + + + + + + + + + + + + + + + + + + + + + + + Provides access to a REST-only client with a shared state from this client. + + + + Creates a new REST/WebSocket Discord client. + + + Creates a new REST/WebSocket Discord client. + + + Creates a new REST/WebSocket Discord client. + + + Creates a new REST/WebSocket Discord client. + + + + + + + + + + + + + + + + + + + + + + + + + + + + is + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fired when a shard is connected to the Discord gateway. + + + Fired when a shard is disconnected from the Discord gateway. + + + Fired when a guild data for a shard has finished downloading. + + + Fired when a shard receives a heartbeat from the Discord gateway. + + + + Represents a WebSocket-based Discord client. + + + + + Provides access to a REST-only client with a shared state from this client. + + + + Gets the shard of of this client. + + + Gets the current connection state of this client. + + + + + + + + + + + + + + + + + + + Gets a collection of direct message channels opened in this session. + + + This method returns a collection of currently opened direct message channels. + + This method will not return previously opened DM channels outside of the current session! If you + have just started the client, this may return an empty collection. + + + + A collection of DM channels that have been opened in this session. + + + + + Gets a collection of group channels opened in this session. + + + This method returns a collection of currently opened group channels. + + This method will not return previously opened group channels outside of the current session! If you + have just started the client, this may return an empty collection. + + + + A collection of group channels that have been opened in this session. + + + + + + + + Initializes a new REST/WebSocket-based Discord client. + + + + + Initializes a new REST/WebSocket-based Discord client with the provided configuration. + + The configuration to be used with the client. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Clears all cached channels from the client. + + + + + Clears cached DM channels from the client. + + + + + + + + + + + Clears cached users from the client. + + + + + + + + + + + + The following example sets the status of the current user to Do Not Disturb. + + await client.SetStatusAsync(UserStatus.DoNotDisturb); + + + + + + + + The following example sets the activity of the current user to the specified game name. + + await client.SetGameAsync("A Strange Game"); + + + + The following example sets the activity of the current user to a streaming status. + + await client.SetGameAsync("Great Stream 10/10", "https://twitch.tv/MyAmazingStream1337", ActivityType.Streaming); + + + + + + + + + Unexpected channel type is created. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fired when connected to the Discord gateway. + + + Fired when disconnected to the Discord gateway. + + + + Fired when guild data has finished downloading. + + + It is possible that some guilds might be unsynced if + was not long enough to receive all GUILD_AVAILABLEs before READY. + + + + Fired when a heartbeat is received from the Discord gateway. + + + + Represents a configuration class for . + + + This configuration, based on , helps determine several key configurations the + socket client depend on. For instance, shards and connection timeout. + + + The following config enables the message cache and configures the client to always download user upon guild + availability. + + var config = new DiscordSocketConfig + { + AlwaysDownloadUsers = true, + MessageCacheSize = 100 + }; + var client = new DiscordSocketClient(config); + + + + + + Returns the encoding gateway should use. + + + + + Gets or sets the WebSocket host to connect to. If null, the client will use the + /gateway endpoint. + + + + + Gets or sets the time, in milliseconds, to wait for a connection to complete before aborting. + + + + + Gets or sets the ID for this shard. Must be less than . + + + + + Gets or sets the total number of shards for this application. + + + + + Gets or sets the number of messages per channel that should be kept in cache. Setting this to zero + disables the message cache entirely. + + + + + Gets or sets the max number of users a guild may have for offline users to be included in the READY + packet. The maximum value allowed is 250. + + + + + Gets or sets the provider used to generate new WebSocket connections. + + + + + Gets or sets the provider used to generate new UDP sockets. + + + + + Gets or sets whether or not all users should be downloaded as guilds come available. + + + + By default, the Discord gateway will only send offline members if a guild has less than a certain number + of members (determined by in this library). This behaviour is why + sometimes a user may be missing from the WebSocket cache for collections such as + . + + + This property ensures that whenever a guild becomes available (determined by + ), incomplete user chunks will be + downloaded to the WebSocket cache. + + + For more information, please see + Request Guild Members + on the official Discord API documentation. + + + 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 + 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 + + or + as a backup. + + + + + + Gets or sets whether or not interactions are acknowledge with source. + + + + Discord interactions will not appear in chat until the client responds to them. With this option set to + , the client will automatically acknowledge the interaction with . + See the docs on + responding to interactions for more info. + + + With this option set to , you will have to acknowledge the interaction with + . + Only after the interaction is acknowledged, the origional slash command message will be visible. + + + Please note that manually acknowledging the interaction with a message reply will not provide any return data. + Automatically acknowledging the interaction without sending the message will allow for follow up responses to + be used; follow up responses return the message data sent. + + + + + + Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. + Setting this property to nulldisables this check. + + + + + Gets or sets the behavior for on bulk deletes. + + + + If true, the event will not be raised for bulk + deletes, and only the will be raised. If false + , both events will be raised. + + + If unset, both events will be raised, but a warning will be raised the first time a bulk delete event is + received. + + + + + + Gets or sets enabling dispatching of guild subscription events e.g. presence and typing events. + This is not used if are provided. + + + + + Gets or sets the maximum identify concurrency. + + + This information is provided by Discord. + It is only used when using a and auto-sharding is disabled. + + + + + Gets or sets the maximum wait time in milliseconds between GUILD_AVAILABLE events before firing READY. + If zero, READY will fire as soon as it is received and all guilds will be unavailable. + + + This property is measured in milliseconds; negative values will throw an exception. + If a guild is not received before READY, it will be unavailable. + + + A representing the maximum wait time in milliseconds between GUILD_AVAILABLE events + before firing READY. + + Value must be at least 0. + + + + Gets or sets gateway intents to limit what events are sent from Discord. Allows for more granular control than the property. + + + For more information, please see + GatewayIntents + on the official Discord API documentation. + + + + + Initializes a new instance of the class with the default configuration. + + + + + Represents a generic WebSocket-based audio channel. + + + + + Represents a generic WebSocket-based channel that can send and receive messages. + + + + + Gets all messages in this channel's cache. + + + A read-only collection of WebSocket-based messages. + + + + + Sends a message to this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The message to be sent. + Determines whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Sends a file to this message channel with an optional caption. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The file path of the file. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + Whether the message attachment should be hidden as a spoiler. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Sends a file to this message channel with an optional caption. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The of the file to be sent. + The name of the attachment. + The message to be sent. + Whether the message should be read aloud by Discord or not. + The to be sent. + The options to be used when sending the request. + Whether the message attachment should be hidden as a spoiler. + + Specifies if notifications are sent for mentioned users and roles in the message . + If null, all mentioned roles and users will be notified. + + The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + + A task that represents an asynchronous send operation for delivering the message. The task result + contains the sent message. + + + + + Gets a cached message from this channel. + + + + This method requires the use of cache, which is not enabled by default; if caching is not enabled, + this method will always return null. Please refer to + for more details. + + + This method retrieves the message from the local WebSocket cache and does not send any additional + request to Discord. This message may be a message that has been deleted. + + + The snowflake identifier of the message. + + A WebSocket-based message object; null if it does not exist in the cache or if caching is not + enabled. + + + + + Gets the last N cached messages from this message channel. + + + + This method requires the use of cache, which is not enabled by default; if caching is not enabled, + this method will always return an empty collection. Please refer to + for more details. + + + This method retrieves the message(s) from the local WebSocket cache and does not send any additional + request to Discord. This read-only collection may include messages that have been deleted. The + maximum number of messages that can be retrieved from this method depends on the + set. + + + The number of messages to get. + + A read-only collection of WebSocket-based messages. + + + + + Gets the last N cached messages starting from a certain message in this message channel. + + + + This method requires the use of cache, which is not enabled by default; if caching is not enabled, + this method will always return an empty collection. Please refer to + for more details. + + + This method retrieves the message(s) from the local WebSocket cache and does not send any additional + request to Discord. This read-only collection may include messages that have been deleted. The + maximum number of messages that can be retrieved from this method depends on the + set. + + + The message ID to start the fetching from. + The direction of which the message should be gotten from. + The number of messages to get. + + A read-only collection of WebSocket-based messages. + + + + + Gets the last N cached messages starting from a certain message in this message channel. + + + + This method requires the use of cache, which is not enabled by default; if caching is not enabled, + this method will always return an empty collection. Please refer to + for more details. + + + This method retrieves the message(s) from the local WebSocket cache and does not send any additional + request to Discord. This read-only collection may include messages that have been deleted. The + maximum number of messages that can be retrieved from this method depends on the + set. + + + The message to start the fetching from. + The direction of which the message should be gotten from. + The number of messages to get. + + A read-only collection of WebSocket-based messages. + + + + + Gets a read-only collection of pinned messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation for retrieving pinned messages in this channel. + The task result contains a read-only collection of messages found in the pinned messages. + + + + + Represents a generic WebSocket-based channel that is private to select recipients. + + + + + Represents a WebSocket-based category channel. + + + + + + + + Gets the child channels of this category. + + + A read-only collection of whose + matches the snowflake identifier of this category + channel. + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based channel. + + + + + Gets when the channel is created. + + + + + Gets a collection of users from the WebSocket cache. + + + + Unexpected channel type is created. + + + + Gets a generic user from this channel. + + The snowflake identifier of the user. + + A generic WebSocket-based user associated with the snowflake identifier. + + + + + + + + + + + + + Unexpected type. + + + Unexpected type. + + + + Represents a WebSocket-based direct-message channel. + + + + + Gets the recipient of the channel. + + + + + + + + Gets a collection that is the current logged-in user and the recipient. + + + + + + + + + + + Gets the message associated with the given . + + TThe ID of the message. + The options to be used when sending the request. + + The message gotten from either the cache or the download, or null if none is found. + + + + + Gets the last N messages from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The ID of the starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + + + + + + + + + + + + + Message content is too long, length must be less or equal to . + + + + + + + Message content is too long, length must be less or equal to . + + + + + + + + + + + + + + + + Gets a user in this channel from the provided . + + The snowflake identifier of the user. + + A object that is a recipient of this channel; otherwise null. + + + + + Returns the recipient user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based private group channel. + + + + + + + + + + + + + Voice is not yet supported for group channels. + + + + + + + Gets a message from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The snowflake identifier of the message. + The options to be used when sending the request. + + A task that represents an asynchronous get operation for retrieving the message. The task result contains + the retrieved message; null if no message is found with the specified identifier. + + + + + Gets the last N messages from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The ID of the starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + + + + + + + + + + + + + Message content is too long, length must be less or equal to . + + + + + + + + + + + + + + + + + + + + + + Gets a user from this group. + + The snowflake identifier of the user. + + A WebSocket-based group user associated with the snowflake identifier. + + + + + Returns the name of the group. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Connecting to a group channel is not supported. + + + + + + + + + + Represents a WebSocket-based guild channel. + + + + + Gets the guild associated with this channel. + + + A guild object that this channel belongs to. + + + + + + + + + + + + + + Gets a collection of users that are able to view the channel. + + + A read-only collection of users that can access the channel (i.e. the users seen in the user list). + + + + + + + + + + + + + + Gets the permission overwrite for a specific user. + + The user to get the overwrite from. + + An overwrite object for the targeted user; null if none is set. + + + + + Gets the permission overwrite for a specific role. + + The role to get the overwrite from. + + An overwrite object for the targeted role; null if none is set. + + + + + Adds or updates the permission overwrite for the given user. + + The user to add the overwrite to. + The overwrite to add to the user. + The options to be used when sending the request. + + A task representing the asynchronous permission operation for adding the specified permissions to the channel. + + + + + Adds or updates the permission overwrite for the given role. + + The role to add the overwrite to. + The overwrite to add to the role. + The options to be used when sending the request. + + A task representing the asynchronous permission operation for adding the specified permissions to the channel. + + + + + Removes the permission overwrite for the given user, if one exists. + + The user to remove the overwrite from. + The options to be used when sending the request. + + A task representing the asynchronous operation for removing the specified permissions from the channel. + + + + + Removes the permission overwrite for the given role, if one exists. + + The role to remove the overwrite from. + The options to be used when sending the request. + + A task representing the asynchronous operation for removing the specified permissions from the channel. + + + + + Gets the name of the channel. + + + A string that resolves to . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based news channel in a guild that has the same properties as a . + + + + The property is not supported for news channels. + + + + + + + + This property is not supported by this type. Attempting to use this property will result in a . + + + + + + Represents a WebSocket-based channel in a guild that can send and receive messages. + + + + + + + + + + + + + + Gets the parent (category) of this channel in the guild's channel list. + + + An representing the parent of this channel; null if none is set. + + + + + + + + + + + + + + + + + + + + + + + + + + Gets a message from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The snowflake identifier of the message. + The options to be used when sending the request. + + A task that represents an asynchronous get operation for retrieving the message. The task result contains + the retrieved message; null if no message is found with the specified identifier. + + + + + Gets the last N messages from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The ID of the starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + + + + + + + + + + + + + Message content is too long, length must be less or equal to . + + + + + + + Message content is too long, length must be less or equal to . + + + + + + + + + + + + + + + + + + + + + + + + + Creates a webhook in this text channel. + + The name of the webhook. + The avatar of the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + webhook. + + + + + Gets a webhook available in this text channel. + + The identifier of the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a webhook associated + with the identifier; null if the webhook is not found. + + + + + Gets the webhooks available in this text channel. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of webhooks that is available in this channel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based voice channel in a guild. + + + + + + + + + + + + + + Gets the parent (category) channel of this channel. + + + A category channel representing the parent of this channel; null if none is set. + + + + + + + + Gets a collection of users that are currently connected to this voice channel. + + + A read-only collection of users that are currently connected to this voice channel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based guild object. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the number of members. + + + This property retrieves the number of members returned by Discord. + + + Due to how this property is returned by Discord instead of relying on the WebSocket cache, the + number here is the most accurate in terms of counting the number of users within this guild. + + + Use this instead of enumerating the count of the + collection, as you may see discrepancy + between that and this property. + + + + + + Gets the number of members downloaded to the local guild cache. + + + Indicates whether the client is connected to this guild. + + + + + + + + + Gets the user that owns this guild. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Indicates whether the client has all the members downloaded to the local guild cache. + + + Indicates whether the guild cache is synced to this guild. + + + + Gets the associated with this guild. + + + + + Gets the default channel in this guild. + + + This property retrieves the first viewable text channel for this guild. + + This channel does not guarantee the user can send message to it, as it only looks for the first viewable + text channel. + + + + A representing the first viewable channel that the user has access to. + + + + + Gets the AFK voice channel in this guild. + + + A that the AFK users will be moved to after they have idled for too + long; if none is set. + + + + + Gets the max bitrate for voice channels in this guild. + + + A representing the maximum bitrate value allowed by Discord in this guild. + + + + + Gets the embed channel (i.e. the channel set in the guild's widget settings) in this guild. + + + A channel set within the server's widget settings; if none is set. + + + + + Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. + + + A channel set within the server's widget settings; if none is set. + + + + + Gets the system channel where randomized welcome messages are sent in this guild. + + + A text channel where randomized welcome messages will be sent to; if none is set. + + + + + Gets the channel with the guild rules. + + + A text channel with the guild rules; if none is set. + + + + + Gets the channel where admins and moderators of Community guilds receive + notices from Discord. + + + A text channel where admins and moderators of Community guilds receive + notices from Discord; if none is set. + + + + + Gets a collection of all text channels in this guild. + + + A read-only collection of message channels found within this guild. + + + + + Gets a collection of all voice channels in this guild. + + + A read-only collection of voice channels found within this guild. + + + + + Gets a collection of all category channels in this guild. + + + A read-only collection of category channels found within this guild. + + + + + Gets the current logged-in user. + + + + + Gets the built-in role containing all users in this guild. + + + A role object that represents an @everyone role in this guild. + + + + + Gets a collection of all channels in this guild. + + + A read-only collection of generic channels found within this guild. + + + + + + + + + + + Gets a collection of users in this guild. + + + This property retrieves all users found within this guild. + + + This property may not always return all the members for large guilds (i.e. guilds containing + 100+ users). If you are simply looking to get the number of users present in this guild, + consider using instead. + + + Otherwise, you may need to enable to fetch + the full user list upon startup, or use to manually download + the users. + + + + + A collection of guild users found within this guild. + + + + + Gets a collection of all roles in this guild. + + + A read-only collection of roles found within this guild. + + + + + + + + is . + + + + is . + + + + is . + + + + + + + + + + + + + Gets a collection of all users banned in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + ban objects that this guild currently possesses, with each object containing the user banned and reason + behind the ban. + + + + + Gets a ban object for a banned user. + + The banned user. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a ban object, which + contains the user information and the reason for the ban; if the ban entry cannot be found. + + + + + Gets a ban object for a banned user. + + The snowflake identifier for the banned user. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a ban object, which + contains the user information and the reason for the ban; if the ban entry cannot be found. + + + + + + + + + + + + + + + + + Gets a channel in this guild. + + The snowflake identifier for the channel. + + A generic channel associated with the specified ; if none is found. + + + + + Gets a text channel in this guild. + + The snowflake identifier for the text channel. + + A text channel associated with the specified ; if none is found. + + + + + Gets a voice channel in this guild. + + The snowflake identifier for the voice channel. + + A voice channel associated with the specified ; if none is found. + + + + + Gets a category channel in this guild. + + The snowflake identifier for the category channel. + + A category channel associated with the specified ; if none is found. + + + + + Creates a new text channel in this guild. + + + The following example creates a new text channel under an existing category named Wumpus with a set topic. + + 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}."; + }); + + + The new name for the text channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + text channel. + + + + + Creates a new voice channel in this guild. + + The new name for the voice channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + is . + + A task that represents the asynchronous creation operation. The task result contains the newly created + voice channel. + + + + + Creates a new channel category in this guild. + + The new name for the category. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + is . + + A task that represents the asynchronous creation operation. The task result contains the newly created + category channel. + + + + + Gets a collection of all the voice regions this guild can access. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + voice regions the guild can access. + + + + + Gets a collection of all invites in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + invite metadata, each representing information for an invite found within this guild. + + + + + Gets the vanity invite URL of this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the partial metadata of + the vanity invite found within this guild; if none is found. + + + + + Gets a role in this guild. + + The snowflake identifier for the role. + + A role that is associated with the specified ; if none is found. + + + + + + + + Creates a new role with the provided name. + + The new name for the role. + The guild permission that the role should possess. + The color of the role. + Whether the role is separated from others on the sidebar. + Whether the role can be mentioned. + The options to be used when sending the request. + is . + + A task that represents the asynchronous creation operation. The task result contains the newly created + role. + + + + + + + + Gets a user from this guild. + + + This method retrieves a user found within this guild. + + This may return in the WebSocket implementation due to incomplete user collection in + large guilds. + + + The snowflake identifier of the user. + + A guild user associated with the specified ; if none is found. + + + + + + + + Gets a collection of all users in this guild. + + + This method retrieves all users found within this guild throught REST. + Users returned by this method are not cached. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a collection of guild + users found within this guild. + + + + + + + + Gets a collection of users in this guild that the name or nickname starts with the + provided at . + + + The can not be higher than . + + The partial name or nickname to search. + The maximum number of users to be gotten. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a collection of guild + users that the name or nickname starts with the provided at . + + + + + Gets the specified number of audit log entries for this guild. + + The number of audit log entries to fetch. + The options to be used when sending the request. + The audit log entry ID to filter entries before. + The type of actions to filter. + The user ID to filter entries for. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of the requested audit log entries. + + + + + Gets a webhook found within this guild. + + The identifier for the webhook. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the webhook with the + specified ; if none is found. + + + + + Gets a collection of all webhook from this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of webhooks found within the guild. + + + + + Gets this guilds slash commands commands + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of application commands found within the guild. + + + + + + + + + + + is . + + + + + + + Gets the name of the guild. + + + A string that resolves to . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a Websocket-based interaction type for Message Components. + + + + + The data received with this interaction, contains the button that was clicked. + + + + + The message that contained the trigger for this interaction. + + + + + Responds to an Interaction. + + If you have set to , You should use + instead. + + + The text of the message to be sent. + if the message should be read out by a text-to-speech reader, otherwise . + A to send with this response. + The type of response to this Interaction. + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + + The sent as the response. If this is the first acknowledgement, it will return null. + + Message content is too long, length must be less or equal to . + The parameters provided were invalid or the token was invalid. + + + + Sends a followup message for this interaction. + + The text of the message to be sent + if the message should be read out by a text-to-speech reader, otherwise . + A to send with this response. + The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + + The sent message. + + + + + Represents the data sent with a . + + + + + The components Custom Id that was clicked + + + + + The type of the component clicked + + + + + Represends a Websocket-based recieved over the gateway. + + + + + + + + + + + + + + A collection of 's recieved over the gateway. + + + + + The where this application was created. + + + + + Represents a choice for a . + + + + + + + + + + + Represents an option for a . + + + + + + + + + + + + + + + + + + + + Choices for string and int types for the user to pick from. + + + + + If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + + + Represents a Websocket-based slash command received over the gateway. + + + + + The data associated with this interaction. + + + + + Responds to an Interaction. + + If you have set to , You should use + instead. + + + The text of the message to be sent. + if the message should be read out by a text-to-speech reader, otherwise . + A to send with this response. + The type of response to this Interaction. + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + + The sent as the response. If this is the first acknowledgement, it will return null. + + Message content is too long, length must be less or equal to . + The parameters provided were invalid or the token was invalid. + + + + Sends a followup message for this interaction. + + The text of the message to be sent + if the message should be read out by a text-to-speech reader, otherwise . + A to send with this response. + The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + + The sent message. + + + + + Represents the data tied with the interaction. + + + + + + + + The 's received with this interaction. + + + + + Represents a Websocket-based recieved by the gateway + + + + + + + + + + + The sub command options received for this sub command group. + + + + + Represents an Interaction recieved over the gateway. + + + + + The this interaction was used in. + + + + + The who triggered this interaction. + + + + + The type of this interaction. + + + + + The token used to respond to this interaction. + + + + + The data sent with this interaction. + + + + + The version of this interaction. + + + + + if the token is valid for replying to, otherwise . + + + + + Responds to an Interaction. + + If you have set to , You should use + instead. + + + The text of the message to be sent. + if the message should be read out by a text-to-speech reader, otherwise . + A to send with this response. + The type of response to this Interaction. + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + + The sent as the response. If this is the first acknowledgement, it will return null. + + Message content is too long, length must be less or equal to . + The parameters provided were invalid or the token was invalid. + + + + Sends a followup message for this interaction. + + The text of the message to be sent + if the message should be read out by a text-to-speech reader, otherwise . + A to send with this response. + The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + + The sent message. + + + + + Acknowledges this interaction with the . + + + A task that represents the asynchronous operation of acknowledging the interaction. + + + + + + + + Gets the channel where this invite was created. + + + + + + + + Gets the guild where this invite was created. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the time (in seconds) until the invite expires. + + + + + Gets the max number of uses this invite may have. + + + + + Gets the number of times this invite has been used. + + + + + Gets the user that created this invite if available. + + + + + + + + Gets when this invite was created. + + + + + Gets the user targeted by this invite if available. + + + + + Gets the type of the user targeted by this invite. + + + + + + + + + + + + + + Gets the URL of the invite. + + + A string that resolves to the Url of the invite. + + + + + + + + + + + + + is less than 0. + + + + Represents a WebSocket-based message. + + + + + Gets the author of this message. + + + A WebSocket-based user object. + + + + + Gets the source channel of the message. + + + A WebSocket-based message channel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns all attachments included in this message. + + + Collection of attachments. + + + + + Returns all embeds included in this message. + + + Collection of embed objects. + + + + + Returns the channels mentioned in this message. + + + Collection of WebSocket-based guild channels. + + + + + Returns the roles mentioned in this message. + + + Collection of WebSocket-based roles. + + + + + Returns the users mentioned in this message. + + + Collection of WebSocket-based users. + + + + + + + + + + + + + + + + + Gets the content of the message. + + + Content of the message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based reaction object. + + + + + Gets the ID of the user who added the reaction. + + + This property retrieves the snowflake identifier of the user responsible for this reaction. This + property will always contain the user identifier in event that + cannot be retrieved. + + + A user snowflake identifier associated with the user. + + + + + Gets the user who added the reaction if possible. + + + + This property attempts to retrieve a WebSocket-cached user that is responsible for this reaction from + the client. In other words, when the user is not in the WebSocket cache, this property may not + contain a value, leaving the only identifiable information to be + . + + + If you wish to obtain an identifiable user object, consider utilizing + which will attempt to retrieve the user from REST. + + + + A user object where possible; a value is not always returned. + + + + + + Gets the ID of the message that has been reacted to. + + + A message snowflake identifier associated with the message. + + + + + Gets the message that has been reacted to if possible. + + + A WebSocket-based message where possible; a value is not always returned. + + + + + + Gets the channel where the reaction takes place in. + + + A WebSocket-based message channel. + + + + + + + + + + + + + + Represents a WebSocket-based message sent by the system. + + + + + + + + Represents a WebSocket-based message sent by a user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Only the author of a message may modify the message. + Message content is too long, length must be less or equal to . + + + + + + + + + + + + + + + + This operation may only be called on a channel. + + + + Represents a WebSocket-based role to be given to a guild user. + + + + + Gets the guild that owns this role. + + + A representing the parent guild of this role. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns a value that determines if the role is an @everyone role. + + + true if the role is @everyone; otherwise false. + + + + + + + + + + + + + + Gets the name of the role. + + + A string that resolves to . + + + + + + + + + + + + + + Gets the group channel of the user. + + + A representing the channel of which the user belongs to. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based guild user. + + + + + Gets the guild the user is in. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns a collection of roles that the user possesses. + + + + + Returns the voice channel the user is in, or null if none. + + + + + + + + Gets the voice connection status of the user if any. + + + A representing the user's voice status; null if the user is not + connected to a voice channel. + + + + + + + + Returns the position of the user within the role hierarchy. + + + The returned value equal to the position of the highest role the user has, or + if user is the server owner. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents the WebSocket user's presence status. This may include their online status and their activity. + + + + + + + + + + + + + + + + + Creates a new containing all of the client types + where a user is active from the data supplied in the Presence update frame. + + + A dictionary keyed by the + and where the value is the . + + + A collection of all s that this user is active. + + + + + Creates a new containing all the activities + that a user has from the data supplied in the Presence update frame. + + + A list of . + + + A list of all that this user currently has available. + + + + + Gets the status of the user. + + + A string that resolves to . + + + + + Represents the logged-in WebSocket-based user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based user that is yet to be recognized by the client. + + + A user may not be recognized due to the user missing from the cache or failed to be recognized properly. + + + + + + + + + + + + + + + + + + + + + + + This field is not supported for an unknown user. + + + + Represents a WebSocket-based user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets mutual guilds shared with this user. + + + This property will only include guilds in the same . + + + + + + + + + + + + + + Gets the full name of the user (e.g. Example#0001). + + + The full name of the user. + + + + + Represents a WebSocket user's voice connection status. + + + + + Initializes a default with everything set to null or false. + + + + + Gets the voice channel that the user is currently in; or null if none. + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the name of this voice channel. + + + A string that resolves to name of this voice channel; otherwise "Unknown". + + + + + + + + Represents a WebSocket-based webhook user. + + + + Gets the guild of this webhook. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Webhook users cannot be kicked. + + + + Webhook users cannot be modified. + + + + Roles are not supported on webhook users. + + + + Roles are not supported on webhook users. + + + + Roles are not supported on webhook users. + + + + Roles are not supported on webhook users. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based voice server. + + + + + Gets the guild associated with the voice server. + + + A cached entity of the guild. + + + + + Gets the endpoint URL of the voice server host. + + + An URL representing the voice server host. + + + + + Gets the voice connection token. + + + A voice connection token. + + + + + The exception thrown when the gateway client has been requested to reconnect. + + + + + Initializes a new instance of the class with the reconnection + message. + + The reason why the gateway has been requested to reconnect. + + + The sharded variant of , which may contain the client, user, guild, channel, and message. + + + Gets the that the command is executed with. + + + Gets the shard ID of the command context. + + + + + + + Represents a WebSocket-based context of a command. This may include the client, guild, channel, user, and message. + + + + + Gets the that the command is executed with. + + + + + Gets the that the command is executed in. + + + + + Gets the that the command is executed in. + + + + + Gets the who executed the command. + + + + + Gets the that the command is interpreted from. + + + + + Indicates whether the channel that the command is executed in is a private channel. + + + + + Initializes a new class with the provided client and message. + + The underlying client. + The underlying message. + + + + + + + + + + + + + + + + + + The default WebSocketProvider is not supported on this platform. + + + diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index e5374067ed..1e4b096d51 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -6,12 +6,15 @@ Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 2.3.1 + 2.3.2 Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png + + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Webhook\Discord.Net.Webhook.xml + diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml new file mode 100644 index 0000000000..e2c3e69a97 --- /dev/null +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml @@ -0,0 +1,56 @@ + + + + Discord.Net.Webhook + + + + A client responsible for connecting as a Webhook. + + + Creates a new Webhook Discord client. + + + Creates a new Webhook Discord client. + + + Creates a new Webhook Discord client. + + + Creates a new Webhook Discord client. + + + Creates a new Webhook Discord client. + + + + Creates a new Webhook Discord client. + + The url of the webhook. + The configuration options to use for this client. + Thrown if the is an invalid format. + Thrown if the is null or whitespace. + + + Sends a message to the channel for this webhook. + Returns the ID of the created message. + + + Sends a message to the channel for this webhook with an attachment. + Returns the ID of the created message. + + + Sends a message to the channel for this webhook with an attachment. + Returns the ID of the created message. + + + Modifies the properties of this webhook. + + + Deletes this webhook from Discord and disposes the client. + + + Could not find a webhook with the supplied credentials. + + + diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 0a6fa257f7..15c90fc2de 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.5$suffix$ + 2.3.6$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,25 +14,25 @@ https://avatars.githubusercontent.com/u/84047264 - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From ad75f6cb7d80a0da2a2c5943c3873dc7c881038a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 30 May 2021 18:37:35 -0300 Subject: [PATCH 061/494] Fixed XML not being included in builds. Fixed Linq exception in SocketApplicationCommand.Update --- .../Discord.Net.Commands.csproj | 5 ++ src/Discord.Net.Core/Discord.Net.Core.csproj | 5 ++ ...plicationCommandInteractionDataResolved.cs | 20 ++++++++ src/Discord.Net.Rest/Discord.Net.Rest.csproj | 5 ++ .../ApplicationCommandCreatedUpdatedEvent.cs | 2 +- .../Discord.Net.WebSocket.csproj | 5 ++ .../SocketApplicationCommand.cs | 4 +- .../Slash Commands/SocketSlashCommandCache.cs | 48 +++++++++++++++++++ .../Discord.Net.Webhook.csproj | 5 ++ 9 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 183493d292..b0f2a78d09 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -25,5 +25,10 @@ + + + Always + + diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 38cc03c8ff..c2bceb8146 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -32,4 +32,9 @@ + + + Always + + diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs new file mode 100644 index 0000000000..fe44fbc795 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Discord.API +{ + internal class ApplicationCommandInteractionDataResolved + { + [JsonProperty("users")] + public Optional> Users { get; set; } + + [JsonProperty("members")] + public Optional> Members { get; set; } + + [JsonProperty("channels")] + public Optional> Channels { get; set; } + + [JsonProperty("roles")] + public Optional> Roles { get; set; } + } +} diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 906e0a1100..dc3aef2beb 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -30,4 +30,9 @@ + + + Always + + diff --git a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs index 94b3470e7f..ac6c73c66b 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs @@ -25,6 +25,6 @@ internal class ApplicationCommandCreatedUpdatedEvent public ulong GuildId { get; set; } [JsonProperty("options")] - public List Options { get; set; } + public Optional> Options { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index ebd0dd2572..34775254cd 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -27,4 +27,9 @@ + + + Always + + diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs index 3c44fa9918..d10932c8cf 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs @@ -56,8 +56,8 @@ internal void Update(Model model) this.Name = model.Name; this.GuildId = model.GuildId; - this.Options = model.Options.Any() - ? model.Options.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() : new ImmutableArray(); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs new file mode 100644 index 0000000000..7dd30151dc --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.WebSocket.Entities.Interaction +{ + internal class SlashCommandCache + { + private readonly ConcurrentDictionary _slashCommands; + private readonly ConcurrentQueue _orderedSlashCommands; + private readonly int _size; + + public IReadOnlyCollection Messages => _slashCommands.ToReadOnlyCollection(); + + public SlashCommandCache(DiscordSocketClient client) + { + _size = 256; + _slashCommands = new ConcurrentDictionary(); + + } + + public void Add(SocketSlashCommand slashCommand) + { + if (_slashCommands.TryAdd(slashCommand.Id, slashCommand)) + { + _orderedSlashCommands.Enqueue(slashCommand.Id); + + while (_orderedSlashCommands.Count > _size && _orderedSlashCommands.TryDequeue(out ulong msgId)) + _slashCommands.TryRemove(msgId, out _); + } + } + + public SocketSlashCommand Remove(ulong id) + { + _slashCommands.TryRemove(id, out var slashCommand); + return slashCommand; + } + + public SocketSlashCommand Get(ulong id) + { + _slashCommands.TryGetValue(id, out var slashCommands); + return slashCommands; + } + } +} diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 1e4b096d51..84440b32cd 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -25,4 +25,9 @@ + + + Always + + From a0a341a960ea865d3df519505148f0f4395d575b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 1 Jun 2021 09:34:52 -0300 Subject: [PATCH 062/494] meta: version bump --- .../Discord.Net.Analyzers.xml | 8 +++++ .../Discord.Net.Commands.csproj | 4 +-- src/Discord.Net.Core/Discord.Net.Core.csproj | 9 +++--- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 4 +-- .../Entities/Messages/MessageHelper.cs | 2 +- .../Discord.Net.WebSocket.csproj | 6 ++-- .../Discord.Net.Webhook.csproj | 4 +-- src/Discord.Net/Discord.Net.nuspec | 32 +++++++++---------- 8 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 src/Discord.Net.Analyzers/Discord.Net.Analyzers.xml diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.xml b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.xml new file mode 100644 index 0000000000..7fa974a9ab --- /dev/null +++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.xml @@ -0,0 +1,8 @@ + + + + Discord.Net.Analyzers + + + + diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index b0f2a78d09..e505992f0d 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -7,13 +7,13 @@ A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 2.3.3 + 2.3.4 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Commands\Discord.Net.Commands.xml diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index c2bceb8146..56620bb7d0 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,14 +8,15 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.7 + 2.3.8 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 2.3.2 - 2.3.2 + 2.3.8 + 2.3.8 + false - + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Core\Discord.Net.Core.xml diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index dc3aef2beb..c9db6fce2f 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,13 +9,13 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.7 + 2.3.8 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 2.3.4 - + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index b66ac1a019..85b040f433 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -42,7 +42,7 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie { Content = args.Content, Embed = args.Embed.IsSpecified ? args.Embed.Value.ToModel() : Optional.Create(), - Components = args?.Components.GetValueOrDefault()?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified }; return await client.ApiClient.ModifyMessageAsync(msg.Channel.Id, msg.Id, apiArgs, options).ConfigureAwait(false); } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 34775254cd..e91b509e75 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,4 +1,4 @@ - + @@ -8,13 +8,13 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.7 + 2.3.8 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png Discord.Net.Labs.WebSocket - + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.WebSocket\Discord.Net.WebSocket.xml diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 84440b32cd..a61bf2a5e0 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -6,13 +6,13 @@ Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 2.3.2 + 2.3.3 Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - + C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Webhook\Discord.Net.Webhook.xml diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 15c90fc2de..f3ed97f4be 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.6$suffix$ + 2.3.7$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,25 +14,25 @@ https://avatars.githubusercontent.com/u/84047264 - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From f11109dc3d90ee8a56e4987b68f85605bdba53c2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 1 Jun 2021 10:33:13 -0300 Subject: [PATCH 063/494] Fix merge bugs --- src/Discord.Net.Core/Discord.Net.Core.xml | 499 ++++++++++++------ src/Discord.Net.Rest/Discord.Net.Rest.xml | 184 ++++--- src/Discord.Net.Rest/DiscordRestClient.cs | 5 + .../Entities/Messages/MessageHelper.cs | 7 +- .../Discord.Net.WebSocket.xml | 425 ++++++++++----- .../DiscordSocketClient.cs | 1 + 6 files changed, 758 insertions(+), 363 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 53e74814b1..5baa090bf3 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -392,18 +392,6 @@ the API version it uses on startup. - - - Gets or sets the level of precision of the rate limit reset response. - - - If set to , this value will be rounded up to the - nearest second. - - - The currently set . - - Gets or sets whether or not rate-limits should use the system clock. @@ -1690,6 +1678,21 @@ A task that represents the asynchronous removal operation. + + + Modifies a message. + + + This method modifies this message with the specified properties. To see an example of this + method and what properties are available, please refer to . + + The snowflake identifier of the message that would be changed. + A delegate containing the properties to modify the message with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. @@ -2282,26 +2285,6 @@ Scan messages sent by all guild members. - - - Provides properties that are used to modify the widget of an with the specified changes. - - - - - Sets whether the widget should be enabled. - - - - - Sets the channel that the invite should place its users in, if not null. - - - - - Sets the channel the invite should place its users in, if not null. - - Provides properties used to modify an with the specified changes. @@ -2511,14 +2494,6 @@ and moved into the AFK voice channel. - - - Gets a value that indicates whether this guild is embeddable (i.e. can use widget). - - - if this guild has a widget enabled; otherwise . - - Gets a value that indicates whether this guild has the widget enabled. @@ -2628,31 +2603,6 @@ none is set. - - - Gets the ID of the default channel for this guild. - - - This property retrieves the snowflake identifier of the first viewable text channel for this guild. - - This channel does not guarantee the user can send message to it, as it only looks for the first viewable - text channel. - - - - A representing the snowflake identifier of the default text channel; 0 if - none can be found. - - - - - Gets the ID of the widget embed channel of this guild. - - - A representing the snowflake identifier of the embedded channel found within the - widget settings of this guild; if none is set. - - Gets the ID of the channel assigned to the widget of this guild. @@ -2886,16 +2836,6 @@ A task that represents the asynchronous modification operation. - - - Modifies this guild's embed channel. - - The delegate containing the properties to modify the guild widget with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - Modifies this guild's widget. @@ -3133,17 +3073,6 @@ channel in this guild; if none is found. - - - Gets the embed channel (i.e. the channel set in the guild's widget settings) in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the embed channel set - within the server's widget settings; if none is set. - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. @@ -3443,6 +3372,16 @@ of webhooks found within the guild. + + + Gets a collection of emotes from this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of emotes found within the guild. + + Gets a specific emote from this guild. @@ -4829,6 +4768,14 @@ A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). + + + Gets the user that created this invite. + + + A user that created this invite. + + Gets the channel this invite is linked to. @@ -4900,26 +4847,26 @@ invite points to; null if one cannot be obtained. - + - Represents additional information regarding the generic invite object. + Gets the user this invite is linked to via . + + A user that is linked to this invite. + - + - Gets the user that created this invite. + Gets the type of the linked for this invite. - A user that created this invite. + The type of the linked user that is linked to this invite. - + - Gets a value that indicates whether the invite has been revoked. + Represents additional information regarding the generic invite object. - - true if this invite was revoked; otherwise false. - @@ -6211,10 +6158,10 @@ Gets all embeds included in this message. - This property gets a read-only collection of embeds associated with this message. Depending on the message, a sent message may contain one or more embeds. This is usually true when multiple link previews are generated; however, only one can be featured. + A read-only collection of embed objects. @@ -6293,6 +6240,18 @@ The 's attached to this message + + + + Gets the flags related to this message. + + + This value is determined by bitwise OR-ing values together. + + + A message's flags, if any is associated. + + Adds a reaction to this message. @@ -6410,6 +6369,75 @@ The used in the reaction. + + + Represents a discord sticker. + + + + + Gets the ID of this sticker. + + + A snowflake ID associated with this sticker. + + + + + Gets the ID of the pack of this sticker. + + + A snowflake ID associated with the pack of this sticker. + + + + + Gets the name of this sticker. + + + A with the name of this sticker. + + + + + Gets the description of this sticker. + + + A with the description of this sticker. + + + + + Gets the list of tags of this sticker. + + + A read-only list with the tags of this sticker. + + + + + Gets the asset hash of this sticker. + + + A with the asset hash of this sticker. + + + + + Gets the preview asset hash of this sticker. + + + A with the preview asset hash of this sticker. + + + + + Gets the format type of this sticker. + + + A with the format type of this sticker. + + Represents a generic message sent by the system. @@ -6448,19 +6476,6 @@ A task that represents the asynchronous modification operation. - - - Modifies the suppression of this message. - - - This method modifies whether or not embeds in this message are suppressed (hidden). - - Whether or not embeds in this message should be suppressed. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - Adds this message to its channel's pinned messages. @@ -6556,6 +6571,39 @@ Gets the name of the application. + + + Default value for flags, when none are given to a message. + + + + + Flag given to messages that have been published to subscribed + channels (via Channel Following). + + + + + Flag given to messages that originated from a message in another + channel (via Channel Following). + + + + + Flag given to messages that do not display any embeds. + + + + + Flag given to messages that the source message for this crosspost + has been deleted (via Channel Following). + + + + + Flag given to messages that came from the urgent message system. + + Properties that are used to modify an with the specified changes. @@ -6584,6 +6632,20 @@ Gets or sets the components for this message. + + + Gets or sets the flags of the message. + + + Only can be set/unset and you need to be + the author of the message. + + + + + Gets or sets the allowed mentions of the message. + + Contains the IDs sent from a crossposted message or inline reply. @@ -6720,9 +6782,6 @@ The message is an inline reply. - - Only available in API v8. - @@ -6753,6 +6812,21 @@ true if the user has reacted to the message; otherwise false. + + Defines the types of formats for stickers. + + + Default value for a sticker format type. + + + The sticker format type is png. + + + The sticker format type is apng. + + + The sticker format type is lottie. + Specifies the handling type the tag should use. @@ -6876,11 +6950,6 @@ Allows for the addition of reactions to messages. - - - Allows for reading of messages. This flag is obsolete, use instead. - - Allows guild members to view a channel, which includes reading messages in text channels. @@ -7007,9 +7076,6 @@ If true, a user may add reactions. - - If true, a user may join channels. - If true, a user may view channels. @@ -7320,9 +7386,6 @@ If true, a user may view the guild insights. - - If True, a user may join channels. - If True, a user may view channels. @@ -7392,6 +7455,9 @@ Creates a new with the provided packed value. + + Creates a new with the provided packed value after converting to ulong. + Creates a new structure with the provided permissions. @@ -7479,9 +7545,6 @@ If Allowed, a user may add reactions. - - If Allowed, a user may join channels. - If Allowed, a user may join channels. @@ -7542,6 +7605,9 @@ Creates a new OverwritePermissions with the provided allow and deny packed values. + + Creates a new OverwritePermissions with the provided allow and deny packed values after converting to ulong. + Initializes a new struct with the provided permissions. @@ -7818,6 +7884,14 @@ An representing the position of the role in the role list of the guild. + + + Gets the tags related to this role. + + + A object containing all tags related to this role. + + Modifies this role. @@ -7923,6 +7997,38 @@ This value may not be set if the role is an @everyone role. + + + Provides tags related to a discord role. + + + + + Gets the identifier of the bot that this role belongs to, if it does. + + + A if this role belongs to a bot; otherwise + . + + + + + Gets the identifier of the integration that this role belongs to, if it does. + + + A if this role belongs to an integration; otherwise + . + + + + + Gets if this role is the guild's premium subscriber (booster) role. + + + if this role is the guild's premium subscriber role; + otherwise . + + Represents a Discord Team. @@ -8234,6 +8340,11 @@ this user possesses. + + + Whether the user has passed the guild's Membership Screening requirements. + + Gets the level permissions granted to this user to a given channel. @@ -8276,6 +8387,16 @@ A task that represents the asynchronous modification operation. + + + Adds the specified role to this user in the guild. + + The role to be added to the user. + The options to be used when sending the request. + + A task that represents the asynchronous role addition operation. + + Adds the specified role to this user in the guild. @@ -8286,6 +8407,16 @@ A task that represents the asynchronous role addition operation. + + + Adds the specified to this user in the guild. + + The roles to be added to the user. + The options to be used when sending the request. + + A task that represents the asynchronous role addition operation. + + Adds the specified to this user in the guild. @@ -8296,6 +8427,16 @@ A task that represents the asynchronous role addition operation. + + + Removes the specified from this user in the guild. + + The role to be removed from the user. + The options to be used when sending the request. + + A task that represents the asynchronous role removal operation. + + Removes the specified from this user in the guild. @@ -8306,6 +8447,16 @@ A task that represents the asynchronous role removal operation. + + + Removes the specified from this user in the guild. + + The roles to be removed from the user. + The options to be used when sending the request. + + A task that represents the asynchronous role removal operation. + + Removes the specified from this user in the guild. @@ -8321,11 +8472,6 @@ Represents the user's presence status. This may include their online status and their activity. - - - Gets the activity this user is currently doing. - - Gets the current status of this user. @@ -8484,9 +8630,20 @@ Gets the username for this user. - + + + Gets the public flags that are applied to this user's account. + + + This value is determined by bitwise OR-ing values together. + + + The value of public flags for this user. + + + - Gets the direct message channel of this user, or create one if it does not already exist. + Creates the direct message channel of this user. This method is used to obtain or create a channel used to send a direct message. @@ -8501,7 +8658,7 @@ The following example attempts to send a direct message to the target user and logs the incident should it fail. - The options to be used when sending the request. @@ -8629,17 +8786,22 @@ - Flag given to Discord staff. + Flag given to users who are a Discord employee. - Flag given to Discord partners. + Flag given to users who are owners of a partnered Discord server. - + - Flag given to users who have participated in the bug report program. + Flag given to users in HypeSquad events. + + + + + Flag given to users who have participated in the bug report program and are level 1. @@ -8662,6 +8824,36 @@ Flag given to users who subscribed to Nitro before games were added. + + + Flag given to users who are part of a team. + + + + + Flag given to users who represent Discord (System). + + + + + Flag given to users who have participated in the bug report program and are level 2. + + + + + Flag given to users who are verified bots. + + + + + Flag given to users that developed bots and early verified their accounts. + + + + + Flag given to users that are discord certified moderators who has give discord's exam. + + Defines the available Discord user status. @@ -9199,6 +9391,17 @@ This intent includes TYPING_START + + + This intent includes all but and + that are privileged must be enabled for the application. + + + + + This intent includes all of them, including privileged ones. + + Represents a generic Discord client. @@ -9838,22 +10041,6 @@ and an optional reason. - - - Specifies the level of precision to request in the rate limit - response header. - - - - - Specifies precision rounded up to the nearest whole second - - - - - Specifies precision rounded to the nearest millisecond. - - Represents options that should be used when sending a request. @@ -10456,7 +10643,7 @@ The snowflake identifier to resolve. - A representing the time for when the object is geenrated. + A representing the time for when the object is generated. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index e194609733..3e0948f7b2 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -29,7 +29,7 @@ Gets the name of the application. - + Unknown OAuth token type. @@ -57,6 +57,13 @@ Message content is too long, length must be less or equal to . This operation may only be called with a token. + + Message content is too long, length must be less or equal to . + This operation may only be called with a token. + + + This operation may only be called with a token. + Message content is too long, length must be less or equal to . @@ -78,13 +85,6 @@ and must not be equal to zero. - - must not be equal to zero. - - - must not be equal to zero. - must not be . - must not be equal to zero. @@ -134,12 +134,6 @@ Cannot read from image. - - Unknown permission target. - - - Invalid permission target. - Gets the login state of the client. @@ -505,6 +499,14 @@ null if this is not mentioned in this entry. + + + Gets the type of this channel. + + + The channel type of this channel; null if not applicable. + + Contains a piece of audit log data related to a channel update. @@ -1174,10 +1176,10 @@ - Gets the user of the message that was pinned. + Gets the user of the message that was pinned if available. - A user object representing the user that created the pinned message. + A user object representing the user that created the pinned message or . @@ -1203,10 +1205,10 @@ - Gets the user of the message that was unpinned. + Gets the user of the message that was unpinned if available. - A user object representing the user that created the unpinned message. + A user object representing the user that created the unpinned message or . @@ -1972,6 +1974,9 @@ + + + @@ -2063,6 +2068,9 @@ + + + Message content is too long, length must be less or equal to . @@ -2356,6 +2364,9 @@ + + + @@ -2517,9 +2528,6 @@ is null. - - is null. - is null. @@ -2576,9 +2584,6 @@ - - - @@ -2597,9 +2602,6 @@ - - - @@ -2724,10 +2726,6 @@ is . - - - is . - is . @@ -2880,16 +2878,6 @@ channel in this guild; if none is found. - - - Gets the embed channel (i.e. the channel set in the guild's widget settings) in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the embed channel set - within the server's widget settings; if none is set. - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. @@ -3165,6 +3153,9 @@ The name of the guild. + + + @@ -3226,9 +3217,6 @@ - - - @@ -3518,6 +3506,15 @@ + + + + + + + + + @@ -3547,9 +3544,6 @@ Represents additional information regarding the REST-based invite object. - - - @@ -3562,17 +3556,9 @@ - - - Gets the user that created this invite. - - - - - Regex used to check if some text is formatted as inline code. @@ -3714,6 +3700,9 @@ + + + @@ -3726,6 +3715,9 @@ + + + @@ -3758,6 +3750,9 @@ + + + @@ -3843,6 +3838,9 @@ + + + @@ -3855,9 +3853,6 @@ - - - @@ -3937,6 +3932,9 @@ + + + @@ -4061,6 +4059,9 @@ + + + Resolving permissions requires the parent guild to be downloaded. @@ -4080,15 +4081,27 @@ + + + + + + + + + + + + @@ -4168,6 +4181,9 @@ + + + @@ -4195,9 +4211,9 @@ - + - Returns a direct message channel to this user, or create one if it does not already exist. + Creates a direct message channel to this user. The options to be used when sending the request. @@ -4218,7 +4234,7 @@ A string that resolves to Username#Discriminator of the user. - + @@ -4245,6 +4261,9 @@ + + + @@ -4257,15 +4276,27 @@ + + + + + + + + + + + + @@ -4293,10 +4324,10 @@ - + - + @@ -4378,5 +4409,32 @@ A string containing the filename of this attachment. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 5059d437db..75d829ba0f 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -46,6 +46,11 @@ internal override async Task OnLoginAsync(TokenType tokenType, string token) ApiClient.CurrentUserId = user.Id; base.CurrentUser = RestSelfUser.Create(this, user); } + + internal void CreateRestSelfUser(API.User user) + { + base.CurrentUser = RestSelfUser.Create(this, user); + } /// internal override Task OnLogoutAsync() { diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index b24db3960c..2062759ff5 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -65,7 +65,7 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie { Content = args.Content, Embed = args.Embed.IsSpecified ? args.Embed.Value.ToModel() : Optional.Create(), - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), }; @@ -128,11 +128,6 @@ public static async Task AddReactionAsync(ulong channelId, ulong messageId, IEmo await client.ApiClient.AddReactionAsync(channelId, messageId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); } - public static async Task AddReactionAsync(ulong channelId, ulong messageId, IEmote emote, BaseDiscordClient client, RequestOptions options) - { - await client.ApiClient.AddReactionAsync(channelId, messageId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); - } - public static async Task AddReactionAsync(IMessage msg, IEmote emote, BaseDiscordClient client, RequestOptions options) { await client.ApiClient.AddReactionAsync(msg.Channel.Id, msg.Id, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 4e9113a97b..30689f61f1 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -83,61 +83,6 @@ This client is not configured with WebSocket support. - - Creates a new REST/WebSocket discord client. - - - - - - Wraps another stream with a timed buffer. - - - Reads the payload from an RTP frame - - - Converts Opus to PCM - - - Header received with no payload. - - - Received payload without an RTP header. - - - Converts PCM to Opus - - - Wraps an IAudioClient, sending voice data on write. - - - Reads the payload from an RTP frame - - - The token has had cancellation requested. - The associated has been disposed. - - - Wraps data in an RTP frame - - - - Decrypts an RTP frame using libsodium. - - - - - Encrypts an RTP frame using libsodium. - - - - Header received with no payload. - - - Received payload without an RTP header. - The token has had cancellation requested. - The associated has been disposed. - Represents the base of a WebSocket-based Discord client. @@ -202,14 +147,6 @@ A read-only collection of private channels that the user currently partakes in. - - - Gets a collection of available voice regions. - - - A read-only collection of voice regions that the user has access to. - - Gets a Discord application information for the logged-in user. @@ -291,14 +228,24 @@ found. - + + + Gets all voice regions. + + The options to be used when sending the request. + + A task that contains a read-only collection of REST-based voice regions. + + + Gets a voice region. The identifier of the voice region (e.g. eu-central ). + The options to be used when sending the request. - A REST-based voice region associated with the identifier; null if the voice region is not - found. + A task that contains a REST-based voice region associated with the identifier; null if the + voice region is not found. @@ -323,6 +270,12 @@ The name of the game. If streaming, the URL of the stream. Must be a valid Twitch URL. The type of the game. + + + Bot accounts cannot set as their activity + type and it will have no effect. + + A task that represents the asynchronous set operation. @@ -336,6 +289,10 @@ Discord will only accept setting of name and the type of activity. + + Bot accounts cannot set as their activity + type and it will have no effect. + Rich Presence cannot be set via this method or client. Rich Presence is strictly limited to RPC clients only. @@ -814,9 +771,6 @@ - - - Provides access to a REST-only client with a shared state from this client. @@ -855,7 +809,10 @@ - + + + + @@ -980,9 +937,6 @@ A collection of group channels that have been opened in this session. - - - Initializes a new REST/WebSocket-based Discord client. @@ -997,9 +951,6 @@ - - - @@ -1018,6 +969,44 @@ + + + Gets a generic channel from the cache or does a rest request if unavailable. + + + + var channel = await _client.GetChannelAsync(381889909113225237); + if (channel != null && channel is IMessageChannel msgChannel) + { + await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); + } + + + The snowflake identifier of the channel (e.g. `381889909113225237`). + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the channel associated + with the snowflake identifier; null when the channel cannot be found. + + + + + Gets a user from the cache or does a rest request if unavailable. + + + + var user = await _client.GetUserAsync(168693960628371456); + if (user != null) + Console.WriteLine($"{user} is created at {user.CreatedAt}."; + + + The snowflake identifier of the user (e.g. `168693960628371456`). + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the user associated with + the snowflake identifier; null if the user is not found. + + Clears all cached channels from the client. @@ -1039,7 +1028,10 @@ Clears cached users from the client. - + + + + @@ -1273,28 +1265,6 @@ Setting this property to nulldisables this check. - - - Gets or sets the behavior for on bulk deletes. - - - - If true, the event will not be raised for bulk - deletes, and only the will be raised. If false - , both events will be raised. - - - If unset, both events will be raised, but a warning will be raised the first time a bulk delete event is - received. - - - - - - Gets or sets enabling dispatching of guild subscription events e.g. presence and typing events. - This is not used if are provided. - - Gets or sets the maximum identify concurrency. @@ -1321,7 +1291,8 @@ - Gets or sets gateway intents to limit what events are sent from Discord. Allows for more granular control than the property. + Gets or sets gateway intents to limit what events are sent from Discord. + The default is . For more information, please see @@ -1720,6 +1691,9 @@ + + + @@ -1897,6 +1871,9 @@ + + + @@ -2263,6 +2240,9 @@ + + + @@ -2433,9 +2413,6 @@ - - - @@ -2588,14 +2565,6 @@ A representing the maximum bitrate value allowed by Discord in this guild. - - - Gets the embed channel (i.e. the channel set in the guild's widget settings) in this guild. - - - A channel set within the server's widget settings; if none is set. - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. @@ -2719,10 +2688,6 @@ is . - - - is . - is . @@ -3026,6 +2991,9 @@ of application commands found within the guild. + + + @@ -3056,12 +3024,6 @@ - - - - - - @@ -3122,9 +3084,6 @@ - - - @@ -3491,6 +3450,98 @@ A task that represents the asynchronous operation of acknowledging the interaction. + + + Gets the unique identifier for this invite. + + + A string containing the invite code (e.g. FTqNnyS). + + + + + Gets the URL used to accept this invite + + + A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). + + + + + Gets the channel this invite is linked to. + + + A generic channel that the invite points to. + + + + + Gets the guild this invite is linked to. + + + A guild object representing the guild that the invite points to. + + + + + Represents a guild invite + + + + + Gets the unique invite code + + Returns the unique invite code + + + + + + Gets the user who created the invite + + Returns the user who created the invite + + + + + + Gets the maximum number of times the invite can be used, if there is no limit then the value will be 0 + + Returns the maximum number of times the invite can be used, if there is no limit then the value will be 0 + + + + + + Gets whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) + + Returns whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) + + + + + + Gets the time at which the invite was created + + Returns the time at which the invite was created + + + + + + Gets how long the invite is valid for + + Returns how long the invite is valid for (in seconds) + + + + + + Deletes the invite + + + + @@ -3522,9 +3573,6 @@ - - - @@ -3598,7 +3646,10 @@ - + + + + @@ -3661,6 +3712,9 @@ + + + Returns all attachments included in this message. @@ -3704,6 +3758,9 @@ + + + @@ -3748,6 +3805,9 @@ + + + @@ -3885,6 +3945,9 @@ + + + @@ -3899,9 +3962,6 @@ - - - @@ -3943,6 +4003,9 @@ + + + @@ -4082,6 +4145,9 @@ + + + @@ -4125,15 +4191,27 @@ + + + + + + + + + + + + @@ -4160,9 +4238,6 @@ - - - @@ -4296,6 +4371,9 @@ + + + @@ -4305,9 +4383,6 @@ - - - @@ -4325,7 +4400,7 @@ This property will only include guilds in the same . - + @@ -4436,6 +4511,9 @@ + + + @@ -4450,18 +4528,34 @@ Webhook users cannot be modified. + + + Roles are not supported on webhook users. + Roles are not supported on webhook users. + + + Roles are not supported on webhook users. + Roles are not supported on webhook users. + + + Roles are not supported on webhook users. + Roles are not supported on webhook users. + + + Roles are not supported on webhook users. + Roles are not supported on webhook users. @@ -4531,6 +4625,61 @@ The reason why the gateway has been requested to reconnect. + + Creates a new REST/WebSocket discord client. + + + + + + Wraps another stream with a timed buffer. + + + Reads the payload from an RTP frame + + + Converts Opus to PCM + + + Header received with no payload. + + + Received payload without an RTP header. + + + Converts PCM to Opus + + + Wraps an IAudioClient, sending voice data on write. + + + Reads the payload from an RTP frame + + + The token has had cancellation requested. + The associated has been disposed. + + + Wraps data in an RTP frame + + + + Decrypts an RTP frame using libsodium. + + + + + Encrypts an RTP frame using libsodium. + + + + Header received with no payload. + + + Received payload without an RTP header. + The token has had cancellation requested. + The associated has been disposed. + The sharded variant of , which may contain the client, user, guild, channel, and message. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index c0f4263fb5..3ea5995458 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -617,6 +617,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var state = new ClientState(data.Guilds.Length, data.PrivateChannels.Length); var currentUser = SocketSelfUser.Create(this, state, data.User); + Rest.CreateRestSelfUser(data.User); var activities = _activity.IsSpecified ? ImmutableList.Create(_activity.Value) : null; currentUser.Presence = new SocketPresence(Status, null, activities); ApiClient.CurrentUserId = currentUser.Id; From 5e07d3e39da0055dda25bb74bf9b4f4f0c6714e2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 1 Jun 2021 12:07:15 -0300 Subject: [PATCH 064/494] Change SocketMessage to SocketUserMessage in MessageComponent --- .../Interaction/Message Components/SocketMessageComponent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index a6ad7ed1c0..9f9f5c9606 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -23,7 +23,7 @@ public class SocketMessageComponent : SocketInteraction /// /// The message that contained the trigger for this interaction. /// - public SocketMessage Message { get; private set; } + public SocketUserMessage Message { get; private set; } internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) @@ -63,7 +63,7 @@ internal override void Update(Model model) else author = (this.Channel as SocketChannel).GetUser(model.Message.Value.Author.Value.Id); - this.Message = SocketMessage.Create(this.Discord, this.Discord.State, author, this.Channel, model.Message.Value); + this.Message = SocketUserMessage.Create(this.Discord, this.Discord.State, author, this.Channel, model.Message.Value); } else { From ba73e9323c4b55cd7369045d66ad5e18f1cb36e6 Mon Sep 17 00:00:00 2001 From: Matt Smith Date: Tue, 1 Jun 2021 11:16:59 -0500 Subject: [PATCH 065/494] fix hard coded path in csproj/documentation --- src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj | 4 ++-- src/Discord.Net.Commands/Discord.Net.Commands.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.csproj | 4 ++-- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 2 +- src/Discord.Net.Webhook/Discord.Net.Webhook.csproj | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj index 3f986a639e..cfaf67d345 100644 --- a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj +++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj @@ -1,4 +1,4 @@ - + Discord.Net.Analyzers @@ -7,7 +7,7 @@ netstandard2.0;netstandard2.1 - C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Analyzers\Discord.Net.Analyzers.xml + ..\Discord.Net.Analyzers\Discord.Net.Analyzers.xml diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index e505992f0d..3a189d2bf5 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -14,7 +14,7 @@ Temporary.png - C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Commands\Discord.Net.Commands.xml + ..\Discord.Net.Commands\Discord.Net.Commands.xml diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 56620bb7d0..f62f61e26f 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,4 +1,4 @@ - + @@ -17,7 +17,7 @@ false - C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Core\Discord.Net.Core.xml + ..\Discord.Net.Core\Discord.Net.Core.xml diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index c9db6fce2f..dde0765d87 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -16,7 +16,7 @@ 2.3.4 - C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Rest\Discord.Net.Rest.xml + ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index e91b509e75..3157675837 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -15,7 +15,7 @@ Discord.Net.Labs.WebSocket - C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.WebSocket\Discord.Net.WebSocket.xml + ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index a61bf2a5e0..295e981aa1 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -13,7 +13,7 @@ Temporary.png - C:\Users\lynch\Documents\GitHub\Discord.Net Labs\Discord.Net-Labs\src\Discord.Net.Webhook\Discord.Net.Webhook.xml + ..\Discord.Net.Webhook\Discord.Net.Webhook.xml From 121e3b4e77dfb2122ae4f3a3e475ecbc8b5a6104 Mon Sep 17 00:00:00 2001 From: SKProCH Date: Sun, 27 Jun 2021 16:28:05 +0300 Subject: [PATCH 066/494] Implemented new instant invite types --- .../Entities/Channels/INestedChannel.cs | 46 +++++++++++++++++- .../Entities/Invites/TargetUserType.cs | 6 ++- .../API/Rest/CreateChannelInviteParams.cs | 6 +++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 6 +++ .../Entities/Channels/ChannelHelper.cs | 48 +++++++++++++++++++ .../Entities/Channels/RestTextChannel.cs | 8 +++- .../Entities/Channels/RestVoiceChannel.cs | 8 +++- .../Entities/Channels/SocketTextChannel.cs | 6 +++ .../Entities/Channels/SocketVoiceChannel.cs | 6 +++ .../MockedEntities/MockedTextChannel.cs | 4 ++ .../MockedEntities/MockedVoiceChannel.cs | 4 ++ 11 files changed, 143 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs b/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs index 2c9503db1e..d8072f94fd 100644 --- a/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs @@ -12,7 +12,7 @@ public interface INestedChannel : IGuildChannel /// Gets the parent (category) ID of this channel in the guild's channel list. /// /// - /// A representing the snowflake identifier of the parent of this channel; + /// A representing the snowflake identifier of the parent of this channel; /// null if none is set. /// ulong? CategoryId { get; } @@ -56,6 +56,50 @@ public interface INestedChannel : IGuildChannel /// metadata object containing information for the created invite. /// Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null); + + /// + /// Creates a new invite to this channel. + /// + /// + /// The following example creates a new invite to this channel; the invite lasts for 12 hours and can only + /// be used 3 times throughout its lifespan. + /// + /// await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); + /// + /// + /// The id of the embedded application to open for this invite + /// The time (in seconds) until the invite expires. Set to null to never expire. + /// The max amount of times this invite may be used. Set to null to have unlimited uses. + /// If true, the user accepting this invite will be kicked from the guild after closing their client. + /// If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous invite creation operation. The task result contains an invite + /// metadata object containing information for the created invite. + /// + Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge = 86400, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null); + + /// + /// Creates a new invite to this channel. + /// + /// + /// The following example creates a new invite to this channel; the invite lasts for 12 hours and can only + /// be used 3 times throughout its lifespan. + /// + /// await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); + /// + /// + /// The id of the user whose stream to display for this invite + /// The time (in seconds) until the invite expires. Set to null to never expire. + /// The max amount of times this invite may be used. Set to null to have unlimited uses. + /// If true, the user accepting this invite will be kicked from the guild after closing their client. + /// If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous invite creation operation. The task result contains an invite + /// metadata object containing information for the created invite. + /// + Task CreateInviteToStreamAsync(IUser user, int? maxAge = 86400, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null); /// /// Gets a collection of all invites to this channel. /// B diff --git a/src/Discord.Net.Core/Entities/Invites/TargetUserType.cs b/src/Discord.Net.Core/Entities/Invites/TargetUserType.cs index 74263b888e..e1818d7a94 100644 --- a/src/Discord.Net.Core/Entities/Invites/TargetUserType.cs +++ b/src/Discord.Net.Core/Entities/Invites/TargetUserType.cs @@ -9,6 +9,10 @@ public enum TargetUserType /// /// The invite is for a Go Live stream. /// - Stream = 1 + Stream = 1, + /// + /// The invite is for embedded application. + /// + EmbeddedApplication = 2 } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs b/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs index db79bc314d..06a47f1a88 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs @@ -14,5 +14,11 @@ internal class CreateChannelInviteParams public Optional IsTemporary { get; set; } [JsonProperty("unique")] public Optional IsUnique { get; set; } + [JsonProperty("target_type")] + public Optional TargetType { get; set; } + [JsonProperty("target_user_id")] + public Optional TargetUserId { get; set; } + [JsonProperty("target_application_id")] + public Optional TargetApplicationId { get; set; } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index d7978db5c0..70e7f92781 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1079,6 +1079,12 @@ public async Task CreateChannelInviteAsync(ulong channelId, Crea Preconditions.AtLeast(args.MaxUses, 0, nameof(args.MaxUses)); Preconditions.AtMost(args.MaxAge, 86400, nameof(args.MaxAge), "The maximum age of an invite must be less than or equal to a day (86400 seconds)."); + if (args.TargetType.IsSpecified) + { + Preconditions.NotEqual((int)args.TargetType.Value, (int)TargetUserType.Undefined, nameof(args.TargetType)); + if (args.TargetType.Value == TargetUserType.Stream) Preconditions.GreaterThan(args.TargetUserId, 0, nameof(args.TargetUserId)); + if (args.TargetType.Value == TargetUserType.EmbeddedApplication) Preconditions.GreaterThan(args.TargetApplicationId, 0, nameof(args.TargetUserId)); + } options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(channelId: channelId); diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 22395ab3a3..77f5e5b4cf 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -120,6 +120,54 @@ public static async Task CreateInviteAsync(IGuildChannel cha return RestInviteMetadata.Create(client, null, channel, model); } + /// + /// may not be equal to zero. + /// -and- + /// and must be greater than zero. + /// -and- + /// must be lesser than 86400. + /// + public static async Task CreateInviteToStreamAsync(IGuildChannel channel, BaseDiscordClient client, + int? maxAge, int? maxUses, bool isTemporary, bool isUnique, IUser user, + RequestOptions options) + { + var args = new API.Rest.CreateChannelInviteParams + { + IsTemporary = isTemporary, + IsUnique = isUnique, + MaxAge = maxAge ?? 0, + MaxUses = maxUses ?? 0, + TargetType = TargetUserType.Stream, + TargetUserId = user.Id + }; + var model = await client.ApiClient.CreateChannelInviteAsync(channel.Id, args, options).ConfigureAwait(false); + return RestInviteMetadata.Create(client, null, channel, model); + } + + /// + /// may not be equal to zero. + /// -and- + /// and must be greater than zero. + /// -and- + /// must be lesser than 86400. + /// + public static async Task CreateInviteToApplicationAsync(IGuildChannel channel, BaseDiscordClient client, + int? maxAge, int? maxUses, bool isTemporary, bool isUnique, ulong applicationId, + RequestOptions options) + { + var args = new API.Rest.CreateChannelInviteParams + { + IsTemporary = isTemporary, + IsUnique = isUnique, + MaxAge = maxAge ?? 0, + MaxUses = maxUses ?? 0, + TargetType = TargetUserType.EmbeddedApplication, + TargetApplicationId = applicationId + }; + var model = await client.ApiClient.CreateChannelInviteAsync(channel.Id, args, options).ConfigureAwait(false); + return RestInviteMetadata.Create(client, null, channel, model); + } + //Messages public static async Task GetMessageAsync(IMessageChannel channel, BaseDiscordClient client, ulong id, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index c6d0b0509a..8597acd2fc 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -17,7 +17,7 @@ public class RestTextChannel : RestGuildChannel, IRestMessageChannel, ITextChann /// public string Topic { get; private set; } /// - public virtual int SlowModeInterval { get; private set; } + public virtual int SlowModeInterval { get; private set; } /// public ulong? CategoryId { get; private set; } @@ -78,7 +78,7 @@ public Task GetUserAsync(ulong id, RequestOptions options = null) /// /// /// A paged collection containing a collection of guild users that can access this channel. Flattening the - /// paginated response into a collection of users with + /// paginated response into a collection of users with /// is required if you wish to access the users. /// public IAsyncEnumerable> GetUsersAsync(RequestOptions options = null) @@ -215,6 +215,10 @@ public Task SyncPermissionsAsync(RequestOptions options = null) /// public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); + public Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); + public Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); /// public async Task> GetInvitesAsync(RequestOptions options = null) => await ChannelHelper.GetInvitesAsync(this, Discord, options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs index 3f3aa96c6c..b551c7f8f3 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs @@ -60,12 +60,18 @@ public Task GetCategoryAsync(RequestOptions options = null) /// public Task SyncPermissionsAsync(RequestOptions options = null) => ChannelHelper.SyncPermissionsAsync(this, Discord, options); - + //Invites /// public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); /// + public async Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => await ChannelHelper.CreateInviteToApplicationAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, applicationId, options).ConfigureAwait(false); + /// + public async Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => await ChannelHelper.CreateInviteToStreamAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, user, options).ConfigureAwait(false); + /// public async Task> GetInvitesAsync(RequestOptions options = null) => await ChannelHelper.GetInvitesAsync(this, Discord, options).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index 71a20c198e..a9c1e8658d 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -258,6 +258,12 @@ public Task> GetWebhooksAsync(RequestOptions op public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); /// + public async Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => await ChannelHelper.CreateInviteToApplicationAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, applicationId, options).ConfigureAwait(false); + /// + public async Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => await ChannelHelper.CreateInviteToStreamAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, user, options).ConfigureAwait(false); + /// public async Task> GetInvitesAsync(RequestOptions options = null) => await ChannelHelper.GetInvitesAsync(this, Discord, options).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs index bf4a63c9fc..7dded5fa2c 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs @@ -90,6 +90,12 @@ public override SocketGuildUser GetUser(ulong id) public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); /// + public async Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => await ChannelHelper.CreateInviteToApplicationAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, applicationId, options).ConfigureAwait(false); + /// + public async Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => await ChannelHelper.CreateInviteToStreamAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, user, options).ConfigureAwait(false); + /// public async Task> GetInvitesAsync(RequestOptions options = null) => await ChannelHelper.GetInvitesAsync(this, Discord, options).ConfigureAwait(false); diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs index 51aece5f2b..633d52e4a6 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs @@ -46,6 +46,10 @@ public Task CreateInviteAsync(int? maxAge = 86400, int? maxUses { throw new NotImplementedException(); } + public Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); + public Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); public Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) { diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs index eb617125df..7c3d00fdd1 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs @@ -47,6 +47,10 @@ public Task CreateInviteAsync(int? maxAge = 86400, int? maxUses { throw new NotImplementedException(); } + public Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); + public Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); public Task DeleteAsync(RequestOptions options = null) { From 8c6bf305a1e0d7c61910a6b5e7d5a37aeb4e89e1 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Wed, 30 Jun 2021 23:35:55 -0400 Subject: [PATCH 067/494] Update embed description max length See Discord API docs for reference: https://discord.com/developers/docs/resources/channel#embed-limits --- src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index f1238ddcf1..89aaf5fdef 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -27,7 +27,7 @@ public class EmbedBuilder /// /// Returns the maximum length of description allowed by Discord. /// - public const int MaxDescriptionLength = 2048; + public const int MaxDescriptionLength = 4096; /// /// Returns the maximum length of total characters allowed by Discord. /// From b394987d771de76434e2b72c7269d00bd292e2f7 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 1 Jul 2021 07:02:20 -0300 Subject: [PATCH 068/494] Added resolved entity support (untested), closes #21. Added GetOriginalResponseAsync to SocketInteraction. Fixed a few null bugs --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 10 +++ .../ApplicationCommandOptionType.cs | 7 +- ...ApplicationCommandInteractionDataOption.cs | 5 ++ .../Interactions/SlashCommandBuilder.cs | 2 +- .../ApplicationCommandInteractionData.cs | 6 +- ...plicationCommandInteractionDataResolved.cs | 8 +-- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- .../Interactions/InteractionHelper.cs | 18 ++--- .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 51 +++++--------- .../DiscordSocketClient.cs | 2 +- .../Entities/Guilds/SocketGuild.cs | 10 +++ .../SocketMessageComponent.cs | 9 ++- .../Slash Commands/SocketSlashCommand.cs | 64 ++++++++---------- .../Slash Commands/SocketSlashCommandData.cs | 66 +++++++++++++++++-- .../SocketSlashCommandDataOption.cs | 52 +++++++-------- .../Entities/Interaction/SocketInteraction.cs | 15 +++-- 18 files changed, 202 insertions(+), 129 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index f62f61e26f..9bebe08aea 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.8 + 2.3.9-pre Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 5baa090bf3..f606390308 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3932,6 +3932,11 @@ A . + + + + + Provides properties that are used to modify a with the specified changes. @@ -4032,6 +4037,11 @@ + + + The type of this data's option. + + Present if this option is a group or subcommand. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs index 97ab54d3d9..bf76336608 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -49,6 +49,11 @@ public enum ApplicationCommandOptionType : byte /// /// A . /// - Role = 8 + Role = 8, + + /// + /// + /// + Mentionable = 9 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index ffc94c428e..999309979f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -24,6 +24,11 @@ public interface IApplicationCommandInteractionDataOption /// object Value { get; } + /// + /// The type of this data's option. + /// + ApplicationCommandOptionType Type { get; } + /// /// Present if this option is a group or subcommand. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index c3c1aaa7fd..8011f9c8ec 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -341,7 +341,7 @@ public ApplicationCommandOptionProperties Build() Default = this.Default, Required = this.Required, Type = this.Type, - Options = new List(this.Options.Select(x => x.Build())), + Options = this.Options?.Count > 0 ? new List(this.Options.Select(x => x.Build())) : null, Choices = this.Choices }; } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index 118dcc0f09..c72e8a6868 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -12,6 +12,10 @@ internal class ApplicationCommandInteractionData public string Name { get; set; } [JsonProperty("options")] - public List Options { get; set; } = new(); + public List Options { get; set; } + + [JsonProperty("resolved")] + public Optional Resolved { get; set; } + } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs index fe44fbc795..46eca6b718 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs @@ -6,15 +6,15 @@ namespace Discord.API internal class ApplicationCommandInteractionDataResolved { [JsonProperty("users")] - public Optional> Users { get; set; } + public Optional> Users { get; set; } [JsonProperty("members")] - public Optional> Members { get; set; } + public Optional> Members { get; set; } [JsonProperty("channels")] - public Optional> Channels { get; set; } + public Optional> Channels { get; set; } [JsonProperty("roles")] - public Optional> Roles { get; set; } + public Optional> Roles { get; set; } } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index dde0765d87..ed8dbb66e1 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.8 + 2.3.9-pre Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index c5a8347c7b..a02bf90459 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -10,20 +10,20 @@ namespace Discord.Rest { internal static class InteractionHelper { - internal static async Task SendInteractionResponse(BaseDiscordClient client, IMessageChannel channel, InteractionResponse response, + internal static Task SendInteractionResponse(BaseDiscordClient client, IMessageChannel channel, InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { - await client.ApiClient.CreateInteractionResponse(response, interactionId, interactionToken, options).ConfigureAwait(false); - - // get the original message - var msg = await client.ApiClient.GetInteractionResponse(interactionToken).ConfigureAwait(false); - - var entity = RestInteractionMessage.Create(client, msg, interactionToken, channel); + return client.ApiClient.CreateInteractionResponse(response, interactionId, interactionToken, options); + } - return entity; + internal static async Task GetOriginalResponseAsync(BaseDiscordClient client, IMessageChannel channel, + IDiscordInteraction interaction, RequestOptions options = null) + { + var model = await client.ApiClient.GetInteractionResponse(interaction.Token, options).ConfigureAwait(false); + return RestInteractionMessage.Create(client, model, interaction.Token, channel); } - internal static async Task SendFollowupAsync(BaseDiscordClient client, API.Rest.CreateWebhookMessageParams args, + internal static async Task SendFollowupAsync(BaseDiscordClient client, CreateWebhookMessageParams args, string token, IMessageChannel channel, RequestOptions options = null) { var model = await client.ApiClient.CreateInteractionFollowupMessage(args, token, options).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 3157675837..6660f1311d 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.8 + 2.3.9-pre https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 30689f61f1..e08511d5d2 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3299,41 +3299,17 @@ The data associated with this interaction. - + - Responds to an Interaction. - - If you have set to , You should use - instead. - + Gets the original response to this slash command. - The text of the message to be sent. - if the message should be read out by a text-to-speech reader, otherwise . - A to send with this response. - The type of response to this Interaction. - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - - The sent as the response. If this is the first acknowledgement, it will return null. - - Message content is too long, length must be less or equal to . - The parameters provided were invalid or the token was invalid. + A that represents the initial response to this interaction. + + + - - Sends a followup message for this interaction. - - The text of the message to be sent - if the message should be read out by a text-to-speech reader, otherwise . - A to send with this response. - The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - - The sent message. - + @@ -3359,6 +3335,9 @@ + + + The sub command options received for this sub command group. @@ -3420,9 +3399,6 @@ The allowed mentions for this response. The request options for this response. A to be sent with this response - - The sent as the response. If this is the first acknowledgement, it will return null. - Message content is too long, length must be less or equal to . The parameters provided were invalid or the token was invalid. @@ -3442,6 +3418,13 @@ The sent message. + + + Gets the original response for this interaction. + + The request options for this async request. + A that represents the intitial response, or if there is no response. + Acknowledges this interaction with the . diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 3ea5995458..4fe1cfdfe9 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -25,7 +25,7 @@ namespace Discord.WebSocket public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient { private readonly ConcurrentQueue _largeGuilds; - private readonly JsonSerializer _serializer; + internal readonly JsonSerializer _serializer; private readonly DiscordShardedClient _shardedClient; private readonly DiscordSocketClient _parentClient; private readonly ConcurrentQueue _heartbeatTimes; diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index bd2945a718..b4f6bd0860 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -794,6 +794,16 @@ internal SocketRole RemoveRole(ulong id) return null; } + internal SocketRole AddOrUpdateRole(RoleModel model) + { + if (_roles.TryGetValue(model.Id, out SocketRole role)) + _roles[model.Id].Update(this.Discord.State, model); + else + role = AddRole(model); + + return role; + } + //Users /// public Task AddGuildUserAsync(ulong id, string accessToken, Action func = null, RequestOptions options = null) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 9f9f5c9606..beda6eb536 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -92,7 +92,7 @@ internal override void Update(Model model) /// /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { if (type == InteractionResponseType.Pong) @@ -102,7 +102,10 @@ public override async Task RespondAsync(string text = null, boo throw new InvalidOperationException("Interaction token is no longer valid"); if (Discord.AlwaysAcknowledgeInteractions) - return await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); + { + await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); + return; + } Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -141,7 +144,7 @@ public override async Task RespondAsync(string text = null, boo if (ephemeral) response.Data.Value.Flags = 64; - return await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); + await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); } /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index faf50e38e4..1b94f5c83d 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -22,10 +22,14 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess : base(client, model.Id, channel) { var dataModel = model.Data.IsSpecified ? - (model.Data.Value as JToken).ToObject() + (model.Data.Value as JToken).ToObject(client._serializer) : null; - Data = SocketSlashCommandData.Create(client, dataModel, model.Id); + ulong? guildId = null; + if (this.Channel is SocketGuildChannel guildChannel) + guildId = guildChannel.Guild.Id; + + Data = SocketSlashCommandData.Create(client, dataModel, model.Id, guildId); } new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) @@ -38,7 +42,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess internal override void Update(Model model) { var data = model.Data.IsSpecified ? - (model.Data.Value as JToken).ToObject() + (model.Data.Value as JToken).ToObject(Discord._serializer) : null; this.Data.Update(data); @@ -47,26 +51,21 @@ internal override void Update(Model model) } /// - /// Responds to an Interaction. - /// - /// If you have set to , You should use - /// instead. - /// + /// Gets the original response to this slash command. /// - /// The text of the message to be sent. - /// if the message should be read out by a text-to-speech reader, otherwise . - /// A to send with this response. - /// The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - /// The allowed mentions for this response. - /// The request options for this response. - /// - /// The sent as the response. If this is the first acknowledgement, it will return null. - /// - /// Message content is too long, length must be less or equal to . - /// The parameters provided were invalid or the token was invalid. - - public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + /// A that represents the initial response to this interaction. + public async Task GetOriginalResponse() + { + // get the original message + var msg = await Discord.ApiClient.GetInteractionResponse(this.Token).ConfigureAwait(false); + + var entity = RestInteractionMessage.Create(Discord, msg, this.Token, this.Channel); + + return entity; + } + + /// + public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { if (type == InteractionResponseType.Pong) @@ -79,7 +78,10 @@ public override async Task RespondAsync(string text = null, boo throw new InvalidOperationException("Interaction token is no longer valid"); if (Discord.AlwaysAcknowledgeInteractions) - return await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); // The arguments should be passed? What was i thinking... + { + await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); + return; + } Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -118,22 +120,10 @@ public override async Task RespondAsync(string text = null, boo if (ephemeral) response.Data.Value.Flags = 64; - return await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); + await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); } - /// - /// Sends a followup message for this interaction. - /// - /// The text of the message to be sent - /// if the message should be read out by a text-to-speech reader, otherwise . - /// A to send with this response. - /// The type of response to this Interaction. - /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - /// The allowed mentions for this response. - /// The request options for this response. - /// - /// The sent message. - /// + /// public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index b3cb5ddd20..95157de89f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -18,15 +18,71 @@ public class SocketSlashCommandData : SocketEntity, IApplicationCommandIn /// public IReadOnlyCollection Options { get; private set; } - internal SocketSlashCommandData(DiscordSocketClient client, ulong id) - : base(client, id) + internal Dictionary guildMembers { get; private set; } = new(); + internal Dictionary users { get; private set; } = new(); + internal Dictionary channels { get; private set; } = new(); + internal Dictionary roles { get; private set; } = new(); + + private ulong? guildId; + + internal SocketSlashCommandData(DiscordSocketClient client, Model model, ulong? guildId) + : base(client, model.Id) { + this.guildId = guildId; + + if (model.Resolved.IsSpecified) + { + var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; + + var resolved = model.Resolved.Value; + + if (resolved.Users.IsSpecified) + { + foreach (var user in resolved.Users.Value) + { + var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); + + this.users.Add(ulong.Parse(user.Key), socketUser); + } + } + + if (resolved.Channels.IsSpecified) + { + foreach (var channel in resolved.Channels.Value) + { + SocketChannel socketChannel = channel.Value.GuildId.IsSpecified + ? SocketGuildChannel.Create(Discord.GetGuild(channel.Value.GuildId.Value), Discord.State, channel.Value) + : SocketDMChannel.Create(Discord, Discord.State, channel.Value); + + Discord.State.AddChannel(socketChannel); + this.channels.Add(ulong.Parse(channel.Key), socketChannel); + } + } + + if (resolved.Members.IsSpecified) + { + foreach (var member in resolved.Members.Value) + { + member.Value.User = resolved.Users.Value[member.Key]; + var user = guild.AddOrUpdateUser(member.Value); + this.guildMembers.Add(ulong.Parse(member.Key), user); + } + } + if (resolved.Roles.IsSpecified) + { + foreach (var role in resolved.Roles.Value) + { + var socketRole = guild.AddOrUpdateRole(role.Value); + this.roles.Add(ulong.Parse(role.Key), socketRole); + } + } + } } - internal static SocketSlashCommandData Create(DiscordSocketClient client, Model model, ulong id) + internal static SocketSlashCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) { - var entity = new SocketSlashCommandData(client, model.Id); + var entity = new SocketSlashCommandData(client, model, guildId); entity.Update(model); return entity; } @@ -35,7 +91,7 @@ internal void Update(Model model) this.Name = model.Name; this.Options = model.Options.Any() - ? model.Options.Select(x => new SocketSlashCommandDataOption(x, this.Discord)).ToImmutableArray() + ? model.Options.Select(x => new SocketSlashCommandDataOption(this, x)).ToImmutableArray() : null; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index e7ff1c5d55..c9e29599c6 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -16,22 +16,25 @@ public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOp /// public object Value { get; private set; } + /// + public ApplicationCommandOptionType Type { get; private set; } + /// /// The sub command options received for this sub command group. /// public IReadOnlyCollection Options { get; private set; } - private DiscordSocketClient discord; + + private SocketSlashCommandData data; internal SocketSlashCommandDataOption() { } - internal SocketSlashCommandDataOption(Model model, DiscordSocketClient discord) + internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) { this.Name = model.Name; this.Value = model.Value.IsSpecified ? model.Value.Value : null; - this.discord = discord; this.Options = model.Options.Any() - ? model.Options.Select(x => new SocketSlashCommandDataOption(x, discord)).ToImmutableArray() + ? model.Options.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() : null; } @@ -43,16 +46,12 @@ public static explicit operator int(SocketSlashCommandDataOption option) public static explicit operator string(SocketSlashCommandDataOption option) => option.Value.ToString(); - public static explicit operator SocketGuildChannel(SocketSlashCommandDataOption option) + public static explicit operator SocketChannel(SocketSlashCommandDataOption option) { - if (option.Value is ulong id) + if(ulong.TryParse(option.Value.ToString(), out ulong id)) { - var guild = option.discord.GetGuild(id); - - if (guild == null) - return null; - - return guild.GetChannel(id); + if (option.data.channels.TryGetValue(id, out var channel)) + return channel; } return null; @@ -60,34 +59,35 @@ public static explicit operator SocketGuildChannel(SocketSlashCommandDataOption public static explicit operator SocketRole(SocketSlashCommandDataOption option) { - if (option.Value is ulong id) + if (ulong.TryParse(option.Value.ToString(), out ulong id)) { - var guild = option.discord.GetGuild(id); - - if (guild == null) - return null; - - return guild.GetRole(id); + if (option.data.roles.TryGetValue(id, out var role)) + return role; } return null; } - public static explicit operator SocketGuildUser(SocketSlashCommandDataOption option) + public static explicit operator SocketUser(SocketSlashCommandDataOption option) { - if(option.Value is ulong id) + if (ulong.TryParse(option.Value.ToString(), out ulong id)) { - var guild = option.discord.GetGuild(id); + if (option.data.users.TryGetValue(id, out var user)) + return user; + } - if (guild == null) - return null; + return null; + } - return guild.GetUser(id); - } + public static explicit operator SocketGuildUser(SocketSlashCommandDataOption option) + { + if (option.Value as SocketUser is SocketGuildUser guildUser) + return guildUser; return null; } + IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 4b213f4ecc..a31ecc6922 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -110,13 +110,10 @@ internal virtual void Update(Model model) /// The allowed mentions for this response. /// The request options for this response. /// A to be sent with this response - /// - /// The sent as the response. If this is the first acknowledgement, it will return null. - /// /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); /// @@ -137,6 +134,16 @@ public abstract Task FollowupAsync(string text = null, bool InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); + /// + /// Gets the original response for this interaction. + /// + /// The request options for this async request. + /// A that represents the intitial response, or if there is no response. + public Task GetOriginalResponseAsync(RequestOptions options = null) + { + return InteractionHelper.GetOriginalResponseAsync(this.Discord, this.Channel, this, options); + } + /// /// Acknowledges this interaction with the . /// From 6bdd873c0dfd1a3def4e7205551e5933b58dc547 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 1 Jul 2021 07:07:15 -0300 Subject: [PATCH 069/494] Fix duplicate method --- src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index ad398fe8a1..31252466b8 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -127,11 +127,6 @@ public static async Task AddReactionAsync(ulong channelId, ulong messageId, IEmo await client.ApiClient.AddReactionAsync(channelId, messageId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); } - public static async Task AddReactionAsync(ulong channelId, ulong messageId, IEmote emote, BaseDiscordClient client, RequestOptions options) - { - await client.ApiClient.AddReactionAsync(channelId, messageId, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); - } - public static async Task AddReactionAsync(IMessage msg, IEmote emote, BaseDiscordClient client, RequestOptions options) { await client.ApiClient.AddReactionAsync(msg.Channel.Id, msg.Id, emote is Emote e ? $"{e.Name}:{e.Id}" : UrlEncode(emote.Name), options).ConfigureAwait(false); From babda495addcc772611a845c524c167e147cdcfd Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 1 Jul 2021 07:18:09 -0300 Subject: [PATCH 070/494] Complete merge of upstream/dev --- .../Discord.Net.WebSocket.csproj | 5 +- .../Entities/Invites/ISocketInvite.cs | 42 ------- .../Entities/Invites/InviteCache.cs | 47 -------- .../Entities/Invites/SocketGuildInvite.cs | 112 ------------------ .../Entities/Invites/SocketInviteHelper.cs | 17 --- 5 files changed, 4 insertions(+), 219 deletions(-) delete mode 100644 src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs delete mode 100644 src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs delete mode 100644 src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs delete mode 100644 src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 01aece130d..80279ed59f 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,6 +1,6 @@ - + Discord.Net.WebSocket Discord.WebSocket @@ -13,4 +13,7 @@ + + + diff --git a/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs deleted file mode 100644 index 8fe82b089c..0000000000 --- a/src/Discord.Net.WebSocket/Entities/Invites/ISocketInvite.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.WebSocket -{ - public interface ISocketInvite - { - /// - /// Gets the unique identifier for this invite. - /// - /// - /// A string containing the invite code (e.g. FTqNnyS). - /// - string Code { get; } - /// - /// Gets the URL used to accept this invite - /// - /// - /// A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). - /// - string Url { get; } - - /// - /// Gets the channel this invite is linked to. - /// - /// - /// A generic channel that the invite points to. - /// - SocketGuildChannel Channel { get; } - - /// - /// Gets the guild this invite is linked to. - /// - /// - /// A guild object representing the guild that the invite points to. - /// - SocketGuild Guild { get; } - } -} diff --git a/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs b/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs deleted file mode 100644 index a203b780fb..0000000000 --- a/src/Discord.Net.WebSocket/Entities/Invites/InviteCache.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.WebSocket -{ - internal class InviteCache - { - private readonly ConcurrentDictionary _invites; - private readonly ConcurrentQueue _queue; - private static int _size; - - public InviteCache(DiscordSocketClient client) - { - //NOTE: - //This should be an option in the client config. default for now is 20 invites per guild - _size = client.Guilds.Count * 20; - - _invites = new ConcurrentDictionary(); - _queue = new ConcurrentQueue(); - } - public void Add(SocketGuildInvite invite) - { - if(_invites.TryAdd(invite.Code, invite)) - { - _queue.Enqueue(invite.Code); - - while (_queue.Count > _size && _queue.TryDequeue(out string invCode)) - _invites.TryRemove(invCode, out _); - } - } - public SocketGuildInvite Remove(string inviteCode) - { - _invites.TryRemove(inviteCode, out SocketGuildInvite inv); - return inv; - } - public SocketGuildInvite Get(string inviteCode) - { - if(_invites.TryGetValue(inviteCode, out SocketGuildInvite inv)) - return inv; - return null; - } - } -} diff --git a/src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs deleted file mode 100644 index 35fdf237c9..0000000000 --- a/src/Discord.Net.WebSocket/Entities/Invites/SocketGuildInvite.cs +++ /dev/null @@ -1,112 +0,0 @@ -using Discord.Rest; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization.Formatters; -using System.Text; -using System.Threading.Tasks; -using InviteUpdate = Discord.API.Gateway.InviteCreatedEvent; - -namespace Discord.WebSocket -{ - /// - /// Represents a guild invite - /// - public class SocketGuildInvite : SocketEntity, ISocketInvite - { - public string Code { get; private set; } - public string Url => $"{DiscordConfig.InviteUrl}{Code}"; - public SocketGuildChannel Channel { get; private set; } - public SocketGuild Guild { get; private set; } - /// - /// Gets the unique invite code - /// - /// Returns the unique invite code - /// - /// - public string Id => Code; - /// - /// Gets the user who created the invite - /// - /// Returns the user who created the invite - /// - /// - public SocketGuildUser Inviter { get; private set; } - /// - /// Gets the maximum number of times the invite can be used, if there is no limit then the value will be 0 - /// - /// Returns the maximum number of times the invite can be used, if there is no limit then the value will be 0 - /// - /// - public int? MaxUses { get; private set; } - /// - /// Gets whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) - /// - /// Returns whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) - /// - /// - public bool Temporary { get; private set; } - /// - /// Gets the time at which the invite was created - /// - /// Returns the time at which the invite was created - /// - /// - public DateTimeOffset? CreatedAt { get; private set; } - /// - /// Gets how long the invite is valid for - /// - /// Returns how long the invite is valid for (in seconds) - /// - /// - public TimeSpan? MaxAge { get; private set; } - - internal SocketGuildInvite(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, RestInviteMetadata rest) : base(_client, inviteCode) - { - Code = inviteCode; - Guild = guild; - Channel = channel; - CreatedAt = rest.CreatedAt; - Temporary = rest.IsTemporary; - MaxUses = rest.MaxUses; - Inviter = guild.GetUser(rest.Inviter.Id); - if (rest.MaxAge.HasValue) - MaxAge = TimeSpan.FromSeconds(rest.MaxAge.Value); - } - internal SocketGuildInvite(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, InviteUpdate Update) : base(_client, inviteCode) - { - Code = inviteCode; - Guild = guild; - Channel = channel; - - if (Update.RawTimestamp.IsSpecified) - CreatedAt = Update.RawTimestamp.Value; - else - CreatedAt = DateTimeOffset.Now; - - if (Update.inviter.IsSpecified) - Inviter = guild.GetUser(Update.inviter.Value.Id); - - Temporary = Update.TempInvite; - MaxUses = Update.MaxUsers; - MaxAge = TimeSpan.FromSeconds(Update.RawAge); - } - internal static SocketGuildInvite Create(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, InviteUpdate Update) - { - var invite = new SocketGuildInvite(_client, guild, channel, inviteCode, Update); - return invite; - } - internal static SocketGuildInvite CreateFromRest(DiscordSocketClient _client, SocketGuild guild, SocketGuildChannel channel, string inviteCode, RestInviteMetadata rest) - { - var invite = new SocketGuildInvite(_client, guild, channel, inviteCode, rest); - return invite; - } - /// - /// Deletes the invite - /// - /// - /// - public Task DeleteAsync(RequestOptions options = null) - => SocketInviteHelper.DeleteAsync(this, Discord, options); - } -} diff --git a/src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs b/src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs deleted file mode 100644 index 3781739a93..0000000000 --- a/src/Discord.Net.WebSocket/Entities/Invites/SocketInviteHelper.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.WebSocket -{ - internal class SocketInviteHelper - { - public static async Task DeleteAsync(ISocketInvite invite, BaseSocketClient client, - RequestOptions options) - { - await client.ApiClient.DeleteInviteAsync(invite.Code, options).ConfigureAwait(false); - } - } -} From 3f86e61047d758ce6e5f54f6b943b82f5aa3a32e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 2 Jul 2021 17:45:12 -0300 Subject: [PATCH 071/494] Added select menus This comit addds support for select menu message components defined at https://discord.com/developers/docs/interactions/message-components#select-menus. Added 2 new converters: InteractionConverter and MessageComponentConverter. These converters are responsible for resolving the API type given some condition. Added new core interface for representing Interaction Data, this is used in part with the InteractionConverter to parse the data to the respective types. Updated the way gateway converting is done with interactions. The Interaction payload was moved from the API.Gateway namespace to API, as the interaction object is not websocket specific. The socket entities no longer try to parse the interaction models data to a JToken to desterilize since the data is now parsed to the correct model by the contract resolver. --- src/Discord.Net.Core/Discord.Net.Core.xml | 347 +++++++++++- .../Interactions/IDiscordInteraction.cs | 2 +- .../Interactions/IDiscordInteractionData.cs | 13 + .../Message Components/ActionRowComponent.cs | 4 +- .../Message Components/ComponentBuilder.cs | 529 +++++++++++++++++- .../Message Components/ComponentType.cs | 7 +- .../Message Components/SelectMenu.cs | 51 ++ .../Message Components/SelectMenuOption.cs | 48 ++ .../API/Common/ActionRowComponent.cs | 18 +- .../ApplicationCommandInteractionData.cs | 2 +- .../API/Common/ButtonComponent.cs | 2 +- .../API/Common/Interaction.cs} | 9 +- .../Common/MessageComponentInteractionData.cs | 5 +- .../API/Common/SelectMenuComponent.cs | 42 ++ .../API/Common/SelectMenuOption.cs | 58 ++ .../Entities/Messages/RestMessage.cs | 54 +- .../Net/Converters/DiscordContractResolver.cs | 4 + .../Net/Converters/InteractionConverter.cs | 67 +++ .../Converters/MessageComponentConverter.cs | 44 ++ .../Discord.Net.WebSocket.xml | 5 + .../DiscordSocketClient.cs | 2 +- .../SocketMessageComponent.cs | 6 +- .../SocketMessageComponentData.cs | 6 + .../Slash Commands/SocketSlashCommand.cs | 4 +- .../Entities/Interaction/SocketInteraction.cs | 4 +- .../Entities/Messages/SocketMessage.cs | 54 +- .../Discord.Net.Webhook.xml | 50 ++ 27 files changed, 1359 insertions(+), 78 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs rename src/{Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs => Discord.Net.Rest/API/Common/Interaction.cs} (84%) create mode 100644 src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs create mode 100644 src/Discord.Net.Rest/API/Common/SelectMenuOption.cs create mode 100644 src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs create mode 100644 src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index f606390308..a4b16057dc 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4132,6 +4132,11 @@ read-only property, always 1. + + + Represents an interface used to specify classes that they are a vaild dataype of a class. + + The response type for an . @@ -4277,6 +4282,16 @@ Represents a builder for creating a . + + + The max length of a . + + + + + The max length of a . + + The max amount of rows a message can have. @@ -4287,6 +4302,36 @@ Gets or sets the Action Rows for this Component Builder. + + + Adds a to the first row, if the first row cannot + accept the component then it will add it to a row that can + + The label of the menu. + The custom id of the menu. + The options of the menu. + The placeholder of the menu. + The min values of the placeholder. + The max values of the placeholder. + The row to add the menu to. + + + + + Adds a to the first row, if the first row cannot + accept the component then it will add it to a row that can + + The menu to add + The current builder. + + + + Adds a to the current builder at the specific row. + + The menu to add. + The row to attempt to add this component on. + The current builder. + Adds a button to the specified row. @@ -4336,14 +4381,14 @@ Gets or sets the components inside this row. - + Adds a list of components to the current row. The list of components to add. The current builder. - + Adds a component at the end of the current row. @@ -4363,16 +4408,6 @@ Represents a class used to build 's. - - - The max length of a . - - - - - The max length of a . - - Gets or sets the label of the current button. @@ -4493,6 +4528,226 @@ A button cannot contain a URL and a CustomId. A button must have an Emote or a label. + + + Represents a class used to build 's. + + + + + The max length of a . + + + + + The maximum number of values for the and properties. + + + + + The maximum number of options a can have. + + + + + Gets or sets the label of the current select menu. + + + + + Gets or sets the custom id of the current select menu. + + + + + Gets or sets the placeholder text of the current select menu. + + + + + Gets or sets the minimum values of the current select menu. + + + + + Gets or sets the maximum values of the current select menu. + + + + + Gets or sets a collection of for this current select menu. + + + + + Creates a new instance of a . + + + + + Creates a new instance of a . + + The custom id of this select menu. + The options for this select menu. + + + + Sets the field label. + + The value to set the field label to. + + The current builder. + + + + + Sets the field CustomId. + + The value to set the field CustomId to. + + The current builder. + + + + + Sets the field placeholder. + + The value to set the field placeholder to. + + The current builder. + + + + + Sets the field minValues. + + The value to set the field minValues to. + + The current builder. + + + + + Sets the field maxValues. + + The value to set the field maxValues to. + + The current builder. + + + + + Sets the field options. + + The value to set the field options to. + + The current builder. + + + + + Builds a + + The newly built + + + + Represents a class used to build 's. + + + + + The maximum length of a . + + + + + Gets or sets the label of the current select menu. + + + + + Gets or sets the custom id of the current select menu. + + + + + Gets or sets this menu options description. + + + + + Gets or sets the emote of this option. + + + + + Gets or sets the whether or not this option will render selected by default. + + + + + Creates a new instance of a . + + + + + Creates a new instance of a . + + The label for this option. + The value of this option. + + + + Sets the field label. + + The value to set the field label to. + + The current builder. + + + + + Sets the field value. + + The value to set the field value to. + + The current builder. + + + + + Sets the field description. + + The value to set the field description to. + + The current builder. + + + + + Sets the field emote. + + The value to set the field emote to. + + The current builder. + + + + + Sets the field default. + + The value to set the field default to. + + The current builder. + + + + + Builds a . + + The newly built . + Represents a type of a component @@ -4508,6 +4763,11 @@ A clickable button + + + A select menu for picking from choices + + The of this Message Component. @@ -4528,6 +4788,69 @@ Returns a empty . + + + Represents a select menu component defined at + + + + + + + + The custom id of this Select menu that will be sent with a . + + + + + The menus options to select from. + + + + + A custom placeholder text if nothing is selected, max 100 characters. + + + + + The minimum number of items that must be chosen; default 1, min 0, max 25 + + + + + The maximum number of items that can be chosen; default 1, max 25 + + + + + Represents a choice for a . + + + + + The user-facing name of the option, max 25 characters. + + + + + The dev-define value of the option, max 100 characters. + + + + + An additional description of the option, max 50 characters. + + + + + A that will be displayed with this menu option. + + + + + Will render this option as selected by default. + + A class used to build slash commands. diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 5c409e837b..466bf3e914 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -28,7 +28,7 @@ public interface IDiscordInteraction : ISnowflakeEntity /// /// Represents the data sent within this interaction. /// - object Data { get; } + IDiscordInteractionData Data { get; } /// /// A continuation token for responding to the interaction. diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs new file mode 100644 index 0000000000..7083810b75 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents an interface used to specify classes that they are a vaild dataype of a class. + /// + public interface IDiscordInteractionData { } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index c29ef44a25..c5bbc8d081 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -18,10 +18,10 @@ public class ActionRowComponent : IMessageComponent /// /// The child components in this row. /// - public IReadOnlyCollection Components { get; internal set; } + public IReadOnlyCollection Components { get; internal set; } internal ActionRowComponent() { } - internal ActionRowComponent(List components) + internal ActionRowComponent(List components) { this.Components = components; } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index e8b0ce19c2..afd1e34bdb 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -11,6 +11,16 @@ namespace Discord /// public class ComponentBuilder { + /// + /// The max length of a . + /// + public const int MaxLabelLength = 80; + + /// + /// The max length of a . + /// + public const int MaxCustomIdLength = 100; + /// /// The max amount of rows a message can have. /// @@ -34,6 +44,84 @@ public List ActionRows private List _actionRows { get; set; } + /// + /// Adds a to the first row, if the first row cannot + /// accept the component then it will add it to a row that can + /// + /// The label of the menu. + /// The custom id of the menu. + /// The options of the menu. + /// The placeholder of the menu. + /// The min values of the placeholder. + /// The max values of the placeholder. + /// The row to add the menu to. + /// + public ComponentBuilder WithSelectMenu(string label, string customId, List options, + string placeholder = null, int minValues = 1, int maxValues = 1, int row = 0) + { + return WithSelectMenu(new SelectMenuBuilder() + .WithLabel(label) + .WithCustomId(customId) + .WithOptions(options) + .WithPlaceholder(placeholder) + .WithMaxValues(maxValues) + .WithMinValues(minValues), + row); + } + + /// + /// Adds a to the first row, if the first row cannot + /// accept the component then it will add it to a row that can + /// + /// The menu to add + /// The current builder. + public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu) + => WithSelectMenu(menu, 0); + + /// + /// Adds a to the current builder at the specific row. + /// + /// The menu to add. + /// The row to attempt to add this component on. + /// The current builder. + public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row) + { + Preconditions.LessThan(row, 5, nameof(row)); + + var builtMenu = menu.Build(); + + if (_actionRows == null) + { + _actionRows = new List(); + _actionRows.Add(new ActionRowBuilder().WithComponent(builtMenu)); + } + else + { + if (_actionRows.Count == row) + _actionRows.Add(new ActionRowBuilder().WithComponent(builtMenu)); + else + { + ActionRowBuilder actionRow = null; + if (_actionRows.Count < row) + actionRow = _actionRows.ElementAt(row); + else + { + actionRow = new ActionRowBuilder(); + _actionRows.Add(actionRow); + } + + if (actionRow.CanTakeComponent(builtMenu)) + actionRow.WithComponent(builtMenu); + else if (row < 5) + WithSelectMenu(menu, row + 1); + else + throw new ArgumentOutOfRangeException($"There is no more room to add a {nameof(builtMenu)}"); + } + } + + return this; + } + /// /// Adds a button to the specified row. /// @@ -81,6 +169,8 @@ public ComponentBuilder WithButton(ButtonBuilder button) /// The current builder. public ComponentBuilder WithButton(ButtonBuilder button, int row) { + Preconditions.LessThan(row, 5, nameof(row)); + var builtButton = button.Build(); if (_actionRows == null) @@ -94,12 +184,21 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row) _actionRows.Add(new ActionRowBuilder().WithComponent(builtButton)); else { - if (_actionRows.Count > row) - _actionRows[row].WithComponent(builtButton); + ActionRowBuilder actionRow = null; + if(_actionRows.Count < row) + actionRow = _actionRows.ElementAt(row); else { - _actionRows.First().WithComponent(builtButton); + actionRow = new ActionRowBuilder(); + _actionRows.Add(actionRow); } + + if (actionRow.CanTakeComponent(builtButton)) + actionRow.WithComponent(builtButton); + else if (row < 5) + WithButton(button, row + 1); + else + throw new ArgumentOutOfRangeException($"There is no more room to add a {nameof(button)}"); } } @@ -132,7 +231,7 @@ public class ActionRowBuilder /// /// Gets or sets the components inside this row. /// - public List Components + public List Components { get => _components; set @@ -144,14 +243,14 @@ public List Components } } - private List _components { get; set; } + private List _components { get; set; } /// /// Adds a list of components to the current row. /// /// The list of components to add. /// The current builder. - public ActionRowBuilder WithComponents(List components) + public ActionRowBuilder WithComponents(List components) { this.Components = components; return this; @@ -162,10 +261,10 @@ public ActionRowBuilder WithComponents(List components) /// /// The component to add. /// The current builder. - public ActionRowBuilder WithComponent(ButtonComponent component) + public ActionRowBuilder WithComponent(IMessageComponent component) { if (this.Components == null) - this.Components = new List(); + this.Components = new List(); this.Components.Add(component); @@ -188,6 +287,21 @@ public ActionRowComponent Build() return new ActionRowComponent(this._components); } + + internal bool CanTakeComponent(IMessageComponent component) + { + switch (component.Type) + { + case ComponentType.ActionRow: + return false; + case ComponentType.Button: + return this.Components.Count < 5; + case ComponentType.SelectMenu: + return this.Components.Count == 0; + default: + return false; + } + } } /// @@ -195,16 +309,6 @@ public ActionRowComponent Build() /// public class ButtonBuilder { - /// - /// The max length of a . - /// - public const int MaxLabelLength = 80; - - /// - /// The max length of a . - /// - public const int MaxCustomIdLength = 100; - /// /// Gets or sets the label of the current button. /// @@ -214,8 +318,8 @@ public string Label set { if (value != null) - if (value.Length > MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value.Length > ComponentBuilder.MaxLabelLength) + throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } @@ -230,8 +334,8 @@ public string CustomId set { if (value != null) - if (value.Length > MaxCustomIdLength) - throw new ArgumentException(message: $"Custom Id must be {MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + if (value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); _customId = value; } } @@ -429,4 +533,385 @@ public ButtonComponent Build() return new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); } } + + /// + /// Represents a class used to build 's. + /// + public class SelectMenuBuilder + { + /// + /// The max length of a . + /// + public const int MaxPlaceholderLength = 100; + + /// + /// The maximum number of values for the and properties. + /// + public const int MaxValuesCount = 25; + + /// + /// The maximum number of options a can have. + /// + public const int MaxOptionCount = 25; + + /// + /// Gets or sets the label of the current select menu. + /// + public string Label + { + get => _label; + set + { + if (value != null) + if (value.Length > ComponentBuilder.MaxLabelLength) + throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + + _label = value; + } + } + + /// + /// Gets or sets the custom id of the current select menu. + /// + public string CustomId + { + get => _customId; + set + { + if (value != null) + if (value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + _customId = value; + } + } + + /// + /// Gets or sets the placeholder text of the current select menu. + /// + public string Placeholder + { + get => _placeholder; + set + { + if (value?.Length > MaxPlaceholderLength) + throw new ArgumentException(message: $"Placeholder must be {MaxPlaceholderLength} characters or less!", paramName: nameof(Placeholder)); + + _placeholder = value; + } + } + + /// + /// Gets or sets the minimum values of the current select menu. + /// + public int MinValues + { + get => _minvalues; + set + { + Preconditions.LessThan(value, MaxValuesCount, nameof(MinValues)); + _minvalues = value; + } + } + + /// + /// Gets or sets the maximum values of the current select menu. + /// + public int MaxValues + { + get => _maxvalues; + set + { + Preconditions.LessThan(value, MaxValuesCount, nameof(MaxValues)); + _maxvalues = value; + } + } + + /// + /// Gets or sets a collection of for this current select menu. + /// + public List Options + { + get => _options; + set + { + if (value != null) + Preconditions.LessThan(value.Count, MaxOptionCount, nameof(Options)); + + _options = value; + } + } + + private List _options; + private int _minvalues = 1; + private int _maxvalues = 1; + private string _placeholder; + private string _label; + private string _customId; + + /// + /// Creates a new instance of a . + /// + public SelectMenuBuilder() { } + + /// + /// Creates a new instance of a . + /// + /// The custom id of this select menu. + /// The options for this select menu. + public SelectMenuBuilder(string customId, List options) + { + this.CustomId = customId; + this.Options = options; + } + + /// + /// Sets the field label. + /// + /// The value to set the field label to. + /// + /// The current builder. + /// + public SelectMenuBuilder WithLabel(string label) + { + this.Label = label; + return this; + } + + /// + /// Sets the field CustomId. + /// + /// The value to set the field CustomId to. + /// + /// The current builder. + /// + public SelectMenuBuilder WithCustomId(string customId) + { + this.CustomId = customId; + return this; + } + + /// + /// Sets the field placeholder. + /// + /// The value to set the field placeholder to. + /// + /// The current builder. + /// + public SelectMenuBuilder WithPlaceholder(string placeholder) + { + this.Placeholder = placeholder; + return this; + } + + /// + /// Sets the field minValues. + /// + /// The value to set the field minValues to. + /// + /// The current builder. + /// + public SelectMenuBuilder WithMinValues(int minValues) + { + this.MinValues = minValues; + return this; + } + + /// + /// Sets the field maxValues. + /// + /// The value to set the field maxValues to. + /// + /// The current builder. + /// + public SelectMenuBuilder WithMaxValues(int maxValues) + { + this.MaxValues = maxValues; + return this; + } + + /// + /// Sets the field options. + /// + /// The value to set the field options to. + /// + /// The current builder. + /// + public SelectMenuBuilder WithOptions(List options) + { + this.Options = options; + return this; + } + + /// + /// Builds a + /// + /// The newly built + public SelectMenu Build() + { + var opt = this.Options?.Select(x => x.Build()).ToList(); + + return new SelectMenu(this.CustomId, opt, this.Placeholder, this.MinValues, this.MaxValues); + } + } + + /// + /// Represents a class used to build 's. + /// + public class SelectMenuOptionBuilder + { + /// + /// The maximum length of a . + /// + public const int MaxDescriptionLength = 50; + + /// + /// Gets or sets the label of the current select menu. + /// + public string Label + { + get => _label; + set + { + if (value != null) + if (value.Length > ComponentBuilder.MaxLabelLength) + throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + + _label = value; + } + } + + /// + /// Gets or sets the custom id of the current select menu. + /// + public string Value + { + get => _value; + set + { + if (value != null) + if (value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException(message: $"Value must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(Value)); + _value = value; + } + } + + /// + /// Gets or sets this menu options description. + /// + public string Description + { + get => _description; + set + { + if (value != null) + Preconditions.LessThan(value.Length, MaxDescriptionLength, nameof(Description)); + + _description = value; + } + } + + /// + /// Gets or sets the emote of this option. + /// + public IEmote Emote { get; set; } + + /// + /// Gets or sets the whether or not this option will render selected by default. + /// + public bool? Default { get; set; } + + private string _label; + private string _value; + private string _description; + + /// + /// Creates a new instance of a . + /// + public SelectMenuOptionBuilder() { } + + /// + /// Creates a new instance of a . + /// + /// The label for this option. + /// The value of this option. + public SelectMenuOptionBuilder(string label, string value) + { + this.Label = label; + this.Value = value; + } + + /// + /// Sets the field label. + /// + /// The value to set the field label to. + /// + /// The current builder. + /// + public SelectMenuOptionBuilder WithLabel(string label) + { + this.Label = label; + return this; + } + + /// + /// Sets the field value. + /// + /// The value to set the field value to. + /// + /// The current builder. + /// + public SelectMenuOptionBuilder WithValue(string value) + { + this.Value = value; + return this; + } + + /// + /// Sets the field description. + /// + /// The value to set the field description to. + /// + /// The current builder. + /// + public SelectMenuOptionBuilder WithDescription(string description) + { + this.Description = description; + return this; + } + + /// + /// Sets the field emote. + /// + /// The value to set the field emote to. + /// + /// The current builder. + /// + public SelectMenuOptionBuilder WithEmote(IEmote emote) + { + this.Emote = emote; + return this; + } + + /// + /// Sets the field default. + /// + /// The value to set the field default to. + /// + /// The current builder. + /// + public SelectMenuOptionBuilder WithDefault(bool defaultValue) + { + this.Default = defaultValue; + return this; + } + + /// + /// Builds a . + /// + /// The newly built . + public SelectMenuOption Build() + { + return new SelectMenuOption(this.Label, this.Value, this.Description, this.Emote, this.Default); + } + } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs index 9b75599c99..5fb4fc092a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs @@ -19,6 +19,11 @@ public enum ComponentType /// /// A clickable button /// - Button = 2 + Button = 2, + + /// + /// A select menu for picking from choices + /// + SelectMenu = 3, } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs new file mode 100644 index 0000000000..70fd363983 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a select menu component defined at + /// + public class SelectMenu : IMessageComponent + { + /// + public ComponentType Type => ComponentType.SelectMenu; + + /// + /// The custom id of this Select menu that will be sent with a . + /// + public string CustomId { get; } + + /// + /// The menus options to select from. + /// + public IReadOnlyCollection Options { get; } + + /// + /// A custom placeholder text if nothing is selected, max 100 characters. + /// + public string Placeholder { get; } + + /// + /// The minimum number of items that must be chosen; default 1, min 0, max 25 + /// + public int MinValues { get; } + + /// + /// The maximum number of items that can be chosen; default 1, max 25 + /// + public int MaxValues { get; } + + internal SelectMenu(string customId, List options, string placeholder, int minValues, int maxValues) + { + this.CustomId = customId; + this.Options = options; + this.Placeholder = placeholder; + this.MinValues = minValues; + this.MaxValues = maxValues; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs new file mode 100644 index 0000000000..74da89cae6 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a choice for a . + /// + public class SelectMenuOption + { + /// + /// The user-facing name of the option, max 25 characters. + /// + public string Label { get; } + + /// + /// The dev-define value of the option, max 100 characters. + /// + public string Value { get; } + + /// + /// An additional description of the option, max 50 characters. + /// + public string Description { get; } + + /// + /// A that will be displayed with this menu option. + /// + public IEmote Emote { get; } + + /// + /// Will render this option as selected by default. + /// + public bool? Default { get; } + + internal SelectMenuOption(string label, string value, string description, IEmote emote, bool? defaultValue) + { + this.Label = label; + this.Value = value; + this.Description = description; + this.Emote = emote; + this.Default = defaultValue; + } + } +} diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs index 7fddac1cf5..4de9d6fe1e 100644 --- a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -7,19 +8,30 @@ namespace Discord.API { - internal class ActionRowComponent + internal class ActionRowComponent : IMessageComponent { [JsonProperty("type")] public ComponentType Type { get; set; } [JsonProperty("components")] - public List Components { get; set; } + public IMessageComponent[] Components { get; set; } internal ActionRowComponent() { } internal ActionRowComponent(Discord.ActionRowComponent c) { this.Type = c.Type; - this.Components = c.Components?.Select(x => new ButtonComponent(x)).ToList(); + this.Components = c.Components?.Select(x => + { + switch (x.Type) + { + case ComponentType.Button: + return new ButtonComponent(x as Discord.ButtonComponent); + case ComponentType.SelectMenu: + return new SelectMenuComponent(x as Discord.SelectMenu); + default: return null; + + } + }).ToArray(); } } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index c72e8a6868..b9647ba655 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -3,7 +3,7 @@ namespace Discord.API { - internal class ApplicationCommandInteractionData + internal class ApplicationCommandInteractionData : IDiscordInteractionData { [JsonProperty("id")] public ulong Id { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index 775f781015..b9d1147a2e 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -7,7 +7,7 @@ namespace Discord.API { - internal class ButtonComponent + internal class ButtonComponent : IMessageComponent { [JsonProperty("type")] public ComponentType Type { get; set; } diff --git a/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs b/src/Discord.Net.Rest/API/Common/Interaction.cs similarity index 84% rename from src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs rename to src/Discord.Net.Rest/API/Common/Interaction.cs index 6e9ebb4fbd..ebbc5fc1b7 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/InteractionCreated.cs +++ b/src/Discord.Net.Rest/API/Common/Interaction.cs @@ -1,4 +1,3 @@ -using Discord.API; using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -6,9 +5,10 @@ using System.Text; using System.Threading.Tasks; -namespace Discord.API.Gateway +namespace Discord.API { - internal class InteractionCreated + [JsonConverter(typeof(Net.Converters.InteractionConverter))] + internal class Interaction { [JsonProperty("id")] public ulong Id { get; set; } @@ -20,7 +20,7 @@ internal class InteractionCreated public InteractionType Type { get; set; } [JsonProperty("data")] - public Optional Data { get; set; } + public Optional Data { get; set; } [JsonProperty("guild_id")] public Optional GuildId { get; set; } @@ -42,6 +42,5 @@ internal class InteractionCreated [JsonProperty("message")] public Optional Message { get; set; } - } } diff --git a/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs index cdb4e7d5cf..5dc81e61ed 100644 --- a/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs @@ -7,12 +7,15 @@ namespace Discord.API { - internal class MessageComponentInteractionData + internal class MessageComponentInteractionData : IDiscordInteractionData { [JsonProperty("custom_id")] public string CustomId { get; set; } [JsonProperty("component_type")] public ComponentType ComponentType { get; set; } + + [JsonProperty("values")] + public Optional Values { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs new file mode 100644 index 0000000000..e206ec11a9 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -0,0 +1,42 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class SelectMenuComponent : IMessageComponent + { + [JsonProperty("type")] + public ComponentType Type { get; set; } + + [JsonProperty("custom_id")] + public string CustomId { get; set; } + + [JsonProperty("options")] + public SelectMenuOption[] Options { get; set; } + + [JsonProperty("placeholder")] + public Optional Placeholder { get; set; } + + [JsonProperty("min_values")] + public int MinValues { get; set; } + + [JsonProperty("max_values")] + public int MaxValues { get; set; } + + public SelectMenuComponent() { } + + public SelectMenuComponent(Discord.SelectMenu component) + { + this.Type = component.Type; + this.CustomId = component.CustomId; + this.Options = component.Options.Select(x => new SelectMenuOption(x)).ToArray(); + this.Placeholder = component.Placeholder; + this.MinValues = component.MinValues; + this.MaxValues = component.MaxValues; + } + } +} diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs new file mode 100644 index 0000000000..5c6f2816b8 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs @@ -0,0 +1,58 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class SelectMenuOption + { + [JsonProperty("label")] + public string Label { get; set; } + + [JsonProperty("value")] + public string Value { get; set; } + + [JsonProperty("description")] + public Optional Description { get; set; } + + [JsonProperty("emoji")] + public Optional Emoji { get; set; } + + [JsonProperty("default")] + public Optional Default { get; set; } + + public SelectMenuOption() { } + + public SelectMenuOption(Discord.SelectMenuOption option) + { + this.Label = option.Label; + this.Value = option.Value; + this.Description = option.Description; + + if (option.Emote != null) + { + if (option.Emote is Emote e) + { + this.Emoji = new Emoji() + { + Name = e.Name, + Animated = e.Animated, + Id = e.Id, + }; + } + else + { + this.Emoji = new Emoji() + { + Name = option.Emote.Name + }; + } + } + + this.Default = option.Default.HasValue ? option.Default.Value : Optional.Unspecified; + } + } +} diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 9f62c45be9..4ce655fcb4 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -133,16 +134,49 @@ internal virtual void Update(Model model) if (model.Components.IsSpecified) { - Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(x => - new ButtonComponent( - x.Style, - x.Label.GetValueOrDefault(), - x.Emote.IsSpecified ? x.Emote.Value.Id.HasValue ? new Emote(x.Emote.Value.Id.Value, x.Emote.Value.Name, x.Emote.Value.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Value.Name) : null, - x.CustomId.GetValueOrDefault(), - x.Url.GetValueOrDefault(), - x.Disabled.GetValueOrDefault()) - ).ToList() - )).ToList(); + Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(y => + { + switch (y.Type) + { + case ComponentType.Button: + { + var parsed = (API.ButtonComponent)y; + return new Discord.ButtonComponent( + parsed.Style, + parsed.Label.GetValueOrDefault(), + parsed.Emote.IsSpecified + ? parsed.Emote.Value.Id.HasValue + ? new Emote(parsed.Emote.Value.Id.Value, parsed.Emote.Value.Name, parsed.Emote.Value.Animated.GetValueOrDefault()) + : new Emoji(parsed.Emote.Value.Name) + : null, + parsed.CustomId.GetValueOrDefault(), + parsed.Url.GetValueOrDefault(), + parsed.Disabled.GetValueOrDefault()); + } + case ComponentType.SelectMenu: + { + var parsed = (API.SelectMenuComponent)y; + return new SelectMenu( + parsed.CustomId, + parsed.Options.Select(z => new SelectMenuOption( + z.Label, + z.Value, + z.Description.GetValueOrDefault(), + z.Emoji.IsSpecified + ? z.Emoji.Value.Id.HasValue + ? new Emote(z.Emoji.Value.Id.Value, z.Emoji.Value.Name, z.Emoji.Value.Animated.GetValueOrDefault()) + : new Emoji(z.Emoji.Value.Name) + : null, + z.Default.ToNullable())).ToList(), + parsed.Placeholder.GetValueOrDefault(), + parsed.MinValues, + parsed.MaxValues + ); + } + default: + return null; + } + }).ToList())).ToImmutableArray(); } else Components = new List(); diff --git a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs index 931c0c4c9c..5981a266e0 100644 --- a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs +++ b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs @@ -81,6 +81,10 @@ private static JsonConverter GetConverter(JsonProperty property, PropertyInfo pr //Special if (type == typeof(API.Image)) return ImageConverter.Instance; + if (typeof(IMessageComponent).IsAssignableFrom(type)) + return MessageComponentConverter.Instance; + if (type == typeof(API.Interaction)) + return InteractionConverter.Instance; //Entities var typeInfo = type.GetTypeInfo(); diff --git a/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs new file mode 100644 index 0000000000..cda3b1e24d --- /dev/null +++ b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs @@ -0,0 +1,67 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Net.Converters +{ + internal class InteractionConverter : JsonConverter + { + public static InteractionConverter Instance => new InteractionConverter(); + + public override bool CanRead => true; + public override bool CanWrite => false; + public override bool CanConvert(Type objectType) => true; + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + return null; + + var obj = JObject.Load(reader); + var interaction = new API.Interaction(); + + + // Remove the data property for manual deserialization + var result = obj.GetValue("data", StringComparison.OrdinalIgnoreCase); + result.Parent.Remove(); + + // Populate the remaining properties. + using (var subReader = obj.CreateReader()) + { + serializer.Populate(subReader, interaction); + } + + // Process the Result property + if (result != null) + { + switch (interaction.Type) + { + case InteractionType.ApplicationCommand: + { + var appCommandData = new API.ApplicationCommandInteractionData(); + serializer.Populate(result.CreateReader(), appCommandData); + interaction.Data = appCommandData; + } + break; + case InteractionType.MessageComponent: + { + var messageComponent = new API.MessageComponentInteractionData(); + serializer.Populate(result.CreateReader(), messageComponent); + interaction.Data = messageComponent; + } + break; + } + } + else + interaction.Data = Optional.Unspecified; + + return interaction; + } + + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException(); + } +} diff --git a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs new file mode 100644 index 0000000000..2203008d6c --- /dev/null +++ b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs @@ -0,0 +1,44 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Net.Converters +{ + internal class MessageComponentConverter : JsonConverter + { + public static MessageComponentConverter Instance => new MessageComponentConverter(); + + public override bool CanRead => true; + public override bool CanWrite => false; + public override bool CanConvert(Type objectType) => true; + public override void WriteJson(JsonWriter writer, + object value, JsonSerializer serializer) + { + serializer.Serialize(writer, value); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var jsonObject = JObject.Load(reader); + var messageComponent = default(IMessageComponent); + switch ((ComponentType)jsonObject["type"].Value()) + { + case ComponentType.ActionRow: + messageComponent = new API.ActionRowComponent(); + break; + case ComponentType.Button: + messageComponent = new API.ButtonComponent(); + break; + case ComponentType.SelectMenu: + messageComponent = new API.SelectMenuComponent(); + break; + } + serializer.Populate(jsonObject.CreateReader(), messageComponent); + return messageComponent; + } + } +} diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index e08511d5d2..c864a9f6b6 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3224,6 +3224,11 @@ The type of the component clicked + + + The value(s) of a interaction response. + + Represends a Websocket-based recieved over the gateway. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 4fe1cfdfe9..9f7a1e524a 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1865,7 +1865,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty { await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); - var data = (payload as JToken).ToObject(_serializer); + var data = (payload as JToken).ToObject(_serializer); SocketChannel channel = null; if(data.ChannelId.IsSpecified) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index beda6eb536..f42fb58ff1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using Model = Discord.API.Gateway.InteractionCreated; +using Model = Discord.API.Interaction; using DataModel = Discord.API.MessageComponentInteractionData; using Newtonsoft.Json.Linq; using Discord.Rest; @@ -29,12 +29,10 @@ internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocket : base(client, model.Id, channel) { var dataModel = model.Data.IsSpecified ? - (model.Data.Value as JToken).ToObject() + (DataModel)model.Data.Value : null; this.Data = new SocketMessageComponentData(dataModel); - - } new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs index 8477432c79..45e6882660 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs @@ -22,10 +22,16 @@ public class SocketMessageComponentData /// public ComponentType Type { get; } + /// + /// The value(s) of a interaction response. + /// + public IReadOnlyCollection Values { get; } + internal SocketMessageComponentData(Model model) { this.CustomId = model.CustomId; this.Type = model.ComponentType; + this.Values = model.Values.GetValueOrDefault(); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 1b94f5c83d..542e8efc55 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; -using Model = Discord.API.Gateway.InteractionCreated; +using Model = Discord.API.Interaction; namespace Discord.WebSocket { @@ -22,7 +22,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess : base(client, model.Id, channel) { var dataModel = model.Data.IsSpecified ? - (model.Data.Value as JToken).ToObject(client._serializer) + (DataModel)model.Data.Value : null; ulong? guildId = null; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index a31ecc6922..0876d6eb64 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using Model = Discord.API.Gateway.InteractionCreated; +using Model = Discord.API.Interaction; namespace Discord.WebSocket { @@ -36,7 +36,7 @@ public abstract class SocketInteraction : SocketEntity, IDiscordInteracti /// /// The data sent with this interaction. /// - public object Data { get; private set; } + public IDiscordInteractionData Data { get; private set; } /// /// The version of this interaction. diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index d0b9443a47..8ec18d49e3 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -1,4 +1,5 @@ using Discord.Rest; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -167,16 +168,49 @@ internal virtual void Update(ClientState state, Model model) if (model.Components.IsSpecified) { - Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(x => - new ButtonComponent( - x.Style, - x.Label.GetValueOrDefault(), - x.Emote.IsSpecified ? x.Emote.Value.Id.HasValue ? new Emote(x.Emote.Value.Id.Value, x.Emote.Value.Name, x.Emote.Value.Animated.GetValueOrDefault()) : new Emoji(x.Emote.Value.Name) : null, - x.CustomId.GetValueOrDefault(), - x.Url.GetValueOrDefault(), - x.Disabled.GetValueOrDefault()) - ).ToList() - )).ToList(); + Components = model.Components.Value.Select(x => new ActionRowComponent(x.Components.Select(y => + { + switch (y.Type) + { + case ComponentType.Button: + { + var parsed = (API.ButtonComponent)y; + return new Discord.ButtonComponent( + parsed.Style, + parsed.Label.GetValueOrDefault(), + parsed.Emote.IsSpecified + ? parsed.Emote.Value.Id.HasValue + ? new Emote(parsed.Emote.Value.Id.Value, parsed.Emote.Value.Name, parsed.Emote.Value.Animated.GetValueOrDefault()) + : new Emoji(parsed.Emote.Value.Name) + : null, + parsed.CustomId.GetValueOrDefault(), + parsed.Url.GetValueOrDefault(), + parsed.Disabled.GetValueOrDefault()); + } + case ComponentType.SelectMenu: + { + var parsed = (API.SelectMenuComponent)y; + return new SelectMenu( + parsed.CustomId, + parsed.Options.Select(z => new SelectMenuOption( + z.Label, + z.Value, + z.Description.GetValueOrDefault(), + z.Emoji.IsSpecified + ? z.Emoji.Value.Id.HasValue + ? new Emote(z.Emoji.Value.Id.Value, z.Emoji.Value.Name, z.Emoji.Value.Animated.GetValueOrDefault()) + : new Emoji(z.Emoji.Value.Name) + : null, + z.Default.ToNullable())).ToList(), + parsed.Placeholder.GetValueOrDefault(), + parsed.MinValues, + parsed.MaxValues + ); + } + default: + return null; + } + }).ToList())).ToImmutableArray(); } else Components = new List(); diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml index e2c3e69a97..f629c2c29b 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml @@ -35,6 +35,33 @@ Sends a message to the channel for this webhook. Returns the ID of the created message. + + + Modifies a message posted using this webhook. + + + This method can only modify messages that were sent using the same webhook. + + ID of the modified message. + A delegate containing the properties to modify the message with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + + + + Deletes a message posted using this webhook. + + + This method can only delete messages that were sent using the same webhook. + + ID of the deleted message. + The options to be used when sending the request. + + A task that represents the asynchronous deletion operation. + + Sends a message to the channel for this webhook with an attachment. Returns the ID of the created message. @@ -49,6 +76,29 @@ Deletes this webhook from Discord and disposes the client. + + + Properties that are used to modify an Webhook message with the specified changes. + + + + + Gets or sets the content of the message. + + + This must be less than the constant defined by . + + + + + Gets or sets the embed array that the message should display. + + + + + Gets or sets the allowed mentions of the message. + + Could not find a webhook with the supplied credentials. From a1fd2a61e409a0d32b9eaf87526a79b7065070be Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 2 Jul 2021 17:55:16 -0300 Subject: [PATCH 072/494] Fixed potential null ref in builder --- src/Discord.Net.Core/Discord.Net.Core.csproj | 4 ++-- .../Interactions/Message Components/ComponentBuilder.cs | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 2 +- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 2 ++ 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 9bebe08aea..8ff32d2bb5 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.9-pre + 2.3.9-dev Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index afd1e34bdb..33665210de 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -243,7 +243,7 @@ public List Components } } - private List _components { get; set; } + private List _components { get; set; } = new List(); /// /// Adds a list of components to the current row. diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 6660f1311d..91d8823d1e 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.9-pre + 2.3.9-dev https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 9f7a1e524a..be468fe304 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1865,6 +1865,8 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty { await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); + // 0x546861742062696720656e6469616e20656e636f64696e67206d616b6573206d79316d687a20636c6f636b207469636b + var data = (payload as JToken).ToObject(_serializer); SocketChannel channel = null; From 14ba3caa6eb7ebe6aa2d2a940f5297977d4d0408 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 3 Jul 2021 10:50:10 -0300 Subject: [PATCH 073/494] Fix bugs regarding component builder and slash commands. Also fixed mismatched param names in the slash command builder --- src/Discord.Net.Core/Discord.Net.Core.xml | 53 +++-- .../Message Components/ComponentBuilder.cs | 11 +- .../Interactions/SlashCommandBuilder.cs | 194 ++++++++++-------- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 4 +- .../Slash Commands/SocketSlashCommand.cs | 2 +- src/Discord.Net/Discord.Net.nuspec | 20 +- 6 files changed, 157 insertions(+), 127 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index a4b16057dc..4692504100 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4886,59 +4886,74 @@ Gets or sets the options for this command. + + + Build the current builder into a class. + + A that can be used to create slash commands over rest. + + + + Sets the field name. + + The value to set the field name to. + + The current builder. + + Sets the description of the current command. - The description of this command. + The description of this command. The current builder. Adds an option to the current slash command. - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - The options of the option to add. - The choices of this option. + The name of the option to add. + The type of this option. + The description of this option. + If this option is required for this command. + If this option is the default option. + The options of the option to add. + The choices of this option. The current builder. Adds an option to the current slash command. - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - The choices of this option. + The name of the option to add. + The type of this option. + The description of this option. + If this option is required for this command. + If this option is the default option. + The choices of this option. The current builder. Adds an option to the current slash command. - The name of the option to add. - The type of this option. - The sescription of this option. + The name of the option to add. + The type of this option. + The sescription of this option. The current builder. Adds an option to this slash command. - The option to add. + The option to add. The current builder. Adds a collection of options to the current slash command. - The collection of options to add. + The collection of options to add. The current builder. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 33665210de..6aa847d96a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -102,7 +102,7 @@ public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row) else { ActionRowBuilder actionRow = null; - if (_actionRows.Count < row) + if (_actionRows.Count > row) actionRow = _actionRows.ElementAt(row); else { @@ -167,7 +167,7 @@ public ComponentBuilder WithButton(ButtonBuilder button) /// The button to add. /// The row to add the button. /// The current builder. - public ComponentBuilder WithButton(ButtonBuilder button, int row) + public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) { Preconditions.LessThan(row, 5, nameof(row)); @@ -185,7 +185,7 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row) else { ActionRowBuilder actionRow = null; - if(_actionRows.Count < row) + if(_actionRows.Count > row) actionRow = _actionRows.ElementAt(row); else { @@ -295,7 +295,10 @@ internal bool CanTakeComponent(IMessageComponent component) case ComponentType.ActionRow: return false; case ComponentType.Button: - return this.Components.Count < 5; + if (this.Components.Any(x => x.Type == ComponentType.SelectMenu)) + return false; + else + return this.Components.Count < 5; case ComponentType.SelectMenu: return this.Components.Count == 0; default: diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index 8011f9c8ec..948527f292 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -86,6 +86,10 @@ public List Options private string _description { get; set; } private List _options { get; set; } + /// + /// Build the current builder into a class. + /// + /// A that can be used to create slash commands over rest. public SlashCommandCreationProperties Build() { SlashCommandCreationProperties props = new SlashCommandCreationProperties() @@ -107,67 +111,75 @@ public SlashCommandCreationProperties Build() } - public SlashCommandBuilder WithName(string Name) + /// + /// Sets the field name. + /// + /// The value to set the field name to. + /// + /// The current builder. + /// + public SlashCommandBuilder WithName(string name) { - this.Name = Name; + this.Name = name; return this; } /// /// Sets the description of the current command. /// - /// The description of this command. + /// The description of this command. /// The current builder. - public SlashCommandBuilder WithDescription(string Description) + public SlashCommandBuilder WithDescription(string description) { - this.Description = Description; + this.Description = description; return this; } /// /// Adds an option to the current slash command. /// - /// The name of the option to add. - /// The type of this option. - /// The description of this option. - /// If this option is required for this command. - /// If this option is the default option. - /// The options of the option to add. - /// The choices of this option. + /// The name of the option to add. + /// The type of this option. + /// The description of this option. + /// If this option is required for this command. + /// If this option is the default option. + /// The options of the option to add. + /// The choices of this option. /// The current builder. - public SlashCommandBuilder AddOption(string Name, ApplicationCommandOptionType Type, - string Description, bool Required = true, bool Default = false, List Options = null, params ApplicationCommandOptionChoiceProperties[] Choices) + public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, + string description, bool required = true, bool isDefault = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord - Preconditions.NotNullOrEmpty(Name, nameof(Name)); - Preconditions.AtLeast(Name.Length, 3, nameof(Name)); - Preconditions.AtMost(Name.Length, MaxNameLength, nameof(Name)); + Preconditions.NotNullOrEmpty(name, nameof(name)); + Preconditions.AtLeast(name.Length, 3, nameof(name)); + Preconditions.AtMost(name.Length, MaxNameLength, nameof(name)); // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(Name, @"^[\w-]{3,32}$")) - throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(Name)); + if (!Regex.IsMatch(name, @"^[\w-]{3,32}$")) + throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); // same with description - Preconditions.NotNullOrEmpty(Description, nameof(Description)); - Preconditions.AtLeast(Description.Length, 3, nameof(Description)); - Preconditions.AtMost(Description.Length, MaxDescriptionLength, nameof(Description)); + Preconditions.NotNullOrEmpty(description, nameof(description)); + Preconditions.AtLeast(description.Length, 3, nameof(description)); + Preconditions.AtMost(description.Length, MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true - if (Default) + if (isDefault) { if (this.Options != null) - if (this.Options.Any(x => x.Default)) - throw new ArgumentException("There can only be one command option with default set to true!", nameof(Default)); + if (this.Options.Any(x => x.Default.HasValue && x.Default.Value)) + throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); } SlashCommandOptionBuilder option = new SlashCommandOptionBuilder(); - option.Name = Name; - option.Description = Description; - option.Required = Required; - option.Default = Default; - option.Options = Options; - option.Choices = Choices != null ? new List(Choices) : null; + option.Name = name; + option.Description = description; + option.Required = required; + option.Default = isDefault; + option.Options = options; + option.Type = type; + option.Choices = choices != null ? new List(choices) : null; return AddOption(option); } @@ -175,33 +187,33 @@ public SlashCommandBuilder AddOption(string Name, ApplicationCommandOptionType T /// /// Adds an option to the current slash command. /// - /// The name of the option to add. - /// The type of this option. - /// The description of this option. - /// If this option is required for this command. - /// If this option is the default option. - /// The choices of this option. + /// The name of the option to add. + /// The type of this option. + /// The description of this option. + /// If this option is required for this command. + /// If this option is the default option. + /// The choices of this option. /// The current builder. - public SlashCommandBuilder AddOption(string Name, ApplicationCommandOptionType Type, - string Description, bool Required = true, bool Default = false, params ApplicationCommandOptionChoiceProperties[] Choices) - => AddOption(Name, Type, Description, Required, Default, null, Choices); + public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, + string description, bool required = true, bool isDefault = false, params ApplicationCommandOptionChoiceProperties[] choices) + => AddOption(name, type, description, required, isDefault, null, choices); /// /// Adds an option to the current slash command. /// - /// The name of the option to add. - /// The type of this option. - /// The sescription of this option. + /// The name of the option to add. + /// The type of this option. + /// The sescription of this option. /// The current builder. - public SlashCommandBuilder AddOption(string Name, ApplicationCommandOptionType Type, string Description) - => AddOption(Name, Type, Description, Options: null, Choices: null); + public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, string description) + => AddOption(name, type, description, options: null, choices: null); /// /// Adds an option to this slash command. /// - /// The option to add. + /// The option to add. /// The current builder. - public SlashCommandBuilder AddOption(SlashCommandOptionBuilder Option) + public SlashCommandBuilder AddOption(SlashCommandOptionBuilder option) { if (this.Options == null) this.Options = new List(); @@ -209,32 +221,32 @@ public SlashCommandBuilder AddOption(SlashCommandOptionBuilder Option) if (this.Options.Count >= MaxOptionsCount) throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); - if (Option == null) - throw new ArgumentNullException(nameof(Option), "Option cannot be null"); + if (option == null) + throw new ArgumentNullException(nameof(option), "Option cannot be null"); - this.Options.Add(Option); + this.Options.Add(option); return this; } /// /// Adds a collection of options to the current slash command. /// - /// The collection of options to add. + /// The collection of options to add. /// The current builder. - public SlashCommandBuilder AddOptions(params SlashCommandOptionBuilder[] Options) + public SlashCommandBuilder AddOptions(params SlashCommandOptionBuilder[] options) { - if (Options == null) - throw new ArgumentNullException(nameof(Options), "Options cannot be null!"); + if (options == null) + throw new ArgumentNullException(nameof(options), "Options cannot be null!"); - if (Options.Length == 0) - throw new ArgumentException(nameof(Options), "Options cannot be empty!"); + if (options.Length == 0) + throw new ArgumentException(nameof(options), "Options cannot be empty!"); if (this.Options == null) this.Options = new List(); - if (this.Options.Count + Options.Length > MaxOptionsCount) - throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); + if (this.Options.Count + options.Length > MaxOptionsCount) + throw new ArgumentOutOfRangeException(nameof(options), $"Cannot have more than {MaxOptionsCount} options!"); - this.Options.AddRange(Options); + this.Options.AddRange(options); return this; } } @@ -303,7 +315,7 @@ public string Description /// /// The first required option for the user to complete. only one option can be default. /// - public bool Default { get; set; } + public bool? Default { get; set; } /// /// if this option is required for this command, otherwise . @@ -369,10 +381,10 @@ public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) /// /// Adds a choice to the current option. /// - /// The name of the choice. - /// The value of the choice. + /// The name of the choice. + /// The value of the choice. /// The current builder. - public SlashCommandOptionBuilder AddChoice(string Name, int Value) + public SlashCommandOptionBuilder AddChoice(string name, int value) { if (Choices == null) Choices = new List(); @@ -380,16 +392,16 @@ public SlashCommandOptionBuilder AddChoice(string Name, int Value) if (Choices.Count >= MaxChoiceCount) throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); - if (Name == null) - throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); + if (name == null) + throw new ArgumentNullException($"{nameof(name)} cannot be null!"); - Preconditions.AtLeast(Name.Length, 1, nameof(Name)); - Preconditions.AtMost(Name.Length, 100, nameof(Name)); + Preconditions.AtLeast(name.Length, 1, nameof(name)); + Preconditions.AtMost(name.Length, 100, nameof(name)); Choices.Add(new ApplicationCommandOptionChoiceProperties() { - Name = Name, - Value = Value + Name = name, + Value = value }); return this; @@ -398,10 +410,10 @@ public SlashCommandOptionBuilder AddChoice(string Name, int Value) /// /// Adds a choice to the current option. /// - /// The name of the choice. - /// The value of the choice. + /// The name of the choice. + /// The value of the choice. /// The current builder. - public SlashCommandOptionBuilder AddChoice(string Name, string Value) + public SlashCommandOptionBuilder AddChoice(string name, string value) { if (Choices == null) Choices = new List(); @@ -409,22 +421,22 @@ public SlashCommandOptionBuilder AddChoice(string Name, string Value) if (Choices.Count >= MaxChoiceCount) throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); - if (Name == null) - throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); + if (name == null) + throw new ArgumentNullException($"{nameof(name)} cannot be null!"); - if (Value == null) - throw new ArgumentNullException($"{nameof(Value)} cannot be null!"); + if (value == null) + throw new ArgumentNullException($"{nameof(value)} cannot be null!"); - Preconditions.AtLeast(Name.Length, 1, nameof(Name)); - Preconditions.AtMost(Name.Length, 100, nameof(Name)); + Preconditions.AtLeast(name.Length, 1, nameof(name)); + Preconditions.AtMost(name.Length, 100, nameof(name)); - Preconditions.AtLeast(Value.Length, 1, nameof(Value)); - Preconditions.AtMost(Value.Length, 100, nameof(Value)); + Preconditions.AtLeast(value.Length, 1, nameof(value)); + Preconditions.AtMost(value.Length, 100, nameof(value)); Choices.Add(new ApplicationCommandOptionChoiceProperties() { - Name = Name, - Value = Value + Name = name, + Value = value }); return this; @@ -433,11 +445,11 @@ public SlashCommandOptionBuilder AddChoice(string Name, string Value) /// /// Sets the current builders name. /// - /// The name to set the current option builder. + /// The name to set the current option builder. /// The current builder. - public SlashCommandOptionBuilder WithName(string Name) + public SlashCommandOptionBuilder WithName(string name) { - this.Name = Name; + this.Name = name; return this; } @@ -445,11 +457,11 @@ public SlashCommandOptionBuilder WithName(string Name) /// /// Sets the current builders description. /// - /// The description to set. + /// The description to set. /// The current builder. - public SlashCommandOptionBuilder WithDescription(string Description) + public SlashCommandOptionBuilder WithDescription(string description) { - this.Description = Description; + this.Description = description; return this; } @@ -478,11 +490,11 @@ public SlashCommandOptionBuilder WithDefault(bool value) /// /// Sets the current type of this builder. /// - /// The type to set. + /// The type to set. /// The current builder. - public SlashCommandOptionBuilder WithType(ApplicationCommandOptionType Type) + public SlashCommandOptionBuilder WithType(ApplicationCommandOptionType type) { - this.Type = Type; + this.Type = type; return this; } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index ed8dbb66e1..3793f680e3 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.9-pre + 2.3.9-dev Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 542e8efc55..44a60015b7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -42,7 +42,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess internal override void Update(Model model) { var data = model.Data.IsSpecified ? - (model.Data.Value as JToken).ToObject(Discord._serializer) + (DataModel)model.Data.Value : null; this.Data.Update(data); diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index f3ed97f4be..2aaa72d02d 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.7$suffix$ + 2.3.8-dev$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From c1ea88d3856e935306fde2c8ab29ea497bb2f489 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 3 Jul 2021 11:24:49 -0300 Subject: [PATCH 074/494] Added resolved models to slash command values, fixed slash command CreatedAt property. Fixed incorrect operator for IsValid on slash commands. --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 14 ++-- ...ApplicationCommandInteractionDataOption.cs | 3 + .../Discord.Net.WebSocket.csproj | 4 +- .../Discord.Net.WebSocket.xml | 5 +- .../Slash Commands/SocketSlashCommandData.cs | 12 ++- .../SocketSlashCommandDataOption.cs | 77 ++++++++----------- .../Entities/Interaction/SocketInteraction.cs | 10 +-- 8 files changed, 61 insertions(+), 66 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 8ff32d2bb5..da9636eaca 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.3.9-dev + 2.4.0 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 4692504100..e33891477b 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -5023,30 +5023,30 @@ Adds a choice to the current option. - The name of the choice. - The value of the choice. + The name of the choice. + The value of the choice. The current builder. Adds a choice to the current option. - The name of the choice. - The value of the choice. + The name of the choice. + The value of the choice. The current builder. Sets the current builders name. - The name to set the current option builder. + The name to set the current option builder. The current builder. Sets the current builders description. - The description to set. + The description to set. The current builder. @@ -5067,7 +5067,7 @@ Sets the current type of this builder. - The type to set. + The type to set. The current builder. diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs index 33d04800f8..0eea07b838 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs @@ -8,6 +8,9 @@ internal class ApplicationCommandInteractionDataOption [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("type")] + public ApplicationCommandOptionType Type { get; set; } + [JsonProperty("value")] public Optional Value { get; set; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 91d8823d1e..56bb5a9025 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.9-dev + 2.3.10 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index c864a9f6b6..8dcbd0fcf9 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3383,6 +3383,9 @@ The version of this interaction. + + + if the token is valid for replying to, otherwise . @@ -3393,7 +3396,7 @@ Responds to an Interaction. If you have set to , You should use - instead. + instead. The text of the message to be sent. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 95157de89f..aa42919b8c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -18,10 +18,14 @@ public class SocketSlashCommandData : SocketEntity, IApplicationCommandIn /// public IReadOnlyCollection Options { get; private set; } - internal Dictionary guildMembers { get; private set; } = new(); - internal Dictionary users { get; private set; } = new(); - internal Dictionary channels { get; private set; } = new(); - internal Dictionary roles { get; private set; } = new(); + internal Dictionary guildMembers { get; private set; } + = new Dictionary(); + internal Dictionary users { get; private set; } + = new Dictionary(); + internal Dictionary channels { get; private set; } + = new Dictionary(); + internal Dictionary roles { get; private set; } + = new Dictionary(); private ulong? guildId; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index c9e29599c6..f611f773db 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -24,14 +24,41 @@ public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOp /// public IReadOnlyCollection Options { get; private set; } - - private SocketSlashCommandData data; - internal SocketSlashCommandDataOption() { } internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) { this.Name = model.Name; - this.Value = model.Value.IsSpecified ? model.Value.Value : null; + this.Type = model.Type; + + if (model.Value.IsSpecified) + { + if (ulong.TryParse($"{model.Value.Value}", out var valueId)) + { + switch (this.Type) + { + case ApplicationCommandOptionType.User: + var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; + + if (guildUser != null) + this.Value = guildUser; + else + this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + + break; + case ApplicationCommandOptionType.Channel: + this.Value = data.channels.FirstOrDefault(x => x.Key == valueId).Value; + break; + case ApplicationCommandOptionType.Role: + this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; + break; + default: + this.Value = model.Value.Value; + break; + } + } + else + this.Value = model.Value.Value; + } this.Options = model.Options.Any() ? model.Options.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() @@ -46,48 +73,6 @@ public static explicit operator int(SocketSlashCommandDataOption option) public static explicit operator string(SocketSlashCommandDataOption option) => option.Value.ToString(); - public static explicit operator SocketChannel(SocketSlashCommandDataOption option) - { - if(ulong.TryParse(option.Value.ToString(), out ulong id)) - { - if (option.data.channels.TryGetValue(id, out var channel)) - return channel; - } - - return null; - } - - public static explicit operator SocketRole(SocketSlashCommandDataOption option) - { - if (ulong.TryParse(option.Value.ToString(), out ulong id)) - { - if (option.data.roles.TryGetValue(id, out var role)) - return role; - } - - return null; - } - - public static explicit operator SocketUser(SocketSlashCommandDataOption option) - { - if (ulong.TryParse(option.Value.ToString(), out ulong id)) - { - if (option.data.users.TryGetValue(id, out var user)) - return user; - } - - return null; - } - - public static explicit operator SocketGuildUser(SocketSlashCommandDataOption option) - { - if (option.Value as SocketUser is SocketGuildUser guildUser) - return guildUser; - - return null; - } - - IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 0876d6eb64..337f60f623 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -43,7 +43,9 @@ public abstract class SocketInteraction : SocketEntity, IDiscordInteracti /// public int Version { get; private set; } - public DateTimeOffset CreatedAt { get; } + /// + public DateTimeOffset CreatedAt + => SnowflakeUtils.FromSnowflake(this.Id); /// /// if the token is valid for replying to, otherwise . @@ -52,7 +54,6 @@ public bool IsValidToken => CheckToken(); private ulong? GuildId { get; set; } - private ulong? ChannelId { get; set; } internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) @@ -77,7 +78,6 @@ internal virtual void Update(Model model) : null; this.GuildId = model.GuildId.ToNullable(); - this.ChannelId = model.ChannelId.ToNullable(); this.Token = model.Token; this.Version = model.Version; this.Type = model.Type; @@ -99,7 +99,7 @@ internal virtual void Update(Model model) /// Responds to an Interaction. /// /// If you have set to , You should use - /// instead. + /// instead. /// /// /// The text of the message to be sent. @@ -163,7 +163,7 @@ public virtual Task AcknowledgeAsync(RequestOptions options = null) private bool CheckToken() { // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction - return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes >= 15d; + return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes <= 15d; } } } From e4d0e2988552b25a76b6e5f5d722947b59459848 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 3 Jul 2021 12:10:16 -0300 Subject: [PATCH 075/494] Fix #25 --- .../Discord.Net.Commands.csproj | 4 +- src/Discord.Net.Core/Discord.Net.Core.xml | 2 +- .../Entities/Permissions/ChannelPermission.cs | 80 ++++++++++---- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 9 +- .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 101 +----------------- .../Discord.Net.Webhook.csproj | 4 +- src/Discord.Net/Discord.Net.nuspec | 32 +++--- 9 files changed, 87 insertions(+), 149 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 3a189d2bf5..1d786bae4b 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 2.3.4 + 2.3.5 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index e33891477b..6b58a53ebf 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -6414,7 +6414,7 @@ - Gets the type of this system message. + Gets the type of this message. diff --git a/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs b/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs index bf08887bda..99e74bd48f 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs @@ -10,94 +10,130 @@ public enum ChannelPermission : ulong /// /// Allows creation of instant invites. /// - CreateInstantInvite = 0x00_00_00_01, + CreateInstantInvite = 0x00_00_00_00_01, /// /// Allows management and editing of channels. /// - ManageChannels = 0x00_00_00_10, + ManageChannels = 0x00_00_00_00_10, // Text /// /// Allows for the addition of reactions to messages. /// - AddReactions = 0x00_00_00_40, + AddReactions = 0x00_00_00_00_40, /// /// Allows guild members to view a channel, which includes reading messages in text channels. /// - ViewChannel = 0x00_00_04_00, + ViewChannel = 0x00_00_00_04_00, /// /// Allows for sending messages in a channel. /// - SendMessages = 0x00_00_08_00, + SendMessages = 0x00_00_00_08_00, /// /// Allows for sending of text-to-speech messages. /// - SendTTSMessages = 0x00_00_10_00, + SendTTSMessages = 0x00_00_00_10_00, /// /// Allows for deletion of other users messages. /// - ManageMessages = 0x00_00_20_00, + ManageMessages = 0x00_00_00_20_00, /// /// Allows links sent by users with this permission will be auto-embedded. /// - EmbedLinks = 0x00_00_40_00, + EmbedLinks = 0x00_00_00_40_00, /// /// Allows for uploading images and files. /// - AttachFiles = 0x00_00_80_00, + AttachFiles = 0x00_00_00_80_00, /// /// Allows for reading of message history. /// - ReadMessageHistory = 0x00_01_00_00, + ReadMessageHistory = 0x00_00_01_00_00, /// /// Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all /// online users in a channel. /// - MentionEveryone = 0x00_02_00_00, + MentionEveryone = 0x00_00_02_00_00, /// /// Allows the usage of custom emojis from other servers. /// - UseExternalEmojis = 0x00_04_00_00, + UseExternalEmojis = 0x00_00_04_00_00, // Voice /// /// Allows for joining of a voice channel. /// - Connect = 0x00_10_00_00, + Connect = 0x00_00_10_00_00, /// /// Allows for speaking in a voice channel. /// - Speak = 0x00_20_00_00, + Speak = 0x00_00_20_00_00, /// /// Allows for muting members in a voice channel. /// - MuteMembers = 0x00_40_00_00, + MuteMembers = 0x00_00_40_00_00, /// /// Allows for deafening of members in a voice channel. /// - DeafenMembers = 0x00_80_00_00, + DeafenMembers = 0x00_00_80_00_00, /// /// Allows for moving of members between voice channels. /// - MoveMembers = 0x01_00_00_00, + MoveMembers = 0x00_01_00_00_00, /// /// Allows for using voice-activity-detection in a voice channel. /// - UseVAD = 0x02_00_00_00, - PrioritySpeaker = 0x00_00_01_00, + UseVAD = 0x00_02_00_00_00, + + /// + /// Allows for using priority speaker in a voice channel. + /// + PrioritySpeaker = 0x00_00_00_01_00, + /// /// Allows video streaming in a voice channel. /// - Stream = 0x00_00_02_00, + Stream = 0x00_00_00_02_00, // More General /// /// Allows management and editing of roles. /// - ManageRoles = 0x10_00_00_00, + ManageRoles = 0x00_10_00_00_00, /// /// Allows management and editing of webhooks. /// - ManageWebhooks = 0x20_00_00_00, + ManageWebhooks = 0x00_20_00_00_00, + + /// + /// Allows management and editing of emojis. + /// + ManageEmojis = 0x00_40_00_00_00, + + /// + /// Allows members to use slash commands in text channels. + /// + UseSlashCommands = 0x00_80_00_00_00, + + /// + /// Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.) + /// + RequesToSpeak = 0x01_00_00_00_00, + + /// + /// Allows for deleting and archiving threads, and viewing all private threads + /// + ManageThreads = 0x04_00_00_00_00, + + /// + /// Allows for creating and participating in threads + /// + UsePublicThreads = 0x08_00_00_00_00, + + /// + /// Allows for creating and participating in private threads + /// + UsePrivateThreads = 0x10_00_00_00_00, + } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 3793f680e3..b61ee4955e 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.9-dev + 2.4.0 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 3e0948f7b2..35622a3498 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3718,6 +3718,9 @@ + + + @@ -3735,9 +3738,6 @@ A string that is the of the message. - - - @@ -3797,9 +3797,6 @@ Represents a REST-based system message. - - - Represents a REST-based message sent by a user. diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 56bb5a9025..53fcfb92e4 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.3.10 + 2.4.0 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 8dcbd0fcf9..7a4eaf364e 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3441,98 +3441,6 @@ A task that represents the asynchronous operation of acknowledging the interaction. - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets the URL used to accept this invite - - - A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). - - - - - Gets the channel this invite is linked to. - - - A generic channel that the invite points to. - - - - - Gets the guild this invite is linked to. - - - A guild object representing the guild that the invite points to. - - - - - Represents a guild invite - - - - - Gets the unique invite code - - Returns the unique invite code - - - - - - Gets the user who created the invite - - Returns the user who created the invite - - - - - - Gets the maximum number of times the invite can be used, if there is no limit then the value will be 0 - - Returns the maximum number of times the invite can be used, if there is no limit then the value will be 0 - - - - - - Gets whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) - - Returns whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) - - - - - - Gets the time at which the invite was created - - Returns the time at which the invite was created - - - - - - Gets how long the invite is valid for - - Returns how long the invite is valid for (in seconds) - - - - - - Deletes the invite - - - - @@ -3706,6 +3614,9 @@ + + + Returns all attachments included in this message. @@ -3775,9 +3686,6 @@ - - - @@ -3895,9 +3803,6 @@ Represents a WebSocket-based message sent by the system. - - - Represents a WebSocket-based message sent by a user. diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 295e981aa1..13e5cf1115 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -1,4 +1,4 @@ - + @@ -6,7 +6,7 @@ Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 2.3.3 + 2.3.4 Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 2aaa72d02d..a8b21ad212 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.3.8-dev$suffix$ + 2.4.0$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,25 +14,25 @@ https://avatars.githubusercontent.com/u/84047264 - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From 468fac82e69cf5798c33767caee72ea963f91fad Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 3 Jul 2021 12:14:15 -0300 Subject: [PATCH 076/494] Add inheritdoc comment to application command --- .../Interaction/Slash Commands/SocketApplicationCommand.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs index d10932c8cf..70b3a52a2f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs @@ -27,6 +27,7 @@ public class SocketApplicationCommand : SocketEntity, IApplicationCommand /// public IReadOnlyCollection Options { get; private set; } + /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(this.Id); From 7e5856024ad4f0acbfafc687adcb8f1b8167c291 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 3 Jul 2021 12:16:43 -0300 Subject: [PATCH 077/494] meta: xml update --- src/Discord.Net.Core/Discord.Net.Core.xml | 35 +++++++++++++++++++ .../Discord.Net.WebSocket.xml | 3 ++ 2 files changed, 38 insertions(+) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 6b58a53ebf..775d0b3ccf 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -7374,6 +7374,11 @@ Allows for using voice-activity-detection in a voice channel. + + + Allows for using priority speaker in a voice channel. + + Allows video streaming in a voice channel. @@ -7389,6 +7394,36 @@ Allows management and editing of webhooks. + + + Allows management and editing of emojis. + + + + + Allows members to use slash commands in text channels. + + + + + Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.) + + + + + Allows for deleting and archiving threads, and viewing all private threads + + + + + Allows for creating and participating in threads + + + + + Allows for creating and participating in private threads + + Gets a blank that grants no permissions. A structure that does not contain any set permissions. diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 7a4eaf364e..678d3331fa 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3248,6 +3248,9 @@ A collection of 's recieved over the gateway. + + + The where this application was created. From f8ebcabf7d3ce5c55ba3a9a3eb4963d94266676d Mon Sep 17 00:00:00 2001 From: DJ Date: Sun, 4 Jul 2021 19:31:32 +0530 Subject: [PATCH 078/494] Docs: fixed docs for AlwaysAcknowledgeInteractions --- src/Discord.Net.WebSocket/DiscordSocketConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index 61c625bdfe..6ce9489f60 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -118,7 +118,7 @@ public class DiscordSocketConfig : DiscordRestConfig /// /// With this option set to , you will have to acknowledge the interaction with /// . - /// Only after the interaction is acknowledged, the origional slash command message will be visible. + /// Only after the interaction is acknowledged, the original slash command message will be visible. /// /// /// Please note that manually acknowledging the interaction with a message reply will not provide any return data. From 32f0e4a7e1b9d7de4f1326aa6b2868d8e28664cd Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 4 Jul 2021 11:06:44 -0300 Subject: [PATCH 079/494] Fix Linq null in slash command data --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- .../Common/ApplicationCommandInteractionData.cs | 2 +- .../Discord.Net.WebSocket.csproj | 2 +- .../Slash Commands/SocketSlashCommandData.cs | 4 ++-- src/Discord.Net/Discord.Net.nuspec | 14 +++++++------- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index da9636eaca..fa3c1a362e 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.4.0 + 2.4.1 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index b9647ba655..314a6fd750 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -12,7 +12,7 @@ internal class ApplicationCommandInteractionData : IDiscordInteractionData public string Name { get; set; } [JsonProperty("options")] - public List Options { get; set; } + public Optional> Options { get; set; } [JsonProperty("resolved")] public Optional Resolved { get; set; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 53fcfb92e4..ed1c575400 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.0 + 2.4.1 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index aa42919b8c..3557aacd20 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -94,8 +94,8 @@ internal void Update(Model model) { this.Name = model.Name; - this.Options = model.Options.Any() - ? model.Options.Select(x => new SocketSlashCommandDataOption(this, x)).ToImmutableArray() + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(this, x)).ToImmutableArray() : null; } diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index a8b21ad212..525ec615f2 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.0$suffix$ + 2.4.1$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - + - + - + - + - + - + From 99a2204c434b701167fa3fe37b7cdd9dd605fc45 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 5 Jul 2021 10:26:09 -0300 Subject: [PATCH 080/494] Update optionals in models regarding slash commands --- .../API/Common/ApplicationCommandInteractionData.cs | 2 +- .../API/Common/ApplicationCommandInteractionDataOption.cs | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml | 2 +- .../Slash Commands/SocketSlashCommandDataOption.cs | 4 ++-- src/Discord.Net/Discord.Net.nuspec | 8 ++++---- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index 314a6fd750..c0ced154ac 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -12,7 +12,7 @@ internal class ApplicationCommandInteractionData : IDiscordInteractionData public string Name { get; set; } [JsonProperty("options")] - public Optional> Options { get; set; } + public Optional Options { get; set; } [JsonProperty("resolved")] public Optional Resolved { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs index 0eea07b838..5f75c901f7 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs @@ -15,6 +15,6 @@ internal class ApplicationCommandInteractionDataOption public Optional Value { get; set; } [JsonProperty("options")] - public List Options { get; set; } = new(); + public Optional Options { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index ed1c575400..8b0561d189 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.1 + 2.4.2 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 678d3331fa..c382c7e27f 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1250,7 +1250,7 @@ With this option set to , you will have to acknowledge the interaction with . - Only after the interaction is acknowledged, the origional slash command message will be visible. + Only after the interaction is acknowledged, the original slash command message will be visible. Please note that manually acknowledging the interaction with a message reply will not provide any return data. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index f611f773db..385ddf945c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -60,8 +60,8 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) this.Value = model.Value.Value; } - this.Options = model.Options.Any() - ? model.Options.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() : null; } diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 525ec615f2..532f681ed3 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.1$suffix$ + 2.4.2$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -16,21 +16,21 @@ - + - + - + From ab3656b2a56dc37406df61ecfa834ea03218e68c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 5 Jul 2021 11:18:55 -0300 Subject: [PATCH 081/494] Fix unoptional property in slash commands --- src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs | 5 ++++- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 789c5549d3..3a94117201 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -67,7 +67,10 @@ public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties optio ? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - this.Required = option.Required.Value; + this.Required = option.Required.HasValue + ? option.Required.Value + : Optional.Unspecified; + this.Default = option.Default.HasValue ? option.Default.Value : Optional.Unspecified; diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index b61ee4955e..f942fa9764 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.4.0 + 2.4.1 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 8b0561d189..192ad4a43a 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.2 + 2.4.3 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png From 48e6070ab93ee1231737eef2547f771c5a7d34ad Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Mon, 5 Jul 2021 10:49:23 -0400 Subject: [PATCH 082/494] Add new channel type IDs --- .../Entities/Channels/ChannelType.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs index 6dd910ba68..85fc0b8111 100644 --- a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs +++ b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs @@ -14,6 +14,17 @@ public enum ChannelType /// The channel is a category channel. Category = 4, /// The channel is a news channel. - News = 5 + News = 5, + /// The channel is a store channel. + Store = 6, + /// The channel is a temporary thread channel under a news channel. + NewsThread = 10, + /// The channel is a temporary thread channel under a text channel. + PublicThread = 11, + /// The channel is a private temporary thread channel under a text channel. + PrivateThread = 12, + /// The channel is a stage voice channel. + Stage = 13 + } } From ba254a772da0ff7b44c1aacf7c4c6841a0f3433d Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Mon, 5 Jul 2021 11:56:18 -0300 Subject: [PATCH 083/494] Rename SticketFormatType.cs to StickerFormatType.cs --- .../Messages/{SticketFormatType.cs => StickerFormatType.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Discord.Net.Core/Entities/Messages/{SticketFormatType.cs => StickerFormatType.cs} (100%) diff --git a/src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs b/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs similarity index 100% rename from src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs rename to src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs From 7d6224b558cbb364318b03d5a52c6db67116099a Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Tue, 6 Jul 2021 08:51:05 -0400 Subject: [PATCH 084/494] Update examples --- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9811089823..f7671aca6a 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,7 @@ This branch is on pause and does not work currently, Once everything is stable w ### web/SlashCommandService webmilio's spin on the SlashCommandService branch, again the state of this is unknown. - -## Message Components -So, you want to use Message components? Well you're in luck! Below is a quick overview of how to use them - -#### Listening for button presses +## Listening for interactions ```cs // Subscribe to the InteractionCreated event client.InteractionCreated += Client_InteractionCreated; @@ -38,23 +34,80 @@ client.InteractionCreated += Client_InteractionCreated; ... private async Task Client_InteractionCreated(SocketInteraction arg) { - // If the type of the interaction is a message component - if(arg.Type == Discord.InteractionType.MessageComponent) + switch (arg.Type) // We want to check the type of this interaction { - // parse the args - var parsedArg = (SocketMessageComponent)arg; - // respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. - await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage); + //Slash commands + case InteractionType.ApplicationCommand: + await MySlashCommandHandler(arg); + break; + //Button clicks/selection dropdowns + case InteractionType.MessageComponent: + await MyMessageComponentHandler(arg); + break; + //Unused + case InteractionType.Ping: + break; + //Unknown/Unsupported + default: + Console.WriteLine("Unsupported interaction type: " + arg.Type); + break; } } ``` -#### Sending messages with buttons +### Handling button clicks and selection dropdowns +```cs +private async Task MyMessageComponentHandler(SocketInteraction arg) +{ + // Parse the arg + var parsedArg = (SocketMessageComponent) arg; + // Get the custom ID + var customId = parsedArg.Data.CustomId; + // Get the user + var user = (SocketGuildUser) arg.User; + // Get the guild + var guild = user.Guild; + + // Respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. + // You can also use "ephemeral" so that only the original user of the interaction sees the message + await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage, ephemeral: true); + + // You can also followup with a second message + await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); +} +``` + +### Sending messages with buttons Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: ```cs -var builder = new ComponentBuilder().WithButton("Hello!", ButtonStyle.Primary, customId: "id_1"); +var builder = new ComponentBuilder().WithButton("Hello!", customId: "id_1", ButtonStyle.Primary, row: 0); await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); ``` +### Sending messages with selection dropdowns +Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: +```cs +var builder = new ComponentBuilder() + .WithSelectMenu(new SelectMenuBuilder() + .WithCustomId("id_2") + .WithLabel("Select menu!") + .WithPlaceholder("This is a placeholder") + .WithOptions(new List() + { + new SelectMenuOptionBuilder() + .WithLabel("Option A") + .WithEmote(Emote.Parse("<:evanpog:810017136814194698>")) + .WithDescription("Evan pog champ") + .WithValue("value1"), + new SelectMenuOptionBuilder() + .WithLabel("Option B") + .WithDescription("Option B is poggers") + .WithValue("value2") + })); +await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); +``` + +> Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. + ## Slash commands Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From 5e31eb12a693df53f6e40e98c6580257accf56b7 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Tue, 6 Jul 2021 09:00:17 -0400 Subject: [PATCH 085/494] Include addition vars for selection dropdowns --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index f7671aca6a..f99f3ec4a6 100644 --- a/README.md +++ b/README.md @@ -74,9 +74,15 @@ private async Task MyMessageComponentHandler(SocketInteraction arg) // You can also followup with a second message await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); + + //If you are using selection dropdowns, you can get the selected label and values using these: + var selectedLabel = ((SelectMenu) parsedArg.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == parsedArg.Data.Values.FirstOrDefault())?.Label; + var selectedValue = parsedArg.Data.Values.First(); } ``` +> Note: The example above assumes that the selection dropdown is expecting only 1 returned value, if you configured your dropdown for multiple values, you'll need to modify the code slightly. + ### Sending messages with buttons Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: ```cs From b76bf99dbe93714e03c953d16a59193f8782f240 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 6 Jul 2021 14:07:32 -0300 Subject: [PATCH 086/494] Update README.md --- README.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9811089823..f99f3ec4a6 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,7 @@ This branch is on pause and does not work currently, Once everything is stable w ### web/SlashCommandService webmilio's spin on the SlashCommandService branch, again the state of this is unknown. - -## Message Components -So, you want to use Message components? Well you're in luck! Below is a quick overview of how to use them - -#### Listening for button presses +## Listening for interactions ```cs // Subscribe to the InteractionCreated event client.InteractionCreated += Client_InteractionCreated; @@ -38,23 +34,86 @@ client.InteractionCreated += Client_InteractionCreated; ... private async Task Client_InteractionCreated(SocketInteraction arg) { - // If the type of the interaction is a message component - if(arg.Type == Discord.InteractionType.MessageComponent) + switch (arg.Type) // We want to check the type of this interaction { - // parse the args - var parsedArg = (SocketMessageComponent)arg; - // respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. - await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage); + //Slash commands + case InteractionType.ApplicationCommand: + await MySlashCommandHandler(arg); + break; + //Button clicks/selection dropdowns + case InteractionType.MessageComponent: + await MyMessageComponentHandler(arg); + break; + //Unused + case InteractionType.Ping: + break; + //Unknown/Unsupported + default: + Console.WriteLine("Unsupported interaction type: " + arg.Type); + break; } } ``` -#### Sending messages with buttons +### Handling button clicks and selection dropdowns +```cs +private async Task MyMessageComponentHandler(SocketInteraction arg) +{ + // Parse the arg + var parsedArg = (SocketMessageComponent) arg; + // Get the custom ID + var customId = parsedArg.Data.CustomId; + // Get the user + var user = (SocketGuildUser) arg.User; + // Get the guild + var guild = user.Guild; + + // Respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. + // You can also use "ephemeral" so that only the original user of the interaction sees the message + await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage, ephemeral: true); + + // You can also followup with a second message + await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); + + //If you are using selection dropdowns, you can get the selected label and values using these: + var selectedLabel = ((SelectMenu) parsedArg.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == parsedArg.Data.Values.FirstOrDefault())?.Label; + var selectedValue = parsedArg.Data.Values.First(); +} +``` + +> Note: The example above assumes that the selection dropdown is expecting only 1 returned value, if you configured your dropdown for multiple values, you'll need to modify the code slightly. + +### Sending messages with buttons Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: ```cs -var builder = new ComponentBuilder().WithButton("Hello!", ButtonStyle.Primary, customId: "id_1"); +var builder = new ComponentBuilder().WithButton("Hello!", customId: "id_1", ButtonStyle.Primary, row: 0); await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); ``` +### Sending messages with selection dropdowns +Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: +```cs +var builder = new ComponentBuilder() + .WithSelectMenu(new SelectMenuBuilder() + .WithCustomId("id_2") + .WithLabel("Select menu!") + .WithPlaceholder("This is a placeholder") + .WithOptions(new List() + { + new SelectMenuOptionBuilder() + .WithLabel("Option A") + .WithEmote(Emote.Parse("<:evanpog:810017136814194698>")) + .WithDescription("Evan pog champ") + .WithValue("value1"), + new SelectMenuOptionBuilder() + .WithLabel("Option B") + .WithDescription("Option B is poggers") + .WithValue("value2") + })); +await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); +``` + +> Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. + ## Slash commands Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From 8e507915e38fc15ae1f6c985e798a49f2b52c7ea Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 6 Jul 2021 19:12:21 -0300 Subject: [PATCH 087/494] Finished command permissions as well as bug fixes --- src/Discord.Net.Core/Discord.Net.Core.xml | 38 ++- .../Entities/Guilds/PermissionTarget.cs | 4 +- .../Interactions/IApplicationCommand.cs | 10 +- .../Interactions/SlashCommandBuilder.cs | 18 ++ .../ApplicationCommandPermissions.cs | 24 +- .../GuildApplicationCommandPermissions.cs | 11 +- .../API/Common/ApplicationCommand.cs | 2 + .../Common/ApplicationCommandPermissions.cs | 2 +- .../GuildApplicationCommandPermissions.cs | 8 +- ...odifyGuildApplicationCommandPermissions.cs | 2 +- src/Discord.Net.Rest/ClientHelper.cs | 3 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 59 +++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 151 +++++------ src/Discord.Net.Rest/DiscordRestClient.cs | 9 + .../Entities/Guilds/GuildHelper.cs | 14 ++ .../Entities/Guilds/RestGuild.cs | 25 +- .../Interactions/InteractionHelper.cs | 237 +++++++++++++++--- .../Interactions/RestApplicationCommand.cs | 9 +- .../Entities/Interactions/RestGuildCommand.cs | 38 ++- .../ApplicationCommandCreatedUpdatedEvent.cs | 3 + .../Discord.Net.WebSocket.xml | 27 ++ .../Entities/Guilds/SocketGuild.cs | 24 ++ .../SocketApplicationCommand.cs | 11 +- .../Slash Commands/SocketSlashCommandData.cs | 17 +- src/Discord.Net/Discord.Net.nuspec | 16 +- 26 files changed, 574 insertions(+), 190 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 775d0b3ccf..f6ad03d32b 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3967,11 +3967,6 @@ The base command model that belongs to an application. see - - - Gets the unique id of the command. - - Gets the unique id of the parent application. @@ -3987,6 +3982,11 @@ The description of the command. + + + Whether the command is enabled by default when the app is added to a guild. + + If the option is a subcommand or subcommand group type, this nested options will be the parameters. @@ -4886,6 +4886,11 @@ Gets or sets the options for this command. + + + Whether the command is enabled by default when the app is added to a guild + + Build the current builder into a class. @@ -4908,6 +4913,13 @@ The description of this command. The current builder. + + + Sets the default permission of the current command. + + The default permission value to set. + The current builder. + Adds an option to the current slash command. @@ -7243,17 +7255,17 @@ Application command permissions allow you to enable or disable commands for specific users or roles within a guild. - + The id of the role or user. - + The target of this permission. - + to allow, otherwise . @@ -7525,27 +7537,27 @@ Creates a new from this one, changing the provided non-null permissions. - + Returned when fetching the permissions for a command in a guild. - + The id of the command. - + The id of the application the command belongs to. - + The id of the guild. - + The permissions for the command in the guild. diff --git a/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs b/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs index fb759e4c57..39e7c81f29 100644 --- a/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs +++ b/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs @@ -8,10 +8,10 @@ public enum PermissionTarget /// /// The target of the permission is a role. /// - Role = 0, + Role = 1, /// /// The target of the permission is a user. /// - User = 1, + User = 2, } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index cf13953289..eb61c539f1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -11,11 +11,6 @@ namespace Discord /// public interface IApplicationCommand : ISnowflakeEntity { - /// - /// Gets the unique id of the command. - /// - ulong Id { get; } - /// /// Gets the unique id of the parent application. /// @@ -31,6 +26,11 @@ public interface IApplicationCommand : ISnowflakeEntity /// string Description { get; } + /// + /// Whether the command is enabled by default when the app is added to a guild. + /// + bool DefaultPermission { get; } + /// /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index 948527f292..bd6337f89a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -82,6 +82,12 @@ public List Options _options = value; } } + + /// + /// Whether the command is enabled by default when the app is added to a guild + /// + public bool DefaultPermission { get; set; } = true; + private string _name { get; set; } private string _description { get; set; } private List _options { get; set; } @@ -96,6 +102,7 @@ public SlashCommandCreationProperties Build() { Name = this.Name, Description = this.Description, + DefaultPermission = this.DefaultPermission }; if (this.Options != null && this.Options.Any()) @@ -135,6 +142,17 @@ public SlashCommandBuilder WithDescription(string description) return this; } + /// + /// Sets the default permission of the current command. + /// + /// The default permission value to set. + /// The current builder. + public SlashCommandBuilder WithDefaultPermission(bool value) + { + this.DefaultPermission = value; + return this; + } + /// /// Adds an option to the current slash command. /// diff --git a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs index 86dbd57900..f87613ab89 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs @@ -8,17 +8,17 @@ public class ApplicationCommandPermission /// /// The id of the role or user. /// - public ulong Id { get; } + public ulong TargetId { get; } /// /// The target of this permission. /// - public PermissionTarget Type { get; } + public PermissionTarget TargetType { get; } /// /// to allow, otherwise . /// - public bool Value { get; } + public bool Permission { get; } internal ApplicationCommandPermission() { } @@ -30,9 +30,9 @@ internal ApplicationCommandPermission() { } /// The value of this permission. public ApplicationCommandPermission(ulong targetId, PermissionTarget targetType, bool allow) { - this.Id = targetId; - this.Type = targetType; - this.Value = allow; + this.TargetId = targetId; + this.TargetType = targetType; + this.Permission = allow; } /// @@ -42,9 +42,9 @@ public ApplicationCommandPermission(ulong targetId, PermissionTarget targetType, /// The value of this permission. public ApplicationCommandPermission(IUser target, bool allow) { - this.Id = target.Id; - this.Value = allow; - this.Type = PermissionTarget.User; + this.TargetId = target.Id; + this.Permission = allow; + this.TargetType = PermissionTarget.User; } /// @@ -54,9 +54,9 @@ public ApplicationCommandPermission(IUser target, bool allow) /// The value of this permission. public ApplicationCommandPermission(IRole target, bool allow) { - this.Id = target.Id; - this.Value = allow; - this.Type = PermissionTarget.Role; + this.TargetId = target.Id; + this.Permission = allow; + this.TargetType = PermissionTarget.Role; } } } diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs index c91bfd59ed..5145f5dc62 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs @@ -9,12 +9,13 @@ namespace Discord /// /// Returned when fetching the permissions for a command in a guild. /// - public class GuildApplicationCommandPermissions + public class GuildApplicationCommandPermission + { /// /// The id of the command. /// - public ulong Id { get; } + public ulong CommandId { get; } /// /// The id of the application the command belongs to. @@ -31,12 +32,12 @@ public class GuildApplicationCommandPermissions /// public IReadOnlyCollection Permissions { get; } - internal GuildApplicationCommandPermissions(ulong id, ulong appId, ulong guildId, List permissions) + internal GuildApplicationCommandPermission(ulong commandId, ulong appId, ulong guildId, ApplicationCommandPermission[] permissions) { - this.Id = id; + this.CommandId = commandId; this.ApplicationId = appId; this.GuildId = guildId; - this.Permissions = permissions.ToReadOnlyCollection(); + this.Permissions = permissions; } } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs index f428374504..39c40a1ee3 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs @@ -19,5 +19,7 @@ internal class ApplicationCommand public string Description { get; set; } [JsonProperty("options")] public Optional Options { get; set; } + [JsonProperty("default_permission")] + public Optional DefaultPermissions { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs index 105913adc5..a4a4ae074a 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs @@ -7,7 +7,7 @@ namespace Discord.API { - public class ApplicationCommandPermissions + internal class ApplicationCommandPermissions { [JsonProperty("id")] public ulong Id { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs index f64c14ffff..3ab5ef6508 100644 --- a/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs @@ -7,16 +7,16 @@ namespace Discord.API { - public class GuildApplicationCommandPermission + internal class GuildApplicationCommandPermission { [JsonProperty("id")] - public ulong Id { get; } + public ulong Id { get; set; } [JsonProperty("application_id")] - public ulong ApplicationId { get; } + public ulong ApplicationId { get; set; } [JsonProperty("guild_id")] - public ulong GuildId { get; } + public ulong GuildId { get; set; } [JsonProperty("permissions")] public API.ApplicationCommandPermissions[] Permissions { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs index 0d1792c94c..5e42ee4c43 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs @@ -13,6 +13,6 @@ internal class ModifyGuildApplicationCommandPermissions public ulong Id { get; set; } [JsonProperty("permissions")] - public ApplicationCommandPermission[] Permissions { get; set; } + public ApplicationCommandPermissions[] Permissions { get; set; } } } diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 7bb358775a..0161483c94 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -206,7 +206,7 @@ public static async Task> GetGlobalApplic public static async Task> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, RequestOptions options) { - var response = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, options).ConfigureAwait(false); + var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, options).ConfigureAwait(false); if (!response.Any()) return new RestGuildCommand[0].ToImmutableArray(); @@ -214,6 +214,7 @@ public static async Task> GetGuildApplicat return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); } + public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) => client.ApiClient.AddRoleAsync(guildId, userId, roleId, options); diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index f942fa9764..c071b73427 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.4.1 + 2.4.2 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 35622a3498..5a70ac05fd 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2740,6 +2740,27 @@ + + + Gets a collection of slash commands created by the current user in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + slash commands created by the current user. + + + + + Gets a slash command in the current guild. + + The unique identifier of the slash command. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a + slash command created by the current user. + + Gets a collection of all users banned in this guild. @@ -3378,6 +3399,9 @@ + + + The options of this command. @@ -3391,6 +3415,9 @@ + + + Represents a Rest-based implementation of . @@ -3488,6 +3515,38 @@ The modified command + + + Gets this commands permissions inside of the current guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a + object defining the permissions of the current slash command. + + + + + Modifies the current command permissions for this guild command. + + The permissions to overwrite. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. The task result contains a + object containing the modified permissions. + + + + + Gets the guild that this slash command resides in. + + if you want the approximate member and presence counts for the guild, otherwise . + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a + . + + diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 60f0bcc32e..21e74b4bf8 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -827,54 +827,14 @@ public async Task CreateGlobalApplicationCommandAsync(Create options = RequestOptions.CreateOrClone(options); - try - { - return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options).ConfigureAwait(false); - } - catch (HttpException x) - { - if (x.HttpCode == HttpStatusCode.BadRequest) - { - var json = (x.Request as JsonRestRequest).Json; - throw new ApplicationCommandException(json, x); - } - // Re-throw the http exception - throw; - } + return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { - Preconditions.NotNull(command, nameof(command)); - - if (command.Name.IsSpecified) - { - Preconditions.AtMost(command.Name.Value.Length, 32, nameof(command.Name)); - Preconditions.AtLeast(command.Name.Value.Length, 3, nameof(command.Name)); - } - if (command.Description.IsSpecified) - { - Preconditions.AtMost(command.Description.Value.Length, 100, nameof(command.Description)); - Preconditions.AtLeast(command.Description.Value.Length, 1, nameof(command.Description)); - } - options = RequestOptions.CreateOrClone(options); - try - { - return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options).ConfigureAwait(false); - } - catch (HttpException x) - { - if (x.HttpCode == HttpStatusCode.BadRequest) - { - var json = (x.Request as JsonRestRequest).Json; - throw new ApplicationCommandException(json, x); - } - - // Re-throw the http exception - throw; - } + return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) { @@ -883,7 +843,14 @@ public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOp await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/commands/{commandId}", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task GetGuildApplicationCommandAsync(ulong guildId, RequestOptions options = null) + public async Task BulkOverwriteGlobalApplicationCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); + } + + public async Task GetGuildApplicationCommandsAsync(ulong guildId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); @@ -891,49 +858,27 @@ public async Task GetGuildApplicationCommandAsync(ulong gu return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", bucket, options: options).ConfigureAwait(false); } - public async Task CreateGuildApplicationCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) + + public async Task GetGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) { - Preconditions.NotNull(command, nameof(command)); - Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); - Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); - Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + options = RequestOptions.CreateOrClone(options); + var bucket = new BucketIds(guildId: guildId); + + return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options); + } + + public async Task CreateGuildApplicationCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) + { options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(guildId: guildId); - try - { - return await SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options).ConfigureAwait(false); - } - catch (HttpException x) - { - if (x.HttpCode == HttpStatusCode.BadRequest) - { - var json = (x.Request as JsonRestRequest).Json; - throw new ApplicationCommandException(json, x); - } + return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); - // Re-throw the http exception - throw; - } } public async Task ModifyGuildApplicationCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { - Preconditions.NotNull(command, nameof(command)); - - if (command.Name.IsSpecified) - { - Preconditions.AtMost(command.Name.Value.Length, 32, nameof(command.Name)); - Preconditions.AtLeast(command.Name.Value.Length, 3, nameof(command.Name)); - } - if (command.Description.IsSpecified) - { - Preconditions.AtMost(command.Description.Value.Length, 100, nameof(command.Description)); - Preconditions.AtLeast(command.Description.Value.Length, 1, nameof(command.Description)); - } - options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(guildId: guildId); @@ -963,6 +908,15 @@ public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong comman await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options).ConfigureAwait(false); } + public async Task BulkOverwriteGuildApplicationCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); + } + //Interaction Responses public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { @@ -971,7 +925,7 @@ public async Task CreateInteractionResponse(InteractionResponse response, ulong options = RequestOptions.CreateOrClone(options); - await SendJsonAsync("POST", () => $"interactions/{interactionId}/{interactionToken}/callback", response, new BucketIds(), options: options); + await SendJsonAsync("POST", () => $"interactions/{interactionId}/{interactionToken}/callback", response, new BucketIds(), options: options); } public async Task GetInteractionResponse(string interactionToken, RequestOptions options = null) { @@ -1037,7 +991,7 @@ public async Task GetGuildApplicationComman options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", new BucketIds(), options: options).ConfigureAwait(false); } public async Task GetGuildApplicationCommandPermission(ulong guildId, ulong commandId, RequestOptions options = null) @@ -1047,37 +1001,27 @@ public async Task GetGuildApplicationCommandP options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyApplicationCommandPermissions(ApplicationCommandPermissions[] permissions, ulong guildId, ulong commandId, RequestOptions options = null) + public async Task ModifyApplicationCommandPermissions(ApplicationCommandPermissions[] permissions, ulong guildId, ulong commandId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); Preconditions.NotEqual(commandId, 0, nameof(commandId)); options = RequestOptions.CreateOrClone(options); - await SendJsonAsync("PUT", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); + return await SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); } - public async Task BatchModifyApplicationCommandPermissions(ModifyGuildApplicationCommandPermissions[] permissions, ulong guildId, RequestOptions options = null) + public async Task> BatchModifyApplicationCommandPermissions(ModifyGuildApplicationCommandPermissions[] permissions, ulong guildId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); Preconditions.NotNull(permissions, nameof(permissions)); options = RequestOptions.CreateOrClone(options); - await SendJsonAsync("PUT", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands/premissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); - } - - public async Task BulkOverrideGuildApplicationCommand(API.ApplicationCommand[] commands, ulong guildId, RequestOptions options = null) - { - Preconditions.NotEqual(guildId, 0, nameof(guildId)); - Preconditions.NotNull(commands, nameof(commands)); - - options = RequestOptions.CreateOrClone(options); - - await SendJsonAsync("PUT", () => $"/applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, new BucketIds(), options: options).ConfigureAwait(false); + return await SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); } //Guilds @@ -1772,6 +1716,27 @@ protected T DeserializeJson(Stream jsonStream) return _serializer.Deserialize(reader); } + protected async Task TrySendApplicationCommand(Task sendTask) + { + var result = await sendTask.ConfigureAwait(false); + + if (sendTask.Exception != null) + { + if (sendTask.Exception.InnerException is HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } + } + + throw sendTask.Exception; + } + else + return result; + } + internal class BucketIds { public ulong GuildId { get; internal set; } diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 5ac18ff57f..0f93c3f65c 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -106,6 +106,7 @@ public Task GetVoiceRegionAsync(string id, RequestOptions optio => ClientHelper.GetVoiceRegionAsync(this, id, options); public Task GetWebhookAsync(ulong id, RequestOptions options = null) => ClientHelper.GetWebhookAsync(this, id, options); + public Task CreateGlobalCommand(SlashCommandCreationProperties properties, RequestOptions options = null) => InteractionHelper.CreateGlobalCommand(this, properties, options); public Task CreateGlobalCommand(Action func, RequestOptions options = null) @@ -118,6 +119,14 @@ public Task> GetGlobalApplicationCommands => ClientHelper.GetGlobalApplicationCommands(this, options); public Task> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) => ClientHelper.GetGuildApplicationCommands(this, guildId, options); + public Task> BulkOverwriteGlobalCommands(SlashCommandCreationProperties[] commandProperties, RequestOptions options = null) + => InteractionHelper.BulkOverwriteGlobalCommands(this, commandProperties, options); + public Task> BulkOverwriteGuildCommands(SlashCommandCreationProperties[] commandProperties, ulong guildId, RequestOptions options = null) + => InteractionHelper.BulkOverwriteGuildCommands(this, guildId, commandProperties, options); + public Task> BatchEditGuildCommandPermissions(ulong guildId, IDictionary permissions, RequestOptions options = null) + => InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options); + + public Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId) => ClientHelper.AddRoleAsync(this, guildId, userId, roleId); public Task RemoveRoleAsync(ulong guildId, ulong userId, ulong roleId) diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 58a4ea2c8b..f0eaaf7dff 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -270,6 +270,20 @@ public static async Task CreateIntegrationAsync(IGuild gui return RestGuildIntegration.Create(client, guild, model); } + //Interactions + public static async Task> GetSlashCommandsAsync(IGuild guild, BaseDiscordClient client, + RequestOptions options) + { + var models = await client.ApiClient.GetGuildApplicationCommandsAsync(guild.Id, options); + return models.Select(x => RestGuildCommand.Create(client, x, guild.Id)).ToImmutableArray(); + } + public static async Task GetSlashCommandAsync(IGuild guild, ulong id, BaseDiscordClient client, + RequestOptions options) + { + var model = await client.ApiClient.GetGuildApplicationCommandAsync(guild.Id, id, options); + return RestGuildCommand.Create(client, model, guild.Id); + } + //Invites public static async Task> GetInvitesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index ea703a26af..6c561002e4 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -255,7 +255,30 @@ public async Task ReorderRolesAsync(IEnumerable args, Req public Task LeaveAsync(RequestOptions options = null) => GuildHelper.LeaveAsync(this, Discord, options); - //Bans + //Interactions + /// + /// Gets a collection of slash commands created by the current user in this guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of + /// slash commands created by the current user. + /// + public Task> GetSlashCommandsAsync(RequestOptions options = null) + => GuildHelper.GetSlashCommandsAsync(this, Discord, options); + + /// + /// Gets a slash command in the current guild. + /// + /// The unique identifier of the slash command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a + /// slash command created by the current user. + /// + public Task GetSlashCommandAsync(ulong id, RequestOptions options = null) + => GuildHelper.GetSlashCommandAsync(this, id, Discord, options); + //Bans /// /// Gets a collection of all users banned in this guild. diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index a02bf90459..618dd87e7c 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -10,20 +10,20 @@ namespace Discord.Rest { internal static class InteractionHelper { - internal static Task SendInteractionResponse(BaseDiscordClient client, IMessageChannel channel, InteractionResponse response, + public static Task SendInteractionResponse(BaseDiscordClient client, IMessageChannel channel, InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { return client.ApiClient.CreateInteractionResponse(response, interactionId, interactionToken, options); } - internal static async Task GetOriginalResponseAsync(BaseDiscordClient client, IMessageChannel channel, + public static async Task GetOriginalResponseAsync(BaseDiscordClient client, IMessageChannel channel, IDiscordInteraction interaction, RequestOptions options = null) { var model = await client.ApiClient.GetInteractionResponse(interaction.Token, options).ConfigureAwait(false); return RestInteractionMessage.Create(client, model, interaction.Token, channel); } - internal static async Task SendFollowupAsync(BaseDiscordClient client, CreateWebhookMessageParams args, + public static async Task SendFollowupAsync(BaseDiscordClient client, CreateWebhookMessageParams args, string token, IMessageChannel channel, RequestOptions options = null) { var model = await client.ApiClient.CreateInteractionFollowupMessage(args, token, options).ConfigureAwait(false); @@ -31,47 +31,128 @@ internal static async Task SendFollowupAsync(BaseDiscordCli RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); return entity; } - + // Global commands - internal static async Task CreateGlobalCommand(BaseDiscordClient client, + public static async Task CreateGlobalCommand(BaseDiscordClient client, Action func, RequestOptions options = null) { var args = new SlashCommandCreationProperties(); func(args); return await CreateGlobalCommand(client, args, options).ConfigureAwait(false); } - internal static async Task CreateGlobalCommand(BaseDiscordClient client, - SlashCommandCreationProperties args, RequestOptions options = null) + public static async Task CreateGlobalCommand(BaseDiscordClient client, + SlashCommandCreationProperties arg, RequestOptions options = null) { - if (args.Options.IsSpecified) - { - if (args.Options.Value.Count > 10) - throw new ArgumentException("Option count must be 10 or less"); - } + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); - + if (arg.Options.IsSpecified) + Preconditions.AtMost(arg.Options.Value.Count, 25, nameof(arg.Options)); var model = new CreateApplicationCommandParams() { - Name = args.Name, - Description = args.Description, - Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + Name = arg.Name, + Description = arg.Description, + Options = arg.Options.IsSpecified + ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified, - DefaultPermission = args.DefaultPermission.IsSpecified - ? args.DefaultPermission.Value + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value : Optional.Unspecified }; var cmd = await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); return RestGlobalCommand.Create(client, cmd); } - internal static async Task ModifyGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, + + public static async Task> BulkOverwriteGlobalCommands(BaseDiscordClient client, + SlashCommandCreationProperties[] args, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + + List models = new List(); + + foreach (var arg in args) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); + + if (arg.Options.IsSpecified) + Preconditions.AtMost(arg.Options.Value.Count, 25, nameof(arg.Options)); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Options = arg.Options.IsSpecified + ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified, + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value + : Optional.Unspecified + }; + + models.Add(model); + } + + var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationCommands(models.ToArray(), options); + + return apiModels.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); + } + + public static async Task> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, + SlashCommandCreationProperties[] args, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + + List models = new List(); + + foreach (var arg in args) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); + + if (arg.Options.IsSpecified) + Preconditions.AtMost(arg.Options.Value.Count, 25, nameof(arg.Options)); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Options = arg.Options.IsSpecified + ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified, + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value + : Optional.Unspecified + }; + + models.Add(model); + } + + var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options); + + return apiModels.Select(x => RestGuildCommand.Create(client, x, guildId)).ToArray(); + } + + public static async Task ModifyGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, Action func, RequestOptions options = null) { ApplicationCommandProperties args = new ApplicationCommandProperties(); func(args); + if (args.Name.IsSpecified) + { + Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + } + if (args.Description.IsSpecified) + { + Preconditions.AtMost(args.Description.Value.Length, 100, nameof(args.Description)); + Preconditions.AtLeast(args.Description.Value.Length, 1, nameof(args.Description)); + } + + if (args.Options.IsSpecified) { if (args.Options.Value.Count > 10) @@ -96,7 +177,7 @@ internal static async Task ModifyGlobalCommand(BaseDiscordCli } - internal static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, RequestOptions options = null) + public static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); @@ -105,7 +186,7 @@ internal static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGlo } // Guild Commands - internal static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) { var args = new SlashCommandCreationProperties(); @@ -113,19 +194,23 @@ internal static async Task CreateGuildCommand(BaseDiscordClien return await CreateGuildCommand(client, guildId, args, options).ConfigureAwait(false); } - internal static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, SlashCommandCreationProperties args, RequestOptions options = null) { Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); Preconditions.NotNullOrEmpty(args.Description, nameof(args.Description)); + Preconditions.AtMost(args.Name.Length, 32, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Length, 3, nameof(args.Name)); + Preconditions.AtMost(args.Description.Length, 100, nameof(args.Description)); + Preconditions.AtLeast(args.Description.Length, 1, nameof(args.Description)); if (args.Options.IsSpecified) { if (args.Options.Value.Count > 10) throw new ArgumentException("Option count must be 10 or less"); - foreach(var item in args.Options.Value) + foreach (var item in args.Options.Value) { Preconditions.NotNullOrEmpty(item.Name, nameof(item.Name)); Preconditions.NotNullOrEmpty(item.Description, nameof(item.Description)); @@ -147,12 +232,23 @@ internal static async Task CreateGuildCommand(BaseDiscordClien var cmd = await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); return RestGuildCommand.Create(client, cmd, guildId); } - internal static async Task ModifyGuildCommand(BaseDiscordClient client, RestGuildCommand command, + public static async Task ModifyGuildCommand(BaseDiscordClient client, RestGuildCommand command, Action func, RequestOptions options = null) { ApplicationCommandProperties args = new ApplicationCommandProperties(); func(args); + if (args.Name.IsSpecified) + { + Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + } + if (args.Description.IsSpecified) + { + Preconditions.AtMost(args.Description.Value.Length, 100, nameof(args.Description)); + Preconditions.AtLeast(args.Description.Value.Length, 1, nameof(args.Description)); + } + if (args.Options.IsSpecified) { if (args.Options.Value.Count > 10) @@ -176,15 +272,15 @@ internal static async Task ModifyGuildCommand(BaseDiscordClien return command; } - internal static async Task DeleteGuildCommand(BaseDiscordClient client, RestGuildCommand command, RequestOptions options = null) + public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); - await client.ApiClient.DeleteGuildApplicationCommandAsync(command.GuildId, command.Id, options).ConfigureAwait(false); + await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); } - internal static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, + public static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, RequestOptions options = null) { var args = new MessageProperties(); @@ -204,10 +300,10 @@ internal static async Task DeleteGuildCommand(BaseDiscordClient client, RestGuil return await client.ApiClient.ModifyInteractionFollowupMessage(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); } - internal static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) + public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); - internal static async Task ModifyInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, Action func, + public static async Task ModifyInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, Action func, RequestOptions options = null) { var args = new MessageProperties(); @@ -227,16 +323,87 @@ internal static async Task DeleteFollowupMessage(BaseDiscordClient client, RestF return await client.ApiClient.ModifyInteractionFollowupMessage(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); } - internal static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) + public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); // Guild permissions - internal static async Task> GetCommandGuildPermissions(BaseDiscordClient client, - RestGuildCommand command) + public static async Task> GetGuildCommandPermissionsAsync(BaseDiscordClient client, + ulong guildId, RequestOptions options) { - // TODO - return null; + var models = await client.ApiClient.GetGuildApplicationCommandPermissions(guildId, options); + return models.Select(x => + new GuildApplicationCommandPermission(x.Id, x.ApplicationId, guildId, x.Permissions.Select( + y => new Discord.ApplicationCommandPermission(y.Id, y.Type, y.Permission)) + .ToArray()) + ).ToArray(); } + public static async Task GetGuildCommandPermissionAsync(BaseDiscordClient client, + ulong guildId, ulong commandId, RequestOptions options) + { + var model = await client.ApiClient.GetGuildApplicationCommandPermission(guildId, commandId, options); + return new GuildApplicationCommandPermission(model.Id, model.ApplicationId, guildId, model.Permissions.Select( + y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)).ToArray()); + } + + public static async Task ModifyGuildCommandPermissionsAsync(BaseDiscordClient client, ulong guildId, ulong commandId, + ApplicationCommandPermission[] args, RequestOptions options) + { + Preconditions.NotNull(args, nameof(args)); + Preconditions.AtMost(args.Length, 10, nameof(args)); + Preconditions.GreaterThan(args.Length, 0, nameof(args)); + + List models = new List(); + + foreach(var arg in args) + { + var model = new ApplicationCommandPermissions() + { + Id = arg.TargetId, + Permission = arg.Permission, + Type = arg.TargetType + }; + + models.Add(model); + } + + var apiModel = await client.ApiClient.ModifyApplicationCommandPermissions(models.ToArray(), guildId, commandId, options); + + return new GuildApplicationCommandPermission(apiModel.Id, apiModel.ApplicationId, guildId, apiModel.Permissions.Select( + x => new ApplicationCommandPermission(x.Id, x.Type, x.Permission)).ToArray()); + } + + public static async Task> BatchEditGuildCommandPermissionsAsync(BaseDiscordClient client, ulong guildId, + IDictionary args, RequestOptions options) + { + Preconditions.NotNull(args, nameof(args)); + Preconditions.NotEqual(args.Count, 0, nameof(args)); + + List models = new List(); + + foreach(var arg in args) + { + Preconditions.AtMost(arg.Value.Length, 10, nameof(args)); + + var model = new ModifyGuildApplicationCommandPermissions() + { + Id = arg.Key, + Permissions = arg.Value.Select(x => new ApplicationCommandPermissions() + { + Id = x.TargetId, + Permission = x.Permission, + Type = x.TargetType + }).ToArray() + }; + + models.Add(model); + } + + var apiModels = await client.ApiClient.BatchModifyApplicationCommandPermissions(models.ToArray(), guildId, options); + + return apiModels.Select( + x => new GuildApplicationCommandPermission(x.Id, x.ApplicationId, x.GuildId, x.Permissions.Select( + y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)).ToArray())).ToArray(); + } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 67a530d500..e1a8541875 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -22,6 +22,9 @@ public abstract class RestApplicationCommand : RestEntity, IApplicationCo /// public string Description { get; private set; } + /// + public bool DefaultPermission { get; private set; } + /// /// The options of this command. /// @@ -58,14 +61,18 @@ internal virtual void Update(Model model) this.ApplicationId = model.ApplicationId; this.Name = model.Name; this.Description = model.Description; + this.DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); this.Options = model.Options.IsSpecified ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() : null; } + + /// + public abstract Task DeleteAsync(RequestOptions options = null); + IReadOnlyCollection IApplicationCommand.Options => Options; - public virtual Task DeleteAsync(RequestOptions options = null) => throw new NotImplementedException(); } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index 90e9989779..33ab78dbbd 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -33,7 +33,7 @@ internal static RestGuildCommand Create(BaseDiscordClient client, Model model, u /// public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGuildCommand(Discord, this).ConfigureAwait(false); + => await InteractionHelper.DeleteGuildCommand(Discord, GuildId, this).ConfigureAwait(false); /// /// Modifies this . @@ -46,7 +46,39 @@ public override async Task DeleteAsync(RequestOptions options = null) public async Task ModifyAsync(Action func, RequestOptions options = null) => await InteractionHelper.ModifyGuildCommand(Discord, this, func, options).ConfigureAwait(false); - public async Task> GetCommandPermissions() - => await InteractionHelper.GetCommandGuildPermissions(Discord, this); + /// + /// Gets this commands permissions inside of the current guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a + /// object defining the permissions of the current slash command. + /// + public Task GetCommandPermission(RequestOptions options = null) + => InteractionHelper.GetGuildCommandPermissionAsync(Discord, this.GuildId, this.Id, options); + + /// + /// Modifies the current command permissions for this guild command. + /// + /// The permissions to overwrite. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. The task result contains a + /// object containing the modified permissions. + /// + public Task ModifyCommandPermissions(ApplicationCommandPermission[] permissions, RequestOptions options = null) + => InteractionHelper.ModifyGuildCommandPermissionsAsync(Discord, this.GuildId, this.Id, permissions, options); + + /// + /// Gets the guild that this slash command resides in. + /// + /// if you want the approximate member and presence counts for the guild, otherwise . + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a + /// . + /// + public Task GetGuild(bool withCounts = false, RequestOptions options = null) + => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); } } diff --git a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs index ac6c73c66b..190eca89da 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs @@ -26,5 +26,8 @@ internal class ApplicationCommandCreatedUpdatedEvent [JsonProperty("options")] public Optional> Options { get; set; } + + [JsonProperty("default_permission")] + public Optional DefaultPermission { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index c382c7e27f..fb2082c2df 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2843,6 +2843,27 @@ voice regions the guild can access. + + + Gets a collection of slash commands created by the current user in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + slash commands created by the current user. + + + + + Gets a slash command in the current guild. + + The unique identifier of the slash command. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a + slash command created by the current user. + + Gets a collection of all invites in this guild. @@ -3243,6 +3264,9 @@ + + + A collection of 's recieved over the gateway. @@ -3256,6 +3280,9 @@ The where this application was created. + + + Represents a choice for a . diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index b4f6bd0860..ef4e873050 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -723,6 +723,30 @@ public Task> GetIntegrationsAsync(Requ public Task CreateIntegrationAsync(ulong id, string type, RequestOptions options = null) => GuildHelper.CreateIntegrationAsync(this, Discord, id, type, options); + //Interactions + /// + /// Gets a collection of slash commands created by the current user in this guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of + /// slash commands created by the current user. + /// + public Task> GetSlashCommandsAsync(RequestOptions options = null) + => GuildHelper.GetSlashCommandsAsync(this, Discord, options); + + /// + /// Gets a slash command in the current guild. + /// + /// The unique identifier of the slash command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a + /// slash command created by the current user. + /// + public Task GetSlashCommandAsync(ulong id, RequestOptions options = null) + => GuildHelper.GetSlashCommandAsync(this, id, Discord, options); + //Invites /// /// Gets a collection of all invites in this guild. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs index 70b3a52a2f..81decb4be4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs @@ -1,3 +1,4 @@ +using Discord.Rest; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -22,6 +23,9 @@ public class SocketApplicationCommand : SocketEntity, IApplicationCommand /// public string Description { get; private set; } + /// + public bool DefaultPermission { get; private set; } + /// /// A collection of 's recieved over the gateway. /// @@ -56,13 +60,18 @@ internal void Update(Model model) this.Description = model.Description; this.Name = model.Name; this.GuildId = model.GuildId; + this.DefaultPermission = model.DefaultPermission.GetValueOrDefault(true); + this.Options = model.Options.IsSpecified ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() : new ImmutableArray(); } - public Task DeleteAsync(RequestOptions options = null) => throw new NotImplementedException(); + /// + public Task DeleteAsync(RequestOptions options = null) + => InteractionHelper.DeleteGuildCommand(Discord, this.GuildId, this, options); + IReadOnlyCollection IApplicationCommand.Options => Options; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 3557aacd20..6ed77b997b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -54,9 +54,20 @@ internal SocketSlashCommandData(DiscordSocketClient client, Model model, ulong? { foreach (var channel in resolved.Channels.Value) { - SocketChannel socketChannel = channel.Value.GuildId.IsSpecified - ? SocketGuildChannel.Create(Discord.GetGuild(channel.Value.GuildId.Value), Discord.State, channel.Value) - : SocketDMChannel.Create(Discord, Discord.State, channel.Value); + SocketChannel socketChannel = guild != null + ? guild.GetChannel(channel.Value.Id) + : Discord.GetChannel(channel.Value.Id); + + if (socketChannel == null) + { + var channelModel = guild != null + ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() + : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); + + socketChannel = guild != null + ? SocketGuildChannel.Create(guild, Discord.State, channelModel) + : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); + } Discord.State.AddChannel(socketChannel); this.channels.Add(ulong.Parse(channel.Key), socketChannel); diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 532f681ed3..b8e646e045 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.2$suffix$ + 2.4.3$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -15,22 +15,22 @@ - - + + - - - + + + - - + + From 8800ed8f959cfb815f5181e22b893ce0586bd1b9 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 7 Jul 2021 18:42:14 -0300 Subject: [PATCH 088/494] Slash commands docs part 1 --- docs/guides/commands/application-commands.md | 217 ------------------ .../slash-commands/01-getting-started.md | 23 ++ .../02-creating-slash-commands.md | 83 +++++++ .../03-responding-to-slash-commands.md | 50 ++++ docs/guides/slash-commands/04-parameters.md | 100 ++++++++ .../05-responding-ephemerally.md | 29 +++ docs/guides/slash-commands/06-subcommands.md | 217 ++++++++++++++++++ .../slash-commands/07-choice-slash-command.md | 83 +++++++ docs/guides/slash-commands/README.md | 0 .../slash-commands/images/ephemeral1.png | Bin 0 -> 37660 bytes .../slash-commands/images/feedback1.png | Bin 0 -> 31294 bytes .../slash-commands/images/feedback2.png | Bin 0 -> 28118 bytes .../slash-commands/images/listroles1.png | Bin 0 -> 38224 bytes .../slash-commands/images/listroles2.png | Bin 0 -> 33026 bytes docs/guides/slash-commands/images/oauth.png | Bin 0 -> 113764 bytes .../slash-commands/images/settings1.png | Bin 0 -> 76171 bytes .../slash-commands/images/settings2.png | Bin 0 -> 51089 bytes .../slash-commands/images/settings3.png | Bin 0 -> 52771 bytes .../slash-commands/images/slashcommand1.png | Bin 0 -> 10886 bytes .../slash-commands/images/slashcommand2.png | Bin 0 -> 18094 bytes src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 42 ++-- .../ApplicationCommandOptionType.cs | 2 +- .../Interactions/SlashCommandBuilder.cs | 78 +++++-- .../Extensions/EmbedBuilderExtensions.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 33 ++- .../Interactions/InteractionHelper.cs | 16 +- .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 6 - .../Slash Commands/SocketSlashCommand.cs | 14 -- .../SocketSlashCommandDataOption.cs | 88 +++++-- .../Entities/Interaction/SocketInteraction.cs | 4 +- src/Discord.Net/Discord.Net.nuspec | 20 +- 34 files changed, 795 insertions(+), 318 deletions(-) delete mode 100644 docs/guides/commands/application-commands.md create mode 100644 docs/guides/slash-commands/01-getting-started.md create mode 100644 docs/guides/slash-commands/02-creating-slash-commands.md create mode 100644 docs/guides/slash-commands/03-responding-to-slash-commands.md create mode 100644 docs/guides/slash-commands/04-parameters.md create mode 100644 docs/guides/slash-commands/05-responding-ephemerally.md create mode 100644 docs/guides/slash-commands/06-subcommands.md create mode 100644 docs/guides/slash-commands/07-choice-slash-command.md create mode 100644 docs/guides/slash-commands/README.md create mode 100644 docs/guides/slash-commands/images/ephemeral1.png create mode 100644 docs/guides/slash-commands/images/feedback1.png create mode 100644 docs/guides/slash-commands/images/feedback2.png create mode 100644 docs/guides/slash-commands/images/listroles1.png create mode 100644 docs/guides/slash-commands/images/listroles2.png create mode 100644 docs/guides/slash-commands/images/oauth.png create mode 100644 docs/guides/slash-commands/images/settings1.png create mode 100644 docs/guides/slash-commands/images/settings2.png create mode 100644 docs/guides/slash-commands/images/settings3.png create mode 100644 docs/guides/slash-commands/images/slashcommand1.png create mode 100644 docs/guides/slash-commands/images/slashcommand2.png diff --git a/docs/guides/commands/application-commands.md b/docs/guides/commands/application-commands.md deleted file mode 100644 index aa73f66770..0000000000 --- a/docs/guides/commands/application-commands.md +++ /dev/null @@ -1,217 +0,0 @@ -# Warning - -Slash commands and interactions are still under development and are subject to change at any time. This doccument is temporary and is only here to help those who wish to use the interaction features in the development state. - -# Application commands - -Application commands are a new feature thats still a work in progress, this guide will show you how to make the best of em. - -## Getting started - -### Configuring - -There is a new configuration setting for your DiscordSocketClient called `AlwaysAcknowledgeInteractions`, It's default value is true. -Interactions work off of the Recieve -> Respond pipeline, meaning if you dont acknowledge the interaction within 3 seconds its gone forever. -With `AlwaysAcknowledgeInteractions` set to true, the client will automatically acknowledge the interaction as its recieved, -letting you wait up to 15 minutes before responding with a message. - -With `AlwaysAcknowledgeInteractions` set to false you will have to acknowledge the interaction yourself via the `InteractionCreated` event - -### Registering commands - -While there is no "easy" way to register command right now, in the future I plan to write a command service to help with that, but right now you have to use the rest -client to create your command: - -```cs -_client.Ready += RegisterCommands - -... - -private async Task RegisterCommands() -{ - // Creating a global command - var myGlobalCommand = await _client.Rest.CreateGlobalCommand(new Discord.SlashCommandCreationProperties() - { - Name = "example", - Description = "Runs the example command", - Options = new List() - { - new ApplicationCommandOptionProperties() - { - Name = "example_option", - Required = false, - Description = "Option Description", - Type = Discord.ApplicationCommandOptionType.String, - } - } - }); - - // Creating a guild command - var myGuildCommand = await _client.Rest.CreateGuildCommand(new Discord.SlashCommandCreationProperties() - { - Name = "guildExample", - Description = "Runs the guild example command", - Options = new List() - { - new ApplicationCommandOptionProperties() - { - Name = "Guild example option", - Required = false, - Description = "Guild option description", - Type = Discord.ApplicationCommandOptionType.String, - } - } - }, 1234567890); // <- the guild id -} -``` -CreateGuildCommand returns a `RestGuildCommand` class which can be used to modify/delete your command on the fly, it also contains details about your command. -CreateGlobalCommand returns a `RestGlobalCommand` class which can be used to modify/delete your command on the fly, it also contains details about your command. - -### Getting a list of all your commands -You can fetch a list of all your global commands via rest: -```cs -var commands = _client.Rest.GetGlobalApplicationCommands(); -``` -This returns a `IReadOnlyCollection`. - -You can also fetch guild specific commands: -```cs -var commands = _client.Rest.GetGuildApplicationCommands(1234567890) -``` -This returns all the application commands in that guild. - -### Responding - -First thing we want to do is listen to the `InteractionCreated` event. This event is fired when a socket interaction is recieved via the gateway, It looks somthing like this -```cs -_client.InteractionCreated += MyEventHandler; - -... - -private async Task MyEventHandler(SocketInteraction arg) -{ - // handle the interaction here -} -``` - -A socket interaction is made up of these properties and methods: - -| Name | Description | -|--------|--------------| -| Guild | The `SocketGuild` this interaction was used in | -| Channel | The `SocketTextChannel` this interaction was used in | -| Member | The `SocketGuildUser` that executed the interaction | -| Type | The [InteractionType](https://discord.com/developers/docs/interactions/slash-commands#interaction-interactiontype) of this interaction | -| Data | The `SocketInteractionData` associated with this interaction | -| Token | The token used to respond to this interaction | -| Version | The version of this interaction | -| CreatedAt | The time this interaction was created | -| IsValidToken | Whether or not the token to respond to this interaction is still valid | -| RespondAsync | Responds to the interaction | -| FollowupAsync | Sends a followup message to the interaction | - - - -#### Whats the difference between `FollowupAsync` and `RespondAsync`? -RespondAsync is the initial responce to the interaction, its used to "capture" the interaction, while followup is used to send more messages to the interaction. -Basically, you want to first use `RespondAsync` to acknowledge the interaction, then if you need to send anything else regarding that interaction you would use `FollowupAsync` -If you have `AlwaysAcknowledgeInteractions` set to true in your client config then it will automatically acknowledge the interaction without sending a message, -in this case you can use either or to respond. - -#### Example ping pong command -```cs -_client.InteractionCreated += MyEventHandler; -_client.Ready += CreateCommands - -... - -private async Task CreateCommands() -{ - await _client.Rest.CreateGlobalCommand(new Discord.SlashCommandCreationProperties() - { - Name = "ping", - Description = "ping for a pong!", - }); -} - -private async Task MyEventHandler(SocketInteraction arg) -{ - switch(arg.Type) // We want to check the type of this interaction - { - case InteractionType.ApplicationCommand: // If it is a command - await MySlashCommandHandler(arg); // Handle the command somewhere - break; - default: // We dont support it - Console.WriteLine("Unsupported interaction type: " + arg.Type); - break; - } -} - -private async Task MySlashCommandHandler(SocketInteraction arg) -{ - switch(arg.Name) - { - case "ping": - await arg.RespondAsync("Pong!"); - break; - } -} -``` - -#### Example hug command -```cs -_client.InteractionCreated += MyEventHandler; -_client.Ready += CreateCommands; - -... - -private async Task CreateCommands() -{ - await _client.Rest.CreateGlobalCommand(new Discord.SlashCommandCreationProperties() - { - Name = "hug", - Description = "Hugs a user!", - Options = new List() - { - new ApplicationCommandOptionProperties() - { - Name = "User", - Required = true, - Description = "The user to hug", - Type = Discord.ApplicationCommandOptionType.User, - } - } - }); -} - -private async Task MyEventHandler(SocketInteraction arg) -{ - switch(arg.Type) // We want to check the type of this interaction - { - case InteractionType.ApplicationCommand: // If it is a command - await MySlashCommandHandler(arg); // Handle the command somewhere - break; - default: // We dont support it - Console.WriteLine("Unsupported interaction type: " + arg.Type); - break; - } -} - -private async Task MySlashCommandHandler(SocketInteraction arg) -{ - switch(arg.Name) - { - case "hug": - // Get the user argument - var option = arg.Data.Options.First(x => x.Name == "user"); - - // We know that the options value must be a user. Types of user, channel, and role return the snowflake id of that object. - // For this case we can just mention the user with the id - await arg.RespondAsync($"Hugged <@{user.Value}>"); - break; - } -} -``` - -# Wrapping up -These examples are soon to change as there is currently a command service being written that will support slash commands. These examples are written for [#1717](https://github.com/discord-net/Discord.Net/pull/1717). You can see the progress of slash commands on pull [#1733](https://github.com/discord-net/Discord.Net/pull/1733) diff --git a/docs/guides/slash-commands/01-getting-started.md b/docs/guides/slash-commands/01-getting-started.md new file mode 100644 index 0000000000..093178878c --- /dev/null +++ b/docs/guides/slash-commands/01-getting-started.md @@ -0,0 +1,23 @@ +# Getting started with slash commands. + +Welcome! This guide will show you how to use slash commands. If you have extra questions that aren't covered here you can come to our [Discord](https://discord.com/invite/dvSfUTet3K) server and ask around there. + +## What is a slash command? + +Slash Commands _(synonymous with application 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. + +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. + +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 slash commands + +There is a new special OAuth2 scope for applications called `applications.commands`. In order to make Slash Commands work within a guild, the guild must authorize your application with the `applications.commands` scope. The bot scope is not enough. + +Head over to your discord applications OAuth2 screen and make sure to select the `application.commands` scope. + +![OAuth2 scoping](images/oauth.png) + +From there you can then use the link to add your bot to a server. + +**Note**: In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild. diff --git a/docs/guides/slash-commands/02-creating-slash-commands.md b/docs/guides/slash-commands/02-creating-slash-commands.md new file mode 100644 index 0000000000..387d39ab66 --- /dev/null +++ b/docs/guides/slash-commands/02-creating-slash-commands.md @@ -0,0 +1,83 @@ +# Creating your first slash commands. + +There are two kinds of Slash Commands: global commands and guild commands. +Global commands are available for every guild that adds your app. An individual app's global commands are also available in DMs if that app has a bot that shares a mutual guild with the user. + +Guild commands are specific to the guild you specify when making them. Guild commands are not available in DMs. Command names are unique per application within each scope (global and guild). That means: + +- Your app cannot have two global commands with the same name +- Your app cannot have two guild commands within the same name on the same guild +- Your app can have a global and guild command with the same name +- Multiple apps can have commands with the same names + +**Note**: Apps can have a maximum of 100 global commands, and an additional 100 guild-specific 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). + +## SlashCommandBuilder + +The slash command builder will help you create slash commands. The builder has these available fields and methods: + +| Name | Type | Description | +| --------------------- | -------------------------------- | -------------------------------------------------------------------------------------------- | +| MaxNameLength | const int | The maximum length of a name for a slash command allowed by Discord. | +| MaxDescriptionLength | const int | The maximum length of a commands description allowed by Discord. | +| MaxOptionsCount | const int | The maximum count of command options allowed by Discord | +| Name | string | The name of this slash command. | +| Description | string | A 1-100 length description of this slash command | +| Options | List\ | The options for this command. | +| DefaultPermission | bool | Whether the command is enabled by default when the app is added to a guild. | +| WithName | Function | Sets the field name. | +| WithDescription | Function | Sets the description of the current command. | +| WithDefaultPermission | Function | Sets the default permission of the current command. | +| AddOption | Function | Adds an option to the current slash command. | +| Build | Function | Builds the builder into a `SlashCommandCreationProperties` class used to make slash commands | + +**Note**: Slash command names must be all lowercase! + +Let's use the slash command builder to make a global and guild command. + +```cs +// Let's hook the ready event for creating our commands in. +client.Ready += Client_Ready; + +... + +public async Task Client_Ready() +{ + // Let's build a guild command! We're going to need a guild id so lets just put that in a variable. + ulong guildId = 848176216011046962; + + // Next, lets create our slash command builder. This is like the embed builder but for slash commands. + var guildCommand = new SlashCommandBuilder(); + + // Note: Names have to be all lowercase and match the regular expression ^[\w-]{3,32}$ + guildCommand.WithName("first-command"); + + // Descriptions can have a max length of 100. + guildCommand.WithDescription("This is my first guild slash command!"); + + // Let's do our global command + var globalCommand = new SlashCommandBuilder(); + globalCommand.WithName("first-global-command"); + globalCommand.WithDescription("This is my frist global slash command"); + + try + { + // Now that we have our builder, we can call the rest API to make our slash command. + await client.Rest.CreateGuildCommand(guildCommand.Build(), guildId); + + // With global commands we dont need the guild id. + await client.Rest.CreateGlobalCommand(globalCommand.Build()); + } + catch(ApplicationCommandException exception) + { + // If our command was invalid, we should catch an ApplicationCommandException. This exception contains the path of the error as well as the error message. You can serialize the Error field in the exception to get a visual of where your error is. + var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); + + // You can send this error somewhere or just print it to the console, for this example we're just going to print it. + Console.WriteLine(json); + } +} + +``` diff --git a/docs/guides/slash-commands/03-responding-to-slash-commands.md b/docs/guides/slash-commands/03-responding-to-slash-commands.md new file mode 100644 index 0000000000..ae836768d1 --- /dev/null +++ b/docs/guides/slash-commands/03-responding-to-slash-commands.md @@ -0,0 +1,50 @@ +# Responding to interactions. + +Interactions are the base thing sent over by discord. Slash commands are one of the interaction types. In order to receive a slash command we have to listen to the `InteractionCreated` event. Let's add this to our code. + +```cs +client.InteractionCreated += Client_InteractionCreated; + +... + +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + +} +``` + +Now that we have the interaction event, Let's talk about the `SocketInteraction` argument. The interaction can be cast to either a `SocketSlashCommand` or a `SocketMessageComponent`. In our case we're trying to use slash commands so Let's cast it to a `SocketSlashCommand`. + +```cs +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + if(arg is SocketSlashCommand command) + { + // we now have an instance of a SocketSlashCommand named command. + } +} +``` + +With every type of interaction there is a `Data` field. this is where the relevant information lives about our command that was executed. In our case, `Data` is a `SocketSlashCommandData` class. In the data class, we can access the name of the command triggered as well as the options if there were any. For this example, we're just going to respond with the name of the command executed. + +```cs +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + if(arg is SocketSlashCommand command) + { + await command.RespondAsync($"You executed {command.Data.Name}"); + } +} +``` + +Let's try this out! + +![slash command picker](images/slashcommand1.png) + +![slash command result](images/slashcommand2.png) + +Let's go over the response types quickly, as you would only change them for style points :P + +> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `ChannelMessageWithSource` or you can choose to send a deferred response with `DeferredChannelMessageWithSource`. If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. You can read more about Response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) + +This seems to be working! Next, we will look at parameters for slash commands. diff --git a/docs/guides/slash-commands/04-parameters.md b/docs/guides/slash-commands/04-parameters.md new file mode 100644 index 0000000000..334e0128f0 --- /dev/null +++ b/docs/guides/slash-commands/04-parameters.md @@ -0,0 +1,100 @@ +# Slash command parameters + +Slash commands can have a bunch of parameters, each their own type. Let's first go over the types of parameters we can have. + +| Name | Description | +| --------------- | -------------------------------------------------- | +| SubCommand | A subcommand inside of a subcommand group. | +| SubCommandGroup | The parent command group of subcommands. | +| String | A string of text. | +| Integer | A number. | +| Boolean | True or False. | +| User | A user | +| Channel | A channel, this includes voice text and categories | +| Role | A role. | +| Mentionable | A role or a user. | + +Each one of the parameter types has its own DNET type in the `SocketSlashCommandDataOption`'s Value field: +| Name | C# Type | +| --------------- | ------------------------------------------------ | +| SubCommand | NA | +| SubCommandGroup | NA | +| String | `string` | +| Integer | `int` | +| Boolean | `bool` | +| User | `SocketGuildUser` or `SocketUser` | +| Role | `SocketRole` | +| Channel | `SocketChannel` | +| Mentionable | `SocketUser`, `SocketGuildUser`, or `SocketRole` | + +Let's start by making a command that takes in a user and lists their roles. + +```cs +client.Ready += Client_Ready; + +... + +public async Task Client_Ready() +{ + ulong guildId = 848176216011046962; + + var guildCommand = new SlashCommandBuilder() + .WithName("list-roles") + .WithDescription("Lists all roles of a user.") + .AddOption("user", ApplicationCommandOptionType.User, "The users whos roles you want to be listed", required: true); + + try + { + await client.Rest.CreateGuildCommand(guildCommand.Build(), guildId); + } + catch(ApplicationCommandException exception) + { + var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); + Console.WriteLine(json); + } +} + +``` + +![list roles command](images/listroles1.png) + +That seems to be working, now Let's handle the interaction. + +```cs +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + if(arg is SocketSlashCommand command) + { + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) + { + case "list-roles": + await HandleListRoleCommand(command); + break; + } + } +} + +private async Task HandleListRoleCommand(SocketSlashCommandData command) +{ + // We need to extract the user parameter from the command. since we only have one option and it's required, we can just use the first option. + var guildUser = (SocketGuildUser)command.Data.Options.First().Value; + + // We remove the everyone role and select the mention of each role. + var roleList = string.Join(",\n", guildUser.Roles.Where(x => !x.IsEveryone).Select(x => x.Mention)); + + var embedBuiler = new EmbedBuilder() + .WithAuthor(guildUser.ToString(), guildUser.GetAvatarUrl() ?? guildUser.GetDefaultAvatarUrl()) + .WithTitle("Roles") + .WithDescription(roleList) + .WithColor(Color.Green) + .WithCurrentTimestamp(); + + // Now, Let's respond with the embed. + await command.RespondAsync(embed: embedBuiler.Build()); +} +``` + +![working list roles](images/listroles2.png) + +That has worked! Next, we will go over responding ephemerally. diff --git a/docs/guides/slash-commands/05-responding-ephemerally.md b/docs/guides/slash-commands/05-responding-ephemerally.md new file mode 100644 index 0000000000..f925049246 --- /dev/null +++ b/docs/guides/slash-commands/05-responding-ephemerally.md @@ -0,0 +1,29 @@ +# Responding ephemerally + +What is an ephemeral response? Basically, only the user who executed the command can see the result of it. In labs this is pretty simple to do. + +First, we need to talk about `AlwaysAcknowledgeInteractions` in the discord config. `AlwaysAcknowledgeInteractions` will always acknowledge the message non-ephemerally, meaning any follow-up messages or responses will also be non-ephemeral. If you set `AlwaysAcknowledgeInteractions` to false, you can acknowledge interactions yourself with the ephemeral field set to your discretion. + +**Note**: You don't have to run arg.AcknowledgeAsync() to capture the interaction, you can use arg.RespondAsync with a message to capture it, this also follows the ephemeral rule. + +Let's start by changing our client config. + +```cs +client = new DiscordSocketClient(new DiscordSocketConfig() +{ + // Add this! + AlwaysAcknowledgeInteractions = false, +}); +``` + +When responding with either `FollowupAsync` or `RespondAsync` you can pass in an `ephemeral` property. When setting it to true it will respond ephemerally, false and it will respond non-ephemerally. + +Let's use this in our list role command. + +```cs +await command.RespondAsync(embed: embedBuiler.Build(), ephemeral: true); +``` + +Running the command now only shows the message to us! + +![ephemeral command](images/ephemeral1.png) diff --git a/docs/guides/slash-commands/06-subcommands.md b/docs/guides/slash-commands/06-subcommands.md new file mode 100644 index 0000000000..c4481bfd8d --- /dev/null +++ b/docs/guides/slash-commands/06-subcommands.md @@ -0,0 +1,217 @@ +# Subcommands + +Sub commands allow you to have multiple commands available in a single command. They can be useful for representing sub options for a command. for example: a settings command. Let's first look at some limitations with sub commands set by discord. + +- An app can have up to 25 subcommand groups on a top-level command +- An app can have up to 25 subcommands within a subcommand group +- commands can have up to 25 `options` +- options can have up to 25 `choices` + +``` +VALID + +command +| +|__ subcommand +| +|__ subcommand + +---- + +command +| +|__ subcommand-group + | + |__ subcommand +| +|__ subcommand-group + | + |__ subcommand + + +------- + +INVALID + + +command +| +|__ subcommand-group + | + |__ subcommand-group +| +|__ subcommand-group + | + |__ subcommand-group + +---- + +INVALID + +command +| +|__ subcommand + | + |__ subcommand-group +| +|__ subcommand + | + |__ subcommand-group +``` + +Let's write a settings command that can change 2 fields in our bot. + +```cs +public string FieldA { get; set; } = "test"; +public int FieldB { get; set; } = 10; +public bool FieldC { get; set; } = true; + +public async Task Client_Ready() +{ + ulong guildId = 848176216011046962; + + var guildCommand = new SlashCommandBuilder() + .WithName("settings") + .WithDescription("Changes some settings within the bot.") + .AddOption(new SlashCommandOptionBuilder() + .WithName("field-a") + .WithDescription("Gets or sets the field A") + .WithType(ApplicationCommandOptionType.SubCommandGroup) + .AddOption(new SlashCommandOptionBuilder() + .WithName("set") + .WithDescription("Sets the field A") + .WithType(ApplicationCommandOptionType.SubCommand) + .AddOption("value", ApplicationCommandOptionType.String, "the value to set the field ", required: true) + ).AddOption(new SlashCommandOptionBuilder() + .WithName("get") + .WithDescription("Gets the value of field A.") + .WithType(ApplicationCommandOptionType.SubCommand) + ) + ).AddOption(new SlashCommandOptionBuilder() + .WithName("field-b") + .WithDescription("Gets or sets the field B") + .WithType(ApplicationCommandOptionType.SubCommandGroup) + .AddOption(new SlashCommandOptionBuilder() + .WithName("set") + .WithDescription("Sets the field B") + .WithType(ApplicationCommandOptionType.SubCommand) + .AddOption("value", ApplicationCommandOptionType.Integer, "the value to set the fie to.", required: true) + ).AddOption(new SlashCommandOptionBuilder() + .WithName("get") + .WithDescription("Gets the value of field B.") + .WithType(ApplicationCommandOptionType.SubCommand) + ) + ).AddOption(new SlashCommandOptionBuilder() + .WithName("field-c") + .WithDescription("Gets or sets the field C") + .WithType(ApplicationCommandOptionType.SubCommandGroup) + .AddOption(new SlashCommandOptionBuilder() + .WithName("set") + .WithDescription("Sets the field C") + .WithType(ApplicationCommandOptionType.SubCommand) + .AddOption("value", ApplicationCommandOptionType.Boolean, "the value to set the fie to.", required: true) + ).AddOption(new SlashCommandOptionBuilder() + .WithName("get") + .WithDescription("Gets the value of field C.") + .WithType(ApplicationCommandOptionType.SubCommand) + ) + ); + + try + { + await client.Rest.CreateGuildCommand(guildCommand.Build(), guildId); + } + catch(ApplicationCommandException exception) + { + var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); + Console.WriteLine(json); + } +} +``` + +All that code generates a command that looks like this: +![settings](images/settings1.png) + +Now that we have our command made, we need to handle the multiple options with this command. so lets add this into our handler + +```cs +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + if(arg is SocketSlashCommand command) + { + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) + { + case "list-roles": + await HandleListRoleCommand(command); + break; + case "settings": + await HandleSettingsCommand(command); + break; + } + } +} + +private async Task HandleSettingsCommand(SocketSlashCommand command) +{ + // First lets extract our variables + var fieldName = command.Data.Options.First().Name; + var getOrSet = command.Data.Options.First().Options.First().Name; + // since there is no value on a get command, we use the ? operator because "Options" can be null. + var value = command.Data.Options.First().Options.First().Options?.FirstOrDefault().Value; + + switch (fieldName) + { + case "field-a": + { + if(getOrSet == "get") + { + await command.RespondAsync($"The value of `field-a` is `{FieldA}`"); + } + else if (getOrSet == "set") + { + this.FieldA = (string)value; + await command.RespondAsync($"`field-a` has been set to `{FieldA}`"); + } + } + break; + case "field-b": + { + if (getOrSet == "get") + { + await command.RespondAsync($"The value of `field-b` is `{FieldB}`"); + } + else if (getOrSet == "set") + { + this.FieldB = (int)value; + await command.RespondAsync($"`field-b` has been set to `{FieldB}`"); + } + } + break; + case "field-c": + { + if (getOrSet == "get") + { + await command.RespondAsync($"The value of `field-c` is `{FieldC}`"); + } + else if (getOrSet == "set") + { + this.FieldC = (bool)value; + await command.RespondAsync($"`field-c` has been set to `{FieldC}`"); + } + } + break; + } +} + +``` + +Now, let't try this out! Running the 3 get commands seems to get the default values we set. + +![settings get](images/settings2.png) + +Now lets try changing each to a different value. + +![settings set](images/settings3.png) + +That has worked! Next, let't look at choices in commands. diff --git a/docs/guides/slash-commands/07-choice-slash-command.md b/docs/guides/slash-commands/07-choice-slash-command.md new file mode 100644 index 0000000000..4dbb7b7d3f --- /dev/null +++ b/docs/guides/slash-commands/07-choice-slash-command.md @@ -0,0 +1,83 @@ +# Slash Command Choices. + +With slash command options you can add choices, making the user select between some set values. Lets create a command that ask how much they like our bot! + +Lets set up our slash command: + +```cs +private async Task Client_Ready() +{ + ulong guildId = 848176216011046962; + + var guildCommand = new SlashCommandBuilder() + .WithName("feedback") + .WithDescription("Tell us how much you are enjoying this bot!") + .AddOption(new SlashCommandOptionBuilder() + .WithName("rating") + .WithDescription("The rating your willing to give our bot") + .WithRequired(true) + .AddChoice("Terrible", 1) + .AddChoice("Meh", 2) + .AddChoice("Good", 3) + .AddChoice("Lovely", 4) + .AddChoice("Excellent!", 5) + .WithType(ApplicationCommandOptionType.Integer) + ).Build(); + + try + { + await client.Rest.CreateGuildCommand(guildCommand.Build(), guildId); + } + catch(ApplicationCommandException exception) + { + var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); + Console.WriteLine(json); + } +} +``` + +> **Note:** Your `ApplicationCommandOptionType` specifies which type your choices are, you need to use `ApplicationCommandOptionType.Integer` if choices whos value are numbers and `ApplicationCommandOptionType.String` for string values. + +We have defined 5 choices for the user to pick from, each choice has a value assigned to it. The value can either be a string or an int. In our case we're going to use an int. This is what the command looks like: + +![feedback style](images/feedback1.png) + +Lets add our code for handling the interaction. + +```cs +private async Task Client_InteractionCreated(SocketInteraction arg) +{ + if(arg is SocketSlashCommand command) + { + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) + { + case "list-roles": + await HandleListRoleCommand(command); + break; + case "settings": + await HandleSettingsCommand(HandleFeedbackCommand); + break; + case "feedback": + await HandleFeedbackCommand(command); + break; + } + } +} + +private async Task HandleFeedbackCommand(SocketSlashCommand command) +{ + var embedBuilder = new EmbedBuilder() + .WithAuthor(command.User) + .WithTitle("Feedback") + .WithDescription($"Thanks for your feedback! You rated us {command.Data.Options.First().Value}/5") + .WithColor(Color.Green) + .WithCurrentTimestamp(); + + await command.RespondAsync(embed: embedBuilder.Build()); +} +``` + +And this is the result! + +![feedback working](images/feedback2.png) diff --git a/docs/guides/slash-commands/README.md b/docs/guides/slash-commands/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/guides/slash-commands/images/ephemeral1.png b/docs/guides/slash-commands/images/ephemeral1.png new file mode 100644 index 0000000000000000000000000000000000000000..61eab94b60e9b4366c64d0f7f983134f8947f2f4 GIT binary patch literal 37660 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

{^7H%%l-DeJMH417V5Jx>N63yUxBP8K*k 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�v%BcDd2f;DyBi1%%XkBE+-9#<$0Q`H%UOpFi9nAIy^YQc8#cT$HNhtTXC9+t^o}W43mVmH7 zaAah9O7ZlZwM=V;sQUo=C&$!UOEm!{|NJrlyvXU2p-xz_vX^6)!g_hlie1g>7f&GY zh=dpqjuY@tzfsvcxzvp&SBwrFHLXL@Y|jlbIo9iJ>uNe>6KAnhCnOL0Tg3t-UG&=o zK2Tx>qst38{S3zP!AcX)h+rgo*``*%;ll4Bi4{Z)Y^4Jd_fi z?@tC~dI<6Z?FgB@u91!{Y(DYO3>}(U$87&z4*0~wQw*gka&i12_bk63A6!LcOJ4F6 zZpZGhmMpm%DY$=3Q$)%qs>UjELnO5d~@ujVyCoz};gJ)*N&8C0snwtd+Se>Ffi6O%{T4#cE479!93;P}$n) zJe8lM-Jx|z5GsFQ*oeP{h-c&XeddQ={szNSNh?+0)97SMX@;;PxTuz ze_hY@KYI_~``|vfkABDB`}g^LJDw&*pTifj?~#26P5 z<7&_oQx)eaoXCF&F%2PaU~%s478%w|93n<4W|JjDcm5;GypdmY2B-#?q2-^W!K?>8rBYc z521?XTv=QCrcoB>fgrC?WrEp{4-@zDs4^2>+>wmk~ha%kpc;C$*FI?V0(0IUX0 zH(W*92hsnq%NV_Esb`jY z%O!E9#9{5j+NiDoCHj`v`<=AT>#3E#X2b;0=8Gd!VEWf!k*2`QI#YGehRNxsW*S=Z zb!yf^XqXt4a>eT&YQ%J*Sk2ma90O-^j5=;rb?oRK>zH!B8GYI+ z4rmq5-f9C>N@AlTo>z zGB^xN(Xz?P&q;fDzzd1o1&xip%fyOP!I3kbBAT-Y905TJK{{`SS)=w&CQ?GmkSy1O3QggO`XqY>x4TP!Eb zw}m*Y&o4x@SH9vdpY!5sICLT|A|4n&@{a_6o^~89#YC&7bze%1=pM#(PhBjL1v{^PnHZm0BAtmFNd z7r;{17*>h>?7(7|i&W3hKhB@%l*J~azr8F{*iJ=$a~KVlH9mae)K^EVQb@S5llGP` zx9P)YP^>EPpXplL(Tb}d##QF~*d4ama&9W6Y4>h>S~^Cy=j1KLhJW{;YPLP=ql9v~ z22X>CNzaz@&AQ0cg)=52)?bn5ByWGZc(?eC=Z^<;*QKw9LgG6=69YUJURo3c_pj%u zagQi-r{FJWtgU#qE+Uo-1SynpjhQWK!Y95@WBiYp)NVxIHNp&_mj*h=BHqY{_<L`ksVl$Nzgo}nq5B@}jXU@khb z&kjT6!ioRRTT{)5^4733YBt)dYXH0FAh}CB6lxhN3x;YE4=%N>P|@-MslxtdRo$zB zy6F$TInOy0)j{PnLt?vboa0?U*!;HUX7hnD#ay{nI*_a=?ae}(z0;D4L{E1+J7H}Y z8}r6EBma4q(SG*c0PJbhi*H^(PW@E;6(-QS7QLzK3qICX68&zyC!C2kmYT+s&(S2g zrk~J?Q66GvRkb|BJ<3XuL$DCLo9nhS3*Hpkf~O_O{?Sqb?;~+0vgn@G?#74o!Wj8$2njE`znUdHD z9^V!rZNc!pNzD)YUiT&aqBr%lDX9_*Vga{`hNrqlO~f|!VB{=M`029}tHn{@A}h$z ze|vhiAEqzt3Q+Wh-V6R-Ub5OYN#u6x@kELnlm*6Bhv|mVlIJgt!t2wA0m2mpp>0RM zmh^Dmwda-Pe@^mL;sEXnvPssYpfYy_ekz?maP4(ER{E3M+3>5k?+Inj1bO$TbXpLf*yK3sxM(9$dsVG&1M3I=%OpVK)P^ z>p(O=u`r+VF`nAbdUfr1L?39-im2{8wos%+0m!LLm=s@D+R7XCg~ejm0wFb+)UpA)+H@gt zV5YxQ!dJbNTFyA-Py>iCh>QhNr0E>wHW{ z4D{`6>(&S14c`6TVylFW4mmxcBo^ZHNEz_^NOk~)<~lYLn7^gXmXYFfX}3Ki;TqQo zj&evd7*=NulZufNsJCEscnr2DEA5t;grNEA>Uc_B{TkNv(wdno75jf!lpfuNA9(t@ zN>#^op|WGHA3xLAxgQ|wH|}9uza*e!#VI%p#CKx#RcqgXwhUUnrfu!2*KoXAhmT!( z1WqgnQpWJ`9)B9_XV1Xs#BqLdkjQ3$sy%MBfI19S%J>s1E1&fmrzr!OFZ7gTDmkyW zqT-atV%ug0ta+}oWoX0Hg{d2l-*wfl0$Wn?ZXTvGUjoWiu-L$f zlotXj!{;Yxy*;0=sh!2Uc*LEqel{P`z;MaeU|aI)q;z#X4dI6bq5cUjifBnz&(lf% zm>UeSvCiRKZ#IfZP3a6b9}d>L5Mz;&a))%vk37R5Ea;T|>W8BI1;Er^6^ug}rQ7xu zM~jO~dHZB7522iH{ZsUQ9rlu0)G9DLM;CpG>wHDGW!4%6Num>{l9>?POGq=n+PfDZ zzL{HktL4`%cphvaNoK^8MBgBh5x{uU4T6l5^-czQfi)RP;$f7<;$AbepPYH!OYMp8 zjSdv}lr=6ksNADhK|qogBHCeVi>H|$JDE>RCLBGZ!PeiiF_w8JP~#V!v;(gHS!0V_ zF~LU44&?H51@=_#`^X(6qOlE~zCO^W( zFBhk6#xfq3w9ey<2CHRQ9FttL&hMR0=oi~+>FbrlODz>Lgp-q|TTY9wvTI^d(#Pt0 z(Wrv#UB;)*n1tCg0W|r6)}N(^*2I0uo;L8+ePBqHK}&c^HZY!GCl4vO!yEU3Gr5K{ z^d88_^KLQz^@u761{Xx|6|h4cc8&p1qGX`Fp}k(iwhR4Utj zmcWcE+aspbxJXv-5nd%us|my-!msZ^^t$r!X_^mN**}&-YQK<$Bz0?tfe*-;8DH|h z@uuE?l&EQX#n|m;ru1^545wE_kzqJf2S`5T_Qe%f)O%(QcWy!|#)ibhuh5%rWaB9_ z@Y)e=E`#F53oBeP-Z+}t#=q>SZs;P~#qDGW#o-DK?_KQrH{ZeH=?ika66y4$h#rQR z3(!fFe~D#!DDi)`xxZeLMZ^TbyB8?iF!J|xu$Jxz`Auj`sMfiKk&PE=FUC$o_o&BnX_jc+56plul26CJZn8`Wq;DrP@yje8#wE>jA> zkPUTv8v1~nGt@vqq4o;!ZZtL#uuKCFyHj#2S{TA;{*BQ1GJ^t%}b-1!y>>3`QKfN&7JsZno zL9)odaC#*`Ffo$yq>ukTCTTAJJ*m6UbnUbuAo1Rvv)8QNxFCPpKxQ8J>hkHyH`Qy@ z=T1*NDFg4H{!PaJ{K=WjN%sFXA=13Y?9&qMxpX;-^%sdT+cfn09TTVyiKrroYGYrb zpaHjd7per(xCGon&C#t}Ee_Qjr(}6Fj27*YD-rXC_~u?b74gr$WImqrE^@3uAEkS^ zH+yr>841SR82p-uTEv@&HwRkDDC;N3;CcJ-7Crr)%oHp+YqC*DZWqX>UfWHXf6Sp;TX_T@9*`c$3Oqcs5==3| z>3fua8DF(WjwA6p@~euDv1?2Pd%nu^*P#n;<;(Tx#y4X|+V_DSq;khYZ-hfK-L)*m zddL2rR8y7Fh7MFEb_sHc&&Vfsoiya2tiM(m-}r`)1*PP;ocHDHy#?8l3I}z4kVaJV z8wud5SqsEy;0??7%MOU|+w8E?AX1DZN`KD#{yJ7gZ++iE}NUehXBu+4GK zl5M$u*a(iUPe|v|>|@-mjeD8J#Id}D^8i3R!=0QFh+NrgjEa$&QC3`UX(rryv6nv& z^_t&ooJ;N<5FxzOx3=fmB-gXwIK20|)m#r1l_#9C^V8sLiozUKWZo2jL?ID0CA9AL zecyM=Ia|#fR80!6a`08WzjfT^fUAes)`-=Lvh(yXUAWM(>3(2J^fNDlE-eSGfckHE z)J-Mi#j_rmgsHjT?A3Dcxs{aXh!yCWfLTMXBgV}l1%gtwn{tW5w2_ZHM~V$CFlH-p zXXe+C$-Nq!tO(B=UNJ*kn=B1J}Kw_evPf z2N6mh*5-YE$onT<@^R=#5OC$H>cFC=dcX|&2j(_H&qc5kX^}UvW9)P63}KblxoVzX zpbyb_+KXNA%kh*nUx zF$F})y^&bxlvK1|TsRk!v;u{qPv1N9|eV2hRLR-eJ7k>RB(n^Zm_zK_bV%a$^l#w2UWWk_t61{iDNe&0|K9POs6zfB*gwx$8Gye%gKBR9xC@>wOO!okpH zB{E7tKAo3fiF7>@mpG%H%^VUS{pg|8fAnFl|>z^SOm2lqnjK?M>i0o<1L zxBN}k3vwU>e!Vqn14=v!VvvfqPc?q8OoHe|V}9t2-Ff&|(DQ}&_XR0NF9C#P#8u%V zI`7-1QN=ssnUX8ag&ay2NPRuzBcEIL{k2z)+Uzp=JB&pXSdXj}nX3mut9GQL7RVfP z%hr#nY~dhca(eqJqcXcILC)-cte@sHwPWST5f z_YKC%Xo=uMD1(bb9YDL}3#MLp`eHV)5gr*y=W?VK?qdtjdj=kUisf3nuYO<$&x@?pXjOlBTkuuR_@8;6 zp2IaBL}Wf>boUn~$K(}j__{=l#k+geiO=S`KOIu(2vwYC6P>@w> zB$Yv*6=%j8WN+sX8h>p@NA^_#PRW4g?nXiz4L6@0cgBW%@(~7FQ|3?x&*1=CysAp} zsMpY}7kvJn#5{F22m!H^ahHRGKUW)3;&L1W6-oV$hl6O%t2D4Gm4$O#IH&pgQ0I|q zoI(2NZ@sBW#U5XmFE{w1&4r>7?kLZ9xbx+t5L@A|4jicisPr_8GEJ(>dOJLA+)Y4m zj;EA(9Xjj0PWb`O9#@DZV|QoFxL#VRoVmu}JE5QQlaC$P z->X@6kO46iHHI$Mym@GzTLFO<&8iCh;@yd#9ZBNn>xI89R4g55m>fJCei*lg-xHy) zpB@|_q0X@2gZ0t`UbFePY`CX`LYMWve+v}+mJ90pJ}LwZ13dl?U9Rt`*4X_iK$}BH z8D&1OXH{CcEII!%X>QCo2oWrPeOwQH9J5n5v^{Jcx>ia=;Iuvy&RqJ*L6`OS_iyIh z;o=bjw-vpq^kU4F)7DHV<;V14;_2s-21GIZ+g`SqKhL`e>Zhh5)40nab0;}A3+hgc zg;!@Q+J9%u4tW;$aEPj8XlW}h9e>j)FDPI?cRIDH!>jXh9`O>;@x z%~jr8o>GE1OwbaS%l_)F2Rq*sRpu~uIXtQE#b}9Hs6=Ju-a}&(tfvB(a@eEByu`}5 zC%K~&(Phs^k2o;sJsp+&FAaL;gnhoMIQm zIoqaTFXoZ>(qC)S{}TnpdCjhSe0N($awf*ryiS-s#1?K=*+CW`_oS4LaIr=@vu}O| z*vSU#Bphcbn7}}%j|Tv{xo-c(y>EgVp9-f>8_6cU{&$9({|^D_f0MaB2|lCQ`D4HfBM;x^D~pY;P~*)v%D-3BqB@pvThr%YUe=NZJIE zuay!aaS`quXOB9~7Qf=WCno#O25}e7A`k2QO-;=Ga5*1Yeg=%+1fS7So8^53d0Bd# zAFLZ)!mLFHyV;|-F~xE%!av2&Ca>)9y4Djq&RwJ0!G{i#c1w({_Aku#UtISn@PXk( zT7j3&q(-i3J<+wWtu8Wik7+m-R#*?yZ#VfJX?V=>`^dBPkLqXwroZAXqFGN~dl?Xd zTSAVu)#okQh!j``b{Jz-~9m^MZj$7iJ zk!{>Zk37)k^>>;X4^V$p0LzVrlqUhjg&MlP5`-h;393Lt6;BwPe;?!Rf=#{OoN+(8 z-q@%O{pPLK@dTTJqp`oV<(K$$z=HK-#NFi8jT=i{PvSE}?-U$}$hXnr#BsSN5LD=2 z=|{xphg{S!MarK*&`QF-Zoby|&5V!Ez};!>nt#9syx_?@W~*m#Vxw~*`)55|)lZ`g z?%tD27?cq;KIZHDu!}%K3ydF{$EWvh)^eL)AM(S+%$4!tK`F~9Z0%5y%pe<|tVETZ zAZt=CQez2zJ0G~lN4h6rE=m{bBTz;>ykFxE8*uNka!@Un5Ly2ZN#-Y#K-E?WcREX# zTH=l4d8?BlkY-o|@fM(k7TVxrF0j^vg4*zjCt^BHtn6OhRQMvxA*Lapz&BWO;E*F> zlsJ+dMiqWR1>az%jCp!$II_@nwI|b5Wgh!6{$F=S){7cUqF;wRlL|JOVcds1&;ar1 zbdrPQt(gAOrPS$_#SO*XoTA?DyQQIoS%+>2>aP=C?D_Bx5zr%L&dIjFdO599+AK>3 zocraEk8qu388^2AqTy&v%JheTuz0Jqn;vP2<)RRWg3YIUTzX)ZySdku{tINzTo$sp zK&8OU(!lf6+0?nqZrq=-{=INIdsc!0dGf`VCJA=^pASqqEnY=QX~H0W4I*E*GhK)t z4xX8~4@DY6lSh(+Sgy0>Gx_t`4QjnYySx}x{QaFM*7iAXr!|ooZrOK!{qS^i{DZmA z4oiH)2Pc+#v4KQGPzNpVp1Y z3-XyLvYqGSHP0gy(7b&Y1z&LblpjgXtO|jHF4W{_3RZ;sXjyXb_f@=2%)%@or9TY~ z37TuG^k;RT7iM~jo}SGoE#rUi0CsCwMQv_8)K$5V(FQnv3{yFi7B>RC`FF>kTv_{} z>w4BGw)OufKlk6X9sc){fd4B9sS~*qYB#D!?#Ng;x+n2>$F~(rzlFTvnreCV<4{1z zO7Azv9(q0AZ-u2+IUsxu``+f^n)fd0VSb4(jo*?9jb=d>O?rB^YWqtT-Jmbnd6>e5?IaW*4v3X6f!tnsH*)Ywy+N^)3!^OrFJAy%cX`0h8&du)4#{Q1K;YJH zKS>@}m;ezNB??NRH7idnZ@I`M z^9ir&>%{b^!tr0*9rZud=3bQXO=YIab%NzyPpsL0JM8^++_(V?{JSGDKPzq1Dz;I^ zJ)p-G`29jU(p1N0N)Af#X?2<-(P@7w{XBwK-|l;trR_acuBI{w^Q&K~ktYAWG--?f z-QjIFBvOkhGT9vJ8Q7d4*LgKS%kTtH3pZ5pFX9At|(3I&xiHnLn%@ZRW4ud`>RGNzwc3v?$NNBjX!=me` zvmo9Seq^|=5G_9WPZWY^<~M!%{$aX%G!;z+JZ#}?GJhNOymu!#PfzlMR{N;G=B}RR z5a$06R*a1{x#bW2np-R#h!?$B@ZyoIKnV=0%uu7-x~MvE<_LYei(vzFs2@VgrJ^{p z2oMHSyqSj@Sf>nYs>^F?FpZX&E|`hw8p+Mi``H@qpS&i|mr8Ga`^r4BR82mY8&Y3x zlFseJo=KK?qnqWl+uy>x9^M(*#sZToyCj@j?SFP@+RI9LK%ZatJBNw3?9v>Gis8`< z)8A?OMUi!~rldtj_?-SMU8%L{H{KC)({^ZwTQ*SxwJgdDUhCz&9jr^w9ZSb^&SdDZ zj+^35bu(TMklY+CeIB2&V*&Wp6B46IFl@!m@8!U;S8wJuy({oZ%1c&+JoOCiNZ6O3RmkKyWL0`I}E6BX15+!9IZMcpjv4mpaNdX zU&`n^_EJ0~UgCrhe4(PY)jFUwgtXKY-SsH=jFUN{30=bxN!mf9g=)YBanV*=)pDbO zB!t7L9qtJLZ!{W=#rEY|hCbFiTjI_a*G->T3Dv7l7aiYn5b_q}h`ZbsQ z2aOj3hXHICJm)S*d0N*I>F#L7)i@@YH+aP5Il6Oyu1Q?zmtwljK_G@_rWVWgs&j24xl?Jf6cv%mc};k0@qjV5?Kh$qt)CYSn^gUu_b z!D2Cu7WMFHst-?Rd}iE?jGgwo$@$BWDO|l*!Fe4~P~P1)x;OGuRa~4-hc-Y^Tb$x= zs!D9wH&yDijSS=bzXG=S8ked3fJ8)g;PIM%M}F&TYvm%W`M1t`VSQgz6hGn`ml}_R z!QSRqEXH|%kD?6XzHs5EkKEs-U1BTnB``_NhzIh-N|EYplgaS)e2~I*axE|NY~z#N zU40<}W@@@N(0+Db+-*%OL2B|deEFZ00UWO8Tj=WxlQ_MRjQ`|L&L^_xo}Y82xFq%$n#G0e#;mBv8>)`mjLtJ{Dw@X$v_PxPZYLG7E%cF1Pc^Jdxk<0%D& zE6<9$U>X;{P=>#H?}yh?bhq!qWhs8>H4-` zp|f~WRb8Blakx{s=f{<7V_n?riU0fuX}vJ=;lO-$;#Z>Y%Mu)&kO(Dr%+_a-OZVe9+I{W_xsan_D|;gUx%}V zB(SNM*({ms+X(t-Tl{c;$JAqHXhnz^lwRJ$9b8#uSijU+m|Xs*vOH3Eqp5s}K``9Z zmz+c_D>q(GsBI%y1nc|mf3R_I!2@xK_Jx} z^q}_Xn-h^+3aAa=Q}JZ^#j$kMTY%V7wezKBjQI`*nLn-joKytZKFHbgjGJX+ZP9&v z_7*bkQO)YDkU36?mz{nP#!SXb8p3vRfO@RjYSB}stiCUucQ>+R!ZqmTn zXh1iCk+jD3^U!KQO5KsWeJg$fsP8iRTRrbNWddkK<)#)+e~bc|`{4?mZ60#8Oc%}n z;MUnnwGBS$Qjd10#Up1*y+76xb*M<*7pQyoi4_xR<2??+Hiv0hrj2c(wY~uoLN3bt z2E-75$!aY>e;r~LhtOVMyDAgoHfDc<*k33Z#-2N-+ zGis`k8x24iXz!0H6!bQ%SlDLxJKF}zc z4ij_#`=Pa8o&6OzXFP}zFY>iwkSnCba(#b@vAtc`h|ab#uUF;|A&d4(n{j=Aq`D*Uyk2JZKgj$Ih0 z=IuO9O%XK5v@k`86yzfWGVd#vP~B=>(YItfnfaWsD@KR)@Js1m;OwJ<)1Y3BdhE(; zhg5nCB^6@{J#;;Q(}sKePqnd2FOwMQ_TSm^{2x%@#JvT+qwi^!VYxA&QBN|^S6p}6 zdtG?*=zv+nf22{lbQTHWR-Iy~-zCt1(zZ*}<|XCQ=Msp>v-hli+>{4mw1>rn12X|~ z4qJX!u(oYV{IVC8d+pub{}@>gfYBxSv{aR4p{Mh?{AJEZA>L)0RlY~Y@Qx|Upuffl zdG%wx#fhhUEmGaM-YqzdS=uzVQsT^eBg5QNV?U#poI~Gmi=RGA2D|p(SuFCOSe`Z5 zq~+*{0-w1tWSSfQf;6p&|I0N1@fD{es>Bo4^;`WGO^#l|ALKU4c)%l<~s)>x}2 z6oN@5vjbUr=ee$)>K<^LbL->%(=#&I_Qrxe*S09Y__9%TaeDcAnoFTeNAvX zK1#$7<&J-b7>iwNJAGq-V4AHWHN{2lCt?{NdUDBR@>50c{;9L+PC-~7-{new@X6>^ zRF|KV0PREZzc6Tx%?5Pj^0A;3kXWvgtzPw5O^jV;Y$w00ULZM4?saTMzURdL*#z!P z#UuYxBa=uC^CxtoFHbT`dIJ{K@{|;L`e9YuK5e4$I2n14Z=(UNU<8X~AP z-+oV0lT^{rhcQz6n{TV_iNh;_WC3$ylppVk={VKNn1Sb@`71{!Su8@o$#sml$?uoy zWoeMH@EFZ^KG;-oJ*UrAj~gA*Ly&tsZ>9x;zJj;X3x`N79)#=mPnJ}Vny!TCoN64f z?z$eBNsoXOxK?G2n4x~Pq+ZTlz8BumfWV+Qkm*}NwV3|3Bjvr-4$@$~HB{k(34PNL zgtr#-<8TM~ay(FKsN6}-S69BKjqBMHJ>>2?NSL zzFdxc?kCSQ2u{AbH!bewNO%$SO4G8nq3oN!suq5WW3@G^sAPS@$(B14GCJ}LYXl+j zz){RsjIb;qi<|VUX#4dvs4cu7X{IP*|Cdn0uGu}A2Kj`Xq@@gBrNH~VUVlumTimc9 zMQ)O{ZZaZ9i7M||4?=F3-W^%p3iEb*C+L<(FbuzQ2gyCmWxPo&2Mwc6$On&zixEkA z3idH&J$K&-T6OoR6g+ZBd1`!Ey9H>JmJ)LQ&7FH`(4aAMhlLibl1<3={^}HW9$+v( z@HO;^ghi@yP)je<;E!_=s0U8d% zm^^PguRa`Dw+1c;fg_CF@8&62W9-KgQPewsgR*u{_wT(H$|ux{+jQ8C1v~-%m0bAxrW^j50V}I?Bi?uONbk`kb$jip#ewF zkeYT1l}iS8vjs*Ypvtc!b$>qH$~U~!w^sA(Z3u$ous& zh;&bv7qjAYNqX1)D8q-}OAFu+zCDN3a1D_?axab(h^ra+OX9DRoj_oreSYByokR7u zWpnVVS9IiPR(tw@f&IWtXoP*$QI!oUAs{0Q=r9E?li;hpz9&hZP5)Z%%SnHB zXXehc#VNwGt4&Yn?pNEnv9AaN)6&<# ze(rSl2B(Lv*w4b~*+Xy624L|eldIxw0KS3EE@GqagNj!?XZ!! znp7szF|JhZqr!XzMY8-P-dK5~yD1^P>^{2zRrmn=`4sKL=m zYNyqN!FFOpyZ+$FU=JJneh@8hFkC6cLIPOx-`8zK90`sSoxb1mD6syt&}#y{;X?|f z?Q5SntE!RZ@^b$kWf5@xec14MBp8~G|BA`f>GZANn)LP9=bhR*NMwX?-ZLgot2Vpt zKI0o+zo7sv7two{*+=|hCl^NxVp-N92IEF1)fy`PGj)n*F56tVi{@kp_D$nA*Jr1a za+bgZKYVF&HKxYa6IL_2vxto7+nq91T8*FVH^-O?2`C!~aM%NCA2v24&6$0@Y_&8gDk zv1>nSZ52Zk{A*u~!iYC#H}j|I_xxO3(5$CZ^dy05{I_x_V0~uzKhmkro&WPoWd9T2 z|A#pd4LT_BnS}!c4N$&dFwFAQCS)_>0DWI2qO@ z_hKn`_x5(Vc{sW>KApY6+2-lpsE)vs*N|3N?^#$_Slin2Nb;ywyUTvR{NVJqfB^$k z>h71tb}QLOR|JxxG!Y_8U?jlZI4*VRGgFB@lS0H&>LI$7>ukYgFzx>N(Jn63zK!}~ zdGqq_?(V1$I7k!mXS;gYw|%euC|&ZoKs*I`Mqs;FDB|p~fJ}S(7a0K2UyK ztOv{ua5u=KKDm!ohfCIRJ!KMzxN(hHb;0D!;q<)9(Jo$bc5ty!(LT-7GW8#~EnjH5snW67n(?Phm_HUE_)(*E>VRD1s}@Ko~vHu?yNit~$XHnafwyRorLkM69awVI?we1BsX?B;}xl9D*wh`)4!}+RpR#i%%>si?C)#7 zmp$)wlR7Ej2SvkT?_08F78txDczeRh@CbeD~sAb_zx5p-%zdLf3)x6VjrR zf~6lm<~#GUeK^&dOoKP5<=)hf-XDX1^a}1xjKP@psQ}u(r7bB7RXH?gw^^gBO!Fpf z4o$2iA2+svzNEzR{3{c7MV)PqDbdgQTFb|?d!M15=fOg|yo8SE9yN}+fjaBanAp@Q z+P~X_);N`dB1LmXmTxL_tvl$Elt2pCt>Lp5XdOlTcnec&ACLGw&laqLnACMUYvc53 zzYJB$ej9jyl5UbpToY$+nvpSSxBExm8KeoV7Ee-2Rkc@ zAu!j1h89=iG%UCzW%|-hCS1?btZ}?2b@QapPwg*f`YL!3bHmV8a!Y2Ua?eA*{GpAp zo%$C&CAaN%MG#pUj1bA=2WEuairL5JQ;xbUovRIcaHw z1t25x%onn5v3kBel%>~voh{f^vpM;BQ@kbpA}BMoDV*+(uEEjK{q;4P670-u4i}Go zW&c3Md~Xv(;>(@|^H^iQv$^Td4i6=O*`sV4fn(HDQpnQS?(RspzBq4BQWOo_i=3 z?QgyNXKy$~Tm&);16qzG+jp1eMFNKO*xbA};GIAJWSbuh?ne86yJvO{peMbLpD#6N zBPL-D;MMzT)nBF6cWjAqOANJ(N!ThYYmbQxm8Y|+CbTK($rXhedBS0m2JR_`-lwB3 zM(gFJ(S#Ihy(r(xg_18#y?jiC(?g6ef#`OePFOiP`tul9Ok7%Zo2mWY6KImOCNJ~m zVt@!d>*3+%p6W<~=${sBy{g$^ILrRdW9VknZR2HBGv$fJog+H6c0#>>kB1KB8-B}u zUUQsxkEV8TqHvWuvhFmY^zCkDRZ-j9T)jnI*EC(;P2V6~y-|Z-JS@2+IuLU`dV zxGW@vISfYoSc&CfL>_BQEK&I2O8$^5PIa&G*V?+#K@6sLi#&d(2%4S8+snQMD4*Xo z-vx9Wiq#=a85^}oU1@Hj+*hqVC%%YGh$&gyIkQ81xea1NSO-7XVL6KeQS&qT-Si3_(tVNOhQ8ae=KTfd)M0{NAcR9> z%GNaEc!(q2WT#>TD!4S^?O^4vAjwM=%CZ_|p0b(Qu=`8tP^@L__`caqi&1eC*tYko z-bT^!(4W`E8U(I~;sDnAm0hi~y-bs<^13{PF8Ibgr*R)k>;OS-v#x#`CBM9e9)M3Z59pGFKljFC`JYk%zjf`c9eGOr)CtD%k(|>DWg-pcUgycPnc|-v2M0q6 zGi4EReotCJc3Z%_zEJ^Hyt#mJ*T!<~N#II!Qly6Tnyp0imG>YxA#0vy;+y0Sf@bl} z!)p@~N(!dea%@S~q$7OE;L*CQnP)}We4h}M+d_DWKEu4&FSKCM(c4)ycpNGUU_?%- z2J81%Z$as`g$+7J!SP86$OSA*zc0l+O8ZFS2`OXT)D8vDU|d1m>k%)&x}JyNypBRI z#|Z4$l0tT_E{s|Yw5{r45j=2va#j-60$N5u2pT=OI7US^>ZNtF!L^cmeuw?h6RYp1 z<)#^Lmwly*U_v(|}7VqhXKW8~I>SKiAt5?lnMj%d?Uub=M1w_yh-1f48*{Y;LR~@1 z*Ot-1=C z4|hH0bh;iN@Q2xW?{Do(M3&o}%%+)1*^M1n74*Z8|6Rn9XV8aN)NF!>x4 z7XxCxP)kQd^%Drcb^Aupd%hpijwCwFfaNAaz%o=_3-br&TLt#!o`9B-nz)8#@c!M| zgc;c+?js^Y0x~jf1ihaolY<^IfiyDr|1{Yqp=<|)ei7u8SKFS~*F95e+B(1uNE|NM zUvir`cFmC&-dxR$XprJBZ1qx_(4_JziEyjuR0u=#m!C z5N*T^9-yx-WbTw~CT=Ar3XuZR{@m*#oKXTZ-?E#u${C=#Qj2d$KMv%~k5Z~Dy@J*U|uoMTtJFgs;=h^?Ptypt_KUsR*g1DWENu^;Xa!fbz)z&&xWFTi}8 zvcnS}r_PYF4;lUXY!%WTtc>qgVtH6c&|Vtxqc@N*N1Rd-SziN5w}qDw{}fE#Eu9zA?DE}ZL+{mKd@(}sT8W7qI%1-O24F5CzVlDUYGf3e)kqs*P=m6=Y*szRP>Iy z1(j6imk}`P>KXIgEs`9?CS}UAtD6|~VrKSMEKaD2OJ;&%PR(@!Zkz^;5npOC2K6X( zP9;ax=AimJB5qLgx?U>4+QB_RglSU`fgq=|G5A9qBO&*#XF*fZVB+aAnAB#u5)2w_ zP;Bs9jyF>2ny`SIc6@Gj=B9cAi4TNMr{9iNyE=$ zH0m!wm~R!4MqcvBh-dJGEa7>xY3;tl$9^k$9y;9ho_epggkmkY%~2%;lw&6_@f>by zCy#5oC!Y?Dmc~D2ikGPkw!VhJbUM_2-qd;yXIw@!k)Pk{E>K|r`$xg6d>8iu$ZSg^ z5c+FP)E1#D$YDp}9?;l`T5eW+XJj!#DVu7^cbTUd{p(xTJAY;<@T1%-pGqk4JoqVI!4AX((;@0rdH1OGetAflLNP0oOt+uR zQA%yiC^AzOp#3Z#**Vwi_!e*!1!5fLv!`c5Hk%ij@-Z#MeXhrXCM%KZxXIT;A_oEH zN5!z^(qLMTKnEQ_`W6M${ zQ3&E6E4vmvdV#mL3AFPvBY@Lv74wp&`baw8%n7$v$vB-N?pShbDf;{rY9J2#$j)?J z&`(lNlK`#`HQ568O?i;w74~yLYYf}ykiovfoe$kiq(X!37fT!US7mv7hwN zPMi1>x|J0or$){M|^MtM}*o2!g`6)HAiq+ z;qYyPR~aYK?AVsgL{4Tp#_@Ol#jV4^-Vu!BV*b3M-?n(mVvlf7k-gI$I=dZ6k@LJE z)~)%XRL(hb=a(dH z#i7h%%spS#HB5ZDUrj`0dGwB6XMh;c}FI{XWe20#qI9E(6}tU9MM}6}OOlyJ3Jv1&SbM3GbAcU1DBw{NS2w4eHQV@z;uC*u8pzZcSy@ zCH&NcI3!{WMvXKEDH7rr(jWbMD~e0{I8;BlI(fdwD4sazsipO?`Cx}jT)3-HjA9U2 zIId3E(BYCYA|;}SYNUb;re*YYad76RZQ^`4_2hjDb>d^%pMQy#5|;CI+nBtkSLFHm zwRG;}6b~+Jbs(_yBrc!UO}Hlr4WV7OSdQy#6WpQI?i@>W>tRH6E!rNKr3~2DkElozPKo%9PHlGt2(XqfFl2ZiRgbJ%Cb)~0D|SV^BlgPfIjH0%FgtTI1NZ$0 z#^an|H~!ssnD>pntJ?Y82w~e9mi#ub#Ml#KyoU?0r*5JgUnsdSVhT@@2_3SJ4?LCogc9IsRWVrC-NtYK)1&Zx(`xEvG2r&%UjN>X?g5$WW}Cl2ITA!6wVJHz zB%`N{4M+V8Ilp=JC-e7jI+hHS1ps!o{;js`Zi>u8y7%%7wyc9IT|g&cAsjzZRyjP9XB_e=Wt?ljHZv9RSP-B5^V?v(c=`%f#hNwIb>8{>Qqr2X7 z;p8>z+vMIhZP5b*xr+xs{Z6a#oZGHYX}|ESYBmkQ!zke_j<_JsA6%pT?zbhwVU0Z9 z4bnMUmZBaqLHm5jIzP5%Q|>LC5vg2K_$3OiF+9s}VE7b0$Eh(t-d=cO(<@5!|=M zowiSW1tHt#3A9X)#f?s??F>32xHKqjW61aYv=#UCNj}Hp%)Y6a^Ybga$gj)MLt2T{ zjq<4=1Fe^bU|g~4&6#c!xcbS@P@)eBSFAo-`HaapfJ@n5{DSErm zqYO;m2PZI}PfeLbGhWoweKq;Zx#Nr2OjN^equLCU__daVl$30}#!V5W<+Gwe=dqfJ z?Kp`=Z`DY3qm{wwr%hN{VCO%d0|8hEX4)V&zjc+y+ov~bhl@b7C}VGpHbwHdRIxaw z=T z7CJOBVPRyX6rnGG-Bep~W>&$*9R$)%r@$@prO;OsYYgs$)_a%j&8YPOSc@v;bFYzv z$4zYCDb_c9<4f7$pRK%}y!xIn_8XmXkBhgbIQOa5|z5uNf-2|D#Fs z60J(taiT+roQ=u)#9QWPo?-;?xP=MBi@>mBzULm4%_v@HyckvDtZU?5S1m9EDCw znWV7ls7+&`s5yTXG%sEwEbE|_cCZzfuu$EHC53Yd3fTf<1X97)$nN)*G*wPtUI`RcwX^<_w(2=hIWf8`k?n|K&;7NgBTALllsalC#t%9+`4~ z+8N_=Vz|E8C2ggJnWI6~}nMv)qh#PK>-oibb6KI{brp_b`))z(&@tQB`8fqFm z{eG8%F6#qg%KA|z7|d1j+VJRdW)U+f9;W~N$VQ{uausb|kHKt}*&d=*aNfwDljy2( zLXo7{K}(#owy3acXmF#&cxuj`tsXv;;KdetK<}>MBP>wb?-gKy9Jy`@n-aLLRUE;s z2V97wxIE3z7=FuiR zsRKL2c7TL(7UW9;iBVu>SH>3ii#SOtT3- zeLvDq4baUxy$NHy?ORjy;75&`%~11DCujuUB17S{krT1S;woo5s8+H*^mlD4`brH9 zu`D%G@Vhg;jH@V*w)^R!ur`+QA_;y41DNBRD?~sVMrNHh`xcSAq`NbMSf&Z%dKi8@ zSDkmsVzpuX52&=eDs%eSK}+kPm7y0;FhDyx=pCXb%ABoZ2zb=Di^Or#4agD`TcgEo zQldKjV7E7x@1s+pd%aJA-Z$0}qJeth25lpz)bw z$Lm)2|I+2a*X$pWSC4EML^Rv)c1|>Y`JNw8v}nq{^h0|K-rz1nL7qi^2@F{&Am6jM zSmOr{z-uAS$5ekmQuXWs=Zov~17!|aW#j#ciQKPWsZ`WQpjHLh_kuoL;zIrew-sYp zFKtLy36u+p<7huqU5V+ENK8)lXtO|ly$19sSw}p}=vJb(wt0v!4wqivKuixZ*(h$l z9ZyE)_1Vze_b9NefH5uXizof#lrxJ(S)y-RDbicp)}lLp#8s?x_tm8fZvFBXaGTdc z5tPP%u-)Wa8cxZ^k4xq7DvP^U7j%D?DF=7)Xq=Hso@)BZI#<1(5X2H-)XXo{c^-X! zS`w%KTYSoJF7mw>E3MVZCu}0(azB3#v~`VhnGB%P^O8-9yd%&|94qKGCO@&FjY`#s zFcepANdb9Ta4%7i*#1FEv))sSv2ywco;$_4;7tZ)gm0Wps^A>Bh$9?6XOEVrvq}{` zr$u~c+G7z{c$|`0n3F2*{zVrS#|((C+fx5))JbTk@As(a=mz=w!u-V%V{G130DHHIlEnJR*D1|=~ zEh|v7WJsBnQNs3e7q5GcR$2}XmYYKo_xJaeo~)6d?+Ac!weq-@J&D|yq&_*DO-&6A z6m70#e7jb0)-;KfT~?MI^4x3tp+AZ_rCl<&WF~YWhjuFvrlSoUDRV~YFNNdSJzBYU zEdW9j;$YV#FDe8lPc`+d(laxPAkJ?8^q8ej3@y0bHcY4Yz^-rd4qhFSxDbAqglt~e zGfz#!GWX3$u~hWpdwb#o;zjKOY5Gmi{~J|54nRN3*$hZ+AHA97<0IRkWNAv^Z+6sVIt? z$3)F)Cg!n3q@`$;s;R_SMIwoqiCIzeEFwfhTSE|`MWlxCrSIFG_x-K)t#5t*eCzus zD}Q9TpM5{iz4yNMwXc1%2Hs&aT**3zetz46vS-JUYs#Z!pgRAS_!$MG&*mRXYDN59 zn%}9f4<*vlnHome=A|@4{;kuNuqGzAXl7@AKYX4hN17R=>FQaR^MoxD=J2Iv4xcoJ z8Z{%m<_=&&cj-ng^i;DQ^{t!AXtLd*es)g4i@V?LSny?t=YJxMC!4pWcb37wVk5U> zNh})O_D!xtTz&4}OS4NnhJuG>5}MEAM2j*%YpCHnF@cW)c9poaUEpk@@@#!+L$uFq zO0KMyx?&;mm4C%NBxpZtD4k^+0IwgkMn}c-9Ot@0klcWLS9l3NquZr_(qa%2h2rK< zcgbt`04`#}YRO7(=Aq@Ke4?eJ3X~SbJVI6|Iu@q~0#RQt72jeWvxT~{MD&K{5VM~S6K*?YiI*F~AFah+U5%tLcqa;;dTMr~ zdb(^c)HxL#(%oJ`g4GgFsT7HV1Vz7$Tgz7H*}90?pg6`Dv`<$oRzEI3h|!j_psOfP z+;BohPTN@gZv$YC;Kl0}sHL1Pq61yQlpw=l`ckjVgdmh0zmikJo&^VueHrS1&D3>k z)$6?N^G>(Sua**686Lb`vTkdQ8h^uLRola`iA9fK!s`)w>`*&jTe9n3YjrSci4htX za8MZBXNyHa`L-0ZQIr_viCYXgMq}3p?j@KH;Nwn%6^yjhO zn9GstC}wrBAP-gbxL{Jr?9N_3xRAf8x$X^&-mzzM8~n-8HYg;sV?@P*+h$ZfQnZw! z+w7(@LJw8dprk&hmeyDN9{gafpuYE%?lMXHis$+y)MCvKig>koMPx*&((|-# z$~R+Pz^Hsr>Tlp(rx{G}8Bq|=BcAqi@i1ldRM*13an zAC?>C3!pc!y4kG)=&{1NiJWt%`tHkc;;OJc%azbXLSPc4Fqbx;=3r<}#jua);7bv9 zV{vA)*t{`CvM&CBoKHY#!u#|XA(fMH-6a|TggOVl&L0jOv=a)PnRBEC)JNa-t1yLUe5p z%V-UE%RMHmtv6nmHI^2qAeeO79%jf{y3rS?ho+=}!Y!4#0efJN4KK_`D{ILso8jLq zGJqWE2Tl7e&#%ZEyZMG288HSL$={)?U7B2YM%4}w{q7ZcSJ!W1WOQheh!M}fgeG@e z&n27S(k8w;(m?AfZh5uKp|?Kla&jHz{ff-kL^2$DCDaVU^hMp){a0huwNikQl`2rr z^3uzFfa~Lmn-=QxeuBOai~jmD4y^@pQu3S;5 z9+XD8U1Nnwu!|BxS2UP$LX7x%+nrivZu=+^GtbM#mG%Zj3X>ZkVkUwzXlsTIZ%bLM zn(MNxa>;ieZ|%hQS(UR`8(g*WH<`Ao{cz>nw5h9yrKxvUjq=_Nw>Ux2x0!r*7s>0E z3Bhfp8PLMI^?MjdX-8c|;jVCUe6>bQZ2Sv-T%*02!DnCLZ!M;oBBzRlgN+Wei%Cci z)EBnE{+>}8AT7WGG*)#G`k={83|B{#)Rq4trkDqIS?RGqGJY5Y4t+8|XDL}b3HpXz zYLUp-`*&VN-si4~ObyZQR(xb}yoVMcsIceeUQ}iu@jYTvO3W&|xcAceca8Z>11}Sb zzRrK={E2El2^GaU^iEZVHP`uGM&x)&4;FjD{zVx;WH587A=C7d`+|09*scfGDY}=Z zQ__=BHsq;`L_31&W<7s%LCdw1xEc>U+;Q@Qf*OU}T~n(j-2MXk`PbN02?-NPa{K9lifjOf1nlupPpMsmbJ_%~?*YDcaHTQa4&s!@{!d^%R zjnM_0Ej96{lR>^!lM0&FlR|7ja(M;$?iy-uwEpVJ}!4`1#Yaug-Xe zG*Gl8OkB`z!ZNw3ZR}Y_n{b$7-C}hu^RaI=EVa_6j>U(CT@SkBf&JspEP2iBwria> zL@X%P?67GP)D_zwzcK~%4^FKOc$%i@Tg$0cYc4A7J%{Qte6Xl6;~G&6P!kJ2)O@je zxxw1LZ7<%nSpH^`3&p1x$YFLJ;l7n*p83bbT2~Sq(<%+xfnC9;E$A0N6YC?MO0RbB z*_c+>c!#ua>Jv0zEi>nZ`YLNGJlz_4Tg7c(nFsHESn*yQ83E=G`4K)l{IA9}OOo|H( z#qZ@@V&b3+>ik!3FI>Ec^rOf+uN#av%2LuJO56QgSyZ^Czvxu1&dMHLF&%WF0;Hiq zMrV7%#HF(axWKhm4M2~>6Nqt6+yNJ1|0~%M8h3jYD1S^!mlgp%lK%VFtsSZ0^6Vme z>XWgSR};x|1w$;Y8gHUDgnwG=?d#NYrx*M5jZ8NuuTn@&UPMGu*=Zxu#pO4&Eaf93 zO*=(X`YgDuTV?Z1*ZQ=%`~8u3M`acdu#&(zED8)jRMn`@paL~KNaOYx@(W}12Xyd8 zVPWt_*OxQi1^LA(5ccr{HgFWWM2>+@#5}?c zOQfz!vT?5jfuF|8sF~-CNmyv{2#{Sbos!5fTmOnk72jK+ToK5nqjl- z|C}fPgJ%C<9fkk5y3+rzNb_G6%C#NK0{`g_eIkA7dhE|tA3OH{TTT1FueyWW%>Sa{ zKN?Sd<``1|?HXmOCtJ=NKMMg<=ilkh45xa=#vuLYwG8{JC(CRRxqW?x$TjoQOC=vv z$Y{Hk#+`4KgZmz>OT*R<0&{*02kKOVnY8O*)xa&D_CF2(0MiePTfia0)K6-QOL<}T zI!vB53kxgSlg5j(s?9R{xuc)V@poEl!-F0 zxaDfv-SRLmX+fd9jkNxr1RnbzI1;m5TE8~_GD-BK$feVXk3aE)+aebG&4eyXwXw6Z zvZ8%*{baq2?UQM%B5S3*D0AT{73il=YJxX6#^FQOHHS%w#75b^vaN03g-9Bo4A1=K z{0l<6?Ck7jxN4`h`S>XUv(v$PI${eh{gE8Hy5RjS151H$6$xw*IU1csKxtZTxyfcy1k+M)7pT801&P!mKb!w%ex{^Qw+ zlPA|k{XQ)+ChoMR^WN7Kktu4l-JnoFzQ>OrXG7Wz9op4C2f@GJ5u<{z8&k-foXZGo zRj6sy)vflNP&;kg$7%w#KKKsKm_c?qCe?tS8`NUreZi`*F(q`}G(5a9P;gkrwTP)7 z(fopk3vjjKod~dWdE)0iET0~vh>iA~JY5aVj+`HY&K!TRwKTN$Rq$GKNaSAuR9TDZ z;I3M|kp~0;s8`KQ7%|LNQ9*mL=b%+#<0jobwy06Pl{%k&(pneTA6n33Id&eqnJnS;YyUfBfGc`c5bPIF&JaWKZJPa~?O1%&!#6^ow1R`h!F}@?%x+8L$b&r&~-xJ`Fl* zjXb{Y3nBg6a_?6hhO%mRW)FnCCwZh!aH_^5U3jgSxl`Q85O zmzhPcYPe+M*C@N4Ml~17j-KsDdyPyJ;X*C9VLkKhuXS|x?TJ`@c$74RDT>k0g2Ywy z&{n6=3y0EJnPr5DQPRZoCLclz*5=(E!{7$@$QSF)jZMSDM|MF3)%9lGmXVP7#jfyI zN3<66^Yafp?fkA8 z$@EoZIBiw2_zNtiA*F7kf@~)Pz3a-^l44$F-Zwj0YD=ET`E7`G<;_b^(9EC(txv!* z1VA}%f$p)Kk!5@~;iXTX^R5F8=;S`8c>qkZ+YWTrPw#mJH%RCbCCpS0N6Kyq>;#$< z@?7RT9|<4vRZ~WChm%=@Aom5@6l}y&5uPFKvfX98W!mEIaILEzS>G3-x&50K*Gu30 z>RSKg4C0^Bx3E>XXFEbEGQ6Tx;yp8ovZ8$_{2}$PKrlr0n|ILH_s6OFhd2+Dok2)^ z79AG>kzzs;;K>2teJZ zt6We3G_aDwvbeCYJX)ZUr4(95n*A-2WnYqNaLZZi493pvPQ!C;?b9$h#oJ{tCfK?g zoq5o14i+5}h+C=lOh2FhW_{zu_**@z5+a->>%cb4?4~SR?cvGfW;N*@c`o_g6Cwj# z7v3JDRE*{m+ct0<*x7fK4cLPD&jaeKtI*d6`giB9R|6W{IuzS%GIVy=_XT7^XQK{G z^up+O7F+f|;y&m8v5Lo}9ub+2#j|aFK~-<~k|(}&<#KxNYbM`tZEg9w`qk>3-W}=; zZA@E$Nw=8JlJ|c%KF;aJ7RJec*F9g_Ti-g+V66CoK9e(l^(sC$tF4F0Af1hf&l^QL zfypHiEH`&>4QKbax6)RK>l2@Ys_pqQj^K&=xz~O!wfv%G`K!PM1%oV^pjUSX^pURW z=Q^JWxk8G59BbG4>$RiHn$;8ev3rp`1Z0uqZ23oBZ~cKSo;z z;5}m$I!k||rM&$_>of%s7|%gNE$19+$aZ*2uNHi6tcEu0@}39Odi#;4;j{}#l2T|p)+F7NN~Y79)<6ucQU#gvzgO1n4*(~gf(y*%FUPh z2w$J?vCW7E%=yf>YR`gx?#z?T3dcoV@`F|AN>_}Q8Z6mlQ6T_%HuRU0oHm*WdO&Q`LkuMyVOMgV?0#5_A!ECJS|t`)`SgwK&qEr2Uc;#@2lDOWA6% z{G4nSZT1|Z`*(nI^eNOMJ5PraUaKCC!op3B*Y#-rah!%CGB3oPAz+ z=6eRs@e+L)tRaj2R5q%TZvM!=?#4&ihqhJ(iy{(cpP!+WF(e@Ja|_eDXWMoZwAX2` zPFK4cw^QA57_KzJto~Sth;+eg9xfNH`>{&Z1F zY4vbb5g*?TEsxQX89d(iDL)URQu&JQ$JdgL)h=1BVTU}B zG`Vwqt@duagHZLPh)=Ed)Wb8&$#w;M^U*!Dk4bSy^?09>ZhH&BR;(3aCf`*xF&vY< z>f((*Bc4cDzz;XaaFp(SCYgf=G8)M+OGWq9j_g}P-ibgi8$RUjpNV{v=1nSX+D1bX zS566kd)k99_X+syRwJ{9H;`?GVPfD8$~`X$vZDeUv*p|wa$|3s;!vPOOxCyYtt`7w zSy4d7jy<`gBF|`Kbotpm7iWZfyC~LuVVg9}LxH$YT0PBvb1{ppZ1c6n_O7ZrZT{<1 z-lpDNU3#RJz3MpxSCZiBp=E>Ofu;Z)OXhq%qHP<*&|4?wjYJfikb#p==Y%{KlzmsY z5x!fO3(wu5V0^Id?*L`c5pcM;q=uRA<#!nbCFMI!)*Fc%h(V+Cm_t)i@RIc7E%k=T z+_(F7{%2ul|_|zn)UC&@*{$Za_uj0FF89qFB9yc_{Lz$1lmG8CN`G;>@}wQyCo>7 zITx{&$Sdnv1jJY^#_6!YOf-e;!`vs%8xFnLntFcq{L+Pe{nO5!t>@lYUZMGxE z{t`CQq2B_l={7gFbkP4ETX0k_NXfw=k;B9`t?EsUt4`5EM^yk=ZB|LP^0k|Gq+w2c z`&^s&h5F^Bq*`WgkEh)F4f^|Bt5xQFlZeC2LJPK7b?wUC9yiW7^=<*2EM!*&P%@)$ zn=2y7^+!y?qA(H7hI*}fdL^Rv1>0y@{>_V#S_6B`zJtH!gm`5lN*aMPZZ=) zS?qDXqBW%O>`qF~y!j;@Z8=dc?b0v#xhFR-9FRVi$~k8mBkCQ<5A~lomr=$TcM+#F z0VT!-Q%nqlOsw-pA3u5O0v{U>d^mx(@k_kuTHR9CmrQV4(E8)Bzb`4K{uWvfY~d^N zSV=gO1X8T&^;DZwve9eFl?~g(emACg0q_-MWi%S)n)dKMy~Dc{W6ME_NH^{x&LMZ= zPgftl#)|nTZ7ZmW?yQ-W(H4c}^>U)JODF&hS;w{W;k3n!?MVvBd_=(oWMNjI;z4XJ zlPSn-Tcz=#%J6dTo2lX}+2=W85?VxQLl&Cn-rjwr97N58t}v3?#@7VM?z7jaXN>4O zaz#q}DWwKF=}|T)`>(F)lmQpW1X6fWCj2L%{T>W$RqR=5mc&KM>fyI@n!U_TfG@l5 z-4>^<^4mo%HchXq@wk2%dGYs?7EP`!*JH>Td+JBFa>)yz0>DoW>93w z;H7X}(oLA`Q?|0R&Y8i{I~#N5Cs{cc%6XiLnPX~#-a_Ahgak{(ca*a*ik=m8`G+Y* zJkpGqxyT|SH7uJ+WlU1I9X@MgmXoq>QkUgn{Eimax(7BmX!sguEwUnPb<`segT)WX zY{V&8HSYRBVNFa{OC6x?@6j`XN9YqnK@t!|p!psBW!ko?FX8Q-0>$q=mmw0Lc}Rg< zUfv?bW$ol({tnaHrh@ZlKPjCjzICTQ)wD08OKjf4v>MZcf zh(f)RdM%e+bsH?~AOoBaX2a;pP3u7pllP=>(=f7q^8z9Acp^V$nAQ zqPC3Cp8@fyyBdxcoaPwP7woV%Xp-~4YJ`4fn*}CA7j^IMIn@9{|lCF zX6(!mtBSu;B;%V1FPNo#CUfMQleh@*^q|qrt-2_W!vC1}4KHW&Lk!vn-z;1m{2nPP zdw$s&?!J?jB)j{ZsyAd1ASW%AO1_BeCaTyvlxw8jl&^pX2041No`U_33lqx?rnr1# zo0ZZtB5ggh%aPX$gwCN_b{bCXz*pWLaCx0lOjlnLpQp8dfuKlE&)3&XyN}vIepvqc zJ3!=|a_LL)7ELF67)l_+cl_{#=Mxv#e5MosfZC z-2Me{`CWJc8Md&=0XyS;|p0UGk<~Gt>YXEAp zvFnXdCcZ&sG>2_b!vj^48is9r_k=yZ>R3)yiS_Y+OYKQmlPnmvhcaA@&RQ^M;ZcdT zda8`=R29aySql@u4yThssY92u6$Aer)Pi@`Dm#m#t|t#F*Ljha(hm8VOa`G`QTY$( zQdsLtp(if4>#=3>*t(s=gJczvKfk0+eoRzKjoYw!1b~c$8Gtl_rCaJt~QcF1Ce6SU!$#UOkN2 z--kq-a+({rOtG^Ysad>}8G=xFAQg8l{4JEQAnjPG-hmvF)_lIZJ+OLP{Lyit1)IWO@eq(0G=3w7` z_-xLIQ<*d&JMyjvEvq&r>S||mo6tmGZ||rw{bS)D=Y^)Ojxsa2995}XzBiJQ(qw(U zf8iXm$4%6h_|b$nLjgkkwobi8uk*h2wUVMHR$|vZA1}9Msf0zFg+|mt_o9L88~}v1 zkA-8+`B%RYOc94z%F1T~YGxYl7zZEOGl0g_5-^=$QK2ax7g?J0Wxysf`Q(+vT$iZPVl|Z5G24$!d$kdg?BPw4(sU*wpH3Y#q0t@M}GgV=a%~} z+Vv}Q$AW;eO*WeTFEnV|x6sh09Jg0OM>U$BqXtQ*l@1aBPE9MsIIY#mkoAB^9$8AC zy&=`Y5Bx1i1!`gCM;pWzdt}3L)Rh@x3*30|f$igwnXC|S_I1J~DerW`Z8Y)3*5D^Z?kv~9%-K98ZF^N*=P$vLd%IG{V_?8xeK)tL zl;(T4l7z`aAJY-_jb<-+jyreopSKYd+Nq<%ZTwuTHfvl!OgMaFM1bTp$rc|UpE9sm zrOim-k=DwG?7&)lUMq0_`RChJJbLDTbj=5^PE?NYz}meR?toGzPs zBHTQXqQ@nQ$&$5XHwucah-MBi1mSAG7^m%V93f`I8GaxVrOI`c+d)eikS((vm8p*l`N7y`Z<}3N{FCVQ|`-eC$Qe z*M1K(*z?Kg*k|ZTlZVEd%ja-k1I=iCEvYq9ogS%f-=N#`sMGijdK7*~)POJ5opDux zY-qej^`+!PPS$SI_JbLiGnB*?_8R5u=H9pY;BKmi=0-Q(nC$%`5#37uqb#eZJ8%0K zh`z48N5ukSv^ZdX7$%YtQc)dD0fK`@#jqb8Syhh?>21_xbyw*gCM5Q60AS#a7<%heBrbBvo?Ah*U=^F$USybs#Y+dwxcqy^2sL=6beGL)}H~iF$fBZhK~~Q zLgU5T3$j)X$WKK9T@^E@ZY|R1YQ9}ENJ3Gs?|qNCts7pPzrOcZZ7)h|X#0I!c?rE0 zi-#=V;L6;qye~OqCI3rx#_-O0i8R+end-7cSjXU{Ap9{r+PX(YC96*$a$&64MC-0! zQlNQjUbt%x)Ajey2dB}b`O-yLC~x@6&8S4#E$!XRMZebFB|heaN8{<~=@3%o_uXBj zZBxkVbT#6{Ns__~9~dk_LFD>u$a+PPU? zd1#v3SSbIQ@T>Ju{;E*vw`b9;xa}eOk;ScJQtgIG{K{*u5sqE)+6;rK9JDzyg;WQo zukRMTezYe8$p)u!we4|aCHTKmz9uSaoh|1Jz`-Rq>GV)fqlDd2mEDDEr&9({3%^zWFbE@*?1naI+F6x#$XsubGogh- z5g7uRrLvlc8d0qZnzmi7)$?DZWxp!G>CzG)=9Tim$Sh=k%@UKa2!a|{{c1xjqRd$9#QdM@y*^%?K{S9=jD^(F;UKdil2DGxu;=NNM&Xi|T zT9eGzAvFe5k)N4(Sf(l|N5M^t752WjRCc0B=RC({d1EGW1&m?iTH9h)6LzTwTRhd< zl&ZxTIBLJ?u1dNMfAv?hBRz4I&u8!n7xp#>%4>1308Y2q7Vy#d4kkNieC28p>6mSB zB)GP0zG{F+7*yjhd;ucml&Y(A3mKC8fZ|(__0J`W+!`9c)uWW2L(b4j&g!{i#&na+ zy2@bYx7s)5L9EU$U4yq=Rie8S`4nVb+^EFh9kRolx^K^#D-Z^hi%jq#>flL_#MLC8 z-N5D1t4e?M_xD#(^t0c-{R=EjxagJ7%_e5mJkdHik)9sF9(#JLU}t%fmI-~R2~)ky z#JCYE5;-<~N~tyA40^&a8`A$xhi9zPuR(E$6d?m%r0bNW;mQN>5ivvHdFDO1XKf0r z#+v@28EEpc>oZ*wS3j*(A&%S>H;iRgUBHn^B8 zw;9PUhx-7#xBR|cW(X!{uPScyE+Iibi2;l>jVg#@dM8lQjeb1`gD6j}Q{J=9UAKR= z0UXQm(LZL6G!+Cd7)O^p(40gURu7{Jblcl^c2BaNSshU|t9dl<>ix0CG8^lKdwP=f zuFB&tMXbMABgc;25?J@w`?bF{zruJ|1epYDNPob`=1}lLHs V?u79J0N}^xbu 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 VP)rX+zKab-ML|=(O4jWA{{r-IpBVrE literal 0 HcmV?d00001 diff --git a/docs/guides/slash-commands/images/listroles1.png b/docs/guides/slash-commands/images/listroles1.png new file mode 100644 index 0000000000000000000000000000000000000000..43015e203c1b79af5fac7729585540cdd22b28ee GIT binary patch literal 38224 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⊂kc16iuMeMg8%sQx6aC^_$PXNs@#k{zB=NL{ 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

E+-!R0d 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 literal 0 HcmV?d00001 diff --git a/docs/guides/slash-commands/images/settings1.png b/docs/guides/slash-commands/images/settings1.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb4d711ab044287eb2d5fe817128f05c4bcf89e GIT binary patch literal 76171 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 AQUCw| literal 0 HcmV?d00001 diff --git a/docs/guides/slash-commands/images/settings2.png b/docs/guides/slash-commands/images/settings2.png new file mode 100644 index 0000000000000000000000000000000000000000..5ced631349fe993587ad5cfb6edf8a1e35bd4c5a GIT binary patch literal 51089 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�`D43VsX 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�e0u`G;5A3a*;Gt1TkB~SBw@_XQeUQ+6$n9&f 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 Od8EY^#A-y0g8mQwMWa*z literal 0 HcmV?d00001 diff --git a/docs/guides/slash-commands/images/slashcommand1.png b/docs/guides/slash-commands/images/slashcommand1.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4e0aec70b552b3323fc76d35b239c110069f24 GIT binary patch literal 10886 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 Pm^tEPcllz2jep8tI8wuE literal 0 HcmV?d00001 diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index fa3c1a362e..671ce4043e 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.4.1 + 2.4.2 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index f6ad03d32b..5436dd4500 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1081,6 +1081,21 @@

The channel is a news channel. + + The channel is a store channel. + + + The channel is a temporary thread channel under a news channel. + + + The channel is a temporary thread channel under a text channel. + + + The channel is a private temporary thread channel under a text channel. + + + The channel is a stage voice channel. + Specifies the direction of where message(s) should be retrieved from. @@ -3934,7 +3949,7 @@ - + A or . @@ -4933,18 +4948,6 @@ The choices of this option. The current builder. - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - The choices of this option. - The current builder. - Adds an option to the current slash command. @@ -5024,6 +5027,19 @@ The built version of this option. + + + Adds an option to the current slash command. + + The name of the option to add. + The type of this option. + The description of this option. + If this option is required for this command. + If this option is the default option. + The options of the option to add. + The choices of this option. + The current builder. + Adds a sub option to the current option. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs index bf76336608..18e383cef5 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -52,7 +52,7 @@ public enum ApplicationCommandOptionType : byte Role = 8, /// - /// + /// A or . /// Mentionable = 9 } diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index bd6337f89a..e80ab108ea 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -202,19 +202,19 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t return AddOption(option); } - /// - /// Adds an option to the current slash command. - /// - /// The name of the option to add. - /// The type of this option. - /// The description of this option. - /// If this option is required for this command. - /// If this option is the default option. - /// The choices of this option. - /// The current builder. - public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool required = true, bool isDefault = false, params ApplicationCommandOptionChoiceProperties[] choices) - => AddOption(name, type, description, required, isDefault, null, choices); + ///// + ///// Adds an option to the current slash command. + ///// + ///// The name of the option to add. + ///// The type of this option. + ///// The description of this option. + ///// If this option is required for this command. + ///// If this option is the default option. + ///// The choices of this option. + ///// The current builder. + //public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, + // string description, bool required = true, bool isDefault = false, params ApplicationCommandOptionChoiceProperties[] choices) + // => AddOption(name, type, description, required, isDefault, null, choices); /// /// Adds an option to the current slash command. @@ -356,12 +356,12 @@ public string Description /// The built version of this option. public ApplicationCommandOptionProperties Build() { - bool isSubType = this.Type == ApplicationCommandOptionType.SubCommand || this.Type == ApplicationCommandOptionType.SubCommandGroup; + bool isSubType = this.Type == ApplicationCommandOptionType.SubCommandGroup; if (isSubType && (Options == null || !Options.Any())) throw new ArgumentException(nameof(Options), "SubCommands/SubCommandGroups must have at least one option"); - if (!isSubType && (Options != null && Options.Any())) + if (!isSubType && (Options != null && Options.Any()) && Type != ApplicationCommandOptionType.SubCommand) throw new ArgumentException(nameof(Options), $"Cannot have options on {Type} type"); return new ApplicationCommandOptionProperties() @@ -376,6 +376,54 @@ public ApplicationCommandOptionProperties Build() }; } + /// + /// Adds an option to the current slash command. + /// + /// The name of the option to add. + /// The type of this option. + /// The description of this option. + /// If this option is required for this command. + /// If this option is the default option. + /// The options of the option to add. + /// The choices of this option. + /// The current builder. + public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, + string description, bool required = true, bool isDefault = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + { + // Make sure the name matches the requirements from discord + Preconditions.NotNullOrEmpty(name, nameof(name)); + Preconditions.AtLeast(name.Length, 3, nameof(name)); + Preconditions.AtMost(name.Length, SlashCommandBuilder.MaxNameLength, nameof(name)); + + // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, + // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand + if (!Regex.IsMatch(name, @"^[\w-]{3,32}$")) + throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); + + // same with description + Preconditions.NotNullOrEmpty(description, nameof(description)); + Preconditions.AtLeast(description.Length, 3, nameof(description)); + Preconditions.AtMost(description.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(description)); + + // make sure theres only one option with default set to true + if (isDefault) + { + if (this.Options != null) + if (this.Options.Any(x => x.Default.HasValue && x.Default.Value)) + throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); + } + + SlashCommandOptionBuilder option = new SlashCommandOptionBuilder(); + option.Name = name; + option.Description = description; + option.Required = required; + option.Default = isDefault; + option.Options = options; + option.Type = type; + option.Choices = choices != null ? new List(choices) : null; + + return AddOption(option); + } /// /// Adds a sub option to the current option. /// diff --git a/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs b/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs index a3b8ddd5b8..c05df7cb7a 100644 --- a/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs +++ b/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs @@ -27,7 +27,7 @@ public static EmbedBuilder WithColor(this EmbedBuilder builder, float r, float g /// Fills the embed author field with the provided user's full username and avatar URL. public static EmbedBuilder WithAuthor(this EmbedBuilder builder, IUser user) => - builder.WithAuthor($"{user.Username}#{user.Discriminator}", user.GetAvatarUrl()); + builder.WithAuthor($"{user.Username}#{user.Discriminator}", user.GetAvatarUrl() ?? user.GetDefaultAvatarUrl()); /// Converts a object to a . /// The embed type is not . diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index c071b73427..ded04a0669 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.4.2 + 2.4.3 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 21e74b4bf8..6ab4d7ca21 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1718,23 +1718,36 @@ protected T DeserializeJson(Stream jsonStream) protected async Task TrySendApplicationCommand(Task sendTask) { - var result = await sendTask.ConfigureAwait(false); - - if (sendTask.Exception != null) + try { - if (sendTask.Exception.InnerException is HttpException x) + var result = await sendTask.ConfigureAwait(false); + + if (sendTask.Exception != null) { - if (x.HttpCode == HttpStatusCode.BadRequest) + if (sendTask.Exception.InnerException is HttpException x) { - var json = (x.Request as JsonRestRequest).Json; - throw new ApplicationCommandException(json, x); + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } } + + throw sendTask.Exception; + } + else + return result; + } + catch(HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); } - throw sendTask.Exception; + throw; } - else - return result; } internal class BucketIds diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 618dd87e7c..38ba942758 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -1,5 +1,6 @@ using Discord.API; using Discord.API.Rest; +using Discord.Net; using System; using System.Collections.Generic; using System.Linq; @@ -341,9 +342,18 @@ public static async Task> public static async Task GetGuildCommandPermissionAsync(BaseDiscordClient client, ulong guildId, ulong commandId, RequestOptions options) { - var model = await client.ApiClient.GetGuildApplicationCommandPermission(guildId, commandId, options); - return new GuildApplicationCommandPermission(model.Id, model.ApplicationId, guildId, model.Permissions.Select( - y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)).ToArray()); + try + { + var model = await client.ApiClient.GetGuildApplicationCommandPermission(guildId, commandId, options); + return new GuildApplicationCommandPermission(model.Id, model.ApplicationId, guildId, model.Permissions.Select( + y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)).ToArray()); + } + catch(HttpException x) + { + if (x.HttpCode == System.Net.HttpStatusCode.NotFound) + return null; + throw; + } } public static async Task ModifyGuildCommandPermissionsAsync(BaseDiscordClient client, ulong guildId, ulong commandId, diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 192ad4a43a..1305accd16 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.3 + 2.4.4 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index fb2082c2df..344d7ab200 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3334,12 +3334,6 @@ The data associated with this interaction. - - - Gets the original response to this slash command. - - A that represents the initial response to this interaction. - diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 44a60015b7..e67029351c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -50,20 +50,6 @@ internal override void Update(Model model) base.Update(model); } - /// - /// Gets the original response to this slash command. - /// - /// A that represents the initial response to this interaction. - public async Task GetOriginalResponse() - { - // get the original message - var msg = await Discord.ApiClient.GetInteractionResponse(this.Token).ConfigureAwait(false); - - var entity = RestInteractionMessage.Create(Discord, msg, this.Token, this.Channel); - - return entity; - } - /// public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index 385ddf945c..d62f1bf589 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -32,32 +32,76 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) if (model.Value.IsSpecified) { - if (ulong.TryParse($"{model.Value.Value}", out var valueId)) + switch (Type) { - switch (this.Type) - { - case ApplicationCommandOptionType.User: - var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; + case ApplicationCommandOptionType.User: + case ApplicationCommandOptionType.Role: + case ApplicationCommandOptionType.Channel: + case ApplicationCommandOptionType.Mentionable: + if (ulong.TryParse($"{model.Value.Value}", out var valueId)) + { + switch (this.Type) + { + case ApplicationCommandOptionType.User: + { + var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; - if (guildUser != null) - this.Value = guildUser; - else - this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + if (guildUser != null) + this.Value = guildUser; + else + this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + } + break; + case ApplicationCommandOptionType.Channel: + this.Value = data.channels.FirstOrDefault(x => x.Key == valueId).Value; + break; + case ApplicationCommandOptionType.Role: + this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; + break; + case ApplicationCommandOptionType.Mentionable: + { + if(data.guildMembers.Any(x => x.Key == valueId) || data.users.Any(x => x.Key == valueId)) + { + var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; - break; - case ApplicationCommandOptionType.Channel: - this.Value = data.channels.FirstOrDefault(x => x.Key == valueId).Value; - break; - case ApplicationCommandOptionType.Role: - this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; - break; - default: - this.Value = model.Value.Value; - break; - } + if (guildUser != null) + this.Value = guildUser; + else + this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + } + else if(data.roles.Any(x => x.Key == valueId)) + { + this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; + } + } + break; + default: + this.Value = model.Value.Value; + break; + } + } + break; + case ApplicationCommandOptionType.String: + this.Value = model.Value.ToString(); + break; + case ApplicationCommandOptionType.Integer: + { + if (model.Value.Value is int val) + this.Value = val; + else if (int.TryParse(model.Value.Value.ToString(), out int res)) + this.Value = res; + } + break; + case ApplicationCommandOptionType.Boolean: + { + if (model.Value.Value is bool val) + this.Value = val; + else if (bool.TryParse(model.Value.Value.ToString(), out var res)) + this.Value = res; + } + break; } - else - this.Value = model.Value.Value; + } this.Options = model.Options.IsSpecified diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 337f60f623..c3a6a8221e 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -140,9 +140,7 @@ public abstract Task FollowupAsync(string text = null, bool /// The request options for this async request. /// A that represents the intitial response, or if there is no response. public Task GetOriginalResponseAsync(RequestOptions options = null) - { - return InteractionHelper.GetOriginalResponseAsync(this.Discord, this.Channel, this, options); - } + => InteractionHelper.GetOriginalResponseAsync(this.Discord, this.Channel, this, options); /// /// Acknowledges this interaction with the . diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index b8e646e045..3864e24a2b 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.3$suffix$ + 2.4.4$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From c18c799acab7b80324203dbdcc646153fc712cd5 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 7 Jul 2021 18:46:34 -0300 Subject: [PATCH 089/494] Update README.md --- docs/guides/slash-commands/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/guides/slash-commands/README.md b/docs/guides/slash-commands/README.md index e69de29bb2..702aec6de0 100644 --- a/docs/guides/slash-commands/README.md +++ b/docs/guides/slash-commands/README.md @@ -0,0 +1,11 @@ +## Slash command guides + +Here you can find some guides on how to use slash commands. + +1. [Getting started](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/01-getting-started.md) +2. [Creating a slash command](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/02-creating-slash-commands.md) +3. [Responding to slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/03-responding-to-slash-commands.md) +4. [Parameters in slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/04-parameters.md) +5. [Responding ephemerally](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/05-responding-ephemerally.md) +6. [Subcommands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/06-subcommands.md) +7. [Choices](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/07-choice-slash-command.md) From a50fe6689baf1b120909f6f70d8eb4d847f0b754 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 7 Jul 2021 18:48:54 -0300 Subject: [PATCH 090/494] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f99f3ec4a6..e4bb7f5bc2 100644 --- a/README.md +++ b/README.md @@ -116,4 +116,4 @@ await Context.Channel.SendMessageAsync("Test selection!", component: builder.Bui > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. ## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From 8cab0f90e78a0cd2f6c8200429fdde7fe0197d17 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 7 Jul 2021 18:56:16 -0300 Subject: [PATCH 091/494] Update 06-subcommands.md --- docs/guides/slash-commands/06-subcommands.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/slash-commands/06-subcommands.md b/docs/guides/slash-commands/06-subcommands.md index c4481bfd8d..0fd41d12c3 100644 --- a/docs/guides/slash-commands/06-subcommands.md +++ b/docs/guides/slash-commands/06-subcommands.md @@ -1,6 +1,6 @@ # Subcommands -Sub commands allow you to have multiple commands available in a single command. They can be useful for representing sub options for a command. for example: a settings command. Let's first look at some limitations with sub commands set by discord. +Subcommands allow you to have multiple commands available in a single command. They can be useful for representing sub options for a command. For example: A settings command. Let's first look at some limitations with subcommands set by discord. - An app can have up to 25 subcommand groups on a top-level command - An app can have up to 25 subcommands within a subcommand group @@ -132,7 +132,7 @@ public async Task Client_Ready() All that code generates a command that looks like this: ![settings](images/settings1.png) -Now that we have our command made, we need to handle the multiple options with this command. so lets add this into our handler +Now that we have our command made, we need to handle the multiple options with this command. So lets add this into our handler: ```cs private async Task Client_InteractionCreated(SocketInteraction arg) @@ -157,7 +157,7 @@ private async Task HandleSettingsCommand(SocketSlashCommand command) // First lets extract our variables var fieldName = command.Data.Options.First().Name; var getOrSet = command.Data.Options.First().Options.First().Name; - // since there is no value on a get command, we use the ? operator because "Options" can be null. + // Since there is no value on a get command, we use the ? operator because "Options" can be null. var value = command.Data.Options.First().Options.First().Options?.FirstOrDefault().Value; switch (fieldName) From 794ae13b1c1976aa83241110d19a2ec9be237ba9 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 7 Jul 2021 18:57:04 -0300 Subject: [PATCH 092/494] Update 07-choice-slash-command.md --- docs/guides/slash-commands/07-choice-slash-command.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/slash-commands/07-choice-slash-command.md b/docs/guides/slash-commands/07-choice-slash-command.md index 4dbb7b7d3f..53cccb39ee 100644 --- a/docs/guides/slash-commands/07-choice-slash-command.md +++ b/docs/guides/slash-commands/07-choice-slash-command.md @@ -1,8 +1,8 @@ # Slash Command Choices. -With slash command options you can add choices, making the user select between some set values. Lets create a command that ask how much they like our bot! +With slash command options you can add choices, making the user select between some set values. Lets create a command that asks how much they like our bot! -Lets set up our slash command: +Let's set up our slash command: ```cs private async Task Client_Ready() @@ -78,6 +78,6 @@ private async Task HandleFeedbackCommand(SocketSlashCommand command) } ``` -And this is the result! +And this is the result: ![feedback working](images/feedback2.png) From fa5cc9adafe5459663257f88b7010f2170ce4ab0 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 8 Jul 2021 00:21:53 -0300 Subject: [PATCH 093/494] Update 06-subcommands.md --- docs/guides/slash-commands/06-subcommands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/slash-commands/06-subcommands.md b/docs/guides/slash-commands/06-subcommands.md index 0fd41d12c3..5e46406de7 100644 --- a/docs/guides/slash-commands/06-subcommands.md +++ b/docs/guides/slash-commands/06-subcommands.md @@ -59,7 +59,7 @@ command |__ subcommand-group ``` -Let's write a settings command that can change 2 fields in our bot. +Let's write a settings command that can change 3 fields in our bot. ```cs public string FieldA { get; set; } = "test"; From 2404143722a05c66f8d044b844610eab2646e3dd Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 8 Jul 2021 00:23:05 -0300 Subject: [PATCH 094/494] Update 06-subcommands.md --- docs/guides/slash-commands/06-subcommands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/slash-commands/06-subcommands.md b/docs/guides/slash-commands/06-subcommands.md index 5e46406de7..7a3907ff4b 100644 --- a/docs/guides/slash-commands/06-subcommands.md +++ b/docs/guides/slash-commands/06-subcommands.md @@ -206,7 +206,7 @@ private async Task HandleSettingsCommand(SocketSlashCommand command) ``` -Now, let't try this out! Running the 3 get commands seems to get the default values we set. +Now, let's try this out! Running the 3 get commands seems to get the default values we set. ![settings get](images/settings2.png) From 3c04b693a74d033e03fcf1dcfd5017111e70b6aa Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 8 Jul 2021 00:23:21 -0300 Subject: [PATCH 095/494] Update 06-subcommands.md --- docs/guides/slash-commands/06-subcommands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/slash-commands/06-subcommands.md b/docs/guides/slash-commands/06-subcommands.md index 7a3907ff4b..54ff03cdc1 100644 --- a/docs/guides/slash-commands/06-subcommands.md +++ b/docs/guides/slash-commands/06-subcommands.md @@ -210,7 +210,7 @@ Now, let's try this out! Running the 3 get commands seems to get the default val ![settings get](images/settings2.png) -Now lets try changing each to a different value. +Now let's try changing each to a different value. ![settings set](images/settings3.png) From a8a88d4419f760731efaf8f6b7e969c22436627f Mon Sep 17 00:00:00 2001 From: Playwo <38554182+Playwo@users.noreply.github.com> Date: Fri, 9 Jul 2021 15:52:31 +0200 Subject: [PATCH 096/494] Update README section about InteractivityAddon --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f99f3ec4a6..fb44c42e34 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs ## Known issues -Labs will not work with Playwo's [InteractivityAddon](https://github.com/Playwo/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib, you can get around this by cloning his repo and building it with discord.net labs instead of discord.net. +Labs will not work with normal package of Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib. You can instead use the [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs) package which implements some of the features added in Discord.Net-Labs. ## How to use Setting up labs in your project is really simple, here's how to do it: From e59b83554035ffc10f1b5f6e563ec386299c0da7 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Fri, 9 Jul 2021 13:35:30 -0300 Subject: [PATCH 097/494] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e4bb7f5bc2..fb44c42e34 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs ## Known issues -Labs will not work with Playwo's [InteractivityAddon](https://github.com/Playwo/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib, you can get around this by cloning his repo and building it with discord.net labs instead of discord.net. +Labs will not work with normal package of Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib. You can instead use the [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs) package which implements some of the features added in Discord.Net-Labs. ## How to use Setting up labs in your project is really simple, here's how to do it: @@ -116,4 +116,4 @@ await Context.Channel.SendMessageAsync("Test selection!", component: builder.Bui > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. ## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From 2c9958e754728a1ab1da4fe4d4aaaef7f569a661 Mon Sep 17 00:00:00 2001 From: Jared L <48422312+lhjt@users.noreply.github.com> Date: Sat, 10 Jul 2021 03:41:31 +1000 Subject: [PATCH 098/494] Update 03-responding-to-slash-commands.md Updated minor spelling and grammar issues. --- .../slash-commands/03-responding-to-slash-commands.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guides/slash-commands/03-responding-to-slash-commands.md b/docs/guides/slash-commands/03-responding-to-slash-commands.md index ae836768d1..8ab7307d4f 100644 --- a/docs/guides/slash-commands/03-responding-to-slash-commands.md +++ b/docs/guides/slash-commands/03-responding-to-slash-commands.md @@ -1,6 +1,6 @@ # Responding to interactions. -Interactions are the base thing sent over by discord. Slash commands are one of the interaction types. In order to receive a slash command we have to listen to the `InteractionCreated` event. Let's add this to our code. +Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. In order to receive a slash command we have to listen to the `InteractionCreated` event. Let's add this to our code. ```cs client.InteractionCreated += Client_InteractionCreated; @@ -13,7 +13,7 @@ private async Task Client_InteractionCreated(SocketInteraction arg) } ``` -Now that we have the interaction event, Let's talk about the `SocketInteraction` argument. The interaction can be cast to either a `SocketSlashCommand` or a `SocketMessageComponent`. In our case we're trying to use slash commands so Let's cast it to a `SocketSlashCommand`. +Now that we have the interaction event, let's talk about the `SocketInteraction` argument. The interaction can be cast to either a `SocketSlashCommand` or a `SocketMessageComponent`. In our case, we're trying to use slash commands so let's cast it to a `SocketSlashCommand`. ```cs private async Task Client_InteractionCreated(SocketInteraction arg) @@ -25,7 +25,7 @@ private async Task Client_InteractionCreated(SocketInteraction arg) } ``` -With every type of interaction there is a `Data` field. this is where the relevant information lives about our command that was executed. In our case, `Data` is a `SocketSlashCommandData` class. In the data class, we can access the name of the command triggered as well as the options if there were any. For this example, we're just going to respond with the name of the command executed. +With every type of interaction there is a `Data` field. This is where the relevant information lives about our command that was executed. In our case, `Data` is a `SocketSlashCommandData` instance. In the data class, we can access the name of the command triggered as well as the options if there were any. For this example, we're just going to respond with the name of the command executed. ```cs private async Task Client_InteractionCreated(SocketInteraction arg) @@ -45,6 +45,6 @@ Let's try this out! Let's go over the response types quickly, as you would only change them for style points :P -> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `ChannelMessageWithSource` or you can choose to send a deferred response with `DeferredChannelMessageWithSource`. If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. You can read more about Response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) +> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `ChannelMessageWithSource` or you can choose to send a deferred response with `DeferredChannelMessageWithSource`. If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) This seems to be working! Next, we will look at parameters for slash commands. From 1dd5e97fe67e0e0251b26b6dc014a2615b844077 Mon Sep 17 00:00:00 2001 From: Jared L <48422312+lhjt@users.noreply.github.com> Date: Sat, 10 Jul 2021 04:19:31 +1000 Subject: [PATCH 099/494] Add slash command delete operations - Create `DeleteAllGlobalCommandsAsync` - Create `DeleteSlashCommandsAsync` Co-Authored-By: Quin Lynch <49576606+quinchs@users.noreply.github.com> --- src/Discord.Net.Rest/Discord.Net.Rest.xml | 9 +++++++++ src/Discord.Net.Rest/DiscordRestClient.cs | 3 ++- .../Entities/Guilds/RestGuild.cs | 10 ++++++++++ .../Entities/Interactions/InteractionHelper.cs | 16 +++++++++++++--- .../Discord.Net.WebSocket.xml | 9 +++++++++ .../Entities/Guilds/SocketGuild.cs | 14 ++++++++++++-- 6 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 5a70ac05fd..da7b428422 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2740,6 +2740,15 @@ + + + Deletes all slash commands in the current guild. + + The options to be used when sending the request. + + A task that represents the asynchronous delete operation. + + Gets a collection of slash commands created by the current user in this guild. diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 0f93c3f65c..a8849525e4 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -125,7 +125,8 @@ public Task> BulkOverwriteGuildCommands(Sl => InteractionHelper.BulkOverwriteGuildCommands(this, guildId, commandProperties, options); public Task> BatchEditGuildCommandPermissions(ulong guildId, IDictionary permissions, RequestOptions options = null) => InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options); - + public Task DeleteAllGlobalCommandsAsync(RequestOptions options = null) + => InteractionHelper.DeleteAllGlobalCommandsAsync(this, options); public Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId) => ClientHelper.AddRoleAsync(this, guildId, userId, roleId); diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 6c561002e4..37491909cc 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -256,6 +256,16 @@ public Task LeaveAsync(RequestOptions options = null) => GuildHelper.LeaveAsync(this, Discord, options); //Interactions + /// + /// Deletes all slash commands in the current guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous delete operation. + /// + public Task DeleteSlashCommandsAsync(RequestOptions options = null) + => InteractionHelper.DeleteAllGuildCommandsAsync(Discord, this.Id, options); + /// /// Gets a collection of slash commands created by the current user in this guild. /// diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 38ba942758..22f12ff48d 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -11,6 +11,16 @@ namespace Discord.Rest { internal static class InteractionHelper { + public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) + { + return client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, new CreateApplicationCommandParams[0], options); + } + + public static Task DeleteAllGlobalCommandsAsync(BaseDiscordClient client, RequestOptions options = null) + { + return client.ApiClient.BulkOverwriteGlobalApplicationCommands(new CreateApplicationCommandParams[0], options); + } + public static Task SendInteractionResponse(BaseDiscordClient client, IMessageChannel channel, InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { @@ -348,7 +358,7 @@ public static async Task GetGuildCommandPermi return new GuildApplicationCommandPermission(model.Id, model.ApplicationId, guildId, model.Permissions.Select( y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)).ToArray()); } - catch(HttpException x) + catch (HttpException x) { if (x.HttpCode == System.Net.HttpStatusCode.NotFound) return null; @@ -365,7 +375,7 @@ public static async Task ModifyGuildCommandPe List models = new List(); - foreach(var arg in args) + foreach (var arg in args) { var model = new ApplicationCommandPermissions() { @@ -391,7 +401,7 @@ public static async Task> List models = new List(); - foreach(var arg in args) + foreach (var arg in args) { Preconditions.AtMost(arg.Value.Length, 10, nameof(args)); diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 344d7ab200..9df04c8a52 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2843,6 +2843,15 @@ voice regions the guild can access. + + + Deletes all slash commands in the current guild. + + The options to be used when sending the request. + + A task that represents the asynchronous delete operation. + + Gets a collection of slash commands created by the current user in this guild. diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index ef4e873050..e8748dda9e 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -724,6 +724,16 @@ public Task CreateIntegrationAsync(ulong id, string type, => GuildHelper.CreateIntegrationAsync(this, Discord, id, type, options); //Interactions + /// + /// Deletes all slash commands in the current guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous delete operation. + /// + public Task DeleteSlashCommandsAsync(RequestOptions options = null) + => InteractionHelper.DeleteAllGuildCommandsAsync(Discord, this.Id, options); + /// /// Gets a collection of slash commands created by the current user in this guild. /// @@ -823,7 +833,7 @@ internal SocketRole AddOrUpdateRole(RoleModel model) if (_roles.TryGetValue(model.Id, out SocketRole role)) _roles[model.Id].Update(this.Discord.State, model); else - role = AddRole(model); + role = AddRole(model); return role; } @@ -1289,7 +1299,7 @@ Task IGuild.GetTextChannelAsync(ulong id, CacheMode mode, RequestO Task> IGuild.GetVoiceChannelsAsync(CacheMode mode, RequestOptions options) => Task.FromResult>(VoiceChannels); /// - Task> IGuild.GetCategoriesAsync(CacheMode mode , RequestOptions options) + Task> IGuild.GetCategoriesAsync(CacheMode mode, RequestOptions options) => Task.FromResult>(CategoryChannels); /// Task IGuild.GetVoiceChannelAsync(ulong id, CacheMode mode, RequestOptions options) From 811f27d45449783c4e8e9234c54a0cfebd385de1 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 10 Jul 2021 16:22:09 -0300 Subject: [PATCH 100/494] Add timestamp tag #40 --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- .../Entities/Messages/TimestampTag.cs | 56 +++++++++++++++++++ .../Entities/Messages/TimestampTagStyle.cs | 49 ++++++++++++++++ src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- .../Discord.Net.WebSocket.csproj | 2 +- src/Discord.Net/Discord.Net.nuspec | 20 +++---- 6 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Messages/TimestampTag.cs create mode 100644 src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 671ce4043e..7f5e4c7ac9 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.4.2 + 2.4.3 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs new file mode 100644 index 0000000000..44f41788f8 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Entities.Messages +{ + /// + /// Represents a class used to make timestamps in messages. see . + /// + public class TimestampTag + { + /// + /// Gets or sets the style of the timestamp tag. + /// + public TimestampTagStyles Style { get; set; } = TimestampTagStyles.ShortDateTime; + + /// + /// Gets or sets the time for this timestamp tag. + /// + public DateTime Time { get; set; } + + /// + /// Converts the current timestamp tag to the string representation supported by discord. + /// + /// If the is null then the default 0 will be used. + /// + /// + /// A string thats compatable in a discord message, ex: <t:1625944201:f> + public override string ToString() + { + if (Time == null) + return $""; + + var offset = (DateTimeOffset)this.Time; + + return $""; + } + + /// + /// Creates a new timestamp tag with the specified datetime object. + /// + /// The time of this timestamp tag. + /// The style for this timestamp tag. + /// The newly create timestamp tag. + public static TimestampTag FromDateTime(DateTime time, TimestampTagStyles style = TimestampTagStyles.ShortDateTime) + { + return new TimestampTag() + { + Style = style, + Time = time + }; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs new file mode 100644 index 0000000000..d36c281100 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Entities.Messages +{ + /// + /// Represents a set of styles to use with a + /// + public enum TimestampTagStyles + { + /// + /// A short time string: 16:20 + /// + ShortTime = 116, + + /// + /// A long time string: 16:20:30 + /// + LongTime = 84, + + /// + /// A short date string: 20/04/2021 + /// + ShortDate = 100, + + /// + /// A long date string: 20 April 2021 + /// + LongDate = 68, + + /// + /// A short datetime string: 20 April 2021 16:20 + /// + ShortDateTime = 102, + + /// + /// A long datetime string: Tuesday, 20 April 2021 16:20 + /// + LongDateTime = 70, + + /// + /// The relative time to the user: 2 months ago + /// + Relative = 82 + } +} diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index ded04a0669..25104d6d0f 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.4.3 + 2.4.4 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 1305accd16..a641cc752f 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.4 + 2.4.5 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 3864e24a2b..77671c862d 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.4$suffix$ + 2.4.5$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From d33c6c5e1e2d781b67e87d6cfecc70a9388cb491 Mon Sep 17 00:00:00 2001 From: Thundermaker300 Date: Sat, 10 Jul 2021 16:19:53 -0400 Subject: [PATCH 101/494] docs --- src/Discord.Net.Core/Utils/MentionUtils.cs | 3 +++ src/Discord.Net.Rest/API/Common/InviteVanity.cs | 10 ++++++++++ .../Entities/Channels/ISocketMessageChannel.cs | 4 ++-- .../Entities/Channels/SocketGroupChannel.cs | 8 ++++++++ .../Entities/Invites/SocketInvite.cs | 3 +++ src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs | 4 ++++ .../Entities/Users/SocketGroupUser.cs | 3 +++ 7 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Utils/MentionUtils.cs b/src/Discord.Net.Core/Utils/MentionUtils.cs index 6ffb7eee6e..059df6b5ad 100644 --- a/src/Discord.Net.Core/Utils/MentionUtils.cs +++ b/src/Discord.Net.Core/Utils/MentionUtils.cs @@ -40,6 +40,7 @@ public static class MentionUtils /// /// Parses a provided user mention string. /// + /// The user mention. /// Invalid mention format. public static ulong ParseUser(string text) { @@ -50,6 +51,8 @@ public static ulong ParseUser(string text) /// /// Tries to parse a provided user mention string. /// + /// The user mention. + /// The UserId of the user. public static bool TryParseUser(string text, out ulong userId) { if (text.Length >= 3 && text[0] == '<' && text[1] == '@' && text[text.Length - 1] == '>') diff --git a/src/Discord.Net.Rest/API/Common/InviteVanity.cs b/src/Discord.Net.Rest/API/Common/InviteVanity.cs index a36ddee463..412795aa6b 100644 --- a/src/Discord.Net.Rest/API/Common/InviteVanity.cs +++ b/src/Discord.Net.Rest/API/Common/InviteVanity.cs @@ -2,10 +2,20 @@ namespace Discord.API { + /// + /// Represents a vanity invite. + /// public class InviteVanity { + /// + /// The unique code for the invite link. + /// [JsonProperty("code")] public string Code { get; set; } + + /// + /// The total amount of vanity invite uses. + /// [JsonProperty("uses")] public int Uses { get; set; } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs index 873e803f2b..fb25ddbd79 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs @@ -44,7 +44,7 @@ public interface ISocketMessageChannel : IMessageChannel /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The file path of the file. @@ -68,7 +68,7 @@ public interface ISocketMessageChannel : IMessageChannel /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The of the file to be sent. diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index e559bdd4da..c7adc994e9 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -31,7 +31,15 @@ public class SocketGroupChannel : SocketChannel, IGroupChannel, ISocketPrivateCh /// public IReadOnlyCollection CachedMessages => _messages?.Messages ?? ImmutableArray.Create(); + + /// + /// Returns a collection representing all of the users in the group. + /// public new IReadOnlyCollection Users => _users.ToReadOnlyCollection(); + + /// + /// Returns a collection representing all users in the group, not including the client. + /// public IReadOnlyCollection Recipients => _users.Select(x => x.Value).Where(x => x.Id != Discord.CurrentUser.Id).ToReadOnlyCollection(() => _users.Count - 1); diff --git a/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs index 845b48b8b3..acc9c4978b 100644 --- a/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs +++ b/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs @@ -6,6 +6,9 @@ namespace Discord.WebSocket { + /// + /// Represents a WebSocket-based invite to a guild. + /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketInvite : SocketEntity, IInviteMetadata { diff --git a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs index e6aac2c040..732b7818b1 100644 --- a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs +++ b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs @@ -50,6 +50,10 @@ public class SocketRole : SocketEntity, IRole public bool IsEveryone => Id == Guild.Id; /// public string Mention => IsEveryone ? "@everyone" : MentionUtils.MentionRole(Id); + + /// + /// Returns an IEnumerable containing all that have this role. + /// public IEnumerable Members => Guild.Users.Where(x => x.Roles.Any(r => r.Id == Id)); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs index 676c0a86cb..8545e492bc 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs @@ -3,6 +3,9 @@ namespace Discord.WebSocket { + /// + /// Represents a WebSocket-based group user. + /// [DebuggerDisplay("{DebuggerDisplay,nq}")] public class SocketGroupUser : SocketUser, IGroupUser { From 6ac16805231fc043c21021fb0d35e1e0fe6f21bd Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 10 Jul 2021 20:55:47 -0300 Subject: [PATCH 102/494] Fix modify bug. --- src/Discord.Net.Core/Discord.Net.Core.xml | 72 +++++++++++++++++++ .../Rest/ModifyInteractionResponseParams.cs | 3 + src/Discord.Net.Rest/DiscordRestApiClient.cs | 4 +- .../Interactions/InteractionHelper.cs | 10 ++- 4 files changed, 84 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 5436dd4500..88ca9dfd48 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -7266,6 +7266,78 @@ The object is an emoji. + + + Represents a class used to make timestamps in messages. see . + + + + + Gets or sets the style of the timestamp tag. + + + + + Gets or sets the time for this timestamp tag. + + + + + Converts the current timestamp tag to the string representation supported by discord. + + If the is null then the default 0 will be used. + + + A string thats compatable in a discord message, ex: <t:1625944201:f> + + + + Creates a new timestamp tag with the specified datetime object. + + The time of this timestamp tag. + The style for this timestamp tag. + The newly create timestamp tag. + + + + Represents a set of styles to use with a + + + + + A short time string: 16:20 + + + + + A long time string: 16:20:30 + + + + + A short date string: 20/04/2021 + + + + + A long date string: 20 April 2021 + + + + + A short datetime string: 20 April 2021 16:20 + + + + + A long datetime string: Tuesday, 20 April 2021 16:20 + + + + + The relative time to the user: 2 months ago + + Application command permissions allow you to enable or disable commands for specific users or roles within a guild. diff --git a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs index 04817f90ce..b8c7a124f5 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs @@ -17,5 +17,8 @@ internal class ModifyInteractionResponseParams [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } + + [JsonProperty("components")] + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 6ab4d7ca21..115e3baa52 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -935,11 +935,11 @@ public async Task GetInteractionResponse(string interactionToken, Reque return await SendAsync("GET", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) + public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - await SendJsonAsync("POST", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, new BucketIds(), options: options); + return await SendJsonAsync("PATCH", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, new BucketIds(), options: options); } public async Task DeleteInteractionResponse(string interactionToken, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 22f12ff48d..ec32623c7f 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -305,7 +305,9 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil var apiArgs = new API.Rest.ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create() + Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create(), + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; return await client.ApiClient.ModifyInteractionFollowupMessage(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); @@ -328,10 +330,12 @@ public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFol var apiArgs = new API.Rest.ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create() + Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create(), + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; - return await client.ApiClient.ModifyInteractionFollowupMessage(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); + return await client.ApiClient.ModifyInteractionResponse(apiArgs, message.Token, options).ConfigureAwait(false); } public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) From f9ed1473482125acf73c618bb356cd4f966f602c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 10 Jul 2021 22:07:35 -0300 Subject: [PATCH 103/494] Fix namespaces --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 3 ++ .../Entities/Messages/TimestampTag.cs | 2 +- .../Entities/Messages/TimestampTagStyle.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 15 ++++++++++ .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 29 +++++++++++++++++-- src/Discord.Net/Discord.Net.nuspec | 20 ++++++------- 9 files changed, 60 insertions(+), 17 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 7f5e4c7ac9..25d041d8e1 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.4.3 + 2.4.4 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 88ca9dfd48..6afc006d42 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -10754,12 +10754,15 @@ Parses a provided user mention string. + The user mention. Invalid mention format. Tries to parse a provided user mention string. + The user mention. + The UserId of the user. diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs index 44f41788f8..829b35098a 100644 --- a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace Discord.Entities.Messages +namespace Discord { /// /// Represents a class used to make timestamps in messages. see . diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs index d36c281100..9c83a070e8 100644 --- a/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace Discord.Entities.Messages +namespace Discord { /// /// Represents a set of styles to use with a diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 25104d6d0f..14302686fa 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.4.4 + 2.4.5 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index da7b428422..361f27b57d 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4,6 +4,21 @@ Discord.Net.Rest + + + Represents a vanity invite. + + + + + The unique code for the invite link. + + + + + The total amount of vanity invite uses. + + Gets the snowflake ID of the application. diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index a641cc752f..5a254905f8 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.5 + 2.4.6 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 9df04c8a52..2c20d3004a 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1351,7 +1351,7 @@ Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The file path of the file. @@ -1376,7 +1376,7 @@ Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The of the file to be sent. @@ -1773,6 +1773,16 @@ + + + Returns a collection representing all of the users in the group. + + + + + Returns a collection representing all users in the group, not including the client. + + @@ -3474,6 +3484,11 @@ A task that represents the asynchronous operation of acknowledging the interaction. + + + Represents a WebSocket-based invite to a guild. + + @@ -3949,6 +3964,11 @@ + + + Returns an IEnumerable containing all that have this role. + + @@ -3972,6 +3992,11 @@ + + + Represents a WebSocket-based group user. + + Gets the group channel of the user. diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 77671c862d..472e7651ee 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.5$suffix$ + 2.4.6$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From 4a221d661f1d40fda76cbf8700ed39da8c38b817 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sun, 11 Jul 2021 16:57:16 -0300 Subject: [PATCH 104/494] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb44c42e34..f0d08a0304 100644 --- a/README.md +++ b/README.md @@ -116,4 +116,4 @@ await Context.Channel.SendMessageAsync("Test selection!", component: builder.Bui > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. ## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From d2c1053dd070a6edb08de3d2243d2fbeff78bbcd Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sun, 11 Jul 2021 16:57:25 -0300 Subject: [PATCH 105/494] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb44c42e34..f0d08a0304 100644 --- a/README.md +++ b/README.md @@ -116,4 +116,4 @@ await Context.Channel.SendMessageAsync("Test selection!", component: builder.Bui > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. ## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) From 170d941925e9bd058c3cd731372280405429b9d0 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 14 Jul 2021 22:12:30 -0300 Subject: [PATCH 106/494] Add support for multiple embeds on interaction response. Fix some preconditions missing --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 30 +++++----- .../SocketMessageComponent.cs | 56 +++++-------------- .../Slash Commands/SocketSlashCommand.cs | 20 ++++--- .../Entities/Interaction/SocketInteraction.cs | 46 +++++++++++++-- src/Discord.Net/Discord.Net.nuspec | 8 +-- 6 files changed, 90 insertions(+), 72 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 25d041d8e1..783edc338f 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.4.4 + 2.4.5 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 6afc006d42..d0298b1e7c 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -7266,31 +7266,31 @@ The object is an emoji. - + Represents a class used to make timestamps in messages. see . - + Gets or sets the style of the timestamp tag. - + Gets or sets the time for this timestamp tag. - + Converts the current timestamp tag to the string representation supported by discord. - If the is null then the default 0 will be used. + If the is null then the default 0 will be used. A string thats compatable in a discord message, ex: <t:1625944201:f> - + Creates a new timestamp tag with the specified datetime object. @@ -7298,42 +7298,42 @@ The style for this timestamp tag. The newly create timestamp tag. - + - Represents a set of styles to use with a + Represents a set of styles to use with a - + A short time string: 16:20 - + A long time string: 16:20:30 - + A short date string: 20/04/2021 - + A long date string: 20 April 2021 - + A short datetime string: 20 April 2021 16:20 - + A long datetime string: Tuesday, 20 April 2021 16:20 - + The relative time to the user: 2 months ago diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index f42fb58ff1..a445d19f20 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -70,27 +70,8 @@ internal override void Update(Model model) } } - /// - /// Responds to an Interaction. - /// - /// If you have set to , You should use - /// instead. - /// - /// - /// The text of the message to be sent. - /// if the message should be read out by a text-to-speech reader, otherwise . - /// A to send with this response. - /// The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - /// The allowed mentions for this response. - /// The request options for this response. - /// A to be sent with this response - /// - /// The sent as the response. If this is the first acknowledgement, it will return null. - /// - /// Message content is too long, length must be less or equal to . - /// The parameters provided were invalid or the token was invalid. - public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + /// + public override async Task RespondAsync(string text = null, bool isTTS = false, Embed[] embeds = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { if (type == InteractionResponseType.Pong) @@ -101,12 +82,13 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, if (Discord.AlwaysAcknowledgeInteractions) { - await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); + await FollowupAsync(text, isTTS, embeds, ephemeral, type, allowedMentions, options); return; } Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -131,8 +113,8 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, Data = new API.InteractionApplicationCommandCallbackData(text) { AllowedMentions = allowedMentions?.ToModel(), - Embeds = embed != null - ? new API.Embed[] { embed.ToModel() } + Embeds = embeds != null + ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, TTS = isTTS, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified @@ -145,21 +127,8 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); } - /// - /// Sends a followup message for this interaction. - /// - /// The text of the message to be sent - /// if the message should be read out by a text-to-speech reader, otherwise . - /// A to send with this response. - /// The type of response to this Interaction. - /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - /// The allowed mentions for this response. - /// The request options for this response. - /// A to be sent with this response - /// - /// The sent message. - /// - public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + /// + public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed[] embeds = null, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { @@ -169,11 +138,16 @@ public override async Task FollowupAsync(string text = null if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + var args = new API.Rest.CreateWebhookMessageParams(text) { + AllowedMentions = allowedMentions?.ToModel(), IsTTS = isTTS, - Embeds = embed != null - ? new API.Embed[] { embed.ToModel() } + Embeds = embeds != null + ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index e67029351c..e3bb1168c6 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -51,7 +51,7 @@ internal override void Update(Model model) } /// - public override async Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public override async Task RespondAsync(string text = null, bool isTTS = false, Embed[] embeds = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { if (type == InteractionResponseType.Pong) @@ -65,12 +65,13 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, if (Discord.AlwaysAcknowledgeInteractions) { - await FollowupAsync(text, isTTS, embed, ephemeral, type, allowedMentions, options); + await FollowupAsync(text, isTTS, embeds, ephemeral, type, allowedMentions, options); return; } Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -95,8 +96,8 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, Data = new API.InteractionApplicationCommandCallbackData(text) { AllowedMentions = allowedMentions?.ToModel(), - Embeds = embed != null - ? new API.Embed[] { embed.ToModel() } + Embeds = embeds != null + ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, TTS = isTTS, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified @@ -110,7 +111,7 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, } /// - public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed[] embeds = null, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { @@ -120,11 +121,16 @@ public override async Task FollowupAsync(string text = null if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + var args = new API.Rest.CreateWebhookMessageParams(text) { + AllowedMentions = allowedMentions?.ToModel(), IsTTS = isTTS, - Embeds = embed != null - ? new API.Embed[] { embed.ToModel() } + Embeds = embeds != null + ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index c3a6a8221e..d15308c66c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -99,7 +99,7 @@ internal virtual void Update(Model model) /// Responds to an Interaction. /// /// If you have set to , You should use - /// instead. + /// instead. /// /// /// The text of the message to be sent. @@ -112,8 +112,46 @@ internal virtual void Update(Model model) /// A to be sent with this response /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. + public Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + => RespondAsync(text, isTTS, new Embed[] { embed }, type, ephemeral, allowedMentions, options, component); - public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + /// + /// Sends a followup message for this interaction. + /// + /// The text of the message to be sent + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A to send with this response + /// The type of response to this Interaction. + /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// + /// The sent message. + /// + public Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + => RespondAsync(text, isTTS, new Embed[] { embed }, type, ephemeral, allowedMentions, options, component); + /// + /// Responds to an Interaction. + /// + /// If you have set to , You should use + /// instead. + /// + /// + /// The text of the message to be sent. + /// if the message should be read out by a text-to-speech reader, otherwise . + /// A array of embeds to send with this response. Max 10 + /// The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// Message content is too long, length must be less or equal to . + /// The parameters provided were invalid or the token was invalid. + + public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed[] embeds = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); /// @@ -121,7 +159,7 @@ public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed /// /// The text of the message to be sent /// if the message should be read out by a text-to-speech reader, otherwise . - /// A to send with this response. + /// A array of embeds to send with this response. Max 10 /// The type of response to this Interaction. /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. @@ -130,7 +168,7 @@ public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed /// /// The sent message. /// - public abstract Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, bool ephemeral = false, + public abstract Task FollowupAsync(string text = null, bool isTTS = false, Embed[] embeds = null, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 472e7651ee..1c6b72ad7e 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.6$suffix$ + 2.4.7$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,21 +14,21 @@ https://avatars.githubusercontent.com/u/84047264 - + - + - + From 636c3efee8951ab9a034b89cb18c5f8b59b13005 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 14 Jul 2021 22:14:56 -0300 Subject: [PATCH 107/494] Add missing XML tag --- .../Interaction/Message Components/SocketMessageComponent.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index a445d19f20..846052fe58 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -158,6 +158,7 @@ public override async Task FollowupAsync(string text = null return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } + /// public override Task AcknowledgeAsync(RequestOptions options = null) { var response = new API.InteractionResponse() From 03ee95eca9c63db5646662c3a788c9c6305bba5c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 16 Jul 2021 18:35:17 -0300 Subject: [PATCH 108/494] meta: bump versions --- .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 88 ++++++++++--------- src/Discord.Net/Discord.Net.nuspec | 8 +- 3 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 5a254905f8..f983c4c6c7 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.6 + 2.4.7 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 2c20d3004a..5d7acb74da 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3211,43 +3211,14 @@ The message that contained the trigger for this interaction. - - - Responds to an Interaction. - - If you have set to , You should use - instead. - - - The text of the message to be sent. - if the message should be read out by a text-to-speech reader, otherwise . - A to send with this response. - The type of response to this Interaction. - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response - - The sent as the response. If this is the first acknowledgement, it will return null. - - Message content is too long, length must be less or equal to . - The parameters provided were invalid or the token was invalid. + + - - - Sends a followup message for this interaction. - - The text of the message to be sent - if the message should be read out by a text-to-speech reader, otherwise . - A to send with this response. - The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response - - The sent message. - + + + + + @@ -3353,10 +3324,10 @@ The data associated with this interaction. - + - + @@ -3439,7 +3410,7 @@ Responds to an Interaction. If you have set to , You should use - instead. + instead. The text of the message to be sent. @@ -3453,13 +3424,48 @@ Message content is too long, length must be less or equal to . The parameters provided were invalid or the token was invalid. - + Sends a followup message for this interaction. The text of the message to be sent if the message should be read out by a text-to-speech reader, otherwise . - A to send with this response. + A to send with this response + The type of response to this Interaction. + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + + The sent message. + + + + + Responds to an Interaction. + + If you have set to , You should use + instead. + + + The text of the message to be sent. + if the message should be read out by a text-to-speech reader, otherwise . + A array of embeds to send with this response. Max 10 + The type of response to this Interaction. + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + Message content is too long, length must be less or equal to . + The parameters provided were invalid or the token was invalid. + + + + Sends a followup message for this interaction. + + The text of the message to be sent + if the message should be read out by a text-to-speech reader, otherwise . + A array of embeds to send with this response. Max 10 The type of response to this Interaction. /// if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 1c6b72ad7e..118350f420 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.7$suffix$ + 2.4.8$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -16,21 +16,21 @@ - + - + - + From 005cacc3525eee968f3ade6f7519d2ee600eaf4e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 16 Jul 2021 18:38:28 -0300 Subject: [PATCH 109/494] meta: merge upstream --- src/Discord.Net.Core/Discord.Net.Core.xml | 56 ++++++++++++++++++- src/Discord.Net.Rest/Discord.Net.Rest.xml | 29 +++++++++- .../Discord.Net.WebSocket.xml | 12 ++++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index d0298b1e7c..8372d7184c 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1743,7 +1743,7 @@ Gets the parent (category) ID of this channel in the guild's channel list. - A representing the snowflake identifier of the parent of this channel; + A representing the snowflake identifier of the parent of this channel; null if none is set. @@ -1788,6 +1788,50 @@ metadata object containing information for the created invite. + + + Creates a new invite to this channel. + + + The following example creates a new invite to this channel; the invite lasts for 12 hours and can only + be used 3 times throughout its lifespan. + + await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); + + + The id of the embedded application to open for this invite + The time (in seconds) until the invite expires. Set to null to never expire. + The max amount of times this invite may be used. Set to null to have unlimited uses. + If true, the user accepting this invite will be kicked from the guild after closing their client. + If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). + The options to be used when sending the request. + + A task that represents the asynchronous invite creation operation. The task result contains an invite + metadata object containing information for the created invite. + + + + + Creates a new invite to this channel. + + + The following example creates a new invite to this channel; the invite lasts for 12 hours and can only + be used 3 times throughout its lifespan. + + await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); + + + The id of the user whose stream to display for this invite + The time (in seconds) until the invite expires. Set to null to never expire. + The max amount of times this invite may be used. Set to null to have unlimited uses. + If true, the user accepting this invite will be kicked from the guild after closing their client. + If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). + The options to be used when sending the request. + + A task that represents the asynchronous invite creation operation. The task result contains an invite + metadata object containing information for the created invite. + + Gets a collection of all invites to this channel. @@ -5297,6 +5341,11 @@ The invite is for a Go Live stream. + + + The invite is for embedded application. + + Represents a Discord snowflake entity. @@ -8532,6 +8581,11 @@ Gets the members of this team. + + + Gets the name of this team. + + Gets the user identifier that owns this team. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 361f27b57d..465d5085fb 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -1656,6 +1656,24 @@ must be lesser than 86400. + + + may not be equal to zero. + -and- + and must be greater than zero. + -and- + must be lesser than 86400. + + + + + may not be equal to zero. + -and- + and must be greater than zero. + -and- + must be lesser than 86400. + + Message content is too long, length must be less or equal to . @@ -2313,7 +2331,7 @@ A paged collection containing a collection of guild users that can access this channel. Flattening the - paginated response into a collection of users with + paginated response into a collection of users with is required if you wish to access the users. @@ -2524,6 +2542,12 @@ + + + + + + @@ -4052,6 +4076,9 @@ + + + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 5d7acb74da..dc128527d4 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2304,6 +2304,12 @@ + + + + + + @@ -2400,6 +2406,12 @@ + + + + + + From 36ff3e73a38a37283821157d1fa115c2d3bc1e14 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 16 Jul 2021 19:21:48 -0300 Subject: [PATCH 110/494] fix: multiple bugs Fixed permission overwrites using incorrect values for targets Fixed invalid form data for responding Fixed ambiguous method for responding/folloup Added new ApplicationCommandPermissionTarget for slash command permissions --- src/Discord.Net.Core/Discord.Net.Core.xml | 21 ++++++++++++--- .../Entities/Guilds/PermissionTarget.cs | 4 +-- .../ApplicationCommandPermissionTarget.cs | 23 ++++++++++++++++ .../ApplicationCommandPermissions.cs | 12 ++++----- .../Common/ApplicationCommandPermissions.cs | 2 +- .../Discord.Net.WebSocket.xml | 26 ++++++++++++------- .../SocketMessageComponent.cs | 15 +++++++---- .../Slash Commands/SocketSlashCommand.cs | 17 +++++++++--- .../Entities/Interaction/SocketInteraction.cs | 22 +++++----------- 9 files changed, 98 insertions(+), 44 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 8372d7184c..9e288d1a1b 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -7407,7 +7407,7 @@ to allow, otherwise . - + Creates a new . @@ -7417,18 +7417,33 @@ - Creates a new targeting . + Creates a new targeting . The user you want to target this permission value for. The value of this permission. - Creates a new targeting . + Creates a new targeting . The role you want to target this permission value for. The value of this permission. + + + Specifies the target of the permission. + + + + + The target of the permission is a role. + + + + + The target of the permission is a user. + + Defines the available permissions for a channel. diff --git a/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs b/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs index 39e7c81f29..fb759e4c57 100644 --- a/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs +++ b/src/Discord.Net.Core/Entities/Guilds/PermissionTarget.cs @@ -8,10 +8,10 @@ public enum PermissionTarget /// /// The target of the permission is a role. /// - Role = 1, + Role = 0, /// /// The target of the permission is a user. /// - User = 2, + User = 1, } } diff --git a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs new file mode 100644 index 0000000000..5410075ba7 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Specifies the target of the permission. + /// + public enum ApplicationCommandPermissionTarget + { + /// + /// The target of the permission is a role. + /// + Role = 1, + /// + /// The target of the permission is a user. + /// + User = 2, + } +} diff --git a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs index f87613ab89..476960522b 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs @@ -13,7 +13,7 @@ public class ApplicationCommandPermission /// /// The target of this permission. /// - public PermissionTarget TargetType { get; } + public ApplicationCommandPermissionTarget TargetType { get; } /// /// to allow, otherwise . @@ -28,7 +28,7 @@ internal ApplicationCommandPermission() { } /// The id you want to target this permission value for. /// The type of the targetId parameter. /// The value of this permission. - public ApplicationCommandPermission(ulong targetId, PermissionTarget targetType, bool allow) + public ApplicationCommandPermission(ulong targetId, ApplicationCommandPermissionTarget targetType, bool allow) { this.TargetId = targetId; this.TargetType = targetType; @@ -36,7 +36,7 @@ public ApplicationCommandPermission(ulong targetId, PermissionTarget targetType, } /// - /// Creates a new targeting . + /// Creates a new targeting . /// /// The user you want to target this permission value for. /// The value of this permission. @@ -44,11 +44,11 @@ public ApplicationCommandPermission(IUser target, bool allow) { this.TargetId = target.Id; this.Permission = allow; - this.TargetType = PermissionTarget.User; + this.TargetType = ApplicationCommandPermissionTarget.User; } /// - /// Creates a new targeting . + /// Creates a new targeting . /// /// The role you want to target this permission value for. /// The value of this permission. @@ -56,7 +56,7 @@ public ApplicationCommandPermission(IRole target, bool allow) { this.TargetId = target.Id; this.Permission = allow; - this.TargetType = PermissionTarget.Role; + this.TargetType = ApplicationCommandPermissionTarget.Role; } } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs index a4a4ae074a..281ded90f2 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs @@ -13,7 +13,7 @@ internal class ApplicationCommandPermissions public ulong Id { get; set; } [JsonProperty("type")] - public PermissionTarget Type { get; set; } + public ApplicationCommandPermissionTarget Type { get; set; } [JsonProperty("permission")] public bool Permission { get; set; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index dc128527d4..89d29ba092 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3223,14 +3223,19 @@ The message that contained the trigger for this interaction. - + - + - + + Acknowledges this interaction with the . + + + A task that represents the asynchronous operation of acknowledging the interaction. + @@ -3336,10 +3341,13 @@ The data associated with this interaction. - + + + + - + @@ -3422,7 +3430,7 @@ Responds to an Interaction. If you have set to , You should use - instead. + instead. The text of the message to be sent. @@ -3452,12 +3460,12 @@ The sent message. - + Responds to an Interaction. If you have set to , You should use - instead. + instead. The text of the message to be sent. @@ -3471,7 +3479,7 @@ Message content is too long, length must be less or equal to . The parameters provided were invalid or the token was invalid. - + Sends a followup message for this interaction. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 846052fe58..18fb0eafe0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -50,7 +50,7 @@ internal override void Update(Model model) { if (this.Message == null) { - SocketUser author = null; + SocketUser author; if (this.Channel is SocketGuildChannel channel) { if (model.Message.Value.WebhookId.IsSpecified) @@ -71,7 +71,7 @@ internal override void Update(Model model) } /// - public override async Task RespondAsync(string text = null, bool isTTS = false, Embed[] embeds = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public override async Task RespondAsync(Embed[] embeds = null, string text = null, bool isTTS = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { if (type == InteractionResponseType.Pong) @@ -82,7 +82,7 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, if (Discord.AlwaysAcknowledgeInteractions) { - await FollowupAsync(text, isTTS, embeds, ephemeral, type, allowedMentions, options); + await FollowupAsync(embeds, text, isTTS, ephemeral, type, allowedMentions, options); return; } @@ -128,7 +128,7 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, } /// - public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed[] embeds = null, bool ephemeral = false, + public override async Task FollowupAsync(Embed[] embeds = null, string text = null, bool isTTS = false, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { @@ -158,7 +158,12 @@ public override async Task FollowupAsync(string text = null return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } - /// + /// + /// Acknowledges this interaction with the . + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// public override Task AcknowledgeAsync(RequestOptions options = null) { var response = new API.InteractionResponse() diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index e3bb1168c6..78fd3b715e 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -51,7 +51,7 @@ internal override void Update(Model model) } /// - public override async Task RespondAsync(string text = null, bool isTTS = false, Embed[] embeds = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public override async Task RespondAsync(Embed[] embeds = null, string text = null, bool isTTS = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { if (type == InteractionResponseType.Pong) @@ -65,7 +65,7 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, if (Discord.AlwaysAcknowledgeInteractions) { - await FollowupAsync(text, isTTS, embeds, ephemeral, type, allowedMentions, options); + await FollowupAsync(embeds, text, isTTS, ephemeral, type, allowedMentions, options); return; } @@ -111,7 +111,7 @@ public override async Task RespondAsync(string text = null, bool isTTS = false, } /// - public override async Task FollowupAsync(string text = null, bool isTTS = false, Embed[] embeds = null, bool ephemeral = false, + public override async Task FollowupAsync(Embed[] embeds = null, string text = null, bool isTTS = false, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) { @@ -140,5 +140,16 @@ public override async Task FollowupAsync(string text = null return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } + + /// + public override Task AcknowledgeAsync(RequestOptions options = null) + { + var response = new API.InteractionResponse() + { + Type = InteractionResponseType.DeferredChannelMessageWithSource, + }; + + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index d15308c66c..5c950b4505 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -99,7 +99,7 @@ internal virtual void Update(Model model) /// Responds to an Interaction. /// /// If you have set to , You should use - /// instead. + /// instead. /// /// /// The text of the message to be sent. @@ -114,7 +114,7 @@ internal virtual void Update(Model model) /// The parameters provided were invalid or the token was invalid. public Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) - => RespondAsync(text, isTTS, new Embed[] { embed }, type, ephemeral, allowedMentions, options, component); + => RespondAsync(embed != null ? new Embed[] { embed } : null, text, isTTS, type, ephemeral, allowedMentions, options, component); /// /// Sends a followup message for this interaction. @@ -132,12 +132,12 @@ public Task RespondAsync(string text = null, bool isTTS = false, Embed embed = n /// public Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) - => RespondAsync(text, isTTS, new Embed[] { embed }, type, ephemeral, allowedMentions, options, component); + => RespondAsync(embed != null ? new Embed[] { embed } : null, text, isTTS, type, ephemeral, allowedMentions, options, component); /// /// Responds to an Interaction. /// /// If you have set to , You should use - /// instead. + /// instead. /// /// /// The text of the message to be sent. @@ -151,7 +151,7 @@ public Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed[] embeds = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public abstract Task RespondAsync(Embed[] embeds = null, string text = null, bool isTTS = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); /// @@ -168,7 +168,7 @@ public abstract Task RespondAsync(string text = null, bool isTTS = false, Embed[ /// /// The sent message. /// - public abstract Task FollowupAsync(string text = null, bool isTTS = false, Embed[] embeds = null, bool ephemeral = false, + public abstract Task FollowupAsync(Embed[] embeds = null, string text = null, bool isTTS = false, bool ephemeral = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); @@ -186,15 +186,7 @@ public Task GetOriginalResponseAsync(RequestOptions opti /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public virtual Task AcknowledgeAsync(RequestOptions options = null) - { - var response = new API.InteractionResponse() - { - Type = InteractionResponseType.DeferredChannelMessageWithSource, - }; - - return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); - } + public abstract Task AcknowledgeAsync(RequestOptions options = null); private bool CheckToken() { From 0839aa71110e061489edf4d96ce0e84f2098b9aa Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 17 Jul 2021 21:52:34 -0300 Subject: [PATCH 111/494] meta: bump versions, fix incorrect usage of followup --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- .../Discord.Net.WebSocket.csproj | 2 +- .../Entities/Interaction/SocketInteraction.cs | 4 ++-- src/Discord.Net/Discord.Net.nuspec | 20 +++++++++---------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 783edc338f..73a2654d22 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.4.5 + 2.4.6 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 14302686fa..13cfad83ea 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.4.5 + 2.4.6 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index f983c4c6c7..56932f7d8d 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.7 + 2.4.8 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 5c950b4505..79a2c81dc3 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -130,9 +130,9 @@ public Task RespondAsync(string text = null, bool isTTS = false, Embed embed = n /// /// The sent message. /// - public Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) - => RespondAsync(embed != null ? new Embed[] { embed } : null, text, isTTS, type, ephemeral, allowedMentions, options, component); + => FollowupAsync(embed != null ? new Embed[] { embed } : null, text, isTTS, ephemeral, type, allowedMentions, options, component); /// /// Responds to an Interaction. /// diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 118350f420..79f8893fae 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.8$suffix$ + 2.4.9$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From df6ad4b08813fe41ce24adad98d51a613036f63f Mon Sep 17 00:00:00 2001 From: exsersewo Date: Tue, 20 Jul 2021 00:46:47 +0100 Subject: [PATCH 112/494] Add IsSpecified check to Author field --- .../Message Components/SocketMessageComponent.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 18fb0eafe0..a89e6de069 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -50,15 +50,15 @@ internal override void Update(Model model) { if (this.Message == null) { - SocketUser author; + SocketUser author = null; if (this.Channel is SocketGuildChannel channel) { if (model.Message.Value.WebhookId.IsSpecified) author = SocketWebhookUser.Create(channel.Guild, Discord.State, model.Message.Value.Author.Value, model.Message.Value.WebhookId.Value); - else + else if (model.Message.Value.Author.IsSpecified) author = channel.Guild.GetUser(model.Message.Value.Author.Value.Id); } - else + else if (model.Message.Value.Author.IsSpecified) author = (this.Channel as SocketChannel).GetUser(model.Message.Value.Author.Value.Id); this.Message = SocketUserMessage.Create(this.Discord, this.Discord.State, author, this.Channel, model.Message.Value); From df4dfa3ed024d95dbe181683a207a34ee8bf4bd5 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Tue, 20 Jul 2021 00:11:52 -0400 Subject: [PATCH 113/494] Minor doc fix --- docs/guides/slash-commands/04-parameters.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/slash-commands/04-parameters.md b/docs/guides/slash-commands/04-parameters.md index 334e0128f0..ddac72203a 100644 --- a/docs/guides/slash-commands/04-parameters.md +++ b/docs/guides/slash-commands/04-parameters.md @@ -75,7 +75,7 @@ private async Task Client_InteractionCreated(SocketInteraction arg) } } -private async Task HandleListRoleCommand(SocketSlashCommandData command) +private async Task HandleListRoleCommand(SocketSlashCommand command) { // We need to extract the user parameter from the command. since we only have one option and it's required, we can just use the first option. var guildUser = (SocketGuildUser)command.Data.Options.First().Value; From 0fd9f01386867bc1a4c9e5135193284200b7b920 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Tue, 20 Jul 2021 00:21:09 -0400 Subject: [PATCH 114/494] Add note about slash command creation --- docs/guides/slash-commands/02-creating-slash-commands.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guides/slash-commands/02-creating-slash-commands.md b/docs/guides/slash-commands/02-creating-slash-commands.md index 387d39ab66..902a6b3ab9 100644 --- a/docs/guides/slash-commands/02-creating-slash-commands.md +++ b/docs/guides/slash-commands/02-creating-slash-commands.md @@ -81,3 +81,4 @@ public async Task Client_Ready() } ``` +**Note**: Slash 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 slash commands. From 0553d47c67a7fa2122f03dac152abe18f877ab17 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Tue, 20 Jul 2021 00:44:31 -0400 Subject: [PATCH 115/494] Fix typo --- .../Entities/Interactions/SlashCommandBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index e80ab108ea..d707001383 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -43,7 +43,7 @@ public string Name // Discord updated the docs, this regex prevents special characters like @!$%(... etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand if (!Regex.IsMatch(value, @"^[\w-]{3,32}$")) - throw new ArgumentException("Command name cannot contian any special characters or whitespaces!"); + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); _name = value; } From 333f36eeb8823614e5c33cbaa2a4ee33a38d605d Mon Sep 17 00:00:00 2001 From: Nikon <47792796+INikonI@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:38:24 +0500 Subject: [PATCH 116/494] Changes on Emote/Emoji and SelectMenu (#49) * Refactor emojis/emotes & SelectMenu * Update Emoji.cs * Continue emoji refactor * Remove WithLabel from example of SelectMenuBuilder * Remove EmojiUtils and move it stuff to Emoji * Revert 0fbf1000daf5d2afc130797a3ee2421b120beaa2 * Revert "Update Emoji.cs" and add Parse method This reverts commit f297dcfc4320c55ba7108b8e7ef9fa5ad35cd3bc. * Partial revert 3c27ab36c9a0603ac9b1a7819d1be6bb37d7213a --- README.md | 1 - src/Discord.Net.Core/Discord.Net.Core.xml | 49 +- src/Discord.Net.Core/Entities/Emotes/Emoji.cs | 5924 ++++++++++++++++- .../Message Components/ComponentBuilder.cs | 73 +- .../Message Components/SelectMenu.cs | 8 +- .../API/Common/SelectMenuComponent.cs | 4 + .../Entities/Messages/RestMessage.cs | 5 +- .../Entities/Messages/SocketMessage.cs | 5 +- 8 files changed, 5996 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index f0d08a0304..41c902b0d5 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,6 @@ Theres a new field in all `SendMessageAsync` functions that takes in a `MessageC var builder = new ComponentBuilder() .WithSelectMenu(new SelectMenuBuilder() .WithCustomId("id_2") - .WithLabel("Select menu!") .WithPlaceholder("This is a placeholder") .WithOptions(new List() { diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 9e288d1a1b..76a02fffb3 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -2106,7 +2106,7 @@ - Gets the Unicode representation of this emote. + Gets the Unicode representation of this emoji. A string that resolves to . @@ -2124,6 +2124,17 @@ The object to compare with the current object. + + Tries to parse an from its raw format. + The raw encoding of an emoji. For example: :heart: or ❤ + An emoji. + + + Parse an from its raw format. + The raw encoding of an emoji. For example: :heart: or ❤ + An emoji. + String is not emoji or unicode! + @@ -4361,7 +4372,7 @@ Gets or sets the Action Rows for this Component Builder. - + Adds a to the first row, if the first row cannot accept the component then it will add it to a row that can @@ -4372,6 +4383,7 @@ The placeholder of the menu. The min values of the placeholder. The max values of the placeholder. + Whether or not the menu is disabled. The row to add the menu to. @@ -4607,11 +4619,6 @@ The maximum number of options a can have. - - - Gets or sets the label of the current select menu. - - Gets or sets the custom id of the current select menu. @@ -4637,6 +4644,11 @@ Gets or sets a collection of for this current select menu. + + + Gets or sets whether the current menu is disabled. + + Creates a new instance of a . @@ -4649,15 +4661,6 @@ The custom id of this select menu. The options for this select menu. - - - Sets the field label. - - The value to set the field label to. - - The current builder. - - Sets the field CustomId. @@ -4703,6 +4706,15 @@ The current builder. + + + Sets whether the current menu is disabled. + + Whether the current menu is disabled or not. + + The current builder. + + Builds a @@ -4880,6 +4892,11 @@ The maximum number of items that can be chosen; default 1, max 25 + + + Whether this menu is disabled or not. + + Represents a choice for a . diff --git a/src/Discord.Net.Core/Entities/Emotes/Emoji.cs b/src/Discord.Net.Core/Entities/Emotes/Emoji.cs index d5e7950941..58392d1bea 100644 --- a/src/Discord.Net.Core/Entities/Emotes/Emoji.cs +++ b/src/Discord.Net.Core/Entities/Emotes/Emoji.cs @@ -1,3 +1,7 @@ +using System; +using System.Collections.Generic; +using System.Linq; + namespace Discord { /// @@ -5,12 +9,11 @@ namespace Discord /// public class Emoji : IEmote { - // TODO: need to constrain this to Unicode-only emojis somehow - /// public string Name { get; } + /// - /// Gets the Unicode representation of this emote. + /// Gets the Unicode representation of this emoji. /// /// /// A string that resolves to . @@ -32,16 +35,5921 @@ public Emoji(string unicode) /// The object to compare with the current object. public override bool Equals(object other) { - if (other == null) return false; - if (other == this) return true; + if (other == null) + return false; + + if (other == this) + return true; + + return other is Emoji otherEmoji && string.Equals(Name, otherEmoji.Name); + } + + /// Tries to parse an from its raw format. + /// The raw encoding of an emoji. For example: :heart: or ❤ + /// An emoji. + public static bool TryParse(string text, out Emoji result) + { + result = null; + if (string.IsNullOrWhiteSpace(text)) + return false; + + if (NamesAndUnicodes.ContainsKey(text)) + result = new Emoji(NamesAndUnicodes[text]); - var otherEmoji = other as Emoji; - if (otherEmoji == null) return false; + if (UnicodesAndNames.ContainsKey(text)) + result = new Emoji(text); - return string.Equals(Name, otherEmoji.Name); + return result != null; + } + + /// Parse an from its raw format. + /// The raw encoding of an emoji. For example: :heart: or ❤ + /// An emoji. + /// String is not emoji or unicode! + public static Emoji Parse(string emojiStr) + { + if (!TryParse(emojiStr, out var emoji)) + throw new FormatException("String is not emoji name or unicode!"); + + return emoji; } /// public override int GetHashCode() => Name.GetHashCode(); + + private static IReadOnlyDictionary NamesAndUnicodes { get; } = new Dictionary + { + [",:("] = "\uD83D\uDE13", + [",:)"] = "\uD83D\uDE05", + [",:-("] = "\uD83D\uDE13", + [",:-)"] = "\uD83D\uDE05", + [",=("] = "\uD83D\uDE13", + [",=)"] = "\uD83D\uDE05", + [",=-("] = "\uD83D\uDE13", + [",=-)"] = "\uD83D\uDE05", + ["0:)"] = "\uD83D\uDE07", + ["0:-)"] = "\uD83D\uDE07", + ["0=)"] = "\uD83D\uDE07", + ["0=-)"] = "\uD83D\uDE07", + ["8-)"] = "\uD83D\uDE0E", + [":$"] = "\uD83D\uDE12", + [":'("] = "\uD83D\uDE22", + [":')"] = "\uD83D\uDE02", + [":'-("] = "\uD83D\uDE22", + [":'-)"] = "\uD83D\uDE02", + [":'-D"] = "\uD83D\uDE02", + [":'D"] = "\uD83D\uDE02", + [":("] = "\uD83D\uDE26", + [":)"] = "\uD83D\uDE42", + [":*"] = "\uD83D\uDE17", + [":+1:"] = "\uD83D\uDC4D", + [":+1::skin-tone-1:"] = "\uD83D\uDC4D\uD83C\uDFFB", + [":+1::skin-tone-2:"] = "\uD83D\uDC4D\uD83C\uDFFC", + [":+1::skin-tone-3:"] = "\uD83D\uDC4D\uD83C\uDFFD", + [":+1::skin-tone-4:"] = "\uD83D\uDC4D\uD83C\uDFFE", + [":+1::skin-tone-5:"] = "\uD83D\uDC4D\uD83C\uDFFF", + [":+1_tone1:"] = "\uD83D\uDC4D\uD83C\uDFFB", + [":+1_tone2:"] = "\uD83D\uDC4D\uD83C\uDFFC", + [":+1_tone3:"] = "\uD83D\uDC4D\uD83C\uDFFD", + [":+1_tone4:"] = "\uD83D\uDC4D\uD83C\uDFFE", + [":+1_tone5:"] = "\uD83D\uDC4D\uD83C\uDFFF", + [":,'("] = "\uD83D\uDE2D", + [":,'-("] = "\uD83D\uDE2D", + [":,("] = "\uD83D\uDE22", + [":,)"] = "\uD83D\uDE02", + [":,-("] = "\uD83D\uDE22", + [":,-)"] = "\uD83D\uDE02", + [":,-D"] = "\uD83D\uDE02", + [":,D"] = "\uD83D\uDE02", + [":-$"] = "\uD83D\uDE12", + [":-("] = "\uD83D\uDE26", + [":-)"] = "\uD83D\uDE42", + [":-*"] = "\uD83D\uDE17", + [":-/"] = "\uD83D\uDE15", + [":-1:"] = "\uD83D\uDC4E", + [":-1::skin-tone-1:"] = "\uD83D\uDC4E\uD83C\uDFFB", + [":-1::skin-tone-2:"] = "\uD83D\uDC4E\uD83C\uDFFC", + [":-1::skin-tone-3:"] = "\uD83D\uDC4E\uD83C\uDFFD", + [":-1::skin-tone-4:"] = "\uD83D\uDC4E\uD83C\uDFFE", + [":-1::skin-tone-5:"] = "\uD83D\uDC4E\uD83C\uDFFF", + [":-@"] = "\uD83D\uDE21", + [":-D"] = "\uD83D\uDE04", + [":-O"] = "\uD83D\uDE2E", + [":-P"] = "\uD83D\uDE1B", + [":-S"] = "\uD83D\uDE12", + [":-Z"] = "\uD83D\uDE12", + [":-\")"] = "\uD83D\uDE0A", + [":-\\"] = "\uD83D\uDE15", + [":-o"] = "\uD83D\uDE2E", + [":-|"] = "\uD83D\uDE10", + [":100:"] = "\uD83D\uDCAF", + [":1234:"] = "\uD83D\uDD22", + [":8ball:"] = "\uD83C\uDFB1", + [":@"] = "\uD83D\uDE21", + [":D"] = "\uD83D\uDE04", + [":O"] = "\uD83D\uDE2E", + [":P"] = "\uD83D\uDE1B", + [":\")"] = "\uD83D\uDE0A", + [":_1_tone1:"] = "\uD83D\uDC4E\uD83C\uDFFB", + [":_1_tone2:"] = "\uD83D\uDC4E\uD83C\uDFFC", + [":_1_tone3:"] = "\uD83D\uDC4E\uD83C\uDFFD", + [":_1_tone4:"] = "\uD83D\uDC4E\uD83C\uDFFE", + [":_1_tone5:"] = "\uD83D\uDC4E\uD83C\uDFFF", + [":a:"] = "\uD83C\uDD70️", + [":ab:"] = "\uD83C\uDD8E", + [":abacus:"] = "\uD83E\uDDEE", + [":abc:"] = "\uD83D\uDD24", + [":abcd:"] = "\uD83D\uDD21", + [":accept:"] = "\uD83C\uDE51", + [":adhesive_bandage:"] = "\uD83E\uDE79", + [":admission_tickets:"] = "\uD83C\uDF9F️", + [":adult:"] = "\uD83E\uDDD1", + [":adult::skin-tone-1:"] = "\uD83E\uDDD1\uD83C\uDFFB", + [":adult::skin-tone-2:"] = "\uD83E\uDDD1\uD83C\uDFFC", + [":adult::skin-tone-3:"] = "\uD83E\uDDD1\uD83C\uDFFD", + [":adult::skin-tone-4:"] = "\uD83E\uDDD1\uD83C\uDFFE", + [":adult::skin-tone-5:"] = "\uD83E\uDDD1\uD83C\uDFFF", + [":adult_dark_skin_tone:"] = "\uD83E\uDDD1\uD83C\uDFFF", + [":adult_light_skin_tone:"] = "\uD83E\uDDD1\uD83C\uDFFB", + [":adult_medium_dark_skin_tone:"] = "\uD83E\uDDD1\uD83C\uDFFE", + [":adult_medium_light_skin_tone:"] = "\uD83E\uDDD1\uD83C\uDFFC", + [":adult_medium_skin_tone:"] = "\uD83E\uDDD1\uD83C\uDFFD", + [":adult_tone1:"] = "\uD83E\uDDD1\uD83C\uDFFB", + [":adult_tone2:"] = "\uD83E\uDDD1\uD83C\uDFFC", + [":adult_tone3:"] = "\uD83E\uDDD1\uD83C\uDFFD", + [":adult_tone4:"] = "\uD83E\uDDD1\uD83C\uDFFE", + [":adult_tone5:"] = "\uD83E\uDDD1\uD83C\uDFFF", + [":aerial_tramway:"] = "\uD83D\uDEA1", + [":airplane:"] = "✈️", + [":airplane_arriving:"] = "\uD83D\uDEEC", + [":airplane_departure:"] = "\uD83D\uDEEB", + [":airplane_small:"] = "\uD83D\uDEE9️", + [":alarm_clock:"] = "⏰", + [":alembic:"] = "⚗️", + [":alien:"] = "\uD83D\uDC7D", + [":ambulance:"] = "\uD83D\uDE91", + [":amphora:"] = "\uD83C\uDFFA", + [":anchor:"] = "⚓", + [":angel:"] = "\uD83D\uDC7C", + [":angel::skin-tone-1:"] = "\uD83D\uDC7C\uD83C\uDFFB", + [":angel::skin-tone-2:"] = "\uD83D\uDC7C\uD83C\uDFFC", + [":angel::skin-tone-3:"] = "\uD83D\uDC7C\uD83C\uDFFD", + [":angel::skin-tone-4:"] = "\uD83D\uDC7C\uD83C\uDFFE", + [":angel::skin-tone-5:"] = "\uD83D\uDC7C\uD83C\uDFFF", + [":angel_tone1:"] = "\uD83D\uDC7C\uD83C\uDFFB", + [":angel_tone2:"] = "\uD83D\uDC7C\uD83C\uDFFC", + [":angel_tone3:"] = "\uD83D\uDC7C\uD83C\uDFFD", + [":angel_tone4:"] = "\uD83D\uDC7C\uD83C\uDFFE", + [":angel_tone5:"] = "\uD83D\uDC7C\uD83C\uDFFF", + [":anger:"] = "\uD83D\uDCA2", + [":anger_right:"] = "\uD83D\uDDEF️", + [":angry:"] = "\uD83D\uDE20", + [":anguished:"] = "\uD83D\uDE27", + [":ant:"] = "\uD83D\uDC1C", + [":apple:"] = "\uD83C\uDF4E", + [":aquarius:"] = "♒", + [":archery:"] = "\uD83C\uDFF9", + [":aries:"] = "♈", + [":arrow_backward:"] = "◀️", + [":arrow_double_down:"] = "⏬", + [":arrow_double_up:"] = "⏫", + [":arrow_down:"] = "⬇️", + [":arrow_down_small:"] = "\uD83D\uDD3D", + [":arrow_forward:"] = "▶️", + [":arrow_heading_down:"] = "⤵️", + [":arrow_heading_up:"] = "⤴️", + [":arrow_left:"] = "⬅️", + [":arrow_lower_left:"] = "↙️", + [":arrow_lower_right:"] = "↘️", + [":arrow_right:"] = "➡️", + [":arrow_right_hook:"] = "↪️", + [":arrow_up:"] = "⬆️", + [":arrow_up_down:"] = "↕️", + [":arrow_up_small:"] = "\uD83D\uDD3C", + [":arrow_upper_left:"] = "↖️", + [":arrow_upper_right:"] = "↗️", + [":arrows_clockwise:"] = "\uD83D\uDD03", + [":arrows_counterclockwise:"] = "\uD83D\uDD04", + [":art:"] = "\uD83C\uDFA8", + [":articulated_lorry:"] = "\uD83D\uDE9B", + [":asterisk:"] = "*️⃣", + [":astonished:"] = "\uD83D\uDE32", + [":athletic_shoe:"] = "\uD83D\uDC5F", + [":atm:"] = "\uD83C\uDFE7", + [":atom:"] = "⚛️", + [":atom_symbol:"] = "⚛️", + [":auto_rickshaw:"] = "\uD83D\uDEFA", + [":avocado:"] = "\uD83E\uDD51", + [":axe:"] = "\uD83E\uDE93", + [":b:"] = "\uD83C\uDD71️", + [":baby:"] = "\uD83D\uDC76", + [":baby::skin-tone-1:"] = "\uD83D\uDC76\uD83C\uDFFB", + [":baby::skin-tone-2:"] = "\uD83D\uDC76\uD83C\uDFFC", + [":baby::skin-tone-3:"] = "\uD83D\uDC76\uD83C\uDFFD", + [":baby::skin-tone-4:"] = "\uD83D\uDC76\uD83C\uDFFE", + [":baby::skin-tone-5:"] = "\uD83D\uDC76\uD83C\uDFFF", + [":baby_bottle:"] = "\uD83C\uDF7C", + [":baby_chick:"] = "\uD83D\uDC24", + [":baby_symbol:"] = "\uD83D\uDEBC", + [":baby_tone1:"] = "\uD83D\uDC76\uD83C\uDFFB", + [":baby_tone2:"] = "\uD83D\uDC76\uD83C\uDFFC", + [":baby_tone3:"] = "\uD83D\uDC76\uD83C\uDFFD", + [":baby_tone4:"] = "\uD83D\uDC76\uD83C\uDFFE", + [":baby_tone5:"] = "\uD83D\uDC76\uD83C\uDFFF", + [":back:"] = "\uD83D\uDD19", + [":back_of_hand:"] = "\uD83E\uDD1A", + [":back_of_hand::skin-tone-1:"] = "\uD83E\uDD1A\uD83C\uDFFB", + [":back_of_hand::skin-tone-2:"] = "\uD83E\uDD1A\uD83C\uDFFC", + [":back_of_hand::skin-tone-3:"] = "\uD83E\uDD1A\uD83C\uDFFD", + [":back_of_hand::skin-tone-4:"] = "\uD83E\uDD1A\uD83C\uDFFE", + [":back_of_hand::skin-tone-5:"] = "\uD83E\uDD1A\uD83C\uDFFF", + [":back_of_hand_tone1:"] = "\uD83E\uDD1A\uD83C\uDFFB", + [":back_of_hand_tone2:"] = "\uD83E\uDD1A\uD83C\uDFFC", + [":back_of_hand_tone3:"] = "\uD83E\uDD1A\uD83C\uDFFD", + [":back_of_hand_tone4:"] = "\uD83E\uDD1A\uD83C\uDFFE", + [":back_of_hand_tone5:"] = "\uD83E\uDD1A\uD83C\uDFFF", + [":bacon:"] = "\uD83E\uDD53", + [":badger:"] = "\uD83E\uDDA1", + [":badminton:"] = "\uD83C\uDFF8", + [":bagel:"] = "\uD83E\uDD6F", + [":baggage_claim:"] = "\uD83D\uDEC4", + [":baguette_bread:"] = "\uD83E\uDD56", + [":ballet_shoes:"] = "\uD83E\uDE70", + [":balloon:"] = "\uD83C\uDF88", + [":ballot_box:"] = "\uD83D\uDDF3️", + [":ballot_box_with_ballot:"] = "\uD83D\uDDF3️", + [":ballot_box_with_check:"] = "☑️", + [":bamboo:"] = "\uD83C\uDF8D", + [":banana:"] = "\uD83C\uDF4C", + [":bangbang:"] = "‼️", + [":banjo:"] = "\uD83E\uDE95", + [":bank:"] = "\uD83C\uDFE6", + [":bar_chart:"] = "\uD83D\uDCCA", + [":barber:"] = "\uD83D\uDC88", + [":baseball:"] = "⚾", + [":basket:"] = "\uD83E\uDDFA", + [":basketball:"] = "\uD83C\uDFC0", + [":basketball_player:"] = "⛹️", + [":basketball_player::skin-tone-1:"] = "⛹\uD83C\uDFFB", + [":basketball_player::skin-tone-2:"] = "⛹\uD83C\uDFFC", + [":basketball_player::skin-tone-3:"] = "⛹\uD83C\uDFFD", + [":basketball_player::skin-tone-4:"] = "⛹\uD83C\uDFFE", + [":basketball_player::skin-tone-5:"] = "⛹\uD83C\uDFFF", + [":basketball_player_tone1:"] = "⛹\uD83C\uDFFB", + [":basketball_player_tone2:"] = "⛹\uD83C\uDFFC", + [":basketball_player_tone3:"] = "⛹\uD83C\uDFFD", + [":basketball_player_tone4:"] = "⛹\uD83C\uDFFE", + [":basketball_player_tone5:"] = "⛹\uD83C\uDFFF", + [":bat:"] = "\uD83E\uDD87", + [":bath:"] = "\uD83D\uDEC0", + [":bath::skin-tone-1:"] = "\uD83D\uDEC0\uD83C\uDFFB", + [":bath::skin-tone-2:"] = "\uD83D\uDEC0\uD83C\uDFFC", + [":bath::skin-tone-3:"] = "\uD83D\uDEC0\uD83C\uDFFD", + [":bath::skin-tone-4:"] = "\uD83D\uDEC0\uD83C\uDFFE", + [":bath::skin-tone-5:"] = "\uD83D\uDEC0\uD83C\uDFFF", + [":bath_tone1:"] = "\uD83D\uDEC0\uD83C\uDFFB", + [":bath_tone2:"] = "\uD83D\uDEC0\uD83C\uDFFC", + [":bath_tone3:"] = "\uD83D\uDEC0\uD83C\uDFFD", + [":bath_tone4:"] = "\uD83D\uDEC0\uD83C\uDFFE", + [":bath_tone5:"] = "\uD83D\uDEC0\uD83C\uDFFF", + [":bathtub:"] = "\uD83D\uDEC1", + [":battery:"] = "\uD83D\uDD0B", + [":beach:"] = "\uD83C\uDFD6️", + [":beach_umbrella:"] = "⛱️", + [":beach_with_umbrella:"] = "\uD83C\uDFD6️", + [":bear:"] = "\uD83D\uDC3B", + [":bearded_person:"] = "\uD83E\uDDD4", + [":bearded_person::skin-tone-1:"] = "\uD83E\uDDD4\uD83C\uDFFB", + [":bearded_person::skin-tone-2:"] = "\uD83E\uDDD4\uD83C\uDFFC", + [":bearded_person::skin-tone-3:"] = "\uD83E\uDDD4\uD83C\uDFFD", + [":bearded_person::skin-tone-4:"] = "\uD83E\uDDD4\uD83C\uDFFE", + [":bearded_person::skin-tone-5:"] = "\uD83E\uDDD4\uD83C\uDFFF", + [":bearded_person_dark_skin_tone:"] = "\uD83E\uDDD4\uD83C\uDFFF", + [":bearded_person_light_skin_tone:"] = "\uD83E\uDDD4\uD83C\uDFFB", + [":bearded_person_medium_dark_skin_tone:"] = "\uD83E\uDDD4\uD83C\uDFFE", + [":bearded_person_medium_light_skin_tone:"] = "\uD83E\uDDD4\uD83C\uDFFC", + [":bearded_person_medium_skin_tone:"] = "\uD83E\uDDD4\uD83C\uDFFD", + [":bearded_person_tone1:"] = "\uD83E\uDDD4\uD83C\uDFFB", + [":bearded_person_tone2:"] = "\uD83E\uDDD4\uD83C\uDFFC", + [":bearded_person_tone3:"] = "\uD83E\uDDD4\uD83C\uDFFD", + [":bearded_person_tone4:"] = "\uD83E\uDDD4\uD83C\uDFFE", + [":bearded_person_tone5:"] = "\uD83E\uDDD4\uD83C\uDFFF", + [":bed:"] = "\uD83D\uDECF️", + [":bee:"] = "\uD83D\uDC1D", + [":beer:"] = "\uD83C\uDF7A", + [":beers:"] = "\uD83C\uDF7B", + [":beetle:"] = "\uD83D\uDC1E", + [":beginner:"] = "\uD83D\uDD30", + [":bell:"] = "\uD83D\uDD14", + [":bellhop:"] = "\uD83D\uDECE️", + [":bellhop_bell:"] = "\uD83D\uDECE️", + [":bento:"] = "\uD83C\uDF71", + [":beverage_box:"] = "\uD83E\uDDC3", + [":bicyclist:"] = "\uD83D\uDEB4", + [":bicyclist::skin-tone-1:"] = "\uD83D\uDEB4\uD83C\uDFFB", + [":bicyclist::skin-tone-2:"] = "\uD83D\uDEB4\uD83C\uDFFC", + [":bicyclist::skin-tone-3:"] = "\uD83D\uDEB4\uD83C\uDFFD", + [":bicyclist::skin-tone-4:"] = "\uD83D\uDEB4\uD83C\uDFFE", + [":bicyclist::skin-tone-5:"] = "\uD83D\uDEB4\uD83C\uDFFF", + [":bicyclist_tone1:"] = "\uD83D\uDEB4\uD83C\uDFFB", + [":bicyclist_tone2:"] = "\uD83D\uDEB4\uD83C\uDFFC", + [":bicyclist_tone3:"] = "\uD83D\uDEB4\uD83C\uDFFD", + [":bicyclist_tone4:"] = "\uD83D\uDEB4\uD83C\uDFFE", + [":bicyclist_tone5:"] = "\uD83D\uDEB4\uD83C\uDFFF", + [":bike:"] = "\uD83D\uDEB2", + [":bikini:"] = "\uD83D\uDC59", + [":billed_cap:"] = "\uD83E\uDDE2", + [":biohazard:"] = "☣️", + [":biohazard_sign:"] = "☣️", + [":bird:"] = "\uD83D\uDC26", + [":birthday:"] = "\uD83C\uDF82", + [":black_circle:"] = "⚫", + [":black_heart:"] = "\uD83D\uDDA4", + [":black_joker:"] = "\uD83C\uDCCF", + [":black_large_square:"] = "⬛", + [":black_medium_small_square:"] = "◾", + [":black_medium_square:"] = "◼️", + [":black_nib:"] = "✒️", + [":black_small_square:"] = "▪️", + [":black_square_button:"] = "\uD83D\uDD32", + [":blond_haired_man:"] = "\uD83D\uDC71\u200D♂️", + [":blond_haired_man::skin-tone-1:"] = "\uD83D\uDC71\uD83C\uDFFB\u200D♂️", + [":blond_haired_man::skin-tone-2:"] = "\uD83D\uDC71\uD83C\uDFFC\u200D♂️", + [":blond_haired_man::skin-tone-3:"] = "\uD83D\uDC71\uD83C\uDFFD\u200D♂️", + [":blond_haired_man::skin-tone-4:"] = "\uD83D\uDC71\uD83C\uDFFE\u200D♂️", + [":blond_haired_man::skin-tone-5:"] = "\uD83D\uDC71\uD83C\uDFFF\u200D♂️", + [":blond_haired_man_dark_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFF\u200D♂️", + [":blond_haired_man_light_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFB\u200D♂️", + [":blond_haired_man_medium_dark_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFE\u200D♂️", + [":blond_haired_man_medium_light_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFC\u200D♂️", + [":blond_haired_man_medium_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFD\u200D♂️", + [":blond_haired_man_tone1:"] = "\uD83D\uDC71\uD83C\uDFFB\u200D♂️", + [":blond_haired_man_tone2:"] = "\uD83D\uDC71\uD83C\uDFFC\u200D♂️", + [":blond_haired_man_tone3:"] = "\uD83D\uDC71\uD83C\uDFFD\u200D♂️", + [":blond_haired_man_tone4:"] = "\uD83D\uDC71\uD83C\uDFFE\u200D♂️", + [":blond_haired_man_tone5:"] = "\uD83D\uDC71\uD83C\uDFFF\u200D♂️", + [":blond_haired_person:"] = "\uD83D\uDC71", + [":blond_haired_person::skin-tone-1:"] = "\uD83D\uDC71\uD83C\uDFFB", + [":blond_haired_person::skin-tone-2:"] = "\uD83D\uDC71\uD83C\uDFFC", + [":blond_haired_person::skin-tone-3:"] = "\uD83D\uDC71\uD83C\uDFFD", + [":blond_haired_person::skin-tone-4:"] = "\uD83D\uDC71\uD83C\uDFFE", + [":blond_haired_person::skin-tone-5:"] = "\uD83D\uDC71\uD83C\uDFFF", + [":blond_haired_person_tone1:"] = "\uD83D\uDC71\uD83C\uDFFB", + [":blond_haired_person_tone2:"] = "\uD83D\uDC71\uD83C\uDFFC", + [":blond_haired_person_tone3:"] = "\uD83D\uDC71\uD83C\uDFFD", + [":blond_haired_person_tone4:"] = "\uD83D\uDC71\uD83C\uDFFE", + [":blond_haired_person_tone5:"] = "\uD83D\uDC71\uD83C\uDFFF", + [":blond_haired_woman:"] = "\uD83D\uDC71\u200D♀️", + [":blond_haired_woman::skin-tone-1:"] = "\uD83D\uDC71\uD83C\uDFFB\u200D♀️", + [":blond_haired_woman::skin-tone-2:"] = "\uD83D\uDC71\uD83C\uDFFC\u200D♀️", + [":blond_haired_woman::skin-tone-3:"] = "\uD83D\uDC71\uD83C\uDFFD\u200D♀️", + [":blond_haired_woman::skin-tone-4:"] = "\uD83D\uDC71\uD83C\uDFFE\u200D♀️", + [":blond_haired_woman::skin-tone-5:"] = "\uD83D\uDC71\uD83C\uDFFF\u200D♀️", + [":blond_haired_woman_dark_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFF\u200D♀️", + [":blond_haired_woman_light_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFB\u200D♀️", + [":blond_haired_woman_medium_dark_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFE\u200D♀️", + [":blond_haired_woman_medium_light_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFC\u200D♀️", + [":blond_haired_woman_medium_skin_tone:"] = "\uD83D\uDC71\uD83C\uDFFD\u200D♀️", + [":blond_haired_woman_tone1:"] = "\uD83D\uDC71\uD83C\uDFFB\u200D♀️", + [":blond_haired_woman_tone2:"] = "\uD83D\uDC71\uD83C\uDFFC\u200D♀️", + [":blond_haired_woman_tone3:"] = "\uD83D\uDC71\uD83C\uDFFD\u200D♀️", + [":blond_haired_woman_tone4:"] = "\uD83D\uDC71\uD83C\uDFFE\u200D♀️", + [":blond_haired_woman_tone5:"] = "\uD83D\uDC71\uD83C\uDFFF\u200D♀️", + [":blossom:"] = "\uD83C\uDF3C", + [":blowfish:"] = "\uD83D\uDC21", + [":blue_book:"] = "\uD83D\uDCD8", + [":blue_car:"] = "\uD83D\uDE99", + [":blue_circle:"] = "\uD83D\uDD35", + [":blue_heart:"] = "\uD83D\uDC99", + [":blue_square:"] = "\uD83D\uDFE6", + [":blush:"] = "\uD83D\uDE0A", + [":boar:"] = "\uD83D\uDC17", + [":bomb:"] = "\uD83D\uDCA3", + [":bone:"] = "\uD83E\uDDB4", + [":book:"] = "\uD83D\uDCD6", + [":bookmark:"] = "\uD83D\uDD16", + [":bookmark_tabs:"] = "\uD83D\uDCD1", + [":books:"] = "\uD83D\uDCDA", + [":boom:"] = "\uD83D\uDCA5", + [":boot:"] = "\uD83D\uDC62", + [":bottle_with_popping_cork:"] = "\uD83C\uDF7E", + [":bouquet:"] = "\uD83D\uDC90", + [":bow:"] = "\uD83D\uDE47", + [":bow::skin-tone-1:"] = "\uD83D\uDE47\uD83C\uDFFB", + [":bow::skin-tone-2:"] = "\uD83D\uDE47\uD83C\uDFFC", + [":bow::skin-tone-3:"] = "\uD83D\uDE47\uD83C\uDFFD", + [":bow::skin-tone-4:"] = "\uD83D\uDE47\uD83C\uDFFE", + [":bow::skin-tone-5:"] = "\uD83D\uDE47\uD83C\uDFFF", + [":bow_and_arrow:"] = "\uD83C\uDFF9", + [":bow_tone1:"] = "\uD83D\uDE47\uD83C\uDFFB", + [":bow_tone2:"] = "\uD83D\uDE47\uD83C\uDFFC", + [":bow_tone3:"] = "\uD83D\uDE47\uD83C\uDFFD", + [":bow_tone4:"] = "\uD83D\uDE47\uD83C\uDFFE", + [":bow_tone5:"] = "\uD83D\uDE47\uD83C\uDFFF", + [":bowl_with_spoon:"] = "\uD83E\uDD63", + [":bowling:"] = "\uD83C\uDFB3", + [":boxing_glove:"] = "\uD83E\uDD4A", + [":boxing_gloves:"] = "\uD83E\uDD4A", + [":boy:"] = "\uD83D\uDC66", + [":boy::skin-tone-1:"] = "\uD83D\uDC66\uD83C\uDFFB", + [":boy::skin-tone-2:"] = "\uD83D\uDC66\uD83C\uDFFC", + [":boy::skin-tone-3:"] = "\uD83D\uDC66\uD83C\uDFFD", + [":boy::skin-tone-4:"] = "\uD83D\uDC66\uD83C\uDFFE", + [":boy::skin-tone-5:"] = "\uD83D\uDC66\uD83C\uDFFF", + [":boy_tone1:"] = "\uD83D\uDC66\uD83C\uDFFB", + [":boy_tone2:"] = "\uD83D\uDC66\uD83C\uDFFC", + [":boy_tone3:"] = "\uD83D\uDC66\uD83C\uDFFD", + [":boy_tone4:"] = "\uD83D\uDC66\uD83C\uDFFE", + [":boy_tone5:"] = "\uD83D\uDC66\uD83C\uDFFF", + [":brain:"] = "\uD83E\uDDE0", + [":bread:"] = "\uD83C\uDF5E", + [":breast_feeding:"] = "\uD83E\uDD31", + [":breast_feeding::skin-tone-1:"] = "\uD83E\uDD31\uD83C\uDFFB", + [":breast_feeding::skin-tone-2:"] = "\uD83E\uDD31\uD83C\uDFFC", + [":breast_feeding::skin-tone-3:"] = "\uD83E\uDD31\uD83C\uDFFD", + [":breast_feeding::skin-tone-4:"] = "\uD83E\uDD31\uD83C\uDFFE", + [":breast_feeding::skin-tone-5:"] = "\uD83E\uDD31\uD83C\uDFFF", + [":breast_feeding_dark_skin_tone:"] = "\uD83E\uDD31\uD83C\uDFFF", + [":breast_feeding_light_skin_tone:"] = "\uD83E\uDD31\uD83C\uDFFB", + [":breast_feeding_medium_dark_skin_tone:"] = "\uD83E\uDD31\uD83C\uDFFE", + [":breast_feeding_medium_light_skin_tone:"] = "\uD83E\uDD31\uD83C\uDFFC", + [":breast_feeding_medium_skin_tone:"] = "\uD83E\uDD31\uD83C\uDFFD", + [":breast_feeding_tone1:"] = "\uD83E\uDD31\uD83C\uDFFB", + [":breast_feeding_tone2:"] = "\uD83E\uDD31\uD83C\uDFFC", + [":breast_feeding_tone3:"] = "\uD83E\uDD31\uD83C\uDFFD", + [":breast_feeding_tone4:"] = "\uD83E\uDD31\uD83C\uDFFE", + [":breast_feeding_tone5:"] = "\uD83E\uDD31\uD83C\uDFFF", + [":bricks:"] = "\uD83E\uDDF1", + [":bride_with_veil:"] = "\uD83D\uDC70", + [":bride_with_veil::skin-tone-1:"] = "\uD83D\uDC70\uD83C\uDFFB", + [":bride_with_veil::skin-tone-2:"] = "\uD83D\uDC70\uD83C\uDFFC", + [":bride_with_veil::skin-tone-3:"] = "\uD83D\uDC70\uD83C\uDFFD", + [":bride_with_veil::skin-tone-4:"] = "\uD83D\uDC70\uD83C\uDFFE", + [":bride_with_veil::skin-tone-5:"] = "\uD83D\uDC70\uD83C\uDFFF", + [":bride_with_veil_tone1:"] = "\uD83D\uDC70\uD83C\uDFFB", + [":bride_with_veil_tone2:"] = "\uD83D\uDC70\uD83C\uDFFC", + [":bride_with_veil_tone3:"] = "\uD83D\uDC70\uD83C\uDFFD", + [":bride_with_veil_tone4:"] = "\uD83D\uDC70\uD83C\uDFFE", + [":bride_with_veil_tone5:"] = "\uD83D\uDC70\uD83C\uDFFF", + [":bridge_at_night:"] = "\uD83C\uDF09", + [":briefcase:"] = "\uD83D\uDCBC", + [":briefs:"] = "\uD83E\uDE72", + [":broccoli:"] = "\uD83E\uDD66", + [":broken_heart:"] = "\uD83D\uDC94", + [":broom:"] = "\uD83E\uDDF9", + [":brown_circle:"] = "\uD83D\uDFE4", + [":brown_heart:"] = "\uD83E\uDD0E", + [":brown_square:"] = "\uD83D\uDFEB", + [":bug:"] = "\uD83D\uDC1B", + [":building_construction:"] = "\uD83C\uDFD7️", + [":bulb:"] = "\uD83D\uDCA1", + [":bullettrain_front:"] = "\uD83D\uDE85", + [":bullettrain_side:"] = "\uD83D\uDE84", + [":burrito:"] = "\uD83C\uDF2F", + [":bus:"] = "\uD83D\uDE8C", + [":busstop:"] = "\uD83D\uDE8F", + [":bust_in_silhouette:"] = "\uD83D\uDC64", + [":busts_in_silhouette:"] = "\uD83D\uDC65", + [":butter:"] = "\uD83E\uDDC8", + [":butterfly:"] = "\uD83E\uDD8B", + [":cactus:"] = "\uD83C\uDF35", + [":cake:"] = "\uD83C\uDF70", + [":calendar:"] = "\uD83D\uDCC6", + [":calendar_spiral:"] = "\uD83D\uDDD3️", + [":call_me:"] = "\uD83E\uDD19", + [":call_me::skin-tone-1:"] = "\uD83E\uDD19\uD83C\uDFFB", + [":call_me::skin-tone-2:"] = "\uD83E\uDD19\uD83C\uDFFC", + [":call_me::skin-tone-3:"] = "\uD83E\uDD19\uD83C\uDFFD", + [":call_me::skin-tone-4:"] = "\uD83E\uDD19\uD83C\uDFFE", + [":call_me::skin-tone-5:"] = "\uD83E\uDD19\uD83C\uDFFF", + [":call_me_hand:"] = "\uD83E\uDD19", + [":call_me_hand::skin-tone-1:"] = "\uD83E\uDD19\uD83C\uDFFB", + [":call_me_hand::skin-tone-2:"] = "\uD83E\uDD19\uD83C\uDFFC", + [":call_me_hand::skin-tone-3:"] = "\uD83E\uDD19\uD83C\uDFFD", + [":call_me_hand::skin-tone-4:"] = "\uD83E\uDD19\uD83C\uDFFE", + [":call_me_hand::skin-tone-5:"] = "\uD83E\uDD19\uD83C\uDFFF", + [":call_me_hand_tone1:"] = "\uD83E\uDD19\uD83C\uDFFB", + [":call_me_hand_tone2:"] = "\uD83E\uDD19\uD83C\uDFFC", + [":call_me_hand_tone3:"] = "\uD83E\uDD19\uD83C\uDFFD", + [":call_me_hand_tone4:"] = "\uD83E\uDD19\uD83C\uDFFE", + [":call_me_hand_tone5:"] = "\uD83E\uDD19\uD83C\uDFFF", + [":call_me_tone1:"] = "\uD83E\uDD19\uD83C\uDFFB", + [":call_me_tone2:"] = "\uD83E\uDD19\uD83C\uDFFC", + [":call_me_tone3:"] = "\uD83E\uDD19\uD83C\uDFFD", + [":call_me_tone4:"] = "\uD83E\uDD19\uD83C\uDFFE", + [":call_me_tone5:"] = "\uD83E\uDD19\uD83C\uDFFF", + [":calling:"] = "\uD83D\uDCF2", + [":camel:"] = "\uD83D\uDC2B", + [":camera:"] = "\uD83D\uDCF7", + [":camera_with_flash:"] = "\uD83D\uDCF8", + [":camping:"] = "\uD83C\uDFD5️", + [":cancer:"] = "♋", + [":candle:"] = "\uD83D\uDD6F️", + [":candy:"] = "\uD83C\uDF6C", + [":canned_food:"] = "\uD83E\uDD6B", + [":canoe:"] = "\uD83D\uDEF6", + [":capital_abcd:"] = "\uD83D\uDD20", + [":capricorn:"] = "♑", + [":card_box:"] = "\uD83D\uDDC3️", + [":card_file_box:"] = "\uD83D\uDDC3️", + [":card_index:"] = "\uD83D\uDCC7", + [":card_index_dividers:"] = "\uD83D\uDDC2️", + [":carousel_horse:"] = "\uD83C\uDFA0", + [":carrot:"] = "\uD83E\uDD55", + [":cartwheel:"] = "\uD83E\uDD38", + [":cartwheel::skin-tone-1:"] = "\uD83E\uDD38\uD83C\uDFFB", + [":cartwheel::skin-tone-2:"] = "\uD83E\uDD38\uD83C\uDFFC", + [":cartwheel::skin-tone-3:"] = "\uD83E\uDD38\uD83C\uDFFD", + [":cartwheel::skin-tone-4:"] = "\uD83E\uDD38\uD83C\uDFFE", + [":cartwheel::skin-tone-5:"] = "\uD83E\uDD38\uD83C\uDFFF", + [":cartwheel_tone1:"] = "\uD83E\uDD38\uD83C\uDFFB", + [":cartwheel_tone2:"] = "\uD83E\uDD38\uD83C\uDFFC", + [":cartwheel_tone3:"] = "\uD83E\uDD38\uD83C\uDFFD", + [":cartwheel_tone4:"] = "\uD83E\uDD38\uD83C\uDFFE", + [":cartwheel_tone5:"] = "\uD83E\uDD38\uD83C\uDFFF", + [":cat2:"] = "\uD83D\uDC08", + [":cat:"] = "\uD83D\uDC31", + [":cd:"] = "\uD83D\uDCBF", + [":chains:"] = "⛓️", + [":chair:"] = "\uD83E\uDE91", + [":champagne:"] = "\uD83C\uDF7E", + [":champagne_glass:"] = "\uD83E\uDD42", + [":chart:"] = "\uD83D\uDCB9", + [":chart_with_downwards_trend:"] = "\uD83D\uDCC9", + [":chart_with_upwards_trend:"] = "\uD83D\uDCC8", + [":checkered_flag:"] = "\uD83C\uDFC1", + [":cheese:"] = "\uD83E\uDDC0", + [":cheese_wedge:"] = "\uD83E\uDDC0", + [":cherries:"] = "\uD83C\uDF52", + [":cherry_blossom:"] = "\uD83C\uDF38", + [":chess_pawn:"] = "♟️", + [":chestnut:"] = "\uD83C\uDF30", + [":chicken:"] = "\uD83D\uDC14", + [":child:"] = "\uD83E\uDDD2", + [":child::skin-tone-1:"] = "\uD83E\uDDD2\uD83C\uDFFB", + [":child::skin-tone-2:"] = "\uD83E\uDDD2\uD83C\uDFFC", + [":child::skin-tone-3:"] = "\uD83E\uDDD2\uD83C\uDFFD", + [":child::skin-tone-4:"] = "\uD83E\uDDD2\uD83C\uDFFE", + [":child::skin-tone-5:"] = "\uD83E\uDDD2\uD83C\uDFFF", + [":child_dark_skin_tone:"] = "\uD83E\uDDD2\uD83C\uDFFF", + [":child_light_skin_tone:"] = "\uD83E\uDDD2\uD83C\uDFFB", + [":child_medium_dark_skin_tone:"] = "\uD83E\uDDD2\uD83C\uDFFE", + [":child_medium_light_skin_tone:"] = "\uD83E\uDDD2\uD83C\uDFFC", + [":child_medium_skin_tone:"] = "\uD83E\uDDD2\uD83C\uDFFD", + [":child_tone1:"] = "\uD83E\uDDD2\uD83C\uDFFB", + [":child_tone2:"] = "\uD83E\uDDD2\uD83C\uDFFC", + [":child_tone3:"] = "\uD83E\uDDD2\uD83C\uDFFD", + [":child_tone4:"] = "\uD83E\uDDD2\uD83C\uDFFE", + [":child_tone5:"] = "\uD83E\uDDD2\uD83C\uDFFF", + [":children_crossing:"] = "\uD83D\uDEB8", + [":chipmunk:"] = "\uD83D\uDC3F️", + [":chocolate_bar:"] = "\uD83C\uDF6B", + [":chopsticks:"] = "\uD83E\uDD62", + [":christmas_tree:"] = "\uD83C\uDF84", + [":church:"] = "⛪", + [":cinema:"] = "\uD83C\uDFA6", + [":circus_tent:"] = "\uD83C\uDFAA", + [":city_dusk:"] = "\uD83C\uDF06", + [":city_sunrise:"] = "\uD83C\uDF07", + [":city_sunset:"] = "\uD83C\uDF07", + [":cityscape:"] = "\uD83C\uDFD9️", + [":cl:"] = "\uD83C\uDD91", + [":clap:"] = "\uD83D\uDC4F", + [":clap::skin-tone-1:"] = "\uD83D\uDC4F\uD83C\uDFFB", + [":clap::skin-tone-2:"] = "\uD83D\uDC4F\uD83C\uDFFC", + [":clap::skin-tone-3:"] = "\uD83D\uDC4F\uD83C\uDFFD", + [":clap::skin-tone-4:"] = "\uD83D\uDC4F\uD83C\uDFFE", + [":clap::skin-tone-5:"] = "\uD83D\uDC4F\uD83C\uDFFF", + [":clap_tone1:"] = "\uD83D\uDC4F\uD83C\uDFFB", + [":clap_tone2:"] = "\uD83D\uDC4F\uD83C\uDFFC", + [":clap_tone3:"] = "\uD83D\uDC4F\uD83C\uDFFD", + [":clap_tone4:"] = "\uD83D\uDC4F\uD83C\uDFFE", + [":clap_tone5:"] = "\uD83D\uDC4F\uD83C\uDFFF", + [":clapper:"] = "\uD83C\uDFAC", + [":classical_building:"] = "\uD83C\uDFDB️", + [":clinking_glass:"] = "\uD83E\uDD42", + [":clipboard:"] = "\uD83D\uDCCB", + [":clock1030:"] = "\uD83D\uDD65", + [":clock10:"] = "\uD83D\uDD59", + [":clock1130:"] = "\uD83D\uDD66", + [":clock11:"] = "\uD83D\uDD5A", + [":clock1230:"] = "\uD83D\uDD67", + [":clock12:"] = "\uD83D\uDD5B", + [":clock130:"] = "\uD83D\uDD5C", + [":clock1:"] = "\uD83D\uDD50", + [":clock230:"] = "\uD83D\uDD5D", + [":clock2:"] = "\uD83D\uDD51", + [":clock330:"] = "\uD83D\uDD5E", + [":clock3:"] = "\uD83D\uDD52", + [":clock430:"] = "\uD83D\uDD5F", + [":clock4:"] = "\uD83D\uDD53", + [":clock530:"] = "\uD83D\uDD60", + [":clock5:"] = "\uD83D\uDD54", + [":clock630:"] = "\uD83D\uDD61", + [":clock6:"] = "\uD83D\uDD55", + [":clock730:"] = "\uD83D\uDD62", + [":clock7:"] = "\uD83D\uDD56", + [":clock830:"] = "\uD83D\uDD63", + [":clock8:"] = "\uD83D\uDD57", + [":clock930:"] = "\uD83D\uDD64", + [":clock9:"] = "\uD83D\uDD58", + [":clock:"] = "\uD83D\uDD70️", + [":closed_book:"] = "\uD83D\uDCD5", + [":closed_lock_with_key:"] = "\uD83D\uDD10", + [":closed_umbrella:"] = "\uD83C\uDF02", + [":cloud:"] = "☁️", + [":cloud_lightning:"] = "\uD83C\uDF29️", + [":cloud_rain:"] = "\uD83C\uDF27️", + [":cloud_snow:"] = "\uD83C\uDF28️", + [":cloud_tornado:"] = "\uD83C\uDF2A️", + [":cloud_with_lightning:"] = "\uD83C\uDF29️", + [":cloud_with_rain:"] = "\uD83C\uDF27️", + [":cloud_with_snow:"] = "\uD83C\uDF28️", + [":cloud_with_tornado:"] = "\uD83C\uDF2A️", + [":clown:"] = "\uD83E\uDD21", + [":clown_face:"] = "\uD83E\uDD21", + [":clubs:"] = "♣️", + [":coat:"] = "\uD83E\uDDE5", + [":cocktail:"] = "\uD83C\uDF78", + [":coconut:"] = "\uD83E\uDD65", + [":coffee:"] = "☕", + [":coffin:"] = "⚰️", + [":cold_face:"] = "\uD83E\uDD76", + [":cold_sweat:"] = "\uD83D\uDE30", + [":comet:"] = "☄️", + [":compass:"] = "\uD83E\uDDED", + [":compression:"] = "\uD83D\uDDDC️", + [":computer:"] = "\uD83D\uDCBB", + [":confetti_ball:"] = "\uD83C\uDF8A", + [":confounded:"] = "\uD83D\uDE16", + [":confused:"] = "\uD83D\uDE15", + [":congratulations:"] = "㊗️", + [":construction:"] = "\uD83D\uDEA7", + [":construction_site:"] = "\uD83C\uDFD7️", + [":construction_worker:"] = "\uD83D\uDC77", + [":construction_worker::skin-tone-1:"] = "\uD83D\uDC77\uD83C\uDFFB", + [":construction_worker::skin-tone-2:"] = "\uD83D\uDC77\uD83C\uDFFC", + [":construction_worker::skin-tone-3:"] = "\uD83D\uDC77\uD83C\uDFFD", + [":construction_worker::skin-tone-4:"] = "\uD83D\uDC77\uD83C\uDFFE", + [":construction_worker::skin-tone-5:"] = "\uD83D\uDC77\uD83C\uDFFF", + [":construction_worker_tone1:"] = "\uD83D\uDC77\uD83C\uDFFB", + [":construction_worker_tone2:"] = "\uD83D\uDC77\uD83C\uDFFC", + [":construction_worker_tone3:"] = "\uD83D\uDC77\uD83C\uDFFD", + [":construction_worker_tone4:"] = "\uD83D\uDC77\uD83C\uDFFE", + [":construction_worker_tone5:"] = "\uD83D\uDC77\uD83C\uDFFF", + [":control_knobs:"] = "\uD83C\uDF9B️", + [":convenience_store:"] = "\uD83C\uDFEA", + [":cookie:"] = "\uD83C\uDF6A", + [":cooking:"] = "\uD83C\uDF73", + [":cool:"] = "\uD83C\uDD92", + [":cop:"] = "\uD83D\uDC6E", + [":cop::skin-tone-1:"] = "\uD83D\uDC6E\uD83C\uDFFB", + [":cop::skin-tone-2:"] = "\uD83D\uDC6E\uD83C\uDFFC", + [":cop::skin-tone-3:"] = "\uD83D\uDC6E\uD83C\uDFFD", + [":cop::skin-tone-4:"] = "\uD83D\uDC6E\uD83C\uDFFE", + [":cop::skin-tone-5:"] = "\uD83D\uDC6E\uD83C\uDFFF", + [":cop_tone1:"] = "\uD83D\uDC6E\uD83C\uDFFB", + [":cop_tone2:"] = "\uD83D\uDC6E\uD83C\uDFFC", + [":cop_tone3:"] = "\uD83D\uDC6E\uD83C\uDFFD", + [":cop_tone4:"] = "\uD83D\uDC6E\uD83C\uDFFE", + [":cop_tone5:"] = "\uD83D\uDC6E\uD83C\uDFFF", + [":copyright:"] = "©️", + [":corn:"] = "\uD83C\uDF3D", + [":couch:"] = "\uD83D\uDECB️", + [":couch_and_lamp:"] = "\uD83D\uDECB️", + [":couple:"] = "\uD83D\uDC6B", + [":couple_mm:"] = "\uD83D\uDC68\u200D❤️\u200D\uD83D\uDC68", + [":couple_with_heart:"] = "\uD83D\uDC91", + [":couple_with_heart_mm:"] = "\uD83D\uDC68\u200D❤️\u200D\uD83D\uDC68", + [":couple_with_heart_woman_man:"] = "\uD83D\uDC69\u200D❤️\u200D\uD83D\uDC68", + [":couple_with_heart_ww:"] = "\uD83D\uDC69\u200D❤️\u200D\uD83D\uDC69", + [":couple_ww:"] = "\uD83D\uDC69\u200D❤️\u200D\uD83D\uDC69", + [":couplekiss:"] = "\uD83D\uDC8F", + [":couplekiss_mm:"] = "\uD83D\uDC68\u200D❤️\u200D\uD83D\uDC8B\u200D\uD83D\uDC68", + [":couplekiss_ww:"] = "\uD83D\uDC69\u200D❤️\u200D\uD83D\uDC8B\u200D\uD83D\uDC69", + [":cow2:"] = "\uD83D\uDC04", + [":cow:"] = "\uD83D\uDC2E", + [":cowboy:"] = "\uD83E\uDD20", + [":crab:"] = "\uD83E\uDD80", + [":crayon:"] = "\uD83D\uDD8D️", + [":credit_card:"] = "\uD83D\uDCB3", + [":crescent_moon:"] = "\uD83C\uDF19", + [":cricket:"] = "\uD83E\uDD97", + [":cricket_bat_ball:"] = "\uD83C\uDFCF", + [":cricket_game:"] = "\uD83C\uDFCF", + [":crocodile:"] = "\uD83D\uDC0A", + [":croissant:"] = "\uD83E\uDD50", + [":cross:"] = "✝️", + [":crossed_flags:"] = "\uD83C\uDF8C", + [":crossed_swords:"] = "⚔️", + [":crown:"] = "\uD83D\uDC51", + [":cruise_ship:"] = "\uD83D\uDEF3️", + [":cry:"] = "\uD83D\uDE22", + [":crying_cat_face:"] = "\uD83D\uDE3F", + [":crystal_ball:"] = "\uD83D\uDD2E", + [":cucumber:"] = "\uD83E\uDD52", + [":cup_with_straw:"] = "\uD83E\uDD64", + [":cupcake:"] = "\uD83E\uDDC1", + [":cupid:"] = "\uD83D\uDC98", + [":curling_stone:"] = "\uD83E\uDD4C", + [":curly_loop:"] = "➰", + [":currency_exchange:"] = "\uD83D\uDCB1", + [":curry:"] = "\uD83C\uDF5B", + [":custard:"] = "\uD83C\uDF6E", + [":customs:"] = "\uD83D\uDEC3", + [":cut_of_meat:"] = "\uD83E\uDD69", + [":cyclone:"] = "\uD83C\uDF00", + [":dagger:"] = "\uD83D\uDDE1️", + [":dagger_knife:"] = "\uD83D\uDDE1️", + [":dancer:"] = "\uD83D\uDC83", + [":dancer::skin-tone-1:"] = "\uD83D\uDC83\uD83C\uDFFB", + [":dancer::skin-tone-2:"] = "\uD83D\uDC83\uD83C\uDFFC", + [":dancer::skin-tone-3:"] = "\uD83D\uDC83\uD83C\uDFFD", + [":dancer::skin-tone-4:"] = "\uD83D\uDC83\uD83C\uDFFE", + [":dancer::skin-tone-5:"] = "\uD83D\uDC83\uD83C\uDFFF", + [":dancer_tone1:"] = "\uD83D\uDC83\uD83C\uDFFB", + [":dancer_tone2:"] = "\uD83D\uDC83\uD83C\uDFFC", + [":dancer_tone3:"] = "\uD83D\uDC83\uD83C\uDFFD", + [":dancer_tone4:"] = "\uD83D\uDC83\uD83C\uDFFE", + [":dancer_tone5:"] = "\uD83D\uDC83\uD83C\uDFFF", + [":dancers:"] = "\uD83D\uDC6F", + [":dango:"] = "\uD83C\uDF61", + [":dark_sunglasses:"] = "\uD83D\uDD76️", + [":dart:"] = "\uD83C\uDFAF", + [":dash:"] = "\uD83D\uDCA8", + [":date:"] = "\uD83D\uDCC5", + [":deaf_man:"] = "\uD83E\uDDCF\u200D♂️", + [":deaf_man::skin-tone-1:"] = "\uD83E\uDDCF\uD83C\uDFFB\u200D♂️", + [":deaf_man::skin-tone-2:"] = "\uD83E\uDDCF\uD83C\uDFFC\u200D♂️", + [":deaf_man::skin-tone-3:"] = "\uD83E\uDDCF\uD83C\uDFFD\u200D♂️", + [":deaf_man::skin-tone-4:"] = "\uD83E\uDDCF\uD83C\uDFFE\u200D♂️", + [":deaf_man::skin-tone-5:"] = "\uD83E\uDDCF\uD83C\uDFFF\u200D♂️", + [":deaf_man_dark_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFF\u200D♂️", + [":deaf_man_light_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFB\u200D♂️", + [":deaf_man_medium_dark_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFE\u200D♂️", + [":deaf_man_medium_light_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFC\u200D♂️", + [":deaf_man_medium_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFD\u200D♂️", + [":deaf_man_tone1:"] = "\uD83E\uDDCF\uD83C\uDFFB\u200D♂️", + [":deaf_man_tone2:"] = "\uD83E\uDDCF\uD83C\uDFFC\u200D♂️", + [":deaf_man_tone3:"] = "\uD83E\uDDCF\uD83C\uDFFD\u200D♂️", + [":deaf_man_tone4:"] = "\uD83E\uDDCF\uD83C\uDFFE\u200D♂️", + [":deaf_man_tone5:"] = "\uD83E\uDDCF\uD83C\uDFFF\u200D♂️", + [":deaf_person:"] = "\uD83E\uDDCF", + [":deaf_person::skin-tone-1:"] = "\uD83E\uDDCF\uD83C\uDFFB", + [":deaf_person::skin-tone-2:"] = "\uD83E\uDDCF\uD83C\uDFFC", + [":deaf_person::skin-tone-3:"] = "\uD83E\uDDCF\uD83C\uDFFD", + [":deaf_person::skin-tone-4:"] = "\uD83E\uDDCF\uD83C\uDFFE", + [":deaf_person::skin-tone-5:"] = "\uD83E\uDDCF\uD83C\uDFFF", + [":deaf_person_dark_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFF", + [":deaf_person_light_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFB", + [":deaf_person_medium_dark_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFE", + [":deaf_person_medium_light_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFC", + [":deaf_person_medium_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFD", + [":deaf_person_tone1:"] = "\uD83E\uDDCF\uD83C\uDFFB", + [":deaf_person_tone2:"] = "\uD83E\uDDCF\uD83C\uDFFC", + [":deaf_person_tone3:"] = "\uD83E\uDDCF\uD83C\uDFFD", + [":deaf_person_tone4:"] = "\uD83E\uDDCF\uD83C\uDFFE", + [":deaf_person_tone5:"] = "\uD83E\uDDCF\uD83C\uDFFF", + [":deaf_woman:"] = "\uD83E\uDDCF\u200D♀️", + [":deaf_woman::skin-tone-1:"] = "\uD83E\uDDCF\uD83C\uDFFB\u200D♀️", + [":deaf_woman::skin-tone-2:"] = "\uD83E\uDDCF\uD83C\uDFFC\u200D♀️", + [":deaf_woman::skin-tone-3:"] = "\uD83E\uDDCF\uD83C\uDFFD\u200D♀️", + [":deaf_woman::skin-tone-4:"] = "\uD83E\uDDCF\uD83C\uDFFE\u200D♀️", + [":deaf_woman::skin-tone-5:"] = "\uD83E\uDDCF\uD83C\uDFFF\u200D♀️", + [":deaf_woman_dark_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFF\u200D♀️", + [":deaf_woman_light_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFB\u200D♀️", + [":deaf_woman_medium_dark_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFE\u200D♀️", + [":deaf_woman_medium_light_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFC\u200D♀️", + [":deaf_woman_medium_skin_tone:"] = "\uD83E\uDDCF\uD83C\uDFFD\u200D♀️", + [":deaf_woman_tone1:"] = "\uD83E\uDDCF\uD83C\uDFFB\u200D♀️", + [":deaf_woman_tone2:"] = "\uD83E\uDDCF\uD83C\uDFFC\u200D♀️", + [":deaf_woman_tone3:"] = "\uD83E\uDDCF\uD83C\uDFFD\u200D♀️", + [":deaf_woman_tone4:"] = "\uD83E\uDDCF\uD83C\uDFFE\u200D♀️", + [":deaf_woman_tone5:"] = "\uD83E\uDDCF\uD83C\uDFFF\u200D♀️", + [":deciduous_tree:"] = "\uD83C\uDF33", + [":deer:"] = "\uD83E\uDD8C", + [":department_store:"] = "\uD83C\uDFEC", + [":derelict_house_building:"] = "\uD83C\uDFDA️", + [":desert:"] = "\uD83C\uDFDC️", + [":desert_island:"] = "\uD83C\uDFDD️", + [":desktop:"] = "\uD83D\uDDA5️", + [":desktop_computer:"] = "\uD83D\uDDA5️", + [":detective:"] = "\uD83D\uDD75️", + [":detective::skin-tone-1:"] = "\uD83D\uDD75\uD83C\uDFFB", + [":detective::skin-tone-2:"] = "\uD83D\uDD75\uD83C\uDFFC", + [":detective::skin-tone-3:"] = "\uD83D\uDD75\uD83C\uDFFD", + [":detective::skin-tone-4:"] = "\uD83D\uDD75\uD83C\uDFFE", + [":detective::skin-tone-5:"] = "\uD83D\uDD75\uD83C\uDFFF", + [":detective_tone1:"] = "\uD83D\uDD75\uD83C\uDFFB", + [":detective_tone2:"] = "\uD83D\uDD75\uD83C\uDFFC", + [":detective_tone3:"] = "\uD83D\uDD75\uD83C\uDFFD", + [":detective_tone4:"] = "\uD83D\uDD75\uD83C\uDFFE", + [":detective_tone5:"] = "\uD83D\uDD75\uD83C\uDFFF", + [":diamond_shape_with_a_dot_inside:"] = "\uD83D\uDCA0", + [":diamonds:"] = "♦️", + [":disappointed:"] = "\uD83D\uDE1E", + [":disappointed_relieved:"] = "\uD83D\uDE25", + [":dividers:"] = "\uD83D\uDDC2️", + [":diving_mask:"] = "\uD83E\uDD3F", + [":diya_lamp:"] = "\uD83E\uDE94", + [":dizzy:"] = "\uD83D\uDCAB", + [":dizzy_face:"] = "\uD83D\uDE35", + [":dna:"] = "\uD83E\uDDEC", + [":do_not_litter:"] = "\uD83D\uDEAF", + [":dog2:"] = "\uD83D\uDC15", + [":dog:"] = "\uD83D\uDC36", + [":dollar:"] = "\uD83D\uDCB5", + [":dolls:"] = "\uD83C\uDF8E", + [":dolphin:"] = "\uD83D\uDC2C", + [":door:"] = "\uD83D\uDEAA", + [":double_vertical_bar:"] = "⏸️", + [":doughnut:"] = "\uD83C\uDF69", + [":dove:"] = "\uD83D\uDD4A️", + [":dove_of_peace:"] = "\uD83D\uDD4A️", + [":dragon:"] = "\uD83D\uDC09", + [":dragon_face:"] = "\uD83D\uDC32", + [":dress:"] = "\uD83D\uDC57", + [":dromedary_camel:"] = "\uD83D\uDC2A", + [":drool:"] = "\uD83E\uDD24", + [":drooling_face:"] = "\uD83E\uDD24", + [":drop_of_blood:"] = "\uD83E\uDE78", + [":droplet:"] = "\uD83D\uDCA7", + [":drum:"] = "\uD83E\uDD41", + [":drum_with_drumsticks:"] = "\uD83E\uDD41", + [":duck:"] = "\uD83E\uDD86", + [":dumpling:"] = "\uD83E\uDD5F", + [":dvd:"] = "\uD83D\uDCC0", + [":e_mail:"] = "\uD83D\uDCE7", + [":eagle:"] = "\uD83E\uDD85", + [":ear:"] = "\uD83D\uDC42", + [":ear::skin-tone-1:"] = "\uD83D\uDC42\uD83C\uDFFB", + [":ear::skin-tone-2:"] = "\uD83D\uDC42\uD83C\uDFFC", + [":ear::skin-tone-3:"] = "\uD83D\uDC42\uD83C\uDFFD", + [":ear::skin-tone-4:"] = "\uD83D\uDC42\uD83C\uDFFE", + [":ear::skin-tone-5:"] = "\uD83D\uDC42\uD83C\uDFFF", + [":ear_of_rice:"] = "\uD83C\uDF3E", + [":ear_tone1:"] = "\uD83D\uDC42\uD83C\uDFFB", + [":ear_tone2:"] = "\uD83D\uDC42\uD83C\uDFFC", + [":ear_tone3:"] = "\uD83D\uDC42\uD83C\uDFFD", + [":ear_tone4:"] = "\uD83D\uDC42\uD83C\uDFFE", + [":ear_tone5:"] = "\uD83D\uDC42\uD83C\uDFFF", + [":ear_with_hearing_aid:"] = "\uD83E\uDDBB", + [":ear_with_hearing_aid::skin-tone-1:"] = "\uD83E\uDDBB\uD83C\uDFFB", + [":ear_with_hearing_aid::skin-tone-2:"] = "\uD83E\uDDBB\uD83C\uDFFC", + [":ear_with_hearing_aid::skin-tone-3:"] = "\uD83E\uDDBB\uD83C\uDFFD", + [":ear_with_hearing_aid::skin-tone-4:"] = "\uD83E\uDDBB\uD83C\uDFFE", + [":ear_with_hearing_aid::skin-tone-5:"] = "\uD83E\uDDBB\uD83C\uDFFF", + [":ear_with_hearing_aid_dark_skin_tone:"] = "\uD83E\uDDBB\uD83C\uDFFF", + [":ear_with_hearing_aid_light_skin_tone:"] = "\uD83E\uDDBB\uD83C\uDFFB", + [":ear_with_hearing_aid_medium_dark_skin_tone:"] = "\uD83E\uDDBB\uD83C\uDFFE", + [":ear_with_hearing_aid_medium_light_skin_tone:"] = "\uD83E\uDDBB\uD83C\uDFFC", + [":ear_with_hearing_aid_medium_skin_tone:"] = "\uD83E\uDDBB\uD83C\uDFFD", + [":ear_with_hearing_aid_tone1:"] = "\uD83E\uDDBB\uD83C\uDFFB", + [":ear_with_hearing_aid_tone2:"] = "\uD83E\uDDBB\uD83C\uDFFC", + [":ear_with_hearing_aid_tone3:"] = "\uD83E\uDDBB\uD83C\uDFFD", + [":ear_with_hearing_aid_tone4:"] = "\uD83E\uDDBB\uD83C\uDFFE", + [":ear_with_hearing_aid_tone5:"] = "\uD83E\uDDBB\uD83C\uDFFF", + [":earth_africa:"] = "\uD83C\uDF0D", + [":earth_americas:"] = "\uD83C\uDF0E", + [":earth_asia:"] = "\uD83C\uDF0F", + [":egg:"] = "\uD83E\uDD5A", + [":eggplant:"] = "\uD83C\uDF46", + [":eight:"] = "8️⃣", + [":eight_pointed_black_star:"] = "✴️", + [":eight_spoked_asterisk:"] = "✳️", + [":eject:"] = "⏏️", + [":eject_symbol:"] = "⏏️", + [":electric_plug:"] = "\uD83D\uDD0C", + [":elephant:"] = "\uD83D\uDC18", + [":elf:"] = "\uD83E\uDDDD", + [":elf::skin-tone-1:"] = "\uD83E\uDDDD\uD83C\uDFFB", + [":elf::skin-tone-2:"] = "\uD83E\uDDDD\uD83C\uDFFC", + [":elf::skin-tone-3:"] = "\uD83E\uDDDD\uD83C\uDFFD", + [":elf::skin-tone-4:"] = "\uD83E\uDDDD\uD83C\uDFFE", + [":elf::skin-tone-5:"] = "\uD83E\uDDDD\uD83C\uDFFF", + [":elf_dark_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFF", + [":elf_light_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFB", + [":elf_medium_dark_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFE", + [":elf_medium_light_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFC", + [":elf_medium_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFD", + [":elf_tone1:"] = "\uD83E\uDDDD\uD83C\uDFFB", + [":elf_tone2:"] = "\uD83E\uDDDD\uD83C\uDFFC", + [":elf_tone3:"] = "\uD83E\uDDDD\uD83C\uDFFD", + [":elf_tone4:"] = "\uD83E\uDDDD\uD83C\uDFFE", + [":elf_tone5:"] = "\uD83E\uDDDD\uD83C\uDFFF", + [":email:"] = "\uD83D\uDCE7", + [":end:"] = "\uD83D\uDD1A", + [":england:"] = "\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67\uDB40\uDC7F", + [":envelope:"] = "✉️", + [":envelope_with_arrow:"] = "\uD83D\uDCE9", + [":euro:"] = "\uD83D\uDCB6", + [":european_castle:"] = "\uD83C\uDFF0", + [":european_post_office:"] = "\uD83C\uDFE4", + [":evergreen_tree:"] = "\uD83C\uDF32", + [":exclamation:"] = "❗", + [":expecting_woman:"] = "\uD83E\uDD30", + [":expecting_woman::skin-tone-1:"] = "\uD83E\uDD30\uD83C\uDFFB", + [":expecting_woman::skin-tone-2:"] = "\uD83E\uDD30\uD83C\uDFFC", + [":expecting_woman::skin-tone-3:"] = "\uD83E\uDD30\uD83C\uDFFD", + [":expecting_woman::skin-tone-4:"] = "\uD83E\uDD30\uD83C\uDFFE", + [":expecting_woman::skin-tone-5:"] = "\uD83E\uDD30\uD83C\uDFFF", + [":expecting_woman_tone1:"] = "\uD83E\uDD30\uD83C\uDFFB", + [":expecting_woman_tone2:"] = "\uD83E\uDD30\uD83C\uDFFC", + [":expecting_woman_tone3:"] = "\uD83E\uDD30\uD83C\uDFFD", + [":expecting_woman_tone4:"] = "\uD83E\uDD30\uD83C\uDFFE", + [":expecting_woman_tone5:"] = "\uD83E\uDD30\uD83C\uDFFF", + [":exploding_head:"] = "\uD83E\uDD2F", + [":expressionless:"] = "\uD83D\uDE11", + [":eye:"] = "\uD83D\uDC41️", + [":eye_in_speech_bubble:"] = "\uD83D\uDC41\u200D\uD83D\uDDE8", + [":eyeglasses:"] = "\uD83D\uDC53", + [":eyes:"] = "\uD83D\uDC40", + [":face_palm:"] = "\uD83E\uDD26", + [":face_palm::skin-tone-1:"] = "\uD83E\uDD26\uD83C\uDFFB", + [":face_palm::skin-tone-2:"] = "\uD83E\uDD26\uD83C\uDFFC", + [":face_palm::skin-tone-3:"] = "\uD83E\uDD26\uD83C\uDFFD", + [":face_palm::skin-tone-4:"] = "\uD83E\uDD26\uD83C\uDFFE", + [":face_palm::skin-tone-5:"] = "\uD83E\uDD26\uD83C\uDFFF", + [":face_palm_tone1:"] = "\uD83E\uDD26\uD83C\uDFFB", + [":face_palm_tone2:"] = "\uD83E\uDD26\uD83C\uDFFC", + [":face_palm_tone3:"] = "\uD83E\uDD26\uD83C\uDFFD", + [":face_palm_tone4:"] = "\uD83E\uDD26\uD83C\uDFFE", + [":face_palm_tone5:"] = "\uD83E\uDD26\uD83C\uDFFF", + [":face_vomiting:"] = "\uD83E\uDD2E", + [":face_with_cowboy_hat:"] = "\uD83E\uDD20", + [":face_with_hand_over_mouth:"] = "\uD83E\uDD2D", + [":face_with_head_bandage:"] = "\uD83E\uDD15", + [":face_with_monocle:"] = "\uD83E\uDDD0", + [":face_with_raised_eyebrow:"] = "\uD83E\uDD28", + [":face_with_rolling_eyes:"] = "\uD83D\uDE44", + [":face_with_symbols_over_mouth:"] = "\uD83E\uDD2C", + [":face_with_thermometer:"] = "\uD83E\uDD12", + [":facepalm:"] = "\uD83E\uDD26", + [":facepalm::skin-tone-1:"] = "\uD83E\uDD26\uD83C\uDFFB", + [":facepalm::skin-tone-2:"] = "\uD83E\uDD26\uD83C\uDFFC", + [":facepalm::skin-tone-3:"] = "\uD83E\uDD26\uD83C\uDFFD", + [":facepalm::skin-tone-4:"] = "\uD83E\uDD26\uD83C\uDFFE", + [":facepalm::skin-tone-5:"] = "\uD83E\uDD26\uD83C\uDFFF", + [":facepalm_tone1:"] = "\uD83E\uDD26\uD83C\uDFFB", + [":facepalm_tone2:"] = "\uD83E\uDD26\uD83C\uDFFC", + [":facepalm_tone3:"] = "\uD83E\uDD26\uD83C\uDFFD", + [":facepalm_tone4:"] = "\uD83E\uDD26\uD83C\uDFFE", + [":facepalm_tone5:"] = "\uD83E\uDD26\uD83C\uDFFF", + [":factory:"] = "\uD83C\uDFED", + [":fairy:"] = "\uD83E\uDDDA", + [":fairy::skin-tone-1:"] = "\uD83E\uDDDA\uD83C\uDFFB", + [":fairy::skin-tone-2:"] = "\uD83E\uDDDA\uD83C\uDFFC", + [":fairy::skin-tone-3:"] = "\uD83E\uDDDA\uD83C\uDFFD", + [":fairy::skin-tone-4:"] = "\uD83E\uDDDA\uD83C\uDFFE", + [":fairy::skin-tone-5:"] = "\uD83E\uDDDA\uD83C\uDFFF", + [":fairy_dark_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFF", + [":fairy_light_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFB", + [":fairy_medium_dark_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFE", + [":fairy_medium_light_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFC", + [":fairy_medium_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFD", + [":fairy_tone1:"] = "\uD83E\uDDDA\uD83C\uDFFB", + [":fairy_tone2:"] = "\uD83E\uDDDA\uD83C\uDFFC", + [":fairy_tone3:"] = "\uD83E\uDDDA\uD83C\uDFFD", + [":fairy_tone4:"] = "\uD83E\uDDDA\uD83C\uDFFE", + [":fairy_tone5:"] = "\uD83E\uDDDA\uD83C\uDFFF", + [":falafel:"] = "\uD83E\uDDC6", + [":fallen_leaf:"] = "\uD83C\uDF42", + [":family:"] = "\uD83D\uDC6A", + [":family_man_boy:"] = "\uD83D\uDC68\u200D\uD83D\uDC66", + [":family_man_boy_boy:"] = "\uD83D\uDC68\u200D\uD83D\uDC66\u200D\uD83D\uDC66", + [":family_man_girl:"] = "\uD83D\uDC68\u200D\uD83D\uDC67", + [":family_man_girl_boy:"] = "\uD83D\uDC68\u200D\uD83D\uDC67\u200D\uD83D\uDC66", + [":family_man_girl_girl:"] = "\uD83D\uDC68\u200D\uD83D\uDC67\u200D\uD83D\uDC67", + [":family_man_woman_boy:"] = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66", + [":family_mmb:"] = "\uD83D\uDC68\u200D\uD83D\uDC68\u200D\uD83D\uDC66", + [":family_mmbb:"] = "\uD83D\uDC68\u200D\uD83D\uDC68\u200D\uD83D\uDC66\u200D\uD83D\uDC66", + [":family_mmg:"] = "\uD83D\uDC68\u200D\uD83D\uDC68\u200D\uD83D\uDC67", + [":family_mmgb:"] = "\uD83D\uDC68\u200D\uD83D\uDC68\u200D\uD83D\uDC67\u200D\uD83D\uDC66", + [":family_mmgg:"] = "\uD83D\uDC68\u200D\uD83D\uDC68\u200D\uD83D\uDC67\u200D\uD83D\uDC67", + [":family_mwbb:"] = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66", + [":family_mwg:"] = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC67", + [":family_mwgb:"] = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC66", + [":family_mwgg:"] = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC67", + [":family_woman_boy:"] = "\uD83D\uDC69\u200D\uD83D\uDC66", + [":family_woman_boy_boy:"] = "\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66", + [":family_woman_girl:"] = "\uD83D\uDC69\u200D\uD83D\uDC67", + [":family_woman_girl_boy:"] = "\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC66", + [":family_woman_girl_girl:"] = "\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC67", + [":family_wwb:"] = "\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66", + [":family_wwbb:"] = "\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66", + [":family_wwg:"] = "\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC67", + [":family_wwgb:"] = "\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC66", + [":family_wwgg:"] = "\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC67", + [":fast_forward:"] = "⏩", + [":fax:"] = "\uD83D\uDCE0", + [":fearful:"] = "\uD83D\uDE28", + [":feet:"] = "\uD83D\uDC3E", + [":female_sign:"] = "♀️", + [":fencer:"] = "\uD83E\uDD3A", + [":fencing:"] = "\uD83E\uDD3A", + [":ferris_wheel:"] = "\uD83C\uDFA1", + [":ferry:"] = "⛴️", + [":field_hockey:"] = "\uD83C\uDFD1", + [":file_cabinet:"] = "\uD83D\uDDC4️", + [":file_folder:"] = "\uD83D\uDCC1", + [":film_frames:"] = "\uD83C\uDF9E️", + [":film_projector:"] = "\uD83D\uDCFD️", + [":fingers_crossed:"] = "\uD83E\uDD1E", + [":fingers_crossed::skin-tone-1:"] = "\uD83E\uDD1E\uD83C\uDFFB", + [":fingers_crossed::skin-tone-2:"] = "\uD83E\uDD1E\uD83C\uDFFC", + [":fingers_crossed::skin-tone-3:"] = "\uD83E\uDD1E\uD83C\uDFFD", + [":fingers_crossed::skin-tone-4:"] = "\uD83E\uDD1E\uD83C\uDFFE", + [":fingers_crossed::skin-tone-5:"] = "\uD83E\uDD1E\uD83C\uDFFF", + [":fingers_crossed_tone1:"] = "\uD83E\uDD1E\uD83C\uDFFB", + [":fingers_crossed_tone2:"] = "\uD83E\uDD1E\uD83C\uDFFC", + [":fingers_crossed_tone3:"] = "\uD83E\uDD1E\uD83C\uDFFD", + [":fingers_crossed_tone4:"] = "\uD83E\uDD1E\uD83C\uDFFE", + [":fingers_crossed_tone5:"] = "\uD83E\uDD1E\uD83C\uDFFF", + [":fire:"] = "\uD83D\uDD25", + [":fire_engine:"] = "\uD83D\uDE92", + [":fire_extinguisher:"] = "\uD83E\uDDEF", + [":firecracker:"] = "\uD83E\uDDE8", + [":fireworks:"] = "\uD83C\uDF86", + [":first_place:"] = "\uD83E\uDD47", + [":first_place_medal:"] = "\uD83E\uDD47", + [":first_quarter_moon:"] = "\uD83C\uDF13", + [":first_quarter_moon_with_face:"] = "\uD83C\uDF1B", + [":fish:"] = "\uD83D\uDC1F", + [":fish_cake:"] = "\uD83C\uDF65", + [":fishing_pole_and_fish:"] = "\uD83C\uDFA3", + [":fist:"] = "✊", + [":fist::skin-tone-1:"] = "✊\uD83C\uDFFB", + [":fist::skin-tone-2:"] = "✊\uD83C\uDFFC", + [":fist::skin-tone-3:"] = "✊\uD83C\uDFFD", + [":fist::skin-tone-4:"] = "✊\uD83C\uDFFE", + [":fist::skin-tone-5:"] = "✊\uD83C\uDFFF", + [":fist_tone1:"] = "✊\uD83C\uDFFB", + [":fist_tone2:"] = "✊\uD83C\uDFFC", + [":fist_tone3:"] = "✊\uD83C\uDFFD", + [":fist_tone4:"] = "✊\uD83C\uDFFE", + [":fist_tone5:"] = "✊\uD83C\uDFFF", + [":five:"] = "5️⃣", + [":flag_ac:"] = "\uD83C\uDDE6\uD83C\uDDE8", + [":flag_ad:"] = "\uD83C\uDDE6\uD83C\uDDE9", + [":flag_ae:"] = "\uD83C\uDDE6\uD83C\uDDEA", + [":flag_af:"] = "\uD83C\uDDE6\uD83C\uDDEB", + [":flag_ag:"] = "\uD83C\uDDE6\uD83C\uDDEC", + [":flag_ai:"] = "\uD83C\uDDE6\uD83C\uDDEE", + [":flag_al:"] = "\uD83C\uDDE6\uD83C\uDDF1", + [":flag_am:"] = "\uD83C\uDDE6\uD83C\uDDF2", + [":flag_ao:"] = "\uD83C\uDDE6\uD83C\uDDF4", + [":flag_aq:"] = "\uD83C\uDDE6\uD83C\uDDF6", + [":flag_ar:"] = "\uD83C\uDDE6\uD83C\uDDF7", + [":flag_as:"] = "\uD83C\uDDE6\uD83C\uDDF8", + [":flag_at:"] = "\uD83C\uDDE6\uD83C\uDDF9", + [":flag_au:"] = "\uD83C\uDDE6\uD83C\uDDFA", + [":flag_aw:"] = "\uD83C\uDDE6\uD83C\uDDFC", + [":flag_ax:"] = "\uD83C\uDDE6\uD83C\uDDFD", + [":flag_az:"] = "\uD83C\uDDE6\uD83C\uDDFF", + [":flag_ba:"] = "\uD83C\uDDE7\uD83C\uDDE6", + [":flag_bb:"] = "\uD83C\uDDE7\uD83C\uDDE7", + [":flag_bd:"] = "\uD83C\uDDE7\uD83C\uDDE9", + [":flag_be:"] = "\uD83C\uDDE7\uD83C\uDDEA", + [":flag_bf:"] = "\uD83C\uDDE7\uD83C\uDDEB", + [":flag_bg:"] = "\uD83C\uDDE7\uD83C\uDDEC", + [":flag_bh:"] = "\uD83C\uDDE7\uD83C\uDDED", + [":flag_bi:"] = "\uD83C\uDDE7\uD83C\uDDEE", + [":flag_bj:"] = "\uD83C\uDDE7\uD83C\uDDEF", + [":flag_bl:"] = "\uD83C\uDDE7\uD83C\uDDF1", + [":flag_black:"] = "\uD83C\uDFF4", + [":flag_bm:"] = "\uD83C\uDDE7\uD83C\uDDF2", + [":flag_bn:"] = "\uD83C\uDDE7\uD83C\uDDF3", + [":flag_bo:"] = "\uD83C\uDDE7\uD83C\uDDF4", + [":flag_bq:"] = "\uD83C\uDDE7\uD83C\uDDF6", + [":flag_br:"] = "\uD83C\uDDE7\uD83C\uDDF7", + [":flag_bs:"] = "\uD83C\uDDE7\uD83C\uDDF8", + [":flag_bt:"] = "\uD83C\uDDE7\uD83C\uDDF9", + [":flag_bv:"] = "\uD83C\uDDE7\uD83C\uDDFB", + [":flag_bw:"] = "\uD83C\uDDE7\uD83C\uDDFC", + [":flag_by:"] = "\uD83C\uDDE7\uD83C\uDDFE", + [":flag_bz:"] = "\uD83C\uDDE7\uD83C\uDDFF", + [":flag_ca:"] = "\uD83C\uDDE8\uD83C\uDDE6", + [":flag_cc:"] = "\uD83C\uDDE8\uD83C\uDDE8", + [":flag_cd:"] = "\uD83C\uDDE8\uD83C\uDDE9", + [":flag_cf:"] = "\uD83C\uDDE8\uD83C\uDDEB", + [":flag_cg:"] = "\uD83C\uDDE8\uD83C\uDDEC", + [":flag_ch:"] = "\uD83C\uDDE8\uD83C\uDDED", + [":flag_ci:"] = "\uD83C\uDDE8\uD83C\uDDEE", + [":flag_ck:"] = "\uD83C\uDDE8\uD83C\uDDF0", + [":flag_cl:"] = "\uD83C\uDDE8\uD83C\uDDF1", + [":flag_cm:"] = "\uD83C\uDDE8\uD83C\uDDF2", + [":flag_cn:"] = "\uD83C\uDDE8\uD83C\uDDF3", + [":flag_co:"] = "\uD83C\uDDE8\uD83C\uDDF4", + [":flag_cp:"] = "\uD83C\uDDE8\uD83C\uDDF5", + [":flag_cr:"] = "\uD83C\uDDE8\uD83C\uDDF7", + [":flag_cu:"] = "\uD83C\uDDE8\uD83C\uDDFA", + [":flag_cv:"] = "\uD83C\uDDE8\uD83C\uDDFB", + [":flag_cw:"] = "\uD83C\uDDE8\uD83C\uDDFC", + [":flag_cx:"] = "\uD83C\uDDE8\uD83C\uDDFD", + [":flag_cy:"] = "\uD83C\uDDE8\uD83C\uDDFE", + [":flag_cz:"] = "\uD83C\uDDE8\uD83C\uDDFF", + [":flag_de:"] = "\uD83C\uDDE9\uD83C\uDDEA", + [":flag_dg:"] = "\uD83C\uDDE9\uD83C\uDDEC", + [":flag_dj:"] = "\uD83C\uDDE9\uD83C\uDDEF", + [":flag_dk:"] = "\uD83C\uDDE9\uD83C\uDDF0", + [":flag_dm:"] = "\uD83C\uDDE9\uD83C\uDDF2", + [":flag_do:"] = "\uD83C\uDDE9\uD83C\uDDF4", + [":flag_dz:"] = "\uD83C\uDDE9\uD83C\uDDFF", + [":flag_ea:"] = "\uD83C\uDDEA\uD83C\uDDE6", + [":flag_ec:"] = "\uD83C\uDDEA\uD83C\uDDE8", + [":flag_ee:"] = "\uD83C\uDDEA\uD83C\uDDEA", + [":flag_eg:"] = "\uD83C\uDDEA\uD83C\uDDEC", + [":flag_eh:"] = "\uD83C\uDDEA\uD83C\uDDED", + [":flag_er:"] = "\uD83C\uDDEA\uD83C\uDDF7", + [":flag_es:"] = "\uD83C\uDDEA\uD83C\uDDF8", + [":flag_et:"] = "\uD83C\uDDEA\uD83C\uDDF9", + [":flag_eu:"] = "\uD83C\uDDEA\uD83C\uDDFA", + [":flag_fi:"] = "\uD83C\uDDEB\uD83C\uDDEE", + [":flag_fj:"] = "\uD83C\uDDEB\uD83C\uDDEF", + [":flag_fk:"] = "\uD83C\uDDEB\uD83C\uDDF0", + [":flag_fm:"] = "\uD83C\uDDEB\uD83C\uDDF2", + [":flag_fo:"] = "\uD83C\uDDEB\uD83C\uDDF4", + [":flag_fr:"] = "\uD83C\uDDEB\uD83C\uDDF7", + [":flag_ga:"] = "\uD83C\uDDEC\uD83C\uDDE6", + [":flag_gb:"] = "\uD83C\uDDEC\uD83C\uDDE7", + [":flag_gd:"] = "\uD83C\uDDEC\uD83C\uDDE9", + [":flag_ge:"] = "\uD83C\uDDEC\uD83C\uDDEA", + [":flag_gf:"] = "\uD83C\uDDEC\uD83C\uDDEB", + [":flag_gg:"] = "\uD83C\uDDEC\uD83C\uDDEC", + [":flag_gh:"] = "\uD83C\uDDEC\uD83C\uDDED", + [":flag_gi:"] = "\uD83C\uDDEC\uD83C\uDDEE", + [":flag_gl:"] = "\uD83C\uDDEC\uD83C\uDDF1", + [":flag_gm:"] = "\uD83C\uDDEC\uD83C\uDDF2", + [":flag_gn:"] = "\uD83C\uDDEC\uD83C\uDDF3", + [":flag_gp:"] = "\uD83C\uDDEC\uD83C\uDDF5", + [":flag_gq:"] = "\uD83C\uDDEC\uD83C\uDDF6", + [":flag_gr:"] = "\uD83C\uDDEC\uD83C\uDDF7", + [":flag_gs:"] = "\uD83C\uDDEC\uD83C\uDDF8", + [":flag_gt:"] = "\uD83C\uDDEC\uD83C\uDDF9", + [":flag_gu:"] = "\uD83C\uDDEC\uD83C\uDDFA", + [":flag_gw:"] = "\uD83C\uDDEC\uD83C\uDDFC", + [":flag_gy:"] = "\uD83C\uDDEC\uD83C\uDDFE", + [":flag_hk:"] = "\uD83C\uDDED\uD83C\uDDF0", + [":flag_hm:"] = "\uD83C\uDDED\uD83C\uDDF2", + [":flag_hn:"] = "\uD83C\uDDED\uD83C\uDDF3", + [":flag_hr:"] = "\uD83C\uDDED\uD83C\uDDF7", + [":flag_ht:"] = "\uD83C\uDDED\uD83C\uDDF9", + [":flag_hu:"] = "\uD83C\uDDED\uD83C\uDDFA", + [":flag_ic:"] = "\uD83C\uDDEE\uD83C\uDDE8", + [":flag_id:"] = "\uD83C\uDDEE\uD83C\uDDE9", + [":flag_ie:"] = "\uD83C\uDDEE\uD83C\uDDEA", + [":flag_il:"] = "\uD83C\uDDEE\uD83C\uDDF1", + [":flag_im:"] = "\uD83C\uDDEE\uD83C\uDDF2", + [":flag_in:"] = "\uD83C\uDDEE\uD83C\uDDF3", + [":flag_io:"] = "\uD83C\uDDEE\uD83C\uDDF4", + [":flag_iq:"] = "\uD83C\uDDEE\uD83C\uDDF6", + [":flag_ir:"] = "\uD83C\uDDEE\uD83C\uDDF7", + [":flag_is:"] = "\uD83C\uDDEE\uD83C\uDDF8", + [":flag_it:"] = "\uD83C\uDDEE\uD83C\uDDF9", + [":flag_je:"] = "\uD83C\uDDEF\uD83C\uDDEA", + [":flag_jm:"] = "\uD83C\uDDEF\uD83C\uDDF2", + [":flag_jo:"] = "\uD83C\uDDEF\uD83C\uDDF4", + [":flag_jp:"] = "\uD83C\uDDEF\uD83C\uDDF5", + [":flag_ke:"] = "\uD83C\uDDF0\uD83C\uDDEA", + [":flag_kg:"] = "\uD83C\uDDF0\uD83C\uDDEC", + [":flag_kh:"] = "\uD83C\uDDF0\uD83C\uDDED", + [":flag_ki:"] = "\uD83C\uDDF0\uD83C\uDDEE", + [":flag_km:"] = "\uD83C\uDDF0\uD83C\uDDF2", + [":flag_kn:"] = "\uD83C\uDDF0\uD83C\uDDF3", + [":flag_kp:"] = "\uD83C\uDDF0\uD83C\uDDF5", + [":flag_kr:"] = "\uD83C\uDDF0\uD83C\uDDF7", + [":flag_kw:"] = "\uD83C\uDDF0\uD83C\uDDFC", + [":flag_ky:"] = "\uD83C\uDDF0\uD83C\uDDFE", + [":flag_kz:"] = "\uD83C\uDDF0\uD83C\uDDFF", + [":flag_la:"] = "\uD83C\uDDF1\uD83C\uDDE6", + [":flag_lb:"] = "\uD83C\uDDF1\uD83C\uDDE7", + [":flag_lc:"] = "\uD83C\uDDF1\uD83C\uDDE8", + [":flag_li:"] = "\uD83C\uDDF1\uD83C\uDDEE", + [":flag_lk:"] = "\uD83C\uDDF1\uD83C\uDDF0", + [":flag_lr:"] = "\uD83C\uDDF1\uD83C\uDDF7", + [":flag_ls:"] = "\uD83C\uDDF1\uD83C\uDDF8", + [":flag_lt:"] = "\uD83C\uDDF1\uD83C\uDDF9", + [":flag_lu:"] = "\uD83C\uDDF1\uD83C\uDDFA", + [":flag_lv:"] = "\uD83C\uDDF1\uD83C\uDDFB", + [":flag_ly:"] = "\uD83C\uDDF1\uD83C\uDDFE", + [":flag_ma:"] = "\uD83C\uDDF2\uD83C\uDDE6", + [":flag_mc:"] = "\uD83C\uDDF2\uD83C\uDDE8", + [":flag_md:"] = "\uD83C\uDDF2\uD83C\uDDE9", + [":flag_me:"] = "\uD83C\uDDF2\uD83C\uDDEA", + [":flag_mf:"] = "\uD83C\uDDF2\uD83C\uDDEB", + [":flag_mg:"] = "\uD83C\uDDF2\uD83C\uDDEC", + [":flag_mh:"] = "\uD83C\uDDF2\uD83C\uDDED", + [":flag_mk:"] = "\uD83C\uDDF2\uD83C\uDDF0", + [":flag_ml:"] = "\uD83C\uDDF2\uD83C\uDDF1", + [":flag_mm:"] = "\uD83C\uDDF2\uD83C\uDDF2", + [":flag_mn:"] = "\uD83C\uDDF2\uD83C\uDDF3", + [":flag_mo:"] = "\uD83C\uDDF2\uD83C\uDDF4", + [":flag_mp:"] = "\uD83C\uDDF2\uD83C\uDDF5", + [":flag_mq:"] = "\uD83C\uDDF2\uD83C\uDDF6", + [":flag_mr:"] = "\uD83C\uDDF2\uD83C\uDDF7", + [":flag_ms:"] = "\uD83C\uDDF2\uD83C\uDDF8", + [":flag_mt:"] = "\uD83C\uDDF2\uD83C\uDDF9", + [":flag_mu:"] = "\uD83C\uDDF2\uD83C\uDDFA", + [":flag_mv:"] = "\uD83C\uDDF2\uD83C\uDDFB", + [":flag_mw:"] = "\uD83C\uDDF2\uD83C\uDDFC", + [":flag_mx:"] = "\uD83C\uDDF2\uD83C\uDDFD", + [":flag_my:"] = "\uD83C\uDDF2\uD83C\uDDFE", + [":flag_mz:"] = "\uD83C\uDDF2\uD83C\uDDFF", + [":flag_na:"] = "\uD83C\uDDF3\uD83C\uDDE6", + [":flag_nc:"] = "\uD83C\uDDF3\uD83C\uDDE8", + [":flag_ne:"] = "\uD83C\uDDF3\uD83C\uDDEA", + [":flag_nf:"] = "\uD83C\uDDF3\uD83C\uDDEB", + [":flag_ng:"] = "\uD83C\uDDF3\uD83C\uDDEC", + [":flag_ni:"] = "\uD83C\uDDF3\uD83C\uDDEE", + [":flag_nl:"] = "\uD83C\uDDF3\uD83C\uDDF1", + [":flag_no:"] = "\uD83C\uDDF3\uD83C\uDDF4", + [":flag_np:"] = "\uD83C\uDDF3\uD83C\uDDF5", + [":flag_nr:"] = "\uD83C\uDDF3\uD83C\uDDF7", + [":flag_nu:"] = "\uD83C\uDDF3\uD83C\uDDFA", + [":flag_nz:"] = "\uD83C\uDDF3\uD83C\uDDFF", + [":flag_om:"] = "\uD83C\uDDF4\uD83C\uDDF2", + [":flag_pa:"] = "\uD83C\uDDF5\uD83C\uDDE6", + [":flag_pe:"] = "\uD83C\uDDF5\uD83C\uDDEA", + [":flag_pf:"] = "\uD83C\uDDF5\uD83C\uDDEB", + [":flag_pg:"] = "\uD83C\uDDF5\uD83C\uDDEC", + [":flag_ph:"] = "\uD83C\uDDF5\uD83C\uDDED", + [":flag_pk:"] = "\uD83C\uDDF5\uD83C\uDDF0", + [":flag_pl:"] = "\uD83C\uDDF5\uD83C\uDDF1", + [":flag_pm:"] = "\uD83C\uDDF5\uD83C\uDDF2", + [":flag_pn:"] = "\uD83C\uDDF5\uD83C\uDDF3", + [":flag_pr:"] = "\uD83C\uDDF5\uD83C\uDDF7", + [":flag_ps:"] = "\uD83C\uDDF5\uD83C\uDDF8", + [":flag_pt:"] = "\uD83C\uDDF5\uD83C\uDDF9", + [":flag_pw:"] = "\uD83C\uDDF5\uD83C\uDDFC", + [":flag_py:"] = "\uD83C\uDDF5\uD83C\uDDFE", + [":flag_qa:"] = "\uD83C\uDDF6\uD83C\uDDE6", + [":flag_re:"] = "\uD83C\uDDF7\uD83C\uDDEA", + [":flag_ro:"] = "\uD83C\uDDF7\uD83C\uDDF4", + [":flag_rs:"] = "\uD83C\uDDF7\uD83C\uDDF8", + [":flag_ru:"] = "\uD83C\uDDF7\uD83C\uDDFA", + [":flag_rw:"] = "\uD83C\uDDF7\uD83C\uDDFC", + [":flag_sa:"] = "\uD83C\uDDF8\uD83C\uDDE6", + [":flag_sb:"] = "\uD83C\uDDF8\uD83C\uDDE7", + [":flag_sc:"] = "\uD83C\uDDF8\uD83C\uDDE8", + [":flag_sd:"] = "\uD83C\uDDF8\uD83C\uDDE9", + [":flag_se:"] = "\uD83C\uDDF8\uD83C\uDDEA", + [":flag_sg:"] = "\uD83C\uDDF8\uD83C\uDDEC", + [":flag_sh:"] = "\uD83C\uDDF8\uD83C\uDDED", + [":flag_si:"] = "\uD83C\uDDF8\uD83C\uDDEE", + [":flag_sj:"] = "\uD83C\uDDF8\uD83C\uDDEF", + [":flag_sk:"] = "\uD83C\uDDF8\uD83C\uDDF0", + [":flag_sl:"] = "\uD83C\uDDF8\uD83C\uDDF1", + [":flag_sm:"] = "\uD83C\uDDF8\uD83C\uDDF2", + [":flag_sn:"] = "\uD83C\uDDF8\uD83C\uDDF3", + [":flag_so:"] = "\uD83C\uDDF8\uD83C\uDDF4", + [":flag_sr:"] = "\uD83C\uDDF8\uD83C\uDDF7", + [":flag_ss:"] = "\uD83C\uDDF8\uD83C\uDDF8", + [":flag_st:"] = "\uD83C\uDDF8\uD83C\uDDF9", + [":flag_sv:"] = "\uD83C\uDDF8\uD83C\uDDFB", + [":flag_sx:"] = "\uD83C\uDDF8\uD83C\uDDFD", + [":flag_sy:"] = "\uD83C\uDDF8\uD83C\uDDFE", + [":flag_sz:"] = "\uD83C\uDDF8\uD83C\uDDFF", + [":flag_ta:"] = "\uD83C\uDDF9\uD83C\uDDE6", + [":flag_tc:"] = "\uD83C\uDDF9\uD83C\uDDE8", + [":flag_td:"] = "\uD83C\uDDF9\uD83C\uDDE9", + [":flag_tf:"] = "\uD83C\uDDF9\uD83C\uDDEB", + [":flag_tg:"] = "\uD83C\uDDF9\uD83C\uDDEC", + [":flag_th:"] = "\uD83C\uDDF9\uD83C\uDDED", + [":flag_tj:"] = "\uD83C\uDDF9\uD83C\uDDEF", + [":flag_tk:"] = "\uD83C\uDDF9\uD83C\uDDF0", + [":flag_tl:"] = "\uD83C\uDDF9\uD83C\uDDF1", + [":flag_tm:"] = "\uD83C\uDDF9\uD83C\uDDF2", + [":flag_tn:"] = "\uD83C\uDDF9\uD83C\uDDF3", + [":flag_to:"] = "\uD83C\uDDF9\uD83C\uDDF4", + [":flag_tr:"] = "\uD83C\uDDF9\uD83C\uDDF7", + [":flag_tt:"] = "\uD83C\uDDF9\uD83C\uDDF9", + [":flag_tv:"] = "\uD83C\uDDF9\uD83C\uDDFB", + [":flag_tw:"] = "\uD83C\uDDF9\uD83C\uDDFC", + [":flag_tz:"] = "\uD83C\uDDF9\uD83C\uDDFF", + [":flag_ua:"] = "\uD83C\uDDFA\uD83C\uDDE6", + [":flag_ug:"] = "\uD83C\uDDFA\uD83C\uDDEC", + [":flag_um:"] = "\uD83C\uDDFA\uD83C\uDDF2", + [":flag_us:"] = "\uD83C\uDDFA\uD83C\uDDF8", + [":flag_uy:"] = "\uD83C\uDDFA\uD83C\uDDFE", + [":flag_uz:"] = "\uD83C\uDDFA\uD83C\uDDFF", + [":flag_va:"] = "\uD83C\uDDFB\uD83C\uDDE6", + [":flag_vc:"] = "\uD83C\uDDFB\uD83C\uDDE8", + [":flag_ve:"] = "\uD83C\uDDFB\uD83C\uDDEA", + [":flag_vg:"] = "\uD83C\uDDFB\uD83C\uDDEC", + [":flag_vi:"] = "\uD83C\uDDFB\uD83C\uDDEE", + [":flag_vn:"] = "\uD83C\uDDFB\uD83C\uDDF3", + [":flag_vu:"] = "\uD83C\uDDFB\uD83C\uDDFA", + [":flag_wf:"] = "\uD83C\uDDFC\uD83C\uDDEB", + [":flag_white:"] = "\uD83C\uDFF3️", + [":flag_ws:"] = "\uD83C\uDDFC\uD83C\uDDF8", + [":flag_xk:"] = "\uD83C\uDDFD\uD83C\uDDF0", + [":flag_ye:"] = "\uD83C\uDDFE\uD83C\uDDEA", + [":flag_yt:"] = "\uD83C\uDDFE\uD83C\uDDF9", + [":flag_za:"] = "\uD83C\uDDFF\uD83C\uDDE6", + [":flag_zm:"] = "\uD83C\uDDFF\uD83C\uDDF2", + [":flag_zw:"] = "\uD83C\uDDFF\uD83C\uDDFC", + [":flags:"] = "\uD83C\uDF8F", + [":flame:"] = "\uD83D\uDD25", + [":flamingo:"] = "\uD83E\uDDA9", + [":flan:"] = "\uD83C\uDF6E", + [":flashlight:"] = "\uD83D\uDD26", + [":fleur_de_lis:"] = "⚜️", + [":floppy_disk:"] = "\uD83D\uDCBE", + [":flower_playing_cards:"] = "\uD83C\uDFB4", + [":flushed:"] = "\uD83D\uDE33", + [":flying_disc:"] = "\uD83E\uDD4F", + [":flying_saucer:"] = "\uD83D\uDEF8", + [":fog:"] = "\uD83C\uDF2B️", + [":foggy:"] = "\uD83C\uDF01", + [":foot:"] = "\uD83E\uDDB6", + [":foot::skin-tone-1:"] = "\uD83E\uDDB6\uD83C\uDFFB", + [":foot::skin-tone-2:"] = "\uD83E\uDDB6\uD83C\uDFFC", + [":foot::skin-tone-3:"] = "\uD83E\uDDB6\uD83C\uDFFD", + [":foot::skin-tone-4:"] = "\uD83E\uDDB6\uD83C\uDFFE", + [":foot::skin-tone-5:"] = "\uD83E\uDDB6\uD83C\uDFFF", + [":foot_dark_skin_tone:"] = "\uD83E\uDDB6\uD83C\uDFFF", + [":foot_light_skin_tone:"] = "\uD83E\uDDB6\uD83C\uDFFB", + [":foot_medium_dark_skin_tone:"] = "\uD83E\uDDB6\uD83C\uDFFE", + [":foot_medium_light_skin_tone:"] = "\uD83E\uDDB6\uD83C\uDFFC", + [":foot_medium_skin_tone:"] = "\uD83E\uDDB6\uD83C\uDFFD", + [":foot_tone1:"] = "\uD83E\uDDB6\uD83C\uDFFB", + [":foot_tone2:"] = "\uD83E\uDDB6\uD83C\uDFFC", + [":foot_tone3:"] = "\uD83E\uDDB6\uD83C\uDFFD", + [":foot_tone4:"] = "\uD83E\uDDB6\uD83C\uDFFE", + [":foot_tone5:"] = "\uD83E\uDDB6\uD83C\uDFFF", + [":football:"] = "\uD83C\uDFC8", + [":footprints:"] = "\uD83D\uDC63", + [":fork_and_knife:"] = "\uD83C\uDF74", + [":fork_and_knife_with_plate:"] = "\uD83C\uDF7D️", + [":fork_knife_plate:"] = "\uD83C\uDF7D️", + [":fortune_cookie:"] = "\uD83E\uDD60", + [":fountain:"] = "⛲", + [":four:"] = "4️⃣", + [":four_leaf_clover:"] = "\uD83C\uDF40", + [":fox:"] = "\uD83E\uDD8A", + [":fox_face:"] = "\uD83E\uDD8A", + [":frame_photo:"] = "\uD83D\uDDBC️", + [":frame_with_picture:"] = "\uD83D\uDDBC️", + [":free:"] = "\uD83C\uDD93", + [":french_bread:"] = "\uD83E\uDD56", + [":fried_shrimp:"] = "\uD83C\uDF64", + [":fries:"] = "\uD83C\uDF5F", + [":frog:"] = "\uD83D\uDC38", + [":frowning2:"] = "☹️", + [":frowning:"] = "\uD83D\uDE26", + [":fuelpump:"] = "⛽", + [":full_moon:"] = "\uD83C\uDF15", + [":full_moon_with_face:"] = "\uD83C\uDF1D", + [":funeral_urn:"] = "⚱️", + [":game_die:"] = "\uD83C\uDFB2", + [":garlic:"] = "\uD83E\uDDC4", + [":gay_pride_flag:"] = "\uD83C\uDFF3️\u200D\uD83C\uDF08", + [":gear:"] = "⚙️", + [":gem:"] = "\uD83D\uDC8E", + [":gemini:"] = "♊", + [":genie:"] = "\uD83E\uDDDE", + [":ghost:"] = "\uD83D\uDC7B", + [":gift:"] = "\uD83C\uDF81", + [":gift_heart:"] = "\uD83D\uDC9D", + [":giraffe:"] = "\uD83E\uDD92", + [":girl:"] = "\uD83D\uDC67", + [":girl::skin-tone-1:"] = "\uD83D\uDC67\uD83C\uDFFB", + [":girl::skin-tone-2:"] = "\uD83D\uDC67\uD83C\uDFFC", + [":girl::skin-tone-3:"] = "\uD83D\uDC67\uD83C\uDFFD", + [":girl::skin-tone-4:"] = "\uD83D\uDC67\uD83C\uDFFE", + [":girl::skin-tone-5:"] = "\uD83D\uDC67\uD83C\uDFFF", + [":girl_tone1:"] = "\uD83D\uDC67\uD83C\uDFFB", + [":girl_tone2:"] = "\uD83D\uDC67\uD83C\uDFFC", + [":girl_tone3:"] = "\uD83D\uDC67\uD83C\uDFFD", + [":girl_tone4:"] = "\uD83D\uDC67\uD83C\uDFFE", + [":girl_tone5:"] = "\uD83D\uDC67\uD83C\uDFFF", + [":glass_of_milk:"] = "\uD83E\uDD5B", + [":globe_with_meridians:"] = "\uD83C\uDF10", + [":gloves:"] = "\uD83E\uDDE4", + [":goal:"] = "\uD83E\uDD45", + [":goal_net:"] = "\uD83E\uDD45", + [":goat:"] = "\uD83D\uDC10", + [":goggles:"] = "\uD83E\uDD7D", + [":golf:"] = "⛳", + [":golfer:"] = "\uD83C\uDFCC️", + [":golfer::skin-tone-1:"] = "\uD83C\uDFCC\uD83C\uDFFB", + [":golfer::skin-tone-2:"] = "\uD83C\uDFCC\uD83C\uDFFC", + [":golfer::skin-tone-3:"] = "\uD83C\uDFCC\uD83C\uDFFD", + [":golfer::skin-tone-4:"] = "\uD83C\uDFCC\uD83C\uDFFE", + [":golfer::skin-tone-5:"] = "\uD83C\uDFCC\uD83C\uDFFF", + [":gorilla:"] = "\uD83E\uDD8D", + [":grandma:"] = "\uD83D\uDC75", + [":grandma::skin-tone-1:"] = "\uD83D\uDC75\uD83C\uDFFB", + [":grandma::skin-tone-2:"] = "\uD83D\uDC75\uD83C\uDFFC", + [":grandma::skin-tone-3:"] = "\uD83D\uDC75\uD83C\uDFFD", + [":grandma::skin-tone-4:"] = "\uD83D\uDC75\uD83C\uDFFE", + [":grandma::skin-tone-5:"] = "\uD83D\uDC75\uD83C\uDFFF", + [":grandma_tone1:"] = "\uD83D\uDC75\uD83C\uDFFB", + [":grandma_tone2:"] = "\uD83D\uDC75\uD83C\uDFFC", + [":grandma_tone3:"] = "\uD83D\uDC75\uD83C\uDFFD", + [":grandma_tone4:"] = "\uD83D\uDC75\uD83C\uDFFE", + [":grandma_tone5:"] = "\uD83D\uDC75\uD83C\uDFFF", + [":grapes:"] = "\uD83C\uDF47", + [":green_apple:"] = "\uD83C\uDF4F", + [":green_book:"] = "\uD83D\uDCD7", + [":green_circle:"] = "\uD83D\uDFE2", + [":green_heart:"] = "\uD83D\uDC9A", + [":green_salad:"] = "\uD83E\uDD57", + [":green_square:"] = "\uD83D\uDFE9", + [":grey_exclamation:"] = "❕", + [":grey_question:"] = "❔", + [":grimacing:"] = "\uD83D\uDE2C", + [":grin:"] = "\uD83D\uDE01", + [":grinning:"] = "\uD83D\uDE00", + [":guard:"] = "\uD83D\uDC82", + [":guard::skin-tone-1:"] = "\uD83D\uDC82\uD83C\uDFFB", + [":guard::skin-tone-2:"] = "\uD83D\uDC82\uD83C\uDFFC", + [":guard::skin-tone-3:"] = "\uD83D\uDC82\uD83C\uDFFD", + [":guard::skin-tone-4:"] = "\uD83D\uDC82\uD83C\uDFFE", + [":guard::skin-tone-5:"] = "\uD83D\uDC82\uD83C\uDFFF", + [":guard_tone1:"] = "\uD83D\uDC82\uD83C\uDFFB", + [":guard_tone2:"] = "\uD83D\uDC82\uD83C\uDFFC", + [":guard_tone3:"] = "\uD83D\uDC82\uD83C\uDFFD", + [":guard_tone4:"] = "\uD83D\uDC82\uD83C\uDFFE", + [":guard_tone5:"] = "\uD83D\uDC82\uD83C\uDFFF", + [":guardsman:"] = "\uD83D\uDC82", + [":guardsman::skin-tone-1:"] = "\uD83D\uDC82\uD83C\uDFFB", + [":guardsman::skin-tone-2:"] = "\uD83D\uDC82\uD83C\uDFFC", + [":guardsman::skin-tone-3:"] = "\uD83D\uDC82\uD83C\uDFFD", + [":guardsman::skin-tone-4:"] = "\uD83D\uDC82\uD83C\uDFFE", + [":guardsman::skin-tone-5:"] = "\uD83D\uDC82\uD83C\uDFFF", + [":guardsman_tone1:"] = "\uD83D\uDC82\uD83C\uDFFB", + [":guardsman_tone2:"] = "\uD83D\uDC82\uD83C\uDFFC", + [":guardsman_tone3:"] = "\uD83D\uDC82\uD83C\uDFFD", + [":guardsman_tone4:"] = "\uD83D\uDC82\uD83C\uDFFE", + [":guardsman_tone5:"] = "\uD83D\uDC82\uD83C\uDFFF", + [":guide_dog:"] = "\uD83E\uDDAE", + [":guitar:"] = "\uD83C\uDFB8", + [":gun:"] = "\uD83D\uDD2B", + [":haircut:"] = "\uD83D\uDC87", + [":haircut::skin-tone-1:"] = "\uD83D\uDC87\uD83C\uDFFB", + [":haircut::skin-tone-2:"] = "\uD83D\uDC87\uD83C\uDFFC", + [":haircut::skin-tone-3:"] = "\uD83D\uDC87\uD83C\uDFFD", + [":haircut::skin-tone-4:"] = "\uD83D\uDC87\uD83C\uDFFE", + [":haircut::skin-tone-5:"] = "\uD83D\uDC87\uD83C\uDFFF", + [":haircut_tone1:"] = "\uD83D\uDC87\uD83C\uDFFB", + [":haircut_tone2:"] = "\uD83D\uDC87\uD83C\uDFFC", + [":haircut_tone3:"] = "\uD83D\uDC87\uD83C\uDFFD", + [":haircut_tone4:"] = "\uD83D\uDC87\uD83C\uDFFE", + [":haircut_tone5:"] = "\uD83D\uDC87\uD83C\uDFFF", + [":hamburger:"] = "\uD83C\uDF54", + [":hammer:"] = "\uD83D\uDD28", + [":hammer_and_pick:"] = "⚒️", + [":hammer_and_wrench:"] = "\uD83D\uDEE0️", + [":hammer_pick:"] = "⚒️", + [":hamster:"] = "\uD83D\uDC39", + [":hand_splayed:"] = "\uD83D\uDD90️", + [":hand_splayed::skin-tone-1:"] = "\uD83D\uDD90\uD83C\uDFFB", + [":hand_splayed::skin-tone-2:"] = "\uD83D\uDD90\uD83C\uDFFC", + [":hand_splayed::skin-tone-3:"] = "\uD83D\uDD90\uD83C\uDFFD", + [":hand_splayed::skin-tone-4:"] = "\uD83D\uDD90\uD83C\uDFFE", + [":hand_splayed::skin-tone-5:"] = "\uD83D\uDD90\uD83C\uDFFF", + [":hand_splayed_tone1:"] = "\uD83D\uDD90\uD83C\uDFFB", + [":hand_splayed_tone2:"] = "\uD83D\uDD90\uD83C\uDFFC", + [":hand_splayed_tone3:"] = "\uD83D\uDD90\uD83C\uDFFD", + [":hand_splayed_tone4:"] = "\uD83D\uDD90\uD83C\uDFFE", + [":hand_splayed_tone5:"] = "\uD83D\uDD90\uD83C\uDFFF", + [":hand_with_index_and_middle_finger_crossed:"] = "\uD83E\uDD1E", + [":hand_with_index_and_middle_finger_crossed::skin-tone-1:"] = "\uD83E\uDD1E\uD83C\uDFFB", + [":hand_with_index_and_middle_finger_crossed::skin-tone-2:"] = "\uD83E\uDD1E\uD83C\uDFFC", + [":hand_with_index_and_middle_finger_crossed::skin-tone-3:"] = "\uD83E\uDD1E\uD83C\uDFFD", + [":hand_with_index_and_middle_finger_crossed::skin-tone-4:"] = "\uD83E\uDD1E\uD83C\uDFFE", + [":hand_with_index_and_middle_finger_crossed::skin-tone-5:"] = "\uD83E\uDD1E\uD83C\uDFFF", + [":hand_with_index_and_middle_fingers_crossed_tone1:"] = "\uD83E\uDD1E\uD83C\uDFFB", + [":hand_with_index_and_middle_fingers_crossed_tone2:"] = "\uD83E\uDD1E\uD83C\uDFFC", + [":hand_with_index_and_middle_fingers_crossed_tone3:"] = "\uD83E\uDD1E\uD83C\uDFFD", + [":hand_with_index_and_middle_fingers_crossed_tone4:"] = "\uD83E\uDD1E\uD83C\uDFFE", + [":hand_with_index_and_middle_fingers_crossed_tone5:"] = "\uD83E\uDD1E\uD83C\uDFFF", + [":handbag:"] = "\uD83D\uDC5C", + [":handball:"] = "\uD83E\uDD3E", + [":handball::skin-tone-1:"] = "\uD83E\uDD3E\uD83C\uDFFB", + [":handball::skin-tone-2:"] = "\uD83E\uDD3E\uD83C\uDFFC", + [":handball::skin-tone-3:"] = "\uD83E\uDD3E\uD83C\uDFFD", + [":handball::skin-tone-4:"] = "\uD83E\uDD3E\uD83C\uDFFE", + [":handball::skin-tone-5:"] = "\uD83E\uDD3E\uD83C\uDFFF", + [":handball_tone1:"] = "\uD83E\uDD3E\uD83C\uDFFB", + [":handball_tone2:"] = "\uD83E\uDD3E\uD83C\uDFFC", + [":handball_tone3:"] = "\uD83E\uDD3E\uD83C\uDFFD", + [":handball_tone4:"] = "\uD83E\uDD3E\uD83C\uDFFE", + [":handball_tone5:"] = "\uD83E\uDD3E\uD83C\uDFFF", + [":handshake:"] = "\uD83E\uDD1D", + [":hankey:"] = "\uD83D\uDCA9", + [":hash:"] = "#️⃣", + [":hatched_chick:"] = "\uD83D\uDC25", + [":hatching_chick:"] = "\uD83D\uDC23", + [":head_bandage:"] = "\uD83E\uDD15", + [":headphones:"] = "\uD83C\uDFA7", + [":hear_no_evil:"] = "\uD83D\uDE49", + [":heart:"] = "❤️", + [":heart_decoration:"] = "\uD83D\uDC9F", + [":heart_exclamation:"] = "❣️", + [":heart_eyes:"] = "\uD83D\uDE0D", + [":heart_eyes_cat:"] = "\uD83D\uDE3B", + [":heartbeat:"] = "\uD83D\uDC93", + [":heartpulse:"] = "\uD83D\uDC97", + [":hearts:"] = "♥️", + [":heavy_check_mark:"] = "✔️", + [":heavy_division_sign:"] = "➗", + [":heavy_dollar_sign:"] = "\uD83D\uDCB2", + [":heavy_heart_exclamation_mark_ornament:"] = "❣️", + [":heavy_minus_sign:"] = "➖", + [":heavy_multiplication_x:"] = "✖️", + [":heavy_plus_sign:"] = "➕", + [":hedgehog:"] = "\uD83E\uDD94", + [":helicopter:"] = "\uD83D\uDE81", + [":helmet_with_cross:"] = "⛑️", + [":helmet_with_white_cross:"] = "⛑️", + [":herb:"] = "\uD83C\uDF3F", + [":hibiscus:"] = "\uD83C\uDF3A", + [":high_brightness:"] = "\uD83D\uDD06", + [":high_heel:"] = "\uD83D\uDC60", + [":hiking_boot:"] = "\uD83E\uDD7E", + [":hindu_temple:"] = "\uD83D\uDED5", + [":hippopotamus:"] = "\uD83E\uDD9B", + [":hockey:"] = "\uD83C\uDFD2", + [":hole:"] = "\uD83D\uDD73️", + [":homes:"] = "\uD83C\uDFD8️", + [":honey_pot:"] = "\uD83C\uDF6F", + [":horse:"] = "\uD83D\uDC34", + [":horse_racing:"] = "\uD83C\uDFC7", + [":horse_racing::skin-tone-1:"] = "\uD83C\uDFC7\uD83C\uDFFB", + [":horse_racing::skin-tone-2:"] = "\uD83C\uDFC7\uD83C\uDFFC", + [":horse_racing::skin-tone-3:"] = "\uD83C\uDFC7\uD83C\uDFFD", + [":horse_racing::skin-tone-4:"] = "\uD83C\uDFC7\uD83C\uDFFE", + [":horse_racing::skin-tone-5:"] = "\uD83C\uDFC7\uD83C\uDFFF", + [":horse_racing_tone1:"] = "\uD83C\uDFC7\uD83C\uDFFB", + [":horse_racing_tone2:"] = "\uD83C\uDFC7\uD83C\uDFFC", + [":horse_racing_tone3:"] = "\uD83C\uDFC7\uD83C\uDFFD", + [":horse_racing_tone4:"] = "\uD83C\uDFC7\uD83C\uDFFE", + [":horse_racing_tone5:"] = "\uD83C\uDFC7\uD83C\uDFFF", + [":hospital:"] = "\uD83C\uDFE5", + [":hot_dog:"] = "\uD83C\uDF2D", + [":hot_face:"] = "\uD83E\uDD75", + [":hot_pepper:"] = "\uD83C\uDF36️", + [":hotdog:"] = "\uD83C\uDF2D", + [":hotel:"] = "\uD83C\uDFE8", + [":hotsprings:"] = "♨️", + [":hourglass:"] = "⌛", + [":hourglass_flowing_sand:"] = "⏳", + [":house:"] = "\uD83C\uDFE0", + [":house_abandoned:"] = "\uD83C\uDFDA️", + [":house_buildings:"] = "\uD83C\uDFD8️", + [":house_with_garden:"] = "\uD83C\uDFE1", + [":hugging:"] = "\uD83E\uDD17", + [":hugging_face:"] = "\uD83E\uDD17", + [":hushed:"] = "\uD83D\uDE2F", + [":ice_cream:"] = "\uD83C\uDF68", + [":ice_cube:"] = "\uD83E\uDDCA", + [":ice_skate:"] = "⛸️", + [":icecream:"] = "\uD83C\uDF66", + [":id:"] = "\uD83C\uDD94", + [":ideograph_advantage:"] = "\uD83C\uDE50", + [":imp:"] = "\uD83D\uDC7F", + [":inbox_tray:"] = "\uD83D\uDCE5", + [":incoming_envelope:"] = "\uD83D\uDCE8", + [":infinity:"] = "♾️", + [":information_desk_person:"] = "\uD83D\uDC81", + [":information_desk_person::skin-tone-1:"] = "\uD83D\uDC81\uD83C\uDFFB", + [":information_desk_person::skin-tone-2:"] = "\uD83D\uDC81\uD83C\uDFFC", + [":information_desk_person::skin-tone-3:"] = "\uD83D\uDC81\uD83C\uDFFD", + [":information_desk_person::skin-tone-4:"] = "\uD83D\uDC81\uD83C\uDFFE", + [":information_desk_person::skin-tone-5:"] = "\uD83D\uDC81\uD83C\uDFFF", + [":information_desk_person_tone1:"] = "\uD83D\uDC81\uD83C\uDFFB", + [":information_desk_person_tone2:"] = "\uD83D\uDC81\uD83C\uDFFC", + [":information_desk_person_tone3:"] = "\uD83D\uDC81\uD83C\uDFFD", + [":information_desk_person_tone4:"] = "\uD83D\uDC81\uD83C\uDFFE", + [":information_desk_person_tone5:"] = "\uD83D\uDC81\uD83C\uDFFF", + [":information_source:"] = "ℹ️", + [":innocent:"] = "\uD83D\uDE07", + [":interrobang:"] = "⁉️", + [":iphone:"] = "\uD83D\uDCF1", + [":island:"] = "\uD83C\uDFDD️", + [":izakaya_lantern:"] = "\uD83C\uDFEE", + [":jack_o_lantern:"] = "\uD83C\uDF83", + [":japan:"] = "\uD83D\uDDFE", + [":japanese_castle:"] = "\uD83C\uDFEF", + [":japanese_goblin:"] = "\uD83D\uDC7A", + [":japanese_ogre:"] = "\uD83D\uDC79", + [":jeans:"] = "\uD83D\uDC56", + [":jigsaw:"] = "\uD83E\uDDE9", + [":joy:"] = "\uD83D\uDE02", + [":joy_cat:"] = "\uD83D\uDE39", + [":joystick:"] = "\uD83D\uDD79️", + [":juggler:"] = "\uD83E\uDD39", + [":juggler::skin-tone-1:"] = "\uD83E\uDD39\uD83C\uDFFB", + [":juggler::skin-tone-2:"] = "\uD83E\uDD39\uD83C\uDFFC", + [":juggler::skin-tone-3:"] = "\uD83E\uDD39\uD83C\uDFFD", + [":juggler::skin-tone-4:"] = "\uD83E\uDD39\uD83C\uDFFE", + [":juggler::skin-tone-5:"] = "\uD83E\uDD39\uD83C\uDFFF", + [":juggler_tone1:"] = "\uD83E\uDD39\uD83C\uDFFB", + [":juggler_tone2:"] = "\uD83E\uDD39\uD83C\uDFFC", + [":juggler_tone3:"] = "\uD83E\uDD39\uD83C\uDFFD", + [":juggler_tone4:"] = "\uD83E\uDD39\uD83C\uDFFE", + [":juggler_tone5:"] = "\uD83E\uDD39\uD83C\uDFFF", + [":juggling:"] = "\uD83E\uDD39", + [":juggling::skin-tone-1:"] = "\uD83E\uDD39\uD83C\uDFFB", + [":juggling::skin-tone-2:"] = "\uD83E\uDD39\uD83C\uDFFC", + [":juggling::skin-tone-3:"] = "\uD83E\uDD39\uD83C\uDFFD", + [":juggling::skin-tone-4:"] = "\uD83E\uDD39\uD83C\uDFFE", + [":juggling::skin-tone-5:"] = "\uD83E\uDD39\uD83C\uDFFF", + [":juggling_tone1:"] = "\uD83E\uDD39\uD83C\uDFFB", + [":juggling_tone2:"] = "\uD83E\uDD39\uD83C\uDFFC", + [":juggling_tone3:"] = "\uD83E\uDD39\uD83C\uDFFD", + [":juggling_tone4:"] = "\uD83E\uDD39\uD83C\uDFFE", + [":juggling_tone5:"] = "\uD83E\uDD39\uD83C\uDFFF", + [":kaaba:"] = "\uD83D\uDD4B", + [":kangaroo:"] = "\uD83E\uDD98", + [":karate_uniform:"] = "\uD83E\uDD4B", + [":kayak:"] = "\uD83D\uDEF6", + [":key2:"] = "\uD83D\uDDDD️", + [":key:"] = "\uD83D\uDD11", + [":keyboard:"] = "⌨️", + [":keycap_asterisk:"] = "*️⃣", + [":keycap_ten:"] = "\uD83D\uDD1F", + [":kimono:"] = "\uD83D\uDC58", + [":kiss:"] = "\uD83D\uDC8B", + [":kiss_mm:"] = "\uD83D\uDC68\u200D❤️\u200D\uD83D\uDC8B\u200D\uD83D\uDC68", + [":kiss_woman_man:"] = "\uD83D\uDC69\u200D❤️\u200D\uD83D\uDC8B\u200D\uD83D\uDC68", + [":kiss_ww:"] = "\uD83D\uDC69\u200D❤️\u200D\uD83D\uDC8B\u200D\uD83D\uDC69", + [":kissing:"] = "\uD83D\uDE17", + [":kissing_cat:"] = "\uD83D\uDE3D", + [":kissing_closed_eyes:"] = "\uD83D\uDE1A", + [":kissing_heart:"] = "\uD83D\uDE18", + [":kissing_smiling_eyes:"] = "\uD83D\uDE19", + [":kite:"] = "\uD83E\uDE81", + [":kiwi:"] = "\uD83E\uDD5D", + [":kiwifruit:"] = "\uD83E\uDD5D", + [":knife:"] = "\uD83D\uDD2A", + [":koala:"] = "\uD83D\uDC28", + [":koko:"] = "\uD83C\uDE01", + [":knot:"] = "\uD83E\uDEA2", + [":lab_coat:"] = "\uD83E\uDD7C", + [":label:"] = "\uD83C\uDFF7️", + [":lacrosse:"] = "\uD83E\uDD4D", + [":large_blue_diamond:"] = "\uD83D\uDD37", + [":large_orange_diamond:"] = "\uD83D\uDD36", + [":last_quarter_moon:"] = "\uD83C\uDF17", + [":last_quarter_moon_with_face:"] = "\uD83C\uDF1C", + [":latin_cross:"] = "✝️", + [":laughing:"] = "\uD83D\uDE06", + [":leafy_green:"] = "\uD83E\uDD6C", + [":leaves:"] = "\uD83C\uDF43", + [":ledger:"] = "\uD83D\uDCD2", + [":left_facing_fist:"] = "\uD83E\uDD1B", + [":left_facing_fist::skin-tone-1:"] = "\uD83E\uDD1B\uD83C\uDFFB", + [":left_facing_fist::skin-tone-2:"] = "\uD83E\uDD1B\uD83C\uDFFC", + [":left_facing_fist::skin-tone-3:"] = "\uD83E\uDD1B\uD83C\uDFFD", + [":left_facing_fist::skin-tone-4:"] = "\uD83E\uDD1B\uD83C\uDFFE", + [":left_facing_fist::skin-tone-5:"] = "\uD83E\uDD1B\uD83C\uDFFF", + [":left_facing_fist_tone1:"] = "\uD83E\uDD1B\uD83C\uDFFB", + [":left_facing_fist_tone2:"] = "\uD83E\uDD1B\uD83C\uDFFC", + [":left_facing_fist_tone3:"] = "\uD83E\uDD1B\uD83C\uDFFD", + [":left_facing_fist_tone4:"] = "\uD83E\uDD1B\uD83C\uDFFE", + [":left_facing_fist_tone5:"] = "\uD83E\uDD1B\uD83C\uDFFF", + [":left_fist:"] = "\uD83E\uDD1B", + [":left_fist::skin-tone-1:"] = "\uD83E\uDD1B\uD83C\uDFFB", + [":left_fist::skin-tone-2:"] = "\uD83E\uDD1B\uD83C\uDFFC", + [":left_fist::skin-tone-3:"] = "\uD83E\uDD1B\uD83C\uDFFD", + [":left_fist::skin-tone-4:"] = "\uD83E\uDD1B\uD83C\uDFFE", + [":left_fist::skin-tone-5:"] = "\uD83E\uDD1B\uD83C\uDFFF", + [":left_fist_tone1:"] = "\uD83E\uDD1B\uD83C\uDFFB", + [":left_fist_tone2:"] = "\uD83E\uDD1B\uD83C\uDFFC", + [":left_fist_tone3:"] = "\uD83E\uDD1B\uD83C\uDFFD", + [":left_fist_tone4:"] = "\uD83E\uDD1B\uD83C\uDFFE", + [":left_fist_tone5:"] = "\uD83E\uDD1B\uD83C\uDFFF", + [":left_luggage:"] = "\uD83D\uDEC5", + [":left_right_arrow:"] = "↔️", + [":left_speech_bubble:"] = "\uD83D\uDDE8️", + [":leftwards_arrow_with_hook:"] = "↩️", + [":leg:"] = "\uD83E\uDDB5", + [":leg::skin-tone-1:"] = "\uD83E\uDDB5\uD83C\uDFFB", + [":leg::skin-tone-2:"] = "\uD83E\uDDB5\uD83C\uDFFC", + [":leg::skin-tone-3:"] = "\uD83E\uDDB5\uD83C\uDFFD", + [":leg::skin-tone-4:"] = "\uD83E\uDDB5\uD83C\uDFFE", + [":leg::skin-tone-5:"] = "\uD83E\uDDB5\uD83C\uDFFF", + [":leg_dark_skin_tone:"] = "\uD83E\uDDB5\uD83C\uDFFF", + [":leg_light_skin_tone:"] = "\uD83E\uDDB5\uD83C\uDFFB", + [":leg_medium_dark_skin_tone:"] = "\uD83E\uDDB5\uD83C\uDFFE", + [":leg_medium_light_skin_tone:"] = "\uD83E\uDDB5\uD83C\uDFFC", + [":leg_medium_skin_tone:"] = "\uD83E\uDDB5\uD83C\uDFFD", + [":leg_tone1:"] = "\uD83E\uDDB5\uD83C\uDFFB", + [":leg_tone2:"] = "\uD83E\uDDB5\uD83C\uDFFC", + [":leg_tone3:"] = "\uD83E\uDDB5\uD83C\uDFFD", + [":leg_tone4:"] = "\uD83E\uDDB5\uD83C\uDFFE", + [":leg_tone5:"] = "\uD83E\uDDB5\uD83C\uDFFF", + [":lemon:"] = "\uD83C\uDF4B", + [":leo:"] = "♌", + [":leopard:"] = "\uD83D\uDC06", + [":level_slider:"] = "\uD83C\uDF9A️", + [":levitate:"] = "\uD83D\uDD74️", + [":levitate::skin-tone-1:"] = "\uD83D\uDD74\uD83C\uDFFB", + [":levitate::skin-tone-2:"] = "\uD83D\uDD74\uD83C\uDFFC", + [":levitate::skin-tone-3:"] = "\uD83D\uDD74\uD83C\uDFFD", + [":levitate::skin-tone-4:"] = "\uD83D\uDD74\uD83C\uDFFE", + [":levitate::skin-tone-5:"] = "\uD83D\uDD74\uD83C\uDFFF", + [":levitate_tone1:"] = "\uD83D\uDD74\uD83C\uDFFB", + [":levitate_tone2:"] = "\uD83D\uDD74\uD83C\uDFFC", + [":levitate_tone3:"] = "\uD83D\uDD74\uD83C\uDFFD", + [":levitate_tone4:"] = "\uD83D\uDD74\uD83C\uDFFE", + [":levitate_tone5:"] = "\uD83D\uDD74\uD83C\uDFFF", + [":liar:"] = "\uD83E\uDD25", + [":libra:"] = "♎", + [":lifter:"] = "\uD83C\uDFCB️", + [":lifter::skin-tone-1:"] = "\uD83C\uDFCB\uD83C\uDFFB", + [":lifter::skin-tone-2:"] = "\uD83C\uDFCB\uD83C\uDFFC", + [":lifter::skin-tone-3:"] = "\uD83C\uDFCB\uD83C\uDFFD", + [":lifter::skin-tone-4:"] = "\uD83C\uDFCB\uD83C\uDFFE", + [":lifter::skin-tone-5:"] = "\uD83C\uDFCB\uD83C\uDFFF", + [":lifter_tone1:"] = "\uD83C\uDFCB\uD83C\uDFFB", + [":lifter_tone2:"] = "\uD83C\uDFCB\uD83C\uDFFC", + [":lifter_tone3:"] = "\uD83C\uDFCB\uD83C\uDFFD", + [":lifter_tone4:"] = "\uD83C\uDFCB\uD83C\uDFFE", + [":lifter_tone5:"] = "\uD83C\uDFCB\uD83C\uDFFF", + [":light_rail:"] = "\uD83D\uDE88", + [":link:"] = "\uD83D\uDD17", + [":linked_paperclips:"] = "\uD83D\uDD87️", + [":lion:"] = "\uD83E\uDD81", + [":lion_face:"] = "\uD83E\uDD81", + [":lips:"] = "\uD83D\uDC44", + [":lipstick:"] = "\uD83D\uDC84", + [":lizard:"] = "\uD83E\uDD8E", + [":llama:"] = "\uD83E\uDD99", + [":lobster:"] = "\uD83E\uDD9E", + [":lock:"] = "\uD83D\uDD12", + [":lock_with_ink_pen:"] = "\uD83D\uDD0F", + [":lollipop:"] = "\uD83C\uDF6D", + [":loop:"] = "➿", + [":loud_sound:"] = "\uD83D\uDD0A", + [":loudspeaker:"] = "\uD83D\uDCE2", + [":love_hotel:"] = "\uD83C\uDFE9", + [":love_letter:"] = "\uD83D\uDC8C", + [":love_you_gesture:"] = "\uD83E\uDD1F", + [":love_you_gesture::skin-tone-1:"] = "\uD83E\uDD1F\uD83C\uDFFB", + [":love_you_gesture::skin-tone-2:"] = "\uD83E\uDD1F\uD83C\uDFFC", + [":love_you_gesture::skin-tone-3:"] = "\uD83E\uDD1F\uD83C\uDFFD", + [":love_you_gesture::skin-tone-4:"] = "\uD83E\uDD1F\uD83C\uDFFE", + [":love_you_gesture::skin-tone-5:"] = "\uD83E\uDD1F\uD83C\uDFFF", + [":love_you_gesture_dark_skin_tone:"] = "\uD83E\uDD1F\uD83C\uDFFF", + [":love_you_gesture_light_skin_tone:"] = "\uD83E\uDD1F\uD83C\uDFFB", + [":love_you_gesture_medium_dark_skin_tone:"] = "\uD83E\uDD1F\uD83C\uDFFE", + [":love_you_gesture_medium_light_skin_tone:"] = "\uD83E\uDD1F\uD83C\uDFFC", + [":love_you_gesture_medium_skin_tone:"] = "\uD83E\uDD1F\uD83C\uDFFD", + [":love_you_gesture_tone1:"] = "\uD83E\uDD1F\uD83C\uDFFB", + [":love_you_gesture_tone2:"] = "\uD83E\uDD1F\uD83C\uDFFC", + [":love_you_gesture_tone3:"] = "\uD83E\uDD1F\uD83C\uDFFD", + [":love_you_gesture_tone4:"] = "\uD83E\uDD1F\uD83C\uDFFE", + [":love_you_gesture_tone5:"] = "\uD83E\uDD1F\uD83C\uDFFF", + [":low_brightness:"] = "\uD83D\uDD05", + [":lower_left_ballpoint_pen:"] = "\uD83D\uDD8A️", + [":lower_left_crayon:"] = "\uD83D\uDD8D️", + [":lower_left_fountain_pen:"] = "\uD83D\uDD8B️", + [":lower_left_paintbrush:"] = "\uD83D\uDD8C️", + [":luggage:"] = "\uD83E\uDDF3", + [":lying_face:"] = "\uD83E\uDD25", + [":m:"] = "Ⓜ️", + [":mag:"] = "\uD83D\uDD0D", + [":mag_right:"] = "\uD83D\uDD0E", + [":mage:"] = "\uD83E\uDDD9", + [":mage::skin-tone-1:"] = "\uD83E\uDDD9\uD83C\uDFFB", + [":mage::skin-tone-2:"] = "\uD83E\uDDD9\uD83C\uDFFC", + [":mage::skin-tone-3:"] = "\uD83E\uDDD9\uD83C\uDFFD", + [":mage::skin-tone-4:"] = "\uD83E\uDDD9\uD83C\uDFFE", + [":mage::skin-tone-5:"] = "\uD83E\uDDD9\uD83C\uDFFF", + [":mage_dark_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFF", + [":mage_light_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFB", + [":mage_medium_dark_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFE", + [":mage_medium_light_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFC", + [":mage_medium_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFD", + [":mage_tone1:"] = "\uD83E\uDDD9\uD83C\uDFFB", + [":mage_tone2:"] = "\uD83E\uDDD9\uD83C\uDFFC", + [":mage_tone3:"] = "\uD83E\uDDD9\uD83C\uDFFD", + [":mage_tone4:"] = "\uD83E\uDDD9\uD83C\uDFFE", + [":mage_tone5:"] = "\uD83E\uDDD9\uD83C\uDFFF", + [":magnet:"] = "\uD83E\uDDF2", + [":mahjong:"] = "\uD83C\uDC04", + [":mailbox:"] = "\uD83D\uDCEB", + [":mailbox_closed:"] = "\uD83D\uDCEA", + [":mailbox_with_mail:"] = "\uD83D\uDCEC", + [":mailbox_with_no_mail:"] = "\uD83D\uDCED", + [":male_dancer:"] = "\uD83D\uDD7A", + [":male_dancer::skin-tone-1:"] = "\uD83D\uDD7A\uD83C\uDFFB", + [":male_dancer::skin-tone-2:"] = "\uD83D\uDD7A\uD83C\uDFFC", + [":male_dancer::skin-tone-3:"] = "\uD83D\uDD7A\uD83C\uDFFD", + [":male_dancer::skin-tone-4:"] = "\uD83D\uDD7A\uD83C\uDFFE", + [":male_dancer::skin-tone-5:"] = "\uD83D\uDD7A\uD83C\uDFFF", + [":male_dancer_tone1:"] = "\uD83D\uDD7A\uD83C\uDFFB", + [":male_dancer_tone2:"] = "\uD83D\uDD7A\uD83C\uDFFC", + [":male_dancer_tone3:"] = "\uD83D\uDD7A\uD83C\uDFFD", + [":male_dancer_tone4:"] = "\uD83D\uDD7A\uD83C\uDFFE", + [":male_dancer_tone5:"] = "\uD83D\uDD7A\uD83C\uDFFF", + [":male_sign:"] = "♂️", + [":man:"] = "\uD83D\uDC68", + [":man::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB", + [":man::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC", + [":man::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD", + [":man::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE", + [":man::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF", + [":man_artist:"] = "\uD83D\uDC68\u200D\uD83C\uDFA8", + [":man_artist::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFA8", + [":man_artist::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFA8", + [":man_artist::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFA8", + [":man_artist::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFA8", + [":man_artist::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFA8", + [":man_artist_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFA8", + [":man_artist_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFA8", + [":man_artist_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFA8", + [":man_artist_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFA8", + [":man_artist_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFA8", + [":man_artist_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFA8", + [":man_artist_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFA8", + [":man_artist_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFA8", + [":man_artist_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFA8", + [":man_artist_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFA8", + [":man_astronaut:"] = "\uD83D\uDC68\u200D\uD83D\uDE80", + [":man_astronaut::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDE80", + [":man_astronaut::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDE80", + [":man_astronaut::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDE80", + [":man_astronaut::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDE80", + [":man_astronaut::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDE80", + [":man_astronaut_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDE80", + [":man_astronaut_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDE80", + [":man_astronaut_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDE80", + [":man_astronaut_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDE80", + [":man_astronaut_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDE80", + [":man_astronaut_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDE80", + [":man_astronaut_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDE80", + [":man_astronaut_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDE80", + [":man_astronaut_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDE80", + [":man_astronaut_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDE80", + [":man_bald:"] = "\uD83D\uDC68\u200D\uD83E\uDDB2", + [":man_bald::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB2", + [":man_bald::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB2", + [":man_bald::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB2", + [":man_bald::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB2", + [":man_bald::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB2", + [":man_bald_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB2", + [":man_bald_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB2", + [":man_bald_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB2", + [":man_bald_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB2", + [":man_bald_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB2", + [":man_bald_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB2", + [":man_bald_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB2", + [":man_bald_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB2", + [":man_bald_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB2", + [":man_bald_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB2", + [":man_biking:"] = "\uD83D\uDEB4\u200D♂️", + [":man_biking::skin-tone-1:"] = "\uD83D\uDEB4\uD83C\uDFFB\u200D♂️", + [":man_biking::skin-tone-2:"] = "\uD83D\uDEB4\uD83C\uDFFC\u200D♂️", + [":man_biking::skin-tone-3:"] = "\uD83D\uDEB4\uD83C\uDFFD\u200D♂️", + [":man_biking::skin-tone-4:"] = "\uD83D\uDEB4\uD83C\uDFFE\u200D♂️", + [":man_biking::skin-tone-5:"] = "\uD83D\uDEB4\uD83C\uDFFF\u200D♂️", + [":man_biking_dark_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFF\u200D♂️", + [":man_biking_light_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFB\u200D♂️", + [":man_biking_medium_dark_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFE\u200D♂️", + [":man_biking_medium_light_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFC\u200D♂️", + [":man_biking_medium_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFD\u200D♂️", + [":man_biking_tone1:"] = "\uD83D\uDEB4\uD83C\uDFFB\u200D♂️", + [":man_biking_tone2:"] = "\uD83D\uDEB4\uD83C\uDFFC\u200D♂️", + [":man_biking_tone3:"] = "\uD83D\uDEB4\uD83C\uDFFD\u200D♂️", + [":man_biking_tone4:"] = "\uD83D\uDEB4\uD83C\uDFFE\u200D♂️", + [":man_biking_tone5:"] = "\uD83D\uDEB4\uD83C\uDFFF\u200D♂️", + [":man_bouncing_ball:"] = "⛹️\u200D♂️", + [":man_bouncing_ball::skin-tone-1:"] = "⛹\uD83C\uDFFB\u200D♂️", + [":man_bouncing_ball::skin-tone-2:"] = "⛹\uD83C\uDFFC\u200D♂️", + [":man_bouncing_ball::skin-tone-3:"] = "⛹\uD83C\uDFFD\u200D♂️", + [":man_bouncing_ball::skin-tone-4:"] = "⛹\uD83C\uDFFE\u200D♂️", + [":man_bouncing_ball::skin-tone-5:"] = "⛹\uD83C\uDFFF\u200D♂️", + [":man_bouncing_ball_dark_skin_tone:"] = "⛹\uD83C\uDFFF\u200D♂️", + [":man_bouncing_ball_light_skin_tone:"] = "⛹\uD83C\uDFFB\u200D♂️", + [":man_bouncing_ball_medium_dark_skin_tone:"] = "⛹\uD83C\uDFFE\u200D♂️", + [":man_bouncing_ball_medium_light_skin_tone:"] = "⛹\uD83C\uDFFC\u200D♂️", + [":man_bouncing_ball_medium_skin_tone:"] = "⛹\uD83C\uDFFD\u200D♂️", + [":man_bouncing_ball_tone1:"] = "⛹\uD83C\uDFFB\u200D♂️", + [":man_bouncing_ball_tone2:"] = "⛹\uD83C\uDFFC\u200D♂️", + [":man_bouncing_ball_tone3:"] = "⛹\uD83C\uDFFD\u200D♂️", + [":man_bouncing_ball_tone4:"] = "⛹\uD83C\uDFFE\u200D♂️", + [":man_bouncing_ball_tone5:"] = "⛹\uD83C\uDFFF\u200D♂️", + [":man_bowing:"] = "\uD83D\uDE47\u200D♂️", + [":man_bowing::skin-tone-1:"] = "\uD83D\uDE47\uD83C\uDFFB\u200D♂️", + [":man_bowing::skin-tone-2:"] = "\uD83D\uDE47\uD83C\uDFFC\u200D♂️", + [":man_bowing::skin-tone-3:"] = "\uD83D\uDE47\uD83C\uDFFD\u200D♂️", + [":man_bowing::skin-tone-4:"] = "\uD83D\uDE47\uD83C\uDFFE\u200D♂️", + [":man_bowing::skin-tone-5:"] = "\uD83D\uDE47\uD83C\uDFFF\u200D♂️", + [":man_bowing_dark_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFF\u200D♂️", + [":man_bowing_light_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFB\u200D♂️", + [":man_bowing_medium_dark_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFE\u200D♂️", + [":man_bowing_medium_light_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFC\u200D♂️", + [":man_bowing_medium_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFD\u200D♂️", + [":man_bowing_tone1:"] = "\uD83D\uDE47\uD83C\uDFFB\u200D♂️", + [":man_bowing_tone2:"] = "\uD83D\uDE47\uD83C\uDFFC\u200D♂️", + [":man_bowing_tone3:"] = "\uD83D\uDE47\uD83C\uDFFD\u200D♂️", + [":man_bowing_tone4:"] = "\uD83D\uDE47\uD83C\uDFFE\u200D♂️", + [":man_bowing_tone5:"] = "\uD83D\uDE47\uD83C\uDFFF\u200D♂️", + [":man_cartwheeling:"] = "\uD83E\uDD38\u200D♂️", + [":man_cartwheeling::skin-tone-1:"] = "\uD83E\uDD38\uD83C\uDFFB\u200D♂️", + [":man_cartwheeling::skin-tone-2:"] = "\uD83E\uDD38\uD83C\uDFFC\u200D♂️", + [":man_cartwheeling::skin-tone-3:"] = "\uD83E\uDD38\uD83C\uDFFD\u200D♂️", + [":man_cartwheeling::skin-tone-4:"] = "\uD83E\uDD38\uD83C\uDFFE\u200D♂️", + [":man_cartwheeling::skin-tone-5:"] = "\uD83E\uDD38\uD83C\uDFFF\u200D♂️", + [":man_cartwheeling_dark_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFF\u200D♂️", + [":man_cartwheeling_light_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFB\u200D♂️", + [":man_cartwheeling_medium_dark_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFE\u200D♂️", + [":man_cartwheeling_medium_light_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFC\u200D♂️", + [":man_cartwheeling_medium_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFD\u200D♂️", + [":man_cartwheeling_tone1:"] = "\uD83E\uDD38\uD83C\uDFFB\u200D♂️", + [":man_cartwheeling_tone2:"] = "\uD83E\uDD38\uD83C\uDFFC\u200D♂️", + [":man_cartwheeling_tone3:"] = "\uD83E\uDD38\uD83C\uDFFD\u200D♂️", + [":man_cartwheeling_tone4:"] = "\uD83E\uDD38\uD83C\uDFFE\u200D♂️", + [":man_cartwheeling_tone5:"] = "\uD83E\uDD38\uD83C\uDFFF\u200D♂️", + [":man_climbing:"] = "\uD83E\uDDD7\u200D♂️", + [":man_climbing::skin-tone-1:"] = "\uD83E\uDDD7\uD83C\uDFFB\u200D♂️", + [":man_climbing::skin-tone-2:"] = "\uD83E\uDDD7\uD83C\uDFFC\u200D♂️", + [":man_climbing::skin-tone-3:"] = "\uD83E\uDDD7\uD83C\uDFFD\u200D♂️", + [":man_climbing::skin-tone-4:"] = "\uD83E\uDDD7\uD83C\uDFFE\u200D♂️", + [":man_climbing::skin-tone-5:"] = "\uD83E\uDDD7\uD83C\uDFFF\u200D♂️", + [":man_climbing_dark_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFF\u200D♂️", + [":man_climbing_light_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFB\u200D♂️", + [":man_climbing_medium_dark_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFE\u200D♂️", + [":man_climbing_medium_light_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFC\u200D♂️", + [":man_climbing_medium_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFD\u200D♂️", + [":man_climbing_tone1:"] = "\uD83E\uDDD7\uD83C\uDFFB\u200D♂️", + [":man_climbing_tone2:"] = "\uD83E\uDDD7\uD83C\uDFFC\u200D♂️", + [":man_climbing_tone3:"] = "\uD83E\uDDD7\uD83C\uDFFD\u200D♂️", + [":man_climbing_tone4:"] = "\uD83E\uDDD7\uD83C\uDFFE\u200D♂️", + [":man_climbing_tone5:"] = "\uD83E\uDDD7\uD83C\uDFFF\u200D♂️", + [":man_construction_worker:"] = "\uD83D\uDC77\u200D♂️", + [":man_construction_worker::skin-tone-1:"] = "\uD83D\uDC77\uD83C\uDFFB\u200D♂️", + [":man_construction_worker::skin-tone-2:"] = "\uD83D\uDC77\uD83C\uDFFC\u200D♂️", + [":man_construction_worker::skin-tone-3:"] = "\uD83D\uDC77\uD83C\uDFFD\u200D♂️", + [":man_construction_worker::skin-tone-4:"] = "\uD83D\uDC77\uD83C\uDFFE\u200D♂️", + [":man_construction_worker::skin-tone-5:"] = "\uD83D\uDC77\uD83C\uDFFF\u200D♂️", + [":man_construction_worker_dark_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFF\u200D♂️", + [":man_construction_worker_light_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFB\u200D♂️", + [":man_construction_worker_medium_dark_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFE\u200D♂️", + [":man_construction_worker_medium_light_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFC\u200D♂️", + [":man_construction_worker_medium_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFD\u200D♂️", + [":man_construction_worker_tone1:"] = "\uD83D\uDC77\uD83C\uDFFB\u200D♂️", + [":man_construction_worker_tone2:"] = "\uD83D\uDC77\uD83C\uDFFC\u200D♂️", + [":man_construction_worker_tone3:"] = "\uD83D\uDC77\uD83C\uDFFD\u200D♂️", + [":man_construction_worker_tone4:"] = "\uD83D\uDC77\uD83C\uDFFE\u200D♂️", + [":man_construction_worker_tone5:"] = "\uD83D\uDC77\uD83C\uDFFF\u200D♂️", + [":man_cook:"] = "\uD83D\uDC68\u200D\uD83C\uDF73", + [":man_cook::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF73", + [":man_cook::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF73", + [":man_cook::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF73", + [":man_cook::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF73", + [":man_cook::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF73", + [":man_cook_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF73", + [":man_cook_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF73", + [":man_cook_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF73", + [":man_cook_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF73", + [":man_cook_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF73", + [":man_cook_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF73", + [":man_cook_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF73", + [":man_cook_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF73", + [":man_cook_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF73", + [":man_cook_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF73", + [":man_curly_haired:"] = "\uD83D\uDC68\u200D\uD83E\uDDB1", + [":man_curly_haired::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB1", + [":man_curly_haired::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB1", + [":man_curly_haired::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB1", + [":man_curly_haired::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB1", + [":man_curly_haired::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB1", + [":man_curly_haired_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB1", + [":man_curly_haired_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB1", + [":man_curly_haired_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB1", + [":man_curly_haired_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB1", + [":man_curly_haired_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB1", + [":man_curly_haired_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB1", + [":man_curly_haired_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB1", + [":man_curly_haired_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB1", + [":man_curly_haired_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB1", + [":man_curly_haired_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB1", + [":man_dancing:"] = "\uD83D\uDD7A", + [":man_dancing::skin-tone-1:"] = "\uD83D\uDD7A\uD83C\uDFFB", + [":man_dancing::skin-tone-2:"] = "\uD83D\uDD7A\uD83C\uDFFC", + [":man_dancing::skin-tone-3:"] = "\uD83D\uDD7A\uD83C\uDFFD", + [":man_dancing::skin-tone-4:"] = "\uD83D\uDD7A\uD83C\uDFFE", + [":man_dancing::skin-tone-5:"] = "\uD83D\uDD7A\uD83C\uDFFF", + [":man_dancing_tone1:"] = "\uD83D\uDD7A\uD83C\uDFFB", + [":man_dancing_tone2:"] = "\uD83D\uDD7A\uD83C\uDFFC", + [":man_dancing_tone3:"] = "\uD83D\uDD7A\uD83C\uDFFD", + [":man_dancing_tone4:"] = "\uD83D\uDD7A\uD83C\uDFFE", + [":man_dancing_tone5:"] = "\uD83D\uDD7A\uD83C\uDFFF", + [":man_detective:"] = "\uD83D\uDD75️\u200D♂️", + [":man_detective::skin-tone-1:"] = "\uD83D\uDD75\uD83C\uDFFB\u200D♂️", + [":man_detective::skin-tone-2:"] = "\uD83D\uDD75\uD83C\uDFFC\u200D♂️", + [":man_detective::skin-tone-3:"] = "\uD83D\uDD75\uD83C\uDFFD\u200D♂️", + [":man_detective::skin-tone-4:"] = "\uD83D\uDD75\uD83C\uDFFE\u200D♂️", + [":man_detective::skin-tone-5:"] = "\uD83D\uDD75\uD83C\uDFFF\u200D♂️", + [":man_detective_dark_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFF\u200D♂️", + [":man_detective_light_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFB\u200D♂️", + [":man_detective_medium_dark_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFE\u200D♂️", + [":man_detective_medium_light_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFC\u200D♂️", + [":man_detective_medium_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFD\u200D♂️", + [":man_detective_tone1:"] = "\uD83D\uDD75\uD83C\uDFFB\u200D♂️", + [":man_detective_tone2:"] = "\uD83D\uDD75\uD83C\uDFFC\u200D♂️", + [":man_detective_tone3:"] = "\uD83D\uDD75\uD83C\uDFFD\u200D♂️", + [":man_detective_tone4:"] = "\uD83D\uDD75\uD83C\uDFFE\u200D♂️", + [":man_detective_tone5:"] = "\uD83D\uDD75\uD83C\uDFFF\u200D♂️", + [":man_elf:"] = "\uD83E\uDDDD\u200D♂️", + [":man_elf::skin-tone-1:"] = "\uD83E\uDDDD\uD83C\uDFFB\u200D♂️", + [":man_elf::skin-tone-2:"] = "\uD83E\uDDDD\uD83C\uDFFC\u200D♂️", + [":man_elf::skin-tone-3:"] = "\uD83E\uDDDD\uD83C\uDFFD\u200D♂️", + [":man_elf::skin-tone-4:"] = "\uD83E\uDDDD\uD83C\uDFFE\u200D♂️", + [":man_elf::skin-tone-5:"] = "\uD83E\uDDDD\uD83C\uDFFF\u200D♂️", + [":man_elf_dark_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFF\u200D♂️", + [":man_elf_light_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFB\u200D♂️", + [":man_elf_medium_dark_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFE\u200D♂️", + [":man_elf_medium_light_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFC\u200D♂️", + [":man_elf_medium_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFD\u200D♂️", + [":man_elf_tone1:"] = "\uD83E\uDDDD\uD83C\uDFFB\u200D♂️", + [":man_elf_tone2:"] = "\uD83E\uDDDD\uD83C\uDFFC\u200D♂️", + [":man_elf_tone3:"] = "\uD83E\uDDDD\uD83C\uDFFD\u200D♂️", + [":man_elf_tone4:"] = "\uD83E\uDDDD\uD83C\uDFFE\u200D♂️", + [":man_elf_tone5:"] = "\uD83E\uDDDD\uD83C\uDFFF\u200D♂️", + [":man_facepalming:"] = "\uD83E\uDD26\u200D♂️", + [":man_facepalming::skin-tone-1:"] = "\uD83E\uDD26\uD83C\uDFFB\u200D♂️", + [":man_facepalming::skin-tone-2:"] = "\uD83E\uDD26\uD83C\uDFFC\u200D♂️", + [":man_facepalming::skin-tone-3:"] = "\uD83E\uDD26\uD83C\uDFFD\u200D♂️", + [":man_facepalming::skin-tone-4:"] = "\uD83E\uDD26\uD83C\uDFFE\u200D♂️", + [":man_facepalming::skin-tone-5:"] = "\uD83E\uDD26\uD83C\uDFFF\u200D♂️", + [":man_facepalming_dark_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFF\u200D♂️", + [":man_facepalming_light_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFB\u200D♂️", + [":man_facepalming_medium_dark_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFE\u200D♂️", + [":man_facepalming_medium_light_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFC\u200D♂️", + [":man_facepalming_medium_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFD\u200D♂️", + [":man_facepalming_tone1:"] = "\uD83E\uDD26\uD83C\uDFFB\u200D♂️", + [":man_facepalming_tone2:"] = "\uD83E\uDD26\uD83C\uDFFC\u200D♂️", + [":man_facepalming_tone3:"] = "\uD83E\uDD26\uD83C\uDFFD\u200D♂️", + [":man_facepalming_tone4:"] = "\uD83E\uDD26\uD83C\uDFFE\u200D♂️", + [":man_facepalming_tone5:"] = "\uD83E\uDD26\uD83C\uDFFF\u200D♂️", + [":man_factory_worker:"] = "\uD83D\uDC68\u200D\uD83C\uDFED", + [":man_factory_worker::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFED", + [":man_factory_worker::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFED", + [":man_factory_worker::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFED", + [":man_factory_worker::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFED", + [":man_factory_worker::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFED", + [":man_factory_worker_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFED", + [":man_factory_worker_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFED", + [":man_factory_worker_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFED", + [":man_factory_worker_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFED", + [":man_factory_worker_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFED", + [":man_factory_worker_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFED", + [":man_factory_worker_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFED", + [":man_factory_worker_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFED", + [":man_factory_worker_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFED", + [":man_factory_worker_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFED", + [":man_fairy:"] = "\uD83E\uDDDA\u200D♂️", + [":man_fairy::skin-tone-1:"] = "\uD83E\uDDDA\uD83C\uDFFB\u200D♂️", + [":man_fairy::skin-tone-2:"] = "\uD83E\uDDDA\uD83C\uDFFC\u200D♂️", + [":man_fairy::skin-tone-3:"] = "\uD83E\uDDDA\uD83C\uDFFD\u200D♂️", + [":man_fairy::skin-tone-4:"] = "\uD83E\uDDDA\uD83C\uDFFE\u200D♂️", + [":man_fairy::skin-tone-5:"] = "\uD83E\uDDDA\uD83C\uDFFF\u200D♂️", + [":man_fairy_dark_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFF\u200D♂️", + [":man_fairy_light_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFB\u200D♂️", + [":man_fairy_medium_dark_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFE\u200D♂️", + [":man_fairy_medium_light_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFC\u200D♂️", + [":man_fairy_medium_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFD\u200D♂️", + [":man_fairy_tone1:"] = "\uD83E\uDDDA\uD83C\uDFFB\u200D♂️", + [":man_fairy_tone2:"] = "\uD83E\uDDDA\uD83C\uDFFC\u200D♂️", + [":man_fairy_tone3:"] = "\uD83E\uDDDA\uD83C\uDFFD\u200D♂️", + [":man_fairy_tone4:"] = "\uD83E\uDDDA\uD83C\uDFFE\u200D♂️", + [":man_fairy_tone5:"] = "\uD83E\uDDDA\uD83C\uDFFF\u200D♂️", + [":man_farmer:"] = "\uD83D\uDC68\u200D\uD83C\uDF3E", + [":man_farmer::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF3E", + [":man_farmer::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF3E", + [":man_farmer::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF3E", + [":man_farmer::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF3E", + [":man_farmer::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF3E", + [":man_farmer_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF3E", + [":man_farmer_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF3E", + [":man_farmer_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF3E", + [":man_farmer_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF3E", + [":man_farmer_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF3E", + [":man_farmer_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF3E", + [":man_farmer_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF3E", + [":man_farmer_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF3E", + [":man_farmer_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF3E", + [":man_farmer_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF3E", + [":man_firefighter:"] = "\uD83D\uDC68\u200D\uD83D\uDE92", + [":man_firefighter::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDE92", + [":man_firefighter::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDE92", + [":man_firefighter::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDE92", + [":man_firefighter::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDE92", + [":man_firefighter::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDE92", + [":man_firefighter_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDE92", + [":man_firefighter_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDE92", + [":man_firefighter_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDE92", + [":man_firefighter_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDE92", + [":man_firefighter_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDE92", + [":man_firefighter_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDE92", + [":man_firefighter_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDE92", + [":man_firefighter_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDE92", + [":man_firefighter_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDE92", + [":man_firefighter_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDE92", + [":man_frowning:"] = "\uD83D\uDE4D\u200D♂️", + [":man_frowning::skin-tone-1:"] = "\uD83D\uDE4D\uD83C\uDFFB\u200D♂️", + [":man_frowning::skin-tone-2:"] = "\uD83D\uDE4D\uD83C\uDFFC\u200D♂️", + [":man_frowning::skin-tone-3:"] = "\uD83D\uDE4D\uD83C\uDFFD\u200D♂️", + [":man_frowning::skin-tone-4:"] = "\uD83D\uDE4D\uD83C\uDFFE\u200D♂️", + [":man_frowning::skin-tone-5:"] = "\uD83D\uDE4D\uD83C\uDFFF\u200D♂️", + [":man_frowning_dark_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFF\u200D♂️", + [":man_frowning_light_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFB\u200D♂️", + [":man_frowning_medium_dark_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFE\u200D♂️", + [":man_frowning_medium_light_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFC\u200D♂️", + [":man_frowning_medium_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFD\u200D♂️", + [":man_frowning_tone1:"] = "\uD83D\uDE4D\uD83C\uDFFB\u200D♂️", + [":man_frowning_tone2:"] = "\uD83D\uDE4D\uD83C\uDFFC\u200D♂️", + [":man_frowning_tone3:"] = "\uD83D\uDE4D\uD83C\uDFFD\u200D♂️", + [":man_frowning_tone4:"] = "\uD83D\uDE4D\uD83C\uDFFE\u200D♂️", + [":man_frowning_tone5:"] = "\uD83D\uDE4D\uD83C\uDFFF\u200D♂️", + [":man_genie:"] = "\uD83E\uDDDE\u200D♂️", + [":man_gesturing_no:"] = "\uD83D\uDE45\u200D♂️", + [":man_gesturing_no::skin-tone-1:"] = "\uD83D\uDE45\uD83C\uDFFB\u200D♂️", + [":man_gesturing_no::skin-tone-2:"] = "\uD83D\uDE45\uD83C\uDFFC\u200D♂️", + [":man_gesturing_no::skin-tone-3:"] = "\uD83D\uDE45\uD83C\uDFFD\u200D♂️", + [":man_gesturing_no::skin-tone-4:"] = "\uD83D\uDE45\uD83C\uDFFE\u200D♂️", + [":man_gesturing_no::skin-tone-5:"] = "\uD83D\uDE45\uD83C\uDFFF\u200D♂️", + [":man_gesturing_no_dark_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFF\u200D♂️", + [":man_gesturing_no_light_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFB\u200D♂️", + [":man_gesturing_no_medium_dark_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFE\u200D♂️", + [":man_gesturing_no_medium_light_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFC\u200D♂️", + [":man_gesturing_no_medium_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFD\u200D♂️", + [":man_gesturing_no_tone1:"] = "\uD83D\uDE45\uD83C\uDFFB\u200D♂️", + [":man_gesturing_no_tone2:"] = "\uD83D\uDE45\uD83C\uDFFC\u200D♂️", + [":man_gesturing_no_tone3:"] = "\uD83D\uDE45\uD83C\uDFFD\u200D♂️", + [":man_gesturing_no_tone4:"] = "\uD83D\uDE45\uD83C\uDFFE\u200D♂️", + [":man_gesturing_no_tone5:"] = "\uD83D\uDE45\uD83C\uDFFF\u200D♂️", + [":man_gesturing_ok:"] = "\uD83D\uDE46\u200D♂️", + [":man_gesturing_ok::skin-tone-1:"] = "\uD83D\uDE46\uD83C\uDFFB\u200D♂️", + [":man_gesturing_ok::skin-tone-2:"] = "\uD83D\uDE46\uD83C\uDFFC\u200D♂️", + [":man_gesturing_ok::skin-tone-3:"] = "\uD83D\uDE46\uD83C\uDFFD\u200D♂️", + [":man_gesturing_ok::skin-tone-4:"] = "\uD83D\uDE46\uD83C\uDFFE\u200D♂️", + [":man_gesturing_ok::skin-tone-5:"] = "\uD83D\uDE46\uD83C\uDFFF\u200D♂️", + [":man_gesturing_ok_dark_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFF\u200D♂️", + [":man_gesturing_ok_light_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFB\u200D♂️", + [":man_gesturing_ok_medium_dark_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFE\u200D♂️", + [":man_gesturing_ok_medium_light_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFC\u200D♂️", + [":man_gesturing_ok_medium_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFD\u200D♂️", + [":man_gesturing_ok_tone1:"] = "\uD83D\uDE46\uD83C\uDFFB\u200D♂️", + [":man_gesturing_ok_tone2:"] = "\uD83D\uDE46\uD83C\uDFFC\u200D♂️", + [":man_gesturing_ok_tone3:"] = "\uD83D\uDE46\uD83C\uDFFD\u200D♂️", + [":man_gesturing_ok_tone4:"] = "\uD83D\uDE46\uD83C\uDFFE\u200D♂️", + [":man_gesturing_ok_tone5:"] = "\uD83D\uDE46\uD83C\uDFFF\u200D♂️", + [":man_getting_face_massage:"] = "\uD83D\uDC86\u200D♂️", + [":man_getting_face_massage::skin-tone-1:"] = "\uD83D\uDC86\uD83C\uDFFB\u200D♂️", + [":man_getting_face_massage::skin-tone-2:"] = "\uD83D\uDC86\uD83C\uDFFC\u200D♂️", + [":man_getting_face_massage::skin-tone-3:"] = "\uD83D\uDC86\uD83C\uDFFD\u200D♂️", + [":man_getting_face_massage::skin-tone-4:"] = "\uD83D\uDC86\uD83C\uDFFE\u200D♂️", + [":man_getting_face_massage::skin-tone-5:"] = "\uD83D\uDC86\uD83C\uDFFF\u200D♂️", + [":man_getting_face_massage_dark_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFF\u200D♂️", + [":man_getting_face_massage_light_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFB\u200D♂️", + [":man_getting_face_massage_medium_dark_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFE\u200D♂️", + [":man_getting_face_massage_medium_light_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFC\u200D♂️", + [":man_getting_face_massage_medium_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFD\u200D♂️", + [":man_getting_face_massage_tone1:"] = "\uD83D\uDC86\uD83C\uDFFB\u200D♂️", + [":man_getting_face_massage_tone2:"] = "\uD83D\uDC86\uD83C\uDFFC\u200D♂️", + [":man_getting_face_massage_tone3:"] = "\uD83D\uDC86\uD83C\uDFFD\u200D♂️", + [":man_getting_face_massage_tone4:"] = "\uD83D\uDC86\uD83C\uDFFE\u200D♂️", + [":man_getting_face_massage_tone5:"] = "\uD83D\uDC86\uD83C\uDFFF\u200D♂️", + [":man_getting_haircut:"] = "\uD83D\uDC87\u200D♂️", + [":man_getting_haircut::skin-tone-1:"] = "\uD83D\uDC87\uD83C\uDFFB\u200D♂️", + [":man_getting_haircut::skin-tone-2:"] = "\uD83D\uDC87\uD83C\uDFFC\u200D♂️", + [":man_getting_haircut::skin-tone-3:"] = "\uD83D\uDC87\uD83C\uDFFD\u200D♂️", + [":man_getting_haircut::skin-tone-4:"] = "\uD83D\uDC87\uD83C\uDFFE\u200D♂️", + [":man_getting_haircut::skin-tone-5:"] = "\uD83D\uDC87\uD83C\uDFFF\u200D♂️", + [":man_getting_haircut_dark_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFF\u200D♂️", + [":man_getting_haircut_light_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFB\u200D♂️", + [":man_getting_haircut_medium_dark_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFE\u200D♂️", + [":man_getting_haircut_medium_light_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFC\u200D♂️", + [":man_getting_haircut_medium_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFD\u200D♂️", + [":man_getting_haircut_tone1:"] = "\uD83D\uDC87\uD83C\uDFFB\u200D♂️", + [":man_getting_haircut_tone2:"] = "\uD83D\uDC87\uD83C\uDFFC\u200D♂️", + [":man_getting_haircut_tone3:"] = "\uD83D\uDC87\uD83C\uDFFD\u200D♂️", + [":man_getting_haircut_tone4:"] = "\uD83D\uDC87\uD83C\uDFFE\u200D♂️", + [":man_getting_haircut_tone5:"] = "\uD83D\uDC87\uD83C\uDFFF\u200D♂️", + [":man_golfing:"] = "\uD83C\uDFCC️\u200D♂️", + [":man_golfing::skin-tone-1:"] = "\uD83C\uDFCC\uD83C\uDFFB\u200D♂️", + [":man_golfing::skin-tone-2:"] = "\uD83C\uDFCC\uD83C\uDFFC\u200D♂️", + [":man_golfing::skin-tone-3:"] = "\uD83C\uDFCC\uD83C\uDFFD\u200D♂️", + [":man_golfing::skin-tone-4:"] = "\uD83C\uDFCC\uD83C\uDFFE\u200D♂️", + [":man_golfing::skin-tone-5:"] = "\uD83C\uDFCC\uD83C\uDFFF\u200D♂️", + [":man_golfing_dark_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFF\u200D♂️", + [":man_golfing_light_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFB\u200D♂️", + [":man_golfing_medium_dark_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFE\u200D♂️", + [":man_golfing_medium_light_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFC\u200D♂️", + [":man_golfing_medium_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFD\u200D♂️", + [":man_golfing_tone1:"] = "\uD83C\uDFCC\uD83C\uDFFB\u200D♂️", + [":man_golfing_tone2:"] = "\uD83C\uDFCC\uD83C\uDFFC\u200D♂️", + [":man_golfing_tone3:"] = "\uD83C\uDFCC\uD83C\uDFFD\u200D♂️", + [":man_golfing_tone4:"] = "\uD83C\uDFCC\uD83C\uDFFE\u200D♂️", + [":man_golfing_tone5:"] = "\uD83C\uDFCC\uD83C\uDFFF\u200D♂️", + [":man_guard:"] = "\uD83D\uDC82\u200D♂️", + [":man_guard::skin-tone-1:"] = "\uD83D\uDC82\uD83C\uDFFB\u200D♂️", + [":man_guard::skin-tone-2:"] = "\uD83D\uDC82\uD83C\uDFFC\u200D♂️", + [":man_guard::skin-tone-3:"] = "\uD83D\uDC82\uD83C\uDFFD\u200D♂️", + [":man_guard::skin-tone-4:"] = "\uD83D\uDC82\uD83C\uDFFE\u200D♂️", + [":man_guard::skin-tone-5:"] = "\uD83D\uDC82\uD83C\uDFFF\u200D♂️", + [":man_guard_dark_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFF\u200D♂️", + [":man_guard_light_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFB\u200D♂️", + [":man_guard_medium_dark_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFE\u200D♂️", + [":man_guard_medium_light_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFC\u200D♂️", + [":man_guard_medium_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFD\u200D♂️", + [":man_guard_tone1:"] = "\uD83D\uDC82\uD83C\uDFFB\u200D♂️", + [":man_guard_tone2:"] = "\uD83D\uDC82\uD83C\uDFFC\u200D♂️", + [":man_guard_tone3:"] = "\uD83D\uDC82\uD83C\uDFFD\u200D♂️", + [":man_guard_tone4:"] = "\uD83D\uDC82\uD83C\uDFFE\u200D♂️", + [":man_guard_tone5:"] = "\uD83D\uDC82\uD83C\uDFFF\u200D♂️", + [":man_health_worker:"] = "\uD83D\uDC68\u200D⚕️", + [":man_health_worker::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D⚕️", + [":man_health_worker::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D⚕️", + [":man_health_worker::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D⚕️", + [":man_health_worker::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D⚕️", + [":man_health_worker::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D⚕️", + [":man_health_worker_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D⚕️", + [":man_health_worker_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D⚕️", + [":man_health_worker_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D⚕️", + [":man_health_worker_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D⚕️", + [":man_health_worker_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D⚕️", + [":man_health_worker_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D⚕️", + [":man_health_worker_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D⚕️", + [":man_health_worker_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D⚕️", + [":man_health_worker_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D⚕️", + [":man_health_worker_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D⚕️", + [":man_in_business_suit_levitating:"] = "\uD83D\uDD74️", + [":man_in_business_suit_levitating::skin-tone-1:"] = "\uD83D\uDD74\uD83C\uDFFB", + [":man_in_business_suit_levitating::skin-tone-2:"] = "\uD83D\uDD74\uD83C\uDFFC", + [":man_in_business_suit_levitating::skin-tone-3:"] = "\uD83D\uDD74\uD83C\uDFFD", + [":man_in_business_suit_levitating::skin-tone-4:"] = "\uD83D\uDD74\uD83C\uDFFE", + [":man_in_business_suit_levitating::skin-tone-5:"] = "\uD83D\uDD74\uD83C\uDFFF", + [":man_in_business_suit_levitating_dark_skin_tone:"] = "\uD83D\uDD74\uD83C\uDFFF", + [":man_in_business_suit_levitating_light_skin_tone:"] = "\uD83D\uDD74\uD83C\uDFFB", + [":man_in_business_suit_levitating_medium_dark_skin_tone:"] = "\uD83D\uDD74\uD83C\uDFFE", + [":man_in_business_suit_levitating_medium_light_skin_tone:"] = "\uD83D\uDD74\uD83C\uDFFC", + [":man_in_business_suit_levitating_medium_skin_tone:"] = "\uD83D\uDD74\uD83C\uDFFD", + [":man_in_business_suit_levitating_tone1:"] = "\uD83D\uDD74\uD83C\uDFFB", + [":man_in_business_suit_levitating_tone2:"] = "\uD83D\uDD74\uD83C\uDFFC", + [":man_in_business_suit_levitating_tone3:"] = "\uD83D\uDD74\uD83C\uDFFD", + [":man_in_business_suit_levitating_tone4:"] = "\uD83D\uDD74\uD83C\uDFFE", + [":man_in_business_suit_levitating_tone5:"] = "\uD83D\uDD74\uD83C\uDFFF", + [":man_in_lotus_position:"] = "\uD83E\uDDD8\u200D♂️", + [":man_in_lotus_position::skin-tone-1:"] = "\uD83E\uDDD8\uD83C\uDFFB\u200D♂️", + [":man_in_lotus_position::skin-tone-2:"] = "\uD83E\uDDD8\uD83C\uDFFC\u200D♂️", + [":man_in_lotus_position::skin-tone-3:"] = "\uD83E\uDDD8\uD83C\uDFFD\u200D♂️", + [":man_in_lotus_position::skin-tone-4:"] = "\uD83E\uDDD8\uD83C\uDFFE\u200D♂️", + [":man_in_lotus_position::skin-tone-5:"] = "\uD83E\uDDD8\uD83C\uDFFF\u200D♂️", + [":man_in_lotus_position_dark_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFF\u200D♂️", + [":man_in_lotus_position_light_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFB\u200D♂️", + [":man_in_lotus_position_medium_dark_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFE\u200D♂️", + [":man_in_lotus_position_medium_light_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFC\u200D♂️", + [":man_in_lotus_position_medium_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFD\u200D♂️", + [":man_in_lotus_position_tone1:"] = "\uD83E\uDDD8\uD83C\uDFFB\u200D♂️", + [":man_in_lotus_position_tone2:"] = "\uD83E\uDDD8\uD83C\uDFFC\u200D♂️", + [":man_in_lotus_position_tone3:"] = "\uD83E\uDDD8\uD83C\uDFFD\u200D♂️", + [":man_in_lotus_position_tone4:"] = "\uD83E\uDDD8\uD83C\uDFFE\u200D♂️", + [":man_in_lotus_position_tone5:"] = "\uD83E\uDDD8\uD83C\uDFFF\u200D♂️", + [":man_in_manual_wheelchair:"] = "\uD83D\uDC68\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDBD", + [":man_in_manual_wheelchair_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDBD", + [":man_in_motorized_wheelchair:"] = "\uD83D\uDC68\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDBC", + [":man_in_motorized_wheelchair_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDBC", + [":man_in_steamy_room:"] = "\uD83E\uDDD6\u200D♂️", + [":man_in_steamy_room::skin-tone-1:"] = "\uD83E\uDDD6\uD83C\uDFFB\u200D♂️", + [":man_in_steamy_room::skin-tone-2:"] = "\uD83E\uDDD6\uD83C\uDFFC\u200D♂️", + [":man_in_steamy_room::skin-tone-3:"] = "\uD83E\uDDD6\uD83C\uDFFD\u200D♂️", + [":man_in_steamy_room::skin-tone-4:"] = "\uD83E\uDDD6\uD83C\uDFFE\u200D♂️", + [":man_in_steamy_room::skin-tone-5:"] = "\uD83E\uDDD6\uD83C\uDFFF\u200D♂️", + [":man_in_steamy_room_dark_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFF\u200D♂️", + [":man_in_steamy_room_light_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFB\u200D♂️", + [":man_in_steamy_room_medium_dark_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFE\u200D♂️", + [":man_in_steamy_room_medium_light_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFC\u200D♂️", + [":man_in_steamy_room_medium_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFD\u200D♂️", + [":man_in_steamy_room_tone1:"] = "\uD83E\uDDD6\uD83C\uDFFB\u200D♂️", + [":man_in_steamy_room_tone2:"] = "\uD83E\uDDD6\uD83C\uDFFC\u200D♂️", + [":man_in_steamy_room_tone3:"] = "\uD83E\uDDD6\uD83C\uDFFD\u200D♂️", + [":man_in_steamy_room_tone4:"] = "\uD83E\uDDD6\uD83C\uDFFE\u200D♂️", + [":man_in_steamy_room_tone5:"] = "\uD83E\uDDD6\uD83C\uDFFF\u200D♂️", + [":man_in_tuxedo:"] = "\uD83E\uDD35", + [":man_in_tuxedo::skin-tone-1:"] = "\uD83E\uDD35\uD83C\uDFFB", + [":man_in_tuxedo::skin-tone-2:"] = "\uD83E\uDD35\uD83C\uDFFC", + [":man_in_tuxedo::skin-tone-3:"] = "\uD83E\uDD35\uD83C\uDFFD", + [":man_in_tuxedo::skin-tone-4:"] = "\uD83E\uDD35\uD83C\uDFFE", + [":man_in_tuxedo::skin-tone-5:"] = "\uD83E\uDD35\uD83C\uDFFF", + [":man_in_tuxedo_tone1:"] = "\uD83E\uDD35\uD83C\uDFFB", + [":man_in_tuxedo_tone2:"] = "\uD83E\uDD35\uD83C\uDFFC", + [":man_in_tuxedo_tone3:"] = "\uD83E\uDD35\uD83C\uDFFD", + [":man_in_tuxedo_tone4:"] = "\uD83E\uDD35\uD83C\uDFFE", + [":man_in_tuxedo_tone5:"] = "\uD83E\uDD35\uD83C\uDFFF", + [":man_judge:"] = "\uD83D\uDC68\u200D⚖️", + [":man_judge::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D⚖️", + [":man_judge::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D⚖️", + [":man_judge::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D⚖️", + [":man_judge::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D⚖️", + [":man_judge::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D⚖️", + [":man_judge_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D⚖️", + [":man_judge_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D⚖️", + [":man_judge_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D⚖️", + [":man_judge_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D⚖️", + [":man_judge_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D⚖️", + [":man_judge_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D⚖️", + [":man_judge_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D⚖️", + [":man_judge_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D⚖️", + [":man_judge_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D⚖️", + [":man_judge_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D⚖️", + [":man_juggling:"] = "\uD83E\uDD39\u200D♂️", + [":man_juggling::skin-tone-1:"] = "\uD83E\uDD39\uD83C\uDFFB\u200D♂️", + [":man_juggling::skin-tone-2:"] = "\uD83E\uDD39\uD83C\uDFFC\u200D♂️", + [":man_juggling::skin-tone-3:"] = "\uD83E\uDD39\uD83C\uDFFD\u200D♂️", + [":man_juggling::skin-tone-4:"] = "\uD83E\uDD39\uD83C\uDFFE\u200D♂️", + [":man_juggling::skin-tone-5:"] = "\uD83E\uDD39\uD83C\uDFFF\u200D♂️", + [":man_juggling_dark_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFF\u200D♂️", + [":man_juggling_light_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFB\u200D♂️", + [":man_juggling_medium_dark_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFE\u200D♂️", + [":man_juggling_medium_light_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFC\u200D♂️", + [":man_juggling_medium_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFD\u200D♂️", + [":man_juggling_tone1:"] = "\uD83E\uDD39\uD83C\uDFFB\u200D♂️", + [":man_juggling_tone2:"] = "\uD83E\uDD39\uD83C\uDFFC\u200D♂️", + [":man_juggling_tone3:"] = "\uD83E\uDD39\uD83C\uDFFD\u200D♂️", + [":man_juggling_tone4:"] = "\uD83E\uDD39\uD83C\uDFFE\u200D♂️", + [":man_juggling_tone5:"] = "\uD83E\uDD39\uD83C\uDFFF\u200D♂️", + [":man_kneeling:"] = "\uD83E\uDDCE\u200D♂️", + [":man_kneeling::skin-tone-1:"] = "\uD83E\uDDCE\uD83C\uDFFB\u200D♂️", + [":man_kneeling::skin-tone-2:"] = "\uD83E\uDDCE\uD83C\uDFFC\u200D♂️", + [":man_kneeling::skin-tone-3:"] = "\uD83E\uDDCE\uD83C\uDFFD\u200D♂️", + [":man_kneeling::skin-tone-4:"] = "\uD83E\uDDCE\uD83C\uDFFE\u200D♂️", + [":man_kneeling::skin-tone-5:"] = "\uD83E\uDDCE\uD83C\uDFFF\u200D♂️", + [":man_kneeling_dark_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFF\u200D♂️", + [":man_kneeling_light_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFB\u200D♂️", + [":man_kneeling_medium_dark_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFE\u200D♂️", + [":man_kneeling_medium_light_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFC\u200D♂️", + [":man_kneeling_medium_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFD\u200D♂️", + [":man_kneeling_tone1:"] = "\uD83E\uDDCE\uD83C\uDFFB\u200D♂️", + [":man_kneeling_tone2:"] = "\uD83E\uDDCE\uD83C\uDFFC\u200D♂️", + [":man_kneeling_tone3:"] = "\uD83E\uDDCE\uD83C\uDFFD\u200D♂️", + [":man_kneeling_tone4:"] = "\uD83E\uDDCE\uD83C\uDFFE\u200D♂️", + [":man_kneeling_tone5:"] = "\uD83E\uDDCE\uD83C\uDFFF\u200D♂️", + [":man_lifting_weights:"] = "\uD83C\uDFCB️\u200D♂️", + [":man_lifting_weights::skin-tone-1:"] = "\uD83C\uDFCB\uD83C\uDFFB\u200D♂️", + [":man_lifting_weights::skin-tone-2:"] = "\uD83C\uDFCB\uD83C\uDFFC\u200D♂️", + [":man_lifting_weights::skin-tone-3:"] = "\uD83C\uDFCB\uD83C\uDFFD\u200D♂️", + [":man_lifting_weights::skin-tone-4:"] = "\uD83C\uDFCB\uD83C\uDFFE\u200D♂️", + [":man_lifting_weights::skin-tone-5:"] = "\uD83C\uDFCB\uD83C\uDFFF\u200D♂️", + [":man_lifting_weights_dark_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFF\u200D♂️", + [":man_lifting_weights_light_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFB\u200D♂️", + [":man_lifting_weights_medium_dark_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFE\u200D♂️", + [":man_lifting_weights_medium_light_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFC\u200D♂️", + [":man_lifting_weights_medium_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFD\u200D♂️", + [":man_lifting_weights_tone1:"] = "\uD83C\uDFCB\uD83C\uDFFB\u200D♂️", + [":man_lifting_weights_tone2:"] = "\uD83C\uDFCB\uD83C\uDFFC\u200D♂️", + [":man_lifting_weights_tone3:"] = "\uD83C\uDFCB\uD83C\uDFFD\u200D♂️", + [":man_lifting_weights_tone4:"] = "\uD83C\uDFCB\uD83C\uDFFE\u200D♂️", + [":man_lifting_weights_tone5:"] = "\uD83C\uDFCB\uD83C\uDFFF\u200D♂️", + [":man_mage:"] = "\uD83E\uDDD9\u200D♂️", + [":man_mage::skin-tone-1:"] = "\uD83E\uDDD9\uD83C\uDFFB\u200D♂️", + [":man_mage::skin-tone-2:"] = "\uD83E\uDDD9\uD83C\uDFFC\u200D♂️", + [":man_mage::skin-tone-3:"] = "\uD83E\uDDD9\uD83C\uDFFD\u200D♂️", + [":man_mage::skin-tone-4:"] = "\uD83E\uDDD9\uD83C\uDFFE\u200D♂️", + [":man_mage::skin-tone-5:"] = "\uD83E\uDDD9\uD83C\uDFFF\u200D♂️", + [":man_mage_dark_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFF\u200D♂️", + [":man_mage_light_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFB\u200D♂️", + [":man_mage_medium_dark_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFE\u200D♂️", + [":man_mage_medium_light_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFC\u200D♂️", + [":man_mage_medium_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFD\u200D♂️", + [":man_mage_tone1:"] = "\uD83E\uDDD9\uD83C\uDFFB\u200D♂️", + [":man_mage_tone2:"] = "\uD83E\uDDD9\uD83C\uDFFC\u200D♂️", + [":man_mage_tone3:"] = "\uD83E\uDDD9\uD83C\uDFFD\u200D♂️", + [":man_mage_tone4:"] = "\uD83E\uDDD9\uD83C\uDFFE\u200D♂️", + [":man_mage_tone5:"] = "\uD83E\uDDD9\uD83C\uDFFF\u200D♂️", + [":man_mechanic:"] = "\uD83D\uDC68\u200D\uD83D\uDD27", + [":man_mechanic::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDD27", + [":man_mechanic::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDD27", + [":man_mechanic::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDD27", + [":man_mechanic::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDD27", + [":man_mechanic::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDD27", + [":man_mechanic_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDD27", + [":man_mechanic_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDD27", + [":man_mechanic_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDD27", + [":man_mechanic_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDD27", + [":man_mechanic_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDD27", + [":man_mechanic_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDD27", + [":man_mechanic_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDD27", + [":man_mechanic_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDD27", + [":man_mechanic_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDD27", + [":man_mechanic_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDD27", + [":man_mountain_biking:"] = "\uD83D\uDEB5\u200D♂️", + [":man_mountain_biking::skin-tone-1:"] = "\uD83D\uDEB5\uD83C\uDFFB\u200D♂️", + [":man_mountain_biking::skin-tone-2:"] = "\uD83D\uDEB5\uD83C\uDFFC\u200D♂️", + [":man_mountain_biking::skin-tone-3:"] = "\uD83D\uDEB5\uD83C\uDFFD\u200D♂️", + [":man_mountain_biking::skin-tone-4:"] = "\uD83D\uDEB5\uD83C\uDFFE\u200D♂️", + [":man_mountain_biking::skin-tone-5:"] = "\uD83D\uDEB5\uD83C\uDFFF\u200D♂️", + [":man_mountain_biking_dark_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFF\u200D♂️", + [":man_mountain_biking_light_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFB\u200D♂️", + [":man_mountain_biking_medium_dark_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFE\u200D♂️", + [":man_mountain_biking_medium_light_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFC\u200D♂️", + [":man_mountain_biking_medium_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFD\u200D♂️", + [":man_mountain_biking_tone1:"] = "\uD83D\uDEB5\uD83C\uDFFB\u200D♂️", + [":man_mountain_biking_tone2:"] = "\uD83D\uDEB5\uD83C\uDFFC\u200D♂️", + [":man_mountain_biking_tone3:"] = "\uD83D\uDEB5\uD83C\uDFFD\u200D♂️", + [":man_mountain_biking_tone4:"] = "\uD83D\uDEB5\uD83C\uDFFE\u200D♂️", + [":man_mountain_biking_tone5:"] = "\uD83D\uDEB5\uD83C\uDFFF\u200D♂️", + [":man_office_worker:"] = "\uD83D\uDC68\u200D\uD83D\uDCBC", + [":man_office_worker::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDCBC", + [":man_office_worker::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDCBC", + [":man_office_worker::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDCBC", + [":man_office_worker::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDCBC", + [":man_office_worker::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDCBC", + [":man_office_worker_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDCBC", + [":man_office_worker_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDCBC", + [":man_office_worker_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDCBC", + [":man_office_worker_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDCBC", + [":man_office_worker_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDCBC", + [":man_office_worker_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDCBC", + [":man_office_worker_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDCBC", + [":man_office_worker_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDCBC", + [":man_office_worker_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDCBC", + [":man_office_worker_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDCBC", + [":man_pilot:"] = "\uD83D\uDC68\u200D✈️", + [":man_pilot::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D✈️", + [":man_pilot::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D✈️", + [":man_pilot::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D✈️", + [":man_pilot::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D✈️", + [":man_pilot::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D✈️", + [":man_pilot_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D✈️", + [":man_pilot_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D✈️", + [":man_pilot_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D✈️", + [":man_pilot_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D✈️", + [":man_pilot_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D✈️", + [":man_pilot_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D✈️", + [":man_pilot_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D✈️", + [":man_pilot_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D✈️", + [":man_pilot_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D✈️", + [":man_pilot_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D✈️", + [":man_playing_handball:"] = "\uD83E\uDD3E\u200D♂️", + [":man_playing_handball::skin-tone-1:"] = "\uD83E\uDD3E\uD83C\uDFFB\u200D♂️", + [":man_playing_handball::skin-tone-2:"] = "\uD83E\uDD3E\uD83C\uDFFC\u200D♂️", + [":man_playing_handball::skin-tone-3:"] = "\uD83E\uDD3E\uD83C\uDFFD\u200D♂️", + [":man_playing_handball::skin-tone-4:"] = "\uD83E\uDD3E\uD83C\uDFFE\u200D♂️", + [":man_playing_handball::skin-tone-5:"] = "\uD83E\uDD3E\uD83C\uDFFF\u200D♂️", + [":man_playing_handball_dark_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFF\u200D♂️", + [":man_playing_handball_light_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFB\u200D♂️", + [":man_playing_handball_medium_dark_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFE\u200D♂️", + [":man_playing_handball_medium_light_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFC\u200D♂️", + [":man_playing_handball_medium_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFD\u200D♂️", + [":man_playing_handball_tone1:"] = "\uD83E\uDD3E\uD83C\uDFFB\u200D♂️", + [":man_playing_handball_tone2:"] = "\uD83E\uDD3E\uD83C\uDFFC\u200D♂️", + [":man_playing_handball_tone3:"] = "\uD83E\uDD3E\uD83C\uDFFD\u200D♂️", + [":man_playing_handball_tone4:"] = "\uD83E\uDD3E\uD83C\uDFFE\u200D♂️", + [":man_playing_handball_tone5:"] = "\uD83E\uDD3E\uD83C\uDFFF\u200D♂️", + [":man_playing_water_polo:"] = "\uD83E\uDD3D\u200D♂️", + [":man_playing_water_polo::skin-tone-1:"] = "\uD83E\uDD3D\uD83C\uDFFB\u200D♂️", + [":man_playing_water_polo::skin-tone-2:"] = "\uD83E\uDD3D\uD83C\uDFFC\u200D♂️", + [":man_playing_water_polo::skin-tone-3:"] = "\uD83E\uDD3D\uD83C\uDFFD\u200D♂️", + [":man_playing_water_polo::skin-tone-4:"] = "\uD83E\uDD3D\uD83C\uDFFE\u200D♂️", + [":man_playing_water_polo::skin-tone-5:"] = "\uD83E\uDD3D\uD83C\uDFFF\u200D♂️", + [":man_playing_water_polo_dark_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFF\u200D♂️", + [":man_playing_water_polo_light_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFB\u200D♂️", + [":man_playing_water_polo_medium_dark_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFE\u200D♂️", + [":man_playing_water_polo_medium_light_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFC\u200D♂️", + [":man_playing_water_polo_medium_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFD\u200D♂️", + [":man_playing_water_polo_tone1:"] = "\uD83E\uDD3D\uD83C\uDFFB\u200D♂️", + [":man_playing_water_polo_tone2:"] = "\uD83E\uDD3D\uD83C\uDFFC\u200D♂️", + [":man_playing_water_polo_tone3:"] = "\uD83E\uDD3D\uD83C\uDFFD\u200D♂️", + [":man_playing_water_polo_tone4:"] = "\uD83E\uDD3D\uD83C\uDFFE\u200D♂️", + [":man_playing_water_polo_tone5:"] = "\uD83E\uDD3D\uD83C\uDFFF\u200D♂️", + [":man_police_officer:"] = "\uD83D\uDC6E\u200D♂️", + [":man_police_officer::skin-tone-1:"] = "\uD83D\uDC6E\uD83C\uDFFB\u200D♂️", + [":man_police_officer::skin-tone-2:"] = "\uD83D\uDC6E\uD83C\uDFFC\u200D♂️", + [":man_police_officer::skin-tone-3:"] = "\uD83D\uDC6E\uD83C\uDFFD\u200D♂️", + [":man_police_officer::skin-tone-4:"] = "\uD83D\uDC6E\uD83C\uDFFE\u200D♂️", + [":man_police_officer::skin-tone-5:"] = "\uD83D\uDC6E\uD83C\uDFFF\u200D♂️", + [":man_police_officer_dark_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFF\u200D♂️", + [":man_police_officer_light_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFB\u200D♂️", + [":man_police_officer_medium_dark_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFE\u200D♂️", + [":man_police_officer_medium_light_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFC\u200D♂️", + [":man_police_officer_medium_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFD\u200D♂️", + [":man_police_officer_tone1:"] = "\uD83D\uDC6E\uD83C\uDFFB\u200D♂️", + [":man_police_officer_tone2:"] = "\uD83D\uDC6E\uD83C\uDFFC\u200D♂️", + [":man_police_officer_tone3:"] = "\uD83D\uDC6E\uD83C\uDFFD\u200D♂️", + [":man_police_officer_tone4:"] = "\uD83D\uDC6E\uD83C\uDFFE\u200D♂️", + [":man_police_officer_tone5:"] = "\uD83D\uDC6E\uD83C\uDFFF\u200D♂️", + [":man_pouting:"] = "\uD83D\uDE4E\u200D♂️", + [":man_pouting::skin-tone-1:"] = "\uD83D\uDE4E\uD83C\uDFFB\u200D♂️", + [":man_pouting::skin-tone-2:"] = "\uD83D\uDE4E\uD83C\uDFFC\u200D♂️", + [":man_pouting::skin-tone-3:"] = "\uD83D\uDE4E\uD83C\uDFFD\u200D♂️", + [":man_pouting::skin-tone-4:"] = "\uD83D\uDE4E\uD83C\uDFFE\u200D♂️", + [":man_pouting::skin-tone-5:"] = "\uD83D\uDE4E\uD83C\uDFFF\u200D♂️", + [":man_pouting_dark_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFF\u200D♂️", + [":man_pouting_light_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFB\u200D♂️", + [":man_pouting_medium_dark_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFE\u200D♂️", + [":man_pouting_medium_light_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFC\u200D♂️", + [":man_pouting_medium_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFD\u200D♂️", + [":man_pouting_tone1:"] = "\uD83D\uDE4E\uD83C\uDFFB\u200D♂️", + [":man_pouting_tone2:"] = "\uD83D\uDE4E\uD83C\uDFFC\u200D♂️", + [":man_pouting_tone3:"] = "\uD83D\uDE4E\uD83C\uDFFD\u200D♂️", + [":man_pouting_tone4:"] = "\uD83D\uDE4E\uD83C\uDFFE\u200D♂️", + [":man_pouting_tone5:"] = "\uD83D\uDE4E\uD83C\uDFFF\u200D♂️", + [":man_raising_hand:"] = "\uD83D\uDE4B\u200D♂️", + [":man_raising_hand::skin-tone-1:"] = "\uD83D\uDE4B\uD83C\uDFFB\u200D♂️", + [":man_raising_hand::skin-tone-2:"] = "\uD83D\uDE4B\uD83C\uDFFC\u200D♂️", + [":man_raising_hand::skin-tone-3:"] = "\uD83D\uDE4B\uD83C\uDFFD\u200D♂️", + [":man_raising_hand::skin-tone-4:"] = "\uD83D\uDE4B\uD83C\uDFFE\u200D♂️", + [":man_raising_hand::skin-tone-5:"] = "\uD83D\uDE4B\uD83C\uDFFF\u200D♂️", + [":man_raising_hand_dark_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFF\u200D♂️", + [":man_raising_hand_light_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFB\u200D♂️", + [":man_raising_hand_medium_dark_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFE\u200D♂️", + [":man_raising_hand_medium_light_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFC\u200D♂️", + [":man_raising_hand_medium_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFD\u200D♂️", + [":man_raising_hand_tone1:"] = "\uD83D\uDE4B\uD83C\uDFFB\u200D♂️", + [":man_raising_hand_tone2:"] = "\uD83D\uDE4B\uD83C\uDFFC\u200D♂️", + [":man_raising_hand_tone3:"] = "\uD83D\uDE4B\uD83C\uDFFD\u200D♂️", + [":man_raising_hand_tone4:"] = "\uD83D\uDE4B\uD83C\uDFFE\u200D♂️", + [":man_raising_hand_tone5:"] = "\uD83D\uDE4B\uD83C\uDFFF\u200D♂️", + [":man_red_haired:"] = "\uD83D\uDC68\u200D\uD83E\uDDB0", + [":man_red_haired::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB0", + [":man_red_haired::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB0", + [":man_red_haired::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB0", + [":man_red_haired::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB0", + [":man_red_haired::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB0", + [":man_red_haired_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB0", + [":man_red_haired_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB0", + [":man_red_haired_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB0", + [":man_red_haired_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB0", + [":man_red_haired_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB0", + [":man_red_haired_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB0", + [":man_red_haired_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB0", + [":man_red_haired_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB0", + [":man_red_haired_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB0", + [":man_red_haired_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB0", + [":man_rowing_boat:"] = "\uD83D\uDEA3\u200D♂️", + [":man_rowing_boat::skin-tone-1:"] = "\uD83D\uDEA3\uD83C\uDFFB\u200D♂️", + [":man_rowing_boat::skin-tone-2:"] = "\uD83D\uDEA3\uD83C\uDFFC\u200D♂️", + [":man_rowing_boat::skin-tone-3:"] = "\uD83D\uDEA3\uD83C\uDFFD\u200D♂️", + [":man_rowing_boat::skin-tone-4:"] = "\uD83D\uDEA3\uD83C\uDFFE\u200D♂️", + [":man_rowing_boat::skin-tone-5:"] = "\uD83D\uDEA3\uD83C\uDFFF\u200D♂️", + [":man_rowing_boat_dark_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFF\u200D♂️", + [":man_rowing_boat_light_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFB\u200D♂️", + [":man_rowing_boat_medium_dark_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFE\u200D♂️", + [":man_rowing_boat_medium_light_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFC\u200D♂️", + [":man_rowing_boat_medium_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFD\u200D♂️", + [":man_rowing_boat_tone1:"] = "\uD83D\uDEA3\uD83C\uDFFB\u200D♂️", + [":man_rowing_boat_tone2:"] = "\uD83D\uDEA3\uD83C\uDFFC\u200D♂️", + [":man_rowing_boat_tone3:"] = "\uD83D\uDEA3\uD83C\uDFFD\u200D♂️", + [":man_rowing_boat_tone4:"] = "\uD83D\uDEA3\uD83C\uDFFE\u200D♂️", + [":man_rowing_boat_tone5:"] = "\uD83D\uDEA3\uD83C\uDFFF\u200D♂️", + [":man_running:"] = "\uD83C\uDFC3\u200D♂️", + [":man_running::skin-tone-1:"] = "\uD83C\uDFC3\uD83C\uDFFB\u200D♂️", + [":man_running::skin-tone-2:"] = "\uD83C\uDFC3\uD83C\uDFFC\u200D♂️", + [":man_running::skin-tone-3:"] = "\uD83C\uDFC3\uD83C\uDFFD\u200D♂️", + [":man_running::skin-tone-4:"] = "\uD83C\uDFC3\uD83C\uDFFE\u200D♂️", + [":man_running::skin-tone-5:"] = "\uD83C\uDFC3\uD83C\uDFFF\u200D♂️", + [":man_running_dark_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFF\u200D♂️", + [":man_running_light_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFB\u200D♂️", + [":man_running_medium_dark_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFE\u200D♂️", + [":man_running_medium_light_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFC\u200D♂️", + [":man_running_medium_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFD\u200D♂️", + [":man_running_tone1:"] = "\uD83C\uDFC3\uD83C\uDFFB\u200D♂️", + [":man_running_tone2:"] = "\uD83C\uDFC3\uD83C\uDFFC\u200D♂️", + [":man_running_tone3:"] = "\uD83C\uDFC3\uD83C\uDFFD\u200D♂️", + [":man_running_tone4:"] = "\uD83C\uDFC3\uD83C\uDFFE\u200D♂️", + [":man_running_tone5:"] = "\uD83C\uDFC3\uD83C\uDFFF\u200D♂️", + [":man_scientist:"] = "\uD83D\uDC68\u200D\uD83D\uDD2C", + [":man_scientist::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDD2C", + [":man_scientist::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDD2C", + [":man_scientist::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDD2C", + [":man_scientist::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDD2C", + [":man_scientist::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDD2C", + [":man_scientist_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDD2C", + [":man_scientist_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDD2C", + [":man_scientist_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDD2C", + [":man_scientist_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDD2C", + [":man_scientist_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDD2C", + [":man_scientist_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDD2C", + [":man_scientist_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDD2C", + [":man_scientist_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDD2C", + [":man_scientist_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDD2C", + [":man_scientist_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDD2C", + [":man_shrugging:"] = "\uD83E\uDD37\u200D♂️", + [":man_shrugging::skin-tone-1:"] = "\uD83E\uDD37\uD83C\uDFFB\u200D♂️", + [":man_shrugging::skin-tone-2:"] = "\uD83E\uDD37\uD83C\uDFFC\u200D♂️", + [":man_shrugging::skin-tone-3:"] = "\uD83E\uDD37\uD83C\uDFFD\u200D♂️", + [":man_shrugging::skin-tone-4:"] = "\uD83E\uDD37\uD83C\uDFFE\u200D♂️", + [":man_shrugging::skin-tone-5:"] = "\uD83E\uDD37\uD83C\uDFFF\u200D♂️", + [":man_shrugging_dark_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFF\u200D♂️", + [":man_shrugging_light_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFB\u200D♂️", + [":man_shrugging_medium_dark_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFE\u200D♂️", + [":man_shrugging_medium_light_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFC\u200D♂️", + [":man_shrugging_medium_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFD\u200D♂️", + [":man_shrugging_tone1:"] = "\uD83E\uDD37\uD83C\uDFFB\u200D♂️", + [":man_shrugging_tone2:"] = "\uD83E\uDD37\uD83C\uDFFC\u200D♂️", + [":man_shrugging_tone3:"] = "\uD83E\uDD37\uD83C\uDFFD\u200D♂️", + [":man_shrugging_tone4:"] = "\uD83E\uDD37\uD83C\uDFFE\u200D♂️", + [":man_shrugging_tone5:"] = "\uD83E\uDD37\uD83C\uDFFF\u200D♂️", + [":man_singer:"] = "\uD83D\uDC68\u200D\uD83C\uDFA4", + [":man_singer::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFA4", + [":man_singer::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFA4", + [":man_singer::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFA4", + [":man_singer::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFA4", + [":man_singer::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFA4", + [":man_singer_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFA4", + [":man_singer_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFA4", + [":man_singer_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFA4", + [":man_singer_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFA4", + [":man_singer_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFA4", + [":man_singer_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFA4", + [":man_singer_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFA4", + [":man_singer_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFA4", + [":man_singer_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFA4", + [":man_singer_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFA4", + [":man_standing:"] = "\uD83E\uDDCD\u200D♂️", + [":man_standing::skin-tone-1:"] = "\uD83E\uDDCD\uD83C\uDFFB\u200D♂️", + [":man_standing::skin-tone-2:"] = "\uD83E\uDDCD\uD83C\uDFFC\u200D♂️", + [":man_standing::skin-tone-3:"] = "\uD83E\uDDCD\uD83C\uDFFD\u200D♂️", + [":man_standing::skin-tone-4:"] = "\uD83E\uDDCD\uD83C\uDFFE\u200D♂️", + [":man_standing::skin-tone-5:"] = "\uD83E\uDDCD\uD83C\uDFFF\u200D♂️", + [":man_standing_dark_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFF\u200D♂️", + [":man_standing_light_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFB\u200D♂️", + [":man_standing_medium_dark_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFE\u200D♂️", + [":man_standing_medium_light_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFC\u200D♂️", + [":man_standing_medium_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFD\u200D♂️", + [":man_standing_tone1:"] = "\uD83E\uDDCD\uD83C\uDFFB\u200D♂️", + [":man_standing_tone2:"] = "\uD83E\uDDCD\uD83C\uDFFC\u200D♂️", + [":man_standing_tone3:"] = "\uD83E\uDDCD\uD83C\uDFFD\u200D♂️", + [":man_standing_tone4:"] = "\uD83E\uDDCD\uD83C\uDFFE\u200D♂️", + [":man_standing_tone5:"] = "\uD83E\uDDCD\uD83C\uDFFF\u200D♂️", + [":man_student:"] = "\uD83D\uDC68\u200D\uD83C\uDF93", + [":man_student::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF93", + [":man_student::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF93", + [":man_student::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF93", + [":man_student::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF93", + [":man_student::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF93", + [":man_student_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF93", + [":man_student_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF93", + [":man_student_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF93", + [":man_student_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF93", + [":man_student_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF93", + [":man_student_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDF93", + [":man_student_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDF93", + [":man_student_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDF93", + [":man_student_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDF93", + [":man_student_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDF93", + [":man_superhero:"] = "\uD83E\uDDB8\u200D♂️", + [":man_superhero::skin-tone-1:"] = "\uD83E\uDDB8\uD83C\uDFFB\u200D♂️", + [":man_superhero::skin-tone-2:"] = "\uD83E\uDDB8\uD83C\uDFFC\u200D♂️", + [":man_superhero::skin-tone-3:"] = "\uD83E\uDDB8\uD83C\uDFFD\u200D♂️", + [":man_superhero::skin-tone-4:"] = "\uD83E\uDDB8\uD83C\uDFFE\u200D♂️", + [":man_superhero::skin-tone-5:"] = "\uD83E\uDDB8\uD83C\uDFFF\u200D♂️", + [":man_superhero_dark_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFF\u200D♂️", + [":man_superhero_light_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFB\u200D♂️", + [":man_superhero_medium_dark_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFE\u200D♂️", + [":man_superhero_medium_light_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFC\u200D♂️", + [":man_superhero_medium_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFD\u200D♂️", + [":man_superhero_tone1:"] = "\uD83E\uDDB8\uD83C\uDFFB\u200D♂️", + [":man_superhero_tone2:"] = "\uD83E\uDDB8\uD83C\uDFFC\u200D♂️", + [":man_superhero_tone3:"] = "\uD83E\uDDB8\uD83C\uDFFD\u200D♂️", + [":man_superhero_tone4:"] = "\uD83E\uDDB8\uD83C\uDFFE\u200D♂️", + [":man_superhero_tone5:"] = "\uD83E\uDDB8\uD83C\uDFFF\u200D♂️", + [":man_supervillain:"] = "\uD83E\uDDB9\u200D♂️", + [":man_supervillain::skin-tone-1:"] = "\uD83E\uDDB9\uD83C\uDFFB\u200D♂️", + [":man_supervillain::skin-tone-2:"] = "\uD83E\uDDB9\uD83C\uDFFC\u200D♂️", + [":man_supervillain::skin-tone-3:"] = "\uD83E\uDDB9\uD83C\uDFFD\u200D♂️", + [":man_supervillain::skin-tone-4:"] = "\uD83E\uDDB9\uD83C\uDFFE\u200D♂️", + [":man_supervillain::skin-tone-5:"] = "\uD83E\uDDB9\uD83C\uDFFF\u200D♂️", + [":man_supervillain_dark_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFF\u200D♂️", + [":man_supervillain_light_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFB\u200D♂️", + [":man_supervillain_medium_dark_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFE\u200D♂️", + [":man_supervillain_medium_light_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFC\u200D♂️", + [":man_supervillain_medium_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFD\u200D♂️", + [":man_supervillain_tone1:"] = "\uD83E\uDDB9\uD83C\uDFFB\u200D♂️", + [":man_supervillain_tone2:"] = "\uD83E\uDDB9\uD83C\uDFFC\u200D♂️", + [":man_supervillain_tone3:"] = "\uD83E\uDDB9\uD83C\uDFFD\u200D♂️", + [":man_supervillain_tone4:"] = "\uD83E\uDDB9\uD83C\uDFFE\u200D♂️", + [":man_supervillain_tone5:"] = "\uD83E\uDDB9\uD83C\uDFFF\u200D♂️", + [":man_surfing:"] = "\uD83C\uDFC4\u200D♂️", + [":man_surfing::skin-tone-1:"] = "\uD83C\uDFC4\uD83C\uDFFB\u200D♂️", + [":man_surfing::skin-tone-2:"] = "\uD83C\uDFC4\uD83C\uDFFC\u200D♂️", + [":man_surfing::skin-tone-3:"] = "\uD83C\uDFC4\uD83C\uDFFD\u200D♂️", + [":man_surfing::skin-tone-4:"] = "\uD83C\uDFC4\uD83C\uDFFE\u200D♂️", + [":man_surfing::skin-tone-5:"] = "\uD83C\uDFC4\uD83C\uDFFF\u200D♂️", + [":man_surfing_dark_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFF\u200D♂️", + [":man_surfing_light_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFB\u200D♂️", + [":man_surfing_medium_dark_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFE\u200D♂️", + [":man_surfing_medium_light_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFC\u200D♂️", + [":man_surfing_medium_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFD\u200D♂️", + [":man_surfing_tone1:"] = "\uD83C\uDFC4\uD83C\uDFFB\u200D♂️", + [":man_surfing_tone2:"] = "\uD83C\uDFC4\uD83C\uDFFC\u200D♂️", + [":man_surfing_tone3:"] = "\uD83C\uDFC4\uD83C\uDFFD\u200D♂️", + [":man_surfing_tone4:"] = "\uD83C\uDFC4\uD83C\uDFFE\u200D♂️", + [":man_surfing_tone5:"] = "\uD83C\uDFC4\uD83C\uDFFF\u200D♂️", + [":man_swimming:"] = "\uD83C\uDFCA\u200D♂️", + [":man_swimming::skin-tone-1:"] = "\uD83C\uDFCA\uD83C\uDFFB\u200D♂️", + [":man_swimming::skin-tone-2:"] = "\uD83C\uDFCA\uD83C\uDFFC\u200D♂️", + [":man_swimming::skin-tone-3:"] = "\uD83C\uDFCA\uD83C\uDFFD\u200D♂️", + [":man_swimming::skin-tone-4:"] = "\uD83C\uDFCA\uD83C\uDFFE\u200D♂️", + [":man_swimming::skin-tone-5:"] = "\uD83C\uDFCA\uD83C\uDFFF\u200D♂️", + [":man_swimming_dark_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFF\u200D♂️", + [":man_swimming_light_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFB\u200D♂️", + [":man_swimming_medium_dark_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFE\u200D♂️", + [":man_swimming_medium_light_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFC\u200D♂️", + [":man_swimming_medium_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFD\u200D♂️", + [":man_swimming_tone1:"] = "\uD83C\uDFCA\uD83C\uDFFB\u200D♂️", + [":man_swimming_tone2:"] = "\uD83C\uDFCA\uD83C\uDFFC\u200D♂️", + [":man_swimming_tone3:"] = "\uD83C\uDFCA\uD83C\uDFFD\u200D♂️", + [":man_swimming_tone4:"] = "\uD83C\uDFCA\uD83C\uDFFE\u200D♂️", + [":man_swimming_tone5:"] = "\uD83C\uDFCA\uD83C\uDFFF\u200D♂️", + [":man_teacher:"] = "\uD83D\uDC68\u200D\uD83C\uDFEB", + [":man_teacher::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFEB", + [":man_teacher::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFEB", + [":man_teacher::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFEB", + [":man_teacher::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFEB", + [":man_teacher::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFEB", + [":man_teacher_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFEB", + [":man_teacher_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFEB", + [":man_teacher_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFEB", + [":man_teacher_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFEB", + [":man_teacher_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFEB", + [":man_teacher_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83C\uDFEB", + [":man_teacher_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83C\uDFEB", + [":man_teacher_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83C\uDFEB", + [":man_teacher_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83C\uDFEB", + [":man_teacher_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83C\uDFEB", + [":man_technologist:"] = "\uD83D\uDC68\u200D\uD83D\uDCBB", + [":man_technologist::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDCBB", + [":man_technologist::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDCBB", + [":man_technologist::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDCBB", + [":man_technologist::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDCBB", + [":man_technologist::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDCBB", + [":man_technologist_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDCBB", + [":man_technologist_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDCBB", + [":man_technologist_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDCBB", + [":man_technologist_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDCBB", + [":man_technologist_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDCBB", + [":man_technologist_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83D\uDCBB", + [":man_technologist_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDCBB", + [":man_technologist_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83D\uDCBB", + [":man_technologist_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83D\uDCBB", + [":man_technologist_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83D\uDCBB", + [":man_tipping_hand:"] = "\uD83D\uDC81\u200D♂️", + [":man_tipping_hand::skin-tone-1:"] = "\uD83D\uDC81\uD83C\uDFFB\u200D♂️", + [":man_tipping_hand::skin-tone-2:"] = "\uD83D\uDC81\uD83C\uDFFC\u200D♂️", + [":man_tipping_hand::skin-tone-3:"] = "\uD83D\uDC81\uD83C\uDFFD\u200D♂️", + [":man_tipping_hand::skin-tone-4:"] = "\uD83D\uDC81\uD83C\uDFFE\u200D♂️", + [":man_tipping_hand::skin-tone-5:"] = "\uD83D\uDC81\uD83C\uDFFF\u200D♂️", + [":man_tipping_hand_dark_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFF\u200D♂️", + [":man_tipping_hand_light_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFB\u200D♂️", + [":man_tipping_hand_medium_dark_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFE\u200D♂️", + [":man_tipping_hand_medium_light_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFC\u200D♂️", + [":man_tipping_hand_medium_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFD\u200D♂️", + [":man_tipping_hand_tone1:"] = "\uD83D\uDC81\uD83C\uDFFB\u200D♂️", + [":man_tipping_hand_tone2:"] = "\uD83D\uDC81\uD83C\uDFFC\u200D♂️", + [":man_tipping_hand_tone3:"] = "\uD83D\uDC81\uD83C\uDFFD\u200D♂️", + [":man_tipping_hand_tone4:"] = "\uD83D\uDC81\uD83C\uDFFE\u200D♂️", + [":man_tipping_hand_tone5:"] = "\uD83D\uDC81\uD83C\uDFFF\u200D♂️", + [":man_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB", + [":man_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC", + [":man_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD", + [":man_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE", + [":man_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF", + [":man_vampire:"] = "\uD83E\uDDDB\u200D♂️", + [":man_vampire::skin-tone-1:"] = "\uD83E\uDDDB\uD83C\uDFFB\u200D♂️", + [":man_vampire::skin-tone-2:"] = "\uD83E\uDDDB\uD83C\uDFFC\u200D♂️", + [":man_vampire::skin-tone-3:"] = "\uD83E\uDDDB\uD83C\uDFFD\u200D♂️", + [":man_vampire::skin-tone-4:"] = "\uD83E\uDDDB\uD83C\uDFFE\u200D♂️", + [":man_vampire::skin-tone-5:"] = "\uD83E\uDDDB\uD83C\uDFFF\u200D♂️", + [":man_vampire_dark_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFF\u200D♂️", + [":man_vampire_light_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFB\u200D♂️", + [":man_vampire_medium_dark_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFE\u200D♂️", + [":man_vampire_medium_light_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFC\u200D♂️", + [":man_vampire_medium_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFD\u200D♂️", + [":man_vampire_tone1:"] = "\uD83E\uDDDB\uD83C\uDFFB\u200D♂️", + [":man_vampire_tone2:"] = "\uD83E\uDDDB\uD83C\uDFFC\u200D♂️", + [":man_vampire_tone3:"] = "\uD83E\uDDDB\uD83C\uDFFD\u200D♂️", + [":man_vampire_tone4:"] = "\uD83E\uDDDB\uD83C\uDFFE\u200D♂️", + [":man_vampire_tone5:"] = "\uD83E\uDDDB\uD83C\uDFFF\u200D♂️", + [":man_walking:"] = "\uD83D\uDEB6\u200D♂️", + [":man_walking::skin-tone-1:"] = "\uD83D\uDEB6\uD83C\uDFFB\u200D♂️", + [":man_walking::skin-tone-2:"] = "\uD83D\uDEB6\uD83C\uDFFC\u200D♂️", + [":man_walking::skin-tone-3:"] = "\uD83D\uDEB6\uD83C\uDFFD\u200D♂️", + [":man_walking::skin-tone-4:"] = "\uD83D\uDEB6\uD83C\uDFFE\u200D♂️", + [":man_walking::skin-tone-5:"] = "\uD83D\uDEB6\uD83C\uDFFF\u200D♂️", + [":man_walking_dark_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFF\u200D♂️", + [":man_walking_light_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFB\u200D♂️", + [":man_walking_medium_dark_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFE\u200D♂️", + [":man_walking_medium_light_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFC\u200D♂️", + [":man_walking_medium_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFD\u200D♂️", + [":man_walking_tone1:"] = "\uD83D\uDEB6\uD83C\uDFFB\u200D♂️", + [":man_walking_tone2:"] = "\uD83D\uDEB6\uD83C\uDFFC\u200D♂️", + [":man_walking_tone3:"] = "\uD83D\uDEB6\uD83C\uDFFD\u200D♂️", + [":man_walking_tone4:"] = "\uD83D\uDEB6\uD83C\uDFFE\u200D♂️", + [":man_walking_tone5:"] = "\uD83D\uDEB6\uD83C\uDFFF\u200D♂️", + [":man_wearing_turban:"] = "\uD83D\uDC73\u200D♂️", + [":man_wearing_turban::skin-tone-1:"] = "\uD83D\uDC73\uD83C\uDFFB\u200D♂️", + [":man_wearing_turban::skin-tone-2:"] = "\uD83D\uDC73\uD83C\uDFFC\u200D♂️", + [":man_wearing_turban::skin-tone-3:"] = "\uD83D\uDC73\uD83C\uDFFD\u200D♂️", + [":man_wearing_turban::skin-tone-4:"] = "\uD83D\uDC73\uD83C\uDFFE\u200D♂️", + [":man_wearing_turban::skin-tone-5:"] = "\uD83D\uDC73\uD83C\uDFFF\u200D♂️", + [":man_wearing_turban_dark_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFF\u200D♂️", + [":man_wearing_turban_light_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFB\u200D♂️", + [":man_wearing_turban_medium_dark_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFE\u200D♂️", + [":man_wearing_turban_medium_light_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFC\u200D♂️", + [":man_wearing_turban_medium_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFD\u200D♂️", + [":man_wearing_turban_tone1:"] = "\uD83D\uDC73\uD83C\uDFFB\u200D♂️", + [":man_wearing_turban_tone2:"] = "\uD83D\uDC73\uD83C\uDFFC\u200D♂️", + [":man_wearing_turban_tone3:"] = "\uD83D\uDC73\uD83C\uDFFD\u200D♂️", + [":man_wearing_turban_tone4:"] = "\uD83D\uDC73\uD83C\uDFFE\u200D♂️", + [":man_wearing_turban_tone5:"] = "\uD83D\uDC73\uD83C\uDFFF\u200D♂️", + [":man_white_haired:"] = "\uD83D\uDC68\u200D\uD83E\uDDB3", + [":man_white_haired::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB3", + [":man_white_haired::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB3", + [":man_white_haired::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB3", + [":man_white_haired::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB3", + [":man_white_haired::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB3", + [":man_white_haired_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB3", + [":man_white_haired_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB3", + [":man_white_haired_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB3", + [":man_white_haired_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB3", + [":man_white_haired_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB3", + [":man_white_haired_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDB3", + [":man_white_haired_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDB3", + [":man_white_haired_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDB3", + [":man_white_haired_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDB3", + [":man_white_haired_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDB3", + [":man_with_chinese_cap:"] = "\uD83D\uDC72", + [":man_with_chinese_cap::skin-tone-1:"] = "\uD83D\uDC72\uD83C\uDFFB", + [":man_with_chinese_cap::skin-tone-2:"] = "\uD83D\uDC72\uD83C\uDFFC", + [":man_with_chinese_cap::skin-tone-3:"] = "\uD83D\uDC72\uD83C\uDFFD", + [":man_with_chinese_cap::skin-tone-4:"] = "\uD83D\uDC72\uD83C\uDFFE", + [":man_with_chinese_cap::skin-tone-5:"] = "\uD83D\uDC72\uD83C\uDFFF", + [":man_with_chinese_cap_tone1:"] = "\uD83D\uDC72\uD83C\uDFFB", + [":man_with_chinese_cap_tone2:"] = "\uD83D\uDC72\uD83C\uDFFC", + [":man_with_chinese_cap_tone3:"] = "\uD83D\uDC72\uD83C\uDFFD", + [":man_with_chinese_cap_tone4:"] = "\uD83D\uDC72\uD83C\uDFFE", + [":man_with_chinese_cap_tone5:"] = "\uD83D\uDC72\uD83C\uDFFF", + [":man_with_gua_pi_mao:"] = "\uD83D\uDC72", + [":man_with_gua_pi_mao::skin-tone-1:"] = "\uD83D\uDC72\uD83C\uDFFB", + [":man_with_gua_pi_mao::skin-tone-2:"] = "\uD83D\uDC72\uD83C\uDFFC", + [":man_with_gua_pi_mao::skin-tone-3:"] = "\uD83D\uDC72\uD83C\uDFFD", + [":man_with_gua_pi_mao::skin-tone-4:"] = "\uD83D\uDC72\uD83C\uDFFE", + [":man_with_gua_pi_mao::skin-tone-5:"] = "\uD83D\uDC72\uD83C\uDFFF", + [":man_with_gua_pi_mao_tone1:"] = "\uD83D\uDC72\uD83C\uDFFB", + [":man_with_gua_pi_mao_tone2:"] = "\uD83D\uDC72\uD83C\uDFFC", + [":man_with_gua_pi_mao_tone3:"] = "\uD83D\uDC72\uD83C\uDFFD", + [":man_with_gua_pi_mao_tone4:"] = "\uD83D\uDC72\uD83C\uDFFE", + [":man_with_gua_pi_mao_tone5:"] = "\uD83D\uDC72\uD83C\uDFFF", + [":man_with_probing_cane:"] = "\uD83D\uDC68\u200D\uD83E\uDDAF", + [":man_with_probing_cane::skin-tone-1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDAF", + [":man_with_probing_cane::skin-tone-2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDAF", + [":man_with_probing_cane::skin-tone-3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDAF", + [":man_with_probing_cane::skin-tone-4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDAF", + [":man_with_probing_cane::skin-tone-5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDAF", + [":man_with_probing_cane_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDAF", + [":man_with_probing_cane_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDAF", + [":man_with_probing_cane_medium_dark_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDAF", + [":man_with_probing_cane_medium_light_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDAF", + [":man_with_probing_cane_medium_skin_tone:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDAF", + [":man_with_probing_cane_tone1:"] = "\uD83D\uDC68\uD83C\uDFFB\u200D\uD83E\uDDAF", + [":man_with_probing_cane_tone2:"] = "\uD83D\uDC68\uD83C\uDFFC\u200D\uD83E\uDDAF", + [":man_with_probing_cane_tone3:"] = "\uD83D\uDC68\uD83C\uDFFD\u200D\uD83E\uDDAF", + [":man_with_probing_cane_tone4:"] = "\uD83D\uDC68\uD83C\uDFFE\u200D\uD83E\uDDAF", + [":man_with_probing_cane_tone5:"] = "\uD83D\uDC68\uD83C\uDFFF\u200D\uD83E\uDDAF", + [":man_with_turban:"] = "\uD83D\uDC73", + [":man_with_turban::skin-tone-1:"] = "\uD83D\uDC73\uD83C\uDFFB", + [":man_with_turban::skin-tone-2:"] = "\uD83D\uDC73\uD83C\uDFFC", + [":man_with_turban::skin-tone-3:"] = "\uD83D\uDC73\uD83C\uDFFD", + [":man_with_turban::skin-tone-4:"] = "\uD83D\uDC73\uD83C\uDFFE", + [":man_with_turban::skin-tone-5:"] = "\uD83D\uDC73\uD83C\uDFFF", + [":man_with_turban_tone1:"] = "\uD83D\uDC73\uD83C\uDFFB", + [":man_with_turban_tone2:"] = "\uD83D\uDC73\uD83C\uDFFC", + [":man_with_turban_tone3:"] = "\uD83D\uDC73\uD83C\uDFFD", + [":man_with_turban_tone4:"] = "\uD83D\uDC73\uD83C\uDFFE", + [":man_with_turban_tone5:"] = "\uD83D\uDC73\uD83C\uDFFF", + [":man_zombie:"] = "\uD83E\uDDDF\u200D♂️", + [":mango:"] = "\uD83E\uDD6D", + [":mans_shoe:"] = "\uD83D\uDC5E", + [":mantlepiece_clock:"] = "\uD83D\uDD70️", + [":manual_wheelchair:"] = "\uD83E\uDDBD", + [":map:"] = "\uD83D\uDDFA️", + [":maple_leaf:"] = "\uD83C\uDF41", + [":martial_arts_uniform:"] = "\uD83E\uDD4B", + [":mask:"] = "\uD83D\uDE37", + [":massage:"] = "\uD83D\uDC86", + [":massage::skin-tone-1:"] = "\uD83D\uDC86\uD83C\uDFFB", + [":massage::skin-tone-2:"] = "\uD83D\uDC86\uD83C\uDFFC", + [":massage::skin-tone-3:"] = "\uD83D\uDC86\uD83C\uDFFD", + [":massage::skin-tone-4:"] = "\uD83D\uDC86\uD83C\uDFFE", + [":massage::skin-tone-5:"] = "\uD83D\uDC86\uD83C\uDFFF", + [":massage_tone1:"] = "\uD83D\uDC86\uD83C\uDFFB", + [":massage_tone2:"] = "\uD83D\uDC86\uD83C\uDFFC", + [":massage_tone3:"] = "\uD83D\uDC86\uD83C\uDFFD", + [":massage_tone4:"] = "\uD83D\uDC86\uD83C\uDFFE", + [":massage_tone5:"] = "\uD83D\uDC86\uD83C\uDFFF", + [":mate:"] = "\uD83E\uDDC9", + [":meat_on_bone:"] = "\uD83C\uDF56", + [":mechanical_arm:"] = "\uD83E\uDDBE", + [":mechanical_leg:"] = "\uD83E\uDDBF", + [":medal:"] = "\uD83C\uDFC5", + [":medical_symbol:"] = "⚕️", + [":mega:"] = "\uD83D\uDCE3", + [":melon:"] = "\uD83C\uDF48", + [":memo:"] = "\uD83D\uDCDD", + [":men_with_bunny_ears_partying:"] = "\uD83D\uDC6F\u200D♂️", + [":men_wrestling:"] = "\uD83E\uDD3C\u200D♂️", + [":menorah:"] = "\uD83D\uDD4E", + [":mens:"] = "\uD83D\uDEB9", + [":mermaid:"] = "\uD83E\uDDDC\u200D♀️", + [":mermaid::skin-tone-1:"] = "\uD83E\uDDDC\uD83C\uDFFB\u200D♀️", + [":mermaid::skin-tone-2:"] = "\uD83E\uDDDC\uD83C\uDFFC\u200D♀️", + [":mermaid::skin-tone-3:"] = "\uD83E\uDDDC\uD83C\uDFFD\u200D♀️", + [":mermaid::skin-tone-4:"] = "\uD83E\uDDDC\uD83C\uDFFE\u200D♀️", + [":mermaid::skin-tone-5:"] = "\uD83E\uDDDC\uD83C\uDFFF\u200D♀️", + [":mermaid_dark_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFF\u200D♀️", + [":mermaid_light_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFB\u200D♀️", + [":mermaid_medium_dark_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFE\u200D♀️", + [":mermaid_medium_light_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFC\u200D♀️", + [":mermaid_medium_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFD\u200D♀️", + [":mermaid_tone1:"] = "\uD83E\uDDDC\uD83C\uDFFB\u200D♀️", + [":mermaid_tone2:"] = "\uD83E\uDDDC\uD83C\uDFFC\u200D♀️", + [":mermaid_tone3:"] = "\uD83E\uDDDC\uD83C\uDFFD\u200D♀️", + [":mermaid_tone4:"] = "\uD83E\uDDDC\uD83C\uDFFE\u200D♀️", + [":mermaid_tone5:"] = "\uD83E\uDDDC\uD83C\uDFFF\u200D♀️", + [":merman:"] = "\uD83E\uDDDC\u200D♂️", + [":merman::skin-tone-1:"] = "\uD83E\uDDDC\uD83C\uDFFB\u200D♂️", + [":merman::skin-tone-2:"] = "\uD83E\uDDDC\uD83C\uDFFC\u200D♂️", + [":merman::skin-tone-3:"] = "\uD83E\uDDDC\uD83C\uDFFD\u200D♂️", + [":merman::skin-tone-4:"] = "\uD83E\uDDDC\uD83C\uDFFE\u200D♂️", + [":merman::skin-tone-5:"] = "\uD83E\uDDDC\uD83C\uDFFF\u200D♂️", + [":merman_dark_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFF\u200D♂️", + [":merman_light_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFB\u200D♂️", + [":merman_medium_dark_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFE\u200D♂️", + [":merman_medium_light_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFC\u200D♂️", + [":merman_medium_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFD\u200D♂️", + [":merman_tone1:"] = "\uD83E\uDDDC\uD83C\uDFFB\u200D♂️", + [":merman_tone2:"] = "\uD83E\uDDDC\uD83C\uDFFC\u200D♂️", + [":merman_tone3:"] = "\uD83E\uDDDC\uD83C\uDFFD\u200D♂️", + [":merman_tone4:"] = "\uD83E\uDDDC\uD83C\uDFFE\u200D♂️", + [":merman_tone5:"] = "\uD83E\uDDDC\uD83C\uDFFF\u200D♂️", + [":merperson:"] = "\uD83E\uDDDC", + [":merperson::skin-tone-1:"] = "\uD83E\uDDDC\uD83C\uDFFB", + [":merperson::skin-tone-2:"] = "\uD83E\uDDDC\uD83C\uDFFC", + [":merperson::skin-tone-3:"] = "\uD83E\uDDDC\uD83C\uDFFD", + [":merperson::skin-tone-4:"] = "\uD83E\uDDDC\uD83C\uDFFE", + [":merperson::skin-tone-5:"] = "\uD83E\uDDDC\uD83C\uDFFF", + [":merperson_dark_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFF", + [":merperson_light_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFB", + [":merperson_medium_dark_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFE", + [":merperson_medium_light_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFC", + [":merperson_medium_skin_tone:"] = "\uD83E\uDDDC\uD83C\uDFFD", + [":merperson_tone1:"] = "\uD83E\uDDDC\uD83C\uDFFB", + [":merperson_tone2:"] = "\uD83E\uDDDC\uD83C\uDFFC", + [":merperson_tone3:"] = "\uD83E\uDDDC\uD83C\uDFFD", + [":merperson_tone4:"] = "\uD83E\uDDDC\uD83C\uDFFE", + [":merperson_tone5:"] = "\uD83E\uDDDC\uD83C\uDFFF", + [":metal:"] = "\uD83E\uDD18", + [":metal::skin-tone-1:"] = "\uD83E\uDD18\uD83C\uDFFB", + [":metal::skin-tone-2:"] = "\uD83E\uDD18\uD83C\uDFFC", + [":metal::skin-tone-3:"] = "\uD83E\uDD18\uD83C\uDFFD", + [":metal::skin-tone-4:"] = "\uD83E\uDD18\uD83C\uDFFE", + [":metal::skin-tone-5:"] = "\uD83E\uDD18\uD83C\uDFFF", + [":metal_tone1:"] = "\uD83E\uDD18\uD83C\uDFFB", + [":metal_tone2:"] = "\uD83E\uDD18\uD83C\uDFFC", + [":metal_tone3:"] = "\uD83E\uDD18\uD83C\uDFFD", + [":metal_tone4:"] = "\uD83E\uDD18\uD83C\uDFFE", + [":metal_tone5:"] = "\uD83E\uDD18\uD83C\uDFFF", + [":metro:"] = "\uD83D\uDE87", + [":microbe:"] = "\uD83E\uDDA0", + [":microphone2:"] = "\uD83C\uDF99️", + [":microphone:"] = "\uD83C\uDFA4", + [":microscope:"] = "\uD83D\uDD2C", + [":middle_finger:"] = "\uD83D\uDD95", + [":middle_finger::skin-tone-1:"] = "\uD83D\uDD95\uD83C\uDFFB", + [":middle_finger::skin-tone-2:"] = "\uD83D\uDD95\uD83C\uDFFC", + [":middle_finger::skin-tone-3:"] = "\uD83D\uDD95\uD83C\uDFFD", + [":middle_finger::skin-tone-4:"] = "\uD83D\uDD95\uD83C\uDFFE", + [":middle_finger::skin-tone-5:"] = "\uD83D\uDD95\uD83C\uDFFF", + [":middle_finger_tone1:"] = "\uD83D\uDD95\uD83C\uDFFB", + [":middle_finger_tone2:"] = "\uD83D\uDD95\uD83C\uDFFC", + [":middle_finger_tone3:"] = "\uD83D\uDD95\uD83C\uDFFD", + [":middle_finger_tone4:"] = "\uD83D\uDD95\uD83C\uDFFE", + [":middle_finger_tone5:"] = "\uD83D\uDD95\uD83C\uDFFF", + [":military_medal:"] = "\uD83C\uDF96️", + [":milk:"] = "\uD83E\uDD5B", + [":milky_way:"] = "\uD83C\uDF0C", + [":minibus:"] = "\uD83D\uDE90", + [":minidisc:"] = "\uD83D\uDCBD", + [":mobile_phone_off:"] = "\uD83D\uDCF4", + [":money_mouth:"] = "\uD83E\uDD11", + [":money_mouth_face:"] = "\uD83E\uDD11", + [":money_with_wings:"] = "\uD83D\uDCB8", + [":moneybag:"] = "\uD83D\uDCB0", + [":monkey:"] = "\uD83D\uDC12", + [":monkey_face:"] = "\uD83D\uDC35", + [":monorail:"] = "\uD83D\uDE9D", + [":moon_cake:"] = "\uD83E\uDD6E", + [":mortar_board:"] = "\uD83C\uDF93", + [":mosque:"] = "\uD83D\uDD4C", + [":mosquito:"] = "\uD83E\uDD9F", + [":mother_christmas:"] = "\uD83E\uDD36", + [":mother_christmas::skin-tone-1:"] = "\uD83E\uDD36\uD83C\uDFFB", + [":mother_christmas::skin-tone-2:"] = "\uD83E\uDD36\uD83C\uDFFC", + [":mother_christmas::skin-tone-3:"] = "\uD83E\uDD36\uD83C\uDFFD", + [":mother_christmas::skin-tone-4:"] = "\uD83E\uDD36\uD83C\uDFFE", + [":mother_christmas::skin-tone-5:"] = "\uD83E\uDD36\uD83C\uDFFF", + [":mother_christmas_tone1:"] = "\uD83E\uDD36\uD83C\uDFFB", + [":mother_christmas_tone2:"] = "\uD83E\uDD36\uD83C\uDFFC", + [":mother_christmas_tone3:"] = "\uD83E\uDD36\uD83C\uDFFD", + [":mother_christmas_tone4:"] = "\uD83E\uDD36\uD83C\uDFFE", + [":mother_christmas_tone5:"] = "\uD83E\uDD36\uD83C\uDFFF", + [":motor_scooter:"] = "\uD83D\uDEF5", + [":motorbike:"] = "\uD83D\uDEF5", + [":motorboat:"] = "\uD83D\uDEE5️", + [":motorcycle:"] = "\uD83C\uDFCD️", + [":motorized_wheelchair:"] = "\uD83E\uDDBC", + [":motorway:"] = "\uD83D\uDEE3️", + [":mount_fuji:"] = "\uD83D\uDDFB", + [":mountain:"] = "⛰️", + [":mountain_bicyclist:"] = "\uD83D\uDEB5", + [":mountain_bicyclist::skin-tone-1:"] = "\uD83D\uDEB5\uD83C\uDFFB", + [":mountain_bicyclist::skin-tone-2:"] = "\uD83D\uDEB5\uD83C\uDFFC", + [":mountain_bicyclist::skin-tone-3:"] = "\uD83D\uDEB5\uD83C\uDFFD", + [":mountain_bicyclist::skin-tone-4:"] = "\uD83D\uDEB5\uD83C\uDFFE", + [":mountain_bicyclist::skin-tone-5:"] = "\uD83D\uDEB5\uD83C\uDFFF", + [":mountain_bicyclist_tone1:"] = "\uD83D\uDEB5\uD83C\uDFFB", + [":mountain_bicyclist_tone2:"] = "\uD83D\uDEB5\uD83C\uDFFC", + [":mountain_bicyclist_tone3:"] = "\uD83D\uDEB5\uD83C\uDFFD", + [":mountain_bicyclist_tone4:"] = "\uD83D\uDEB5\uD83C\uDFFE", + [":mountain_bicyclist_tone5:"] = "\uD83D\uDEB5\uD83C\uDFFF", + [":mountain_cableway:"] = "\uD83D\uDEA0", + [":mountain_railway:"] = "\uD83D\uDE9E", + [":mountain_snow:"] = "\uD83C\uDFD4️", + [":mouse2:"] = "\uD83D\uDC01", + [":mouse:"] = "\uD83D\uDC2D", + [":mouse_three_button:"] = "\uD83D\uDDB1️", + [":movie_camera:"] = "\uD83C\uDFA5", + [":moyai:"] = "\uD83D\uDDFF", + [":mrs_claus:"] = "\uD83E\uDD36", + [":mrs_claus::skin-tone-1:"] = "\uD83E\uDD36\uD83C\uDFFB", + [":mrs_claus::skin-tone-2:"] = "\uD83E\uDD36\uD83C\uDFFC", + [":mrs_claus::skin-tone-3:"] = "\uD83E\uDD36\uD83C\uDFFD", + [":mrs_claus::skin-tone-4:"] = "\uD83E\uDD36\uD83C\uDFFE", + [":mrs_claus::skin-tone-5:"] = "\uD83E\uDD36\uD83C\uDFFF", + [":mrs_claus_tone1:"] = "\uD83E\uDD36\uD83C\uDFFB", + [":mrs_claus_tone2:"] = "\uD83E\uDD36\uD83C\uDFFC", + [":mrs_claus_tone3:"] = "\uD83E\uDD36\uD83C\uDFFD", + [":mrs_claus_tone4:"] = "\uD83E\uDD36\uD83C\uDFFE", + [":mrs_claus_tone5:"] = "\uD83E\uDD36\uD83C\uDFFF", + [":muscle:"] = "\uD83D\uDCAA", + [":muscle::skin-tone-1:"] = "\uD83D\uDCAA\uD83C\uDFFB", + [":muscle::skin-tone-2:"] = "\uD83D\uDCAA\uD83C\uDFFC", + [":muscle::skin-tone-3:"] = "\uD83D\uDCAA\uD83C\uDFFD", + [":muscle::skin-tone-4:"] = "\uD83D\uDCAA\uD83C\uDFFE", + [":muscle::skin-tone-5:"] = "\uD83D\uDCAA\uD83C\uDFFF", + [":muscle_tone1:"] = "\uD83D\uDCAA\uD83C\uDFFB", + [":muscle_tone2:"] = "\uD83D\uDCAA\uD83C\uDFFC", + [":muscle_tone3:"] = "\uD83D\uDCAA\uD83C\uDFFD", + [":muscle_tone4:"] = "\uD83D\uDCAA\uD83C\uDFFE", + [":muscle_tone5:"] = "\uD83D\uDCAA\uD83C\uDFFF", + [":mushroom:"] = "\uD83C\uDF44", + [":musical_keyboard:"] = "\uD83C\uDFB9", + [":musical_note:"] = "\uD83C\uDFB5", + [":musical_score:"] = "\uD83C\uDFBC", + [":mute:"] = "\uD83D\uDD07", + [":nail_care:"] = "\uD83D\uDC85", + [":nail_care::skin-tone-1:"] = "\uD83D\uDC85\uD83C\uDFFB", + [":nail_care::skin-tone-2:"] = "\uD83D\uDC85\uD83C\uDFFC", + [":nail_care::skin-tone-3:"] = "\uD83D\uDC85\uD83C\uDFFD", + [":nail_care::skin-tone-4:"] = "\uD83D\uDC85\uD83C\uDFFE", + [":nail_care::skin-tone-5:"] = "\uD83D\uDC85\uD83C\uDFFF", + [":nail_care_tone1:"] = "\uD83D\uDC85\uD83C\uDFFB", + [":nail_care_tone2:"] = "\uD83D\uDC85\uD83C\uDFFC", + [":nail_care_tone3:"] = "\uD83D\uDC85\uD83C\uDFFD", + [":nail_care_tone4:"] = "\uD83D\uDC85\uD83C\uDFFE", + [":nail_care_tone5:"] = "\uD83D\uDC85\uD83C\uDFFF", + [":name_badge:"] = "\uD83D\uDCDB", + [":national_park:"] = "\uD83C\uDFDE️", + [":nauseated_face:"] = "\uD83E\uDD22", + [":nazar_amulet:"] = "\uD83E\uDDFF", + [":necktie:"] = "\uD83D\uDC54", + [":negative_squared_cross_mark:"] = "❎", + [":nerd:"] = "\uD83E\uDD13", + [":nerd_face:"] = "\uD83E\uDD13", + [":neutral_face:"] = "\uD83D\uDE10", + [":new:"] = "\uD83C\uDD95", + [":new_moon:"] = "\uD83C\uDF11", + [":new_moon_with_face:"] = "\uD83C\uDF1A", + [":newspaper2:"] = "\uD83D\uDDDE️", + [":newspaper:"] = "\uD83D\uDCF0", + [":next_track:"] = "⏭️", + [":ng:"] = "\uD83C\uDD96", + [":night_with_stars:"] = "\uD83C\uDF03", + [":nine:"] = "9️⃣", + [":no_bell:"] = "\uD83D\uDD15", + [":no_bicycles:"] = "\uD83D\uDEB3", + [":no_entry:"] = "⛔", + [":no_entry_sign:"] = "\uD83D\uDEAB", + [":no_good:"] = "\uD83D\uDE45", + [":no_good::skin-tone-1:"] = "\uD83D\uDE45\uD83C\uDFFB", + [":no_good::skin-tone-2:"] = "\uD83D\uDE45\uD83C\uDFFC", + [":no_good::skin-tone-3:"] = "\uD83D\uDE45\uD83C\uDFFD", + [":no_good::skin-tone-4:"] = "\uD83D\uDE45\uD83C\uDFFE", + [":no_good::skin-tone-5:"] = "\uD83D\uDE45\uD83C\uDFFF", + [":no_good_tone1:"] = "\uD83D\uDE45\uD83C\uDFFB", + [":no_good_tone2:"] = "\uD83D\uDE45\uD83C\uDFFC", + [":no_good_tone3:"] = "\uD83D\uDE45\uD83C\uDFFD", + [":no_good_tone4:"] = "\uD83D\uDE45\uD83C\uDFFE", + [":no_good_tone5:"] = "\uD83D\uDE45\uD83C\uDFFF", + [":no_mobile_phones:"] = "\uD83D\uDCF5", + [":no_mouth:"] = "\uD83D\uDE36", + [":no_pedestrians:"] = "\uD83D\uDEB7", + [":no_smoking:"] = "\uD83D\uDEAD", + [":non_potable_water:"] = "\uD83D\uDEB1", + [":nose:"] = "\uD83D\uDC43", + [":nose::skin-tone-1:"] = "\uD83D\uDC43\uD83C\uDFFB", + [":nose::skin-tone-2:"] = "\uD83D\uDC43\uD83C\uDFFC", + [":nose::skin-tone-3:"] = "\uD83D\uDC43\uD83C\uDFFD", + [":nose::skin-tone-4:"] = "\uD83D\uDC43\uD83C\uDFFE", + [":nose::skin-tone-5:"] = "\uD83D\uDC43\uD83C\uDFFF", + [":nose_tone1:"] = "\uD83D\uDC43\uD83C\uDFFB", + [":nose_tone2:"] = "\uD83D\uDC43\uD83C\uDFFC", + [":nose_tone3:"] = "\uD83D\uDC43\uD83C\uDFFD", + [":nose_tone4:"] = "\uD83D\uDC43\uD83C\uDFFE", + [":nose_tone5:"] = "\uD83D\uDC43\uD83C\uDFFF", + [":notebook:"] = "\uD83D\uDCD3", + [":notebook_with_decorative_cover:"] = "\uD83D\uDCD4", + [":notepad_spiral:"] = "\uD83D\uDDD2️", + [":notes:"] = "\uD83C\uDFB6", + [":nut_and_bolt:"] = "\uD83D\uDD29", + [":o"] = "\uD83D\uDE2E", + [":o2:"] = "\uD83C\uDD7E️", + [":o:"] = "⭕", + [":ocean:"] = "\uD83C\uDF0A", + [":octagonal_sign:"] = "\uD83D\uDED1", + [":octopus:"] = "\uD83D\uDC19", + [":oden:"] = "\uD83C\uDF62", + [":office:"] = "\uD83C\uDFE2", + [":oil:"] = "\uD83D\uDEE2️", + [":oil_drum:"] = "\uD83D\uDEE2️", + [":ok:"] = "\uD83C\uDD97", + [":ok_hand:"] = "\uD83D\uDC4C", + [":ok_hand::skin-tone-1:"] = "\uD83D\uDC4C\uD83C\uDFFB", + [":ok_hand::skin-tone-2:"] = "\uD83D\uDC4C\uD83C\uDFFC", + [":ok_hand::skin-tone-3:"] = "\uD83D\uDC4C\uD83C\uDFFD", + [":ok_hand::skin-tone-4:"] = "\uD83D\uDC4C\uD83C\uDFFE", + [":ok_hand::skin-tone-5:"] = "\uD83D\uDC4C\uD83C\uDFFF", + [":ok_hand_tone1:"] = "\uD83D\uDC4C\uD83C\uDFFB", + [":ok_hand_tone2:"] = "\uD83D\uDC4C\uD83C\uDFFC", + [":ok_hand_tone3:"] = "\uD83D\uDC4C\uD83C\uDFFD", + [":ok_hand_tone4:"] = "\uD83D\uDC4C\uD83C\uDFFE", + [":ok_hand_tone5:"] = "\uD83D\uDC4C\uD83C\uDFFF", + [":ok_woman:"] = "\uD83D\uDE46", + [":ok_woman::skin-tone-1:"] = "\uD83D\uDE46\uD83C\uDFFB", + [":ok_woman::skin-tone-2:"] = "\uD83D\uDE46\uD83C\uDFFC", + [":ok_woman::skin-tone-3:"] = "\uD83D\uDE46\uD83C\uDFFD", + [":ok_woman::skin-tone-4:"] = "\uD83D\uDE46\uD83C\uDFFE", + [":ok_woman::skin-tone-5:"] = "\uD83D\uDE46\uD83C\uDFFF", + [":ok_woman_tone1:"] = "\uD83D\uDE46\uD83C\uDFFB", + [":ok_woman_tone2:"] = "\uD83D\uDE46\uD83C\uDFFC", + [":ok_woman_tone3:"] = "\uD83D\uDE46\uD83C\uDFFD", + [":ok_woman_tone4:"] = "\uD83D\uDE46\uD83C\uDFFE", + [":ok_woman_tone5:"] = "\uD83D\uDE46\uD83C\uDFFF", + [":old_key:"] = "\uD83D\uDDDD️", + [":older_adult:"] = "\uD83E\uDDD3", + [":older_adult::skin-tone-1:"] = "\uD83E\uDDD3\uD83C\uDFFB", + [":older_adult::skin-tone-2:"] = "\uD83E\uDDD3\uD83C\uDFFC", + [":older_adult::skin-tone-3:"] = "\uD83E\uDDD3\uD83C\uDFFD", + [":older_adult::skin-tone-4:"] = "\uD83E\uDDD3\uD83C\uDFFE", + [":older_adult::skin-tone-5:"] = "\uD83E\uDDD3\uD83C\uDFFF", + [":older_adult_dark_skin_tone:"] = "\uD83E\uDDD3\uD83C\uDFFF", + [":older_adult_light_skin_tone:"] = "\uD83E\uDDD3\uD83C\uDFFB", + [":older_adult_medium_dark_skin_tone:"] = "\uD83E\uDDD3\uD83C\uDFFE", + [":older_adult_medium_light_skin_tone:"] = "\uD83E\uDDD3\uD83C\uDFFC", + [":older_adult_medium_skin_tone:"] = "\uD83E\uDDD3\uD83C\uDFFD", + [":older_adult_tone1:"] = "\uD83E\uDDD3\uD83C\uDFFB", + [":older_adult_tone2:"] = "\uD83E\uDDD3\uD83C\uDFFC", + [":older_adult_tone3:"] = "\uD83E\uDDD3\uD83C\uDFFD", + [":older_adult_tone4:"] = "\uD83E\uDDD3\uD83C\uDFFE", + [":older_adult_tone5:"] = "\uD83E\uDDD3\uD83C\uDFFF", + [":older_man:"] = "\uD83D\uDC74", + [":older_man::skin-tone-1:"] = "\uD83D\uDC74\uD83C\uDFFB", + [":older_man::skin-tone-2:"] = "\uD83D\uDC74\uD83C\uDFFC", + [":older_man::skin-tone-3:"] = "\uD83D\uDC74\uD83C\uDFFD", + [":older_man::skin-tone-4:"] = "\uD83D\uDC74\uD83C\uDFFE", + [":older_man::skin-tone-5:"] = "\uD83D\uDC74\uD83C\uDFFF", + [":older_man_tone1:"] = "\uD83D\uDC74\uD83C\uDFFB", + [":older_man_tone2:"] = "\uD83D\uDC74\uD83C\uDFFC", + [":older_man_tone3:"] = "\uD83D\uDC74\uD83C\uDFFD", + [":older_man_tone4:"] = "\uD83D\uDC74\uD83C\uDFFE", + [":older_man_tone5:"] = "\uD83D\uDC74\uD83C\uDFFF", + [":older_woman:"] = "\uD83D\uDC75", + [":older_woman::skin-tone-1:"] = "\uD83D\uDC75\uD83C\uDFFB", + [":older_woman::skin-tone-2:"] = "\uD83D\uDC75\uD83C\uDFFC", + [":older_woman::skin-tone-3:"] = "\uD83D\uDC75\uD83C\uDFFD", + [":older_woman::skin-tone-4:"] = "\uD83D\uDC75\uD83C\uDFFE", + [":older_woman::skin-tone-5:"] = "\uD83D\uDC75\uD83C\uDFFF", + [":older_woman_tone1:"] = "\uD83D\uDC75\uD83C\uDFFB", + [":older_woman_tone2:"] = "\uD83D\uDC75\uD83C\uDFFC", + [":older_woman_tone3:"] = "\uD83D\uDC75\uD83C\uDFFD", + [":older_woman_tone4:"] = "\uD83D\uDC75\uD83C\uDFFE", + [":older_woman_tone5:"] = "\uD83D\uDC75\uD83C\uDFFF", + [":om_symbol:"] = "\uD83D\uDD49️", + [":on:"] = "\uD83D\uDD1B", + [":oncoming_automobile:"] = "\uD83D\uDE98", + [":oncoming_bus:"] = "\uD83D\uDE8D", + [":oncoming_police_car:"] = "\uD83D\uDE94", + [":oncoming_taxi:"] = "\uD83D\uDE96", + [":one:"] = "1️⃣", + [":one_piece_swimsuit:"] = "\uD83E\uDE71", + [":onion:"] = "\uD83E\uDDC5", + [":open_file_folder:"] = "\uD83D\uDCC2", + [":open_hands:"] = "\uD83D\uDC50", + [":open_hands::skin-tone-1:"] = "\uD83D\uDC50\uD83C\uDFFB", + [":open_hands::skin-tone-2:"] = "\uD83D\uDC50\uD83C\uDFFC", + [":open_hands::skin-tone-3:"] = "\uD83D\uDC50\uD83C\uDFFD", + [":open_hands::skin-tone-4:"] = "\uD83D\uDC50\uD83C\uDFFE", + [":open_hands::skin-tone-5:"] = "\uD83D\uDC50\uD83C\uDFFF", + [":open_hands_tone1:"] = "\uD83D\uDC50\uD83C\uDFFB", + [":open_hands_tone2:"] = "\uD83D\uDC50\uD83C\uDFFC", + [":open_hands_tone3:"] = "\uD83D\uDC50\uD83C\uDFFD", + [":open_hands_tone4:"] = "\uD83D\uDC50\uD83C\uDFFE", + [":open_hands_tone5:"] = "\uD83D\uDC50\uD83C\uDFFF", + [":open_mouth:"] = "\uD83D\uDE2E", + [":ophiuchus:"] = "⛎", + [":orange_book:"] = "\uD83D\uDCD9", + [":orange_circle:"] = "\uD83D\uDFE0", + [":orange_heart:"] = "\uD83E\uDDE1", + [":orange_square:"] = "\uD83D\uDFE7", + [":orangutan:"] = "\uD83E\uDDA7", + [":orthodox_cross:"] = "☦️", + [":otter:"] = "\uD83E\uDDA6", + [":outbox_tray:"] = "\uD83D\uDCE4", + [":owl:"] = "\uD83E\uDD89", + [":ox:"] = "\uD83D\uDC02", + [":oyster:"] = "\uD83E\uDDAA", + [":package:"] = "\uD83D\uDCE6", + [":paella:"] = "\uD83E\uDD58", + [":page_facing_up:"] = "\uD83D\uDCC4", + [":page_with_curl:"] = "\uD83D\uDCC3", + [":pager:"] = "\uD83D\uDCDF", + [":paintbrush:"] = "\uD83D\uDD8C️", + [":palm_tree:"] = "\uD83C\uDF34", + [":palms_up_together:"] = "\uD83E\uDD32", + [":palms_up_together::skin-tone-1:"] = "\uD83E\uDD32\uD83C\uDFFB", + [":palms_up_together::skin-tone-2:"] = "\uD83E\uDD32\uD83C\uDFFC", + [":palms_up_together::skin-tone-3:"] = "\uD83E\uDD32\uD83C\uDFFD", + [":palms_up_together::skin-tone-4:"] = "\uD83E\uDD32\uD83C\uDFFE", + [":palms_up_together::skin-tone-5:"] = "\uD83E\uDD32\uD83C\uDFFF", + [":palms_up_together_dark_skin_tone:"] = "\uD83E\uDD32\uD83C\uDFFF", + [":palms_up_together_light_skin_tone:"] = "\uD83E\uDD32\uD83C\uDFFB", + [":palms_up_together_medium_dark_skin_tone:"] = "\uD83E\uDD32\uD83C\uDFFE", + [":palms_up_together_medium_light_skin_tone:"] = "\uD83E\uDD32\uD83C\uDFFC", + [":palms_up_together_medium_skin_tone:"] = "\uD83E\uDD32\uD83C\uDFFD", + [":palms_up_together_tone1:"] = "\uD83E\uDD32\uD83C\uDFFB", + [":palms_up_together_tone2:"] = "\uD83E\uDD32\uD83C\uDFFC", + [":palms_up_together_tone3:"] = "\uD83E\uDD32\uD83C\uDFFD", + [":palms_up_together_tone4:"] = "\uD83E\uDD32\uD83C\uDFFE", + [":palms_up_together_tone5:"] = "\uD83E\uDD32\uD83C\uDFFF", + [":pancakes:"] = "\uD83E\uDD5E", + [":panda_face:"] = "\uD83D\uDC3C", + [":paperclip:"] = "\uD83D\uDCCE", + [":paperclips:"] = "\uD83D\uDD87️", + [":parachute:"] = "\uD83E\uDE82", + [":park:"] = "\uD83C\uDFDE️", + [":parking:"] = "\uD83C\uDD7F️", + [":parrot:"] = "\uD83E\uDD9C", + [":part_alternation_mark:"] = "〽️", + [":partly_sunny:"] = "⛅", + [":partying_face:"] = "\uD83E\uDD73", + [":passenger_ship:"] = "\uD83D\uDEF3️", + [":passport_control:"] = "\uD83D\uDEC2", + [":pause_button:"] = "⏸️", + [":paw_prints:"] = "\uD83D\uDC3E", + [":peace:"] = "☮️", + [":peace_symbol:"] = "☮️", + [":peach:"] = "\uD83C\uDF51", + [":peacock:"] = "\uD83E\uDD9A", + [":peanuts:"] = "\uD83E\uDD5C", + [":pear:"] = "\uD83C\uDF50", + [":pen_ballpoint:"] = "\uD83D\uDD8A️", + [":pen_fountain:"] = "\uD83D\uDD8B️", + [":pencil2:"] = "✏️", + [":pencil:"] = "\uD83D\uDCDD", + [":penguin:"] = "\uD83D\uDC27", + [":pensive:"] = "\uD83D\uDE14", + [":people_holding_hands:"] = "\uD83E\uDDD1\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1", + [":people_with_bunny_ears_partying:"] = "\uD83D\uDC6F", + [":people_wrestling:"] = "\uD83E\uDD3C", + [":performing_arts:"] = "\uD83C\uDFAD", + [":persevere:"] = "\uD83D\uDE23", + [":person_biking:"] = "\uD83D\uDEB4", + [":person_biking::skin-tone-1:"] = "\uD83D\uDEB4\uD83C\uDFFB", + [":person_biking::skin-tone-2:"] = "\uD83D\uDEB4\uD83C\uDFFC", + [":person_biking::skin-tone-3:"] = "\uD83D\uDEB4\uD83C\uDFFD", + [":person_biking::skin-tone-4:"] = "\uD83D\uDEB4\uD83C\uDFFE", + [":person_biking::skin-tone-5:"] = "\uD83D\uDEB4\uD83C\uDFFF", + [":person_biking_tone1:"] = "\uD83D\uDEB4\uD83C\uDFFB", + [":person_biking_tone2:"] = "\uD83D\uDEB4\uD83C\uDFFC", + [":person_biking_tone3:"] = "\uD83D\uDEB4\uD83C\uDFFD", + [":person_biking_tone4:"] = "\uD83D\uDEB4\uD83C\uDFFE", + [":person_biking_tone5:"] = "\uD83D\uDEB4\uD83C\uDFFF", + [":person_bouncing_ball:"] = "⛹️", + [":person_bouncing_ball::skin-tone-1:"] = "⛹\uD83C\uDFFB", + [":person_bouncing_ball::skin-tone-2:"] = "⛹\uD83C\uDFFC", + [":person_bouncing_ball::skin-tone-3:"] = "⛹\uD83C\uDFFD", + [":person_bouncing_ball::skin-tone-4:"] = "⛹\uD83C\uDFFE", + [":person_bouncing_ball::skin-tone-5:"] = "⛹\uD83C\uDFFF", + [":person_bouncing_ball_tone1:"] = "⛹\uD83C\uDFFB", + [":person_bouncing_ball_tone2:"] = "⛹\uD83C\uDFFC", + [":person_bouncing_ball_tone3:"] = "⛹\uD83C\uDFFD", + [":person_bouncing_ball_tone4:"] = "⛹\uD83C\uDFFE", + [":person_bouncing_ball_tone5:"] = "⛹\uD83C\uDFFF", + [":person_bowing:"] = "\uD83D\uDE47", + [":person_bowing::skin-tone-1:"] = "\uD83D\uDE47\uD83C\uDFFB", + [":person_bowing::skin-tone-2:"] = "\uD83D\uDE47\uD83C\uDFFC", + [":person_bowing::skin-tone-3:"] = "\uD83D\uDE47\uD83C\uDFFD", + [":person_bowing::skin-tone-4:"] = "\uD83D\uDE47\uD83C\uDFFE", + [":person_bowing::skin-tone-5:"] = "\uD83D\uDE47\uD83C\uDFFF", + [":person_bowing_tone1:"] = "\uD83D\uDE47\uD83C\uDFFB", + [":person_bowing_tone2:"] = "\uD83D\uDE47\uD83C\uDFFC", + [":person_bowing_tone3:"] = "\uD83D\uDE47\uD83C\uDFFD", + [":person_bowing_tone4:"] = "\uD83D\uDE47\uD83C\uDFFE", + [":person_bowing_tone5:"] = "\uD83D\uDE47\uD83C\uDFFF", + [":person_climbing:"] = "\uD83E\uDDD7", + [":person_climbing::skin-tone-1:"] = "\uD83E\uDDD7\uD83C\uDFFB", + [":person_climbing::skin-tone-2:"] = "\uD83E\uDDD7\uD83C\uDFFC", + [":person_climbing::skin-tone-3:"] = "\uD83E\uDDD7\uD83C\uDFFD", + [":person_climbing::skin-tone-4:"] = "\uD83E\uDDD7\uD83C\uDFFE", + [":person_climbing::skin-tone-5:"] = "\uD83E\uDDD7\uD83C\uDFFF", + [":person_climbing_dark_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFF", + [":person_climbing_light_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFB", + [":person_climbing_medium_dark_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFE", + [":person_climbing_medium_light_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFC", + [":person_climbing_medium_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFD", + [":person_climbing_tone1:"] = "\uD83E\uDDD7\uD83C\uDFFB", + [":person_climbing_tone2:"] = "\uD83E\uDDD7\uD83C\uDFFC", + [":person_climbing_tone3:"] = "\uD83E\uDDD7\uD83C\uDFFD", + [":person_climbing_tone4:"] = "\uD83E\uDDD7\uD83C\uDFFE", + [":person_climbing_tone5:"] = "\uD83E\uDDD7\uD83C\uDFFF", + [":person_doing_cartwheel:"] = "\uD83E\uDD38", + [":person_doing_cartwheel::skin-tone-1:"] = "\uD83E\uDD38\uD83C\uDFFB", + [":person_doing_cartwheel::skin-tone-2:"] = "\uD83E\uDD38\uD83C\uDFFC", + [":person_doing_cartwheel::skin-tone-3:"] = "\uD83E\uDD38\uD83C\uDFFD", + [":person_doing_cartwheel::skin-tone-4:"] = "\uD83E\uDD38\uD83C\uDFFE", + [":person_doing_cartwheel::skin-tone-5:"] = "\uD83E\uDD38\uD83C\uDFFF", + [":person_doing_cartwheel_tone1:"] = "\uD83E\uDD38\uD83C\uDFFB", + [":person_doing_cartwheel_tone2:"] = "\uD83E\uDD38\uD83C\uDFFC", + [":person_doing_cartwheel_tone3:"] = "\uD83E\uDD38\uD83C\uDFFD", + [":person_doing_cartwheel_tone4:"] = "\uD83E\uDD38\uD83C\uDFFE", + [":person_doing_cartwheel_tone5:"] = "\uD83E\uDD38\uD83C\uDFFF", + [":person_facepalming:"] = "\uD83E\uDD26", + [":person_facepalming::skin-tone-1:"] = "\uD83E\uDD26\uD83C\uDFFB", + [":person_facepalming::skin-tone-2:"] = "\uD83E\uDD26\uD83C\uDFFC", + [":person_facepalming::skin-tone-3:"] = "\uD83E\uDD26\uD83C\uDFFD", + [":person_facepalming::skin-tone-4:"] = "\uD83E\uDD26\uD83C\uDFFE", + [":person_facepalming::skin-tone-5:"] = "\uD83E\uDD26\uD83C\uDFFF", + [":person_facepalming_tone1:"] = "\uD83E\uDD26\uD83C\uDFFB", + [":person_facepalming_tone2:"] = "\uD83E\uDD26\uD83C\uDFFC", + [":person_facepalming_tone3:"] = "\uD83E\uDD26\uD83C\uDFFD", + [":person_facepalming_tone4:"] = "\uD83E\uDD26\uD83C\uDFFE", + [":person_facepalming_tone5:"] = "\uD83E\uDD26\uD83C\uDFFF", + [":person_fencing:"] = "\uD83E\uDD3A", + [":person_frowning:"] = "\uD83D\uDE4D", + [":person_frowning::skin-tone-1:"] = "\uD83D\uDE4D\uD83C\uDFFB", + [":person_frowning::skin-tone-2:"] = "\uD83D\uDE4D\uD83C\uDFFC", + [":person_frowning::skin-tone-3:"] = "\uD83D\uDE4D\uD83C\uDFFD", + [":person_frowning::skin-tone-4:"] = "\uD83D\uDE4D\uD83C\uDFFE", + [":person_frowning::skin-tone-5:"] = "\uD83D\uDE4D\uD83C\uDFFF", + [":person_frowning_tone1:"] = "\uD83D\uDE4D\uD83C\uDFFB", + [":person_frowning_tone2:"] = "\uD83D\uDE4D\uD83C\uDFFC", + [":person_frowning_tone3:"] = "\uD83D\uDE4D\uD83C\uDFFD", + [":person_frowning_tone4:"] = "\uD83D\uDE4D\uD83C\uDFFE", + [":person_frowning_tone5:"] = "\uD83D\uDE4D\uD83C\uDFFF", + [":person_gesturing_no:"] = "\uD83D\uDE45", + [":person_gesturing_no::skin-tone-1:"] = "\uD83D\uDE45\uD83C\uDFFB", + [":person_gesturing_no::skin-tone-2:"] = "\uD83D\uDE45\uD83C\uDFFC", + [":person_gesturing_no::skin-tone-3:"] = "\uD83D\uDE45\uD83C\uDFFD", + [":person_gesturing_no::skin-tone-4:"] = "\uD83D\uDE45\uD83C\uDFFE", + [":person_gesturing_no::skin-tone-5:"] = "\uD83D\uDE45\uD83C\uDFFF", + [":person_gesturing_no_tone1:"] = "\uD83D\uDE45\uD83C\uDFFB", + [":person_gesturing_no_tone2:"] = "\uD83D\uDE45\uD83C\uDFFC", + [":person_gesturing_no_tone3:"] = "\uD83D\uDE45\uD83C\uDFFD", + [":person_gesturing_no_tone4:"] = "\uD83D\uDE45\uD83C\uDFFE", + [":person_gesturing_no_tone5:"] = "\uD83D\uDE45\uD83C\uDFFF", + [":person_gesturing_ok:"] = "\uD83D\uDE46", + [":person_gesturing_ok::skin-tone-1:"] = "\uD83D\uDE46\uD83C\uDFFB", + [":person_gesturing_ok::skin-tone-2:"] = "\uD83D\uDE46\uD83C\uDFFC", + [":person_gesturing_ok::skin-tone-3:"] = "\uD83D\uDE46\uD83C\uDFFD", + [":person_gesturing_ok::skin-tone-4:"] = "\uD83D\uDE46\uD83C\uDFFE", + [":person_gesturing_ok::skin-tone-5:"] = "\uD83D\uDE46\uD83C\uDFFF", + [":person_gesturing_ok_tone1:"] = "\uD83D\uDE46\uD83C\uDFFB", + [":person_gesturing_ok_tone2:"] = "\uD83D\uDE46\uD83C\uDFFC", + [":person_gesturing_ok_tone3:"] = "\uD83D\uDE46\uD83C\uDFFD", + [":person_gesturing_ok_tone4:"] = "\uD83D\uDE46\uD83C\uDFFE", + [":person_gesturing_ok_tone5:"] = "\uD83D\uDE46\uD83C\uDFFF", + [":person_getting_haircut:"] = "\uD83D\uDC87", + [":person_getting_haircut::skin-tone-1:"] = "\uD83D\uDC87\uD83C\uDFFB", + [":person_getting_haircut::skin-tone-2:"] = "\uD83D\uDC87\uD83C\uDFFC", + [":person_getting_haircut::skin-tone-3:"] = "\uD83D\uDC87\uD83C\uDFFD", + [":person_getting_haircut::skin-tone-4:"] = "\uD83D\uDC87\uD83C\uDFFE", + [":person_getting_haircut::skin-tone-5:"] = "\uD83D\uDC87\uD83C\uDFFF", + [":person_getting_haircut_tone1:"] = "\uD83D\uDC87\uD83C\uDFFB", + [":person_getting_haircut_tone2:"] = "\uD83D\uDC87\uD83C\uDFFC", + [":person_getting_haircut_tone3:"] = "\uD83D\uDC87\uD83C\uDFFD", + [":person_getting_haircut_tone4:"] = "\uD83D\uDC87\uD83C\uDFFE", + [":person_getting_haircut_tone5:"] = "\uD83D\uDC87\uD83C\uDFFF", + [":person_getting_massage:"] = "\uD83D\uDC86", + [":person_getting_massage::skin-tone-1:"] = "\uD83D\uDC86\uD83C\uDFFB", + [":person_getting_massage::skin-tone-2:"] = "\uD83D\uDC86\uD83C\uDFFC", + [":person_getting_massage::skin-tone-3:"] = "\uD83D\uDC86\uD83C\uDFFD", + [":person_getting_massage::skin-tone-4:"] = "\uD83D\uDC86\uD83C\uDFFE", + [":person_getting_massage::skin-tone-5:"] = "\uD83D\uDC86\uD83C\uDFFF", + [":person_getting_massage_tone1:"] = "\uD83D\uDC86\uD83C\uDFFB", + [":person_getting_massage_tone2:"] = "\uD83D\uDC86\uD83C\uDFFC", + [":person_getting_massage_tone3:"] = "\uD83D\uDC86\uD83C\uDFFD", + [":person_getting_massage_tone4:"] = "\uD83D\uDC86\uD83C\uDFFE", + [":person_getting_massage_tone5:"] = "\uD83D\uDC86\uD83C\uDFFF", + [":person_golfing:"] = "\uD83C\uDFCC️", + [":person_golfing::skin-tone-1:"] = "\uD83C\uDFCC\uD83C\uDFFB", + [":person_golfing::skin-tone-2:"] = "\uD83C\uDFCC\uD83C\uDFFC", + [":person_golfing::skin-tone-3:"] = "\uD83C\uDFCC\uD83C\uDFFD", + [":person_golfing::skin-tone-4:"] = "\uD83C\uDFCC\uD83C\uDFFE", + [":person_golfing::skin-tone-5:"] = "\uD83C\uDFCC\uD83C\uDFFF", + [":person_golfing_dark_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFF", + [":person_golfing_light_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFB", + [":person_golfing_medium_dark_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFE", + [":person_golfing_medium_light_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFC", + [":person_golfing_medium_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFD", + [":person_golfing_tone1:"] = "\uD83C\uDFCC\uD83C\uDFFB", + [":person_golfing_tone2:"] = "\uD83C\uDFCC\uD83C\uDFFC", + [":person_golfing_tone3:"] = "\uD83C\uDFCC\uD83C\uDFFD", + [":person_golfing_tone4:"] = "\uD83C\uDFCC\uD83C\uDFFE", + [":person_golfing_tone5:"] = "\uD83C\uDFCC\uD83C\uDFFF", + [":person_in_bed_dark_skin_tone:"] = "\uD83D\uDECC\uD83C\uDFFF", + [":person_in_bed_light_skin_tone:"] = "\uD83D\uDECC\uD83C\uDFFB", + [":person_in_bed_medium_dark_skin_tone:"] = "\uD83D\uDECC\uD83C\uDFFE", + [":person_in_bed_medium_light_skin_tone:"] = "\uD83D\uDECC\uD83C\uDFFC", + [":person_in_bed_medium_skin_tone:"] = "\uD83D\uDECC\uD83C\uDFFD", + [":person_in_bed_tone1:"] = "\uD83D\uDECC\uD83C\uDFFB", + [":person_in_bed_tone2:"] = "\uD83D\uDECC\uD83C\uDFFC", + [":person_in_bed_tone3:"] = "\uD83D\uDECC\uD83C\uDFFD", + [":person_in_bed_tone4:"] = "\uD83D\uDECC\uD83C\uDFFE", + [":person_in_bed_tone5:"] = "\uD83D\uDECC\uD83C\uDFFF", + [":person_in_lotus_position:"] = "\uD83E\uDDD8", + [":person_in_lotus_position::skin-tone-1:"] = "\uD83E\uDDD8\uD83C\uDFFB", + [":person_in_lotus_position::skin-tone-2:"] = "\uD83E\uDDD8\uD83C\uDFFC", + [":person_in_lotus_position::skin-tone-3:"] = "\uD83E\uDDD8\uD83C\uDFFD", + [":person_in_lotus_position::skin-tone-4:"] = "\uD83E\uDDD8\uD83C\uDFFE", + [":person_in_lotus_position::skin-tone-5:"] = "\uD83E\uDDD8\uD83C\uDFFF", + [":person_in_lotus_position_dark_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFF", + [":person_in_lotus_position_light_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFB", + [":person_in_lotus_position_medium_dark_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFE", + [":person_in_lotus_position_medium_light_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFC", + [":person_in_lotus_position_medium_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFD", + [":person_in_lotus_position_tone1:"] = "\uD83E\uDDD8\uD83C\uDFFB", + [":person_in_lotus_position_tone2:"] = "\uD83E\uDDD8\uD83C\uDFFC", + [":person_in_lotus_position_tone3:"] = "\uD83E\uDDD8\uD83C\uDFFD", + [":person_in_lotus_position_tone4:"] = "\uD83E\uDDD8\uD83C\uDFFE", + [":person_in_lotus_position_tone5:"] = "\uD83E\uDDD8\uD83C\uDFFF", + [":person_in_steamy_room:"] = "\uD83E\uDDD6", + [":person_in_steamy_room::skin-tone-1:"] = "\uD83E\uDDD6\uD83C\uDFFB", + [":person_in_steamy_room::skin-tone-2:"] = "\uD83E\uDDD6\uD83C\uDFFC", + [":person_in_steamy_room::skin-tone-3:"] = "\uD83E\uDDD6\uD83C\uDFFD", + [":person_in_steamy_room::skin-tone-4:"] = "\uD83E\uDDD6\uD83C\uDFFE", + [":person_in_steamy_room::skin-tone-5:"] = "\uD83E\uDDD6\uD83C\uDFFF", + [":person_in_steamy_room_dark_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFF", + [":person_in_steamy_room_light_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFB", + [":person_in_steamy_room_medium_dark_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFE", + [":person_in_steamy_room_medium_light_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFC", + [":person_in_steamy_room_medium_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFD", + [":person_in_steamy_room_tone1:"] = "\uD83E\uDDD6\uD83C\uDFFB", + [":person_in_steamy_room_tone2:"] = "\uD83E\uDDD6\uD83C\uDFFC", + [":person_in_steamy_room_tone3:"] = "\uD83E\uDDD6\uD83C\uDFFD", + [":person_in_steamy_room_tone4:"] = "\uD83E\uDDD6\uD83C\uDFFE", + [":person_in_steamy_room_tone5:"] = "\uD83E\uDDD6\uD83C\uDFFF", + [":person_juggling:"] = "\uD83E\uDD39", + [":person_juggling::skin-tone-1:"] = "\uD83E\uDD39\uD83C\uDFFB", + [":person_juggling::skin-tone-2:"] = "\uD83E\uDD39\uD83C\uDFFC", + [":person_juggling::skin-tone-3:"] = "\uD83E\uDD39\uD83C\uDFFD", + [":person_juggling::skin-tone-4:"] = "\uD83E\uDD39\uD83C\uDFFE", + [":person_juggling::skin-tone-5:"] = "\uD83E\uDD39\uD83C\uDFFF", + [":person_juggling_tone1:"] = "\uD83E\uDD39\uD83C\uDFFB", + [":person_juggling_tone2:"] = "\uD83E\uDD39\uD83C\uDFFC", + [":person_juggling_tone3:"] = "\uD83E\uDD39\uD83C\uDFFD", + [":person_juggling_tone4:"] = "\uD83E\uDD39\uD83C\uDFFE", + [":person_juggling_tone5:"] = "\uD83E\uDD39\uD83C\uDFFF", + [":person_kneeling:"] = "\uD83E\uDDCE", + [":person_kneeling::skin-tone-1:"] = "\uD83E\uDDCE\uD83C\uDFFB", + [":person_kneeling::skin-tone-2:"] = "\uD83E\uDDCE\uD83C\uDFFC", + [":person_kneeling::skin-tone-3:"] = "\uD83E\uDDCE\uD83C\uDFFD", + [":person_kneeling::skin-tone-4:"] = "\uD83E\uDDCE\uD83C\uDFFE", + [":person_kneeling::skin-tone-5:"] = "\uD83E\uDDCE\uD83C\uDFFF", + [":person_kneeling_dark_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFF", + [":person_kneeling_light_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFB", + [":person_kneeling_medium_dark_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFE", + [":person_kneeling_medium_light_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFC", + [":person_kneeling_medium_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFD", + [":person_kneeling_tone1:"] = "\uD83E\uDDCE\uD83C\uDFFB", + [":person_kneeling_tone2:"] = "\uD83E\uDDCE\uD83C\uDFFC", + [":person_kneeling_tone3:"] = "\uD83E\uDDCE\uD83C\uDFFD", + [":person_kneeling_tone4:"] = "\uD83E\uDDCE\uD83C\uDFFE", + [":person_kneeling_tone5:"] = "\uD83E\uDDCE\uD83C\uDFFF", + [":person_lifting_weights:"] = "\uD83C\uDFCB️", + [":person_lifting_weights::skin-tone-1:"] = "\uD83C\uDFCB\uD83C\uDFFB", + [":person_lifting_weights::skin-tone-2:"] = "\uD83C\uDFCB\uD83C\uDFFC", + [":person_lifting_weights::skin-tone-3:"] = "\uD83C\uDFCB\uD83C\uDFFD", + [":person_lifting_weights::skin-tone-4:"] = "\uD83C\uDFCB\uD83C\uDFFE", + [":person_lifting_weights::skin-tone-5:"] = "\uD83C\uDFCB\uD83C\uDFFF", + [":person_lifting_weights_tone1:"] = "\uD83C\uDFCB\uD83C\uDFFB", + [":person_lifting_weights_tone2:"] = "\uD83C\uDFCB\uD83C\uDFFC", + [":person_lifting_weights_tone3:"] = "\uD83C\uDFCB\uD83C\uDFFD", + [":person_lifting_weights_tone4:"] = "\uD83C\uDFCB\uD83C\uDFFE", + [":person_lifting_weights_tone5:"] = "\uD83C\uDFCB\uD83C\uDFFF", + [":person_mountain_biking:"] = "\uD83D\uDEB5", + [":person_mountain_biking::skin-tone-1:"] = "\uD83D\uDEB5\uD83C\uDFFB", + [":person_mountain_biking::skin-tone-2:"] = "\uD83D\uDEB5\uD83C\uDFFC", + [":person_mountain_biking::skin-tone-3:"] = "\uD83D\uDEB5\uD83C\uDFFD", + [":person_mountain_biking::skin-tone-4:"] = "\uD83D\uDEB5\uD83C\uDFFE", + [":person_mountain_biking::skin-tone-5:"] = "\uD83D\uDEB5\uD83C\uDFFF", + [":person_mountain_biking_tone1:"] = "\uD83D\uDEB5\uD83C\uDFFB", + [":person_mountain_biking_tone2:"] = "\uD83D\uDEB5\uD83C\uDFFC", + [":person_mountain_biking_tone3:"] = "\uD83D\uDEB5\uD83C\uDFFD", + [":person_mountain_biking_tone4:"] = "\uD83D\uDEB5\uD83C\uDFFE", + [":person_mountain_biking_tone5:"] = "\uD83D\uDEB5\uD83C\uDFFF", + [":person_playing_handball:"] = "\uD83E\uDD3E", + [":person_playing_handball::skin-tone-1:"] = "\uD83E\uDD3E\uD83C\uDFFB", + [":person_playing_handball::skin-tone-2:"] = "\uD83E\uDD3E\uD83C\uDFFC", + [":person_playing_handball::skin-tone-3:"] = "\uD83E\uDD3E\uD83C\uDFFD", + [":person_playing_handball::skin-tone-4:"] = "\uD83E\uDD3E\uD83C\uDFFE", + [":person_playing_handball::skin-tone-5:"] = "\uD83E\uDD3E\uD83C\uDFFF", + [":person_playing_handball_tone1:"] = "\uD83E\uDD3E\uD83C\uDFFB", + [":person_playing_handball_tone2:"] = "\uD83E\uDD3E\uD83C\uDFFC", + [":person_playing_handball_tone3:"] = "\uD83E\uDD3E\uD83C\uDFFD", + [":person_playing_handball_tone4:"] = "\uD83E\uDD3E\uD83C\uDFFE", + [":person_playing_handball_tone5:"] = "\uD83E\uDD3E\uD83C\uDFFF", + [":person_playing_water_polo:"] = "\uD83E\uDD3D", + [":person_playing_water_polo::skin-tone-1:"] = "\uD83E\uDD3D\uD83C\uDFFB", + [":person_playing_water_polo::skin-tone-2:"] = "\uD83E\uDD3D\uD83C\uDFFC", + [":person_playing_water_polo::skin-tone-3:"] = "\uD83E\uDD3D\uD83C\uDFFD", + [":person_playing_water_polo::skin-tone-4:"] = "\uD83E\uDD3D\uD83C\uDFFE", + [":person_playing_water_polo::skin-tone-5:"] = "\uD83E\uDD3D\uD83C\uDFFF", + [":person_playing_water_polo_tone1:"] = "\uD83E\uDD3D\uD83C\uDFFB", + [":person_playing_water_polo_tone2:"] = "\uD83E\uDD3D\uD83C\uDFFC", + [":person_playing_water_polo_tone3:"] = "\uD83E\uDD3D\uD83C\uDFFD", + [":person_playing_water_polo_tone4:"] = "\uD83E\uDD3D\uD83C\uDFFE", + [":person_playing_water_polo_tone5:"] = "\uD83E\uDD3D\uD83C\uDFFF", + [":person_pouting:"] = "\uD83D\uDE4E", + [":person_pouting::skin-tone-1:"] = "\uD83D\uDE4E\uD83C\uDFFB", + [":person_pouting::skin-tone-2:"] = "\uD83D\uDE4E\uD83C\uDFFC", + [":person_pouting::skin-tone-3:"] = "\uD83D\uDE4E\uD83C\uDFFD", + [":person_pouting::skin-tone-4:"] = "\uD83D\uDE4E\uD83C\uDFFE", + [":person_pouting::skin-tone-5:"] = "\uD83D\uDE4E\uD83C\uDFFF", + [":person_pouting_tone1:"] = "\uD83D\uDE4E\uD83C\uDFFB", + [":person_pouting_tone2:"] = "\uD83D\uDE4E\uD83C\uDFFC", + [":person_pouting_tone3:"] = "\uD83D\uDE4E\uD83C\uDFFD", + [":person_pouting_tone4:"] = "\uD83D\uDE4E\uD83C\uDFFE", + [":person_pouting_tone5:"] = "\uD83D\uDE4E\uD83C\uDFFF", + [":person_raising_hand:"] = "\uD83D\uDE4B", + [":person_raising_hand::skin-tone-1:"] = "\uD83D\uDE4B\uD83C\uDFFB", + [":person_raising_hand::skin-tone-2:"] = "\uD83D\uDE4B\uD83C\uDFFC", + [":person_raising_hand::skin-tone-3:"] = "\uD83D\uDE4B\uD83C\uDFFD", + [":person_raising_hand::skin-tone-4:"] = "\uD83D\uDE4B\uD83C\uDFFE", + [":person_raising_hand::skin-tone-5:"] = "\uD83D\uDE4B\uD83C\uDFFF", + [":person_raising_hand_tone1:"] = "\uD83D\uDE4B\uD83C\uDFFB", + [":person_raising_hand_tone2:"] = "\uD83D\uDE4B\uD83C\uDFFC", + [":person_raising_hand_tone3:"] = "\uD83D\uDE4B\uD83C\uDFFD", + [":person_raising_hand_tone4:"] = "\uD83D\uDE4B\uD83C\uDFFE", + [":person_raising_hand_tone5:"] = "\uD83D\uDE4B\uD83C\uDFFF", + [":person_rowing_boat:"] = "\uD83D\uDEA3", + [":person_rowing_boat::skin-tone-1:"] = "\uD83D\uDEA3\uD83C\uDFFB", + [":person_rowing_boat::skin-tone-2:"] = "\uD83D\uDEA3\uD83C\uDFFC", + [":person_rowing_boat::skin-tone-3:"] = "\uD83D\uDEA3\uD83C\uDFFD", + [":person_rowing_boat::skin-tone-4:"] = "\uD83D\uDEA3\uD83C\uDFFE", + [":person_rowing_boat::skin-tone-5:"] = "\uD83D\uDEA3\uD83C\uDFFF", + [":person_rowing_boat_tone1:"] = "\uD83D\uDEA3\uD83C\uDFFB", + [":person_rowing_boat_tone2:"] = "\uD83D\uDEA3\uD83C\uDFFC", + [":person_rowing_boat_tone3:"] = "\uD83D\uDEA3\uD83C\uDFFD", + [":person_rowing_boat_tone4:"] = "\uD83D\uDEA3\uD83C\uDFFE", + [":person_rowing_boat_tone5:"] = "\uD83D\uDEA3\uD83C\uDFFF", + [":person_running:"] = "\uD83C\uDFC3", + [":person_running::skin-tone-1:"] = "\uD83C\uDFC3\uD83C\uDFFB", + [":person_running::skin-tone-2:"] = "\uD83C\uDFC3\uD83C\uDFFC", + [":person_running::skin-tone-3:"] = "\uD83C\uDFC3\uD83C\uDFFD", + [":person_running::skin-tone-4:"] = "\uD83C\uDFC3\uD83C\uDFFE", + [":person_running::skin-tone-5:"] = "\uD83C\uDFC3\uD83C\uDFFF", + [":person_running_tone1:"] = "\uD83C\uDFC3\uD83C\uDFFB", + [":person_running_tone2:"] = "\uD83C\uDFC3\uD83C\uDFFC", + [":person_running_tone3:"] = "\uD83C\uDFC3\uD83C\uDFFD", + [":person_running_tone4:"] = "\uD83C\uDFC3\uD83C\uDFFE", + [":person_running_tone5:"] = "\uD83C\uDFC3\uD83C\uDFFF", + [":person_shrugging:"] = "\uD83E\uDD37", + [":person_shrugging::skin-tone-1:"] = "\uD83E\uDD37\uD83C\uDFFB", + [":person_shrugging::skin-tone-2:"] = "\uD83E\uDD37\uD83C\uDFFC", + [":person_shrugging::skin-tone-3:"] = "\uD83E\uDD37\uD83C\uDFFD", + [":person_shrugging::skin-tone-4:"] = "\uD83E\uDD37\uD83C\uDFFE", + [":person_shrugging::skin-tone-5:"] = "\uD83E\uDD37\uD83C\uDFFF", + [":person_shrugging_tone1:"] = "\uD83E\uDD37\uD83C\uDFFB", + [":person_shrugging_tone2:"] = "\uD83E\uDD37\uD83C\uDFFC", + [":person_shrugging_tone3:"] = "\uD83E\uDD37\uD83C\uDFFD", + [":person_shrugging_tone4:"] = "\uD83E\uDD37\uD83C\uDFFE", + [":person_shrugging_tone5:"] = "\uD83E\uDD37\uD83C\uDFFF", + [":person_standing:"] = "\uD83E\uDDCD", + [":person_standing::skin-tone-1:"] = "\uD83E\uDDCD\uD83C\uDFFB", + [":person_standing::skin-tone-2:"] = "\uD83E\uDDCD\uD83C\uDFFC", + [":person_standing::skin-tone-3:"] = "\uD83E\uDDCD\uD83C\uDFFD", + [":person_standing::skin-tone-4:"] = "\uD83E\uDDCD\uD83C\uDFFE", + [":person_standing::skin-tone-5:"] = "\uD83E\uDDCD\uD83C\uDFFF", + [":person_standing_dark_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFF", + [":person_standing_light_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFB", + [":person_standing_medium_dark_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFE", + [":person_standing_medium_light_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFC", + [":person_standing_medium_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFD", + [":person_standing_tone1:"] = "\uD83E\uDDCD\uD83C\uDFFB", + [":person_standing_tone2:"] = "\uD83E\uDDCD\uD83C\uDFFC", + [":person_standing_tone3:"] = "\uD83E\uDDCD\uD83C\uDFFD", + [":person_standing_tone4:"] = "\uD83E\uDDCD\uD83C\uDFFE", + [":person_standing_tone5:"] = "\uD83E\uDDCD\uD83C\uDFFF", + [":person_surfing:"] = "\uD83C\uDFC4", + [":person_surfing::skin-tone-1:"] = "\uD83C\uDFC4\uD83C\uDFFB", + [":person_surfing::skin-tone-2:"] = "\uD83C\uDFC4\uD83C\uDFFC", + [":person_surfing::skin-tone-3:"] = "\uD83C\uDFC4\uD83C\uDFFD", + [":person_surfing::skin-tone-4:"] = "\uD83C\uDFC4\uD83C\uDFFE", + [":person_surfing::skin-tone-5:"] = "\uD83C\uDFC4\uD83C\uDFFF", + [":person_surfing_tone1:"] = "\uD83C\uDFC4\uD83C\uDFFB", + [":person_surfing_tone2:"] = "\uD83C\uDFC4\uD83C\uDFFC", + [":person_surfing_tone3:"] = "\uD83C\uDFC4\uD83C\uDFFD", + [":person_surfing_tone4:"] = "\uD83C\uDFC4\uD83C\uDFFE", + [":person_surfing_tone5:"] = "\uD83C\uDFC4\uD83C\uDFFF", + [":person_swimming:"] = "\uD83C\uDFCA", + [":person_swimming::skin-tone-1:"] = "\uD83C\uDFCA\uD83C\uDFFB", + [":person_swimming::skin-tone-2:"] = "\uD83C\uDFCA\uD83C\uDFFC", + [":person_swimming::skin-tone-3:"] = "\uD83C\uDFCA\uD83C\uDFFD", + [":person_swimming::skin-tone-4:"] = "\uD83C\uDFCA\uD83C\uDFFE", + [":person_swimming::skin-tone-5:"] = "\uD83C\uDFCA\uD83C\uDFFF", + [":person_swimming_tone1:"] = "\uD83C\uDFCA\uD83C\uDFFB", + [":person_swimming_tone2:"] = "\uD83C\uDFCA\uD83C\uDFFC", + [":person_swimming_tone3:"] = "\uD83C\uDFCA\uD83C\uDFFD", + [":person_swimming_tone4:"] = "\uD83C\uDFCA\uD83C\uDFFE", + [":person_swimming_tone5:"] = "\uD83C\uDFCA\uD83C\uDFFF", + [":person_tipping_hand:"] = "\uD83D\uDC81", + [":person_tipping_hand::skin-tone-1:"] = "\uD83D\uDC81\uD83C\uDFFB", + [":person_tipping_hand::skin-tone-2:"] = "\uD83D\uDC81\uD83C\uDFFC", + [":person_tipping_hand::skin-tone-3:"] = "\uD83D\uDC81\uD83C\uDFFD", + [":person_tipping_hand::skin-tone-4:"] = "\uD83D\uDC81\uD83C\uDFFE", + [":person_tipping_hand::skin-tone-5:"] = "\uD83D\uDC81\uD83C\uDFFF", + [":person_tipping_hand_tone1:"] = "\uD83D\uDC81\uD83C\uDFFB", + [":person_tipping_hand_tone2:"] = "\uD83D\uDC81\uD83C\uDFFC", + [":person_tipping_hand_tone3:"] = "\uD83D\uDC81\uD83C\uDFFD", + [":person_tipping_hand_tone4:"] = "\uD83D\uDC81\uD83C\uDFFE", + [":person_tipping_hand_tone5:"] = "\uD83D\uDC81\uD83C\uDFFF", + [":person_walking:"] = "\uD83D\uDEB6", + [":person_walking::skin-tone-1:"] = "\uD83D\uDEB6\uD83C\uDFFB", + [":person_walking::skin-tone-2:"] = "\uD83D\uDEB6\uD83C\uDFFC", + [":person_walking::skin-tone-3:"] = "\uD83D\uDEB6\uD83C\uDFFD", + [":person_walking::skin-tone-4:"] = "\uD83D\uDEB6\uD83C\uDFFE", + [":person_walking::skin-tone-5:"] = "\uD83D\uDEB6\uD83C\uDFFF", + [":person_walking_tone1:"] = "\uD83D\uDEB6\uD83C\uDFFB", + [":person_walking_tone2:"] = "\uD83D\uDEB6\uD83C\uDFFC", + [":person_walking_tone3:"] = "\uD83D\uDEB6\uD83C\uDFFD", + [":person_walking_tone4:"] = "\uD83D\uDEB6\uD83C\uDFFE", + [":person_walking_tone5:"] = "\uD83D\uDEB6\uD83C\uDFFF", + [":person_wearing_turban:"] = "\uD83D\uDC73", + [":person_wearing_turban::skin-tone-1:"] = "\uD83D\uDC73\uD83C\uDFFB", + [":person_wearing_turban::skin-tone-2:"] = "\uD83D\uDC73\uD83C\uDFFC", + [":person_wearing_turban::skin-tone-3:"] = "\uD83D\uDC73\uD83C\uDFFD", + [":person_wearing_turban::skin-tone-4:"] = "\uD83D\uDC73\uD83C\uDFFE", + [":person_wearing_turban::skin-tone-5:"] = "\uD83D\uDC73\uD83C\uDFFF", + [":person_wearing_turban_tone1:"] = "\uD83D\uDC73\uD83C\uDFFB", + [":person_wearing_turban_tone2:"] = "\uD83D\uDC73\uD83C\uDFFC", + [":person_wearing_turban_tone3:"] = "\uD83D\uDC73\uD83C\uDFFD", + [":person_wearing_turban_tone4:"] = "\uD83D\uDC73\uD83C\uDFFE", + [":person_wearing_turban_tone5:"] = "\uD83D\uDC73\uD83C\uDFFF", + [":person_with_ball:"] = "⛹️", + [":person_with_ball::skin-tone-1:"] = "⛹\uD83C\uDFFB", + [":person_with_ball::skin-tone-2:"] = "⛹\uD83C\uDFFC", + [":person_with_ball::skin-tone-3:"] = "⛹\uD83C\uDFFD", + [":person_with_ball::skin-tone-4:"] = "⛹\uD83C\uDFFE", + [":person_with_ball::skin-tone-5:"] = "⛹\uD83C\uDFFF", + [":person_with_ball_tone1:"] = "⛹\uD83C\uDFFB", + [":person_with_ball_tone2:"] = "⛹\uD83C\uDFFC", + [":person_with_ball_tone3:"] = "⛹\uD83C\uDFFD", + [":person_with_ball_tone4:"] = "⛹\uD83C\uDFFE", + [":person_with_ball_tone5:"] = "⛹\uD83C\uDFFF", + [":person_with_blond_hair:"] = "\uD83D\uDC71", + [":person_with_blond_hair::skin-tone-1:"] = "\uD83D\uDC71\uD83C\uDFFB", + [":person_with_blond_hair::skin-tone-2:"] = "\uD83D\uDC71\uD83C\uDFFC", + [":person_with_blond_hair::skin-tone-3:"] = "\uD83D\uDC71\uD83C\uDFFD", + [":person_with_blond_hair::skin-tone-4:"] = "\uD83D\uDC71\uD83C\uDFFE", + [":person_with_blond_hair::skin-tone-5:"] = "\uD83D\uDC71\uD83C\uDFFF", + [":person_with_blond_hair_tone1:"] = "\uD83D\uDC71\uD83C\uDFFB", + [":person_with_blond_hair_tone2:"] = "\uD83D\uDC71\uD83C\uDFFC", + [":person_with_blond_hair_tone3:"] = "\uD83D\uDC71\uD83C\uDFFD", + [":person_with_blond_hair_tone4:"] = "\uD83D\uDC71\uD83C\uDFFE", + [":person_with_blond_hair_tone5:"] = "\uD83D\uDC71\uD83C\uDFFF", + [":person_with_pouting_face:"] = "\uD83D\uDE4E", + [":person_with_pouting_face::skin-tone-1:"] = "\uD83D\uDE4E\uD83C\uDFFB", + [":person_with_pouting_face::skin-tone-2:"] = "\uD83D\uDE4E\uD83C\uDFFC", + [":person_with_pouting_face::skin-tone-3:"] = "\uD83D\uDE4E\uD83C\uDFFD", + [":person_with_pouting_face::skin-tone-4:"] = "\uD83D\uDE4E\uD83C\uDFFE", + [":person_with_pouting_face::skin-tone-5:"] = "\uD83D\uDE4E\uD83C\uDFFF", + [":person_with_pouting_face_tone1:"] = "\uD83D\uDE4E\uD83C\uDFFB", + [":person_with_pouting_face_tone2:"] = "\uD83D\uDE4E\uD83C\uDFFC", + [":person_with_pouting_face_tone3:"] = "\uD83D\uDE4E\uD83C\uDFFD", + [":person_with_pouting_face_tone4:"] = "\uD83D\uDE4E\uD83C\uDFFE", + [":person_with_pouting_face_tone5:"] = "\uD83D\uDE4E\uD83C\uDFFF", + [":petri_dish:"] = "\uD83E\uDDEB", + [":pick:"] = "⛏️", + [":pie:"] = "\uD83E\uDD67", + [":pig2:"] = "\uD83D\uDC16", + [":pig:"] = "\uD83D\uDC37", + [":pig_nose:"] = "\uD83D\uDC3D", + [":pill:"] = "\uD83D\uDC8A", + [":pinching_hand:"] = "\uD83E\uDD0F", + [":pinching_hand::skin-tone-1:"] = "\uD83E\uDD0F\uD83C\uDFFB", + [":pinching_hand::skin-tone-2:"] = "\uD83E\uDD0F\uD83C\uDFFC", + [":pinching_hand::skin-tone-3:"] = "\uD83E\uDD0F\uD83C\uDFFD", + [":pinching_hand::skin-tone-4:"] = "\uD83E\uDD0F\uD83C\uDFFE", + [":pinching_hand::skin-tone-5:"] = "\uD83E\uDD0F\uD83C\uDFFF", + [":pinching_hand_dark_skin_tone:"] = "\uD83E\uDD0F\uD83C\uDFFF", + [":pinching_hand_light_skin_tone:"] = "\uD83E\uDD0F\uD83C\uDFFB", + [":pinching_hand_medium_dark_skin_tone:"] = "\uD83E\uDD0F\uD83C\uDFFE", + [":pinching_hand_medium_light_skin_tone:"] = "\uD83E\uDD0F\uD83C\uDFFC", + [":pinching_hand_medium_skin_tone:"] = "\uD83E\uDD0F\uD83C\uDFFD", + [":pinching_hand_tone1:"] = "\uD83E\uDD0F\uD83C\uDFFB", + [":pinching_hand_tone2:"] = "\uD83E\uDD0F\uD83C\uDFFC", + [":pinching_hand_tone3:"] = "\uD83E\uDD0F\uD83C\uDFFD", + [":pinching_hand_tone4:"] = "\uD83E\uDD0F\uD83C\uDFFE", + [":pinching_hand_tone5:"] = "\uD83E\uDD0F\uD83C\uDFFF", + [":pineapple:"] = "\uD83C\uDF4D", + [":ping_pong:"] = "\uD83C\uDFD3", + [":pirate_flag:"] = "\uD83C\uDFF4\u200D☠️", + [":pisces:"] = "♓", + [":pizza:"] = "\uD83C\uDF55", + [":place_of_worship:"] = "\uD83D\uDED0", + [":play_pause:"] = "⏯️", + [":pleading_face:"] = "\uD83E\uDD7A", + [":point_down:"] = "\uD83D\uDC47", + [":point_down::skin-tone-1:"] = "\uD83D\uDC47\uD83C\uDFFB", + [":point_down::skin-tone-2:"] = "\uD83D\uDC47\uD83C\uDFFC", + [":point_down::skin-tone-3:"] = "\uD83D\uDC47\uD83C\uDFFD", + [":point_down::skin-tone-4:"] = "\uD83D\uDC47\uD83C\uDFFE", + [":point_down::skin-tone-5:"] = "\uD83D\uDC47\uD83C\uDFFF", + [":point_down_tone1:"] = "\uD83D\uDC47\uD83C\uDFFB", + [":point_down_tone2:"] = "\uD83D\uDC47\uD83C\uDFFC", + [":point_down_tone3:"] = "\uD83D\uDC47\uD83C\uDFFD", + [":point_down_tone4:"] = "\uD83D\uDC47\uD83C\uDFFE", + [":point_down_tone5:"] = "\uD83D\uDC47\uD83C\uDFFF", + [":point_left:"] = "\uD83D\uDC48", + [":point_left::skin-tone-1:"] = "\uD83D\uDC48\uD83C\uDFFB", + [":point_left::skin-tone-2:"] = "\uD83D\uDC48\uD83C\uDFFC", + [":point_left::skin-tone-3:"] = "\uD83D\uDC48\uD83C\uDFFD", + [":point_left::skin-tone-4:"] = "\uD83D\uDC48\uD83C\uDFFE", + [":point_left::skin-tone-5:"] = "\uD83D\uDC48\uD83C\uDFFF", + [":point_left_tone1:"] = "\uD83D\uDC48\uD83C\uDFFB", + [":point_left_tone2:"] = "\uD83D\uDC48\uD83C\uDFFC", + [":point_left_tone3:"] = "\uD83D\uDC48\uD83C\uDFFD", + [":point_left_tone4:"] = "\uD83D\uDC48\uD83C\uDFFE", + [":point_left_tone5:"] = "\uD83D\uDC48\uD83C\uDFFF", + [":point_right:"] = "\uD83D\uDC49", + [":point_right::skin-tone-1:"] = "\uD83D\uDC49\uD83C\uDFFB", + [":point_right::skin-tone-2:"] = "\uD83D\uDC49\uD83C\uDFFC", + [":point_right::skin-tone-3:"] = "\uD83D\uDC49\uD83C\uDFFD", + [":point_right::skin-tone-4:"] = "\uD83D\uDC49\uD83C\uDFFE", + [":point_right::skin-tone-5:"] = "\uD83D\uDC49\uD83C\uDFFF", + [":point_right_tone1:"] = "\uD83D\uDC49\uD83C\uDFFB", + [":point_right_tone2:"] = "\uD83D\uDC49\uD83C\uDFFC", + [":point_right_tone3:"] = "\uD83D\uDC49\uD83C\uDFFD", + [":point_right_tone4:"] = "\uD83D\uDC49\uD83C\uDFFE", + [":point_right_tone5:"] = "\uD83D\uDC49\uD83C\uDFFF", + [":point_up:"] = "☝️", + [":point_up::skin-tone-1:"] = "☝\uD83C\uDFFB", + [":point_up::skin-tone-2:"] = "☝\uD83C\uDFFC", + [":point_up::skin-tone-3:"] = "☝\uD83C\uDFFD", + [":point_up::skin-tone-4:"] = "☝\uD83C\uDFFE", + [":point_up::skin-tone-5:"] = "☝\uD83C\uDFFF", + [":point_up_2:"] = "\uD83D\uDC46", + [":point_up_2::skin-tone-1:"] = "\uD83D\uDC46\uD83C\uDFFB", + [":point_up_2::skin-tone-2:"] = "\uD83D\uDC46\uD83C\uDFFC", + [":point_up_2::skin-tone-3:"] = "\uD83D\uDC46\uD83C\uDFFD", + [":point_up_2::skin-tone-4:"] = "\uD83D\uDC46\uD83C\uDFFE", + [":point_up_2::skin-tone-5:"] = "\uD83D\uDC46\uD83C\uDFFF", + [":point_up_2_tone1:"] = "\uD83D\uDC46\uD83C\uDFFB", + [":point_up_2_tone2:"] = "\uD83D\uDC46\uD83C\uDFFC", + [":point_up_2_tone3:"] = "\uD83D\uDC46\uD83C\uDFFD", + [":point_up_2_tone4:"] = "\uD83D\uDC46\uD83C\uDFFE", + [":point_up_2_tone5:"] = "\uD83D\uDC46\uD83C\uDFFF", + [":point_up_tone1:"] = "☝\uD83C\uDFFB", + [":point_up_tone2:"] = "☝\uD83C\uDFFC", + [":point_up_tone3:"] = "☝\uD83C\uDFFD", + [":point_up_tone4:"] = "☝\uD83C\uDFFE", + [":point_up_tone5:"] = "☝\uD83C\uDFFF", + [":police_car:"] = "\uD83D\uDE93", + [":police_officer:"] = "\uD83D\uDC6E", + [":police_officer::skin-tone-1:"] = "\uD83D\uDC6E\uD83C\uDFFB", + [":police_officer::skin-tone-2:"] = "\uD83D\uDC6E\uD83C\uDFFC", + [":police_officer::skin-tone-3:"] = "\uD83D\uDC6E\uD83C\uDFFD", + [":police_officer::skin-tone-4:"] = "\uD83D\uDC6E\uD83C\uDFFE", + [":police_officer::skin-tone-5:"] = "\uD83D\uDC6E\uD83C\uDFFF", + [":police_officer_tone1:"] = "\uD83D\uDC6E\uD83C\uDFFB", + [":police_officer_tone2:"] = "\uD83D\uDC6E\uD83C\uDFFC", + [":police_officer_tone3:"] = "\uD83D\uDC6E\uD83C\uDFFD", + [":police_officer_tone4:"] = "\uD83D\uDC6E\uD83C\uDFFE", + [":police_officer_tone5:"] = "\uD83D\uDC6E\uD83C\uDFFF", + [":poo:"] = "\uD83D\uDCA9", + [":poodle:"] = "\uD83D\uDC29", + [":poop:"] = "\uD83D\uDCA9", + [":popcorn:"] = "\uD83C\uDF7F", + [":post_office:"] = "\uD83C\uDFE3", + [":postal_horn:"] = "\uD83D\uDCEF", + [":postbox:"] = "\uD83D\uDCEE", + [":potable_water:"] = "\uD83D\uDEB0", + [":potato:"] = "\uD83E\uDD54", + [":pouch:"] = "\uD83D\uDC5D", + [":poultry_leg:"] = "\uD83C\uDF57", + [":pound:"] = "\uD83D\uDCB7", + [":pouting_cat:"] = "\uD83D\uDE3E", + [":pray:"] = "\uD83D\uDE4F", + [":pray::skin-tone-1:"] = "\uD83D\uDE4F\uD83C\uDFFB", + [":pray::skin-tone-2:"] = "\uD83D\uDE4F\uD83C\uDFFC", + [":pray::skin-tone-3:"] = "\uD83D\uDE4F\uD83C\uDFFD", + [":pray::skin-tone-4:"] = "\uD83D\uDE4F\uD83C\uDFFE", + [":pray::skin-tone-5:"] = "\uD83D\uDE4F\uD83C\uDFFF", + [":pray_tone1:"] = "\uD83D\uDE4F\uD83C\uDFFB", + [":pray_tone2:"] = "\uD83D\uDE4F\uD83C\uDFFC", + [":pray_tone3:"] = "\uD83D\uDE4F\uD83C\uDFFD", + [":pray_tone4:"] = "\uD83D\uDE4F\uD83C\uDFFE", + [":pray_tone5:"] = "\uD83D\uDE4F\uD83C\uDFFF", + [":prayer_beads:"] = "\uD83D\uDCFF", + [":pregnant_woman:"] = "\uD83E\uDD30", + [":pregnant_woman::skin-tone-1:"] = "\uD83E\uDD30\uD83C\uDFFB", + [":pregnant_woman::skin-tone-2:"] = "\uD83E\uDD30\uD83C\uDFFC", + [":pregnant_woman::skin-tone-3:"] = "\uD83E\uDD30\uD83C\uDFFD", + [":pregnant_woman::skin-tone-4:"] = "\uD83E\uDD30\uD83C\uDFFE", + [":pregnant_woman::skin-tone-5:"] = "\uD83E\uDD30\uD83C\uDFFF", + [":pregnant_woman_tone1:"] = "\uD83E\uDD30\uD83C\uDFFB", + [":pregnant_woman_tone2:"] = "\uD83E\uDD30\uD83C\uDFFC", + [":pregnant_woman_tone3:"] = "\uD83E\uDD30\uD83C\uDFFD", + [":pregnant_woman_tone4:"] = "\uD83E\uDD30\uD83C\uDFFE", + [":pregnant_woman_tone5:"] = "\uD83E\uDD30\uD83C\uDFFF", + [":pretzel:"] = "\uD83E\uDD68", + [":previous_track:"] = "⏮️", + [":prince:"] = "\uD83E\uDD34", + [":prince::skin-tone-1:"] = "\uD83E\uDD34\uD83C\uDFFB", + [":prince::skin-tone-2:"] = "\uD83E\uDD34\uD83C\uDFFC", + [":prince::skin-tone-3:"] = "\uD83E\uDD34\uD83C\uDFFD", + [":prince::skin-tone-4:"] = "\uD83E\uDD34\uD83C\uDFFE", + [":prince::skin-tone-5:"] = "\uD83E\uDD34\uD83C\uDFFF", + [":prince_tone1:"] = "\uD83E\uDD34\uD83C\uDFFB", + [":prince_tone2:"] = "\uD83E\uDD34\uD83C\uDFFC", + [":prince_tone3:"] = "\uD83E\uDD34\uD83C\uDFFD", + [":prince_tone4:"] = "\uD83E\uDD34\uD83C\uDFFE", + [":prince_tone5:"] = "\uD83E\uDD34\uD83C\uDFFF", + [":princess:"] = "\uD83D\uDC78", + [":princess::skin-tone-1:"] = "\uD83D\uDC78\uD83C\uDFFB", + [":princess::skin-tone-2:"] = "\uD83D\uDC78\uD83C\uDFFC", + [":princess::skin-tone-3:"] = "\uD83D\uDC78\uD83C\uDFFD", + [":princess::skin-tone-4:"] = "\uD83D\uDC78\uD83C\uDFFE", + [":princess::skin-tone-5:"] = "\uD83D\uDC78\uD83C\uDFFF", + [":princess_tone1:"] = "\uD83D\uDC78\uD83C\uDFFB", + [":princess_tone2:"] = "\uD83D\uDC78\uD83C\uDFFC", + [":princess_tone3:"] = "\uD83D\uDC78\uD83C\uDFFD", + [":princess_tone4:"] = "\uD83D\uDC78\uD83C\uDFFE", + [":princess_tone5:"] = "\uD83D\uDC78\uD83C\uDFFF", + [":printer:"] = "\uD83D\uDDA8️", + [":probing_cane:"] = "\uD83E\uDDAF", + [":projector:"] = "\uD83D\uDCFD️", + [":pudding:"] = "\uD83C\uDF6E", + [":punch:"] = "\uD83D\uDC4A", + [":punch::skin-tone-1:"] = "\uD83D\uDC4A\uD83C\uDFFB", + [":punch::skin-tone-2:"] = "\uD83D\uDC4A\uD83C\uDFFC", + [":punch::skin-tone-3:"] = "\uD83D\uDC4A\uD83C\uDFFD", + [":punch::skin-tone-4:"] = "\uD83D\uDC4A\uD83C\uDFFE", + [":punch::skin-tone-5:"] = "\uD83D\uDC4A\uD83C\uDFFF", + [":punch_tone1:"] = "\uD83D\uDC4A\uD83C\uDFFB", + [":punch_tone2:"] = "\uD83D\uDC4A\uD83C\uDFFC", + [":punch_tone3:"] = "\uD83D\uDC4A\uD83C\uDFFD", + [":punch_tone4:"] = "\uD83D\uDC4A\uD83C\uDFFE", + [":punch_tone5:"] = "\uD83D\uDC4A\uD83C\uDFFF", + [":purple_circle:"] = "\uD83D\uDFE3", + [":purple_heart:"] = "\uD83D\uDC9C", + [":purple_square:"] = "\uD83D\uDFEA", + [":purse:"] = "\uD83D\uDC5B", + [":pushpin:"] = "\uD83D\uDCCC", + [":put_litter_in_its_place:"] = "\uD83D\uDEAE", + [":question:"] = "❓", + [":rabbit2:"] = "\uD83D\uDC07", + [":rabbit:"] = "\uD83D\uDC30", + [":raccoon:"] = "\uD83E\uDD9D", + [":race_car:"] = "\uD83C\uDFCE️", + [":racehorse:"] = "\uD83D\uDC0E", + [":racing_car:"] = "\uD83C\uDFCE️", + [":racing_motorcycle:"] = "\uD83C\uDFCD️", + [":radio:"] = "\uD83D\uDCFB", + [":radio_button:"] = "\uD83D\uDD18", + [":radioactive:"] = "☢️", + [":radioactive_sign:"] = "☢️", + [":rage:"] = "\uD83D\uDE21", + [":railroad_track:"] = "\uD83D\uDEE4️", + [":railway_car:"] = "\uD83D\uDE83", + [":railway_track:"] = "\uD83D\uDEE4️", + [":rainbow:"] = "\uD83C\uDF08", + [":rainbow_flag:"] = "\uD83C\uDFF3️\u200D\uD83C\uDF08", + [":raised_back_of_hand:"] = "\uD83E\uDD1A", + [":raised_back_of_hand::skin-tone-1:"] = "\uD83E\uDD1A\uD83C\uDFFB", + [":raised_back_of_hand::skin-tone-2:"] = "\uD83E\uDD1A\uD83C\uDFFC", + [":raised_back_of_hand::skin-tone-3:"] = "\uD83E\uDD1A\uD83C\uDFFD", + [":raised_back_of_hand::skin-tone-4:"] = "\uD83E\uDD1A\uD83C\uDFFE", + [":raised_back_of_hand::skin-tone-5:"] = "\uD83E\uDD1A\uD83C\uDFFF", + [":raised_back_of_hand_tone1:"] = "\uD83E\uDD1A\uD83C\uDFFB", + [":raised_back_of_hand_tone2:"] = "\uD83E\uDD1A\uD83C\uDFFC", + [":raised_back_of_hand_tone3:"] = "\uD83E\uDD1A\uD83C\uDFFD", + [":raised_back_of_hand_tone4:"] = "\uD83E\uDD1A\uD83C\uDFFE", + [":raised_back_of_hand_tone5:"] = "\uD83E\uDD1A\uD83C\uDFFF", + [":raised_hand:"] = "✋", + [":raised_hand::skin-tone-1:"] = "✋\uD83C\uDFFB", + [":raised_hand::skin-tone-2:"] = "✋\uD83C\uDFFC", + [":raised_hand::skin-tone-3:"] = "✋\uD83C\uDFFD", + [":raised_hand::skin-tone-4:"] = "✋\uD83C\uDFFE", + [":raised_hand::skin-tone-5:"] = "✋\uD83C\uDFFF", + [":raised_hand_tone1:"] = "✋\uD83C\uDFFB", + [":raised_hand_tone2:"] = "✋\uD83C\uDFFC", + [":raised_hand_tone3:"] = "✋\uD83C\uDFFD", + [":raised_hand_tone4:"] = "✋\uD83C\uDFFE", + [":raised_hand_tone5:"] = "✋\uD83C\uDFFF", + [":raised_hand_with_fingers_splayed:"] = "\uD83D\uDD90️", + [":raised_hand_with_fingers_splayed::skin-tone-1:"] = "\uD83D\uDD90\uD83C\uDFFB", + [":raised_hand_with_fingers_splayed::skin-tone-2:"] = "\uD83D\uDD90\uD83C\uDFFC", + [":raised_hand_with_fingers_splayed::skin-tone-3:"] = "\uD83D\uDD90\uD83C\uDFFD", + [":raised_hand_with_fingers_splayed::skin-tone-4:"] = "\uD83D\uDD90\uD83C\uDFFE", + [":raised_hand_with_fingers_splayed::skin-tone-5:"] = "\uD83D\uDD90\uD83C\uDFFF", + [":raised_hand_with_fingers_splayed_tone1:"] = "\uD83D\uDD90\uD83C\uDFFB", + [":raised_hand_with_fingers_splayed_tone2:"] = "\uD83D\uDD90\uD83C\uDFFC", + [":raised_hand_with_fingers_splayed_tone3:"] = "\uD83D\uDD90\uD83C\uDFFD", + [":raised_hand_with_fingers_splayed_tone4:"] = "\uD83D\uDD90\uD83C\uDFFE", + [":raised_hand_with_fingers_splayed_tone5:"] = "\uD83D\uDD90\uD83C\uDFFF", + [":raised_hand_with_part_between_middle_and_ring_fingers:"] = "\uD83D\uDD96", + [":raised_hand_with_part_between_middle_and_ring_fingers::skin-tone-1:"] = "\uD83D\uDD96\uD83C\uDFFB", + [":raised_hand_with_part_between_middle_and_ring_fingers::skin-tone-2:"] = "\uD83D\uDD96\uD83C\uDFFC", + [":raised_hand_with_part_between_middle_and_ring_fingers::skin-tone-3:"] = "\uD83D\uDD96\uD83C\uDFFD", + [":raised_hand_with_part_between_middle_and_ring_fingers::skin-tone-4:"] = "\uD83D\uDD96\uD83C\uDFFE", + [":raised_hand_with_part_between_middle_and_ring_fingers::skin-tone-5:"] = "\uD83D\uDD96\uD83C\uDFFF", + [":raised_hand_with_part_between_middle_and_ring_fingers_tone1:"] = "\uD83D\uDD96\uD83C\uDFFB", + [":raised_hand_with_part_between_middle_and_ring_fingers_tone2:"] = "\uD83D\uDD96\uD83C\uDFFC", + [":raised_hand_with_part_between_middle_and_ring_fingers_tone3:"] = "\uD83D\uDD96\uD83C\uDFFD", + [":raised_hand_with_part_between_middle_and_ring_fingers_tone4:"] = "\uD83D\uDD96\uD83C\uDFFE", + [":raised_hand_with_part_between_middle_and_ring_fingers_tone5:"] = "\uD83D\uDD96\uD83C\uDFFF", + [":raised_hands:"] = "\uD83D\uDE4C", + [":raised_hands::skin-tone-1:"] = "\uD83D\uDE4C\uD83C\uDFFB", + [":raised_hands::skin-tone-2:"] = "\uD83D\uDE4C\uD83C\uDFFC", + [":raised_hands::skin-tone-3:"] = "\uD83D\uDE4C\uD83C\uDFFD", + [":raised_hands::skin-tone-4:"] = "\uD83D\uDE4C\uD83C\uDFFE", + [":raised_hands::skin-tone-5:"] = "\uD83D\uDE4C\uD83C\uDFFF", + [":raised_hands_tone1:"] = "\uD83D\uDE4C\uD83C\uDFFB", + [":raised_hands_tone2:"] = "\uD83D\uDE4C\uD83C\uDFFC", + [":raised_hands_tone3:"] = "\uD83D\uDE4C\uD83C\uDFFD", + [":raised_hands_tone4:"] = "\uD83D\uDE4C\uD83C\uDFFE", + [":raised_hands_tone5:"] = "\uD83D\uDE4C\uD83C\uDFFF", + [":raising_hand:"] = "\uD83D\uDE4B", + [":raising_hand::skin-tone-1:"] = "\uD83D\uDE4B\uD83C\uDFFB", + [":raising_hand::skin-tone-2:"] = "\uD83D\uDE4B\uD83C\uDFFC", + [":raising_hand::skin-tone-3:"] = "\uD83D\uDE4B\uD83C\uDFFD", + [":raising_hand::skin-tone-4:"] = "\uD83D\uDE4B\uD83C\uDFFE", + [":raising_hand::skin-tone-5:"] = "\uD83D\uDE4B\uD83C\uDFFF", + [":raising_hand_tone1:"] = "\uD83D\uDE4B\uD83C\uDFFB", + [":raising_hand_tone2:"] = "\uD83D\uDE4B\uD83C\uDFFC", + [":raising_hand_tone3:"] = "\uD83D\uDE4B\uD83C\uDFFD", + [":raising_hand_tone4:"] = "\uD83D\uDE4B\uD83C\uDFFE", + [":raising_hand_tone5:"] = "\uD83D\uDE4B\uD83C\uDFFF", + [":ram:"] = "\uD83D\uDC0F", + [":ramen:"] = "\uD83C\uDF5C", + [":rat:"] = "\uD83D\uDC00", + [":razor:"] = "\uD83E\uDE92", + [":receipt:"] = "\uD83E\uDDFE", + [":record_button:"] = "⏺️", + [":recycle:"] = "♻️", + [":red_car:"] = "\uD83D\uDE97", + [":red_circle:"] = "\uD83D\uDD34", + [":red_envelope:"] = "\uD83E\uDDE7", + [":red_square:"] = "\uD83D\uDFE5", + [":regional_indicator_a:"] = "\uD83C\uDDE6", + [":regional_indicator_b:"] = "\uD83C\uDDE7", + [":regional_indicator_c:"] = "\uD83C\uDDE8", + [":regional_indicator_d:"] = "\uD83C\uDDE9", + [":regional_indicator_e:"] = "\uD83C\uDDEA", + [":regional_indicator_f:"] = "\uD83C\uDDEB", + [":regional_indicator_g:"] = "\uD83C\uDDEC", + [":regional_indicator_h:"] = "\uD83C\uDDED", + [":regional_indicator_i:"] = "\uD83C\uDDEE", + [":regional_indicator_j:"] = "\uD83C\uDDEF", + [":regional_indicator_k:"] = "\uD83C\uDDF0", + [":regional_indicator_l:"] = "\uD83C\uDDF1", + [":regional_indicator_m:"] = "\uD83C\uDDF2", + [":regional_indicator_n:"] = "\uD83C\uDDF3", + [":regional_indicator_o:"] = "\uD83C\uDDF4", + [":regional_indicator_p:"] = "\uD83C\uDDF5", + [":regional_indicator_q:"] = "\uD83C\uDDF6", + [":regional_indicator_r:"] = "\uD83C\uDDF7", + [":regional_indicator_s:"] = "\uD83C\uDDF8", + [":regional_indicator_t:"] = "\uD83C\uDDF9", + [":regional_indicator_u:"] = "\uD83C\uDDFA", + [":regional_indicator_v:"] = "\uD83C\uDDFB", + [":regional_indicator_w:"] = "\uD83C\uDDFC", + [":regional_indicator_x:"] = "\uD83C\uDDFD", + [":regional_indicator_y:"] = "\uD83C\uDDFE", + [":regional_indicator_z:"] = "\uD83C\uDDFF", + [":registered:"] = "®️", + [":relaxed:"] = "☺️", + [":relieved:"] = "\uD83D\uDE0C", + [":reminder_ribbon:"] = "\uD83C\uDF97️", + [":repeat:"] = "\uD83D\uDD01", + [":repeat_one:"] = "\uD83D\uDD02", + [":restroom:"] = "\uD83D\uDEBB", + [":reversed_hand_with_middle_finger_extended:"] = "\uD83D\uDD95", + [":reversed_hand_with_middle_finger_extended::skin-tone-1:"] = "\uD83D\uDD95\uD83C\uDFFB", + [":reversed_hand_with_middle_finger_extended::skin-tone-2:"] = "\uD83D\uDD95\uD83C\uDFFC", + [":reversed_hand_with_middle_finger_extended::skin-tone-3:"] = "\uD83D\uDD95\uD83C\uDFFD", + [":reversed_hand_with_middle_finger_extended::skin-tone-4:"] = "\uD83D\uDD95\uD83C\uDFFE", + [":reversed_hand_with_middle_finger_extended::skin-tone-5:"] = "\uD83D\uDD95\uD83C\uDFFF", + [":reversed_hand_with_middle_finger_extended_tone1:"] = "\uD83D\uDD95\uD83C\uDFFB", + [":reversed_hand_with_middle_finger_extended_tone2:"] = "\uD83D\uDD95\uD83C\uDFFC", + [":reversed_hand_with_middle_finger_extended_tone3:"] = "\uD83D\uDD95\uD83C\uDFFD", + [":reversed_hand_with_middle_finger_extended_tone4:"] = "\uD83D\uDD95\uD83C\uDFFE", + [":reversed_hand_with_middle_finger_extended_tone5:"] = "\uD83D\uDD95\uD83C\uDFFF", + [":revolving_hearts:"] = "\uD83D\uDC9E", + [":rewind:"] = "⏪", + [":rhino:"] = "\uD83E\uDD8F", + [":rhinoceros:"] = "\uD83E\uDD8F", + [":ribbon:"] = "\uD83C\uDF80", + [":rice:"] = "\uD83C\uDF5A", + [":rice_ball:"] = "\uD83C\uDF59", + [":rice_cracker:"] = "\uD83C\uDF58", + [":rice_scene:"] = "\uD83C\uDF91", + [":right_anger_bubble:"] = "\uD83D\uDDEF️", + [":right_facing_fist:"] = "\uD83E\uDD1C", + [":right_facing_fist::skin-tone-1:"] = "\uD83E\uDD1C\uD83C\uDFFB", + [":right_facing_fist::skin-tone-2:"] = "\uD83E\uDD1C\uD83C\uDFFC", + [":right_facing_fist::skin-tone-3:"] = "\uD83E\uDD1C\uD83C\uDFFD", + [":right_facing_fist::skin-tone-4:"] = "\uD83E\uDD1C\uD83C\uDFFE", + [":right_facing_fist::skin-tone-5:"] = "\uD83E\uDD1C\uD83C\uDFFF", + [":right_facing_fist_tone1:"] = "\uD83E\uDD1C\uD83C\uDFFB", + [":right_facing_fist_tone2:"] = "\uD83E\uDD1C\uD83C\uDFFC", + [":right_facing_fist_tone3:"] = "\uD83E\uDD1C\uD83C\uDFFD", + [":right_facing_fist_tone4:"] = "\uD83E\uDD1C\uD83C\uDFFE", + [":right_facing_fist_tone5:"] = "\uD83E\uDD1C\uD83C\uDFFF", + [":right_fist:"] = "\uD83E\uDD1C", + [":right_fist::skin-tone-1:"] = "\uD83E\uDD1C\uD83C\uDFFB", + [":right_fist::skin-tone-2:"] = "\uD83E\uDD1C\uD83C\uDFFC", + [":right_fist::skin-tone-3:"] = "\uD83E\uDD1C\uD83C\uDFFD", + [":right_fist::skin-tone-4:"] = "\uD83E\uDD1C\uD83C\uDFFE", + [":right_fist::skin-tone-5:"] = "\uD83E\uDD1C\uD83C\uDFFF", + [":right_fist_tone1:"] = "\uD83E\uDD1C\uD83C\uDFFB", + [":right_fist_tone2:"] = "\uD83E\uDD1C\uD83C\uDFFC", + [":right_fist_tone3:"] = "\uD83E\uDD1C\uD83C\uDFFD", + [":right_fist_tone4:"] = "\uD83E\uDD1C\uD83C\uDFFE", + [":right_fist_tone5:"] = "\uD83E\uDD1C\uD83C\uDFFF", + [":ring:"] = "\uD83D\uDC8D", + [":ringed_planet:"] = "\uD83E\uDE90", + [":robot:"] = "\uD83E\uDD16", + [":robot_face:"] = "\uD83E\uDD16", + [":rocket:"] = "\uD83D\uDE80", + [":rofl:"] = "\uD83E\uDD23", + [":roll_of_paper:"] = "\uD83E\uDDFB", + [":rolled_up_newspaper:"] = "\uD83D\uDDDE️", + [":roller_coaster:"] = "\uD83C\uDFA2", + [":rolling_eyes:"] = "\uD83D\uDE44", + [":rolling_on_the_floor_laughing:"] = "\uD83E\uDD23", + [":rooster:"] = "\uD83D\uDC13", + [":rose:"] = "\uD83C\uDF39", + [":rosette:"] = "\uD83C\uDFF5️", + [":rotating_light:"] = "\uD83D\uDEA8", + [":round_pushpin:"] = "\uD83D\uDCCD", + [":rowboat:"] = "\uD83D\uDEA3", + [":rowboat::skin-tone-1:"] = "\uD83D\uDEA3\uD83C\uDFFB", + [":rowboat::skin-tone-2:"] = "\uD83D\uDEA3\uD83C\uDFFC", + [":rowboat::skin-tone-3:"] = "\uD83D\uDEA3\uD83C\uDFFD", + [":rowboat::skin-tone-4:"] = "\uD83D\uDEA3\uD83C\uDFFE", + [":rowboat::skin-tone-5:"] = "\uD83D\uDEA3\uD83C\uDFFF", + [":rowboat_tone1:"] = "\uD83D\uDEA3\uD83C\uDFFB", + [":rowboat_tone2:"] = "\uD83D\uDEA3\uD83C\uDFFC", + [":rowboat_tone3:"] = "\uD83D\uDEA3\uD83C\uDFFD", + [":rowboat_tone4:"] = "\uD83D\uDEA3\uD83C\uDFFE", + [":rowboat_tone5:"] = "\uD83D\uDEA3\uD83C\uDFFF", + [":rugby_football:"] = "\uD83C\uDFC9", + [":runner:"] = "\uD83C\uDFC3", + [":runner::skin-tone-1:"] = "\uD83C\uDFC3\uD83C\uDFFB", + [":runner::skin-tone-2:"] = "\uD83C\uDFC3\uD83C\uDFFC", + [":runner::skin-tone-3:"] = "\uD83C\uDFC3\uD83C\uDFFD", + [":runner::skin-tone-4:"] = "\uD83C\uDFC3\uD83C\uDFFE", + [":runner::skin-tone-5:"] = "\uD83C\uDFC3\uD83C\uDFFF", + [":runner_tone1:"] = "\uD83C\uDFC3\uD83C\uDFFB", + [":runner_tone2:"] = "\uD83C\uDFC3\uD83C\uDFFC", + [":runner_tone3:"] = "\uD83C\uDFC3\uD83C\uDFFD", + [":runner_tone4:"] = "\uD83C\uDFC3\uD83C\uDFFE", + [":runner_tone5:"] = "\uD83C\uDFC3\uD83C\uDFFF", + [":running_shirt_with_sash:"] = "\uD83C\uDFBD", + [":s"] = "\uD83D\uDE12", + [":sa:"] = "\uD83C\uDE02️", + [":safety_pin:"] = "\uD83E\uDDF7", + [":safety_vest:"] = "\uD83E\uDDBA", + [":sagittarius:"] = "♐", + [":sailboat:"] = "⛵", + [":sake:"] = "\uD83C\uDF76", + [":salad:"] = "\uD83E\uDD57", + [":salt:"] = "\uD83E\uDDC2", + [":sandal:"] = "\uD83D\uDC61", + [":sandwich:"] = "\uD83E\uDD6A", + [":santa:"] = "\uD83C\uDF85", + [":santa::skin-tone-1:"] = "\uD83C\uDF85\uD83C\uDFFB", + [":santa::skin-tone-2:"] = "\uD83C\uDF85\uD83C\uDFFC", + [":santa::skin-tone-3:"] = "\uD83C\uDF85\uD83C\uDFFD", + [":santa::skin-tone-4:"] = "\uD83C\uDF85\uD83C\uDFFE", + [":santa::skin-tone-5:"] = "\uD83C\uDF85\uD83C\uDFFF", + [":santa_tone1:"] = "\uD83C\uDF85\uD83C\uDFFB", + [":santa_tone2:"] = "\uD83C\uDF85\uD83C\uDFFC", + [":santa_tone3:"] = "\uD83C\uDF85\uD83C\uDFFD", + [":santa_tone4:"] = "\uD83C\uDF85\uD83C\uDFFE", + [":santa_tone5:"] = "\uD83C\uDF85\uD83C\uDFFF", + [":sari:"] = "\uD83E\uDD7B", + [":satellite:"] = "\uD83D\uDCE1", + [":satellite_orbital:"] = "\uD83D\uDEF0️", + [":satisfied:"] = "\uD83D\uDE06", + [":sauropod:"] = "\uD83E\uDD95", + [":saxophone:"] = "\uD83C\uDFB7", + [":scales:"] = "⚖️", + [":scarf:"] = "\uD83E\uDDE3", + [":school:"] = "\uD83C\uDFEB", + [":school_satchel:"] = "\uD83C\uDF92", + [":scissors:"] = "✂️", + [":scooter:"] = "\uD83D\uDEF4", + [":scorpion:"] = "\uD83E\uDD82", + [":scorpius:"] = "♏", + [":scotland:"] = "\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74\uDB40\uDC7F", + [":scream:"] = "\uD83D\uDE31", + [":scream_cat:"] = "\uD83D\uDE40", + [":scroll:"] = "\uD83D\uDCDC", + [":seat:"] = "\uD83D\uDCBA", + [":second_place:"] = "\uD83E\uDD48", + [":second_place_medal:"] = "\uD83E\uDD48", + [":secret:"] = "㊙️", + [":see_no_evil:"] = "\uD83D\uDE48", + [":seedling:"] = "\uD83C\uDF31", + [":selfie:"] = "\uD83E\uDD33", + [":selfie::skin-tone-1:"] = "\uD83E\uDD33\uD83C\uDFFB", + [":selfie::skin-tone-2:"] = "\uD83E\uDD33\uD83C\uDFFC", + [":selfie::skin-tone-3:"] = "\uD83E\uDD33\uD83C\uDFFD", + [":selfie::skin-tone-4:"] = "\uD83E\uDD33\uD83C\uDFFE", + [":selfie::skin-tone-5:"] = "\uD83E\uDD33\uD83C\uDFFF", + [":selfie_tone1:"] = "\uD83E\uDD33\uD83C\uDFFB", + [":selfie_tone2:"] = "\uD83E\uDD33\uD83C\uDFFC", + [":selfie_tone3:"] = "\uD83E\uDD33\uD83C\uDFFD", + [":selfie_tone4:"] = "\uD83E\uDD33\uD83C\uDFFE", + [":selfie_tone5:"] = "\uD83E\uDD33\uD83C\uDFFF", + [":service_dog:"] = "\uD83D\uDC15\u200D\uD83E\uDDBA", + [":seven:"] = "7️⃣", + [":shaking_hands:"] = "\uD83E\uDD1D", + [":shallow_pan_of_food:"] = "\uD83E\uDD58", + [":shamrock:"] = "☘️", + [":shark:"] = "\uD83E\uDD88", + [":shaved_ice:"] = "\uD83C\uDF67", + [":sheep:"] = "\uD83D\uDC11", + [":shell:"] = "\uD83D\uDC1A", + [":shelled_peanut:"] = "\uD83E\uDD5C", + [":shield:"] = "\uD83D\uDEE1️", + [":shinto_shrine:"] = "⛩️", + [":ship:"] = "\uD83D\uDEA2", + [":shirt:"] = "\uD83D\uDC55", + [":shit:"] = "\uD83D\uDCA9", + [":shopping_bags:"] = "\uD83D\uDECD️", + [":shopping_cart:"] = "\uD83D\uDED2", + [":shopping_trolley:"] = "\uD83D\uDED2", + [":shorts:"] = "\uD83E\uDE73", + [":shower:"] = "\uD83D\uDEBF", + [":shrimp:"] = "\uD83E\uDD90", + [":shrug:"] = "\uD83E\uDD37", + [":shrug::skin-tone-1:"] = "\uD83E\uDD37\uD83C\uDFFB", + [":shrug::skin-tone-2:"] = "\uD83E\uDD37\uD83C\uDFFC", + [":shrug::skin-tone-3:"] = "\uD83E\uDD37\uD83C\uDFFD", + [":shrug::skin-tone-4:"] = "\uD83E\uDD37\uD83C\uDFFE", + [":shrug::skin-tone-5:"] = "\uD83E\uDD37\uD83C\uDFFF", + [":shrug_tone1:"] = "\uD83E\uDD37\uD83C\uDFFB", + [":shrug_tone2:"] = "\uD83E\uDD37\uD83C\uDFFC", + [":shrug_tone3:"] = "\uD83E\uDD37\uD83C\uDFFD", + [":shrug_tone4:"] = "\uD83E\uDD37\uD83C\uDFFE", + [":shrug_tone5:"] = "\uD83E\uDD37\uD83C\uDFFF", + [":shushing_face:"] = "\uD83E\uDD2B", + [":sick:"] = "\uD83E\uDD22", + [":sign_of_the_horns:"] = "\uD83E\uDD18", + [":sign_of_the_horns::skin-tone-1:"] = "\uD83E\uDD18\uD83C\uDFFB", + [":sign_of_the_horns::skin-tone-2:"] = "\uD83E\uDD18\uD83C\uDFFC", + [":sign_of_the_horns::skin-tone-3:"] = "\uD83E\uDD18\uD83C\uDFFD", + [":sign_of_the_horns::skin-tone-4:"] = "\uD83E\uDD18\uD83C\uDFFE", + [":sign_of_the_horns::skin-tone-5:"] = "\uD83E\uDD18\uD83C\uDFFF", + [":sign_of_the_horns_tone1:"] = "\uD83E\uDD18\uD83C\uDFFB", + [":sign_of_the_horns_tone2:"] = "\uD83E\uDD18\uD83C\uDFFC", + [":sign_of_the_horns_tone3:"] = "\uD83E\uDD18\uD83C\uDFFD", + [":sign_of_the_horns_tone4:"] = "\uD83E\uDD18\uD83C\uDFFE", + [":sign_of_the_horns_tone5:"] = "\uD83E\uDD18\uD83C\uDFFF", + [":signal_strength:"] = "\uD83D\uDCF6", + [":six:"] = "6️⃣", + [":six_pointed_star:"] = "\uD83D\uDD2F", + [":skateboard:"] = "\uD83D\uDEF9", + [":skeleton:"] = "\uD83D\uDC80", + [":ski:"] = "\uD83C\uDFBF", + [":skier:"] = "⛷️", + [":skull:"] = "\uD83D\uDC80", + [":skull_and_crossbones:"] = "☠️", + [":skull_crossbones:"] = "☠️", + [":skunk:"] = "\uD83E\uDDA8", + [":sled:"] = "\uD83D\uDEF7", + [":sleeping:"] = "\uD83D\uDE34", + [":sleeping_accommodation:"] = "\uD83D\uDECC", + [":sleeping_accommodation::skin-tone-1:"] = "\uD83D\uDECC\uD83C\uDFFB", + [":sleeping_accommodation::skin-tone-2:"] = "\uD83D\uDECC\uD83C\uDFFC", + [":sleeping_accommodation::skin-tone-3:"] = "\uD83D\uDECC\uD83C\uDFFD", + [":sleeping_accommodation::skin-tone-4:"] = "\uD83D\uDECC\uD83C\uDFFE", + [":sleeping_accommodation::skin-tone-5:"] = "\uD83D\uDECC\uD83C\uDFFF", + [":sleepy:"] = "\uD83D\uDE2A", + [":sleuth_or_spy:"] = "\uD83D\uDD75️", + [":sleuth_or_spy::skin-tone-1:"] = "\uD83D\uDD75\uD83C\uDFFB", + [":sleuth_or_spy::skin-tone-2:"] = "\uD83D\uDD75\uD83C\uDFFC", + [":sleuth_or_spy::skin-tone-3:"] = "\uD83D\uDD75\uD83C\uDFFD", + [":sleuth_or_spy::skin-tone-4:"] = "\uD83D\uDD75\uD83C\uDFFE", + [":sleuth_or_spy::skin-tone-5:"] = "\uD83D\uDD75\uD83C\uDFFF", + [":sleuth_or_spy_tone1:"] = "\uD83D\uDD75\uD83C\uDFFB", + [":sleuth_or_spy_tone2:"] = "\uD83D\uDD75\uD83C\uDFFC", + [":sleuth_or_spy_tone3:"] = "\uD83D\uDD75\uD83C\uDFFD", + [":sleuth_or_spy_tone4:"] = "\uD83D\uDD75\uD83C\uDFFE", + [":sleuth_or_spy_tone5:"] = "\uD83D\uDD75\uD83C\uDFFF", + [":slight_frown:"] = "\uD83D\uDE41", + [":slight_smile:"] = "\uD83D\uDE42", + [":slightly_frowning_face:"] = "\uD83D\uDE41", + [":slightly_smiling_face:"] = "\uD83D\uDE42", + [":slot_machine:"] = "\uD83C\uDFB0", + [":sloth:"] = "\uD83E\uDDA5", + [":small_airplane:"] = "\uD83D\uDEE9️", + [":small_blue_diamond:"] = "\uD83D\uDD39", + [":small_orange_diamond:"] = "\uD83D\uDD38", + [":small_red_triangle:"] = "\uD83D\uDD3A", + [":small_red_triangle_down:"] = "\uD83D\uDD3B", + [":smile:"] = "\uD83D\uDE04", + [":smile_cat:"] = "\uD83D\uDE38", + [":smiley:"] = "\uD83D\uDE03", + [":smiley_cat:"] = "\uD83D\uDE3A", + [":smiling_face_with_3_hearts:"] = "\uD83E\uDD70", + [":smiling_imp:"] = "\uD83D\uDE08", + [":smirk:"] = "\uD83D\uDE0F", + [":smirk_cat:"] = "\uD83D\uDE3C", + [":smoking:"] = "\uD83D\uDEAC", + [":snail:"] = "\uD83D\uDC0C", + [":snake:"] = "\uD83D\uDC0D", + [":sneeze:"] = "\uD83E\uDD27", + [":sneezing_face:"] = "\uD83E\uDD27", + [":snow_capped_mountain:"] = "\uD83C\uDFD4️", + [":snowboarder:"] = "\uD83C\uDFC2", + [":snowboarder::skin-tone-1:"] = "\uD83C\uDFC2\uD83C\uDFFB", + [":snowboarder::skin-tone-2:"] = "\uD83C\uDFC2\uD83C\uDFFC", + [":snowboarder::skin-tone-3:"] = "\uD83C\uDFC2\uD83C\uDFFD", + [":snowboarder::skin-tone-4:"] = "\uD83C\uDFC2\uD83C\uDFFE", + [":snowboarder::skin-tone-5:"] = "\uD83C\uDFC2\uD83C\uDFFF", + [":snowboarder_dark_skin_tone:"] = "\uD83C\uDFC2\uD83C\uDFFF", + [":snowboarder_light_skin_tone:"] = "\uD83C\uDFC2\uD83C\uDFFB", + [":snowboarder_medium_dark_skin_tone:"] = "\uD83C\uDFC2\uD83C\uDFFE", + [":snowboarder_medium_light_skin_tone:"] = "\uD83C\uDFC2\uD83C\uDFFC", + [":snowboarder_medium_skin_tone:"] = "\uD83C\uDFC2\uD83C\uDFFD", + [":snowboarder_tone1:"] = "\uD83C\uDFC2\uD83C\uDFFB", + [":snowboarder_tone2:"] = "\uD83C\uDFC2\uD83C\uDFFC", + [":snowboarder_tone3:"] = "\uD83C\uDFC2\uD83C\uDFFD", + [":snowboarder_tone4:"] = "\uD83C\uDFC2\uD83C\uDFFE", + [":snowboarder_tone5:"] = "\uD83C\uDFC2\uD83C\uDFFF", + [":snowflake:"] = "❄️", + [":snowman2:"] = "☃️", + [":snowman:"] = "⛄", + [":soap:"] = "\uD83E\uDDFC", + [":sob:"] = "\uD83D\uDE2D", + [":soccer:"] = "⚽", + [":socks:"] = "\uD83E\uDDE6", + [":softball:"] = "\uD83E\uDD4E", + [":soon:"] = "\uD83D\uDD1C", + [":sos:"] = "\uD83C\uDD98", + [":sound:"] = "\uD83D\uDD09", + [":space_invader:"] = "\uD83D\uDC7E", + [":spades:"] = "♠️", + [":spaghetti:"] = "\uD83C\uDF5D", + [":sparkle:"] = "❇️", + [":sparkler:"] = "\uD83C\uDF87", + [":sparkles:"] = "✨", + [":sparkling_heart:"] = "\uD83D\uDC96", + [":speak_no_evil:"] = "\uD83D\uDE4A", + [":speaker:"] = "\uD83D\uDD08", + [":speaking_head:"] = "\uD83D\uDDE3️", + [":speaking_head_in_silhouette:"] = "\uD83D\uDDE3️", + [":speech_balloon:"] = "\uD83D\uDCAC", + [":speech_left:"] = "\uD83D\uDDE8️", + [":speedboat:"] = "\uD83D\uDEA4", + [":spider:"] = "\uD83D\uDD77️", + [":spider_web:"] = "\uD83D\uDD78️", + [":spiral_calendar_pad:"] = "\uD83D\uDDD3️", + [":spiral_note_pad:"] = "\uD83D\uDDD2️", + [":sponge:"] = "\uD83E\uDDFD", + [":spoon:"] = "\uD83E\uDD44", + [":sports_medal:"] = "\uD83C\uDFC5", + [":spy:"] = "\uD83D\uDD75️", + [":spy::skin-tone-1:"] = "\uD83D\uDD75\uD83C\uDFFB", + [":spy::skin-tone-2:"] = "\uD83D\uDD75\uD83C\uDFFC", + [":spy::skin-tone-3:"] = "\uD83D\uDD75\uD83C\uDFFD", + [":spy::skin-tone-4:"] = "\uD83D\uDD75\uD83C\uDFFE", + [":spy::skin-tone-5:"] = "\uD83D\uDD75\uD83C\uDFFF", + [":spy_tone1:"] = "\uD83D\uDD75\uD83C\uDFFB", + [":spy_tone2:"] = "\uD83D\uDD75\uD83C\uDFFC", + [":spy_tone3:"] = "\uD83D\uDD75\uD83C\uDFFD", + [":spy_tone4:"] = "\uD83D\uDD75\uD83C\uDFFE", + [":spy_tone5:"] = "\uD83D\uDD75\uD83C\uDFFF", + [":squeeze_bottle:"] = "\uD83E\uDDF4", + [":squid:"] = "\uD83E\uDD91", + [":stadium:"] = "\uD83C\uDFDF️", + [":star2:"] = "\uD83C\uDF1F", + [":star:"] = "⭐", + [":star_and_crescent:"] = "☪️", + [":star_of_david:"] = "✡️", + [":star_struck:"] = "\uD83E\uDD29", + [":stars:"] = "\uD83C\uDF20", + [":station:"] = "\uD83D\uDE89", + [":statue_of_liberty:"] = "\uD83D\uDDFD", + [":steam_locomotive:"] = "\uD83D\uDE82", + [":stethoscope:"] = "\uD83E\uDE7A", + [":stew:"] = "\uD83C\uDF72", + [":stop_button:"] = "⏹️", + [":stop_sign:"] = "\uD83D\uDED1", + [":stopwatch:"] = "⏱️", + [":straight_ruler:"] = "\uD83D\uDCCF", + [":strawberry:"] = "\uD83C\uDF53", + [":stuck_out_tongue:"] = "\uD83D\uDE1B", + [":stuck_out_tongue_closed_eyes:"] = "\uD83D\uDE1D", + [":stuck_out_tongue_winking_eye:"] = "\uD83D\uDE1C", + [":studio_microphone:"] = "\uD83C\uDF99️", + [":stuffed_flatbread:"] = "\uD83E\uDD59", + [":stuffed_pita:"] = "\uD83E\uDD59", + [":sun_with_face:"] = "\uD83C\uDF1E", + [":sunflower:"] = "\uD83C\uDF3B", + [":sunglasses:"] = "\uD83D\uDE0E", + [":sunny:"] = "☀️", + [":sunrise:"] = "\uD83C\uDF05", + [":sunrise_over_mountains:"] = "\uD83C\uDF04", + [":superhero:"] = "\uD83E\uDDB8", + [":superhero::skin-tone-1:"] = "\uD83E\uDDB8\uD83C\uDFFB", + [":superhero::skin-tone-2:"] = "\uD83E\uDDB8\uD83C\uDFFC", + [":superhero::skin-tone-3:"] = "\uD83E\uDDB8\uD83C\uDFFD", + [":superhero::skin-tone-4:"] = "\uD83E\uDDB8\uD83C\uDFFE", + [":superhero::skin-tone-5:"] = "\uD83E\uDDB8\uD83C\uDFFF", + [":superhero_dark_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFF", + [":superhero_light_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFB", + [":superhero_medium_dark_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFE", + [":superhero_medium_light_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFC", + [":superhero_medium_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFD", + [":superhero_tone1:"] = "\uD83E\uDDB8\uD83C\uDFFB", + [":superhero_tone2:"] = "\uD83E\uDDB8\uD83C\uDFFC", + [":superhero_tone3:"] = "\uD83E\uDDB8\uD83C\uDFFD", + [":superhero_tone4:"] = "\uD83E\uDDB8\uD83C\uDFFE", + [":superhero_tone5:"] = "\uD83E\uDDB8\uD83C\uDFFF", + [":supervillain:"] = "\uD83E\uDDB9", + [":supervillain::skin-tone-1:"] = "\uD83E\uDDB9\uD83C\uDFFB", + [":supervillain::skin-tone-2:"] = "\uD83E\uDDB9\uD83C\uDFFC", + [":supervillain::skin-tone-3:"] = "\uD83E\uDDB9\uD83C\uDFFD", + [":supervillain::skin-tone-4:"] = "\uD83E\uDDB9\uD83C\uDFFE", + [":supervillain::skin-tone-5:"] = "\uD83E\uDDB9\uD83C\uDFFF", + [":supervillain_dark_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFF", + [":supervillain_light_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFB", + [":supervillain_medium_dark_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFE", + [":supervillain_medium_light_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFC", + [":supervillain_medium_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFD", + [":supervillain_tone1:"] = "\uD83E\uDDB9\uD83C\uDFFB", + [":supervillain_tone2:"] = "\uD83E\uDDB9\uD83C\uDFFC", + [":supervillain_tone3:"] = "\uD83E\uDDB9\uD83C\uDFFD", + [":supervillain_tone4:"] = "\uD83E\uDDB9\uD83C\uDFFE", + [":supervillain_tone5:"] = "\uD83E\uDDB9\uD83C\uDFFF", + [":surfer:"] = "\uD83C\uDFC4", + [":surfer::skin-tone-1:"] = "\uD83C\uDFC4\uD83C\uDFFB", + [":surfer::skin-tone-2:"] = "\uD83C\uDFC4\uD83C\uDFFC", + [":surfer::skin-tone-3:"] = "\uD83C\uDFC4\uD83C\uDFFD", + [":surfer::skin-tone-4:"] = "\uD83C\uDFC4\uD83C\uDFFE", + [":surfer::skin-tone-5:"] = "\uD83C\uDFC4\uD83C\uDFFF", + [":surfer_tone1:"] = "\uD83C\uDFC4\uD83C\uDFFB", + [":surfer_tone2:"] = "\uD83C\uDFC4\uD83C\uDFFC", + [":surfer_tone3:"] = "\uD83C\uDFC4\uD83C\uDFFD", + [":surfer_tone4:"] = "\uD83C\uDFC4\uD83C\uDFFE", + [":surfer_tone5:"] = "\uD83C\uDFC4\uD83C\uDFFF", + [":sushi:"] = "\uD83C\uDF63", + [":suspension_railway:"] = "\uD83D\uDE9F", + [":swan:"] = "\uD83E\uDDA2", + [":sweat:"] = "\uD83D\uDE13", + [":sweat_drops:"] = "\uD83D\uDCA6", + [":sweat_smile:"] = "\uD83D\uDE05", + [":sweet_potato:"] = "\uD83C\uDF60", + [":swimmer:"] = "\uD83C\uDFCA", + [":swimmer::skin-tone-1:"] = "\uD83C\uDFCA\uD83C\uDFFB", + [":swimmer::skin-tone-2:"] = "\uD83C\uDFCA\uD83C\uDFFC", + [":swimmer::skin-tone-3:"] = "\uD83C\uDFCA\uD83C\uDFFD", + [":swimmer::skin-tone-4:"] = "\uD83C\uDFCA\uD83C\uDFFE", + [":swimmer::skin-tone-5:"] = "\uD83C\uDFCA\uD83C\uDFFF", + [":swimmer_tone1:"] = "\uD83C\uDFCA\uD83C\uDFFB", + [":swimmer_tone2:"] = "\uD83C\uDFCA\uD83C\uDFFC", + [":swimmer_tone3:"] = "\uD83C\uDFCA\uD83C\uDFFD", + [":swimmer_tone4:"] = "\uD83C\uDFCA\uD83C\uDFFE", + [":swimmer_tone5:"] = "\uD83C\uDFCA\uD83C\uDFFF", + [":symbols:"] = "\uD83D\uDD23", + [":synagogue:"] = "\uD83D\uDD4D", + [":syringe:"] = "\uD83D\uDC89", + [":t_rex:"] = "\uD83E\uDD96", + [":table_tennis:"] = "\uD83C\uDFD3", + [":taco:"] = "\uD83C\uDF2E", + [":tada:"] = "\uD83C\uDF89", + [":takeout_box:"] = "\uD83E\uDD61", + [":tanabata_tree:"] = "\uD83C\uDF8B", + [":tangerine:"] = "\uD83C\uDF4A", + [":taurus:"] = "♉", + [":taxi:"] = "\uD83D\uDE95", + [":tea:"] = "\uD83C\uDF75", + [":teddy_bear:"] = "\uD83E\uDDF8", + [":telephone:"] = "☎️", + [":telephone_receiver:"] = "\uD83D\uDCDE", + [":telescope:"] = "\uD83D\uDD2D", + [":tennis:"] = "\uD83C\uDFBE", + [":tent:"] = "⛺", + [":test_tube:"] = "\uD83E\uDDEA", + [":thermometer:"] = "\uD83C\uDF21️", + [":thermometer_face:"] = "\uD83E\uDD12", + [":thinking:"] = "\uD83E\uDD14", + [":thinking_face:"] = "\uD83E\uDD14", + [":third_place:"] = "\uD83E\uDD49", + [":third_place_medal:"] = "\uD83E\uDD49", + [":thought_balloon:"] = "\uD83D\uDCAD", + [":thread:"] = "\uD83E\uDDF5", + [":three:"] = "3️⃣", + [":three_button_mouse:"] = "\uD83D\uDDB1️", + [":thumbdown:"] = "\uD83D\uDC4E", + [":thumbdown::skin-tone-1:"] = "\uD83D\uDC4E\uD83C\uDFFB", + [":thumbdown::skin-tone-2:"] = "\uD83D\uDC4E\uD83C\uDFFC", + [":thumbdown::skin-tone-3:"] = "\uD83D\uDC4E\uD83C\uDFFD", + [":thumbdown::skin-tone-4:"] = "\uD83D\uDC4E\uD83C\uDFFE", + [":thumbdown::skin-tone-5:"] = "\uD83D\uDC4E\uD83C\uDFFF", + [":thumbdown_tone1:"] = "\uD83D\uDC4E\uD83C\uDFFB", + [":thumbdown_tone2:"] = "\uD83D\uDC4E\uD83C\uDFFC", + [":thumbdown_tone3:"] = "\uD83D\uDC4E\uD83C\uDFFD", + [":thumbdown_tone4:"] = "\uD83D\uDC4E\uD83C\uDFFE", + [":thumbdown_tone5:"] = "\uD83D\uDC4E\uD83C\uDFFF", + [":thumbsdown:"] = "\uD83D\uDC4E", + [":thumbsdown::skin-tone-1:"] = "\uD83D\uDC4E\uD83C\uDFFB", + [":thumbsdown::skin-tone-2:"] = "\uD83D\uDC4E\uD83C\uDFFC", + [":thumbsdown::skin-tone-3:"] = "\uD83D\uDC4E\uD83C\uDFFD", + [":thumbsdown::skin-tone-4:"] = "\uD83D\uDC4E\uD83C\uDFFE", + [":thumbsdown::skin-tone-5:"] = "\uD83D\uDC4E\uD83C\uDFFF", + [":thumbsdown_tone1:"] = "\uD83D\uDC4E\uD83C\uDFFB", + [":thumbsdown_tone2:"] = "\uD83D\uDC4E\uD83C\uDFFC", + [":thumbsdown_tone3:"] = "\uD83D\uDC4E\uD83C\uDFFD", + [":thumbsdown_tone4:"] = "\uD83D\uDC4E\uD83C\uDFFE", + [":thumbsdown_tone5:"] = "\uD83D\uDC4E\uD83C\uDFFF", + [":thumbsup:"] = "\uD83D\uDC4D", + [":thumbsup::skin-tone-1:"] = "\uD83D\uDC4D\uD83C\uDFFB", + [":thumbsup::skin-tone-2:"] = "\uD83D\uDC4D\uD83C\uDFFC", + [":thumbsup::skin-tone-3:"] = "\uD83D\uDC4D\uD83C\uDFFD", + [":thumbsup::skin-tone-4:"] = "\uD83D\uDC4D\uD83C\uDFFE", + [":thumbsup::skin-tone-5:"] = "\uD83D\uDC4D\uD83C\uDFFF", + [":thumbsup_tone1:"] = "\uD83D\uDC4D\uD83C\uDFFB", + [":thumbsup_tone2:"] = "\uD83D\uDC4D\uD83C\uDFFC", + [":thumbsup_tone3:"] = "\uD83D\uDC4D\uD83C\uDFFD", + [":thumbsup_tone4:"] = "\uD83D\uDC4D\uD83C\uDFFE", + [":thumbsup_tone5:"] = "\uD83D\uDC4D\uD83C\uDFFF", + [":thumbup:"] = "\uD83D\uDC4D", + [":thumbup::skin-tone-1:"] = "\uD83D\uDC4D\uD83C\uDFFB", + [":thumbup::skin-tone-2:"] = "\uD83D\uDC4D\uD83C\uDFFC", + [":thumbup::skin-tone-3:"] = "\uD83D\uDC4D\uD83C\uDFFD", + [":thumbup::skin-tone-4:"] = "\uD83D\uDC4D\uD83C\uDFFE", + [":thumbup::skin-tone-5:"] = "\uD83D\uDC4D\uD83C\uDFFF", + [":thumbup_tone1:"] = "\uD83D\uDC4D\uD83C\uDFFB", + [":thumbup_tone2:"] = "\uD83D\uDC4D\uD83C\uDFFC", + [":thumbup_tone3:"] = "\uD83D\uDC4D\uD83C\uDFFD", + [":thumbup_tone4:"] = "\uD83D\uDC4D\uD83C\uDFFE", + [":thumbup_tone5:"] = "\uD83D\uDC4D\uD83C\uDFFF", + [":thunder_cloud_and_rain:"] = "⛈️", + [":thunder_cloud_rain:"] = "⛈️", + [":ticket:"] = "\uD83C\uDFAB", + [":tickets:"] = "\uD83C\uDF9F️", + [":tiger2:"] = "\uD83D\uDC05", + [":tiger:"] = "\uD83D\uDC2F", + [":timer:"] = "⏲️", + [":timer_clock:"] = "⏲️", + [":tired_face:"] = "\uD83D\uDE2B", + [":tm:"] = "™️", + [":toilet:"] = "\uD83D\uDEBD", + [":tokyo_tower:"] = "\uD83D\uDDFC", + [":tomato:"] = "\uD83C\uDF45", + [":tongue:"] = "\uD83D\uDC45", + [":toolbox:"] = "\uD83E\uDDF0", + [":tools:"] = "\uD83D\uDEE0️", + [":tooth:"] = "\uD83E\uDDB7", + [":top:"] = "\uD83D\uDD1D", + [":tophat:"] = "\uD83C\uDFA9", + [":track_next:"] = "⏭️", + [":track_previous:"] = "⏮️", + [":trackball:"] = "\uD83D\uDDB2️", + [":tractor:"] = "\uD83D\uDE9C", + [":traffic_light:"] = "\uD83D\uDEA5", + [":train2:"] = "\uD83D\uDE86", + [":train:"] = "\uD83D\uDE8B", + [":tram:"] = "\uD83D\uDE8A", + [":triangular_flag_on_post:"] = "\uD83D\uDEA9", + [":triangular_ruler:"] = "\uD83D\uDCD0", + [":trident:"] = "\uD83D\uDD31", + [":triumph:"] = "\uD83D\uDE24", + [":trolleybus:"] = "\uD83D\uDE8E", + [":trophy:"] = "\uD83C\uDFC6", + [":tropical_drink:"] = "\uD83C\uDF79", + [":tropical_fish:"] = "\uD83D\uDC20", + [":truck:"] = "\uD83D\uDE9A", + [":trumpet:"] = "\uD83C\uDFBA", + [":tulip:"] = "\uD83C\uDF37", + [":tumbler_glass:"] = "\uD83E\uDD43", + [":turkey:"] = "\uD83E\uDD83", + [":turtle:"] = "\uD83D\uDC22", + [":tuxedo_tone1:"] = "\uD83E\uDD35\uD83C\uDFFB", + [":tuxedo_tone2:"] = "\uD83E\uDD35\uD83C\uDFFC", + [":tuxedo_tone3:"] = "\uD83E\uDD35\uD83C\uDFFD", + [":tuxedo_tone4:"] = "\uD83E\uDD35\uD83C\uDFFE", + [":tuxedo_tone5:"] = "\uD83E\uDD35\uD83C\uDFFF", + [":tv:"] = "\uD83D\uDCFA", + [":twisted_rightwards_arrows:"] = "\uD83D\uDD00", + [":two:"] = "2️⃣", + [":two_hearts:"] = "\uD83D\uDC95", + [":two_men_holding_hands:"] = "\uD83D\uDC6C", + [":two_women_holding_hands:"] = "\uD83D\uDC6D", + [":u5272:"] = "\uD83C\uDE39", + [":u5408:"] = "\uD83C\uDE34", + [":u55b6:"] = "\uD83C\uDE3A", + [":u6307:"] = "\uD83C\uDE2F", + [":u6708:"] = "\uD83C\uDE37️", + [":u6709:"] = "\uD83C\uDE36", + [":u6e80:"] = "\uD83C\uDE35", + [":u7121:"] = "\uD83C\uDE1A", + [":u7533:"] = "\uD83C\uDE38", + [":u7981:"] = "\uD83C\uDE32", + [":u7a7a:"] = "\uD83C\uDE33", + [":umbrella2:"] = "☂️", + [":umbrella:"] = "☔", + [":umbrella_on_ground:"] = "⛱️", + [":unamused:"] = "\uD83D\uDE12", + [":underage:"] = "\uD83D\uDD1E", + [":unicorn:"] = "\uD83E\uDD84", + [":unicorn_face:"] = "\uD83E\uDD84", + [":united_nations:"] = "\uD83C\uDDFA\uD83C\uDDF3", + [":unlock:"] = "\uD83D\uDD13", + [":up:"] = "\uD83C\uDD99", + [":upside_down:"] = "\uD83D\uDE43", + [":upside_down_face:"] = "\uD83D\uDE43", + [":urn:"] = "⚱️", + [":v:"] = "✌️", + [":v::skin-tone-1:"] = "✌\uD83C\uDFFB", + [":v::skin-tone-2:"] = "✌\uD83C\uDFFC", + [":v::skin-tone-3:"] = "✌\uD83C\uDFFD", + [":v::skin-tone-4:"] = "✌\uD83C\uDFFE", + [":v::skin-tone-5:"] = "✌\uD83C\uDFFF", + [":v_tone1:"] = "✌\uD83C\uDFFB", + [":v_tone2:"] = "✌\uD83C\uDFFC", + [":v_tone3:"] = "✌\uD83C\uDFFD", + [":v_tone4:"] = "✌\uD83C\uDFFE", + [":v_tone5:"] = "✌\uD83C\uDFFF", + [":vampire:"] = "\uD83E\uDDDB", + [":vampire::skin-tone-1:"] = "\uD83E\uDDDB\uD83C\uDFFB", + [":vampire::skin-tone-2:"] = "\uD83E\uDDDB\uD83C\uDFFC", + [":vampire::skin-tone-3:"] = "\uD83E\uDDDB\uD83C\uDFFD", + [":vampire::skin-tone-4:"] = "\uD83E\uDDDB\uD83C\uDFFE", + [":vampire::skin-tone-5:"] = "\uD83E\uDDDB\uD83C\uDFFF", + [":vampire_dark_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFF", + [":vampire_light_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFB", + [":vampire_medium_dark_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFE", + [":vampire_medium_light_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFC", + [":vampire_medium_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFD", + [":vampire_tone1:"] = "\uD83E\uDDDB\uD83C\uDFFB", + [":vampire_tone2:"] = "\uD83E\uDDDB\uD83C\uDFFC", + [":vampire_tone3:"] = "\uD83E\uDDDB\uD83C\uDFFD", + [":vampire_tone4:"] = "\uD83E\uDDDB\uD83C\uDFFE", + [":vampire_tone5:"] = "\uD83E\uDDDB\uD83C\uDFFF", + [":vertical_traffic_light:"] = "\uD83D\uDEA6", + [":vhs:"] = "\uD83D\uDCFC", + [":vibration_mode:"] = "\uD83D\uDCF3", + [":video_camera:"] = "\uD83D\uDCF9", + [":video_game:"] = "\uD83C\uDFAE", + [":violin:"] = "\uD83C\uDFBB", + [":virgo:"] = "♍", + [":volcano:"] = "\uD83C\uDF0B", + [":volleyball:"] = "\uD83C\uDFD0", + [":vs:"] = "\uD83C\uDD9A", + [":vulcan:"] = "\uD83D\uDD96", + [":vulcan::skin-tone-1:"] = "\uD83D\uDD96\uD83C\uDFFB", + [":vulcan::skin-tone-2:"] = "\uD83D\uDD96\uD83C\uDFFC", + [":vulcan::skin-tone-3:"] = "\uD83D\uDD96\uD83C\uDFFD", + [":vulcan::skin-tone-4:"] = "\uD83D\uDD96\uD83C\uDFFE", + [":vulcan::skin-tone-5:"] = "\uD83D\uDD96\uD83C\uDFFF", + [":vulcan_tone1:"] = "\uD83D\uDD96\uD83C\uDFFB", + [":vulcan_tone2:"] = "\uD83D\uDD96\uD83C\uDFFC", + [":vulcan_tone3:"] = "\uD83D\uDD96\uD83C\uDFFD", + [":vulcan_tone4:"] = "\uD83D\uDD96\uD83C\uDFFE", + [":vulcan_tone5:"] = "\uD83D\uDD96\uD83C\uDFFF", + [":waffle:"] = "\uD83E\uDDC7", + [":wales:"] = "\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73\uDB40\uDC7F", + [":walking:"] = "\uD83D\uDEB6", + [":walking::skin-tone-1:"] = "\uD83D\uDEB6\uD83C\uDFFB", + [":walking::skin-tone-2:"] = "\uD83D\uDEB6\uD83C\uDFFC", + [":walking::skin-tone-3:"] = "\uD83D\uDEB6\uD83C\uDFFD", + [":walking::skin-tone-4:"] = "\uD83D\uDEB6\uD83C\uDFFE", + [":walking::skin-tone-5:"] = "\uD83D\uDEB6\uD83C\uDFFF", + [":walking_tone1:"] = "\uD83D\uDEB6\uD83C\uDFFB", + [":walking_tone2:"] = "\uD83D\uDEB6\uD83C\uDFFC", + [":walking_tone3:"] = "\uD83D\uDEB6\uD83C\uDFFD", + [":walking_tone4:"] = "\uD83D\uDEB6\uD83C\uDFFE", + [":walking_tone5:"] = "\uD83D\uDEB6\uD83C\uDFFF", + [":waning_crescent_moon:"] = "\uD83C\uDF18", + [":waning_gibbous_moon:"] = "\uD83C\uDF16", + [":warning:"] = "⚠️", + [":wastebasket:"] = "\uD83D\uDDD1️", + [":watch:"] = "⌚", + [":water_buffalo:"] = "\uD83D\uDC03", + [":water_polo:"] = "\uD83E\uDD3D", + [":water_polo::skin-tone-1:"] = "\uD83E\uDD3D\uD83C\uDFFB", + [":water_polo::skin-tone-2:"] = "\uD83E\uDD3D\uD83C\uDFFC", + [":water_polo::skin-tone-3:"] = "\uD83E\uDD3D\uD83C\uDFFD", + [":water_polo::skin-tone-4:"] = "\uD83E\uDD3D\uD83C\uDFFE", + [":water_polo::skin-tone-5:"] = "\uD83E\uDD3D\uD83C\uDFFF", + [":water_polo_tone1:"] = "\uD83E\uDD3D\uD83C\uDFFB", + [":water_polo_tone2:"] = "\uD83E\uDD3D\uD83C\uDFFC", + [":water_polo_tone3:"] = "\uD83E\uDD3D\uD83C\uDFFD", + [":water_polo_tone4:"] = "\uD83E\uDD3D\uD83C\uDFFE", + [":water_polo_tone5:"] = "\uD83E\uDD3D\uD83C\uDFFF", + [":watermelon:"] = "\uD83C\uDF49", + [":wave:"] = "\uD83D\uDC4B", + [":wave::skin-tone-1:"] = "\uD83D\uDC4B\uD83C\uDFFB", + [":wave::skin-tone-2:"] = "\uD83D\uDC4B\uD83C\uDFFC", + [":wave::skin-tone-3:"] = "\uD83D\uDC4B\uD83C\uDFFD", + [":wave::skin-tone-4:"] = "\uD83D\uDC4B\uD83C\uDFFE", + [":wave::skin-tone-5:"] = "\uD83D\uDC4B\uD83C\uDFFF", + [":wave_tone1:"] = "\uD83D\uDC4B\uD83C\uDFFB", + [":wave_tone2:"] = "\uD83D\uDC4B\uD83C\uDFFC", + [":wave_tone3:"] = "\uD83D\uDC4B\uD83C\uDFFD", + [":wave_tone4:"] = "\uD83D\uDC4B\uD83C\uDFFE", + [":wave_tone5:"] = "\uD83D\uDC4B\uD83C\uDFFF", + [":wavy_dash:"] = "〰️", + [":waxing_crescent_moon:"] = "\uD83C\uDF12", + [":waxing_gibbous_moon:"] = "\uD83C\uDF14", + [":wc:"] = "\uD83D\uDEBE", + [":weary:"] = "\uD83D\uDE29", + [":wedding:"] = "\uD83D\uDC92", + [":weight_lifter:"] = "\uD83C\uDFCB️", + [":weight_lifter::skin-tone-1:"] = "\uD83C\uDFCB\uD83C\uDFFB", + [":weight_lifter::skin-tone-2:"] = "\uD83C\uDFCB\uD83C\uDFFC", + [":weight_lifter::skin-tone-3:"] = "\uD83C\uDFCB\uD83C\uDFFD", + [":weight_lifter::skin-tone-4:"] = "\uD83C\uDFCB\uD83C\uDFFE", + [":weight_lifter::skin-tone-5:"] = "\uD83C\uDFCB\uD83C\uDFFF", + [":weight_lifter_tone1:"] = "\uD83C\uDFCB\uD83C\uDFFB", + [":weight_lifter_tone2:"] = "\uD83C\uDFCB\uD83C\uDFFC", + [":weight_lifter_tone3:"] = "\uD83C\uDFCB\uD83C\uDFFD", + [":weight_lifter_tone4:"] = "\uD83C\uDFCB\uD83C\uDFFE", + [":weight_lifter_tone5:"] = "\uD83C\uDFCB\uD83C\uDFFF", + [":whale2:"] = "\uD83D\uDC0B", + [":whale:"] = "\uD83D\uDC33", + [":wheel_of_dharma:"] = "☸️", + [":wheelchair:"] = "♿", + [":whisky:"] = "\uD83E\uDD43", + [":white_check_mark:"] = "✅", + [":white_circle:"] = "⚪", + [":white_flower:"] = "\uD83D\uDCAE", + [":white_frowning_face:"] = "☹️", + [":white_heart:"] = "\uD83E\uDD0D", + [":white_large_square:"] = "⬜", + [":white_medium_small_square:"] = "◽", + [":white_medium_square:"] = "◻️", + [":white_small_square:"] = "▫️", + [":white_square_button:"] = "\uD83D\uDD33", + [":white_sun_behind_cloud:"] = "\uD83C\uDF25️", + [":white_sun_behind_cloud_with_rain:"] = "\uD83C\uDF26️", + [":white_sun_cloud:"] = "\uD83C\uDF25️", + [":white_sun_rain_cloud:"] = "\uD83C\uDF26️", + [":white_sun_small_cloud:"] = "\uD83C\uDF24️", + [":white_sun_with_small_cloud:"] = "\uD83C\uDF24️", + [":wilted_flower:"] = "\uD83E\uDD40", + [":wilted_rose:"] = "\uD83E\uDD40", + [":wind_blowing_face:"] = "\uD83C\uDF2C️", + [":wind_chime:"] = "\uD83C\uDF90", + [":wine_glass:"] = "\uD83C\uDF77", + [":wink:"] = "\uD83D\uDE09", + [":wolf:"] = "\uD83D\uDC3A", + [":woman:"] = "\uD83D\uDC69", + [":woman::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB", + [":woman::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC", + [":woman::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD", + [":woman::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE", + [":woman::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF", + [":woman_artist:"] = "\uD83D\uDC69\u200D\uD83C\uDFA8", + [":woman_artist::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFA8", + [":woman_artist::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFA8", + [":woman_artist::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFA8", + [":woman_artist::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFA8", + [":woman_artist::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFA8", + [":woman_artist_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFA8", + [":woman_artist_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFA8", + [":woman_artist_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFA8", + [":woman_artist_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFA8", + [":woman_artist_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFA8", + [":woman_artist_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFA8", + [":woman_artist_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFA8", + [":woman_artist_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFA8", + [":woman_artist_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFA8", + [":woman_artist_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFA8", + [":woman_astronaut:"] = "\uD83D\uDC69\u200D\uD83D\uDE80", + [":woman_astronaut::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDE80", + [":woman_astronaut::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDE80", + [":woman_astronaut::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDE80", + [":woman_astronaut::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDE80", + [":woman_astronaut::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDE80", + [":woman_astronaut_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDE80", + [":woman_astronaut_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDE80", + [":woman_astronaut_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDE80", + [":woman_astronaut_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDE80", + [":woman_astronaut_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDE80", + [":woman_astronaut_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDE80", + [":woman_astronaut_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDE80", + [":woman_astronaut_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDE80", + [":woman_astronaut_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDE80", + [":woman_astronaut_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDE80", + [":woman_bald:"] = "\uD83D\uDC69\u200D\uD83E\uDDB2", + [":woman_bald::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB2", + [":woman_bald::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB2", + [":woman_bald::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB2", + [":woman_bald::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB2", + [":woman_bald::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB2", + [":woman_bald_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB2", + [":woman_bald_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB2", + [":woman_bald_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB2", + [":woman_bald_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB2", + [":woman_bald_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB2", + [":woman_bald_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB2", + [":woman_bald_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB2", + [":woman_bald_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB2", + [":woman_bald_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB2", + [":woman_bald_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB2", + [":woman_biking:"] = "\uD83D\uDEB4\u200D♀️", + [":woman_biking::skin-tone-1:"] = "\uD83D\uDEB4\uD83C\uDFFB\u200D♀️", + [":woman_biking::skin-tone-2:"] = "\uD83D\uDEB4\uD83C\uDFFC\u200D♀️", + [":woman_biking::skin-tone-3:"] = "\uD83D\uDEB4\uD83C\uDFFD\u200D♀️", + [":woman_biking::skin-tone-4:"] = "\uD83D\uDEB4\uD83C\uDFFE\u200D♀️", + [":woman_biking::skin-tone-5:"] = "\uD83D\uDEB4\uD83C\uDFFF\u200D♀️", + [":woman_biking_dark_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFF\u200D♀️", + [":woman_biking_light_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFB\u200D♀️", + [":woman_biking_medium_dark_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFE\u200D♀️", + [":woman_biking_medium_light_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFC\u200D♀️", + [":woman_biking_medium_skin_tone:"] = "\uD83D\uDEB4\uD83C\uDFFD\u200D♀️", + [":woman_biking_tone1:"] = "\uD83D\uDEB4\uD83C\uDFFB\u200D♀️", + [":woman_biking_tone2:"] = "\uD83D\uDEB4\uD83C\uDFFC\u200D♀️", + [":woman_biking_tone3:"] = "\uD83D\uDEB4\uD83C\uDFFD\u200D♀️", + [":woman_biking_tone4:"] = "\uD83D\uDEB4\uD83C\uDFFE\u200D♀️", + [":woman_biking_tone5:"] = "\uD83D\uDEB4\uD83C\uDFFF\u200D♀️", + [":woman_bouncing_ball:"] = "⛹️\u200D♀️", + [":woman_bouncing_ball::skin-tone-1:"] = "⛹\uD83C\uDFFB\u200D♀️", + [":woman_bouncing_ball::skin-tone-2:"] = "⛹\uD83C\uDFFC\u200D♀️", + [":woman_bouncing_ball::skin-tone-3:"] = "⛹\uD83C\uDFFD\u200D♀️", + [":woman_bouncing_ball::skin-tone-4:"] = "⛹\uD83C\uDFFE\u200D♀️", + [":woman_bouncing_ball::skin-tone-5:"] = "⛹\uD83C\uDFFF\u200D♀️", + [":woman_bouncing_ball_dark_skin_tone:"] = "⛹\uD83C\uDFFF\u200D♀️", + [":woman_bouncing_ball_light_skin_tone:"] = "⛹\uD83C\uDFFB\u200D♀️", + [":woman_bouncing_ball_medium_dark_skin_tone:"] = "⛹\uD83C\uDFFE\u200D♀️", + [":woman_bouncing_ball_medium_light_skin_tone:"] = "⛹\uD83C\uDFFC\u200D♀️", + [":woman_bouncing_ball_medium_skin_tone:"] = "⛹\uD83C\uDFFD\u200D♀️", + [":woman_bouncing_ball_tone1:"] = "⛹\uD83C\uDFFB\u200D♀️", + [":woman_bouncing_ball_tone2:"] = "⛹\uD83C\uDFFC\u200D♀️", + [":woman_bouncing_ball_tone3:"] = "⛹\uD83C\uDFFD\u200D♀️", + [":woman_bouncing_ball_tone4:"] = "⛹\uD83C\uDFFE\u200D♀️", + [":woman_bouncing_ball_tone5:"] = "⛹\uD83C\uDFFF\u200D♀️", + [":woman_bowing:"] = "\uD83D\uDE47\u200D♀️", + [":woman_bowing::skin-tone-1:"] = "\uD83D\uDE47\uD83C\uDFFB\u200D♀️", + [":woman_bowing::skin-tone-2:"] = "\uD83D\uDE47\uD83C\uDFFC\u200D♀️", + [":woman_bowing::skin-tone-3:"] = "\uD83D\uDE47\uD83C\uDFFD\u200D♀️", + [":woman_bowing::skin-tone-4:"] = "\uD83D\uDE47\uD83C\uDFFE\u200D♀️", + [":woman_bowing::skin-tone-5:"] = "\uD83D\uDE47\uD83C\uDFFF\u200D♀️", + [":woman_bowing_dark_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFF\u200D♀️", + [":woman_bowing_light_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFB\u200D♀️", + [":woman_bowing_medium_dark_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFE\u200D♀️", + [":woman_bowing_medium_light_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFC\u200D♀️", + [":woman_bowing_medium_skin_tone:"] = "\uD83D\uDE47\uD83C\uDFFD\u200D♀️", + [":woman_bowing_tone1:"] = "\uD83D\uDE47\uD83C\uDFFB\u200D♀️", + [":woman_bowing_tone2:"] = "\uD83D\uDE47\uD83C\uDFFC\u200D♀️", + [":woman_bowing_tone3:"] = "\uD83D\uDE47\uD83C\uDFFD\u200D♀️", + [":woman_bowing_tone4:"] = "\uD83D\uDE47\uD83C\uDFFE\u200D♀️", + [":woman_bowing_tone5:"] = "\uD83D\uDE47\uD83C\uDFFF\u200D♀️", + [":woman_cartwheeling:"] = "\uD83E\uDD38\u200D♀️", + [":woman_cartwheeling::skin-tone-1:"] = "\uD83E\uDD38\uD83C\uDFFB\u200D♀️", + [":woman_cartwheeling::skin-tone-2:"] = "\uD83E\uDD38\uD83C\uDFFC\u200D♀️", + [":woman_cartwheeling::skin-tone-3:"] = "\uD83E\uDD38\uD83C\uDFFD\u200D♀️", + [":woman_cartwheeling::skin-tone-4:"] = "\uD83E\uDD38\uD83C\uDFFE\u200D♀️", + [":woman_cartwheeling::skin-tone-5:"] = "\uD83E\uDD38\uD83C\uDFFF\u200D♀️", + [":woman_cartwheeling_dark_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFF\u200D♀️", + [":woman_cartwheeling_light_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFB\u200D♀️", + [":woman_cartwheeling_medium_dark_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFE\u200D♀️", + [":woman_cartwheeling_medium_light_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFC\u200D♀️", + [":woman_cartwheeling_medium_skin_tone:"] = "\uD83E\uDD38\uD83C\uDFFD\u200D♀️", + [":woman_cartwheeling_tone1:"] = "\uD83E\uDD38\uD83C\uDFFB\u200D♀️", + [":woman_cartwheeling_tone2:"] = "\uD83E\uDD38\uD83C\uDFFC\u200D♀️", + [":woman_cartwheeling_tone3:"] = "\uD83E\uDD38\uD83C\uDFFD\u200D♀️", + [":woman_cartwheeling_tone4:"] = "\uD83E\uDD38\uD83C\uDFFE\u200D♀️", + [":woman_cartwheeling_tone5:"] = "\uD83E\uDD38\uD83C\uDFFF\u200D♀️", + [":woman_climbing:"] = "\uD83E\uDDD7\u200D♀️", + [":woman_climbing::skin-tone-1:"] = "\uD83E\uDDD7\uD83C\uDFFB\u200D♀️", + [":woman_climbing::skin-tone-2:"] = "\uD83E\uDDD7\uD83C\uDFFC\u200D♀️", + [":woman_climbing::skin-tone-3:"] = "\uD83E\uDDD7\uD83C\uDFFD\u200D♀️", + [":woman_climbing::skin-tone-4:"] = "\uD83E\uDDD7\uD83C\uDFFE\u200D♀️", + [":woman_climbing::skin-tone-5:"] = "\uD83E\uDDD7\uD83C\uDFFF\u200D♀️", + [":woman_climbing_dark_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFF\u200D♀️", + [":woman_climbing_light_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFB\u200D♀️", + [":woman_climbing_medium_dark_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFE\u200D♀️", + [":woman_climbing_medium_light_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFC\u200D♀️", + [":woman_climbing_medium_skin_tone:"] = "\uD83E\uDDD7\uD83C\uDFFD\u200D♀️", + [":woman_climbing_tone1:"] = "\uD83E\uDDD7\uD83C\uDFFB\u200D♀️", + [":woman_climbing_tone2:"] = "\uD83E\uDDD7\uD83C\uDFFC\u200D♀️", + [":woman_climbing_tone3:"] = "\uD83E\uDDD7\uD83C\uDFFD\u200D♀️", + [":woman_climbing_tone4:"] = "\uD83E\uDDD7\uD83C\uDFFE\u200D♀️", + [":woman_climbing_tone5:"] = "\uD83E\uDDD7\uD83C\uDFFF\u200D♀️", + [":woman_construction_worker:"] = "\uD83D\uDC77\u200D♀️", + [":woman_construction_worker::skin-tone-1:"] = "\uD83D\uDC77\uD83C\uDFFB\u200D♀️", + [":woman_construction_worker::skin-tone-2:"] = "\uD83D\uDC77\uD83C\uDFFC\u200D♀️", + [":woman_construction_worker::skin-tone-3:"] = "\uD83D\uDC77\uD83C\uDFFD\u200D♀️", + [":woman_construction_worker::skin-tone-4:"] = "\uD83D\uDC77\uD83C\uDFFE\u200D♀️", + [":woman_construction_worker::skin-tone-5:"] = "\uD83D\uDC77\uD83C\uDFFF\u200D♀️", + [":woman_construction_worker_dark_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFF\u200D♀️", + [":woman_construction_worker_light_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFB\u200D♀️", + [":woman_construction_worker_medium_dark_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFE\u200D♀️", + [":woman_construction_worker_medium_light_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFC\u200D♀️", + [":woman_construction_worker_medium_skin_tone:"] = "\uD83D\uDC77\uD83C\uDFFD\u200D♀️", + [":woman_construction_worker_tone1:"] = "\uD83D\uDC77\uD83C\uDFFB\u200D♀️", + [":woman_construction_worker_tone2:"] = "\uD83D\uDC77\uD83C\uDFFC\u200D♀️", + [":woman_construction_worker_tone3:"] = "\uD83D\uDC77\uD83C\uDFFD\u200D♀️", + [":woman_construction_worker_tone4:"] = "\uD83D\uDC77\uD83C\uDFFE\u200D♀️", + [":woman_construction_worker_tone5:"] = "\uD83D\uDC77\uD83C\uDFFF\u200D♀️", + [":woman_cook:"] = "\uD83D\uDC69\u200D\uD83C\uDF73", + [":woman_cook::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF73", + [":woman_cook::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF73", + [":woman_cook::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF73", + [":woman_cook::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF73", + [":woman_cook::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF73", + [":woman_cook_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF73", + [":woman_cook_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF73", + [":woman_cook_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF73", + [":woman_cook_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF73", + [":woman_cook_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF73", + [":woman_cook_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF73", + [":woman_cook_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF73", + [":woman_cook_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF73", + [":woman_cook_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF73", + [":woman_cook_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF73", + [":woman_curly_haired:"] = "\uD83D\uDC69\u200D\uD83E\uDDB1", + [":woman_curly_haired::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB1", + [":woman_curly_haired::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB1", + [":woman_curly_haired::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB1", + [":woman_curly_haired::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB1", + [":woman_curly_haired::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB1", + [":woman_curly_haired_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB1", + [":woman_curly_haired_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB1", + [":woman_curly_haired_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB1", + [":woman_curly_haired_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB1", + [":woman_curly_haired_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB1", + [":woman_curly_haired_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB1", + [":woman_curly_haired_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB1", + [":woman_curly_haired_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB1", + [":woman_curly_haired_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB1", + [":woman_curly_haired_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB1", + [":woman_detective:"] = "\uD83D\uDD75️\u200D♀️", + [":woman_detective::skin-tone-1:"] = "\uD83D\uDD75\uD83C\uDFFB\u200D♀️", + [":woman_detective::skin-tone-2:"] = "\uD83D\uDD75\uD83C\uDFFC\u200D♀️", + [":woman_detective::skin-tone-3:"] = "\uD83D\uDD75\uD83C\uDFFD\u200D♀️", + [":woman_detective::skin-tone-4:"] = "\uD83D\uDD75\uD83C\uDFFE\u200D♀️", + [":woman_detective::skin-tone-5:"] = "\uD83D\uDD75\uD83C\uDFFF\u200D♀️", + [":woman_detective_dark_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFF\u200D♀️", + [":woman_detective_light_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFB\u200D♀️", + [":woman_detective_medium_dark_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFE\u200D♀️", + [":woman_detective_medium_light_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFC\u200D♀️", + [":woman_detective_medium_skin_tone:"] = "\uD83D\uDD75\uD83C\uDFFD\u200D♀️", + [":woman_detective_tone1:"] = "\uD83D\uDD75\uD83C\uDFFB\u200D♀️", + [":woman_detective_tone2:"] = "\uD83D\uDD75\uD83C\uDFFC\u200D♀️", + [":woman_detective_tone3:"] = "\uD83D\uDD75\uD83C\uDFFD\u200D♀️", + [":woman_detective_tone4:"] = "\uD83D\uDD75\uD83C\uDFFE\u200D♀️", + [":woman_detective_tone5:"] = "\uD83D\uDD75\uD83C\uDFFF\u200D♀️", + [":woman_elf:"] = "\uD83E\uDDDD\u200D♀️", + [":woman_elf::skin-tone-1:"] = "\uD83E\uDDDD\uD83C\uDFFB\u200D♀️", + [":woman_elf::skin-tone-2:"] = "\uD83E\uDDDD\uD83C\uDFFC\u200D♀️", + [":woman_elf::skin-tone-3:"] = "\uD83E\uDDDD\uD83C\uDFFD\u200D♀️", + [":woman_elf::skin-tone-4:"] = "\uD83E\uDDDD\uD83C\uDFFE\u200D♀️", + [":woman_elf::skin-tone-5:"] = "\uD83E\uDDDD\uD83C\uDFFF\u200D♀️", + [":woman_elf_dark_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFF\u200D♀️", + [":woman_elf_light_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFB\u200D♀️", + [":woman_elf_medium_dark_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFE\u200D♀️", + [":woman_elf_medium_light_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFC\u200D♀️", + [":woman_elf_medium_skin_tone:"] = "\uD83E\uDDDD\uD83C\uDFFD\u200D♀️", + [":woman_elf_tone1:"] = "\uD83E\uDDDD\uD83C\uDFFB\u200D♀️", + [":woman_elf_tone2:"] = "\uD83E\uDDDD\uD83C\uDFFC\u200D♀️", + [":woman_elf_tone3:"] = "\uD83E\uDDDD\uD83C\uDFFD\u200D♀️", + [":woman_elf_tone4:"] = "\uD83E\uDDDD\uD83C\uDFFE\u200D♀️", + [":woman_elf_tone5:"] = "\uD83E\uDDDD\uD83C\uDFFF\u200D♀️", + [":woman_facepalming:"] = "\uD83E\uDD26\u200D♀️", + [":woman_facepalming::skin-tone-1:"] = "\uD83E\uDD26\uD83C\uDFFB\u200D♀️", + [":woman_facepalming::skin-tone-2:"] = "\uD83E\uDD26\uD83C\uDFFC\u200D♀️", + [":woman_facepalming::skin-tone-3:"] = "\uD83E\uDD26\uD83C\uDFFD\u200D♀️", + [":woman_facepalming::skin-tone-4:"] = "\uD83E\uDD26\uD83C\uDFFE\u200D♀️", + [":woman_facepalming::skin-tone-5:"] = "\uD83E\uDD26\uD83C\uDFFF\u200D♀️", + [":woman_facepalming_dark_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFF\u200D♀️", + [":woman_facepalming_light_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFB\u200D♀️", + [":woman_facepalming_medium_dark_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFE\u200D♀️", + [":woman_facepalming_medium_light_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFC\u200D♀️", + [":woman_facepalming_medium_skin_tone:"] = "\uD83E\uDD26\uD83C\uDFFD\u200D♀️", + [":woman_facepalming_tone1:"] = "\uD83E\uDD26\uD83C\uDFFB\u200D♀️", + [":woman_facepalming_tone2:"] = "\uD83E\uDD26\uD83C\uDFFC\u200D♀️", + [":woman_facepalming_tone3:"] = "\uD83E\uDD26\uD83C\uDFFD\u200D♀️", + [":woman_facepalming_tone4:"] = "\uD83E\uDD26\uD83C\uDFFE\u200D♀️", + [":woman_facepalming_tone5:"] = "\uD83E\uDD26\uD83C\uDFFF\u200D♀️", + [":woman_factory_worker:"] = "\uD83D\uDC69\u200D\uD83C\uDFED", + [":woman_factory_worker::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFED", + [":woman_factory_worker::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFED", + [":woman_factory_worker::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFED", + [":woman_factory_worker::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFED", + [":woman_factory_worker::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFED", + [":woman_factory_worker_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFED", + [":woman_factory_worker_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFED", + [":woman_factory_worker_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFED", + [":woman_factory_worker_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFED", + [":woman_factory_worker_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFED", + [":woman_factory_worker_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFED", + [":woman_factory_worker_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFED", + [":woman_factory_worker_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFED", + [":woman_factory_worker_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFED", + [":woman_factory_worker_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFED", + [":woman_fairy:"] = "\uD83E\uDDDA\u200D♀️", + [":woman_fairy::skin-tone-1:"] = "\uD83E\uDDDA\uD83C\uDFFB\u200D♀️", + [":woman_fairy::skin-tone-2:"] = "\uD83E\uDDDA\uD83C\uDFFC\u200D♀️", + [":woman_fairy::skin-tone-3:"] = "\uD83E\uDDDA\uD83C\uDFFD\u200D♀️", + [":woman_fairy::skin-tone-4:"] = "\uD83E\uDDDA\uD83C\uDFFE\u200D♀️", + [":woman_fairy::skin-tone-5:"] = "\uD83E\uDDDA\uD83C\uDFFF\u200D♀️", + [":woman_fairy_dark_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFF\u200D♀️", + [":woman_fairy_light_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFB\u200D♀️", + [":woman_fairy_medium_dark_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFE\u200D♀️", + [":woman_fairy_medium_light_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFC\u200D♀️", + [":woman_fairy_medium_skin_tone:"] = "\uD83E\uDDDA\uD83C\uDFFD\u200D♀️", + [":woman_fairy_tone1:"] = "\uD83E\uDDDA\uD83C\uDFFB\u200D♀️", + [":woman_fairy_tone2:"] = "\uD83E\uDDDA\uD83C\uDFFC\u200D♀️", + [":woman_fairy_tone3:"] = "\uD83E\uDDDA\uD83C\uDFFD\u200D♀️", + [":woman_fairy_tone4:"] = "\uD83E\uDDDA\uD83C\uDFFE\u200D♀️", + [":woman_fairy_tone5:"] = "\uD83E\uDDDA\uD83C\uDFFF\u200D♀️", + [":woman_farmer:"] = "\uD83D\uDC69\u200D\uD83C\uDF3E", + [":woman_farmer::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF3E", + [":woman_farmer::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF3E", + [":woman_farmer::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF3E", + [":woman_farmer::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF3E", + [":woman_farmer::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF3E", + [":woman_farmer_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF3E", + [":woman_farmer_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF3E", + [":woman_farmer_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF3E", + [":woman_farmer_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF3E", + [":woman_farmer_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF3E", + [":woman_farmer_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF3E", + [":woman_farmer_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF3E", + [":woman_farmer_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF3E", + [":woman_farmer_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF3E", + [":woman_farmer_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF3E", + [":woman_firefighter:"] = "\uD83D\uDC69\u200D\uD83D\uDE92", + [":woman_firefighter::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDE92", + [":woman_firefighter::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDE92", + [":woman_firefighter::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDE92", + [":woman_firefighter::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDE92", + [":woman_firefighter::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDE92", + [":woman_firefighter_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDE92", + [":woman_firefighter_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDE92", + [":woman_firefighter_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDE92", + [":woman_firefighter_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDE92", + [":woman_firefighter_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDE92", + [":woman_firefighter_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDE92", + [":woman_firefighter_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDE92", + [":woman_firefighter_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDE92", + [":woman_firefighter_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDE92", + [":woman_firefighter_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDE92", + [":woman_frowning:"] = "\uD83D\uDE4D\u200D♀️", + [":woman_frowning::skin-tone-1:"] = "\uD83D\uDE4D\uD83C\uDFFB\u200D♀️", + [":woman_frowning::skin-tone-2:"] = "\uD83D\uDE4D\uD83C\uDFFC\u200D♀️", + [":woman_frowning::skin-tone-3:"] = "\uD83D\uDE4D\uD83C\uDFFD\u200D♀️", + [":woman_frowning::skin-tone-4:"] = "\uD83D\uDE4D\uD83C\uDFFE\u200D♀️", + [":woman_frowning::skin-tone-5:"] = "\uD83D\uDE4D\uD83C\uDFFF\u200D♀️", + [":woman_frowning_dark_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFF\u200D♀️", + [":woman_frowning_light_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFB\u200D♀️", + [":woman_frowning_medium_dark_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFE\u200D♀️", + [":woman_frowning_medium_light_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFC\u200D♀️", + [":woman_frowning_medium_skin_tone:"] = "\uD83D\uDE4D\uD83C\uDFFD\u200D♀️", + [":woman_frowning_tone1:"] = "\uD83D\uDE4D\uD83C\uDFFB\u200D♀️", + [":woman_frowning_tone2:"] = "\uD83D\uDE4D\uD83C\uDFFC\u200D♀️", + [":woman_frowning_tone3:"] = "\uD83D\uDE4D\uD83C\uDFFD\u200D♀️", + [":woman_frowning_tone4:"] = "\uD83D\uDE4D\uD83C\uDFFE\u200D♀️", + [":woman_frowning_tone5:"] = "\uD83D\uDE4D\uD83C\uDFFF\u200D♀️", + [":woman_genie:"] = "\uD83E\uDDDE\u200D♀️", + [":woman_gesturing_no:"] = "\uD83D\uDE45\u200D♀️", + [":woman_gesturing_no::skin-tone-1:"] = "\uD83D\uDE45\uD83C\uDFFB\u200D♀️", + [":woman_gesturing_no::skin-tone-2:"] = "\uD83D\uDE45\uD83C\uDFFC\u200D♀️", + [":woman_gesturing_no::skin-tone-3:"] = "\uD83D\uDE45\uD83C\uDFFD\u200D♀️", + [":woman_gesturing_no::skin-tone-4:"] = "\uD83D\uDE45\uD83C\uDFFE\u200D♀️", + [":woman_gesturing_no::skin-tone-5:"] = "\uD83D\uDE45\uD83C\uDFFF\u200D♀️", + [":woman_gesturing_no_dark_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFF\u200D♀️", + [":woman_gesturing_no_light_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFB\u200D♀️", + [":woman_gesturing_no_medium_dark_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFE\u200D♀️", + [":woman_gesturing_no_medium_light_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFC\u200D♀️", + [":woman_gesturing_no_medium_skin_tone:"] = "\uD83D\uDE45\uD83C\uDFFD\u200D♀️", + [":woman_gesturing_no_tone1:"] = "\uD83D\uDE45\uD83C\uDFFB\u200D♀️", + [":woman_gesturing_no_tone2:"] = "\uD83D\uDE45\uD83C\uDFFC\u200D♀️", + [":woman_gesturing_no_tone3:"] = "\uD83D\uDE45\uD83C\uDFFD\u200D♀️", + [":woman_gesturing_no_tone4:"] = "\uD83D\uDE45\uD83C\uDFFE\u200D♀️", + [":woman_gesturing_no_tone5:"] = "\uD83D\uDE45\uD83C\uDFFF\u200D♀️", + [":woman_gesturing_ok:"] = "\uD83D\uDE46\u200D♀️", + [":woman_gesturing_ok::skin-tone-1:"] = "\uD83D\uDE46\uD83C\uDFFB\u200D♀️", + [":woman_gesturing_ok::skin-tone-2:"] = "\uD83D\uDE46\uD83C\uDFFC\u200D♀️", + [":woman_gesturing_ok::skin-tone-3:"] = "\uD83D\uDE46\uD83C\uDFFD\u200D♀️", + [":woman_gesturing_ok::skin-tone-4:"] = "\uD83D\uDE46\uD83C\uDFFE\u200D♀️", + [":woman_gesturing_ok::skin-tone-5:"] = "\uD83D\uDE46\uD83C\uDFFF\u200D♀️", + [":woman_gesturing_ok_dark_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFF\u200D♀️", + [":woman_gesturing_ok_light_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFB\u200D♀️", + [":woman_gesturing_ok_medium_dark_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFE\u200D♀️", + [":woman_gesturing_ok_medium_light_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFC\u200D♀️", + [":woman_gesturing_ok_medium_skin_tone:"] = "\uD83D\uDE46\uD83C\uDFFD\u200D♀️", + [":woman_gesturing_ok_tone1:"] = "\uD83D\uDE46\uD83C\uDFFB\u200D♀️", + [":woman_gesturing_ok_tone2:"] = "\uD83D\uDE46\uD83C\uDFFC\u200D♀️", + [":woman_gesturing_ok_tone3:"] = "\uD83D\uDE46\uD83C\uDFFD\u200D♀️", + [":woman_gesturing_ok_tone4:"] = "\uD83D\uDE46\uD83C\uDFFE\u200D♀️", + [":woman_gesturing_ok_tone5:"] = "\uD83D\uDE46\uD83C\uDFFF\u200D♀️", + [":woman_getting_face_massage:"] = "\uD83D\uDC86\u200D♀️", + [":woman_getting_face_massage::skin-tone-1:"] = "\uD83D\uDC86\uD83C\uDFFB\u200D♀️", + [":woman_getting_face_massage::skin-tone-2:"] = "\uD83D\uDC86\uD83C\uDFFC\u200D♀️", + [":woman_getting_face_massage::skin-tone-3:"] = "\uD83D\uDC86\uD83C\uDFFD\u200D♀️", + [":woman_getting_face_massage::skin-tone-4:"] = "\uD83D\uDC86\uD83C\uDFFE\u200D♀️", + [":woman_getting_face_massage::skin-tone-5:"] = "\uD83D\uDC86\uD83C\uDFFF\u200D♀️", + [":woman_getting_face_massage_dark_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFF\u200D♀️", + [":woman_getting_face_massage_light_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFB\u200D♀️", + [":woman_getting_face_massage_medium_dark_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFE\u200D♀️", + [":woman_getting_face_massage_medium_light_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFC\u200D♀️", + [":woman_getting_face_massage_medium_skin_tone:"] = "\uD83D\uDC86\uD83C\uDFFD\u200D♀️", + [":woman_getting_face_massage_tone1:"] = "\uD83D\uDC86\uD83C\uDFFB\u200D♀️", + [":woman_getting_face_massage_tone2:"] = "\uD83D\uDC86\uD83C\uDFFC\u200D♀️", + [":woman_getting_face_massage_tone3:"] = "\uD83D\uDC86\uD83C\uDFFD\u200D♀️", + [":woman_getting_face_massage_tone4:"] = "\uD83D\uDC86\uD83C\uDFFE\u200D♀️", + [":woman_getting_face_massage_tone5:"] = "\uD83D\uDC86\uD83C\uDFFF\u200D♀️", + [":woman_getting_haircut:"] = "\uD83D\uDC87\u200D♀️", + [":woman_getting_haircut::skin-tone-1:"] = "\uD83D\uDC87\uD83C\uDFFB\u200D♀️", + [":woman_getting_haircut::skin-tone-2:"] = "\uD83D\uDC87\uD83C\uDFFC\u200D♀️", + [":woman_getting_haircut::skin-tone-3:"] = "\uD83D\uDC87\uD83C\uDFFD\u200D♀️", + [":woman_getting_haircut::skin-tone-4:"] = "\uD83D\uDC87\uD83C\uDFFE\u200D♀️", + [":woman_getting_haircut::skin-tone-5:"] = "\uD83D\uDC87\uD83C\uDFFF\u200D♀️", + [":woman_getting_haircut_dark_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFF\u200D♀️", + [":woman_getting_haircut_light_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFB\u200D♀️", + [":woman_getting_haircut_medium_dark_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFE\u200D♀️", + [":woman_getting_haircut_medium_light_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFC\u200D♀️", + [":woman_getting_haircut_medium_skin_tone:"] = "\uD83D\uDC87\uD83C\uDFFD\u200D♀️", + [":woman_getting_haircut_tone1:"] = "\uD83D\uDC87\uD83C\uDFFB\u200D♀️", + [":woman_getting_haircut_tone2:"] = "\uD83D\uDC87\uD83C\uDFFC\u200D♀️", + [":woman_getting_haircut_tone3:"] = "\uD83D\uDC87\uD83C\uDFFD\u200D♀️", + [":woman_getting_haircut_tone4:"] = "\uD83D\uDC87\uD83C\uDFFE\u200D♀️", + [":woman_getting_haircut_tone5:"] = "\uD83D\uDC87\uD83C\uDFFF\u200D♀️", + [":woman_golfing:"] = "\uD83C\uDFCC️\u200D♀️", + [":woman_golfing::skin-tone-1:"] = "\uD83C\uDFCC\uD83C\uDFFB\u200D♀️", + [":woman_golfing::skin-tone-2:"] = "\uD83C\uDFCC\uD83C\uDFFC\u200D♀️", + [":woman_golfing::skin-tone-3:"] = "\uD83C\uDFCC\uD83C\uDFFD\u200D♀️", + [":woman_golfing::skin-tone-4:"] = "\uD83C\uDFCC\uD83C\uDFFE\u200D♀️", + [":woman_golfing::skin-tone-5:"] = "\uD83C\uDFCC\uD83C\uDFFF\u200D♀️", + [":woman_golfing_dark_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFF\u200D♀️", + [":woman_golfing_light_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFB\u200D♀️", + [":woman_golfing_medium_dark_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFE\u200D♀️", + [":woman_golfing_medium_light_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFC\u200D♀️", + [":woman_golfing_medium_skin_tone:"] = "\uD83C\uDFCC\uD83C\uDFFD\u200D♀️", + [":woman_golfing_tone1:"] = "\uD83C\uDFCC\uD83C\uDFFB\u200D♀️", + [":woman_golfing_tone2:"] = "\uD83C\uDFCC\uD83C\uDFFC\u200D♀️", + [":woman_golfing_tone3:"] = "\uD83C\uDFCC\uD83C\uDFFD\u200D♀️", + [":woman_golfing_tone4:"] = "\uD83C\uDFCC\uD83C\uDFFE\u200D♀️", + [":woman_golfing_tone5:"] = "\uD83C\uDFCC\uD83C\uDFFF\u200D♀️", + [":woman_guard:"] = "\uD83D\uDC82\u200D♀️", + [":woman_guard::skin-tone-1:"] = "\uD83D\uDC82\uD83C\uDFFB\u200D♀️", + [":woman_guard::skin-tone-2:"] = "\uD83D\uDC82\uD83C\uDFFC\u200D♀️", + [":woman_guard::skin-tone-3:"] = "\uD83D\uDC82\uD83C\uDFFD\u200D♀️", + [":woman_guard::skin-tone-4:"] = "\uD83D\uDC82\uD83C\uDFFE\u200D♀️", + [":woman_guard::skin-tone-5:"] = "\uD83D\uDC82\uD83C\uDFFF\u200D♀️", + [":woman_guard_dark_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFF\u200D♀️", + [":woman_guard_light_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFB\u200D♀️", + [":woman_guard_medium_dark_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFE\u200D♀️", + [":woman_guard_medium_light_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFC\u200D♀️", + [":woman_guard_medium_skin_tone:"] = "\uD83D\uDC82\uD83C\uDFFD\u200D♀️", + [":woman_guard_tone1:"] = "\uD83D\uDC82\uD83C\uDFFB\u200D♀️", + [":woman_guard_tone2:"] = "\uD83D\uDC82\uD83C\uDFFC\u200D♀️", + [":woman_guard_tone3:"] = "\uD83D\uDC82\uD83C\uDFFD\u200D♀️", + [":woman_guard_tone4:"] = "\uD83D\uDC82\uD83C\uDFFE\u200D♀️", + [":woman_guard_tone5:"] = "\uD83D\uDC82\uD83C\uDFFF\u200D♀️", + [":woman_health_worker:"] = "\uD83D\uDC69\u200D⚕️", + [":woman_health_worker::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D⚕️", + [":woman_health_worker::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D⚕️", + [":woman_health_worker::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D⚕️", + [":woman_health_worker::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D⚕️", + [":woman_health_worker::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D⚕️", + [":woman_health_worker_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D⚕️", + [":woman_health_worker_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D⚕️", + [":woman_health_worker_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D⚕️", + [":woman_health_worker_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D⚕️", + [":woman_health_worker_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D⚕️", + [":woman_health_worker_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D⚕️", + [":woman_health_worker_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D⚕️", + [":woman_health_worker_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D⚕️", + [":woman_health_worker_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D⚕️", + [":woman_health_worker_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D⚕️", + [":woman_in_lotus_position:"] = "\uD83E\uDDD8\u200D♀️", + [":woman_in_lotus_position::skin-tone-1:"] = "\uD83E\uDDD8\uD83C\uDFFB\u200D♀️", + [":woman_in_lotus_position::skin-tone-2:"] = "\uD83E\uDDD8\uD83C\uDFFC\u200D♀️", + [":woman_in_lotus_position::skin-tone-3:"] = "\uD83E\uDDD8\uD83C\uDFFD\u200D♀️", + [":woman_in_lotus_position::skin-tone-4:"] = "\uD83E\uDDD8\uD83C\uDFFE\u200D♀️", + [":woman_in_lotus_position::skin-tone-5:"] = "\uD83E\uDDD8\uD83C\uDFFF\u200D♀️", + [":woman_in_lotus_position_dark_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFF\u200D♀️", + [":woman_in_lotus_position_light_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFB\u200D♀️", + [":woman_in_lotus_position_medium_dark_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFE\u200D♀️", + [":woman_in_lotus_position_medium_light_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFC\u200D♀️", + [":woman_in_lotus_position_medium_skin_tone:"] = "\uD83E\uDDD8\uD83C\uDFFD\u200D♀️", + [":woman_in_lotus_position_tone1:"] = "\uD83E\uDDD8\uD83C\uDFFB\u200D♀️", + [":woman_in_lotus_position_tone2:"] = "\uD83E\uDDD8\uD83C\uDFFC\u200D♀️", + [":woman_in_lotus_position_tone3:"] = "\uD83E\uDDD8\uD83C\uDFFD\u200D♀️", + [":woman_in_lotus_position_tone4:"] = "\uD83E\uDDD8\uD83C\uDFFE\u200D♀️", + [":woman_in_lotus_position_tone5:"] = "\uD83E\uDDD8\uD83C\uDFFF\u200D♀️", + [":woman_in_manual_wheelchair:"] = "\uD83D\uDC69\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDBD", + [":woman_in_manual_wheelchair_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDBD", + [":woman_in_motorized_wheelchair:"] = "\uD83D\uDC69\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDBC", + [":woman_in_motorized_wheelchair_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDBC", + [":woman_in_steamy_room:"] = "\uD83E\uDDD6\u200D♀️", + [":woman_in_steamy_room::skin-tone-1:"] = "\uD83E\uDDD6\uD83C\uDFFB\u200D♀️", + [":woman_in_steamy_room::skin-tone-2:"] = "\uD83E\uDDD6\uD83C\uDFFC\u200D♀️", + [":woman_in_steamy_room::skin-tone-3:"] = "\uD83E\uDDD6\uD83C\uDFFD\u200D♀️", + [":woman_in_steamy_room::skin-tone-4:"] = "\uD83E\uDDD6\uD83C\uDFFE\u200D♀️", + [":woman_in_steamy_room::skin-tone-5:"] = "\uD83E\uDDD6\uD83C\uDFFF\u200D♀️", + [":woman_in_steamy_room_dark_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFF\u200D♀️", + [":woman_in_steamy_room_light_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFB\u200D♀️", + [":woman_in_steamy_room_medium_dark_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFE\u200D♀️", + [":woman_in_steamy_room_medium_light_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFC\u200D♀️", + [":woman_in_steamy_room_medium_skin_tone:"] = "\uD83E\uDDD6\uD83C\uDFFD\u200D♀️", + [":woman_in_steamy_room_tone1:"] = "\uD83E\uDDD6\uD83C\uDFFB\u200D♀️", + [":woman_in_steamy_room_tone2:"] = "\uD83E\uDDD6\uD83C\uDFFC\u200D♀️", + [":woman_in_steamy_room_tone3:"] = "\uD83E\uDDD6\uD83C\uDFFD\u200D♀️", + [":woman_in_steamy_room_tone4:"] = "\uD83E\uDDD6\uD83C\uDFFE\u200D♀️", + [":woman_in_steamy_room_tone5:"] = "\uD83E\uDDD6\uD83C\uDFFF\u200D♀️", + [":woman_judge:"] = "\uD83D\uDC69\u200D⚖️", + [":woman_judge::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D⚖️", + [":woman_judge::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D⚖️", + [":woman_judge::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D⚖️", + [":woman_judge::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D⚖️", + [":woman_judge::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D⚖️", + [":woman_judge_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D⚖️", + [":woman_judge_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D⚖️", + [":woman_judge_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D⚖️", + [":woman_judge_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D⚖️", + [":woman_judge_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D⚖️", + [":woman_judge_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D⚖️", + [":woman_judge_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D⚖️", + [":woman_judge_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D⚖️", + [":woman_judge_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D⚖️", + [":woman_judge_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D⚖️", + [":woman_juggling:"] = "\uD83E\uDD39\u200D♀️", + [":woman_juggling::skin-tone-1:"] = "\uD83E\uDD39\uD83C\uDFFB\u200D♀️", + [":woman_juggling::skin-tone-2:"] = "\uD83E\uDD39\uD83C\uDFFC\u200D♀️", + [":woman_juggling::skin-tone-3:"] = "\uD83E\uDD39\uD83C\uDFFD\u200D♀️", + [":woman_juggling::skin-tone-4:"] = "\uD83E\uDD39\uD83C\uDFFE\u200D♀️", + [":woman_juggling::skin-tone-5:"] = "\uD83E\uDD39\uD83C\uDFFF\u200D♀️", + [":woman_juggling_dark_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFF\u200D♀️", + [":woman_juggling_light_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFB\u200D♀️", + [":woman_juggling_medium_dark_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFE\u200D♀️", + [":woman_juggling_medium_light_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFC\u200D♀️", + [":woman_juggling_medium_skin_tone:"] = "\uD83E\uDD39\uD83C\uDFFD\u200D♀️", + [":woman_juggling_tone1:"] = "\uD83E\uDD39\uD83C\uDFFB\u200D♀️", + [":woman_juggling_tone2:"] = "\uD83E\uDD39\uD83C\uDFFC\u200D♀️", + [":woman_juggling_tone3:"] = "\uD83E\uDD39\uD83C\uDFFD\u200D♀️", + [":woman_juggling_tone4:"] = "\uD83E\uDD39\uD83C\uDFFE\u200D♀️", + [":woman_juggling_tone5:"] = "\uD83E\uDD39\uD83C\uDFFF\u200D♀️", + [":woman_kneeling:"] = "\uD83E\uDDCE\u200D♀️", + [":woman_kneeling::skin-tone-1:"] = "\uD83E\uDDCE\uD83C\uDFFB\u200D♀️", + [":woman_kneeling::skin-tone-2:"] = "\uD83E\uDDCE\uD83C\uDFFC\u200D♀️", + [":woman_kneeling::skin-tone-3:"] = "\uD83E\uDDCE\uD83C\uDFFD\u200D♀️", + [":woman_kneeling::skin-tone-4:"] = "\uD83E\uDDCE\uD83C\uDFFE\u200D♀️", + [":woman_kneeling::skin-tone-5:"] = "\uD83E\uDDCE\uD83C\uDFFF\u200D♀️", + [":woman_kneeling_dark_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFF\u200D♀️", + [":woman_kneeling_light_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFB\u200D♀️", + [":woman_kneeling_medium_dark_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFE\u200D♀️", + [":woman_kneeling_medium_light_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFC\u200D♀️", + [":woman_kneeling_medium_skin_tone:"] = "\uD83E\uDDCE\uD83C\uDFFD\u200D♀️", + [":woman_kneeling_tone1:"] = "\uD83E\uDDCE\uD83C\uDFFB\u200D♀️", + [":woman_kneeling_tone2:"] = "\uD83E\uDDCE\uD83C\uDFFC\u200D♀️", + [":woman_kneeling_tone3:"] = "\uD83E\uDDCE\uD83C\uDFFD\u200D♀️", + [":woman_kneeling_tone4:"] = "\uD83E\uDDCE\uD83C\uDFFE\u200D♀️", + [":woman_kneeling_tone5:"] = "\uD83E\uDDCE\uD83C\uDFFF\u200D♀️", + [":woman_lifting_weights:"] = "\uD83C\uDFCB️\u200D♀️", + [":woman_lifting_weights::skin-tone-1:"] = "\uD83C\uDFCB\uD83C\uDFFB\u200D♀️", + [":woman_lifting_weights::skin-tone-2:"] = "\uD83C\uDFCB\uD83C\uDFFC\u200D♀️", + [":woman_lifting_weights::skin-tone-3:"] = "\uD83C\uDFCB\uD83C\uDFFD\u200D♀️", + [":woman_lifting_weights::skin-tone-4:"] = "\uD83C\uDFCB\uD83C\uDFFE\u200D♀️", + [":woman_lifting_weights::skin-tone-5:"] = "\uD83C\uDFCB\uD83C\uDFFF\u200D♀️", + [":woman_lifting_weights_dark_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFF\u200D♀️", + [":woman_lifting_weights_light_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFB\u200D♀️", + [":woman_lifting_weights_medium_dark_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFE\u200D♀️", + [":woman_lifting_weights_medium_light_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFC\u200D♀️", + [":woman_lifting_weights_medium_skin_tone:"] = "\uD83C\uDFCB\uD83C\uDFFD\u200D♀️", + [":woman_lifting_weights_tone1:"] = "\uD83C\uDFCB\uD83C\uDFFB\u200D♀️", + [":woman_lifting_weights_tone2:"] = "\uD83C\uDFCB\uD83C\uDFFC\u200D♀️", + [":woman_lifting_weights_tone3:"] = "\uD83C\uDFCB\uD83C\uDFFD\u200D♀️", + [":woman_lifting_weights_tone4:"] = "\uD83C\uDFCB\uD83C\uDFFE\u200D♀️", + [":woman_lifting_weights_tone5:"] = "\uD83C\uDFCB\uD83C\uDFFF\u200D♀️", + [":woman_mage:"] = "\uD83E\uDDD9\u200D♀️", + [":woman_mage::skin-tone-1:"] = "\uD83E\uDDD9\uD83C\uDFFB\u200D♀️", + [":woman_mage::skin-tone-2:"] = "\uD83E\uDDD9\uD83C\uDFFC\u200D♀️", + [":woman_mage::skin-tone-3:"] = "\uD83E\uDDD9\uD83C\uDFFD\u200D♀️", + [":woman_mage::skin-tone-4:"] = "\uD83E\uDDD9\uD83C\uDFFE\u200D♀️", + [":woman_mage::skin-tone-5:"] = "\uD83E\uDDD9\uD83C\uDFFF\u200D♀️", + [":woman_mage_dark_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFF\u200D♀️", + [":woman_mage_light_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFB\u200D♀️", + [":woman_mage_medium_dark_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFE\u200D♀️", + [":woman_mage_medium_light_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFC\u200D♀️", + [":woman_mage_medium_skin_tone:"] = "\uD83E\uDDD9\uD83C\uDFFD\u200D♀️", + [":woman_mage_tone1:"] = "\uD83E\uDDD9\uD83C\uDFFB\u200D♀️", + [":woman_mage_tone2:"] = "\uD83E\uDDD9\uD83C\uDFFC\u200D♀️", + [":woman_mage_tone3:"] = "\uD83E\uDDD9\uD83C\uDFFD\u200D♀️", + [":woman_mage_tone4:"] = "\uD83E\uDDD9\uD83C\uDFFE\u200D♀️", + [":woman_mage_tone5:"] = "\uD83E\uDDD9\uD83C\uDFFF\u200D♀️", + [":woman_mechanic:"] = "\uD83D\uDC69\u200D\uD83D\uDD27", + [":woman_mechanic::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDD27", + [":woman_mechanic::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDD27", + [":woman_mechanic::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDD27", + [":woman_mechanic::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDD27", + [":woman_mechanic::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDD27", + [":woman_mechanic_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDD27", + [":woman_mechanic_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDD27", + [":woman_mechanic_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDD27", + [":woman_mechanic_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDD27", + [":woman_mechanic_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDD27", + [":woman_mechanic_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDD27", + [":woman_mechanic_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDD27", + [":woman_mechanic_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDD27", + [":woman_mechanic_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDD27", + [":woman_mechanic_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDD27", + [":woman_mountain_biking:"] = "\uD83D\uDEB5\u200D♀️", + [":woman_mountain_biking::skin-tone-1:"] = "\uD83D\uDEB5\uD83C\uDFFB\u200D♀️", + [":woman_mountain_biking::skin-tone-2:"] = "\uD83D\uDEB5\uD83C\uDFFC\u200D♀️", + [":woman_mountain_biking::skin-tone-3:"] = "\uD83D\uDEB5\uD83C\uDFFD\u200D♀️", + [":woman_mountain_biking::skin-tone-4:"] = "\uD83D\uDEB5\uD83C\uDFFE\u200D♀️", + [":woman_mountain_biking::skin-tone-5:"] = "\uD83D\uDEB5\uD83C\uDFFF\u200D♀️", + [":woman_mountain_biking_dark_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFF\u200D♀️", + [":woman_mountain_biking_light_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFB\u200D♀️", + [":woman_mountain_biking_medium_dark_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFE\u200D♀️", + [":woman_mountain_biking_medium_light_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFC\u200D♀️", + [":woman_mountain_biking_medium_skin_tone:"] = "\uD83D\uDEB5\uD83C\uDFFD\u200D♀️", + [":woman_mountain_biking_tone1:"] = "\uD83D\uDEB5\uD83C\uDFFB\u200D♀️", + [":woman_mountain_biking_tone2:"] = "\uD83D\uDEB5\uD83C\uDFFC\u200D♀️", + [":woman_mountain_biking_tone3:"] = "\uD83D\uDEB5\uD83C\uDFFD\u200D♀️", + [":woman_mountain_biking_tone4:"] = "\uD83D\uDEB5\uD83C\uDFFE\u200D♀️", + [":woman_mountain_biking_tone5:"] = "\uD83D\uDEB5\uD83C\uDFFF\u200D♀️", + [":woman_office_worker:"] = "\uD83D\uDC69\u200D\uD83D\uDCBC", + [":woman_office_worker::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDCBC", + [":woman_office_worker::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDCBC", + [":woman_office_worker::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDCBC", + [":woman_office_worker::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDCBC", + [":woman_office_worker::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDCBC", + [":woman_office_worker_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDCBC", + [":woman_office_worker_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDCBC", + [":woman_office_worker_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDCBC", + [":woman_office_worker_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDCBC", + [":woman_office_worker_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDCBC", + [":woman_office_worker_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDCBC", + [":woman_office_worker_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDCBC", + [":woman_office_worker_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDCBC", + [":woman_office_worker_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDCBC", + [":woman_office_worker_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDCBC", + [":woman_pilot:"] = "\uD83D\uDC69\u200D✈️", + [":woman_pilot::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D✈️", + [":woman_pilot::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D✈️", + [":woman_pilot::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D✈️", + [":woman_pilot::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D✈️", + [":woman_pilot::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D✈️", + [":woman_pilot_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D✈️", + [":woman_pilot_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D✈️", + [":woman_pilot_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D✈️", + [":woman_pilot_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D✈️", + [":woman_pilot_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D✈️", + [":woman_pilot_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D✈️", + [":woman_pilot_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D✈️", + [":woman_pilot_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D✈️", + [":woman_pilot_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D✈️", + [":woman_pilot_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D✈️", + [":woman_playing_handball:"] = "\uD83E\uDD3E\u200D♀️", + [":woman_playing_handball::skin-tone-1:"] = "\uD83E\uDD3E\uD83C\uDFFB\u200D♀️", + [":woman_playing_handball::skin-tone-2:"] = "\uD83E\uDD3E\uD83C\uDFFC\u200D♀️", + [":woman_playing_handball::skin-tone-3:"] = "\uD83E\uDD3E\uD83C\uDFFD\u200D♀️", + [":woman_playing_handball::skin-tone-4:"] = "\uD83E\uDD3E\uD83C\uDFFE\u200D♀️", + [":woman_playing_handball::skin-tone-5:"] = "\uD83E\uDD3E\uD83C\uDFFF\u200D♀️", + [":woman_playing_handball_dark_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFF\u200D♀️", + [":woman_playing_handball_light_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFB\u200D♀️", + [":woman_playing_handball_medium_dark_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFE\u200D♀️", + [":woman_playing_handball_medium_light_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFC\u200D♀️", + [":woman_playing_handball_medium_skin_tone:"] = "\uD83E\uDD3E\uD83C\uDFFD\u200D♀️", + [":woman_playing_handball_tone1:"] = "\uD83E\uDD3E\uD83C\uDFFB\u200D♀️", + [":woman_playing_handball_tone2:"] = "\uD83E\uDD3E\uD83C\uDFFC\u200D♀️", + [":woman_playing_handball_tone3:"] = "\uD83E\uDD3E\uD83C\uDFFD\u200D♀️", + [":woman_playing_handball_tone4:"] = "\uD83E\uDD3E\uD83C\uDFFE\u200D♀️", + [":woman_playing_handball_tone5:"] = "\uD83E\uDD3E\uD83C\uDFFF\u200D♀️", + [":woman_playing_water_polo:"] = "\uD83E\uDD3D\u200D♀️", + [":woman_playing_water_polo::skin-tone-1:"] = "\uD83E\uDD3D\uD83C\uDFFB\u200D♀️", + [":woman_playing_water_polo::skin-tone-2:"] = "\uD83E\uDD3D\uD83C\uDFFC\u200D♀️", + [":woman_playing_water_polo::skin-tone-3:"] = "\uD83E\uDD3D\uD83C\uDFFD\u200D♀️", + [":woman_playing_water_polo::skin-tone-4:"] = "\uD83E\uDD3D\uD83C\uDFFE\u200D♀️", + [":woman_playing_water_polo::skin-tone-5:"] = "\uD83E\uDD3D\uD83C\uDFFF\u200D♀️", + [":woman_playing_water_polo_dark_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFF\u200D♀️", + [":woman_playing_water_polo_light_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFB\u200D♀️", + [":woman_playing_water_polo_medium_dark_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFE\u200D♀️", + [":woman_playing_water_polo_medium_light_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFC\u200D♀️", + [":woman_playing_water_polo_medium_skin_tone:"] = "\uD83E\uDD3D\uD83C\uDFFD\u200D♀️", + [":woman_playing_water_polo_tone1:"] = "\uD83E\uDD3D\uD83C\uDFFB\u200D♀️", + [":woman_playing_water_polo_tone2:"] = "\uD83E\uDD3D\uD83C\uDFFC\u200D♀️", + [":woman_playing_water_polo_tone3:"] = "\uD83E\uDD3D\uD83C\uDFFD\u200D♀️", + [":woman_playing_water_polo_tone4:"] = "\uD83E\uDD3D\uD83C\uDFFE\u200D♀️", + [":woman_playing_water_polo_tone5:"] = "\uD83E\uDD3D\uD83C\uDFFF\u200D♀️", + [":woman_police_officer:"] = "\uD83D\uDC6E\u200D♀️", + [":woman_police_officer::skin-tone-1:"] = "\uD83D\uDC6E\uD83C\uDFFB\u200D♀️", + [":woman_police_officer::skin-tone-2:"] = "\uD83D\uDC6E\uD83C\uDFFC\u200D♀️", + [":woman_police_officer::skin-tone-3:"] = "\uD83D\uDC6E\uD83C\uDFFD\u200D♀️", + [":woman_police_officer::skin-tone-4:"] = "\uD83D\uDC6E\uD83C\uDFFE\u200D♀️", + [":woman_police_officer::skin-tone-5:"] = "\uD83D\uDC6E\uD83C\uDFFF\u200D♀️", + [":woman_police_officer_dark_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFF\u200D♀️", + [":woman_police_officer_light_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFB\u200D♀️", + [":woman_police_officer_medium_dark_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFE\u200D♀️", + [":woman_police_officer_medium_light_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFC\u200D♀️", + [":woman_police_officer_medium_skin_tone:"] = "\uD83D\uDC6E\uD83C\uDFFD\u200D♀️", + [":woman_police_officer_tone1:"] = "\uD83D\uDC6E\uD83C\uDFFB\u200D♀️", + [":woman_police_officer_tone2:"] = "\uD83D\uDC6E\uD83C\uDFFC\u200D♀️", + [":woman_police_officer_tone3:"] = "\uD83D\uDC6E\uD83C\uDFFD\u200D♀️", + [":woman_police_officer_tone4:"] = "\uD83D\uDC6E\uD83C\uDFFE\u200D♀️", + [":woman_police_officer_tone5:"] = "\uD83D\uDC6E\uD83C\uDFFF\u200D♀️", + [":woman_pouting:"] = "\uD83D\uDE4E\u200D♀️", + [":woman_pouting::skin-tone-1:"] = "\uD83D\uDE4E\uD83C\uDFFB\u200D♀️", + [":woman_pouting::skin-tone-2:"] = "\uD83D\uDE4E\uD83C\uDFFC\u200D♀️", + [":woman_pouting::skin-tone-3:"] = "\uD83D\uDE4E\uD83C\uDFFD\u200D♀️", + [":woman_pouting::skin-tone-4:"] = "\uD83D\uDE4E\uD83C\uDFFE\u200D♀️", + [":woman_pouting::skin-tone-5:"] = "\uD83D\uDE4E\uD83C\uDFFF\u200D♀️", + [":woman_pouting_dark_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFF\u200D♀️", + [":woman_pouting_light_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFB\u200D♀️", + [":woman_pouting_medium_dark_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFE\u200D♀️", + [":woman_pouting_medium_light_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFC\u200D♀️", + [":woman_pouting_medium_skin_tone:"] = "\uD83D\uDE4E\uD83C\uDFFD\u200D♀️", + [":woman_pouting_tone1:"] = "\uD83D\uDE4E\uD83C\uDFFB\u200D♀️", + [":woman_pouting_tone2:"] = "\uD83D\uDE4E\uD83C\uDFFC\u200D♀️", + [":woman_pouting_tone3:"] = "\uD83D\uDE4E\uD83C\uDFFD\u200D♀️", + [":woman_pouting_tone4:"] = "\uD83D\uDE4E\uD83C\uDFFE\u200D♀️", + [":woman_pouting_tone5:"] = "\uD83D\uDE4E\uD83C\uDFFF\u200D♀️", + [":woman_raising_hand:"] = "\uD83D\uDE4B\u200D♀️", + [":woman_raising_hand::skin-tone-1:"] = "\uD83D\uDE4B\uD83C\uDFFB\u200D♀️", + [":woman_raising_hand::skin-tone-2:"] = "\uD83D\uDE4B\uD83C\uDFFC\u200D♀️", + [":woman_raising_hand::skin-tone-3:"] = "\uD83D\uDE4B\uD83C\uDFFD\u200D♀️", + [":woman_raising_hand::skin-tone-4:"] = "\uD83D\uDE4B\uD83C\uDFFE\u200D♀️", + [":woman_raising_hand::skin-tone-5:"] = "\uD83D\uDE4B\uD83C\uDFFF\u200D♀️", + [":woman_raising_hand_dark_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFF\u200D♀️", + [":woman_raising_hand_light_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFB\u200D♀️", + [":woman_raising_hand_medium_dark_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFE\u200D♀️", + [":woman_raising_hand_medium_light_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFC\u200D♀️", + [":woman_raising_hand_medium_skin_tone:"] = "\uD83D\uDE4B\uD83C\uDFFD\u200D♀️", + [":woman_raising_hand_tone1:"] = "\uD83D\uDE4B\uD83C\uDFFB\u200D♀️", + [":woman_raising_hand_tone2:"] = "\uD83D\uDE4B\uD83C\uDFFC\u200D♀️", + [":woman_raising_hand_tone3:"] = "\uD83D\uDE4B\uD83C\uDFFD\u200D♀️", + [":woman_raising_hand_tone4:"] = "\uD83D\uDE4B\uD83C\uDFFE\u200D♀️", + [":woman_raising_hand_tone5:"] = "\uD83D\uDE4B\uD83C\uDFFF\u200D♀️", + [":woman_red_haired:"] = "\uD83D\uDC69\u200D\uD83E\uDDB0", + [":woman_red_haired::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB0", + [":woman_red_haired::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB0", + [":woman_red_haired::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB0", + [":woman_red_haired::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB0", + [":woman_red_haired::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB0", + [":woman_red_haired_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB0", + [":woman_red_haired_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB0", + [":woman_red_haired_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB0", + [":woman_red_haired_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB0", + [":woman_red_haired_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB0", + [":woman_red_haired_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB0", + [":woman_red_haired_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB0", + [":woman_red_haired_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB0", + [":woman_red_haired_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB0", + [":woman_red_haired_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB0", + [":woman_rowing_boat:"] = "\uD83D\uDEA3\u200D♀️", + [":woman_rowing_boat::skin-tone-1:"] = "\uD83D\uDEA3\uD83C\uDFFB\u200D♀️", + [":woman_rowing_boat::skin-tone-2:"] = "\uD83D\uDEA3\uD83C\uDFFC\u200D♀️", + [":woman_rowing_boat::skin-tone-3:"] = "\uD83D\uDEA3\uD83C\uDFFD\u200D♀️", + [":woman_rowing_boat::skin-tone-4:"] = "\uD83D\uDEA3\uD83C\uDFFE\u200D♀️", + [":woman_rowing_boat::skin-tone-5:"] = "\uD83D\uDEA3\uD83C\uDFFF\u200D♀️", + [":woman_rowing_boat_dark_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFF\u200D♀️", + [":woman_rowing_boat_light_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFB\u200D♀️", + [":woman_rowing_boat_medium_dark_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFE\u200D♀️", + [":woman_rowing_boat_medium_light_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFC\u200D♀️", + [":woman_rowing_boat_medium_skin_tone:"] = "\uD83D\uDEA3\uD83C\uDFFD\u200D♀️", + [":woman_rowing_boat_tone1:"] = "\uD83D\uDEA3\uD83C\uDFFB\u200D♀️", + [":woman_rowing_boat_tone2:"] = "\uD83D\uDEA3\uD83C\uDFFC\u200D♀️", + [":woman_rowing_boat_tone3:"] = "\uD83D\uDEA3\uD83C\uDFFD\u200D♀️", + [":woman_rowing_boat_tone4:"] = "\uD83D\uDEA3\uD83C\uDFFE\u200D♀️", + [":woman_rowing_boat_tone5:"] = "\uD83D\uDEA3\uD83C\uDFFF\u200D♀️", + [":woman_running:"] = "\uD83C\uDFC3\u200D♀️", + [":woman_running::skin-tone-1:"] = "\uD83C\uDFC3\uD83C\uDFFB\u200D♀️", + [":woman_running::skin-tone-2:"] = "\uD83C\uDFC3\uD83C\uDFFC\u200D♀️", + [":woman_running::skin-tone-3:"] = "\uD83C\uDFC3\uD83C\uDFFD\u200D♀️", + [":woman_running::skin-tone-4:"] = "\uD83C\uDFC3\uD83C\uDFFE\u200D♀️", + [":woman_running::skin-tone-5:"] = "\uD83C\uDFC3\uD83C\uDFFF\u200D♀️", + [":woman_running_dark_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFF\u200D♀️", + [":woman_running_light_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFB\u200D♀️", + [":woman_running_medium_dark_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFE\u200D♀️", + [":woman_running_medium_light_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFC\u200D♀️", + [":woman_running_medium_skin_tone:"] = "\uD83C\uDFC3\uD83C\uDFFD\u200D♀️", + [":woman_running_tone1:"] = "\uD83C\uDFC3\uD83C\uDFFB\u200D♀️", + [":woman_running_tone2:"] = "\uD83C\uDFC3\uD83C\uDFFC\u200D♀️", + [":woman_running_tone3:"] = "\uD83C\uDFC3\uD83C\uDFFD\u200D♀️", + [":woman_running_tone4:"] = "\uD83C\uDFC3\uD83C\uDFFE\u200D♀️", + [":woman_running_tone5:"] = "\uD83C\uDFC3\uD83C\uDFFF\u200D♀️", + [":woman_scientist:"] = "\uD83D\uDC69\u200D\uD83D\uDD2C", + [":woman_scientist::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDD2C", + [":woman_scientist::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDD2C", + [":woman_scientist::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDD2C", + [":woman_scientist::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDD2C", + [":woman_scientist::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDD2C", + [":woman_scientist_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDD2C", + [":woman_scientist_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDD2C", + [":woman_scientist_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDD2C", + [":woman_scientist_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDD2C", + [":woman_scientist_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDD2C", + [":woman_scientist_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDD2C", + [":woman_scientist_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDD2C", + [":woman_scientist_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDD2C", + [":woman_scientist_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDD2C", + [":woman_scientist_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDD2C", + [":woman_shrugging:"] = "\uD83E\uDD37\u200D♀️", + [":woman_shrugging::skin-tone-1:"] = "\uD83E\uDD37\uD83C\uDFFB\u200D♀️", + [":woman_shrugging::skin-tone-2:"] = "\uD83E\uDD37\uD83C\uDFFC\u200D♀️", + [":woman_shrugging::skin-tone-3:"] = "\uD83E\uDD37\uD83C\uDFFD\u200D♀️", + [":woman_shrugging::skin-tone-4:"] = "\uD83E\uDD37\uD83C\uDFFE\u200D♀️", + [":woman_shrugging::skin-tone-5:"] = "\uD83E\uDD37\uD83C\uDFFF\u200D♀️", + [":woman_shrugging_dark_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFF\u200D♀️", + [":woman_shrugging_light_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFB\u200D♀️", + [":woman_shrugging_medium_dark_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFE\u200D♀️", + [":woman_shrugging_medium_light_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFC\u200D♀️", + [":woman_shrugging_medium_skin_tone:"] = "\uD83E\uDD37\uD83C\uDFFD\u200D♀️", + [":woman_shrugging_tone1:"] = "\uD83E\uDD37\uD83C\uDFFB\u200D♀️", + [":woman_shrugging_tone2:"] = "\uD83E\uDD37\uD83C\uDFFC\u200D♀️", + [":woman_shrugging_tone3:"] = "\uD83E\uDD37\uD83C\uDFFD\u200D♀️", + [":woman_shrugging_tone4:"] = "\uD83E\uDD37\uD83C\uDFFE\u200D♀️", + [":woman_shrugging_tone5:"] = "\uD83E\uDD37\uD83C\uDFFF\u200D♀️", + [":woman_singer:"] = "\uD83D\uDC69\u200D\uD83C\uDFA4", + [":woman_singer::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFA4", + [":woman_singer::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFA4", + [":woman_singer::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFA4", + [":woman_singer::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFA4", + [":woman_singer::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFA4", + [":woman_singer_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFA4", + [":woman_singer_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFA4", + [":woman_singer_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFA4", + [":woman_singer_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFA4", + [":woman_singer_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFA4", + [":woman_singer_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFA4", + [":woman_singer_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFA4", + [":woman_singer_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFA4", + [":woman_singer_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFA4", + [":woman_singer_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFA4", + [":woman_standing:"] = "\uD83E\uDDCD\u200D♀️", + [":woman_standing::skin-tone-1:"] = "\uD83E\uDDCD\uD83C\uDFFB\u200D♀️", + [":woman_standing::skin-tone-2:"] = "\uD83E\uDDCD\uD83C\uDFFC\u200D♀️", + [":woman_standing::skin-tone-3:"] = "\uD83E\uDDCD\uD83C\uDFFD\u200D♀️", + [":woman_standing::skin-tone-4:"] = "\uD83E\uDDCD\uD83C\uDFFE\u200D♀️", + [":woman_standing::skin-tone-5:"] = "\uD83E\uDDCD\uD83C\uDFFF\u200D♀️", + [":woman_standing_dark_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFF\u200D♀️", + [":woman_standing_light_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFB\u200D♀️", + [":woman_standing_medium_dark_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFE\u200D♀️", + [":woman_standing_medium_light_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFC\u200D♀️", + [":woman_standing_medium_skin_tone:"] = "\uD83E\uDDCD\uD83C\uDFFD\u200D♀️", + [":woman_standing_tone1:"] = "\uD83E\uDDCD\uD83C\uDFFB\u200D♀️", + [":woman_standing_tone2:"] = "\uD83E\uDDCD\uD83C\uDFFC\u200D♀️", + [":woman_standing_tone3:"] = "\uD83E\uDDCD\uD83C\uDFFD\u200D♀️", + [":woman_standing_tone4:"] = "\uD83E\uDDCD\uD83C\uDFFE\u200D♀️", + [":woman_standing_tone5:"] = "\uD83E\uDDCD\uD83C\uDFFF\u200D♀️", + [":woman_student:"] = "\uD83D\uDC69\u200D\uD83C\uDF93", + [":woman_student::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF93", + [":woman_student::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF93", + [":woman_student::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF93", + [":woman_student::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF93", + [":woman_student::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF93", + [":woman_student_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF93", + [":woman_student_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF93", + [":woman_student_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF93", + [":woman_student_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF93", + [":woman_student_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF93", + [":woman_student_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDF93", + [":woman_student_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDF93", + [":woman_student_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF93", + [":woman_student_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDF93", + [":woman_student_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDF93", + [":woman_superhero:"] = "\uD83E\uDDB8\u200D♀️", + [":woman_superhero::skin-tone-1:"] = "\uD83E\uDDB8\uD83C\uDFFB\u200D♀️", + [":woman_superhero::skin-tone-2:"] = "\uD83E\uDDB8\uD83C\uDFFC\u200D♀️", + [":woman_superhero::skin-tone-3:"] = "\uD83E\uDDB8\uD83C\uDFFD\u200D♀️", + [":woman_superhero::skin-tone-4:"] = "\uD83E\uDDB8\uD83C\uDFFE\u200D♀️", + [":woman_superhero::skin-tone-5:"] = "\uD83E\uDDB8\uD83C\uDFFF\u200D♀️", + [":woman_superhero_dark_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFF\u200D♀️", + [":woman_superhero_light_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFB\u200D♀️", + [":woman_superhero_medium_dark_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFE\u200D♀️", + [":woman_superhero_medium_light_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFC\u200D♀️", + [":woman_superhero_medium_skin_tone:"] = "\uD83E\uDDB8\uD83C\uDFFD\u200D♀️", + [":woman_superhero_tone1:"] = "\uD83E\uDDB8\uD83C\uDFFB\u200D♀️", + [":woman_superhero_tone2:"] = "\uD83E\uDDB8\uD83C\uDFFC\u200D♀️", + [":woman_superhero_tone3:"] = "\uD83E\uDDB8\uD83C\uDFFD\u200D♀️", + [":woman_superhero_tone4:"] = "\uD83E\uDDB8\uD83C\uDFFE\u200D♀️", + [":woman_superhero_tone5:"] = "\uD83E\uDDB8\uD83C\uDFFF\u200D♀️", + [":woman_supervillain:"] = "\uD83E\uDDB9\u200D♀️", + [":woman_supervillain::skin-tone-1:"] = "\uD83E\uDDB9\uD83C\uDFFB\u200D♀️", + [":woman_supervillain::skin-tone-2:"] = "\uD83E\uDDB9\uD83C\uDFFC\u200D♀️", + [":woman_supervillain::skin-tone-3:"] = "\uD83E\uDDB9\uD83C\uDFFD\u200D♀️", + [":woman_supervillain::skin-tone-4:"] = "\uD83E\uDDB9\uD83C\uDFFE\u200D♀️", + [":woman_supervillain::skin-tone-5:"] = "\uD83E\uDDB9\uD83C\uDFFF\u200D♀️", + [":woman_supervillain_dark_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFF\u200D♀️", + [":woman_supervillain_light_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFB\u200D♀️", + [":woman_supervillain_medium_dark_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFE\u200D♀️", + [":woman_supervillain_medium_light_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFC\u200D♀️", + [":woman_supervillain_medium_skin_tone:"] = "\uD83E\uDDB9\uD83C\uDFFD\u200D♀️", + [":woman_supervillain_tone1:"] = "\uD83E\uDDB9\uD83C\uDFFB\u200D♀️", + [":woman_supervillain_tone2:"] = "\uD83E\uDDB9\uD83C\uDFFC\u200D♀️", + [":woman_supervillain_tone3:"] = "\uD83E\uDDB9\uD83C\uDFFD\u200D♀️", + [":woman_supervillain_tone4:"] = "\uD83E\uDDB9\uD83C\uDFFE\u200D♀️", + [":woman_supervillain_tone5:"] = "\uD83E\uDDB9\uD83C\uDFFF\u200D♀️", + [":woman_surfing:"] = "\uD83C\uDFC4\u200D♀️", + [":woman_surfing::skin-tone-1:"] = "\uD83C\uDFC4\uD83C\uDFFB\u200D♀️", + [":woman_surfing::skin-tone-2:"] = "\uD83C\uDFC4\uD83C\uDFFC\u200D♀️", + [":woman_surfing::skin-tone-3:"] = "\uD83C\uDFC4\uD83C\uDFFD\u200D♀️", + [":woman_surfing::skin-tone-4:"] = "\uD83C\uDFC4\uD83C\uDFFE\u200D♀️", + [":woman_surfing::skin-tone-5:"] = "\uD83C\uDFC4\uD83C\uDFFF\u200D♀️", + [":woman_surfing_dark_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFF\u200D♀️", + [":woman_surfing_light_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFB\u200D♀️", + [":woman_surfing_medium_dark_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFE\u200D♀️", + [":woman_surfing_medium_light_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFC\u200D♀️", + [":woman_surfing_medium_skin_tone:"] = "\uD83C\uDFC4\uD83C\uDFFD\u200D♀️", + [":woman_surfing_tone1:"] = "\uD83C\uDFC4\uD83C\uDFFB\u200D♀️", + [":woman_surfing_tone2:"] = "\uD83C\uDFC4\uD83C\uDFFC\u200D♀️", + [":woman_surfing_tone3:"] = "\uD83C\uDFC4\uD83C\uDFFD\u200D♀️", + [":woman_surfing_tone4:"] = "\uD83C\uDFC4\uD83C\uDFFE\u200D♀️", + [":woman_surfing_tone5:"] = "\uD83C\uDFC4\uD83C\uDFFF\u200D♀️", + [":woman_swimming:"] = "\uD83C\uDFCA\u200D♀️", + [":woman_swimming::skin-tone-1:"] = "\uD83C\uDFCA\uD83C\uDFFB\u200D♀️", + [":woman_swimming::skin-tone-2:"] = "\uD83C\uDFCA\uD83C\uDFFC\u200D♀️", + [":woman_swimming::skin-tone-3:"] = "\uD83C\uDFCA\uD83C\uDFFD\u200D♀️", + [":woman_swimming::skin-tone-4:"] = "\uD83C\uDFCA\uD83C\uDFFE\u200D♀️", + [":woman_swimming::skin-tone-5:"] = "\uD83C\uDFCA\uD83C\uDFFF\u200D♀️", + [":woman_swimming_dark_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFF\u200D♀️", + [":woman_swimming_light_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFB\u200D♀️", + [":woman_swimming_medium_dark_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFE\u200D♀️", + [":woman_swimming_medium_light_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFC\u200D♀️", + [":woman_swimming_medium_skin_tone:"] = "\uD83C\uDFCA\uD83C\uDFFD\u200D♀️", + [":woman_swimming_tone1:"] = "\uD83C\uDFCA\uD83C\uDFFB\u200D♀️", + [":woman_swimming_tone2:"] = "\uD83C\uDFCA\uD83C\uDFFC\u200D♀️", + [":woman_swimming_tone3:"] = "\uD83C\uDFCA\uD83C\uDFFD\u200D♀️", + [":woman_swimming_tone4:"] = "\uD83C\uDFCA\uD83C\uDFFE\u200D♀️", + [":woman_swimming_tone5:"] = "\uD83C\uDFCA\uD83C\uDFFF\u200D♀️", + [":woman_teacher:"] = "\uD83D\uDC69\u200D\uD83C\uDFEB", + [":woman_teacher::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFEB", + [":woman_teacher::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFEB", + [":woman_teacher::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFEB", + [":woman_teacher::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFEB", + [":woman_teacher::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFEB", + [":woman_teacher_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFEB", + [":woman_teacher_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFEB", + [":woman_teacher_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFEB", + [":woman_teacher_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFEB", + [":woman_teacher_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFEB", + [":woman_teacher_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83C\uDFEB", + [":woman_teacher_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83C\uDFEB", + [":woman_teacher_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDFEB", + [":woman_teacher_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83C\uDFEB", + [":woman_teacher_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83C\uDFEB", + [":woman_technologist:"] = "\uD83D\uDC69\u200D\uD83D\uDCBB", + [":woman_technologist::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDCBB", + [":woman_technologist::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDCBB", + [":woman_technologist::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDCBB", + [":woman_technologist::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDCBB", + [":woman_technologist::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDCBB", + [":woman_technologist_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDCBB", + [":woman_technologist_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDCBB", + [":woman_technologist_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDCBB", + [":woman_technologist_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDCBB", + [":woman_technologist_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDCBB", + [":woman_technologist_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83D\uDCBB", + [":woman_technologist_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83D\uDCBB", + [":woman_technologist_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDCBB", + [":woman_technologist_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83D\uDCBB", + [":woman_technologist_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83D\uDCBB", + [":woman_tipping_hand:"] = "\uD83D\uDC81\u200D♀️", + [":woman_tipping_hand::skin-tone-1:"] = "\uD83D\uDC81\uD83C\uDFFB\u200D♀️", + [":woman_tipping_hand::skin-tone-2:"] = "\uD83D\uDC81\uD83C\uDFFC\u200D♀️", + [":woman_tipping_hand::skin-tone-3:"] = "\uD83D\uDC81\uD83C\uDFFD\u200D♀️", + [":woman_tipping_hand::skin-tone-4:"] = "\uD83D\uDC81\uD83C\uDFFE\u200D♀️", + [":woman_tipping_hand::skin-tone-5:"] = "\uD83D\uDC81\uD83C\uDFFF\u200D♀️", + [":woman_tipping_hand_dark_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFF\u200D♀️", + [":woman_tipping_hand_light_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFB\u200D♀️", + [":woman_tipping_hand_medium_dark_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFE\u200D♀️", + [":woman_tipping_hand_medium_light_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFC\u200D♀️", + [":woman_tipping_hand_medium_skin_tone:"] = "\uD83D\uDC81\uD83C\uDFFD\u200D♀️", + [":woman_tipping_hand_tone1:"] = "\uD83D\uDC81\uD83C\uDFFB\u200D♀️", + [":woman_tipping_hand_tone2:"] = "\uD83D\uDC81\uD83C\uDFFC\u200D♀️", + [":woman_tipping_hand_tone3:"] = "\uD83D\uDC81\uD83C\uDFFD\u200D♀️", + [":woman_tipping_hand_tone4:"] = "\uD83D\uDC81\uD83C\uDFFE\u200D♀️", + [":woman_tipping_hand_tone5:"] = "\uD83D\uDC81\uD83C\uDFFF\u200D♀️", + [":woman_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB", + [":woman_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC", + [":woman_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD", + [":woman_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE", + [":woman_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF", + [":woman_vampire:"] = "\uD83E\uDDDB\u200D♀️", + [":woman_vampire::skin-tone-1:"] = "\uD83E\uDDDB\uD83C\uDFFB\u200D♀️", + [":woman_vampire::skin-tone-2:"] = "\uD83E\uDDDB\uD83C\uDFFC\u200D♀️", + [":woman_vampire::skin-tone-3:"] = "\uD83E\uDDDB\uD83C\uDFFD\u200D♀️", + [":woman_vampire::skin-tone-4:"] = "\uD83E\uDDDB\uD83C\uDFFE\u200D♀️", + [":woman_vampire::skin-tone-5:"] = "\uD83E\uDDDB\uD83C\uDFFF\u200D♀️", + [":woman_vampire_dark_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFF\u200D♀️", + [":woman_vampire_light_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFB\u200D♀️", + [":woman_vampire_medium_dark_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFE\u200D♀️", + [":woman_vampire_medium_light_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFC\u200D♀️", + [":woman_vampire_medium_skin_tone:"] = "\uD83E\uDDDB\uD83C\uDFFD\u200D♀️", + [":woman_vampire_tone1:"] = "\uD83E\uDDDB\uD83C\uDFFB\u200D♀️", + [":woman_vampire_tone2:"] = "\uD83E\uDDDB\uD83C\uDFFC\u200D♀️", + [":woman_vampire_tone3:"] = "\uD83E\uDDDB\uD83C\uDFFD\u200D♀️", + [":woman_vampire_tone4:"] = "\uD83E\uDDDB\uD83C\uDFFE\u200D♀️", + [":woman_vampire_tone5:"] = "\uD83E\uDDDB\uD83C\uDFFF\u200D♀️", + [":woman_walking:"] = "\uD83D\uDEB6\u200D♀️", + [":woman_walking::skin-tone-1:"] = "\uD83D\uDEB6\uD83C\uDFFB\u200D♀️", + [":woman_walking::skin-tone-2:"] = "\uD83D\uDEB6\uD83C\uDFFC\u200D♀️", + [":woman_walking::skin-tone-3:"] = "\uD83D\uDEB6\uD83C\uDFFD\u200D♀️", + [":woman_walking::skin-tone-4:"] = "\uD83D\uDEB6\uD83C\uDFFE\u200D♀️", + [":woman_walking::skin-tone-5:"] = "\uD83D\uDEB6\uD83C\uDFFF\u200D♀️", + [":woman_walking_dark_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFF\u200D♀️", + [":woman_walking_light_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFB\u200D♀️", + [":woman_walking_medium_dark_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFE\u200D♀️", + [":woman_walking_medium_light_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFC\u200D♀️", + [":woman_walking_medium_skin_tone:"] = "\uD83D\uDEB6\uD83C\uDFFD\u200D♀️", + [":woman_walking_tone1:"] = "\uD83D\uDEB6\uD83C\uDFFB\u200D♀️", + [":woman_walking_tone2:"] = "\uD83D\uDEB6\uD83C\uDFFC\u200D♀️", + [":woman_walking_tone3:"] = "\uD83D\uDEB6\uD83C\uDFFD\u200D♀️", + [":woman_walking_tone4:"] = "\uD83D\uDEB6\uD83C\uDFFE\u200D♀️", + [":woman_walking_tone5:"] = "\uD83D\uDEB6\uD83C\uDFFF\u200D♀️", + [":woman_wearing_turban:"] = "\uD83D\uDC73\u200D♀️", + [":woman_wearing_turban::skin-tone-1:"] = "\uD83D\uDC73\uD83C\uDFFB\u200D♀️", + [":woman_wearing_turban::skin-tone-2:"] = "\uD83D\uDC73\uD83C\uDFFC\u200D♀️", + [":woman_wearing_turban::skin-tone-3:"] = "\uD83D\uDC73\uD83C\uDFFD\u200D♀️", + [":woman_wearing_turban::skin-tone-4:"] = "\uD83D\uDC73\uD83C\uDFFE\u200D♀️", + [":woman_wearing_turban::skin-tone-5:"] = "\uD83D\uDC73\uD83C\uDFFF\u200D♀️", + [":woman_wearing_turban_dark_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFF\u200D♀️", + [":woman_wearing_turban_light_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFB\u200D♀️", + [":woman_wearing_turban_medium_dark_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFE\u200D♀️", + [":woman_wearing_turban_medium_light_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFC\u200D♀️", + [":woman_wearing_turban_medium_skin_tone:"] = "\uD83D\uDC73\uD83C\uDFFD\u200D♀️", + [":woman_wearing_turban_tone1:"] = "\uD83D\uDC73\uD83C\uDFFB\u200D♀️", + [":woman_wearing_turban_tone2:"] = "\uD83D\uDC73\uD83C\uDFFC\u200D♀️", + [":woman_wearing_turban_tone3:"] = "\uD83D\uDC73\uD83C\uDFFD\u200D♀️", + [":woman_wearing_turban_tone4:"] = "\uD83D\uDC73\uD83C\uDFFE\u200D♀️", + [":woman_wearing_turban_tone5:"] = "\uD83D\uDC73\uD83C\uDFFF\u200D♀️", + [":woman_white_haired:"] = "\uD83D\uDC69\u200D\uD83E\uDDB3", + [":woman_white_haired::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB3", + [":woman_white_haired::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB3", + [":woman_white_haired::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB3", + [":woman_white_haired::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB3", + [":woman_white_haired::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB3", + [":woman_white_haired_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB3", + [":woman_white_haired_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB3", + [":woman_white_haired_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB3", + [":woman_white_haired_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB3", + [":woman_white_haired_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB3", + [":woman_white_haired_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDB3", + [":woman_white_haired_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDB3", + [":woman_white_haired_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDB3", + [":woman_white_haired_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDB3", + [":woman_white_haired_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDB3", + [":woman_with_headscarf:"] = "\uD83E\uDDD5", + [":woman_with_headscarf::skin-tone-1:"] = "\uD83E\uDDD5\uD83C\uDFFB", + [":woman_with_headscarf::skin-tone-2:"] = "\uD83E\uDDD5\uD83C\uDFFC", + [":woman_with_headscarf::skin-tone-3:"] = "\uD83E\uDDD5\uD83C\uDFFD", + [":woman_with_headscarf::skin-tone-4:"] = "\uD83E\uDDD5\uD83C\uDFFE", + [":woman_with_headscarf::skin-tone-5:"] = "\uD83E\uDDD5\uD83C\uDFFF", + [":woman_with_headscarf_dark_skin_tone:"] = "\uD83E\uDDD5\uD83C\uDFFF", + [":woman_with_headscarf_light_skin_tone:"] = "\uD83E\uDDD5\uD83C\uDFFB", + [":woman_with_headscarf_medium_dark_skin_tone:"] = "\uD83E\uDDD5\uD83C\uDFFE", + [":woman_with_headscarf_medium_light_skin_tone:"] = "\uD83E\uDDD5\uD83C\uDFFC", + [":woman_with_headscarf_medium_skin_tone:"] = "\uD83E\uDDD5\uD83C\uDFFD", + [":woman_with_headscarf_tone1:"] = "\uD83E\uDDD5\uD83C\uDFFB", + [":woman_with_headscarf_tone2:"] = "\uD83E\uDDD5\uD83C\uDFFC", + [":woman_with_headscarf_tone3:"] = "\uD83E\uDDD5\uD83C\uDFFD", + [":woman_with_headscarf_tone4:"] = "\uD83E\uDDD5\uD83C\uDFFE", + [":woman_with_headscarf_tone5:"] = "\uD83E\uDDD5\uD83C\uDFFF", + [":woman_with_probing_cane:"] = "\uD83D\uDC69\u200D\uD83E\uDDAF", + [":woman_with_probing_cane::skin-tone-1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDAF", + [":woman_with_probing_cane::skin-tone-2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDAF", + [":woman_with_probing_cane::skin-tone-3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDAF", + [":woman_with_probing_cane::skin-tone-4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDAF", + [":woman_with_probing_cane::skin-tone-5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_medium_dark_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_medium_light_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_medium_skin_tone:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_tone1:"] = "\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_tone2:"] = "\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_tone3:"] = "\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_tone4:"] = "\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDDAF", + [":woman_with_probing_cane_tone5:"] = "\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDDAF", + [":woman_zombie:"] = "\uD83E\uDDDF\u200D♀️", + [":womans_clothes:"] = "\uD83D\uDC5A", + [":womans_flat_shoe:"] = "\uD83E\uDD7F", + [":womans_hat:"] = "\uD83D\uDC52", + [":women_with_bunny_ears_partying:"] = "\uD83D\uDC6F\u200D♀️", + [":women_wrestling:"] = "\uD83E\uDD3C\u200D♀️", + [":womens:"] = "\uD83D\uDEBA", + [":woozy_face:"] = "\uD83E\uDD74", + [":world_map:"] = "\uD83D\uDDFA️", + [":worried:"] = "\uD83D\uDE1F", + [":worship_symbol:"] = "\uD83D\uDED0", + [":wrench:"] = "\uD83D\uDD27", + [":wrestlers:"] = "\uD83E\uDD3C", + [":wrestling:"] = "\uD83E\uDD3C", + [":writing_hand:"] = "✍️", + [":writing_hand::skin-tone-1:"] = "✍\uD83C\uDFFB", + [":writing_hand::skin-tone-2:"] = "✍\uD83C\uDFFC", + [":writing_hand::skin-tone-3:"] = "✍\uD83C\uDFFD", + [":writing_hand::skin-tone-4:"] = "✍\uD83C\uDFFE", + [":writing_hand::skin-tone-5:"] = "✍\uD83C\uDFFF", + [":writing_hand_tone1:"] = "✍\uD83C\uDFFB", + [":writing_hand_tone2:"] = "✍\uD83C\uDFFC", + [":writing_hand_tone3:"] = "✍\uD83C\uDFFD", + [":writing_hand_tone4:"] = "✍\uD83C\uDFFE", + [":writing_hand_tone5:"] = "✍\uD83C\uDFFF", + [":x:"] = "❌", + [":yarn:"] = "\uD83E\uDDF6", + [":yawning_face:"] = "\uD83E\uDD71", + [":yellow_circle:"] = "\uD83D\uDFE1", + [":yellow_heart:"] = "\uD83D\uDC9B", + [":yellow_square:"] = "\uD83D\uDFE8", + [":yen:"] = "\uD83D\uDCB4", + [":yin_yang:"] = "☯️", + [":yo_yo:"] = "\uD83E\uDE80", + [":yum:"] = "\uD83D\uDE0B", + [":z"] = "\uD83D\uDE12", + [":zany_face:"] = "\uD83E\uDD2A", + [":zap:"] = "⚡", + [":zebra:"] = "\uD83E\uDD93", + [":zero:"] = "0️⃣", + [":zipper_mouth:"] = "\uD83E\uDD10", + [":zipper_mouth_face:"] = "\uD83E\uDD10", + [":zombie:"] = "\uD83E\uDDDF", + [":zzz:"] = "\uD83D\uDCA4", + [":|"] = "\uD83D\uDE10", + [";("] = "\uD83D\uDE2D", + [";)"] = "\uD83D\uDE09", + [";-("] = "\uD83D\uDE2D", + [";-)"] = "\uD83D\uDE09", + [":("] = "\uD83D\uDE20", + [">:-("] = "\uD83D\uDE20", + [">=("] = "\uD83D\uDE20", + [">=-("] = "\uD83D\uDE20", + ["B-)"] = "\uD83D\uDE0E", + ["O:)"] = "\uD83D\uDE07", + ["O:-)"] = "\uD83D\uDE07", + ["O=)"] = "\uD83D\uDE07", + ["O=-)"] = "\uD83D\uDE07", + ["X-)"] = "\uD83D\uDE06", + ["]:("] = "\uD83D\uDC7F", + ["]:)"] = "\uD83D\uDE08", + ["]:-("] = "\uD83D\uDC7F", + ["]:-)"] = "\uD83D\uDE08", + ["]=("] = "\uD83D\uDC7F", + ["]=)"] = "\uD83D\uDE08", + ["]=-("] = "\uD83D\uDC7F", + ["]=-)"] = "\uD83D\uDE08", + ["o:)"] = "\uD83D\uDE07", + ["o:-)"] = "\uD83D\uDE07", + ["o=)"] = "\uD83D\uDE07", + ["o=-)"] = "\uD83D\uDE07", + ["x-)"] = "\uD83D\uDE06", + ["♡"] = "❤️" + }; + + private static IReadOnlyDictionary _unicodesAndNames; + private static IReadOnlyDictionary UnicodesAndNames + { + get + { + _unicodesAndNames ??= NamesAndUnicodes.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); + return _unicodesAndNames; + } + } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 6aa847d96a..5a5145a275 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -54,18 +52,19 @@ public List ActionRows /// The placeholder of the menu. /// The min values of the placeholder. /// The max values of the placeholder. + /// Whether or not the menu is disabled. /// The row to add the menu to. /// public ComponentBuilder WithSelectMenu(string label, string customId, List options, - string placeholder = null, int minValues = 1, int maxValues = 1, int row = 0) + string placeholder = null, int minValues = 1, int maxValues = 1, bool disabled = false, int row = 0) { return WithSelectMenu(new SelectMenuBuilder() - .WithLabel(label) .WithCustomId(customId) .WithOptions(options) .WithPlaceholder(placeholder) .WithMaxValues(maxValues) - .WithMinValues(minValues), + .WithMinValues(minValues) + .WithDisabled(disabled), row); } @@ -557,22 +556,6 @@ public class SelectMenuBuilder /// public const int MaxOptionCount = 25; - /// - /// Gets or sets the label of the current select menu. - /// - public string Label - { - get => _label; - set - { - if (value != null) - if (value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); - - _label = value; - } - } - /// /// Gets or sets the custom id of the current select menu. /// @@ -608,11 +591,11 @@ public string Placeholder /// public int MinValues { - get => _minvalues; + get => _minValues; set { Preconditions.LessThan(value, MaxValuesCount, nameof(MinValues)); - _minvalues = value; + _minValues = value; } } @@ -621,11 +604,11 @@ public int MinValues /// public int MaxValues { - get => _maxvalues; + get => _maxValues; set { Preconditions.LessThan(value, MaxValuesCount, nameof(MaxValues)); - _maxvalues = value; + _maxValues = value; } } @@ -644,11 +627,15 @@ public List Options } } + /// + /// Gets or sets whether the current menu is disabled. + /// + public bool Disabled { get; set; } + private List _options; - private int _minvalues = 1; - private int _maxvalues = 1; + private int _minValues = 1; + private int _maxValues = 1; private string _placeholder; - private string _label; private string _customId; /// @@ -667,19 +654,6 @@ public SelectMenuBuilder(string customId, List options) this.Options = options; } - /// - /// Sets the field label. - /// - /// The value to set the field label to. - /// - /// The current builder. - /// - public SelectMenuBuilder WithLabel(string label) - { - this.Label = label; - return this; - } - /// /// Sets the field CustomId. /// @@ -745,15 +719,28 @@ public SelectMenuBuilder WithOptions(List options) return this; } + /// + /// Sets whether the current menu is disabled. + /// + /// Whether the current menu is disabled or not. + /// + /// The current builder. + /// + public SelectMenuBuilder WithDisabled(bool disabled) + { + this.Disabled = disabled; + return this; + } + /// /// Builds a /// /// The newly built public SelectMenu Build() { - var opt = this.Options?.Select(x => x.Build()).ToList(); + var options = this.Options?.Select(x => x.Build()).ToList(); - return new SelectMenu(this.CustomId, opt, this.Placeholder, this.MinValues, this.MaxValues); + return new SelectMenu(this.CustomId, options, this.Placeholder, this.MinValues, this.MaxValues, this.Disabled); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs index 70fd363983..13eb53c6af 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs @@ -39,13 +39,19 @@ public class SelectMenu : IMessageComponent /// public int MaxValues { get; } - internal SelectMenu(string customId, List options, string placeholder, int minValues, int maxValues) + /// + /// Whether this menu is disabled or not. + /// + public bool Disabled { get; } + + internal SelectMenu(string customId, List options, string placeholder, int minValues, int maxValues, bool disabled) { this.CustomId = customId; this.Options = options; this.Placeholder = placeholder; this.MinValues = minValues; this.MaxValues = maxValues; + this.Disabled = disabled; } } } diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs index e206ec11a9..6de1d4a4db 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -27,6 +27,9 @@ internal class SelectMenuComponent : IMessageComponent [JsonProperty("max_values")] public int MaxValues { get; set; } + [JsonProperty("disabled")] + public bool Disabled { get; set; } + public SelectMenuComponent() { } public SelectMenuComponent(Discord.SelectMenu component) @@ -37,6 +40,7 @@ public SelectMenuComponent(Discord.SelectMenu component) this.Placeholder = component.Placeholder; this.MinValues = component.MinValues; this.MaxValues = component.MaxValues; + this.Disabled = component.Disabled; } } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index fd4b1ffb41..c9aba15f82 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -174,7 +174,8 @@ internal virtual void Update(Model model) z.Default.ToNullable())).ToList(), parsed.Placeholder.GetValueOrDefault(), parsed.MinValues, - parsed.MaxValues + parsed.MaxValues, + parsed.Disabled ); } default: @@ -230,7 +231,7 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.Embeds => Embeds; /// IReadOnlyCollection IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); - + /// IReadOnlyCollection IMessage.Components => Components; diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index b6619421b7..82c656486d 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -209,7 +209,8 @@ internal virtual void Update(ClientState state, Model model) z.Default.ToNullable())).ToList(), parsed.Placeholder.GetValueOrDefault(), parsed.MinValues, - parsed.MaxValues + parsed.MaxValues, + parsed.Disabled ); } default: @@ -252,7 +253,7 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.MentionedRoleIds => MentionedRoles.Select(x => x.Id).ToImmutableArray(); /// IReadOnlyCollection IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); - + /// IReadOnlyCollection IMessage.Components => Components; From e2e20284a4942ff42fea7fda7d7d240f484f64b7 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Wed, 21 Jul 2021 07:25:04 -0400 Subject: [PATCH 117/494] Update limits per Discord API docs (https://discord.com/developers/docs/interactions/slash-commands#a-quick-note-on-limits) (#51) --- .../Entities/Interactions/SlashCommandBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index d707001383..e0afde50cb 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -23,7 +23,7 @@ public class SlashCommandBuilder /// /// Returns the maximum count of command options allowed by Discord /// - public const int MaxOptionsCount = 10; + public const int MaxOptionsCount = 25; /// /// The name of this slash command. @@ -282,7 +282,7 @@ public class SlashCommandOptionBuilder /// /// The maximum number of choices allowed by Discord. /// - public const int MaxChoiceCount = 10; + public const int MaxChoiceCount = 25; private string _name; private string _description; From e6c73e1ada561c384bbab25fb0783974ee954001 Mon Sep 17 00:00:00 2001 From: Ge Date: Thu, 22 Jul 2021 22:31:17 +0800 Subject: [PATCH 118/494] Fixed ModifyCommandPermissions Invalid Form Body error (#55) --- ...ifyGuildApplicationCommandPermissionsParams.cs | 15 +++++++++++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- .../Entities/Interactions/InteractionHelper.cs | 13 +++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs new file mode 100644 index 0000000000..af8ee95d40 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs @@ -0,0 +1,15 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ModifyGuildApplicationCommandPermissionsParams + { + [JsonProperty("permissions")] + public ApplicationCommandPermissions[] Permissions { get; set; } + } +} diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 36259b01a9..56bfed20ed 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1004,7 +1004,7 @@ public async Task GetGuildApplicationCommandP return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyApplicationCommandPermissions(ApplicationCommandPermissions[] permissions, ulong guildId, ulong commandId, RequestOptions options = null) + public async Task ModifyApplicationCommandPermissions(ModifyGuildApplicationCommandPermissionsParams permissions, ulong guildId, ulong commandId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); Preconditions.NotEqual(commandId, 0, nameof(commandId)); diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index ec32623c7f..7c5de2ee91 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -377,21 +377,26 @@ public static async Task ModifyGuildCommandPe Preconditions.AtMost(args.Length, 10, nameof(args)); Preconditions.GreaterThan(args.Length, 0, nameof(args)); - List models = new List(); + List permissionsList = new List(); foreach (var arg in args) { - var model = new ApplicationCommandPermissions() + var permissions = new ApplicationCommandPermissions() { Id = arg.TargetId, Permission = arg.Permission, Type = arg.TargetType }; - models.Add(model); + permissionsList.Add(permissions); } - var apiModel = await client.ApiClient.ModifyApplicationCommandPermissions(models.ToArray(), guildId, commandId, options); + ModifyGuildApplicationCommandPermissionsParams model = new ModifyGuildApplicationCommandPermissionsParams() + { + Permissions = permissionsList.ToArray() + }; + + var apiModel = await client.ApiClient.ModifyApplicationCommandPermissions(model, guildId, commandId, options); return new GuildApplicationCommandPermission(apiModel.Id, apiModel.ApplicationId, guildId, apiModel.Permissions.Select( x => new ApplicationCommandPermission(x.Id, x.Type, x.Permission)).ToArray()); From e8ba24dc0a80bfafeebe245baecd25506fc09a0f Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 22 Jul 2021 11:33:58 -0300 Subject: [PATCH 119/494] Update SocketSlashCommand.cs Fix #53 --- .../Entities/Interaction/Slash Commands/SocketSlashCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 78fd3b715e..c5f986eed1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -65,7 +65,7 @@ public override async Task RespondAsync(Embed[] embeds = null, string text = nul if (Discord.AlwaysAcknowledgeInteractions) { - await FollowupAsync(embeds, text, isTTS, ephemeral, type, allowedMentions, options); + await FollowupAsync(embeds, text, isTTS, ephemeral, type, allowedMentions, options, component); return; } From 5e3f119e95937829dddaf32b3c83d3f27cc13159 Mon Sep 17 00:00:00 2001 From: Nikon <47792796+INikonI@users.noreply.github.com> Date: Fri, 23 Jul 2021 08:58:59 +0500 Subject: [PATCH 120/494] Improvements builders docs and adding/renaming methods/constructors and some fixes (#50) * Refactor emojis/emotes & SelectMenu * Update Emoji.cs * Continue emoji refactor * Remove WithLabel from example of SelectMenuBuilder * Remove EmojiUtils and move it stuff to Emoji * Revert 0fbf1000daf5d2afc130797a3ee2421b120beaa2 * Revert "Update Emoji.cs" and add Parse method This reverts commit f297dcfc4320c55ba7108b8e7ef9fa5ad35cd3bc. * Partial revert 3c27ab36c9a0603ac9b1a7819d1be6bb37d7213a * Builders docs improve and add/rename methods/ctors * Update Discord.Net.Core.xml * Add SelectMenuBuilder.AddOption overload * Docs fix * Update Discord.Net.Core.xml * corrections of unnecessary docs * corrections of unnecessary docs! * Fix docs and exceptions --- src/Discord.Net.Core/Discord.Net.Core.xml | 155 ++++++--- .../Message Components/ComponentBuilder.cs | 307 +++++++++++------- .../Entities/Messages/EmbedBuilder.cs | 28 +- 3 files changed, 321 insertions(+), 169 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 76a02fffb3..a72df4e097 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4371,11 +4371,13 @@ Gets or sets the Action Rows for this Component Builder. + cannot be null. + count exceeds . - Adds a to the first row, if the first row cannot - accept the component then it will add it to a row that can + Adds a to the at the specific row. + If the row cannot accept the component then it will add it to a row that can. The label of the menu. The custom id of the menu. @@ -4387,20 +4389,15 @@ The row to add the menu to. - - - Adds a to the first row, if the first row cannot - accept the component then it will add it to a row that can - - The menu to add - The current builder. - - Adds a to the current builder at the specific row. + Adds a to the at the specific row. + If the row cannot accept the component then it will add it to a row that can. The menu to add. The row to attempt to add this component on. + There is no more row to add a menu. + must be less than . The current builder. @@ -4416,26 +4413,22 @@ The row the button should be placed on. The current builder. - - - Adds a button to the first row. - - The button to add to the first row. - The current builder. - - Adds a button to the specified row. + Adds a to the at the specific row. + If the row cannot accept the component then it will add it to a row that can. The button to add. The row to add the button. + There is no more row to add a menu. + must be less than . The current builder. Builds this builder into a used to send your components. - A that can be sent with + A that can be sent with . @@ -4451,19 +4444,23 @@ Gets or sets the components inside this row. + cannot be null. + count exceeds . Adds a list of components to the current row. The list of components to add. + The current builder. - + Adds a component at the end of the current row. The component to add. + Components count reached The current builder. @@ -4471,8 +4468,6 @@ Builds the current builder to a that can be used within a A that can be used within a - cannot be null. - There must be at least 1 component in a row. @@ -4483,11 +4478,13 @@ Gets or sets the label of the current button. + length exceeds . Gets or sets the custom id of the current button. + length exceeds @@ -4509,6 +4506,27 @@ Gets or sets whether the current button is disabled. + + + Creates a new instance of a . + + + + + Creates a new instance of a . + + The label to use on the newly created link button. + The url of this button. + The custom ID of this button + The custom ID of this button + The emote of this button + Disabled this button or not + + + + Creates a new instance of a from instance of a . + + Creates a button with the style. @@ -4554,6 +4572,7 @@ Sets the current buttons label to the specified text. The text for the label + The current builder. @@ -4582,6 +4601,7 @@ Sets the custom id of the current button. The id to use for the current button. + The current builder. @@ -4596,8 +4616,8 @@ Builds this builder into a to be used in a . A to be used in a . - A button cannot contain a URL and a CustomId. - A button must have an Emote or a label. + A button cannot contain a and a . + A button must have an or a . @@ -4623,26 +4643,32 @@ Gets or sets the custom id of the current select menu. + length exceeds . Gets or sets the placeholder text of the current select menu. + length exceeds . Gets or sets the minimum values of the current select menu. + exceeds . Gets or sets the maximum values of the current select menu. + exceeds . Gets or sets a collection of for this current select menu. + count exceeds . + is null. @@ -4654,18 +4680,28 @@ Creates a new instance of a . - + + + Creates a new instance of a from instance of . + + + Creates a new instance of a . The custom id of this select menu. The options for this select menu. + The placeholder of this select menu. + The max values of this select menu. + The min values of this select menu. + Disabled this select menu or not. Sets the field CustomId. The value to set the field CustomId to. + The current builder. @@ -4675,6 +4711,7 @@ Sets the field placeholder. The value to set the field placeholder to. + The current builder. @@ -4684,6 +4721,7 @@ Sets the field minValues. The value to set the field minValues to. + The current builder. @@ -4693,6 +4731,7 @@ Sets the field maxValues.
The value to set the field maxValues to. + The current builder. @@ -4702,6 +4741,31 @@ Sets the field options.
The value to set the field options to. + + + The current builder. + +
+ + + Add one option to menu options. + + The option builder class containing the option properties. + Options count reached . + + The current builder. + + + + + Add one option to menu options. + + The label for this option. + The value of this option. + The description of this option. + The emote of this option. + Render this option as selected by default or not. + Options count reached . The current builder. @@ -4735,16 +4799,19 @@ Gets or sets the label of the current select menu. + length exceeds Gets or sets the custom id of the current select menu. + length exceeds . Gets or sets this menu options description. + length exceeds . @@ -4761,18 +4828,22 @@ Creates a new instance of a . - + Creates a new instance of a . The label for this option. The value of this option. + The description of this option. + The emote of this option. + Render this option as selected by default or not. Sets the field label. The value to set the field label to. + The current builder. @@ -4782,6 +4853,7 @@ Sets the field value.
The value to set the field value to. + The current builder. @@ -4791,6 +4863,7 @@ Sets the field description.
The value to set the field description to. + The current builder. @@ -5568,23 +5641,23 @@
- - Returns the maximum number of fields allowed by Discord. + + Returns the maximum number of fields allowed by Discord. - - Returns the maximum length of title allowed by Discord. + + Returns the maximum length of title allowed by Discord. - - Returns the maximum length of description allowed by Discord. + + Returns the maximum length of description allowed by Discord. - - Returns the maximum length of total characters allowed by Discord. + + Returns the maximum length of total characters allowed by Discord. @@ -5618,9 +5691,9 @@ Gets or sets the list of of an . - An embed builder's fields collection is set to + An embed builder's fields collection is set to null. - Description length exceeds . + Fields count exceeds . The list of existing . @@ -5661,7 +5734,7 @@ Gets the total length of all embed properties. - The combined length of , , , + The combined length of , , , , , and . @@ -5675,7 +5748,7 @@ - + Sets the description of an . The description to be set. @@ -5684,7 +5757,7 @@ - + Sets the URL of an . The URL to be set. @@ -5693,7 +5766,7 @@ - + Sets the thumbnail URL of an . The thumbnail URL to be set. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 5a5145a275..89bd6598a5 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -27,6 +27,8 @@ public class ComponentBuilder /// /// Gets or sets the Action Rows for this Component Builder. /// + /// cannot be null. + /// count exceeds . public List ActionRows { get => _actionRows; @@ -43,8 +45,8 @@ public List ActionRows private List _actionRows { get; set; } /// - /// Adds a to the first row, if the first row cannot - /// accept the component then it will add it to a row that can + /// Adds a to the at the specific row. + /// If the row cannot accept the component then it will add it to a row that can. /// /// The label of the menu. /// The custom id of the menu. @@ -69,38 +71,34 @@ public ComponentBuilder WithSelectMenu(string label, string customId, List - /// Adds a to the first row, if the first row cannot - /// accept the component then it will add it to a row that can - /// - /// The menu to add - /// The current builder. - public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu) - => WithSelectMenu(menu, 0); - - /// - /// Adds a to the current builder at the specific row. + /// Adds a to the at the specific row. + /// If the row cannot accept the component then it will add it to a row that can. /// /// The menu to add. /// The row to attempt to add this component on. + /// There is no more row to add a menu. + /// must be less than . /// The current builder. - public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row) + public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row = 0) { - Preconditions.LessThan(row, 5, nameof(row)); + Preconditions.LessThan(row, MaxActionRowCount, nameof(row)); var builtMenu = menu.Build(); if (_actionRows == null) { - _actionRows = new List(); - _actionRows.Add(new ActionRowBuilder().WithComponent(builtMenu)); + _actionRows = new List + { + new ActionRowBuilder().AddComponent(builtMenu) + }; } else { if (_actionRows.Count == row) - _actionRows.Add(new ActionRowBuilder().WithComponent(builtMenu)); + _actionRows.Add(new ActionRowBuilder().AddComponent(builtMenu)); else { - ActionRowBuilder actionRow = null; + ActionRowBuilder actionRow; if (_actionRows.Count > row) actionRow = _actionRows.ElementAt(row); else @@ -110,11 +108,11 @@ public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row) } if (actionRow.CanTakeComponent(builtMenu)) - actionRow.WithComponent(builtMenu); - else if (row < 5) + actionRow.AddComponent(builtMenu); + else if (row < MaxActionRowCount) WithSelectMenu(menu, row + 1); else - throw new ArgumentOutOfRangeException($"There is no more room to add a {nameof(builtMenu)}"); + throw new InvalidOperationException($"There is no more row to add a {nameof(builtMenu)}"); } } @@ -153,37 +151,32 @@ public ComponentBuilder WithButton( } /// - /// Adds a button to the first row. - /// - /// The button to add to the first row. - /// The current builder. - public ComponentBuilder WithButton(ButtonBuilder button) - => this.WithButton(button, 0); - - /// - /// Adds a button to the specified row. + /// Adds a to the at the specific row. + /// If the row cannot accept the component then it will add it to a row that can. /// /// The button to add. /// The row to add the button. + /// There is no more row to add a menu. + /// must be less than . /// The current builder. public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) { - Preconditions.LessThan(row, 5, nameof(row)); + Preconditions.LessThan(row, MaxActionRowCount, nameof(row)); var builtButton = button.Build(); if (_actionRows == null) { _actionRows = new List(); - _actionRows.Add(new ActionRowBuilder().WithComponent(builtButton)); + _actionRows.Add(new ActionRowBuilder().AddComponent(builtButton)); } else { if (_actionRows.Count == row) - _actionRows.Add(new ActionRowBuilder().WithComponent(builtButton)); + _actionRows.Add(new ActionRowBuilder().AddComponent(builtButton)); else { - ActionRowBuilder actionRow = null; + ActionRowBuilder actionRow; if(_actionRows.Count > row) actionRow = _actionRows.ElementAt(row); else @@ -193,11 +186,11 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) } if (actionRow.CanTakeComponent(builtButton)) - actionRow.WithComponent(builtButton); - else if (row < 5) + actionRow.AddComponent(builtButton); + else if (row < MaxActionRowCount) WithButton(button, row + 1); else - throw new ArgumentOutOfRangeException($"There is no more room to add a {nameof(button)}"); + throw new InvalidOperationException($"There is no more row to add a {nameof(button)}"); } } @@ -207,7 +200,7 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) /// /// Builds this builder into a used to send your components. /// - /// A that can be sent with + /// A that can be sent with . public MessageComponent Build() { if (this._actionRows != null) @@ -230,14 +223,22 @@ public class ActionRowBuilder /// /// Gets or sets the components inside this row. /// + /// cannot be null. + /// count exceeds . public List Components { get => _components; set { - if (value != null) - if (value.Count > MaxChildCount) - throw new ArgumentException(message: $"Action row can only contain {MaxChildCount} child components!", paramName: nameof(Components)); + if (value == null) + throw new ArgumentNullException(message: "Action row components cannot be null!", paramName: nameof(Components)); + + if (value.Count <= 0) + throw new ArgumentException(message: "There must be at least 1 component in a row", paramName: nameof(Components)); + + if (value.Count > MaxChildCount) + throw new ArgumentException(message: $"Action row can only contain {MaxChildCount} child components!", paramName: nameof(Components)); + _components = value; } } @@ -248,6 +249,7 @@ public List Components /// Adds a list of components to the current row. /// /// The list of components to add. + /// /// The current builder. public ActionRowBuilder WithComponents(List components) { @@ -259,14 +261,14 @@ public ActionRowBuilder WithComponents(List components) /// Adds a component at the end of the current row. /// /// The component to add. + /// Components count reached /// The current builder. - public ActionRowBuilder WithComponent(IMessageComponent component) + public ActionRowBuilder AddComponent(IMessageComponent component) { - if (this.Components == null) - this.Components = new List(); + if (this.Components.Count >= MaxChildCount) + throw new InvalidOperationException($"Components count reached {MaxChildCount}"); this.Components.Add(component); - return this; } @@ -274,16 +276,8 @@ public ActionRowBuilder WithComponent(IMessageComponent component) /// Builds the current builder to a that can be used within a /// /// A that can be used within a - /// cannot be null. - /// There must be at least 1 component in a row. public ActionRowComponent Build() { - if (this.Components == null) - throw new ArgumentNullException($"{nameof(Components)} cannot be null!"); - - if (this.Components.Count == 0) - throw new ArgumentException("There must be at least 1 component in a row"); - return new ActionRowComponent(this._components); } @@ -314,14 +308,14 @@ public class ButtonBuilder /// /// Gets or sets the label of the current button. /// + /// length exceeds . public string Label { get => _label; set { - if (value != null) - if (value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value != null && value.Length > ComponentBuilder.MaxLabelLength) + throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } @@ -330,14 +324,14 @@ public string Label /// /// Gets or sets the custom id of the current button. /// + /// length exceeds public string CustomId { get => _customId; set { - if (value != null) - if (value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + if (value != null && value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); _customId = value; } } @@ -366,6 +360,43 @@ public string CustomId private string _label; private string _customId; + /// + /// Creates a new instance of a . + /// + public ButtonBuilder() { } + + /// + /// Creates a new instance of a . + /// + /// The label to use on the newly created link button. + /// The url of this button. + /// The custom ID of this button + /// The custom ID of this button + /// The emote of this button + /// Disabled this button or not + public ButtonBuilder(string label, string customId, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool disabled = false) + { + this.CustomId = customId; + this.Style = style; + this.Url = url; + this.Label = label; + this.Disabled = disabled; + this.Emote = emote; + } + + /// + /// Creates a new instance of a from instance of a . + /// + public ButtonBuilder(ButtonComponent button) + { + this.CustomId = button.CustomId; + this.Style = button.Style; + this.Url = button.Url; + this.Label = button.Label; + this.Disabled = button.Disabled; + this.Emote = button.Emote; + } + /// /// Creates a button with the style. /// @@ -373,14 +404,7 @@ public string CustomId /// The url for this link button to go to. /// A builder with the newly created button. public static ButtonBuilder CreateLinkButton(string label, string url) - { - var builder = new ButtonBuilder() - .WithStyle(ButtonStyle.Link) - .WithUrl(url) - .WithLabel(label); - - return builder; - } + => new ButtonBuilder(label, null, ButtonStyle.Link, url); /// /// Creates a button with the style. @@ -389,14 +413,7 @@ public static ButtonBuilder CreateLinkButton(string label, string url) /// The custom id for this danger button. /// A builder with the newly created button. public static ButtonBuilder CreateDangerButton(string label, string customId) - { - var builder = new ButtonBuilder() - .WithStyle(ButtonStyle.Danger) - .WithCustomId(customId) - .WithLabel(label); - - return builder; - } + => new ButtonBuilder(label, customId, ButtonStyle.Danger); /// /// Creates a button with the style. @@ -405,14 +422,7 @@ public static ButtonBuilder CreateDangerButton(string label, string customId) /// The custom id for this primary button. /// A builder with the newly created button. public static ButtonBuilder CreatePrimaryButton(string label, string customId) - { - var builder = new ButtonBuilder() - .WithStyle(ButtonStyle.Primary) - .WithCustomId(customId) - .WithLabel(label); - - return builder; - } + => new ButtonBuilder(label, customId); /// /// Creates a button with the style. @@ -421,14 +431,7 @@ public static ButtonBuilder CreatePrimaryButton(string label, string customId) /// The custom id for this secondary button. /// A builder with the newly created button. public static ButtonBuilder CreateSecondaryButton(string label, string customId) - { - var builder = new ButtonBuilder() - .WithStyle(ButtonStyle.Secondary) - .WithCustomId(customId) - .WithLabel(label); - - return builder; - } + => new ButtonBuilder(label, customId, ButtonStyle.Secondary); /// /// Creates a button with the style. @@ -437,19 +440,13 @@ public static ButtonBuilder CreateSecondaryButton(string label, string customId) /// The custom id for this success button. /// A builder with the newly created button. public static ButtonBuilder CreateSuccessButton(string label, string customId) - { - var builder = new ButtonBuilder() - .WithStyle(ButtonStyle.Success) - .WithCustomId(customId) - .WithLabel(label); - - return builder; - } + => new ButtonBuilder(label, customId, ButtonStyle.Success); /// /// Sets the current buttons label to the specified text. /// /// The text for the label + /// /// The current builder. public ButtonBuilder WithLabel(string label) { @@ -494,6 +491,7 @@ public ButtonBuilder WithUrl(string url) /// Sets the custom id of the current button. /// /// The id to use for the current button. + /// /// The current builder. public ButtonBuilder WithCustomId(string id) { @@ -516,15 +514,15 @@ public ButtonBuilder WithDisabled(bool disabled) /// Builds this builder into a to be used in a . /// /// A to be used in a . - /// A button cannot contain a URL and a CustomId. - /// A button must have an Emote or a label. + /// A button cannot contain a and a . + /// A button must have an or a . public ButtonComponent Build() { if (string.IsNullOrEmpty(this.Label) && this.Emote == null) - throw new ArgumentException("A button must have an Emote or a label!"); + throw new InvalidOperationException("A button must have an Emote or a label!"); if (!string.IsNullOrEmpty(this.Url) && !string.IsNullOrEmpty(this.CustomId)) - throw new InvalidOperationException("A button cannot contain a URL and a CustomId"); + throw new InvalidOperationException("A button cannot contain a URL and a CustomId!"); if (this.Style == ButtonStyle.Link && !string.IsNullOrEmpty(this.CustomId)) this.CustomId = null; @@ -559,14 +557,14 @@ public class SelectMenuBuilder /// /// Gets or sets the custom id of the current select menu. /// + /// length exceeds . public string CustomId { get => _customId; set { - if (value != null) - if (value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + if (value != null && value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); _customId = value; } } @@ -574,6 +572,7 @@ public string CustomId /// /// Gets or sets the placeholder text of the current select menu. /// + /// length exceeds . public string Placeholder { get => _placeholder; @@ -589,6 +588,7 @@ public string Placeholder /// /// Gets or sets the minimum values of the current select menu. /// + /// exceeds . public int MinValues { get => _minValues; @@ -602,6 +602,7 @@ public int MinValues /// /// Gets or sets the maximum values of the current select menu. /// + /// exceeds . public int MaxValues { get => _maxValues; @@ -615,6 +616,8 @@ public int MaxValues /// /// Gets or sets a collection of for this current select menu. /// + /// count exceeds . + /// is null. public List Options { get => _options; @@ -622,6 +625,8 @@ public List Options { if (value != null) Preconditions.LessThan(value.Count, MaxOptionCount, nameof(Options)); + else + throw new ArgumentNullException(nameof(value)); _options = value; } @@ -632,7 +637,7 @@ public List Options /// public bool Disabled { get; set; } - private List _options; + private List _options = new List(); private int _minValues = 1; private int _maxValues = 1; private string _placeholder; @@ -643,21 +648,45 @@ public List Options /// public SelectMenuBuilder() { } + /// + /// Creates a new instance of a from instance of . + /// + public SelectMenuBuilder(SelectMenu selectMenu) + { + this.Placeholder = selectMenu.Placeholder; + this.CustomId = selectMenu.Placeholder; + this.MaxValues = selectMenu.MaxValues; + this.MinValues = selectMenu.MinValues; + this.Disabled = selectMenu.Disabled; + this.Options = selectMenu.Options? + .Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)) + .ToList(); + } + /// /// Creates a new instance of a . /// /// The custom id of this select menu. /// The options for this select menu. - public SelectMenuBuilder(string customId, List options) + /// The placeholder of this select menu. + /// The max values of this select menu. + /// The min values of this select menu. + /// Disabled this select menu or not. + public SelectMenuBuilder(string customId, List options, string placeholder = null, int maxValues = 1, int minValues = 1, bool disabled = false) { this.CustomId = customId; this.Options = options; + this.Placeholder = placeholder; + this.Disabled = disabled; + this.MaxValues = maxValues; + this.MinValues = minValues; } /// /// Sets the field CustomId. /// /// The value to set the field CustomId to. + /// /// /// The current builder. /// @@ -671,6 +700,7 @@ public SelectMenuBuilder WithCustomId(string customId) /// Sets the field placeholder. /// /// The value to set the field placeholder to. + /// /// /// The current builder. /// @@ -684,6 +714,7 @@ public SelectMenuBuilder WithPlaceholder(string placeholder) /// Sets the field minValues. /// /// The value to set the field minValues to. + /// /// /// The current builder. /// @@ -697,6 +728,7 @@ public SelectMenuBuilder WithMinValues(int minValues) /// Sets the field maxValues. ///
/// The value to set the field maxValues to. + /// /// /// The current builder. /// @@ -710,6 +742,7 @@ public SelectMenuBuilder WithMaxValues(int maxValues) /// Sets the field options. ///
/// The value to set the field options to. + /// /// /// The current builder. /// @@ -719,6 +752,41 @@ public SelectMenuBuilder WithOptions(List options) return this; } + /// + /// Add one option to menu options. + /// + /// The option builder class containing the option properties. + /// Options count reached . + /// + /// The current builder. + /// + public SelectMenuBuilder AddOption(SelectMenuOptionBuilder option) + { + if (this.Options.Count >= MaxOptionCount) + throw new InvalidOperationException($"Options count reached {MaxOptionCount}."); + + this.Options.Add(option); + return this; + } + + /// + /// Add one option to menu options. + /// + /// The label for this option. + /// The value of this option. + /// The description of this option. + /// The emote of this option. + /// Render this option as selected by default or not. + /// Options count reached . + /// + /// The current builder. + /// + public SelectMenuBuilder AddOption(string label, string value, string description = null, IEmote emote = null, bool? @default = null) + { + AddOption(new SelectMenuOptionBuilder(label, value, description, emote, @default)); + return this; + } + /// /// Sets whether the current menu is disabled. /// @@ -757,6 +825,7 @@ public class SelectMenuOptionBuilder /// /// Gets or sets the label of the current select menu. /// + /// length exceeds public string Label { get => _label; @@ -773,14 +842,14 @@ public string Label /// /// Gets or sets the custom id of the current select menu. /// + /// length exceeds . public string Value { get => _value; set { - if (value != null) - if (value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException(message: $"Value must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(Value)); + if (value != null && value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException(message: $"Value must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(Value)); _value = value; } } @@ -788,13 +857,14 @@ public string Value /// /// Gets or sets this menu options description. /// + /// length exceeds . public string Description { get => _description; set { - if (value != null) - Preconditions.LessThan(value.Length, MaxDescriptionLength, nameof(Description)); + if (value != null && value.Length > MaxDescriptionLength) + throw new ArgumentException($"Description must be {MaxDescriptionLength} characters or less!", nameof(Description)); _description = value; } @@ -824,16 +894,23 @@ public SelectMenuOptionBuilder() { } ///
/// The label for this option. /// The value of this option. - public SelectMenuOptionBuilder(string label, string value) + /// The description of this option. + /// The emote of this option. + /// Render this option as selected by default or not. + public SelectMenuOptionBuilder(string label, string value, string description = null, IEmote emote = null, bool? @default = null) { this.Label = label; this.Value = value; + this.Description = description; + this.Emote = emote; + this.Default = @default; } /// /// Sets the field label. /// /// The value to set the field label to. + /// /// /// The current builder. /// @@ -847,6 +924,7 @@ public SelectMenuOptionBuilder WithLabel(string label) /// Sets the field value. ///
/// The value to set the field value to. + /// /// /// The current builder. /// @@ -860,6 +938,7 @@ public SelectMenuOptionBuilder WithValue(string value) /// Sets the field description. ///
/// The value to set the field description to. + /// /// /// The current builder. /// diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 89aaf5fdef..2ac6efa6b3 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -16,20 +16,20 @@ public class EmbedBuilder private EmbedThumbnail? _thumbnail; private List _fields; - /// - /// Returns the maximum number of fields allowed by Discord. + /// + /// Returns the maximum number of fields allowed by Discord. /// public const int MaxFieldCount = 25; - /// - /// Returns the maximum length of title allowed by Discord. + /// + /// Returns the maximum length of title allowed by Discord. /// public const int MaxTitleLength = 256; - /// - /// Returns the maximum length of description allowed by Discord. + /// + /// Returns the maximum length of description allowed by Discord. /// public const int MaxDescriptionLength = 4096; - /// - /// Returns the maximum length of total characters allowed by Discord. + /// + /// Returns the maximum length of total characters allowed by Discord. /// public const int MaxEmbedLength = 6000; @@ -88,9 +88,9 @@ public string ImageUrl } /// Gets or sets the list of of an . - /// An embed builder's fields collection is set to + /// An embed builder's fields collection is set to /// null. - /// Description length exceeds . + /// Fields count exceeds . /// /// The list of existing . public List Fields @@ -137,7 +137,7 @@ public List Fields /// Gets the total length of all embed properties. /// /// - /// The combined length of , , , + /// The combined length of , , , /// , , and . /// public int Length @@ -166,7 +166,7 @@ public EmbedBuilder WithTitle(string title) Title = title; return this; } - /// + /// /// Sets the description of an . /// /// The description to be set. @@ -178,7 +178,7 @@ public EmbedBuilder WithDescription(string description) Description = description; return this; } - /// + /// /// Sets the URL of an . /// /// The URL to be set. @@ -190,7 +190,7 @@ public EmbedBuilder WithUrl(string url) Url = url; return this; } - /// + /// /// Sets the thumbnail URL of an . /// /// The thumbnail URL to be set. From 8433476adda7ac7715079e4fe0c800d819c9aa86 Mon Sep 17 00:00:00 2001 From: Nikon <47792796+INikonI@users.noreply.github.com> Date: Sat, 24 Jul 2021 08:53:12 +0500 Subject: [PATCH 121/494] Remove necessary things and some fix/changes (#57) * Refactor emojis/emotes & SelectMenu * Update Emoji.cs * Continue emoji refactor * Remove WithLabel from example of SelectMenuBuilder * Remove EmojiUtils and move it stuff to Emoji * Revert 0fbf1000daf5d2afc130797a3ee2421b120beaa2 * Revert "Update Emoji.cs" and add Parse method This reverts commit f297dcfc4320c55ba7108b8e7ef9fa5ad35cd3bc. * Partial revert 3c27ab36c9a0603ac9b1a7819d1be6bb37d7213a * Builders docs improve and add/rename methods/ctors * Update Discord.Net.Core.xml * Add SelectMenuBuilder.AddOption overload * Docs fix * Update Discord.Net.Core.xml * corrections of unnecessary docs * corrections of unnecessary docs! * Fix docs and exceptions * remove necessary things and some fix/changes - Rename InteractionApplicationCommanCallbackData -> InteractionCallbackData - Fix wrong creating instances of InteractionCallbackData * Add SelectMenuOptionBuilder ctor overload --- src/Discord.Net.Core/Discord.Net.Core.xml | 5 +++++ .../Message Components/ComponentBuilder.cs | 12 ++++++++++++ src/Discord.Net.Core/Utils/Optional.cs | 10 +++++----- ...dCallbackData.cs => InteractionCallbackData.cs} | 14 +------------- .../API/Common/InteractionResponse.cs | 2 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- .../Discord.Net.WebSocket.xml | 4 ++-- .../Message Components/SocketMessageComponent.cs | 11 +++++------ .../Slash Commands/SocketSlashCommand.cs | 11 +++++------ .../Entities/Interaction/SocketInteraction.cs | 4 ++-- 10 files changed, 39 insertions(+), 36 deletions(-) rename src/Discord.Net.Rest/API/Common/{InteractionApplicationCommandCallbackData.cs => InteractionCallbackData.cs} (68%) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index a72df4e097..db3bbe3aa9 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4838,6 +4838,11 @@ The emote of this option. Render this option as selected by default or not. + + + Creates a new instance of a from instance of a . + + Sets the field label. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 89bd6598a5..b2423796d5 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -906,6 +906,18 @@ public SelectMenuOptionBuilder(string label, string value, string description = this.Default = @default; } + /// + /// Creates a new instance of a from instance of a . + /// + public SelectMenuOptionBuilder(SelectMenuOption option) + { + this.Label = option.Label; + this.Value = option.Value; + this.Description = option.Description; + this.Emote = option.Emote; + this.Default = option.Default; + } + /// /// Sets the field label. /// diff --git a/src/Discord.Net.Core/Utils/Optional.cs b/src/Discord.Net.Core/Utils/Optional.cs index 3481796997..985be92402 100644 --- a/src/Discord.Net.Core/Utils/Optional.cs +++ b/src/Discord.Net.Core/Utils/Optional.cs @@ -7,7 +7,7 @@ namespace Discord [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public struct Optional { - public static Optional Unspecified => default(Optional); + public static Optional Unspecified => default; private readonly T _value; /// Gets the value for this parameter. @@ -43,18 +43,18 @@ public override bool Equals(object other) public override int GetHashCode() => IsSpecified ? _value.GetHashCode() : 0; public override string ToString() => IsSpecified ? _value?.ToString() : null; - private string DebuggerDisplay => IsSpecified ? (_value?.ToString() ?? "") : ""; + private string DebuggerDisplay => IsSpecified ? _value?.ToString() ?? "" : ""; - public static implicit operator Optional(T value) => new Optional(value); + public static implicit operator Optional(T value) => new(value); public static explicit operator T(Optional value) => value.Value; } public static class Optional { public static Optional Create() => Optional.Unspecified; - public static Optional Create(T value) => new Optional(value); + public static Optional Create(T value) => new(value); public static T? ToNullable(this Optional val) where T : struct - => val.IsSpecified ? val.Value : (T?)null; + => val.IsSpecified ? val.Value : null; } } diff --git a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs similarity index 68% rename from src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs rename to src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index 3f7cf93e00..f6e3dcbeee 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionApplicationCommandCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -1,13 +1,8 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { - internal class InteractionApplicationCommandCallbackData + internal class InteractionCallbackData { [JsonProperty("tts")] public Optional TTS { get; set; } @@ -27,12 +22,5 @@ internal class InteractionApplicationCommandCallbackData [JsonProperty("components")] public Optional Components { get; set; } - - public InteractionApplicationCommandCallbackData() { } - public InteractionApplicationCommandCallbackData(string text) - { - this.Content = text; - } - } } diff --git a/src/Discord.Net.Rest/API/Common/InteractionResponse.cs b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs index 6be48340b3..e50e8076ef 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionResponse.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs @@ -13,6 +13,6 @@ internal class InteractionResponse public InteractionResponseType Type { get; set; } [JsonProperty("data")] - public Optional Data { get; set; } + public Optional Data { get; set; } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 56bfed20ed..c24d1ed579 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -55,7 +55,7 @@ public DiscordRestApiClient(RestClientProvider restClientProvider, string userAg _restClientProvider = restClientProvider; UserAgent = userAgent; DefaultRetryMode = defaultRetryMode; - _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver() }; + _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver(), NullValueHandling = NullValueHandling.Ignore }; UseSystemClock = useSystemClock; RequestQueue = new RequestQueue(); diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 89d29ba092..9b285f33f0 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3452,7 +3452,7 @@ if the message should be read out by a text-to-speech reader, otherwise . A to send with this response The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. A to be sent with this response @@ -3487,7 +3487,7 @@ if the message should be read out by a text-to-speech reader, otherwise . A array of embeds to send with this response. Max 10 The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. A to be sent with this response diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index a89e6de069..8cbfc362e6 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -107,16 +107,15 @@ public override async Task RespondAsync(Embed[] embeds = null, string text = nul } - var response = new API.InteractionResponse() + var response = new API.InteractionResponse { Type = type, - Data = new API.InteractionApplicationCommandCallbackData(text) + Data = new API.InteractionCallbackData { + Content = text ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel(), - Embeds = embeds != null - ? embeds.Select(x => x.ToModel()).ToArray() - : Optional.Unspecified, - TTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + TTS = type == InteractionResponseType.ChannelMessageWithSource ? isTTS : Optional.Unspecified, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified } }; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index c5f986eed1..e3596ec504 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -90,16 +90,15 @@ public override async Task RespondAsync(Embed[] embeds = null, string text = nul } - var response = new API.InteractionResponse() + var response = new API.InteractionResponse { Type = type, - Data = new API.InteractionApplicationCommandCallbackData(text) + Data = new API.InteractionCallbackData { + Content = text ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel(), - Embeds = embeds != null - ? embeds.Select(x => x.ToModel()).ToArray() - : Optional.Unspecified, - TTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + TTS = isTTS ? true : Optional.Unspecified, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified } }; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 79a2c81dc3..e6a5a9d345 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -123,7 +123,7 @@ public Task RespondAsync(string text = null, bool isTTS = false, Embed embed = n /// if the message should be read out by a text-to-speech reader, otherwise . /// A to send with this response /// The type of response to this Interaction. - /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. /// A to be sent with this response @@ -161,7 +161,7 @@ public abstract Task RespondAsync(Embed[] embeds = null, string text = null, boo /// if the message should be read out by a text-to-speech reader, otherwise . /// A array of embeds to send with this response. Max 10 /// The type of response to this Interaction. - /// /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. /// A to be sent with this response From 180322177d06a27fdd6d56c211b2341c49b5fd1e Mon Sep 17 00:00:00 2001 From: Nikon <47792796+INikonI@users.noreply.github.com> Date: Tue, 27 Jul 2021 15:03:34 +0500 Subject: [PATCH 122/494] Refactor interaction methods and some changes (#58) * Refactor emojis/emotes & SelectMenu * Update Emoji.cs * Continue emoji refactor * Remove WithLabel from example of SelectMenuBuilder * Remove EmojiUtils and move it stuff to Emoji * Revert 0fbf1000daf5d2afc130797a3ee2421b120beaa2 * Revert "Update Emoji.cs" and add Parse method This reverts commit f297dcfc4320c55ba7108b8e7ef9fa5ad35cd3bc. * Partial revert 3c27ab36c9a0603ac9b1a7819d1be6bb37d7213a * Builders docs improve and add/rename methods/ctors * Update Discord.Net.Core.xml * Add SelectMenuBuilder.AddOption overload * Docs fix * Update Discord.Net.Core.xml * corrections of unnecessary docs * corrections of unnecessary docs! * Fix docs and exceptions * remove necessary things and some fix/changes - Rename InteractionApplicationCommanCallbackData -> InteractionCallbackData - Fix wrong creating instances of InteractionCallbackData * Add SelectMenuOptionBuilder ctor overload * Refactor interaction methods and some changes * Remove deprecated methods * remove necessary check * remove necessary? line drops and using * remove unused imports * fix! * some changes - switched places arguments - removed necessary accessor in SocketSlashCommand * mini doc fix * return AcknowledgeAsync method with Obsolete attribute * Clarification in UpdateAsync doc * Makes customId argument optional * UpdateAsync doc correction * makes button label argument optional * doc fix and add emote argument to static createbutton methods --- src/Discord.Net.Core/Discord.Net.Core.xml | 6 +- .../Message Components/ComponentBuilder.cs | 36 +++--- .../Entities/Messages/MessageProperties.cs | 7 +- .../API/Common/InteractionCallbackData.cs | 2 +- .../API/Rest/CreateWebhookMessageParams.cs | 7 +- .../API/Rest/ModifyMessageParams.cs | 4 +- .../Interactions/InteractionHelper.cs | 22 ++-- .../Entities/Messages/MessageHelper.cs | 17 +-- .../Messages/RestInteractionMessage.cs | 5 +- .../Discord.Net.WebSocket.xml | 88 ++++++-------- .../DiscordSocketClient.cs | 2 +- .../SocketMessageComponent.cs | 109 ++++++++++++++---- .../Slash Commands/SocketSlashCommand.cs | 63 +++++----- .../Entities/Interaction/SocketInteraction.cs | 84 +++++--------- .../WebhookClientHelper.cs | 9 +- 15 files changed, 243 insertions(+), 218 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index db3bbe3aa9..ad4a34eb80 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -7129,7 +7129,7 @@ Properties that are used to modify an with the specified changes. - The content of a message can be cleared with if and only if an + The content of a message can be cleared with if and only if an is present. @@ -7142,9 +7142,9 @@ This must be less than the constant defined by . - + - Gets or sets the embed the message should display. + Gets or sets the embeds of the message. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index b2423796d5..9317c0e64a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -120,7 +120,8 @@ public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row = 0) } /// - /// Adds a button to the specified row. + /// Adds a with specified parameters to the at the specific row. + /// If the row cannot accept the component then it will add it to a row that can. /// /// The label text for the newly added button. /// The style of this newly added button. @@ -131,8 +132,8 @@ public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row = 0) /// The row the button should be placed on. /// The current builder. public ComponentBuilder WithButton( - string label, - string customId, + string label = null, + string customId = null, ButtonStyle style = ButtonStyle.Primary, IEmote emote = null, string url = null, @@ -374,7 +375,7 @@ public ButtonBuilder() { } /// The custom ID of this button /// The emote of this button /// Disabled this button or not - public ButtonBuilder(string label, string customId, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool disabled = false) + public ButtonBuilder(string label = null, string customId = null, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool disabled = false) { this.CustomId = customId; this.Style = style; @@ -400,47 +401,52 @@ public ButtonBuilder(ButtonComponent button) /// /// Creates a button with the style. /// - /// The label to use on the newly created link button. + /// The label for this link button. /// The url for this link button to go to. + /// The emote for this link button /// A builder with the newly created button. - public static ButtonBuilder CreateLinkButton(string label, string url) - => new ButtonBuilder(label, null, ButtonStyle.Link, url); + public static ButtonBuilder CreateLinkButton(string label, string url, IEmote emote = null) + => new ButtonBuilder(label, null, ButtonStyle.Link, url, emote: emote); /// /// Creates a button with the style. /// /// The label for this danger button. /// The custom id for this danger button. + /// The emote for this danger button /// A builder with the newly created button. - public static ButtonBuilder CreateDangerButton(string label, string customId) - => new ButtonBuilder(label, customId, ButtonStyle.Danger); + public static ButtonBuilder CreateDangerButton(string label, string customId, IEmote emote = null) + => new ButtonBuilder(label, customId, ButtonStyle.Danger, emote: emote); /// /// Creates a button with the style. /// /// The label for this primary button. /// The custom id for this primary button. + /// The emote for this primary button /// A builder with the newly created button. - public static ButtonBuilder CreatePrimaryButton(string label, string customId) - => new ButtonBuilder(label, customId); + public static ButtonBuilder CreatePrimaryButton(string label, string customId, IEmote emote = null) + => new ButtonBuilder(label, customId, emote: emote); /// /// Creates a button with the style. /// /// The label for this secondary button. /// The custom id for this secondary button. + /// The emote for this secondary button /// A builder with the newly created button. - public static ButtonBuilder CreateSecondaryButton(string label, string customId) - => new ButtonBuilder(label, customId, ButtonStyle.Secondary); + public static ButtonBuilder CreateSecondaryButton(string label, string customId, IEmote emote = null) + => new ButtonBuilder(label, customId, ButtonStyle.Secondary, emote: emote); /// /// Creates a button with the style. /// /// The label for this success button. /// The custom id for this success button. + /// The emote for this success button /// A builder with the newly created button. - public static ButtonBuilder CreateSuccessButton(string label, string customId) - => new ButtonBuilder(label, customId, ButtonStyle.Success); + public static ButtonBuilder CreateSuccessButton(string label, string customId, IEmote emote = null) + => new ButtonBuilder(label, customId, ButtonStyle.Success, emote: emote); /// /// Sets the current buttons label to the specified text. diff --git a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs index c71d295200..f4971b69e1 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs @@ -4,7 +4,7 @@ namespace Discord /// Properties that are used to modify an with the specified changes. /// /// - /// The content of a message can be cleared with if and only if an + /// The content of a message can be cleared with if and only if an /// is present. /// /// @@ -17,10 +17,11 @@ public class MessageProperties /// This must be less than the constant defined by . /// public Optional Content { get; set; } + /// - /// Gets or sets the embed the message should display. + /// Gets or sets the embeds of the message. /// - public Optional Embed { get; set; } + public Optional Embeds { get; set; } /// /// Gets or sets the components for this message. diff --git a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index f6e3dcbeee..f03cb88701 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -11,7 +11,7 @@ internal class InteractionCallbackData public Optional Content { get; set; } [JsonProperty("embeds")] - public Optional Embeds { get; set; } + public Optional Embeds { get; set; } [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index 528bf8e077..bd4cc1a6c1 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -7,7 +7,7 @@ namespace Discord.API.Rest internal class CreateWebhookMessageParams { [JsonProperty("content")] - public string Content { get; } + public string Content { get; set; } [JsonProperty("nonce")] public Optional Nonce { get; set; } @@ -32,10 +32,5 @@ internal class CreateWebhookMessageParams [JsonProperty("components")] public Optional Components { get; set; } - - public CreateWebhookMessageParams(string content) - { - Content = content; - } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs index 69d9627671..21ed1a4189 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs @@ -8,8 +8,8 @@ internal class ModifyMessageParams { [JsonProperty("content")] public Optional Content { get; set; } - [JsonProperty("embed")] - public Optional Embed { get; set; } + [JsonProperty("embeds")] + public Optional Embeds { get; set; } [JsonProperty("components")] public Optional Components { get; set; } [JsonProperty("flags")] diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 7c5de2ee91..14516137d4 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord.Rest @@ -21,7 +20,7 @@ public static Task DeleteAllGlobalCommandsAsync(BaseDiscordClient client, Reques return client.ApiClient.BulkOverwriteGlobalApplicationCommands(new CreateApplicationCommandParams[0], options); } - public static Task SendInteractionResponse(BaseDiscordClient client, IMessageChannel channel, InteractionResponse response, + public static Task SendInteractionResponse(BaseDiscordClient client, InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { return client.ApiClient.CreateInteractionResponse(response, interactionId, interactionToken, options); @@ -298,14 +297,14 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil func(args); bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(message.Content); - bool hasEmbed = args.Embed.IsSpecified ? args.Embed.Value != null : message.Embeds.Any(); + bool hasEmbed = args.Embeds.IsSpecified ? args.Embeds.Value != null : message.Embeds.Any(); if (!hasText && !hasEmbed) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); var apiArgs = new API.Rest.ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create(), + Embeds = args.Embeds.IsSpecified ? args.Embeds.Value.Select(x => x.ToModel()).ToArray() : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; @@ -316,26 +315,21 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); - public static async Task ModifyInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, Action func, + public static async Task ModifyInteractionResponse(BaseDiscordClient client, string token, Action func, RequestOptions options = null) { var args = new MessageProperties(); func(args); - bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(message.Content); - bool hasEmbed = args.Embed.IsSpecified ? args.Embed.Value != null : message.Embeds.Any(); - if (!hasText && !hasEmbed) - Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); - - var apiArgs = new API.Rest.ModifyInteractionResponseParams + var apiArgs = new ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create(), - AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, + Embeds = args.Embeds.IsSpecified ? args.Embeds.Value?.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; - return await client.ApiClient.ModifyInteractionResponse(apiArgs, message.Token, options).ConfigureAwait(false); + return await client.ApiClient.ModifyInteractionResponse(apiArgs, token, options).ConfigureAwait(false); } public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 2062759ff5..5812a73163 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -30,11 +30,11 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie var args = new MessageProperties(); func(args); - if (msg.Author.Id != client.CurrentUser.Id && (args.Content.IsSpecified || args.Embed.IsSpecified || args.AllowedMentions.IsSpecified)) + if (msg.Author.Id != client.CurrentUser.Id && (args.Content.IsSpecified || args.Embeds.IsSpecified || args.AllowedMentions.IsSpecified)) throw new InvalidOperationException("Only the author of a message may modify the message content, embed, or allowed mentions."); bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(msg.Content); - bool hasEmbed = args.Embed.IsSpecified ? args.Embed.Value != null : msg.Embeds.Any(); + bool hasEmbed = args.Embeds.IsSpecified ? args.Embeds.Value != null : msg.Embeds.Any(); if (!hasText && !hasEmbed) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); @@ -61,13 +61,13 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie } } - var apiArgs = new API.Rest.ModifyMessageParams + var apiArgs = new ModifyMessageParams { Content = args.Content, - Embed = args.Embed.IsSpecified ? args.Embed.Value.ToModel() : Optional.Create(), + Embeds = args.Embeds.IsSpecified ? args.Embeds.Value.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, - Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), - AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), + Flags = args.Flags, + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, }; return await client.ApiClient.ModifyMessageAsync(msg.Channel.Id, msg.Id, apiArgs, options).ConfigureAwait(false); } @@ -78,7 +78,7 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi var args = new MessageProperties(); func(args); - if ((args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value)) && (args.Embed.IsSpecified && args.Embed.Value == null)) + if (args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value) && args.Embeds.IsSpecified && args.Embeds.Value == null) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); if (args.AllowedMentions.IsSpecified) @@ -86,6 +86,7 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi AllowedMentions allowedMentions = args.AllowedMentions.Value; Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(args.Embeds.Value?.Length ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -107,7 +108,7 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi var apiArgs = new API.Rest.ModifyMessageParams { Content = args.Content, - Embed = args.Embed.IsSpecified ? args.Embed.Value.ToModel() : Optional.Create(), + Embeds = args.Embeds.IsSpecified ? args.Embeds.Value.Select(x => x.ToModel()).ToArray() : Optional.Create(), Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), }; diff --git a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs index 6733966ad6..3574143fcb 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Message; @@ -64,7 +61,7 @@ public Task DeleteAsync() { try { - var model = await InteractionHelper.ModifyInteractionResponse(Discord, this, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyInteractionResponse(Discord, this.Token, func, options).ConfigureAwait(false); this.Update(model); } catch (Discord.Net.HttpException x) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 9b285f33f0..f223faa49a 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3223,16 +3223,24 @@ The message that contained the trigger for this interaction. - + - + + + Updates the original message of the component on which the interaction was received on. + + A delegate containing the properties to modify the message with. + The request options for this async request. + + - + Acknowledges this interaction with the . + The request options for this async request. A task that represents the asynchronous operation of acknowledging the interaction. @@ -3341,14 +3349,19 @@ The data associated with this interaction. - + - + - - + + + Acknowledges this interaction with the . + + + A task that represents the asynchronous operation of acknowledging the interaction. + @@ -3425,18 +3438,17 @@ if the token is valid for replying to, otherwise . - + - Responds to an Interaction. + Responds to an Interaction with type . If you have set to , You should use - instead. + instead. The text of the message to be sent. + A array of embeds to send with this response. Max 10 if the message should be read out by a text-to-speech reader, otherwise . - A to send with this response. - The type of response to this Interaction. if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. @@ -3444,49 +3456,13 @@ Message content is too long, length must be less or equal to . The parameters provided were invalid or the token was invalid. - + Sends a followup message for this interaction. The text of the message to be sent - if the message should be read out by a text-to-speech reader, otherwise . - A to send with this response - The type of response to this Interaction. - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response - - The sent message. - - - - - Responds to an Interaction. - - If you have set to , You should use - instead. - - - The text of the message to be sent. - if the message should be read out by a text-to-speech reader, otherwise . A array of embeds to send with this response. Max 10 - The type of response to this Interaction. - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response - Message content is too long, length must be less or equal to . - The parameters provided were invalid or the token was invalid. - - - - Sends a followup message for this interaction. - - The text of the message to be sent if the message should be read out by a text-to-speech reader, otherwise . - A array of embeds to send with this response. Max 10 - The type of response to this Interaction. if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. @@ -3500,11 +3476,19 @@ Gets the original response for this interaction. The request options for this async request. - A that represents the intitial response, or if there is no response. + A that represents the initial response. - + - Acknowledges this interaction with the . + Edits original response for this interaction. + + A delegate containing the properties to modify the message with. + The request options for this async request. + A that represents the initial response. + + + + Acknowledges this interaction. A task that represents the asynchronous operation of acknowledging the interaction. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f9eaeb0058..2c5b26016a 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1904,7 +1904,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var interaction = SocketInteraction.Create(this, data, channel as ISocketMessageChannel); if (this.AlwaysAcknowledgeInteractions) - await interaction.AcknowledgeAsync().ConfigureAwait(false); + await interaction.DeferAsync().ConfigureAwait(false); await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 8cbfc362e6..338ef52a03 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -1,11 +1,8 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Interaction; using DataModel = Discord.API.MessageComponentInteractionData; -using Newtonsoft.Json.Linq; using Discord.Rest; namespace Discord.WebSocket @@ -71,18 +68,21 @@ internal override void Update(Model model) } /// - public override async Task RespondAsync(Embed[] embeds = null, string text = null, bool isTTS = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + public override async Task RespondAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null) { - if (type == InteractionResponseType.Pong) - throw new InvalidOperationException($"Cannot use {Type} on a send message function"); - if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); if (Discord.AlwaysAcknowledgeInteractions) { - await FollowupAsync(embeds, text, isTTS, ephemeral, type, allowedMentions, options); + await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options); return; } @@ -109,13 +109,13 @@ public override async Task RespondAsync(Embed[] embeds = null, string text = nul var response = new API.InteractionResponse { - Type = type, + Type = InteractionResponseType.ChannelMessageWithSource, Data = new API.InteractionCallbackData { Content = text ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel(), Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - TTS = type == InteractionResponseType.ChannelMessageWithSource ? isTTS : Optional.Unspecified, + TTS = isTTS, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified } }; @@ -123,17 +123,78 @@ public override async Task RespondAsync(Embed[] embeds = null, string text = nul if (ephemeral) response.Data.Value.Flags = 64; - await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); + await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); } - /// - public override async Task FollowupAsync(Embed[] embeds = null, string text = null, bool isTTS = false, bool ephemeral = false, - InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + /// + /// Updates the message which this component resides in with the type + /// + /// A delegate containing the properties to modify the message with. + /// The request options for this async request. + /// A task that represents the asynchronous operation of updating the message. + public async Task UpdateAsync(Action func, RequestOptions options = null) { - if (type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.Pong) - throw new InvalidOperationException($"Cannot use {type} on a slash command!"); + var args = new MessageProperties(); + func(args); + + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (args.AllowedMentions.IsSpecified) + { + var allowedMentions = args.AllowedMentions.Value; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); + } + + if (args.Embeds.IsSpecified) + Preconditions.AtMost(args.Embeds.Value?.Length ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (args.AllowedMentions.IsSpecified && args.AllowedMentions.Value != null && args.AllowedMentions.Value.AllowedTypes.HasValue) + { + var allowedMentions = args.AllowedMentions.Value; + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) + && allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(args.AllowedMentions)); + } + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) + && allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(args.AllowedMentions)); + } + } + + var response = new API.InteractionResponse + { + Type = InteractionResponseType.UpdateMessage, + Data = new API.InteractionCallbackData + { + Content = args.Content, + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, + Embeds = args.Embeds.IsSpecified ? args.Embeds.Value?.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, + Components = args.Components.IsSpecified + ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() + : Optional.Unspecified, + Flags = args.Flags.IsSpecified ? (int?)args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified + } + }; + + await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, this.Token, options); + } + + /// + public override async Task FollowupAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null) + { if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); @@ -141,13 +202,12 @@ public override async Task FollowupAsync(Embed[] embeds = n Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - var args = new API.Rest.CreateWebhookMessageParams(text) + var args = new API.Rest.CreateWebhookMessageParams { - AllowedMentions = allowedMentions?.ToModel(), + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds != null - ? embeds.Select(x => x.ToModel()).ToArray() - : Optional.Unspecified, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; @@ -160,10 +220,11 @@ public override async Task FollowupAsync(Embed[] embeds = n /// /// Acknowledges this interaction with the . /// + /// The request options for this async request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public override Task AcknowledgeAsync(RequestOptions options = null) + public override Task DeferAsync(RequestOptions options = null) { var response = new API.InteractionResponse() { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index e3596ec504..81518cd957 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -1,5 +1,4 @@ using Discord.Rest; -using Newtonsoft.Json.Linq; using System; using System.Linq; using System.Threading.Tasks; @@ -16,7 +15,7 @@ public class SocketSlashCommand : SocketInteraction /// /// The data associated with this interaction. /// - new public SocketSlashCommandData Data { get; private set; } + new public SocketSlashCommandData Data { get; } internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) @@ -51,21 +50,21 @@ internal override void Update(Model model) } /// - public override async Task RespondAsync(Embed[] embeds = null, string text = null, bool isTTS = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + public override async Task RespondAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null) { - if (type == InteractionResponseType.Pong) - throw new InvalidOperationException($"Cannot use {Type} on a send message function"); - - if(type == InteractionResponseType.DeferredUpdateMessage || type == InteractionResponseType.UpdateMessage) - throw new InvalidOperationException($"Cannot use {Type} on a slash command!"); - if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); if (Discord.AlwaysAcknowledgeInteractions) { - await FollowupAsync(embeds, text, isTTS, ephemeral, type, allowedMentions, options, component); + await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); return; } @@ -92,11 +91,11 @@ public override async Task RespondAsync(Embed[] embeds = null, string text = nul var response = new API.InteractionResponse { - Type = type, + Type = InteractionResponseType.ChannelMessageWithSource, Data = new API.InteractionCallbackData { - Content = text ?? Optional.Unspecified, - AllowedMentions = allowedMentions?.ToModel(), + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, TTS = isTTS ? true : Optional.Unspecified, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified @@ -106,17 +105,19 @@ public override async Task RespondAsync(Embed[] embeds = null, string text = nul if (ephemeral) response.Data.Value.Flags = 64; - await InteractionHelper.SendInteractionResponse(this.Discord, this.Channel, response, this.Id, Token, options); + await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); } /// - public override async Task FollowupAsync(Embed[] embeds = null, string text = null, bool isTTS = false, bool ephemeral = false, - InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) + public override async Task FollowupAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null) { - if (type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.DeferredChannelMessageWithSource || type == InteractionResponseType.Pong || type == InteractionResponseType.DeferredUpdateMessage || type == InteractionResponseType.UpdateMessage) - throw new InvalidOperationException($"Cannot use {type} on a slash command!"); - if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); @@ -124,13 +125,12 @@ public override async Task FollowupAsync(Embed[] embeds = n Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - var args = new API.Rest.CreateWebhookMessageParams(text) + var args = new API.Rest.CreateWebhookMessageParams { - AllowedMentions = allowedMentions?.ToModel(), + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds != null - ? embeds.Select(x => x.ToModel()).ToArray() - : Optional.Unspecified, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; @@ -140,10 +140,15 @@ public override async Task FollowupAsync(Embed[] embeds = n return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } - /// - public override Task AcknowledgeAsync(RequestOptions options = null) + /// + /// Acknowledges this interaction with the . + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + public override Task DeferAsync(RequestOptions options = null) { - var response = new API.InteractionResponse() + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, }; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index e6a5a9d345..e49205d7cf 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -1,8 +1,5 @@ using Discord.Rest; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Interaction; @@ -96,71 +93,30 @@ internal virtual void Update(Model model) } /// - /// Responds to an Interaction. + /// Responds to an Interaction with type . /// /// If you have set to , You should use - /// instead. + /// instead. /// /// /// The text of the message to be sent. - /// if the message should be read out by a text-to-speech reader, otherwise . - /// A to send with this response. - /// The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - /// The allowed mentions for this response. - /// The request options for this response. - /// A to be sent with this response - /// Message content is too long, length must be less or equal to . - /// The parameters provided were invalid or the token was invalid. - public Task RespondAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) - => RespondAsync(embed != null ? new Embed[] { embed } : null, text, isTTS, type, ephemeral, allowedMentions, options, component); - - /// - /// Sends a followup message for this interaction. - /// - /// The text of the message to be sent - /// if the message should be read out by a text-to-speech reader, otherwise . - /// A to send with this response - /// The type of response to this Interaction. - /// if the response should be hidden to everyone besides the invoker of the command, otherwise . - /// The allowed mentions for this response. - /// The request options for this response. - /// A to be sent with this response - /// - /// The sent message. - /// - public Task FollowupAsync(string text = null, bool isTTS = false, Embed embed = null, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, - bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null) - => FollowupAsync(embed != null ? new Embed[] { embed } : null, text, isTTS, ephemeral, type, allowedMentions, options, component); - /// - /// Responds to an Interaction. - /// - /// If you have set to , You should use - /// instead. - /// - /// - /// The text of the message to be sent. - /// if the message should be read out by a text-to-speech reader, otherwise . /// A array of embeds to send with this response. Max 10 - /// The type of response to this Interaction. + /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. /// A to be sent with this response /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. - - public abstract Task RespondAsync(Embed[] embeds = null, string text = null, bool isTTS = false, InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public abstract Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); /// /// Sends a followup message for this interaction. /// /// The text of the message to be sent - /// if the message should be read out by a text-to-speech reader, otherwise . /// A array of embeds to send with this response. Max 10 - /// The type of response to this Interaction. + /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. @@ -168,25 +124,45 @@ public abstract Task RespondAsync(Embed[] embeds = null, string text = null, boo /// /// The sent message. /// - public abstract Task FollowupAsync(Embed[] embeds = null, string text = null, bool isTTS = false, bool ephemeral = false, - InteractionResponseType type = InteractionResponseType.ChannelMessageWithSource, + public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); /// /// Gets the original response for this interaction. /// /// The request options for this async request. - /// A that represents the intitial response, or if there is no response. + /// A that represents the initial response. public Task GetOriginalResponseAsync(RequestOptions options = null) => InteractionHelper.GetOriginalResponseAsync(this.Discord, this.Channel, this, options); /// - /// Acknowledges this interaction with the . + /// Edits original response for this interaction. + /// + /// A delegate containing the properties to modify the message with. + /// The request options for this async request. + /// A that represents the initial response. + public async Task ModifyOriginalResponseAsync(Action func, RequestOptions options = null) + { + var model = await InteractionHelper.ModifyInteractionResponse(this.Discord, this.Token, func, options); + return RestInteractionMessage.Create(this.Discord, model, this.Token, this.Channel); + } + + /// + /// Acknowledges this interaction. + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + [Obsolete("This method deprecated, please use DeferAsync instead")] + public Task AcknowledgeAsync(RequestOptions options = null) => DeferAsync(options); + + /// + /// Acknowledges this interaction. /// /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public abstract Task AcknowledgeAsync(RequestOptions options = null); + public abstract Task DeferAsync(RequestOptions options = null); private bool CheckToken() { diff --git a/src/Discord.Net.Webhook/WebhookClientHelper.cs b/src/Discord.Net.Webhook/WebhookClientHelper.cs index 886ff234df..528848f7f8 100644 --- a/src/Discord.Net.Webhook/WebhookClientHelper.cs +++ b/src/Discord.Net.Webhook/WebhookClientHelper.cs @@ -20,10 +20,15 @@ public static async Task GetWebhookAsync(DiscordWebhookClie throw new InvalidOperationException("Could not find a webhook with the supplied credentials."); return RestInternalWebhook.Create(client, model); } - public static async Task SendMessageAsync(DiscordWebhookClient client, + public static async Task SendMessageAsync(DiscordWebhookClient client, string text, bool isTTS, IEnumerable embeds, string username, string avatarUrl, AllowedMentions allowedMentions, RequestOptions options) { - var args = new CreateWebhookMessageParams(text) { IsTTS = isTTS }; + var args = new CreateWebhookMessageParams + { + Content = text, + IsTTS = isTTS + }; + if (embeds != null) args.Embeds = embeds.Select(x => x.ToModel()).ToArray(); if (username != null) From b01c2981cd829e09610f3530edffdbbc5fc6df12 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Wed, 28 Jul 2021 08:20:53 -0400 Subject: [PATCH 123/494] =?UTF-8?q?Add=20new=20`NUMBER`=20option=20type=20?= =?UTF-8?q?(https://discord.com/developers/docs/int=E2=80=A6=20(#60)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add new `NUMBER` option type (https://discord.com/developers/docs/interactions/slash-commands#application-command-object-application-command-option-type) https://discord.com/developers/docs/interactions/slash-commands#application-command-object-application-command-option-type * Add number to SocketSlashCommandDataOption.cs --- .../Interactions/ApplicationCommandOptionType.cs | 7 ++++++- .../Slash Commands/SocketSlashCommandDataOption.cs | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs index 18e383cef5..a1b366e187 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -54,6 +54,11 @@ public enum ApplicationCommandOptionType : byte /// /// A or . /// - Mentionable = 9 + Mentionable = 9, + + /// + /// A . + /// + Number = 10 } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index d62f1bf589..f33008cf31 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -96,7 +96,15 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) { if (model.Value.Value is bool val) this.Value = val; - else if (bool.TryParse(model.Value.Value.ToString(), out var res)) + else if (bool.TryParse(model.Value.Value.ToString(), out bool res)) + this.Value = res; + } + break; + case ApplicationCommandOptionType.Number: + { + if (model.Value.Value is int val) + this.Value = val; + else if (double.TryParse(model.Value.Value.ToString(), out double res)) this.Value = res; } break; From 4db858b1e456a622792c998f8cb7f5791b533e4d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 28 Jul 2021 15:43:09 -0300 Subject: [PATCH 124/494] Threads initial --- src/Discord.Net.Core/Discord.Net.Core.xml | 115 ++++++ .../Entities/Channels/IThreadChannel.cs | 44 +++ .../Channels/ThreadArchiveDuration.cs | 40 ++ .../Channels/ThreadChannelProperties.cs | 45 +++ .../Entities/Messages/MessageFlags.cs | 12 + src/Discord.Net.Rest/API/Common/Channel.cs | 16 + .../API/Common/ChannelThreads.cs | 21 ++ src/Discord.Net.Rest/API/Common/Guild.cs | 2 + .../API/Common/ThreadMember.cs | 24 ++ .../API/Common/ThreadMetadata.cs | 24 ++ .../Rest/ModifyInteractionResponseParams.cs | 3 + .../API/Rest/StartThreadParams.cs | 21 ++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 154 ++++++++ .../Interactions/InteractionHelper.cs | 1 + .../API/Gateway/ExtendedGuild.cs | 10 +- .../API/Gateway/ThreadListSyncEvent.cs | 24 ++ .../BaseSocketClient.Events.cs | 32 ++ .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 203 ++++++++++ .../DiscordSocketClient.cs | 106 ++++++ .../Entities/Channels/SocketGuildChannel.cs | 2 + .../Entities/Channels/SocketTextChannel.cs | 6 + .../Entities/Channels/SocketThreadChannel.cs | 348 ++++++++++++++++++ .../Entities/Guilds/SocketGuild.cs | 8 + .../Entities/Users/SocketThreadUser.cs | 212 +++++++++++ 25 files changed, 1473 insertions(+), 2 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs create mode 100644 src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs create mode 100644 src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs create mode 100644 src/Discord.Net.Rest/API/Common/ChannelThreads.cs create mode 100644 src/Discord.Net.Rest/API/Common/ThreadMember.cs create mode 100644 src/Discord.Net.Rest/API/Common/ThreadMetadata.cs create mode 100644 src/Discord.Net.Rest/API/Rest/StartThreadParams.cs create mode 100644 src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 9e288d1a1b..3c0e6afa2c 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1982,6 +1982,41 @@ of webhooks that is available in this channel. + + + Represents a thread channel inside of a guild. + + + + + if the current thread is archived, otherwise . + + + + + Duration to automatically archive the thread after recent activity. + + + + + Timestamp when the thread's archive status was last changed, used for calculating recent activity. + + + + + if the current thread is locked, otherwise + + + + + An approximate count of users in a thread, stops counting at 50. + + + + + An approximate count of messages in a thread, stops counting at 50. + + Represents a generic voice channel in a guild. @@ -2081,6 +2116,71 @@ Thrown if the value does not fall within [0, 21600]. + + + Represents the thread auto archive duration. + + + + + One hour (60 minutes). + + + + + One day (1440 minutes). + + + + + Three days (4320 minutes). + + This option is explicity avaliable to nitro users. + + + + + + One week (10080 minutes). + + This option is explicity avaliable to nitro users. + + + + + + Gets or sets whether or not the thread is archived. + + + + + Gets or sets whether or not the thread is locked. + + + + + Gets or sets the name of the thread. + + + + + Gets or sets the auto archive duration. + + + + + Gets or sets the slow-mode ratelimit in seconds for this channel. + + + Setting this value to anything above zero will require each user to wait X seconds before + sending another message; setting this value to 0 will disable slow-mode for this channel. + + Users with or + will be exempt from slow-mode. + + + Thrown if the value does not fall within [0, 21600]. + Provides properties that are used to modify an with the specified changes. @@ -7029,6 +7129,21 @@ Flag given to messages that came from the urgent message system. + + + Flag given to messages has an associated thread, with the same id as the message + + + + + Flag given to messages that is only visible to the user who invoked the Interaction. + + + + + Flag given to messages that is an Interaction Response and the bot is "thinking" + + Properties that are used to modify an with the specified changes. diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs new file mode 100644 index 0000000000..1459c954cd --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a thread channel inside of a guild. + /// + public interface IThreadChannel : ITextChannel, IGuildChannel + { + /// + /// if the current thread is archived, otherwise . + /// + bool Archived { get; } + + /// + /// Duration to automatically archive the thread after recent activity. + /// + ThreadArchiveDuration AutoArchiveDuration { get; } + + /// + /// Timestamp when the thread's archive status was last changed, used for calculating recent activity. + /// + DateTimeOffset ArchiveTimestamp { get; } + + /// + /// if the current thread is locked, otherwise + /// + bool Locked { get; } + + /// + /// An approximate count of users in a thread, stops counting at 50. + /// + int MemberCount { get; } + + /// + /// An approximate count of messages in a thread, stops counting at 50. + /// + int MessageCount { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs b/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs new file mode 100644 index 0000000000..01d1574bfa --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents the thread auto archive duration. + /// + public enum ThreadArchiveDuration + { + /// + /// One hour (60 minutes). + /// + OneHour = 60, + + /// + /// One day (1440 minutes). + /// + OneDay = 1440, + + /// + /// Three days (4320 minutes). + /// + /// This option is explicity avaliable to nitro users. + /// + /// + ThreeDays = 4320, + + /// + /// One week (10080 minutes). + /// + /// This option is explicity avaliable to nitro users. + /// + /// + OneWeek = 10080, + } +} diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs b/src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs new file mode 100644 index 0000000000..10a0d76547 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.Entities +{ + public class ThreadChannelProperties + { + /// + /// Gets or sets whether or not the thread is archived. + /// + public Optional Archived { get; set; } + + /// + /// Gets or sets whether or not the thread is locked. + /// + public Optional Locked { get; set; } + + /// + /// Gets or sets the name of the thread. + /// + public Optional Name { get; set; } + + /// + /// Gets or sets the auto archive duration. + /// + public Optional AutoArchiveDuration { get; set; } + + /// + /// Gets or sets the slow-mode ratelimit in seconds for this channel. + /// + /// + /// Setting this value to anything above zero will require each user to wait X seconds before + /// sending another message; setting this value to 0 will disable slow-mode for this channel. + /// + /// Users with or + /// will be exempt from slow-mode. + /// + /// + /// Thrown if the value does not fall within [0, 21600]. + public Optional SlowModeInterval { get; set; } + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/MessageFlags.cs b/src/Discord.Net.Core/Entities/Messages/MessageFlags.cs index 52d0f0e9e8..6f94503729 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageFlags.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageFlags.cs @@ -32,5 +32,17 @@ public enum MessageFlags /// Flag given to messages that came from the urgent message system. /// Urgent = 1 << 4, + /// + /// Flag given to messages has an associated thread, with the same id as the message + /// + HasThread = 1 << 5, + /// + /// Flag given to messages that is only visible to the user who invoked the Interaction. + /// + Ephemeral = 1 << 6, + /// + /// Flag given to messages that is an Interaction Response and the bot is "thinking" + /// + Loading = 1 << 7 } } diff --git a/src/Discord.Net.Rest/API/Common/Channel.cs b/src/Discord.Net.Rest/API/Common/Channel.cs index 57a5ce9ab3..2dd0040210 100644 --- a/src/Discord.Net.Rest/API/Common/Channel.cs +++ b/src/Discord.Net.Rest/API/Common/Channel.cs @@ -49,5 +49,21 @@ internal class Channel //GroupChannel [JsonProperty("icon")] public Optional Icon { get; set; } + + //ThreadChannel + [JsonProperty("member")] + public Optional ThreadMember { get; set; } + + [JsonProperty("thread_metadata")] + public Optional ThreadMetadata { get; set; } + + [JsonProperty("owner_id")] + public Optional OwnerId { get; set; } + + [JsonProperty("message_count")] + public Optional MessageCount { get; set; } + + [JsonProperty("member_count")] + public Optional MemberCount { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/ChannelThreads.cs b/src/Discord.Net.Rest/API/Common/ChannelThreads.cs new file mode 100644 index 0000000000..eccac8e54c --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ChannelThreads.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ChannelThreads + { + [JsonProperty("threads")] + public Channel[] Threads { get; set; } + + [JsonProperty("members")] + public ThreadMember[] Members { get; set; } + + [JsonProperty("has_more")] + public bool HasMore { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/Guild.cs b/src/Discord.Net.Rest/API/Common/Guild.cs index bd25c7e1a3..ba09f9b8a1 100644 --- a/src/Discord.Net.Rest/API/Common/Guild.cs +++ b/src/Discord.Net.Rest/API/Common/Guild.cs @@ -76,5 +76,7 @@ internal class Guild public Optional ApproximateMemberCount { get; set; } [JsonProperty("approximate_presence_count")] public Optional ApproximatePresenceCount { get; set; } + [JsonProperty("threads")] + public Optional Threads { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/ThreadMember.cs b/src/Discord.Net.Rest/API/Common/ThreadMember.cs new file mode 100644 index 0000000000..b4c5424547 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ThreadMember.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ThreadMember + { + [JsonProperty("id")] + public Optional Id { get; set; } + + [JsonProperty("user_id")] + public Optional UserId { get; set; } + + [JsonProperty("join_timestamp")] + public DateTimeOffset JoinTimestamp { get; set; } + + [JsonProperty("flags")] + public int Flags { get; set; } // No enum type (yet?) + } +} diff --git a/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs new file mode 100644 index 0000000000..f6da249f70 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class ThreadMetadata + { + [JsonProperty("archived")] + public bool Archived { get; set; } + + [JsonProperty("auto_archive_duration")] + public int AutoArchiveDuration { get; set; } + + [JsonProperty("archive_timestamp")] + public DateTimeOffset ArchiveTimestamp { get; set; } + + [JsonProperty("locked")] + public Optional Locked { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs index b8c7a124f5..b2800a0662 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs @@ -20,5 +20,8 @@ internal class ModifyInteractionResponseParams [JsonProperty("components")] public Optional Components { get; set; } + + [JsonProperty("flags")] + public Optional Flags { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs new file mode 100644 index 0000000000..167d94099e --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class StartThreadParams + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("duration")] + public ThreadArchiveDuration Duration { get; set; } + + [JsonProperty("type")] + public Optional Type { get; set; } + } +} diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 36259b01a9..a56b3d7f6d 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -413,6 +413,160 @@ public async Task ModifyGuildChannelsAsync(ulong guildId, IEnumerable StartThreadAsync(ulong channelId, ulong messageId, StartThreadParams args, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + Preconditions.NotEqual(messageId, 0, nameof(messageId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(0, channelId); + + return await SendJsonAsync("POST", () => $"channels/{channelId}/messages/{messageId}/threads", args, bucket, options: options).ConfigureAwait(false); + } + + public async Task StartThreadAsync(ulong channelId, StartThreadParams args, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(0, channelId); + + return await SendJsonAsync("POST", () => $"channels/{channelId}/threads", args, bucket, options: options).ConfigureAwait(false); + } + + public async Task JoinThreadAsync(ulong channelId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + await SendAsync("PUT", $"channels/{channelId}/thread-members/@me", options: options).ConfigureAwait(false); + } + + public async Task AddThreadMemberAsync(ulong channelId, ulong userId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + Preconditions.NotEqual(userId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + await SendAsync("PUT", $"channels/{channelId}/thread-members/{userId}", options: options).ConfigureAwait(false); + } + + public async Task LeaveThreadAsync(ulong channelId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + await SendAsync("DELETE", $"channels/{channelId}/thread-members/@me", options: options).ConfigureAwait(false); + } + + public async Task RemoveThreadMemberAsync(ulong channelId, ulong userId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + Preconditions.NotEqual(userId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + await SendAsync("DELETE", $"channels/{channelId}/thread-members/{userId}", options: options).ConfigureAwait(false); + } + + public async Task ListThreadMembersAsync(ulong channelId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + return await SendAsync("GET", () => $"/channels/{channelId}", bucket, options: options); + } + + public async Task GetActiveThreadsAsync(ulong channelId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + return await SendAsync("GET", $"channels/{channelId}/threads/active"); + } + + public async Task GetPublicArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + string query = ""; + + if (limit.HasValue) + { + query = $"?before={before.GetValueOrDefault(DateTimeOffset.UtcNow).ToString("O")}&limit={limit.Value}"; + } + else if (before.HasValue) + { + query = $"?before={before.Value.ToString("O")}"; + } + + return await SendAsync("GET", () => $"channels/{channelId}/threads/archived/public{query}", bucket, options: options); + } + + public async Task GetPrivateArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, + RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + string query = ""; + + if (limit.HasValue) + { + query = $"?before={before.GetValueOrDefault(DateTimeOffset.UtcNow).ToString("O")}&limit={limit.Value}"; + } + else if (before.HasValue) + { + query = $"?before={before.Value.ToString("O")}"; + } + + return await SendAsync("GET", () => $"channels/{channelId}/threads/archived/private{query}", bucket, options: options); + } + + public async Task GetJoinedPrivateArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, + RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + string query = ""; + + if (limit.HasValue) + { + query = $"?before={SnowflakeUtils.ToSnowflake(before.GetValueOrDefault(DateTimeOffset.UtcNow))}&limit={limit.Value}"; + } + else if (before.HasValue) + { + query = $"?before={before.Value.ToString("O")}"; + } + + return await SendAsync("GET", () => $"channels/{channelId}/users/@me/threads/archived/private{query}", bucket, options: options); + } + + // roles public async Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index ec32623c7f..f030f91cad 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -333,6 +333,7 @@ public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFol Embeds = args.Embed.IsSpecified ? new API.Embed[] { args.Embed.Value.ToModel() } : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, + Flags = args.Flags }; return await client.ApiClient.ModifyInteractionResponse(apiArgs, message.Token, options).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs b/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs index 910f6d9090..da02b737a4 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs @@ -1,4 +1,4 @@ -#pragma warning disable CS1591 +#pragma warning disable CS1591 using Newtonsoft.Json; using System; @@ -8,18 +8,26 @@ internal class ExtendedGuild : Guild { [JsonProperty("unavailable")] public bool? Unavailable { get; set; } + [JsonProperty("member_count")] public int MemberCount { get; set; } + [JsonProperty("large")] public bool Large { get; set; } [JsonProperty("presences")] public Presence[] Presences { get; set; } + [JsonProperty("members")] public GuildMember[] Members { get; set; } + [JsonProperty("channels")] public Channel[] Channels { get; set; } + [JsonProperty("joined_at")] public DateTimeOffset JoinedAt { get; set; } + + [JsonProperty("threads")] + public Channel[] Threads { get; set; } } } diff --git a/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs new file mode 100644 index 0000000000..ab79892687 --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs @@ -0,0 +1,24 @@ +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 ThreadListSyncEvent + { + [JsonProperty("guild_id")] + public ulong GuildId { get; set; } + + [JsonProperty("channel_ids")] + public Optional ChannelIds { get; set; } + + [JsonProperty("threads")] + public Channel[] Threads { get; set; } + + [JsonProperty("members")] + public ThreadMember[] Members { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 3b6b3ec5ac..f29f13cf69 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -540,5 +540,37 @@ public event Func ApplicationCommandDeleted remove { _applicationCommandDeleted.Remove(value); } } internal readonly AsyncEvent> _applicationCommandDeleted = new AsyncEvent>(); + + /// + /// Fired when a thread is created within a guild. + /// + public event Func ThreadCreated + { + add { _threadCreated.Add(value); } + remove { _threadCreated.Remove(value); } + } + internal readonly AsyncEvent> _threadCreated = new AsyncEvent>(); + + /// + /// Fired when a thread is updated within a guild. + /// + public event Func ThreadUpdated + { + add { _threadUpdated.Add(value); } + remove { _threadUpdated.Remove(value); } + } + + internal readonly AsyncEvent> _threadUpdated = new AsyncEvent>(); + + /// + /// Fired when a thread is deleted. + /// + public event Func, Task> ThreadDeleted + { + add { _threadDeleted.Add(value); } + remove { _threadDeleted.Remove(value); } + } + internal readonly AsyncEvent, Task>> _threadDeleted = new AsyncEvent, Task>>(); + } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 56932f7d8d..3f1f63db3a 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.8 + 2.4.9 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 89d29ba092..e5b4c84a0e 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2355,6 +2355,209 @@ + + + Represents a thread channel inside of a guild. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets a message from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The snowflake identifier of the message. + The options to be used when sending the request. + + A task that represents an asynchronous get operation for retrieving the message. The task result contains + the retrieved message; null if no message is found with the specified identifier. + + + + + Gets the last N messages from this message channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The ID of the starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + Gets a collection of messages in this channel. + + + This method follows the same behavior as described in . + Please visit its documentation for more details on this method. + + The starting message to get the messages from. + The direction of the messages to be gotten from. + The numbers of message to be gotten from. + The options to be used when sending the request. + + Paged collection of messages. + + + + + + + + + + + + + + + + + Message content is too long, length must be less or equal to . + + + + + + + Message content is too long, length must be less or equal to . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a WebSocket-based voice channel in a guild. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f9eaeb0058..dc9dedd347 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1862,6 +1862,8 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + + // Interactions case "INTERACTION_CREATE": { await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); @@ -1969,6 +1971,110 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty await TimedInvokeAsync(_applicationCommandDeleted, nameof(ApplicationCommandDeleted), applicationCommand).ConfigureAwait(false); } break; + + // Threads + case "THREAD_CREATE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_CREATE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId.Value); + + if(guild == null) + { + await UnknownGuildAsync(type, data.GuildId.Value); + return; + } + + var threadChannel = (SocketThreadChannel)guild.AddChannel(this.State, data); + + await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); + } + + break; + case "THREAD_UPDATE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_UPDATE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + var guild = State.GetGuild(data.GuildId.Value); + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId.Value); + return; + } + + var channel = (SocketThreadChannel)guild.GetChannel(data.Id); + + 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); + + } + break; + case "THREAD_DELETE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_DELETE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId.Value); + + if(guild == null) + { + await UnknownGuildAsync(type, data.GuildId.Value).ConfigureAwait(false); + return; + } + + var thread = (SocketThreadChannel)guild.GetChannel(data.Id); + + var cacheable = new Cacheable(thread, data.Id, thread != null, null); + + await TimedInvokeAsync(_threadDeleted, nameof(ThreadDeleted), cacheable).ConfigureAwait(false); + } + break; + case "THREAD_LIST_SYNC": + { + await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_LIST_SYNC)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + + if(guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + foreach(var thread in data.Threads) + { + var entity = guild.ThreadChannels.FirstOrDefault(x => x.Id == thread.Id); + + if(entity == null) + { + guild.AddChannel(this.State, thread); + } + else + { + entity.Update(this.State, thread); + } + } + } + break; + case "THREAD_MEMBER_UPDATE": + break; + case "THREAD_MEMBERS_UPDATE": // based on intents + break; + //Ignored (User only) case "CHANNEL_PINS_ACK": await _gatewayLogger.DebugAsync("Ignored Dispatch (CHANNEL_PINS_ACK)").ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs index 3cc8496d91..9f63ad7b45 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs @@ -56,6 +56,8 @@ internal static SocketGuildChannel Create(SocketGuild guild, ClientState state, return SocketVoiceChannel.Create(guild, state, model); case ChannelType.Category: return SocketCategoryChannel.Create(guild, state, model); + case ChannelType.PrivateThread or ChannelType.PublicThread or ChannelType.NewsThread: + return SocketThreadChannel.Create(guild, state, model); default: return new SocketGuildChannel(guild.Discord, model.Id, guild); } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index de896be81a..192d74328c 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -50,6 +50,12 @@ public override IReadOnlyCollection Users Permissions.ResolveChannel(Guild, x, this, Permissions.ResolveGuild(Guild, x)), ChannelPermission.ViewChannel)).ToImmutableArray(); + /// + /// Gets a collection of threads within this text channel. + /// + public IReadOnlyCollection Threads + => Guild.ThreadChannels.Where(x => x.ParentChannel.Id == this.Id).ToImmutableArray(); + internal SocketTextChannel(DiscordSocketClient discord, ulong id, SocketGuild guild) : base(discord, id, guild) { diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs new file mode 100644 index 0000000000..d9583d1ea1 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -0,0 +1,348 @@ +using Discord.Rest; +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Channel; + +namespace Discord.WebSocket +{ + /// + /// Represents a thread channel inside of a guild. + /// + public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMessageChannel + { + /// + /// if this thread is private, otherwise + /// + public bool IsPrivateThread { get; private set; } + + /// + /// Gets the parent channel this thread resides in. + /// + public SocketTextChannel ParentChannel { get; private set; } + + /// + public int MessageCount { get; private set; } + + /// + public int MemberCount { get; private set; } + + /// + public bool Archived { get; private set; } + + /// + public DateTimeOffset ArchiveTimestamp { get; private set; } + + /// + public ThreadArchiveDuration AutoArchiveDuration { get; private set; } + + /// + public bool Locked { get; private set; } + + /// + public bool IsNsfw { get; private set; } + + /// + public string Topic { get; private set; } + + /// + public int SlowModeInterval { get; private set; } + + /// + public string Mention { get; private set; } + + /// + public ulong? CategoryId { get; private set; } + + /// + public IReadOnlyCollection CachedMessages => _messages?.Messages ?? ImmutableArray.Create(); + + public new IReadOnlyCollection Users = ImmutableArray.Create(); + + private readonly MessageCache _messages; + + internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) + : base(discord, id, guild) + { + this.ParentChannel = parent; + } + + internal static SocketThreadChannel Create(SocketGuild guild, ClientState state, Model model) + { + var parent = (SocketTextChannel)guild.GetChannel(model.CategoryId.Value); + var entity = new SocketThreadChannel(guild.Discord, guild, model.Id, parent); + entity.Update(state, model); + return entity; + } + + internal override void Update(ClientState state, Model model) + { + base.Update(state, model); + + this.MessageCount = model.MessageCount.GetValueOrDefault(-1); + this.MemberCount = model.MemberCount.GetValueOrDefault(-1); + + this.IsPrivateThread = model.Type == ChannelType.PrivateThread; + + if (model.ThreadMetadata.IsSpecified) + { + this.Archived = model.ThreadMetadata.Value.Archived; + this.ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; + this.AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; + this.Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + } + } + + /// + public virtual Task SyncPermissionsAsync(RequestOptions options = null) + => ChannelHelper.SyncPermissionsAsync(this, Discord, options); + + /// + public Task ModifyAsync(Action func, RequestOptions options = null) + => ChannelHelper.ModifyAsync(this, Discord, func, options); + + //Messages + /// + public SocketMessage GetCachedMessage(ulong id) + => _messages?.Get(id); + + /// + /// Gets a message from this message channel. + /// + /// + /// This method follows the same behavior as described in . + /// Please visit its documentation for more details on this method. + /// + /// The snowflake identifier of the message. + /// The options to be used when sending the request. + /// + /// A task that represents an asynchronous get operation for retrieving the message. The task result contains + /// the retrieved message; null if no message is found with the specified identifier. + /// + public async Task GetMessageAsync(ulong id, RequestOptions options = null) + { + IMessage msg = _messages?.Get(id); + if (msg == null) + msg = await ChannelHelper.GetMessageAsync(this, Discord, id, options).ConfigureAwait(false); + return msg; + } + + /// + /// Gets the last N messages from this message channel. + /// + /// + /// This method follows the same behavior as described in . + /// Please visit its documentation for more details on this method. + /// + /// The numbers of message to be gotten from. + /// The options to be used when sending the request. + /// + /// Paged collection of messages. + /// + public IAsyncEnumerable> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) + => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, null, Direction.Before, limit, CacheMode.AllowDownload, options); + + /// + /// Gets a collection of messages in this channel. + /// + /// + /// This method follows the same behavior as described in . + /// Please visit its documentation for more details on this method. + /// + /// The ID of the starting message to get the messages from. + /// The direction of the messages to be gotten from. + /// The numbers of message to be gotten from. + /// The options to be used when sending the request. + /// + /// Paged collection of messages. + /// + public IAsyncEnumerable> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) + => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessageId, dir, limit, CacheMode.AllowDownload, options); + + /// + /// Gets a collection of messages in this channel. + /// + /// + /// This method follows the same behavior as described in . + /// Please visit its documentation for more details on this method. + /// + /// The starting message to get the messages from. + /// The direction of the messages to be gotten from. + /// The numbers of message to be gotten from. + /// The options to be used when sending the request. + /// + /// Paged collection of messages. + /// + public IAsyncEnumerable> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) + => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessage.Id, dir, limit, CacheMode.AllowDownload, options); + + /// + public IReadOnlyCollection GetCachedMessages(int limit = DiscordConfig.MaxMessagesPerBatch) + => SocketChannelHelper.GetCachedMessages(this, Discord, _messages, null, Direction.Before, limit); + + /// + public IReadOnlyCollection GetCachedMessages(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) + => SocketChannelHelper.GetCachedMessages(this, Discord, _messages, fromMessageId, dir, limit); + + /// + public IReadOnlyCollection GetCachedMessages(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) + => SocketChannelHelper.GetCachedMessages(this, Discord, _messages, fromMessage.Id, dir, limit); + + /// + public Task> GetPinnedMessagesAsync(RequestOptions options = null) + => ChannelHelper.GetPinnedMessagesAsync(this, Discord, options); + + /// + /// Message content is too long, length must be less or equal to . + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + + /// + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + + /// + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + + /// + public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions options = null) + => ChannelHelper.DeleteMessagesAsync(this, Discord, messages.Select(x => x.Id), options); + /// + public Task DeleteMessagesAsync(IEnumerable messageIds, RequestOptions options = null) + => ChannelHelper.DeleteMessagesAsync(this, Discord, messageIds, options); + + /// + public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) + => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); + + /// + public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) + => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); + + /// + public Task DeleteMessageAsync(IMessage message, RequestOptions options = null) + => ChannelHelper.DeleteMessageAsync(this, message.Id, Discord, options); + + /// + public Task TriggerTypingAsync(RequestOptions options = null) + => ChannelHelper.TriggerTypingAsync(this, Discord, options); + + /// + public IDisposable EnterTypingState(RequestOptions options = null) + => ChannelHelper.EnterTypingState(this, Discord, options); + + internal void AddMessage(SocketMessage msg) + => _messages?.Add(msg); + + internal SocketMessage RemoveMessage(ulong id) + => _messages?.Remove(id); + + //Users + /// + public new SocketThreadUser GetUser(ulong id) + { + var user = Users.FirstOrDefault(x => x.Id == id); + return user; + } + + public Task GetUsersAsync() + { + + } + + private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; + internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; + + //ITextChannel + /// + Task ITextChannel.CreateWebhookAsync(string name, Stream avatar, RequestOptions options) + => throw new NotSupportedException("Thread channels don't support webhooks"); + /// + Task ITextChannel.GetWebhookAsync(ulong id, RequestOptions options) + => throw new NotSupportedException("Thread channels don't support webhooks"); + /// + Task> ITextChannel.GetWebhooksAsync(RequestOptions options) + => throw new NotSupportedException("Thread channels don't support webhooks"); + + //IGuildChannel + /// + Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) + => Task.FromResult(GetUser(id)); + /// + IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options) + => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + + //IMessageChannel + /// + async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) + { + if (mode == CacheMode.AllowDownload) + return await GetMessageAsync(id, options).ConfigureAwait(false); + else + return GetCachedMessage(id); + } + /// + IAsyncEnumerable> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, RequestOptions options) + => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, null, Direction.Before, limit, mode, options); + /// + IAsyncEnumerable> IMessageChannel.GetMessagesAsync(ulong fromMessageId, Direction dir, int limit, CacheMode mode, RequestOptions options) + => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessageId, dir, limit, mode, options); + /// + IAsyncEnumerable> IMessageChannel.GetMessagesAsync(IMessage fromMessage, Direction dir, int limit, CacheMode mode, RequestOptions options) + => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessage.Id, dir, limit, mode, options); + /// + async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) + => await GetPinnedMessagesAsync(options).ConfigureAwait(false); + + /// + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + /// + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + /// + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + + // INestedChannel + /// + Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) + => Task.FromResult(this.ParentChannel.Category); + Task INestedChannel.CreateInviteAsync(int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options) + => throw new NotSupportedException("Thread channels don't support invites"); + Task INestedChannel.CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options) + => throw new NotSupportedException("Thread channels don't support invites"); + Task INestedChannel.CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options) + => throw new NotSupportedException("Thread channels don't support invites"); + Task> INestedChannel.GetInvitesAsync(RequestOptions options) + => throw new NotSupportedException("Thread channels don't support invites"); + + public Task JoinAsync() + { + + } + + public Task LeaveAsync() + { + + } + + public Task AddThreadMember(IGuildUser user) + { + + } + + public Task RemoveThreadMember(IGuildUser user) + { + + } + + + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index e8748dda9e..547dc6d7f0 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -277,6 +277,14 @@ public IReadOnlyCollection VoiceChannels public IReadOnlyCollection CategoryChannels => Channels.OfType().ToImmutableArray(); /// + /// Gets a collection of all thread channels in this guild. + /// + /// + /// A read-only collection of thread channels found within this guild. + /// + public IReadOnlyCollection ThreadChannels + => Channels.OfType().ToImmutableArray(); + /// /// Gets the current logged-in user. /// public SocketGuildUser CurrentUser => _members.TryGetValue(Discord.CurrentUser.Id, out SocketGuildUser member) ? member : null; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs new file mode 100644 index 0000000000..66a5579c47 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ThreadMember; +using MemberModel = Discord.API.GuildMember; +using Discord.API; +using System.Collections.Immutable; + +namespace Discord.WebSocket +{ + public class SocketThreadUser : IGuildUser + { + /// + /// Gets the this user is in. + /// + public SocketThreadChannel Thread { get; private set; } + + /// + /// Gets the timestamp for when this user joined this thread. + /// + public DateTimeOffset ThreadJoinedAt { get; private set; } + + /// + /// Gets the guild this user is in. + /// + public SocketGuild Guild { get; private set; } + + /// + public DateTimeOffset? JoinedAt + => GuildUser.JoinedAt; + + /// + public string Nickname + => GuildUser.Nickname; + + /// + public DateTimeOffset? PremiumSince + => GuildUser.PremiumSince; + + /// + public bool? IsPending + => GuildUser.IsPending; + + /// + public string AvatarId + => GuildUser.AvatarId; + + /// + public string Discriminator + => GuildUser.Discriminator; + + /// + public ushort DiscriminatorValue + => GuildUser.DiscriminatorValue; + + /// + public bool IsBot + => GuildUser.IsBot; + + /// + public bool IsWebhook + => GuildUser.IsWebhook; + + /// + public string Username + => GuildUser.Username; + + /// + public UserProperties? PublicFlags + => GuildUser.PublicFlags; + + /// + public DateTimeOffset CreatedAt + => GuildUser.CreatedAt; + + /// + public ulong Id + => GuildUser.Id; + + /// + public string Mention + => GuildUser.Mention; + + /// + public UserStatus Status + => GuildUser.Status; + + /// + public IImmutableSet ActiveClients + => GuildUser.ActiveClients; + + /// + public IImmutableList Activities + => GuildUser.Activities; + + /// + public bool IsDeafened + => GuildUser.IsDeafened; + + /// + public bool IsMuted + => GuildUser.IsMuted; + + /// + public bool IsSelfDeafened + => GuildUser.IsSelfDeafened; + + /// + public bool IsSelfMuted + => GuildUser.IsSelfMuted; + + /// + public bool IsSuppressed + => GuildUser.IsSuppressed; + + /// + public IVoiceChannel VoiceChannel + => GuildUser.VoiceChannel; + + /// + public string VoiceSessionId + => GuildUser.VoiceSessionId; + + /// + public bool IsStreaming + => GuildUser.IsStreaming; + + private SocketGuildUser GuildUser { get; set; } + + internal SocketThreadUser(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser member) + { + this.Thread = thread; + this.Guild = guild; + this.GuildUser = member; + } + + internal SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, Model model, SocketGuildUser member) + { + var entity = new SocketThreadUser(guild, thread, member); + entity.Update(model); + return entity; + } + + internal void Update(Model model) + { + this.ThreadJoinedAt = model.JoinTimestamp; + } + + + /// + public ChannelPermissions GetPermissions(IGuildChannel channel) => GuildUser.GetPermissions(channel); + + /// + public Task KickAsync(string reason = null, RequestOptions options = null) => GuildUser.KickAsync(reason, options); + + /// + public Task ModifyAsync(Action func, RequestOptions options = null) => GuildUser.ModifyAsync(func, options); + + /// + public Task AddRoleAsync(ulong roleId, RequestOptions options = null) => GuildUser.AddRoleAsync(roleId, options); + + /// + public Task AddRoleAsync(IRole role, RequestOptions options = null) => GuildUser.AddRoleAsync(role, options); + + /// + public Task AddRolesAsync(IEnumerable roleIds, RequestOptions options = null) => GuildUser.AddRolesAsync(roleIds, options); + + /// + public Task AddRolesAsync(IEnumerable roles, RequestOptions options = null) => GuildUser.AddRolesAsync(roles, options); + + /// + public Task RemoveRoleAsync(ulong roleId, RequestOptions options = null) => GuildUser.RemoveRoleAsync(roleId, options); + + /// + public Task RemoveRoleAsync(IRole role, RequestOptions options = null) => GuildUser.RemoveRoleAsync(role, options); + + /// + public Task RemoveRolesAsync(IEnumerable roleIds, RequestOptions options = null) => GuildUser.RemoveRolesAsync(roleIds, options); + + /// + public Task RemoveRolesAsync(IEnumerable roles, RequestOptions options = null) => GuildUser.RemoveRolesAsync(roles, options); + + /// + public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) => GuildUser.GetAvatarUrl(format, size); + + /// + public string GetDefaultAvatarUrl() => GuildUser.GetDefaultAvatarUrl(); + + /// + public Task CreateDMChannelAsync(RequestOptions options = null) => GuildUser.CreateDMChannelAsync(options); + + /// + GuildPermissions IGuildUser.GuildPermissions => this.GuildUser.GuildPermissions; + + /// + IGuild IGuildUser.Guild => this.Guild; + + /// + ulong IGuildUser.GuildId => this.Guild.Id; + + /// + IReadOnlyCollection IGuildUser.RoleIds => this.GuildUser.Roles.Select(x => x.Id).ToImmutableArray(); + + /// + /// Gets the guild user of this thread user. + /// + /// + public static explicit operator SocketGuildUser(SocketThreadUser user) => user.GuildUser; + } +} From 014dd9fc2db8749cdd73a93cbcc836eb90d118b2 Mon Sep 17 00:00:00 2001 From: Hussein Alzein Date: Wed, 28 Jul 2021 17:24:58 -0400 Subject: [PATCH 125/494] URL validation and error handling (#64) * Error handling on URL additions in embeds and components. * Wording on exception comment * Wording on exceptions --- src/Discord.Net.Core/Discord.Net.Core.xml | 31 ++++++++++++++----- .../Message Components/ComponentBuilder.cs | 24 +++++++++----- .../Entities/Messages/EmbedBuilder.cs | 14 +++++++++ .../Discord.Net.WebSocket.xml | 11 ++++++- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index bce491f0fa..c8610ac040 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4107,6 +4107,11 @@ A or . + + + A . + + Provides properties that are used to modify a with the specified changes. @@ -4502,7 +4507,8 @@ - Adds a button to the specified row. + Adds a with specified parameters to the at the specific row. + If the row cannot accept the component then it will add it to a row that can. The label text for the newly added button. The style of this newly added button. @@ -4627,44 +4633,49 @@ Creates a new instance of a from instance of a . - + Creates a button with the style. - The label to use on the newly created link button. + The label for this link button. The url for this link button to go to. + The emote for this link button A builder with the newly created button. - + Creates a button with the style. The label for this danger button. The custom id for this danger button. + The emote for this danger button A builder with the newly created button. - + Creates a button with the style. The label for this primary button. The custom id for this primary button. + The emote for this primary button A builder with the newly created button. - + Creates a button with the style. The label for this secondary button. The custom id for this secondary button. + The emote for this secondary button A builder with the newly created button. - + Creates a button with the style. The label for this success button. The custom id for this success button. + The emote for this success button A builder with the newly created button. @@ -4716,8 +4727,11 @@ Builds this builder into a to be used in a . A to be used in a . - A button cannot contain a and a . + A button must contain either a or a , but not both. A button must have an or a . + A link button must contain a URL. + A link must include a protocol (http or https). + A non-link button must contain a custom id @@ -6010,6 +6024,7 @@ The built embed object. Total embed length exceeds . + Any Url must include protocols (i.e http:// or https://). diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 9317c0e64a..ff2c99a6c1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -520,21 +520,29 @@ public ButtonBuilder WithDisabled(bool disabled) /// Builds this builder into a to be used in a . /// /// A to be used in a . - /// A button cannot contain a and a . + /// A button must contain either a or a , but not both. /// A button must have an or a . + /// A link button must contain a URL. + /// A URL must include a protocol (http or https). + /// A non-link button must contain a custom id public ButtonComponent Build() { if (string.IsNullOrEmpty(this.Label) && this.Emote == null) throw new InvalidOperationException("A button must have an Emote or a label!"); - if (!string.IsNullOrEmpty(this.Url) && !string.IsNullOrEmpty(this.CustomId)) - throw new InvalidOperationException("A button cannot contain a URL and a CustomId!"); + if (!(string.IsNullOrEmpty(this.Url) ^ string.IsNullOrEmpty(this.CustomId))) + throw new InvalidOperationException("A button must contain either a URL or a CustomId, but not both!"); - if (this.Style == ButtonStyle.Link && !string.IsNullOrEmpty(this.CustomId)) - this.CustomId = null; - - else if (this.Style != ButtonStyle.Link && !string.IsNullOrEmpty(this.Url)) // Thanks 𝑴𝒓𝑪𝒂𝒌𝒆𝑺𝒍𝒂𝒚𝒆𝒓 :D - this.Url = null; + if (this.Style == ButtonStyle.Link) + { + if (string.IsNullOrEmpty(this.Url)) + throw new InvalidOperationException("Link buttons must have a link associated with them"); + else if (!Uri.IsWellFormedUriString(this.Url, UriKind.Absolute)) + throw new InvalidOperationException("Urls must be well formatted and include their protocol (either HTTP or HTTPS)"); + } + + else if (string.IsNullOrEmpty(this.CustomId)) + throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); return new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 2ac6efa6b3..b7dd6ed02a 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -401,10 +401,24 @@ public EmbedBuilder AddField(Action action) /// The built embed object. /// /// Total embed length exceeds . + /// Any Url must be well formatted include its protocols (i.e http:// or https://). public Embed Build() { if (Length > MaxEmbedLength) throw new InvalidOperationException($"Total embed length must be less than or equal to {MaxEmbedLength}."); + if (!string.IsNullOrEmpty(Url) && !Uri.IsWellFormedUriString(Url, UriKind.Absolute)) + throw new InvalidOperationException("Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(ThumbnailUrl) && !Uri.IsWellFormedUriString(ThumbnailUrl, UriKind.Absolute)) + throw new InvalidOperationException("Thumbnail Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(ImageUrl) && !Uri.IsWellFormedUriString(ImageUrl, UriKind.Absolute)) + throw new InvalidOperationException("Image Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (Author != null) + { + if(!string.IsNullOrEmpty(Author.Url) && !Uri.IsWellFormedUriString(Author.Url, UriKind.Absolute)) + throw new InvalidOperationException("Author Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(Author.IconUrl) && !Uri.IsWellFormedUriString(Author.IconUrl, UriKind.Absolute)) + throw new InvalidOperationException("Author Icon Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + } var fields = ImmutableArray.CreateBuilder(Fields.Count); for (int i = 0; i < Fields.Count; i++) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 00f22c0e8c..db0c2431d4 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3431,10 +3431,11 @@ - 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 A delegate containing the properties to modify the message with. The request options for this async request. + A task that represents the asynchronous operation of updating the message. @@ -3689,6 +3690,14 @@ The request options for this async request. A that represents the initial response. + + + Acknowledges this interaction. + + + A task that represents the asynchronous operation of acknowledging the interaction. + + Acknowledges this interaction. From bd5041ac79e6ff64e1b43d9717962dfec18545a7 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 28 Jul 2021 19:30:42 -0300 Subject: [PATCH 126/494] Threads pt2 --- src/Discord.Net.Core/Discord.Net.Core.xml | 42 +++- .../Entities/Channels/IThreadChannel.cs | 17 ++ .../API/Gateway/ThreadMembersUpdate.cs | 27 +++ .../Discord.Net.WebSocket.xml | 201 +++++++++++++++++- .../DiscordSocketClient.cs | 78 ++++--- .../Entities/Channels/SocketGuildChannel.cs | 4 +- .../Entities/Channels/SocketThreadChannel.cs | 26 ++- 7 files changed, 352 insertions(+), 43 deletions(-) create mode 100644 src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index bce491f0fa..076aa6db56 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1987,6 +1987,11 @@ Represents a thread channel inside of a guild. + + + if the current user has joined this thread, otherwise . + + if the current thread is archived, otherwise . @@ -2017,6 +2022,18 @@ An approximate count of messages in a thread, stops counting at 50. + + + Joins the current thread. + + + + + + Leaves the current thread. + + + Represents a generic voice channel in a guild. @@ -4107,6 +4124,11 @@ A or . + + + A . + + Provides properties that are used to modify a with the specified changes. @@ -4502,7 +4524,8 @@ - Adds a button to the specified row. + Adds a with specified parameters to the at the specific row. + If the row cannot accept the component then it will add it to a row that can. The label text for the newly added button. The style of this newly added button. @@ -4627,44 +4650,49 @@ Creates a new instance of a from instance of a . - + Creates a button with the style. - The label to use on the newly created link button. + The label for this link button. The url for this link button to go to. + The emote for this link button A builder with the newly created button. - + Creates a button with the style. The label for this danger button. The custom id for this danger button. + The emote for this danger button A builder with the newly created button. - + Creates a button with the style. The label for this primary button. The custom id for this primary button. + The emote for this primary button A builder with the newly created button. - + Creates a button with the style. The label for this secondary button. The custom id for this secondary button. + The emote for this secondary button A builder with the newly created button. - + Creates a button with the style. The label for this success button. The custom id for this success button. + The emote for this success button A builder with the newly created button. diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs index 1459c954cd..f801d3fd80 100644 --- a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -11,6 +11,11 @@ namespace Discord /// public interface IThreadChannel : ITextChannel, IGuildChannel { + /// + /// if the current user has joined this thread, otherwise . + /// + bool Joined { get; } + /// /// if the current thread is archived, otherwise . /// @@ -40,5 +45,17 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// An approximate count of messages in a thread, stops counting at 50. /// int MessageCount { get; } + + /// + /// Joins the current thread. + /// + /// + Task JoinAsync(); + + /// + /// Leaves the current thread. + /// + /// + Task LeaveAsync(); } } diff --git a/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs b/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs new file mode 100644 index 0000000000..b6acba6ae7 --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs @@ -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 AddedMembers { get; set; } + + [JsonProperty("removed_member_ids")] + public Optional RemovedMemberIds { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 00f22c0e8c..8db8a13409 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -756,6 +756,21 @@ + + + Fired when a thread is created within a guild. + + + + + Fired when a thread is updated within a guild. + + + + + Fired when a thread is deleted. + + @@ -2154,6 +2169,11 @@ + + + Gets a collection of threads within this text channel. + + @@ -2360,9 +2380,19 @@ Represents a thread channel inside of a guild. - + + + + if this thread is private, otherwise + + + + + Gets the parent channel this thread resides in. + + @@ -2848,6 +2878,14 @@ A read-only collection of category channels found within this guild. + + + Gets a collection of all thread channels in this guild. + + + A read-only collection of thread channels found within this guild. + + Gets the current logged-in user. @@ -3431,10 +3469,11 @@ - 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 A delegate containing the properties to modify the message with. The request options for this async request. + A task that represents the asynchronous operation of updating the message. @@ -3689,6 +3728,14 @@ The request options for this async request. A that represents the initial response. + + + Acknowledges this interaction. + + + A task that represents the asynchronous operation of acknowledging the interaction. + + Acknowledges this interaction. @@ -4488,6 +4535,156 @@ + + + Gets the this user is in. + + + + + Gets the timestamp for when this user joined this thread. + + + + + Gets the guild this user is in. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the guild user of this thread user. + + + Represents a WebSocket-based user that is yet to be recognized by the client. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index c05ff3878d..c52675d669 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1975,48 +1975,62 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty // Threads 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(_serializer); + var data = (payload as JToken).ToObject(_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; case "THREAD_UPDATE": { - await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_UPDATE)").ConfigureAwait(false); - - var data = (payload as JToken).ToObject(_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(_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; @@ -2071,8 +2085,20 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } break; case "THREAD_MEMBER_UPDATE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_MEMBER_UPDATE)").ConfigureAwait(false); + var p = payload; + } + break; case "THREAD_MEMBERS_UPDATE": // based on intents + { + await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_MEMBERS_UPDATE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + } + break; //Ignored (User only) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs index 9f63ad7b45..7187c97716 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs @@ -66,9 +66,9 @@ internal static SocketGuildChannel Create(SocketGuild guild, ClientState state, internal override void Update(ClientState state, Model model) { 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(overwrites.Length); for (int i = 0; i < overwrites.Length; i++) newOverwrites.Add(overwrites[i].ToEntity()); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index d9583d1ea1..4072276cb8 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -2,19 +2,26 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; +using ThreadMember = Discord.API.ThreadMember; namespace Discord.WebSocket { /// /// Represents a thread channel inside of a guild. /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMessageChannel { + + /// + public bool Joined { get; private set; } + /// /// if this thread is private, otherwise /// @@ -65,6 +72,8 @@ public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMe private readonly MessageCache _messages; + private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; + internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) : base(discord, id, guild) { @@ -97,6 +106,11 @@ internal override void Update(ClientState state, Model model) } } + internal void Update(ClientState state, ThreadMember self) + { + + } + /// public virtual Task SyncPermissionsAsync(RequestOptions options = null) => ChannelHelper.SyncPermissionsAsync(this, Discord, options); @@ -253,10 +267,10 @@ internal SocketMessage RemoveMessage(ulong id) public Task GetUsersAsync() { - + return Task.CompletedTask; } - private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; + internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; //ITextChannel @@ -325,22 +339,22 @@ Task> INestedChannel.GetInvitesAsync(Reques public Task JoinAsync() { - + return Task.CompletedTask; } public Task LeaveAsync() { - + return Task.CompletedTask; } public Task AddThreadMember(IGuildUser user) { - + return Task.CompletedTask; } public Task RemoveThreadMember(IGuildUser user) { - + return Task.CompletedTask; } From 29a3e8783523a26627234d8e0468091761b4caf6 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 31 Jul 2021 14:37:12 -0300 Subject: [PATCH 127/494] Threads pt3 --- src/Discord.Net.Core/Discord.Net.Core.xml | 175 +++++-- .../Entities/Channels/ITextChannel.cs | 33 ++ .../Entities/Channels/IThreadChannel.cs | 39 +- .../Channels/TextChannelProperties.cs | 16 + .../Channels/ThreadChannelProperties.cs | 45 -- .../Entities/Channels/ThreadType.cs | 29 ++ .../Entities/Permissions/GuildPermission.cs | 102 ++-- .../Entities/Permissions/GuildPermissions.cs | 8 +- .../API/Common/ThreadMember.cs | 6 + .../API/Common/ThreadMetadata.cs | 2 +- .../API/Rest/ModifyThreadParams.cs | 28 ++ .../API/Rest/StartThreadParams.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 218 +++++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 13 +- .../Entities/Channels/RestTextChannel.cs | 60 ++- .../Entities/Channels/RestThreadChannel.cs | 230 +++++++++ .../Entities/Channels/ThreadHelper.cs | 66 +++ .../Entities/Users/RestThreadUser.cs | 60 +++ .../BaseSocketClient.Events.cs | 20 + .../Discord.Net.WebSocket.xml | 300 ++++++------ .../DiscordSocketClient.cs | 148 ++++-- .../Entities/Channels/SocketChannelHelper.cs | 1 + .../Entities/Channels/SocketTextChannel.cs | 56 ++- .../Entities/Channels/SocketThreadChannel.cs | 437 +++++++++--------- .../Entities/Guilds/SocketGuild.cs | 8 + .../Entities/Users/SocketThreadUser.cs | 93 ++-- .../GuildPermissionsTests.cs | 2 +- .../MockedEntities/MockedTextChannel.cs | 2 + 28 files changed, 1572 insertions(+), 627 deletions(-) delete mode 100644 src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs create mode 100644 src/Discord.Net.Core/Entities/Channels/ThreadType.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs create mode 100644 src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs create mode 100644 src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs create mode 100644 src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index dc1641bcd4..5213edd3cd 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1982,11 +1982,48 @@ of webhooks that is available in this channel. + + + Creates a thread within this . + + + When is the thread type will be based off of the + channel its created in. When called on a , it creates a . + When called on a , it creates a . The id of the created + thread will be the same as the id of the message, and as such a message can only have a + single thread created from it. + + The name of the thread. + + The type of the thread. + + Note: This parameter is not used if the parameter is not specified. + + + + The duration on which this thread archives after. + + Note: Options and + are only available for guilds that are boosted. You can check in the to see if the + guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. + + + The message which to start the thread from. + The options to be used when sending the request. + + A task that represents the asynchronous create operation. The task result contains a + + Represents a thread channel inside of a guild. + + + Gets the type of the current thread channel. + + if the current user has joined this thread, otherwise . @@ -2022,17 +2059,43 @@ An approximate count of messages in a thread, stops counting at 50. - + Joins the current thread. - + The options to be used when sending the request. + + A task that represents the asynchronous join operation. + - + Leaves the current thread. - + The options to be used when sending the request. + + A task that represents the asynchronous leave operation. + + + + + Adds a user to this thread. + + The to add. + The options to be used when sending the request. + + A task that represents the asynchronous operation of adding a member to a thread. + + + + + Removes a user from this thread. + + The to remove from this thread. + The options to be used when sending the request. + + A task that represents the asynchronous operation of removing a user from this thread. + @@ -2133,6 +2196,21 @@ Thrown if the value does not fall within [0, 21600]. + + + Gets or sets whether or not the thread is archived. + + + + + Gets or sets whether or not the thread is locked. + + + + + Gets or sets the auto archive duration. + + Represents the thread auto archive duration. @@ -2164,40 +2242,26 @@ - + - Gets or sets whether or not the thread is archived. + Represents types of threads. - + - Gets or sets whether or not the thread is locked. + Represents a temporary sub-channel within a GUILD_NEWS channel. - + - Gets or sets the name of the thread. + Represents a temporary sub-channel within a GUILD_TEXT channel. - + - Gets or sets the auto archive duration. + Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission - - - Gets or sets the slow-mode ratelimit in seconds for this channel. - - - Setting this value to anything above zero will require each user to wait X seconds before - sending another message; setting this value to 0 will disable slow-mode for this channel. - - Users with or - will be exempt from slow-mode. - - - Thrown if the value does not fall within [0, 21600]. - Provides properties that are used to modify an with the specified changes. @@ -4747,7 +4811,7 @@ A button must contain either a or a , but not both. A button must have an or a . A link button must contain a URL. - A link must include a protocol (http or https). + A URL must include a protocol (http or https). A non-link button must contain a custom id @@ -6041,7 +6105,7 @@ The built embed object. Total embed length exceeds . - Any Url must include protocols (i.e http:// or https://). + Any Url must be well formatted include its protocols (i.e http:// or https://). @@ -8024,6 +8088,16 @@ Allows for viewing of audit logs. + + + Allows guild members to view a channel, which includes reading messages in text channels. + + + + + Allows for sending messages in a channel + + Allows for sending of text-to-speech messages. @@ -8094,6 +8168,11 @@ Allows for using voice-activity-detection in a voice channel. + + + Allows for using priority speaker in a voice channel. + + Allows video streaming in a voice channel. @@ -8127,15 +8206,49 @@ authentication when used on a guild that has server-wide 2FA enabled. - + - Allows management and editing of emojis. + Allows management and editing of emojis and stickers. + + + This permission requires the owner account to use two-factor + authentication when used on a guild that has server-wide 2FA enabled. + + + + + Allows members to use slash commands in text channels. + + + + + Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.). + + + + + Allows for deleting and archiving threads, and viewing all private threads. This permission requires the owner account to use two-factor authentication when used on a guild that has server-wide 2FA enabled. + + + Allows for creating and participating in threads. + + + + + Allows for creating and participating in private threads. + + + + + Allows the usage of custom stickers from other servers. + + Gets a blank that grants no permissions. @@ -8238,7 +8351,7 @@ If true, a user may edit the webhooks for this guild. - + If true, a user may edit the emojis for this guild. diff --git a/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs b/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs index a2baf69905..70ba872fc6 100644 --- a/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs @@ -114,5 +114,38 @@ public interface ITextChannel : IMessageChannel, IMentionable, INestedChannel /// of webhooks that is available in this channel. /// Task> GetWebhooksAsync(RequestOptions options = null); + + /// + /// Creates a thread within this . + /// + /// + /// When is the thread type will be based off of the + /// channel its created in. When called on a , it creates a . + /// When called on a , it creates a . The id of the created + /// thread will be the same as the id of the message, and as such a message can only have a + /// single thread created from it. + /// + /// The name of the thread. + /// + /// The type of the thread. + /// + /// Note: This parameter is not used if the parameter is not specified. + /// + /// + /// + /// The duration on which this thread archives after. + /// + /// Note: Options and + /// are only available for guilds that are boosted. You can check in the to see if the + /// guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. + /// + /// + /// The message which to start the thread from. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous create operation. The task result contains a + /// + Task CreateThreadAsync(string name, ThreadType type = ThreadType.PublicThread, ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, + IMessage message = null, RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs index f801d3fd80..b5d6eea209 100644 --- a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -11,6 +11,11 @@ namespace Discord /// public interface IThreadChannel : ITextChannel, IGuildChannel { + /// + /// Gets the type of the current thread channel. + /// + ThreadType Type { get; } + /// /// if the current user has joined this thread, otherwise . /// @@ -49,13 +54,39 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// /// Joins the current thread. /// - /// - Task JoinAsync(); + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous join operation. + /// + Task JoinAsync(RequestOptions options = null); /// /// Leaves the current thread. /// - /// - Task LeaveAsync(); + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous leave operation. + /// + Task LeaveAsync(RequestOptions options = null); + + /// + /// Adds a user to this thread. + /// + /// The to add. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous operation of adding a member to a thread. + /// + Task AddUserAsync(IGuildUser user, RequestOptions options = null); + + /// + /// Removes a user from this thread. + /// + /// The to remove from this thread. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous operation of removing a user from this thread. + /// + Task RemoveUserAsync(IGuildUser user, RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Channels/TextChannelProperties.cs b/src/Discord.Net.Core/Entities/Channels/TextChannelProperties.cs index 821f358f58..2dceb025c9 100644 --- a/src/Discord.Net.Core/Entities/Channels/TextChannelProperties.cs +++ b/src/Discord.Net.Core/Entities/Channels/TextChannelProperties.cs @@ -38,5 +38,21 @@ public class TextChannelProperties : GuildChannelProperties /// /// Thrown if the value does not fall within [0, 21600]. public Optional SlowModeInterval { get; set; } + + /// + /// Gets or sets whether or not the thread is archived. + /// + public Optional Archived { get; set; } + + /// + /// Gets or sets whether or not the thread is locked. + /// + public Optional Locked { get; set; } + + /// + /// Gets or sets the auto archive duration. + /// + public Optional AutoArchiveDuration { get; set; } + } } diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs b/src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs deleted file mode 100644 index 10a0d76547..0000000000 --- a/src/Discord.Net.Core/Entities/Channels/ThreadChannelProperties.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.Entities -{ - public class ThreadChannelProperties - { - /// - /// Gets or sets whether or not the thread is archived. - /// - public Optional Archived { get; set; } - - /// - /// Gets or sets whether or not the thread is locked. - /// - public Optional Locked { get; set; } - - /// - /// Gets or sets the name of the thread. - /// - public Optional Name { get; set; } - - /// - /// Gets or sets the auto archive duration. - /// - public Optional AutoArchiveDuration { get; set; } - - /// - /// Gets or sets the slow-mode ratelimit in seconds for this channel. - /// - /// - /// Setting this value to anything above zero will require each user to wait X seconds before - /// sending another message; setting this value to 0 will disable slow-mode for this channel. - /// - /// Users with or - /// will be exempt from slow-mode. - /// - /// - /// Thrown if the value does not fall within [0, 21600]. - public Optional SlowModeInterval { get; set; } - } -} diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadType.cs b/src/Discord.Net.Core/Entities/Channels/ThreadType.cs new file mode 100644 index 0000000000..2db09bcb9e --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/ThreadType.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents types of threads. + /// + public enum ThreadType + { + /// + /// Represents a temporary sub-channel within a GUILD_NEWS channel. + /// + NewsThread = 10, + + /// + /// Represents a temporary sub-channel within a GUILD_TEXT channel. + /// + PublicThread = 11, + + /// + /// Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission + /// + PrivateThread = 12, + } +} diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs index 31bd6164ac..89ee20b9fb 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs @@ -10,7 +10,7 @@ public enum GuildPermission : ulong /// /// Allows creation of instant invites. /// - CreateInstantInvite = 0x00_00_00_01, + CreateInstantInvite = 0x00_00_00_01, /// /// Allows kicking members. /// @@ -18,7 +18,7 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - KickMembers = 0x00_00_00_02, + KickMembers = 0x00_00_00_02, /// /// Allows banning members. /// @@ -26,7 +26,7 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - BanMembers = 0x00_00_00_04, + BanMembers = 0x00_00_00_04, /// /// Allows all permissions and bypasses channel permission overwrites. /// @@ -34,7 +34,7 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - Administrator = 0x00_00_00_08, + Administrator = 0x00_00_00_08, /// /// Allows management and editing of channels. /// @@ -42,7 +42,7 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - ManageChannels = 0x00_00_00_10, + ManageChannels = 0x00_00_00_10, /// /// Allows management and editing of the guild. /// @@ -50,27 +50,33 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - ManageGuild = 0x00_00_00_20, + ManageGuild = 0x00_00_00_20, /// /// Allows for viewing of guild insights /// - ViewGuildInsights = 0x00_08_00_00, + ViewGuildInsights = 0x00_08_00_00, // Text /// /// Allows for the addition of reactions to messages. /// - AddReactions = 0x00_00_00_40, + AddReactions = 0x00_00_00_40, /// /// Allows for viewing of audit logs. /// - ViewAuditLog = 0x00_00_00_80, - ViewChannel = 0x00_00_04_00, - SendMessages = 0x00_00_08_00, + ViewAuditLog = 0x00_00_00_80, + /// + /// Allows guild members to view a channel, which includes reading messages in text channels. + /// + ViewChannel = 0x00_00_04_00, + /// + /// Allows for sending messages in a channel + /// + SendMessages = 0x00_00_08_00, /// /// Allows for sending of text-to-speech messages. /// - SendTTSMessages = 0x00_00_10_00, + SendTTSMessages = 0x00_00_10_00, /// /// Allows for deletion of other users messages. /// @@ -78,70 +84,73 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - ManageMessages = 0x00_00_20_00, + ManageMessages = 0x00_00_20_00, /// /// Allows links sent by users with this permission will be auto-embedded. /// - EmbedLinks = 0x00_00_40_00, + EmbedLinks = 0x00_00_40_00, /// /// Allows for uploading images and files. /// - AttachFiles = 0x00_00_80_00, + AttachFiles = 0x00_00_80_00, /// /// Allows for reading of message history. /// - ReadMessageHistory = 0x00_01_00_00, + ReadMessageHistory = 0x00_01_00_00, /// /// Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all /// online users in a channel. /// - MentionEveryone = 0x00_02_00_00, + MentionEveryone = 0x00_02_00_00, /// /// Allows the usage of custom emojis from other servers. /// - UseExternalEmojis = 0x00_04_00_00, + UseExternalEmojis = 0x00_04_00_00, // Voice /// /// Allows for joining of a voice channel. /// - Connect = 0x00_10_00_00, + Connect = 0x00_10_00_00, /// /// Allows for speaking in a voice channel. /// - Speak = 0x00_20_00_00, + Speak = 0x00_20_00_00, /// /// Allows for muting members in a voice channel. /// - MuteMembers = 0x00_40_00_00, + MuteMembers = 0x00_40_00_00, /// /// Allows for deafening of members in a voice channel. /// - DeafenMembers = 0x00_80_00_00, + DeafenMembers = 0x00_80_00_00, /// /// Allows for moving of members between voice channels. /// - MoveMembers = 0x01_00_00_00, + MoveMembers = 0x01_00_00_00, /// /// Allows for using voice-activity-detection in a voice channel. /// - UseVAD = 0x02_00_00_00, - PrioritySpeaker = 0x00_00_01_00, + UseVAD = 0x02_00_00_00, + /// + /// Allows for using priority speaker in a voice channel. + /// + PrioritySpeaker = 0x00_00_01_00, /// /// Allows video streaming in a voice channel. /// - Stream = 0x00_00_02_00, + Stream = 0x00_00_02_00, // General 2 /// /// Allows for modification of own nickname. /// - ChangeNickname = 0x04_00_00_00, + ChangeNickname = 0x04_00_00_00, /// /// Allows for modification of other users nicknames. /// - ManageNicknames = 0x08_00_00_00, + ManageNicknames = 0x08_00_00_00, /// /// Allows management and editing of roles. /// @@ -149,7 +158,7 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - ManageRoles = 0x10_00_00_00, + ManageRoles = 0x10_00_00_00, /// /// Allows management and editing of webhooks. /// @@ -157,14 +166,43 @@ public enum GuildPermission : ulong /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - ManageWebhooks = 0x20_00_00_00, + ManageWebhooks = 0x20_00_00_00, /// - /// Allows management and editing of emojis. + /// Allows management and editing of emojis and stickers. /// /// /// This permission requires the owner account to use two-factor /// authentication when used on a guild that has server-wide 2FA enabled. /// - ManageEmojis = 0x40_00_00_00 + ManageEmojisAndStickers = 0x40_00_00_00, + /// + /// Allows members to use slash commands in text channels. + /// + UseSlashCommands = 0x80_00_00_00, + /// + /// Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.). + /// + RequestToSpeak = 0x01_00_00_00_00, + /// + /// Allows for deleting and archiving threads, and viewing all private threads. + /// + /// + /// This permission requires the owner account to use two-factor + /// authentication when used on a guild that has server-wide 2FA enabled. + /// + ManageThreads = 0x04_00_00_00_00, + /// + /// Allows for creating and participating in threads. + /// + UsePublicThreads = 0x08_00_00_00_00, + /// + /// Allows for creating and participating in private threads. + /// + UsePrivateThreads = 0x10_00_00_00_00, + /// + /// Allows the usage of custom stickers from other servers. + /// + UseExternalStickers = 0x20_00_00_00_00 + } } diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index b03c0e1a81..1914a6f86b 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -82,7 +82,7 @@ public struct GuildPermissions /// If true, a user may edit the webhooks for this guild. public bool ManageWebhooks => Permissions.GetValue(RawValue, GuildPermission.ManageWebhooks); /// If true, a user may edit the emojis for this guild. - public bool ManageEmojis => Permissions.GetValue(RawValue, GuildPermission.ManageEmojis); + public bool ManageEmojisAndStickers => Permissions.GetValue(RawValue, GuildPermission.ManageEmojisAndStickers); /// Creates a new with the provided packed value. public GuildPermissions(ulong rawValue) { RawValue = rawValue; } @@ -121,7 +121,7 @@ private GuildPermissions(ulong initialValue, bool? manageNicknames = null, bool? manageRoles = null, bool? manageWebhooks = null, - bool? manageEmojis = null) + bool? manageEmojisAndStickers = null) { ulong value = initialValue; @@ -155,7 +155,7 @@ private GuildPermissions(ulong initialValue, Permissions.SetValue(ref value, manageNicknames, GuildPermission.ManageNicknames); Permissions.SetValue(ref value, manageRoles, GuildPermission.ManageRoles); Permissions.SetValue(ref value, manageWebhooks, GuildPermission.ManageWebhooks); - Permissions.SetValue(ref value, manageEmojis, GuildPermission.ManageEmojis); + Permissions.SetValue(ref value, manageEmojisAndStickers, GuildPermission.ManageEmojisAndStickers); RawValue = value; } @@ -224,7 +224,7 @@ public GuildPermissions( changeNickname: changeNickname, manageNicknames: manageNicknames, manageWebhooks: manageWebhooks, - manageEmojis: manageEmojis) + manageEmojisAndStickers: manageEmojis) { } /// Creates a new from this one, changing the provided non-null permissions. diff --git a/src/Discord.Net.Rest/API/Common/ThreadMember.cs b/src/Discord.Net.Rest/API/Common/ThreadMember.cs index b4c5424547..d8ce15e920 100644 --- a/src/Discord.Net.Rest/API/Common/ThreadMember.cs +++ b/src/Discord.Net.Rest/API/Common/ThreadMember.cs @@ -18,6 +18,12 @@ internal class ThreadMember [JsonProperty("join_timestamp")] public DateTimeOffset JoinTimestamp { get; set; } + [JsonProperty("presense")] + public Optional Presence { get; set; } + + [JsonProperty("member")] + public Optional Member { get; set; } + [JsonProperty("flags")] public int Flags { get; set; } // No enum type (yet?) } diff --git a/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs index f6da249f70..0bc068c1c6 100644 --- a/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs +++ b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs @@ -13,7 +13,7 @@ internal class ThreadMetadata public bool Archived { get; set; } [JsonProperty("auto_archive_duration")] - public int AutoArchiveDuration { get; set; } + public ThreadArchiveDuration AutoArchiveDuration { get; set; } [JsonProperty("archive_timestamp")] public DateTimeOffset ArchiveTimestamp { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs new file mode 100644 index 0000000000..c62b3bfbbb --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord; +using Newtonsoft.Json; + +namespace Discord.API.Rest +{ + internal class ModifyThreadParams + { + [JsonProperty("name")] + public Optional Name { get; set; } + + [JsonProperty("archived")] + public Optional Archived { get; set; } + + [JsonProperty("auto_archive_duration")] + public Optional AutoArchiveDuration { get; set; } + + [JsonProperty("locked")] + public Optional Locked { get; set; } + + [JsonProperty("rate_limit_per_user")] + public Optional Slowmode { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs index 167d94099e..c41398d93e 100644 --- a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs +++ b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs @@ -16,6 +16,6 @@ internal class StartThreadParams public ThreadArchiveDuration Duration { get; set; } [JsonProperty("type")] - public Optional Type { get; set; } + public Optional Type { get; set; } } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 465d5085fb..eda180f01d 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2458,6 +2458,38 @@ + + + Creates a thread within this . + + + When is the thread type will be based off of the + channel its created in. When called on a , it creates a . + When called on a , it creates a . The id of the created + thread will be the same as the id of the message, and as such a message can only have a + single thread created from it. + + The name of the thread. + + The type of the thread. + + Note: This parameter is not used if the parameter is not specified. + + + + The duration on which this thread archives after. + + Note: Options and + are only available for guilds that are boosted. You can check in the to see if the + guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. + + + The message which to start the thread from. + The options to be used when sending the request. + + A task that represents the asynchronous create operation. The task result contains a + + @@ -2506,6 +2538,163 @@ + + + Represents a thread channel recieved over REST. + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the parent text channel id. + + + + + Gets a user within this thread. + + The id of the user to fetch. + The options to be used when sending the request. + + A task representing the asyncronous get operation. The task returns a + if found, otherwise . + + + + + Gets a collection of users within this thread. + + The options to be used when sending the request. + + A task representing the asyncronous get operation. The task returns a + of 's. + + + + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + This method is not supported in threads. + + + + + + + + + + + + + + Represents a REST-based voice channel in a guild. @@ -4271,6 +4460,35 @@ Unable to modify this object using a different token. + + + Represents a thread user recieved over the REST api. + + + + + Gets the this user is in. + + + + + Gets the timestamp for when this user joined this thread. + + + + + Gets the guild this user is in. + + + + + Gets the guild user for this thread user. + + + A task representing the asyncronous get operation. The task returns a + that represents the current thread user. + + Represents a REST-based user. diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index b312fd99f6..51e98c1a3f 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -415,6 +415,15 @@ public async Task ModifyGuildChannelsAsync(ulong guildId, IEnumerable ModifyThreadAsync(ulong channelId, ModifyThreadParams args, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + var bucket = new BucketIds(channelId: channelId); + + return await SendJsonAsync("PATCH", () => $"channels/{channelId}", args, bucket, options: options); + } + public async Task StartThreadAsync(ulong channelId, ulong messageId, StartThreadParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -426,7 +435,7 @@ public async Task StartThreadAsync(ulong channelId, ulong messageId, St return await SendJsonAsync("POST", () => $"channels/{channelId}/messages/{messageId}/threads", args, bucket, options: options).ConfigureAwait(false); } - + public async Task StartThreadAsync(ulong channelId, StartThreadParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -484,7 +493,7 @@ public async Task ListThreadMembersAsync(ulong channelId, Reques var bucket = new BucketIds(channelId: channelId); - return await SendAsync("GET", () => $"/channels/{channelId}", bucket, options: options); + return await SendAsync("GET", () => $"channels/{channelId}/thread-members", bucket, options: options); } public async Task GetActiveThreadsAsync(ulong channelId, RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index f12977d62b..6343aed03a 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -41,14 +41,14 @@ internal override void Update(Model model) { base.Update(model); CategoryId = model.CategoryId; - Topic = model.Topic.Value; + Topic = model.Topic.GetValueOrDefault(); if (model.SlowMode.IsSpecified) SlowModeInterval = model.SlowMode.Value; IsNsfw = model.Nsfw.GetValueOrDefault(); } /// - public async Task ModifyAsync(Action func, RequestOptions options = null) + public virtual async Task ModifyAsync(Action func, RequestOptions options = null) { var model = await ChannelHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false); Update(model); @@ -173,7 +173,7 @@ public IDisposable EnterTypingState(RequestOptions options = null) /// A task that represents the asynchronous creation operation. The task result contains the newly created /// webhook. /// - public Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) + public virtual Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) => ChannelHelper.CreateWebhookAsync(this, Discord, name, avatar, options); /// /// Gets a webhook available in this text channel. @@ -184,7 +184,7 @@ public Task CreateWebhookAsync(string name, Stream avatar = null, R /// A task that represents the asynchronous get operation. The task result contains a webhook associated /// with the identifier; null if the webhook is not found. /// - public Task GetWebhookAsync(ulong id, RequestOptions options = null) + public virtual Task GetWebhookAsync(ulong id, RequestOptions options = null) => ChannelHelper.GetWebhookAsync(this, Discord, id, options); /// /// Gets the webhooks available in this text channel. @@ -194,7 +194,7 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null /// A task that represents the asynchronous get operation. The task result contains a read-only collection /// of webhooks that is available in this channel. /// - public Task> GetWebhooksAsync(RequestOptions options = null) + public virtual Task> GetWebhooksAsync(RequestOptions options = null) => ChannelHelper.GetWebhooksAsync(this, Discord, options); /// @@ -205,7 +205,7 @@ public Task> GetWebhooksAsync(RequestOptions op /// A task that represents the asynchronous get operation. The task result contains the category channel /// representing the parent of this channel; null if none is set. /// - public Task GetCategoryAsync(RequestOptions options = null) + public virtual Task GetCategoryAsync(RequestOptions options = null) => ChannelHelper.GetCategoryAsync(this, Discord, options); /// public Task SyncPermissionsAsync(RequestOptions options = null) @@ -213,18 +213,55 @@ public Task SyncPermissionsAsync(RequestOptions options = null) //Invites /// - public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + public virtual async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); - public Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + public virtual Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => throw new NotImplementedException(); - public Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + public virtual Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => throw new NotImplementedException(); /// - public async Task> GetInvitesAsync(RequestOptions options = null) + public virtual async Task> GetInvitesAsync(RequestOptions options = null) => await ChannelHelper.GetInvitesAsync(this, Discord, options).ConfigureAwait(false); private string DebuggerDisplay => $"{Name} ({Id}, Text)"; + /// + /// Creates a thread within this . + /// + /// + /// When is the thread type will be based off of the + /// channel its created in. When called on a , it creates a . + /// When called on a , it creates a . The id of the created + /// thread will be the same as the id of the message, and as such a message can only have a + /// single thread created from it. + /// + /// The name of the thread. + /// + /// The type of the thread. + /// + /// Note: This parameter is not used if the parameter is not specified. + /// + /// + /// + /// The duration on which this thread archives after. + /// + /// Note: Options and + /// are only available for guilds that are boosted. You can check in the to see if the + /// guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. + /// + /// + /// The message which to start the thread from. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous create operation. The task result contains a + /// + public async Task CreateThreadAsync(string name, ThreadType type = ThreadType.PublicThread, + ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) + { + var model = await ThreadHelper.CreateThreadAsync(Discord, this, name, type, autoArchiveDuration, message, options); + return RestThreadChannel.Create(Discord, this.Guild, model); + } + //ITextChannel /// async Task ITextChannel.CreateWebhookAsync(string name, Stream avatar, RequestOptions options) @@ -236,6 +273,9 @@ async Task ITextChannel.GetWebhookAsync(ulong id, RequestOptions optio async Task> ITextChannel.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); + async Task ITextChannel.CreateThreadAsync(string name, ThreadType type, ThreadArchiveDuration autoArchiveDuration, IMessage message, RequestOptions options) + => await CreateThreadAsync(name, type, autoArchiveDuration, message, options); + //IMessageChannel /// async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs new file mode 100644 index 0000000000..640b7443b3 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Channel; + +namespace Discord.Rest +{ + /// + /// Represents a thread channel recieved over REST. + /// + public class RestThreadChannel : RestTextChannel, IThreadChannel + { + public ThreadType Type { get; private set; } + /// + public bool Joined { get; private set; } + + /// + public bool Archived { get; private set; } + + /// + public ThreadArchiveDuration AutoArchiveDuration { get; private set; } + + /// + public DateTimeOffset ArchiveTimestamp { get; private set; } + + /// + public bool Locked { get; private set; } + + /// + public int MemberCount { get; private set; } + + /// + public int MessageCount { get; private set; } + + /// + /// Gets the parent text channel id. + /// + public ulong ParentChannelId { get; private set; } + + internal RestThreadChannel(BaseDiscordClient discord, IGuild guild, ulong id) + : base(discord, guild, id) + { + + } + + internal new static RestThreadChannel Create(BaseDiscordClient discord, IGuild guild, Model model) + { + var entity = new RestThreadChannel(discord, guild, model.Id); + entity.Update(model); + return entity; + } + + internal override void Update(Model model) + { + base.Update(model); + + this.Joined = model.ThreadMember.IsSpecified; + + if (model.ThreadMetadata.IsSpecified) + { + this.Archived = model.ThreadMetadata.Value.Archived; + this.AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; + this.ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; + this.Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + + } + + this.MemberCount = model.MemberCount.GetValueOrDefault(0); + this.MessageCount = model.MessageCount.GetValueOrDefault(0); + this.Type = (ThreadType)model.Type; + this.ParentChannelId = model.CategoryId.Value; + } + + /// + /// Gets a user within this thread. + /// + /// The id of the user to fetch. + /// The options to be used when sending the request. + /// + /// A task representing the asyncronous get operation. The task returns a + /// if found, otherwise . + /// + public new Task GetUserAsync(ulong userId, RequestOptions options = null) + => ThreadHelper.GetUserAsync(userId, this, Discord, options); + + /// + /// Gets a collection of users within this thread. + /// + /// The options to be used when sending the request. + /// + /// A task representing the asyncronous get operation. The task returns a + /// of 's. + /// + public new async Task> GetUsersAsync(RequestOptions options = null) + => (await ThreadHelper.GetUsersAsync(this, Discord, options).ConfigureAwait(false)).ToImmutableArray(); + + /// + public override async Task ModifyAsync(Action func, RequestOptions options = null) + { + var model = await ThreadHelper.ModifyAsync(this, Discord, func, options); + Update(model); + } + + /// + /// + /// This method is not supported in threads. + /// + public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task GetCategoryAsync(RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task> GetInvitesAsync(RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override OverwritePermissions? GetPermissionOverwrite(IRole role) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override OverwritePermissions? GetPermissionOverwrite(IUser user) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task GetWebhookAsync(ulong id, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task> GetWebhooksAsync(RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null) + => throw new NotImplementedException(); + + /// + /// + /// This method is not supported in threads. + /// + public override IReadOnlyCollection PermissionOverwrites + => throw new NotImplementedException(); + + + /// + public Task JoinAsync(RequestOptions options = null) + => Discord.ApiClient.JoinThreadAsync(this.Id, options); + + /// + public Task LeaveAsync(RequestOptions options = null) + => Discord.ApiClient.LeaveThreadAsync(this.Id, options); + + /// + public Task AddUserAsync(IGuildUser user, RequestOptions options = null) + => Discord.ApiClient.AddThreadMemberAsync(this.Id, user.Id, options); + + /// + public Task RemoveUserAsync(IGuildUser user, RequestOptions options = null) + => Discord.ApiClient.RemoveThreadMemberAsync(this.Id, user.Id, options); + } +} diff --git a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs new file mode 100644 index 0000000000..958210d85f --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs @@ -0,0 +1,66 @@ +using Discord.API.Rest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Channel; + +namespace Discord.Rest +{ + internal static class ThreadHelper + { + public static async Task CreateThreadAsync(BaseDiscordClient client, ITextChannel channel, string name, ThreadType type = ThreadType.PublicThread, + ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) + { + if (autoArchiveDuration == ThreadArchiveDuration.OneWeek && !channel.Guild.Features.Contains("SEVEN_DAY_THREAD_ARCHIVE")) + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!"); + + if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !channel.Guild.Features.Contains("THREE_DAY_THREAD_ARCHIVE")) + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!"); + + var args = new StartThreadParams() + { + Name = name, + Duration = autoArchiveDuration, + Type = type + }; + + Model model = null; + + if (message != null) + model = await client.ApiClient.StartThreadAsync(channel.Id, message.Id, args, options).ConfigureAwait(false); + else + model = await client.ApiClient.StartThreadAsync(channel.Id, args, options).ConfigureAwait(false); + + return model; + } + + public static async Task ModifyAsync(IThreadChannel channel, BaseDiscordClient client, + Action func, + RequestOptions options) + { + var args = new TextChannelProperties(); + func(args); + var apiArgs = new API.Rest.ModifyThreadParams + { + Name = args.Name, + Archived = args.Archived, + AutoArchiveDuration = args.AutoArchiveDuration, + Locked = args.Locked, + Slowmode = args.SlowModeInterval + }; + return await client.ApiClient.ModifyThreadAsync(channel.Id, apiArgs, options).ConfigureAwait(false); + } + + public static async Task GetUsersAsync(IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) + { + var users = await client.ApiClient.ListThreadMembersAsync(channel.Id, options); + + return users.Select(x => RestThreadUser.Create(client, channel.Guild, x, channel)).ToArray(); + } + + public static async Task GetUserAsync(ulong userdId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) + => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userdId); + } +} diff --git a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs new file mode 100644 index 0000000000..d74591e75e --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ThreadMember; + +namespace Discord.Rest +{ + /// + /// Represents a thread user recieved over the REST api. + /// + public class RestThreadUser : RestEntity + { + /// + /// Gets the this user is in. + /// + public IThreadChannel Thread { get; } + + /// + /// Gets the timestamp for when this user joined this thread. + /// + public DateTimeOffset JoinedAt { get; private set; } + + /// + /// Gets the guild this user is in. + /// + public IGuild Guild { get; } + + internal RestThreadUser(BaseDiscordClient discord, IGuild guild, IThreadChannel channel, ulong id) + : base(discord, id) + { + this.Guild = guild; + this.Thread = channel; + } + + internal static RestThreadUser Create(BaseDiscordClient client, IGuild guild, Model model, IThreadChannel channel) + { + var entity = new RestThreadUser(client, guild, channel, model.UserId.Value); + entity.Update(model); + return entity; + } + + internal void Update(Model model) + { + this.JoinedAt = model.JoinTimestamp; + } + + /// + /// Gets the guild user for this thread user. + /// + /// + /// A task representing the asyncronous get operation. The task returns a + /// that represents the current thread user. + /// + public Task GetGuildUser() + => Guild.GetUserAsync(this.Id); + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index f29f13cf69..d49afff25a 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -572,5 +572,25 @@ public event Func, Task> ThreadDeleted } internal readonly AsyncEvent, Task>> _threadDeleted = new AsyncEvent, Task>>(); + /// + /// Fired when a user joins a thread + /// + public event Func ThreadMemberJoined + { + add { _threadMemberJoined.Add(value); } + remove { _threadMemberJoined.Remove(value); } + } + internal readonly AsyncEvent> _threadMemberJoined = new AsyncEvent>(); + + /// + /// Fired when a user leaves a thread + /// + public event Func ThreadMemberLeft + { + add { _threadMemberLeft.Add(value); } + remove { _threadMemberLeft.Remove(value); } + } + internal readonly AsyncEvent> _threadMemberLeft = new AsyncEvent>(); + } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 8db8a13409..8c6f031faf 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -771,6 +771,16 @@ Fired when a thread is deleted. + + + Fired when a user joins a thread + + + + + Fired when a user leaves a thread + + @@ -2380,6 +2390,16 @@ Represents a thread channel inside of a guild. + + + Gets the owner of the current thread. + + + + + Gets the current users within this thread. + + @@ -2411,182 +2431,152 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + Gets a collection of cached users within this thread. + - + - + - Gets a message from this message channel. + Gets all users inside this thread. - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. + If all users are not downloaded then this method will call and return the result. - The snowflake identifier of the message. The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - + A task representing the download operation. - + - Gets the last N messages from this message channel. + Downloads all users that have access to this thread. - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. The options to be used when sending the request. - - Paged collection of messages. - + A task representing the asyncronous download operation. + + + - + + + + - Gets a collection of messages in this channel. + Adds a user to this thread. - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. + The to add. The options to be used when sending the request. - Paged collection of messages. + A task that represents the asynchronous operation of adding a member to a thread. - + - Gets a collection of messages in this channel. + Removes a user from this thread. - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. + The to remove from this thread. The options to be used when sending the request. - Paged collection of messages. + A task that represents the asynchronous operation of removing a user from this thread. - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + - - + + + + This method is not supported in threads. + @@ -4535,6 +4525,11 @@ + + + Represents a thread user received over the gateway. + + Gets the this user is in. @@ -4565,9 +4560,6 @@ - - - @@ -4580,27 +4572,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -4658,15 +4629,6 @@ - - - - - - - - - diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index c52675d669..0c55eeab64 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1975,63 +1975,58 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty // Threads case "THREAD_CREATE": { - try - { - await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_CREATE)").ConfigureAwait(false); + await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_CREATE)").ConfigureAwait(false); - var data = (payload as JToken).ToObject(_serializer); + var data = (payload as JToken).ToObject(_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); + SocketThreadChannel threadChannel = null; - await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); + if ((threadChannel = guild.ThreadChannels.FirstOrDefault(x => x.Id == data.Id)) != null) + { + threadChannel.Update(this.State, data); + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); } - catch(Exception x) + else { - + threadChannel = (SocketThreadChannel)guild.AddChannel(this.State, data); + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); + await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); } } break; case "THREAD_UPDATE": { - try - { - await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_UPDATE)").ConfigureAwait(false); - - var data = (payload as JToken).ToObject(_serializer); - var guild = State.GetGuild(data.GuildId.Value); - if (guild == null) - { - 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(_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); - await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, channel).ConfigureAwait(false); - } - catch(Exception x) + if (!(guild?.IsSynced ?? true)) { - + await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); + return; } + await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, channel).ConfigureAwait(false); } break; case "THREAD_DELETE": @@ -2075,19 +2070,30 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty if(entity == null) { - guild.AddChannel(this.State, thread); + entity = (SocketThreadChannel)guild.AddChannel(this.State, thread); } else { entity.Update(this.State, thread); } + + foreach(var member in data.Members.Where(x => x.Id.Value == entity.Id)) + { + var guildMember = guild.GetUser(member.Id.Value); + + entity.AddOrUpdateThreadMember(member, guildMember); + } } } break; case "THREAD_MEMBER_UPDATE": { await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_MEMBER_UPDATE)").ConfigureAwait(false); - var p = payload; + + var data = (payload as JToken).ToObject(_serializer); + + //var guild = State.GetGuild(data.) + } break; @@ -2097,6 +2103,69 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var data = (payload as JToken).ToObject(_serializer); + var guild = State.GetGuild(data.GuildId); + + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var thread = (SocketThreadChannel)guild.GetChannel(data.Id); + + if(thread == null) + { + await UnknownChannelAsync(type, data.Id); + return; + } + + IReadOnlyCollection leftUsers = null; + IReadOnlyCollection joinUsers = null; + + + if (data.RemovedMemberIds.IsSpecified) + { + leftUsers = thread.RemoveUsers(data.RemovedMemberIds.Value); + } + + if (data.AddedMembers.IsSpecified) + { + List newThreadMembers = new List(); + foreach(var threadMember in data.AddedMembers.Value) + { + SocketGuildUser guildMember; + + if (threadMember.Member.IsSpecified) + { + guildMember = guild.AddOrUpdateUser(threadMember.Member.Value); + } + else + { + guildMember = guild.GetUser(threadMember.UserId.Value); + } + + newThreadMembers.Add(thread.AddOrUpdateThreadMember(threadMember, guildMember)); + } + + if (newThreadMembers.Any()) + joinUsers = newThreadMembers.ToImmutableArray(); + } + + if (leftUsers != null) + { + foreach(var threadUser in leftUsers) + { + await TimedInvokeAsync(_threadMemberLeft, nameof(ThreadMemberLeft), threadUser).ConfigureAwait(false); + } + } + + if(joinUsers != null) + { + foreach(var threadUser in joinUsers) + { + await TimedInvokeAsync(_threadMemberJoined, nameof(ThreadMemberJoined), threadUser).ConfigureAwait(false); + } + } } break; @@ -2138,6 +2207,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty catch (Exception ex) { await _gatewayLogger.ErrorAsync($"Error handling {opCode}{(type != null ? $" ({type})" : "")}", ex).ConfigureAwait(false); + Console.WriteLine(ex); } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs index 5cfbcc1a8e..4a1dc45c71 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs @@ -70,6 +70,7 @@ public static void AddMessage(ISocketMessageChannel channel, DiscordSocketClient { case SocketDMChannel dmChannel: dmChannel.AddMessage(msg); break; case SocketGroupChannel groupChannel: groupChannel.AddMessage(msg); break; + case SocketThreadChannel threadChannel: threadChannel.AddMessage(msg); break; case SocketTextChannel textChannel: textChannel.AddMessage(msg); break; default: throw new NotSupportedException($"Unexpected {nameof(ISocketMessageChannel)} type."); } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index 192d74328c..ca9164a46c 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -78,9 +78,46 @@ internal override void Update(ClientState state, Model model) } /// - public Task ModifyAsync(Action func, RequestOptions options = null) + public virtual Task ModifyAsync(Action func, RequestOptions options = null) => ChannelHelper.ModifyAsync(this, Discord, func, options); + /// + /// Creates a thread within this . + /// + /// + /// When is the thread type will be based off of the + /// channel its created in. When called on a , it creates a . + /// When called on a , it creates a . The id of the created + /// thread will be the same as the id of the message, and as such a message can only have a + /// single thread created from it. + /// + /// The name of the thread. + /// + /// The type of the thread. + /// + /// Note: This parameter is not used if the parameter is not specified. + /// + /// + /// + /// The duration on which this thread archives after. + /// + /// Note: Options and + /// are only available for guilds that are boosted. You can check in the to see if the + /// guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. + /// + /// + /// The message which to start the thread from. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous create operation. The task result contains a + /// + public async Task CreateThreadAsync(string name, ThreadType type = ThreadType.PublicThread, + ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) + { + var model = await ThreadHelper.CreateThreadAsync(Discord, this, name, type, autoArchiveDuration, message, options); + return SocketThreadChannel.Create(this.Guild, Discord.State, model); + } + //Messages /// public SocketMessage GetCachedMessage(ulong id) @@ -235,7 +272,7 @@ public override SocketGuildUser GetUser(ulong id) /// A task that represents the asynchronous creation operation. The task result contains the newly created /// webhook. /// - public Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) + public virtual Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) => ChannelHelper.CreateWebhookAsync(this, Discord, name, avatar, options); /// /// Gets a webhook available in this text channel. @@ -246,7 +283,7 @@ public Task CreateWebhookAsync(string name, Stream avatar = null, R /// A task that represents the asynchronous get operation. The task result contains a webhook associated /// with the identifier; null if the webhook is not found. /// - public Task GetWebhookAsync(ulong id, RequestOptions options = null) + public virtual Task GetWebhookAsync(ulong id, RequestOptions options = null) => ChannelHelper.GetWebhookAsync(this, Discord, id, options); /// /// Gets the webhooks available in this text channel. @@ -256,21 +293,21 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null /// A task that represents the asynchronous get operation. The task result contains a read-only collection /// of webhooks that is available in this channel. /// - public Task> GetWebhooksAsync(RequestOptions options = null) + public virtual Task> GetWebhooksAsync(RequestOptions options = null) => ChannelHelper.GetWebhooksAsync(this, Discord, options); //Invites /// - public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + public virtual async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); /// - public async Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + public virtual async Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteToApplicationAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, applicationId, options).ConfigureAwait(false); /// - public async Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + public virtual async Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = default(int?), bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteToStreamAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, user, options).ConfigureAwait(false); /// - public async Task> GetInvitesAsync(RequestOptions options = null) + public virtual async Task> GetInvitesAsync(RequestOptions options = null) => await ChannelHelper.GetInvitesAsync(this, Discord, options).ConfigureAwait(false); private string DebuggerDisplay => $"{Name} ({Id}, Text)"; @@ -286,6 +323,9 @@ async Task ITextChannel.GetWebhookAsync(ulong id, RequestOptions optio /// async Task> ITextChannel.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); + /// + async Task ITextChannel.CreateThreadAsync(string name, ThreadType type, ThreadArchiveDuration autoArchiveDuration, IMessage message, RequestOptions options) + => await CreateThreadAsync(name, type, autoArchiveDuration, message, options); //IGuildChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 4072276cb8..141d7535cd 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -9,6 +9,8 @@ using System.Threading.Tasks; using Model = Discord.API.Channel; using ThreadMember = Discord.API.ThreadMember; +using MemberUpdates = Discord.API.Gateway.ThreadMembersUpdated; +using System.Collections.Concurrent; namespace Discord.WebSocket { @@ -16,8 +18,21 @@ namespace Discord.WebSocket /// Represents a thread channel inside of a guild. /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] - public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMessageChannel + public class SocketThreadChannel : SocketTextChannel, IThreadChannel { + /// + public ThreadType Type { get; private set; } + + /// + /// Gets the owner of the current thread. + /// + public SocketThreadUser Owner { get; private set; } + + /// + /// Gets the current users within this thread. + /// + public SocketThreadUser CurrentUser + => Users.FirstOrDefault(x => x.Id == Discord.CurrentUser.Id); /// public bool Joined { get; private set; } @@ -25,7 +40,8 @@ public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMe /// /// if this thread is private, otherwise /// - public bool IsPrivateThread { get; private set; } + public bool IsPrivateThread + => this.Type == ThreadType.PrivateThread; /// /// Gets the parent channel this thread resides in. @@ -50,37 +66,29 @@ public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMe /// public bool Locked { get; private set; } - /// - public bool IsNsfw { get; private set; } - - /// - public string Topic { get; private set; } - - /// - public int SlowModeInterval { get; private set; } - - /// - public string Mention { get; private set; } + /// + /// Gets a collection of cached users within this thread. + /// + public new IReadOnlyCollection Users => + _members.Values.ToImmutableArray(); - /// - public ulong? CategoryId { get; private set; } - /// - public IReadOnlyCollection CachedMessages => _messages?.Messages ?? ImmutableArray.Create(); + private ConcurrentDictionary _members; - public new IReadOnlyCollection Users = ImmutableArray.Create(); + private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; - private readonly MessageCache _messages; + private bool _usersDownloaded = false; - private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; + private object _downloadLock = new object(); internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) : base(discord, id, guild) { this.ParentChannel = parent; + this._members = new ConcurrentDictionary(); } - internal static SocketThreadChannel Create(SocketGuild guild, ClientState state, Model model) + internal new static SocketThreadChannel Create(SocketGuild guild, ClientState state, Model model) { var parent = (SocketTextChannel)guild.GetChannel(model.CategoryId.Value); var entity = new SocketThreadChannel(guild.Discord, guild, model.Id, parent); @@ -92,10 +100,9 @@ internal override void Update(ClientState state, Model model) { base.Update(state, model); + this.Type = (ThreadType)model.Type; this.MessageCount = model.MessageCount.GetValueOrDefault(-1); this.MemberCount = model.MemberCount.GetValueOrDefault(-1); - - this.IsPrivateThread = model.Type == ChannelType.PrivateThread; if (model.ThreadMetadata.IsSpecified) { @@ -104,259 +111,233 @@ internal override void Update(ClientState state, Model model) this.AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; this.Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } + + if (model.OwnerId.IsSpecified) + { + this.Owner = GetUser(model.OwnerId.Value); + } + + this.Joined = model.ThreadMember.IsSpecified; } - internal void Update(ClientState state, ThreadMember self) + internal IReadOnlyCollection RemoveUsers(ulong[] users) { + List threadUsers = new(); - } + foreach (var userId in users) + { + if (_members.TryRemove(userId, out var user)) + threadUsers.Add(user); + } - /// - public virtual Task SyncPermissionsAsync(RequestOptions options = null) - => ChannelHelper.SyncPermissionsAsync(this, Discord, options); + return threadUsers.ToImmutableArray(); + } - /// - public Task ModifyAsync(Action func, RequestOptions options = null) - => ChannelHelper.ModifyAsync(this, Discord, func, options); + internal SocketThreadUser AddOrUpdateThreadMember(ThreadMember model, SocketGuildUser guildMember) + { + if (_members.TryGetValue(model.UserId.Value, out SocketThreadUser member)) + member.Update(model); + else + { + member = SocketThreadUser.Create(this.Guild, this, model, guildMember); + member.GlobalUser.AddRef(); + _members[member.Id] = member; + } + return member; + } - //Messages + //Users /// - public SocketMessage GetCachedMessage(ulong id) - => _messages?.Get(id); + public new SocketThreadUser GetUser(ulong id) + { + var user = Users.FirstOrDefault(x => x.Id == id); + return user; + } /// - /// Gets a message from this message channel. + /// Gets all users inside this thread. /// /// - /// This method follows the same behavior as described in . - /// Please visit its documentation for more details on this method. + /// If all users are not downloaded then this method will call and return the result. /// - /// The snowflake identifier of the message. /// The options to be used when sending the request. - /// - /// A task that represents an asynchronous get operation for retrieving the message. The task result contains - /// the retrieved message; null if no message is found with the specified identifier. - /// - public async Task GetMessageAsync(ulong id, RequestOptions options = null) + /// A task representing the download operation. + public async Task> GetUsersAsync(RequestOptions options = null) { - IMessage msg = _messages?.Get(id); - if (msg == null) - msg = await ChannelHelper.GetMessageAsync(this, Discord, id, options).ConfigureAwait(false); - return msg; + // download all users if we havent + if (!_usersDownloaded) + { + await DownloadUsersAsync(options); + this._usersDownloaded = true; + } + + return this.Users; } + /// - /// Gets the last N messages from this message channel. + /// Downloads all users that have access to this thread. /// - /// - /// This method follows the same behavior as described in . - /// Please visit its documentation for more details on this method. - /// - /// The numbers of message to be gotten from. /// The options to be used when sending the request. - /// - /// Paged collection of messages. - /// - public IAsyncEnumerable> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) - => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, null, Direction.Before, limit, CacheMode.AllowDownload, options); + /// A task representing the asyncronous download operation. + public async Task DownloadUsersAsync(RequestOptions options = null) + { + var users = await Discord.ApiClient.ListThreadMembersAsync(this.Id, options); + + lock (_downloadLock) + { + foreach (var threadMember in users) + { + var guildUser = this.Guild.GetUser(threadMember.UserId.Value); + + this.AddOrUpdateThreadMember(threadMember, guildUser); + } + } + } + + internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; + + /// + public Task JoinAsync(RequestOptions options = null) + => Discord.ApiClient.JoinThreadAsync(this.Id, options); + + /// + public Task LeaveAsync(RequestOptions options = null) + => Discord.ApiClient.LeaveThreadAsync(this.Id, options); /// - /// Gets a collection of messages in this channel. + /// Adds a user to this thread. /// - /// - /// This method follows the same behavior as described in . - /// Please visit its documentation for more details on this method. - /// - /// The ID of the starting message to get the messages from. - /// The direction of the messages to be gotten from. - /// The numbers of message to be gotten from. + /// The to add. /// The options to be used when sending the request. /// - /// Paged collection of messages. + /// A task that represents the asynchronous operation of adding a member to a thread. /// - public IAsyncEnumerable> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) - => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessageId, dir, limit, CacheMode.AllowDownload, options); + public Task AddUserAsync(IGuildUser user, RequestOptions options = null) + => Discord.ApiClient.AddThreadMemberAsync(this.Id, user.Id, options); /// - /// Gets a collection of messages in this channel. + /// Removes a user from this thread. /// - /// - /// This method follows the same behavior as described in . - /// Please visit its documentation for more details on this method. - /// - /// The starting message to get the messages from. - /// The direction of the messages to be gotten from. - /// The numbers of message to be gotten from. + /// The to remove from this thread. /// The options to be used when sending the request. /// - /// Paged collection of messages. + /// A task that represents the asynchronous operation of removing a user from this thread. /// - public IAsyncEnumerable> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) - => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessage.Id, dir, limit, CacheMode.AllowDownload, options); - - /// - public IReadOnlyCollection GetCachedMessages(int limit = DiscordConfig.MaxMessagesPerBatch) - => SocketChannelHelper.GetCachedMessages(this, Discord, _messages, null, Direction.Before, limit); - - /// - public IReadOnlyCollection GetCachedMessages(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) - => SocketChannelHelper.GetCachedMessages(this, Discord, _messages, fromMessageId, dir, limit); - - /// - public IReadOnlyCollection GetCachedMessages(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) - => SocketChannelHelper.GetCachedMessages(this, Discord, _messages, fromMessage.Id, dir, limit); - - /// - public Task> GetPinnedMessagesAsync(RequestOptions options = null) - => ChannelHelper.GetPinnedMessagesAsync(this, Discord, options); - - /// - /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + public Task RemoveUserAsync(IGuildUser user, RequestOptions options = null) + => Discord.ApiClient.RemoveThreadMemberAsync(this.Id, user.Id, options); - /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); - - /// - /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); - - /// - public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions options = null) - => ChannelHelper.DeleteMessagesAsync(this, Discord, messages.Select(x => x.Id), options); - /// - public Task DeleteMessagesAsync(IEnumerable messageIds, RequestOptions options = null) - => ChannelHelper.DeleteMessagesAsync(this, Discord, messageIds, options); - /// - public async Task ModifyMessageAsync(ulong messageId, Action func, RequestOptions options = null) - => await ChannelHelper.ModifyMessageAsync(this, messageId, func, Discord, options).ConfigureAwait(false); - - /// - public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) - => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); - - /// - public Task DeleteMessageAsync(IMessage message, RequestOptions options = null) - => ChannelHelper.DeleteMessageAsync(this, message.Id, Discord, options); - - /// - public Task TriggerTypingAsync(RequestOptions options = null) - => ChannelHelper.TriggerTypingAsync(this, Discord, options); - - /// - public IDisposable EnterTypingState(RequestOptions options = null) - => ChannelHelper.EnterTypingState(this, Discord, options); + /// + /// + /// This method is not supported in threads. + /// + public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) + => throw new NotImplementedException(); - internal void AddMessage(SocketMessage msg) - => _messages?.Add(msg); + /// + /// + /// This method is not supported in threads. + /// + public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null) + => throw new NotImplementedException(); - internal SocketMessage RemoveMessage(ulong id) - => _messages?.Remove(id); + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); - //Users - /// - public new SocketThreadUser GetUser(ulong id) - { - var user = Users.FirstOrDefault(x => x.Id == id); - return user; - } + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); - public Task GetUsersAsync() - { - return Task.CompletedTask; - } + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) + => throw new NotImplementedException(); - - internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; + /// + /// + /// This method is not supported in threads. + /// + public override Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) + => throw new NotImplementedException(); - //ITextChannel - /// - Task ITextChannel.CreateWebhookAsync(string name, Stream avatar, RequestOptions options) - => throw new NotSupportedException("Thread channels don't support webhooks"); - /// - Task ITextChannel.GetWebhookAsync(ulong id, RequestOptions options) - => throw new NotSupportedException("Thread channels don't support webhooks"); - /// - Task> ITextChannel.GetWebhooksAsync(RequestOptions options) - => throw new NotSupportedException("Thread channels don't support webhooks"); + /// + /// + /// This method is not supported in threads. + /// + public override Task> GetInvitesAsync(RequestOptions options = null) + => throw new NotImplementedException(); - //IGuildChannel - /// - Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) - => Task.FromResult(GetUser(id)); - /// - IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options) - => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + /// + /// + /// This method is not supported in threads. + /// + public override OverwritePermissions? GetPermissionOverwrite(IRole role) + => throw new NotImplementedException(); - //IMessageChannel - /// - async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) - { - if (mode == CacheMode.AllowDownload) - return await GetMessageAsync(id, options).ConfigureAwait(false); - else - return GetCachedMessage(id); - } - /// - IAsyncEnumerable> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, RequestOptions options) - => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, null, Direction.Before, limit, mode, options); - /// - IAsyncEnumerable> IMessageChannel.GetMessagesAsync(ulong fromMessageId, Direction dir, int limit, CacheMode mode, RequestOptions options) - => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessageId, dir, limit, mode, options); - /// - IAsyncEnumerable> IMessageChannel.GetMessagesAsync(IMessage fromMessage, Direction dir, int limit, CacheMode mode, RequestOptions options) - => SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessage.Id, dir, limit, mode, options); - /// - async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) - => await GetPinnedMessagesAsync(options).ConfigureAwait(false); + /// + /// + /// This method is not supported in threads. + /// + public override OverwritePermissions? GetPermissionOverwrite(IUser user) + => throw new NotImplementedException(); - /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); - /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); - /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + /// + /// + /// This method is not supported in threads. + /// + public override Task GetWebhookAsync(ulong id, RequestOptions options = null) + => throw new NotImplementedException(); - // INestedChannel - /// - Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) - => Task.FromResult(this.ParentChannel.Category); - Task INestedChannel.CreateInviteAsync(int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options) - => throw new NotSupportedException("Thread channels don't support invites"); - Task INestedChannel.CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options) - => throw new NotSupportedException("Thread channels don't support invites"); - Task INestedChannel.CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options) - => throw new NotSupportedException("Thread channels don't support invites"); - Task> INestedChannel.GetInvitesAsync(RequestOptions options) - => throw new NotSupportedException("Thread channels don't support invites"); - - public Task JoinAsync() - { - return Task.CompletedTask; - } + /// + /// + /// This method is not supported in threads. + /// + public override Task> GetWebhooksAsync(RequestOptions options = null) + => throw new NotImplementedException(); - public Task LeaveAsync() - { - return Task.CompletedTask; - } + /// + /// + /// This method is not supported in threads. + /// + public override Task ModifyAsync(Action func, RequestOptions options = null) + => throw new NotImplementedException(); - public Task AddThreadMember(IGuildUser user) - { - return Task.CompletedTask; - } + /// + /// + /// This method is not supported in threads. + /// + public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) + => throw new NotImplementedException(); - public Task RemoveThreadMember(IGuildUser user) - { - return Task.CompletedTask; - } + /// + /// + /// This method is not supported in threads. + /// + public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null) + => throw new NotImplementedException(); + /// + /// + /// This method is not supported in threads. + /// + public override IReadOnlyCollection PermissionOverwrites + => throw new NotImplementedException(); + /// + /// + /// This method is not supported in threads. + /// + public override Task SyncPermissionsAsync(RequestOptions options = null) + => throw new NotImplementedException(); } } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 547dc6d7f0..58e2c152f5 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -387,7 +387,15 @@ internal void Update(ClientState state, ExtendedModel model) state.AddChannel(channel); channels.TryAdd(channel.Id); } + + for(int i = 0; i < model.Threads.Length; i++) + { + var threadChannel = SocketThreadChannel.Create(this, state, model.Threads[i]); + state.AddChannel(threadChannel); + channels.TryAdd(threadChannel.Id); + } } + _channels = channels; var members = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.Members.Length * 1.05)); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index 66a5579c47..df9194d5b9 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -10,7 +10,10 @@ namespace Discord.WebSocket { - public class SocketThreadUser : IGuildUser + /// + /// Represents a thread user received over the gateway. + /// + public class SocketThreadUser : SocketUser, IGuildUser { /// /// Gets the this user is in. @@ -44,56 +47,36 @@ public bool? IsPending => GuildUser.IsPending; /// - public string AvatarId - => GuildUser.AvatarId; - - /// - public string Discriminator - => GuildUser.Discriminator; + public override string AvatarId + { + get => GuildUser.AvatarId; + internal set => GuildUser.AvatarId = value; + } /// - public ushort DiscriminatorValue - => GuildUser.DiscriminatorValue; + public override ushort DiscriminatorValue + { + get => GuildUser.DiscriminatorValue; + internal set => GuildUser.DiscriminatorValue = value; + } /// - public bool IsBot - => GuildUser.IsBot; + public override bool IsBot + { + get => GuildUser.IsBot; + internal set => GuildUser.IsBot = value; + } /// - public bool IsWebhook + public override bool IsWebhook => GuildUser.IsWebhook; /// - public string Username - => GuildUser.Username; - - /// - public UserProperties? PublicFlags - => GuildUser.PublicFlags; - - /// - public DateTimeOffset CreatedAt - => GuildUser.CreatedAt; - - /// - public ulong Id - => GuildUser.Id; - - /// - public string Mention - => GuildUser.Mention; - - /// - public UserStatus Status - => GuildUser.Status; - - /// - public IImmutableSet ActiveClients - => GuildUser.ActiveClients; - - /// - public IImmutableList Activities - => GuildUser.Activities; + public override string Username + { + get => GuildUser.Username; + internal set => GuildUser.Username = value; + } /// public bool IsDeafened @@ -130,13 +113,14 @@ public bool IsStreaming private SocketGuildUser GuildUser { get; set; } internal SocketThreadUser(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser member) + : base(guild.Discord, member.Id) { this.Thread = thread; this.Guild = guild; this.GuildUser = member; } - internal SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, Model model, SocketGuildUser member) + internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, Model model, SocketGuildUser member) { var entity = new SocketThreadUser(guild, thread, member); entity.Update(model); @@ -146,6 +130,16 @@ internal SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, internal void Update(Model model) { this.ThreadJoinedAt = model.JoinTimestamp; + + if (model.Presence.IsSpecified) + { + this.GuildUser.Update(Discord.State, model.Presence.Value, true); + } + + if (model.Member.IsSpecified) + { + this.GuildUser.Update(Discord.State, model.Member.Value); + } } @@ -182,15 +176,6 @@ internal void Update(Model model) /// public Task RemoveRolesAsync(IEnumerable roles, RequestOptions options = null) => GuildUser.RemoveRolesAsync(roles, options); - /// - public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) => GuildUser.GetAvatarUrl(format, size); - - /// - public string GetDefaultAvatarUrl() => GuildUser.GetDefaultAvatarUrl(); - - /// - public Task CreateDMChannelAsync(RequestOptions options = null) => GuildUser.CreateDMChannelAsync(options); - /// GuildPermissions IGuildUser.GuildPermissions => this.GuildUser.GuildPermissions; @@ -203,6 +188,10 @@ internal void Update(Model model) /// IReadOnlyCollection IGuildUser.RoleIds => this.GuildUser.Roles.Select(x => x.Id).ToImmutableArray(); + internal override SocketGlobalUser GlobalUser => GuildUser.GlobalUser; + + internal override SocketPresence Presence { get => GuildUser.Presence; set => GuildUser.Presence = value; } + /// /// Gets the guild user of this thread user. /// diff --git a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs index cd29b2606b..137dc55752 100644 --- a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs @@ -161,7 +161,7 @@ void AssertUtil(GuildPermission permission, AssertUtil(GuildPermission.ManageNicknames, x => x.ManageNicknames, (p, enable) => p.Modify(manageNicknames: enable)); AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); - AssertUtil(GuildPermission.ManageEmojis, x => x.ManageEmojis, (p, enable) => p.Modify(manageEmojis: enable)); + AssertUtil(GuildPermission.ManageEmojis, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojis: enable)); } } } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs index 0bde9d1e08..18ff3b3ed9 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs @@ -210,5 +210,7 @@ IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mo { throw new NotImplementedException(); } + + public Task CreateThreadAsync(string name, ThreadType type = ThreadType.PublicThread, ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) => throw new NotImplementedException(); } } From 501276ce72417f7a7f66cc727fafaa3d0f353b8b Mon Sep 17 00:00:00 2001 From: Hussein Alzein Date: Sat, 31 Jul 2021 13:45:05 -0400 Subject: [PATCH 128/494] Fixed url validation to be neater and not utilize IsWellFormatted (#66) * Error handling on URL additions in embeds and components. * Wording on exception comment * Wording on exceptions * changed IsWellFormatted to validating urls start with protocol. May not keep all url validation, may just keep image-based url validation as those definitely only require http/s. * Helper utility made for url validation * xml Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com> --- src/Discord.Net.Core/Discord.Net.Core.xml | 8 +++++ .../Message Components/ComponentBuilder.cs | 12 ++++---- .../Entities/Messages/EmbedBuilder.cs | 29 +++++++++++-------- src/Discord.Net.Core/Utils/UrlValidation.cs | 22 ++++++++++++++ 4 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 src/Discord.Net.Core/Utils/UrlValidation.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 5213edd3cd..b351ad49dd 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -11643,5 +11643,13 @@ Thrown when the supplied token string is null, empty, or contains only whitespace. Thrown when the supplied or token value is invalid. + + + Not full URL validation right now. Just ensures protocol is present and that it's either http or https + + url to validate before sending to Discord + A URL must include a protocol (http or https). + true if url is valid by our standard, false if null, throws an error upon invalid + diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index ff2c99a6c1..bb2f80a813 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Discord.Utils; namespace Discord { @@ -535,12 +536,11 @@ public ButtonComponent Build() if (this.Style == ButtonStyle.Link) { - if (string.IsNullOrEmpty(this.Url)) - throw new InvalidOperationException("Link buttons must have a link associated with them"); - else if (!Uri.IsWellFormedUriString(this.Url, UriKind.Absolute)) - throw new InvalidOperationException("Urls must be well formatted and include their protocol (either HTTP or HTTPS)"); - } - + if (string.IsNullOrEmpty(this.Url)) + throw new InvalidOperationException("Link buttons must have a link associated with them"); + else + UrlValidation.Validate(this.Url); + } else if (string.IsNullOrEmpty(this.CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index b7dd6ed02a..2ab2699a60 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; +using Discord.Utils; namespace Discord { @@ -401,25 +402,29 @@ public EmbedBuilder AddField(Action action) /// The built embed object. /// /// Total embed length exceeds . - /// Any Url must be well formatted include its protocols (i.e http:// or https://). + /// Any Url must include its protocols (i.e http:// or https://). public Embed Build() { if (Length > MaxEmbedLength) throw new InvalidOperationException($"Total embed length must be less than or equal to {MaxEmbedLength}."); - if (!string.IsNullOrEmpty(Url) && !Uri.IsWellFormedUriString(Url, UriKind.Absolute)) - throw new InvalidOperationException("Url must be well formatted and include its protocol (either HTTP or HTTPS)"); - if (!string.IsNullOrEmpty(ThumbnailUrl) && !Uri.IsWellFormedUriString(ThumbnailUrl, UriKind.Absolute)) - throw new InvalidOperationException("Thumbnail Url must be well formatted and include its protocol (either HTTP or HTTPS)"); - if (!string.IsNullOrEmpty(ImageUrl) && !Uri.IsWellFormedUriString(ImageUrl, UriKind.Absolute)) - throw new InvalidOperationException("Image Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(Url)) + UrlValidation.Validate(Url); + if (!string.IsNullOrEmpty(ThumbnailUrl)) + UrlValidation.Validate(ThumbnailUrl); + if (!string.IsNullOrEmpty(ImageUrl)) + UrlValidation.Validate(ImageUrl); if (Author != null) { - if(!string.IsNullOrEmpty(Author.Url) && !Uri.IsWellFormedUriString(Author.Url, UriKind.Absolute)) - throw new InvalidOperationException("Author Url must be well formatted and include its protocol (either HTTP or HTTPS)"); - if (!string.IsNullOrEmpty(Author.IconUrl) && !Uri.IsWellFormedUriString(Author.IconUrl, UriKind.Absolute)) - throw new InvalidOperationException("Author Icon Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(Author.Url)) + UrlValidation.Validate(Author.Url); + if (!string.IsNullOrEmpty(Author.IconUrl)) + UrlValidation.Validate(Author.IconUrl); + } + if(Footer != null) + { + if (!string.IsNullOrEmpty(Footer.IconUrl)) + UrlValidation.Validate(Footer.IconUrl); } - var fields = ImmutableArray.CreateBuilder(Fields.Count); for (int i = 0; i < Fields.Count; i++) fields.Add(Fields[i].Build()); diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs new file mode 100644 index 0000000000..7cc9bd8bd4 --- /dev/null +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -0,0 +1,22 @@ +using System; + +namespace Discord.Utils +{ + static class UrlValidation + { + /// + /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https + /// + /// url to validate before sending to Discord + /// A URL must include a protocol (http or https). + /// true if url is valid by our standard, false if null, throws an error upon invalid + public static bool Validate(string url) + { + if (string.IsNullOrEmpty(url)) + return false; + if(!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)))) + throw new InvalidOperationException($"Url {url} must be include its protocol (either HTTP or HTTPS)"); + return true; + } + } +} From 20707334247b7d747a346fc5a7c851651f094516 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 31 Jul 2021 14:53:16 -0300 Subject: [PATCH 129/494] Add missing audit log action types --- .../Entities/AuditLogs/ActionType.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs index 1728b2021c..b016a4c50b 100644 --- a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs +++ b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs @@ -142,5 +142,43 @@ public enum ActionType /// A message was unpinned from this guild. /// MessageUnpinned = 75, + + /// + /// A integration was created + /// + IntegrationCreated = 80, + /// + /// A integration was updated + /// + IntegrationUpdated = 81, + /// + /// An integration was deleted + /// + IntegrationDeleted = 82, + /// + /// A stage instance was created. + /// + StageInstanceCreated = 83, + /// + /// A stage instance was updated. + /// + StageInstanceUpdated = 84, + /// + /// A stage instance was deleted. + /// + StageInstanceDeleted = 85, + + /// + /// A sticker was created. + /// + StickerCreated = 90, + /// + /// A sticker was updated. + /// + StickerUpdated = 91, + /// + /// A sticker was deleted. + /// + StickerDeleted = 92, } } From 51b2fbeaa04041df09d168ab1d877fd8d6b441f8 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 31 Jul 2021 16:14:41 -0300 Subject: [PATCH 130/494] Threads pre release testing --- src/Discord.Net.Core/Discord.Net.Core.xml | 47 ++++++++++++++++++- src/Discord.Net.Rest/DiscordRestApiClient.cs | 4 +- .../Discord.Net.WebSocket.xml | 38 +++++++++++++++ .../DiscordSocketClient.cs | 18 +++++-- .../Entities/Channels/SocketTextChannel.cs | 9 +++- .../Entities/Channels/SocketThreadChannel.cs | 5 +- .../Entities/Guilds/SocketGuild.cs | 32 +++++++++---- 7 files changed, 134 insertions(+), 19 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index b351ad49dd..1ab7ab78d0 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1003,6 +1003,51 @@ A message was unpinned from this guild. + + + A integration was created + + + + + A integration was updated + + + + + An integration was deleted + + + + + A stage instance was created. + + + + + A stage instance was updated. + + + + + A stage instance was deleted. + + + + + A sticker was created. + + + + + A sticker was updated. + + + + + A sticker was deleted. + + Represents data applied to an . @@ -6105,7 +6150,7 @@ The built embed object. Total embed length exceeds . - Any Url must be well formatted include its protocols (i.e http:// or https://). + Any Url must include its protocols (i.e http:// or https://). diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 51e98c1a3f..d34a6a4b9b 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -463,7 +463,9 @@ public async Task AddThreadMemberAsync(ulong channelId, ulong userId, RequestOpt options = RequestOptions.CreateOrClone(options); - await SendAsync("PUT", $"channels/{channelId}/thread-members/{userId}", options: options).ConfigureAwait(false); + var bucket = new BucketIds(channelId: channelId); + + await SendAsync("PUT", () => $"channels/{channelId}/thread-members/{userId}", bucket, options: options).ConfigureAwait(false); } public async Task LeaveThreadAsync(ulong channelId, RequestOptions options = null) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 8c6f031faf..b17f73024d 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2187,6 +2187,38 @@ + + + Creates a thread within this . + + + When is the thread type will be based off of the + channel its created in. When called on a , it creates a . + When called on a , it creates a . The id of the created + thread will be the same as the id of the message, and as such a message can only have a + single thread created from it. + + The name of the thread. + + The type of the thread. + + Note: This parameter is not used if the parameter is not specified. + + + + The duration on which this thread archives after. + + Note: Options and + are only available for guilds that are boosted. You can check in the to see if the + guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. + + + The message which to start the thread from. + The options to be used when sending the request. + + A task that represents the asynchronous create operation. The task result contains a + + @@ -2352,6 +2384,9 @@ + + + @@ -2390,6 +2425,9 @@ Represents a thread channel inside of a guild. + + + Gets the owner of the current thread. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 0c55eeab64..12802247d8 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1992,12 +1992,15 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty if ((threadChannel = guild.ThreadChannels.FirstOrDefault(x => x.Id == data.Id)) != null) { threadChannel.Update(this.State, data); - threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); + + if(data.ThreadMember.IsSpecified) + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); } else { threadChannel = (SocketThreadChannel)guild.AddChannel(this.State, data); - threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); + if (data.ThreadMember.IsSpecified) + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); } } @@ -2092,12 +2095,19 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var data = (payload as JToken).ToObject(_serializer); - //var guild = State.GetGuild(data.) + var thread = (SocketThreadChannel)State.GetChannel(data.Id.Value); + + if (thread == null) + { + await UnknownChannelAsync(type, data.Id.Value); + return; + } + thread.AddOrUpdateThreadMember(data, thread.Guild.CurrentUser); } break; - case "THREAD_MEMBERS_UPDATE": // based on intents + case "THREAD_MEMBERS_UPDATE": { await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_MEMBERS_UPDATE)").ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index ca9164a46c..a0d14fdabd 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -72,7 +72,7 @@ internal override void Update(ClientState state, Model model) { base.Update(state, model); CategoryId = model.CategoryId; - Topic = model.Topic.Value; + Topic = model.Topic.GetValueOrDefault(); SlowModeInterval = model.SlowMode.GetValueOrDefault(); // some guilds haven't been patched to include this yet? _nsfw = model.Nsfw.GetValueOrDefault(); } @@ -115,7 +115,12 @@ public async Task CreateThreadAsync(string name, ThreadType ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) { var model = await ThreadHelper.CreateThreadAsync(Discord, this, name, type, autoArchiveDuration, message, options); - return SocketThreadChannel.Create(this.Guild, Discord.State, model); + + var thread = (SocketThreadChannel)Guild.AddOrUpdateChannel(Discord.State, model); + + await thread.DownloadUsersAsync(); + + return thread; } //Messages diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 141d7535cd..8065a8b2b7 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -146,7 +146,6 @@ internal SocketThreadUser AddOrUpdateThreadMember(ThreadMember model, SocketGuil return member; } - //Users /// public new SocketThreadUser GetUser(ulong id) { @@ -310,7 +309,7 @@ public override Task> GetWebhooksAsync(RequestO /// This method is not supported in threads. /// public override Task ModifyAsync(Action func, RequestOptions options = null) - => throw new NotImplementedException(); + => ThreadHelper.ModifyAsync(this, Discord, func, options); /// /// @@ -339,5 +338,7 @@ public override IReadOnlyCollection PermissionOverwrites /// public override Task SyncPermissionsAsync(RequestOptions options = null) => throw new NotImplementedException(); + + string IChannel.Name => this.Name; } } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 58e2c152f5..f720db018d 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -32,7 +32,7 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable private readonly SemaphoreSlim _audioLock; private TaskCompletionSource _syncPromise, _downloaderPromise; private TaskCompletionSource _audioConnectPromise; - private ConcurrentHashSet _channels; + private ConcurrentDictionary _channels; private ConcurrentDictionary _members; private ConcurrentDictionary _roles; private ConcurrentDictionary _voiceStates; @@ -307,7 +307,7 @@ public IReadOnlyCollection Channels { var channels = _channels; var state = Discord.State; - return channels.Select(x => state.GetChannel(x) as SocketGuildChannel).Where(x => x != null).ToReadOnlyCollection(channels); + return channels.Select(x => x.Value).Where(x => x != null).ToReadOnlyCollection(channels); } } /// @@ -363,7 +363,7 @@ internal void Update(ClientState state, ExtendedModel model) if (!IsAvailable) { if (_channels == null) - _channels = new ConcurrentHashSet(); + _channels = new ConcurrentDictionary(); if (_members == null) _members = new ConcurrentDictionary(); if (_roles == null) @@ -379,20 +379,20 @@ internal void Update(ClientState state, ExtendedModel model) Update(state, model as Model); - var channels = new ConcurrentHashSet(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.Channels.Length * 1.05)); + var channels = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.Channels.Length * 1.05)); { for (int i = 0; i < model.Channels.Length; i++) { var channel = SocketGuildChannel.Create(this, state, model.Channels[i]); state.AddChannel(channel); - channels.TryAdd(channel.Id); + channels.TryAdd(channel.Id, channel); } for(int i = 0; i < model.Threads.Length; i++) { var threadChannel = SocketThreadChannel.Create(this, state, model.Threads[i]); state.AddChannel(threadChannel); - channels.TryAdd(threadChannel.Id); + channels.TryAdd(threadChannel.Id, threadChannel); } } @@ -703,20 +703,34 @@ public Task CreateCategoryChannelAsync(string name, Action< internal SocketGuildChannel AddChannel(ClientState state, ChannelModel model) { var channel = SocketGuildChannel.Create(this, state, model); - _channels.TryAdd(model.Id); + _channels.TryAdd(model.Id, channel); state.AddChannel(channel); return channel; } + + internal SocketGuildChannel AddOrUpdateChannel(ClientState state, ChannelModel model) + { + if (_channels.TryGetValue(model.Id, out SocketGuildChannel channel)) + channel.Update(Discord.State, model); + else + { + channel = SocketGuildChannel.Create(this, Discord.State, model); + _channels[channel.Id] = channel; + state.AddChannel(channel); + } + return channel; + } + internal SocketGuildChannel RemoveChannel(ClientState state, ulong id) { - if (_channels.TryRemove(id)) + if (_channels.TryRemove(id, out var _)) return state.RemoveChannel(id) as SocketGuildChannel; return null; } internal void PurgeChannelCache(ClientState state) { foreach (var channelId in _channels) - state.RemoveChannel(channelId); + state.RemoveChannel(channelId.Key); _channels.Clear(); } From 91496b8e69b40429876e12451ca00e2fc250d977 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Sat, 31 Jul 2021 15:25:42 -0400 Subject: [PATCH 131/494] Add missing message types (Needs descriptions) (#70) * Add missing channel types (Needs descriptions) * Update MessageType.cs Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com> --- .../Entities/Messages/MessageType.cs | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Messages/MessageType.cs b/src/Discord.Net.Core/Entities/Messages/MessageType.cs index c384e29ea0..de30d80474 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageType.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageType.cs @@ -58,8 +58,31 @@ public enum MessageType /// ChannelFollowAdd = 12, /// + /// The message for when a guild is disqualified from discovery. + /// + GuildDiscoveryDisqualified = 14, + /// + /// The message for when a guild is requalified for discovery. + /// + GuildDiscoveryRequalified = 15, + /// + /// The message for when the initial warning is sent for the initial grace period discovery. + /// + GuildDiscoveryGracePeriodInitialWarning = 16, + /// + /// The message for when the final warning is sent for the initial grace period discovery. + /// + GuildDiscoveryGracePeriodFinalWarning = 17, + /// + /// The message for when a thread is created. + /// + ThreadCreated = 18, + /// /// The message is an inline reply. /// + /// + /// Only available in API v8 + /// Reply = 19, /// /// The message is an Application Command @@ -67,6 +90,17 @@ public enum MessageType /// /// Only available in API v8 /// - ApplicationCommand = 20 + ApplicationCommand = 20, + /// + /// The message that starts a thread. + /// + /// + /// Only available in API v9 + /// + ThreadStarterMessage = 21, + /// + /// The message for a invite reminder + /// + GuildInviteReminder = 22 } } From a1a498d4345c8b44927b27b026334d4dd518eb29 Mon Sep 17 00:00:00 2001 From: Hussein Alzein Date: Sat, 31 Jul 2021 15:40:43 -0400 Subject: [PATCH 132/494] Restoring the option to send a single embed in interaction responses. (#72) * Error handling on URL additions in embeds and components. * Wording on exception comment * Wording on exceptions * changed IsWellFormatted to validating urls start with protocol. May not keep all url validation, may just keep image-based url validation as those definitely only require http/s. * Helper utility made for url validation * Add embed for single embed to Respond/FollowupAsync * xml * Removed trailing spaces. Clarified params in SocketInteractions. Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com> --- .../Message Components/SocketMessageComponent.cs | 11 ++++++++--- .../Slash Commands/SocketSlashCommand.cs | 14 ++++++++++---- .../Entities/Interaction/SocketInteraction.cs | 10 ++++++---- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 338ef52a03..921f81de4a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -75,10 +75,13 @@ public override async Task RespondAsync( bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, - MessageComponent component = null) + MessageComponent component = null, + Embed embed = null) { if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (embeds == null && embed != null) + embeds = new[] { embed }; if (Discord.AlwaysAcknowledgeInteractions) { @@ -106,7 +109,6 @@ public override async Task RespondAsync( } } - var response = new API.InteractionResponse { Type = InteractionResponseType.ChannelMessageWithSource, @@ -193,11 +195,14 @@ public override async Task FollowupAsync( bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, - MessageComponent component = null) + MessageComponent component = null, + Embed embed = null) { if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (embeds == null && embed != null) + embeds = new[] { embed }; Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 81518cd957..2452746139 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -57,11 +57,15 @@ public override async Task RespondAsync( bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, - MessageComponent component = null) + MessageComponent component = null, + Embed embed = null) { if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (embeds == null && embed != null) + embeds = new[] { embed }; + if (Discord.AlwaysAcknowledgeInteractions) { await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); @@ -87,8 +91,7 @@ public override async Task RespondAsync( throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); } } - - + var response = new API.InteractionResponse { Type = InteractionResponseType.ChannelMessageWithSource, @@ -116,11 +119,14 @@ public override async Task FollowupAsync( bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, - MessageComponent component = null) + MessageComponent component = null, + Embed embed = null) { if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (embeds == null && embed != null) + embeds = new[] { embed }; Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index e49205d7cf..4b2e3baecf 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -96,7 +96,7 @@ internal virtual void Update(Model model) /// Responds to an Interaction with type . /// /// If you have set to , You should use - /// instead. + /// instead. /// /// /// The text of the message to be sent. @@ -106,10 +106,11 @@ internal virtual void Update(Model model) /// The allowed mentions for this response. /// The request options for this response. /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. public abstract Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, - bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// /// Sends a followup message for this interaction. @@ -121,11 +122,12 @@ public abstract Task RespondAsync(string text = null, Embed[] embeds = null, boo /// The allowed mentions for this response. /// The request options for this response. /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. /// /// The sent message. /// - public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, - AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null); + public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// /// Gets the original response for this interaction. From 8eda677825e65407c194cd79ce91121cb0351675 Mon Sep 17 00:00:00 2001 From: Nikon <47792796+INikonI@users.noreply.github.com> Date: Wed, 4 Aug 2021 04:08:25 +0500 Subject: [PATCH 133/494] Add `NsfwLevel` property to Guild (#80) * Add `NsfwLevel` property to Guild --- src/Discord.Net.Core/Discord.Net.Core.xml | 69 +++++++++++++++++++ .../Entities/Guilds/IGuild.cs | 8 +++ .../Entities/Guilds/NsfwLevel.cs | 22 ++++++ src/Discord.Net.Rest/API/Common/Guild.cs | 2 + src/Discord.Net.Rest/Discord.Net.Rest.xml | 3 + .../Entities/Guilds/RestGuild.cs | 3 + .../Discord.Net.WebSocket.xml | 19 +++-- .../Entities/Guilds/SocketGuild.cs | 3 + 8 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Guilds/NsfwLevel.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 1ab7ab78d0..8e54d8ab6b 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3114,6 +3114,14 @@ language tag format. + + + Gets the NSFW level of this guild. + + + The NSFW level of this guild. + + Gets the preferred culture of this guild. @@ -3891,6 +3899,26 @@ Users must have MFA enabled on their account to perform administrative actions. + + + Default or unset. + + + + + Guild has extremely suggestive or mature content that would only be suitable for users 18 or over. + + + + + Guild has no content that could be deemed NSFW; in other words, SFW. + + + + + Guild has mildly NSFW content that may not be suitable for users under 18. + + Specifies the target of the permission. @@ -7554,10 +7582,38 @@ The message for when a news channel subscription is added to a text channel. + + + The message for when a guild is disqualified from discovery. + + + + + The message for when a guild is requalified for discovery. + + + + + The message for when the initial warning is sent for the initial grace period discovery. + + + + + The message for when the final warning is sent for the initial grace period discovery. + + + + + The message for when a thread is created. + + The message is an inline reply. + + Only available in API v8 + @@ -7567,6 +7623,19 @@ Only available in API v8 + + + The message that starts a thread. + + + Only available in API v9 + + + + + The message for a invite reminder + + A metadata containing reaction information. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index b8fd858dfc..e3b0533eb4 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -316,6 +316,14 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// string PreferredLocale { get; } + /// + /// Gets the NSFW level of this guild. + /// + /// + /// The NSFW level of this guild. + /// + NsfwLevel NsfwLevel { get; } + /// /// Gets the preferred culture of this guild. /// diff --git a/src/Discord.Net.Core/Entities/Guilds/NsfwLevel.cs b/src/Discord.Net.Core/Entities/Guilds/NsfwLevel.cs new file mode 100644 index 0000000000..e3ac345d94 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Guilds/NsfwLevel.cs @@ -0,0 +1,22 @@ +namespace Discord +{ + public enum NsfwLevel + { + /// + /// Default or unset. + /// + Default = 0, + /// + /// Guild has extremely suggestive or mature content that would only be suitable for users 18 or over. + /// + Explicit = 1, + /// + /// Guild has no content that could be deemed NSFW; in other words, SFW. + /// + Safe = 2, + /// + /// Guild has mildly NSFW content that may not be suitable for users under 18. + /// + AgeRestricted = 3 + } +} \ No newline at end of file diff --git a/src/Discord.Net.Rest/API/Common/Guild.cs b/src/Discord.Net.Rest/API/Common/Guild.cs index ba09f9b8a1..a22df9a30c 100644 --- a/src/Discord.Net.Rest/API/Common/Guild.cs +++ b/src/Discord.Net.Rest/API/Common/Guild.cs @@ -78,5 +78,7 @@ internal class Guild public Optional ApproximatePresenceCount { get; set; } [JsonProperty("threads")] public Optional Threads { get; set; } + [JsonProperty("nsfw_level")] + public NsfwLevel NsfwLevel { get; set; } } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index eda180f01d..a30a6e2b49 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2896,6 +2896,9 @@ + + + diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 37491909cc..a130dcef95 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -83,6 +83,8 @@ public class RestGuild : RestEntity, IGuild, IUpdateable public int? ApproximateMemberCount { get; private set; } /// public int? ApproximatePresenceCount { get; private set; } + /// + public NsfwLevel NsfwLevel { get; private set; } /// public CultureInfo PreferredCulture { get; private set; } @@ -151,6 +153,7 @@ internal void Update(Model model) SystemChannelFlags = model.SystemChannelFlags; Description = model.Description; PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); + NsfwLevel = model.NsfwLevel; if (model.MaxPresences.IsSpecified) MaxPresences = model.MaxPresences.Value ?? 25000; if (model.MaxMembers.IsSpecified) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index b17f73024d..90cc3dbd2b 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2787,6 +2787,9 @@ + + + @@ -3492,7 +3495,7 @@ The message that contained the trigger for this interaction. - + @@ -3503,7 +3506,7 @@ The request options for this async request. A task that represents the asynchronous operation of updating the message. - + @@ -3619,10 +3622,10 @@ The data associated with this interaction. - + - + @@ -3708,12 +3711,12 @@ if the token is valid for replying to, otherwise . - + Responds to an Interaction with type . If you have set to , You should use - instead. + instead. The text of the message to be sent. @@ -3723,10 +3726,11 @@ The allowed mentions for this response. The request options for this response. A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. Message content is too long, length must be less or equal to . The parameters provided were invalid or the token was invalid. - + Sends a followup message for this interaction. @@ -3737,6 +3741,7 @@ The allowed mentions for this response. The request options for this response. A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. The sent message. diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index f720db018d..2fef6ff094 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -118,6 +118,8 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable public int? MaxMembers { get; private set; } /// public int? MaxVideoChannelUsers { get; private set; } + /// + public NsfwLevel NsfwLevel { get; private set; } /// public CultureInfo PreferredCulture { get; private set; } @@ -464,6 +466,7 @@ internal void Update(ClientState state, Model model) SystemChannelFlags = model.SystemChannelFlags; Description = model.Description; PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); + NsfwLevel = model.NsfwLevel; if (model.MaxPresences.IsSpecified) MaxPresences = model.MaxPresences.Value ?? 25000; if (model.MaxMembers.IsSpecified) From a6154fdef7a2984ea8b09b579d46e6ffe50dd02a Mon Sep 17 00:00:00 2001 From: Nikon <47792796+INikonI@users.noreply.github.com> Date: Wed, 4 Aug 2021 04:10:50 +0500 Subject: [PATCH 134/494] Docs update (#79) * Update README.md * Update 03-responding-to-slash-commands.md * Update emoji.md --- README.md | 87 ++++++++++--------- docs/guides/emoji/emoji.md | 8 +- .../03-responding-to-slash-commands.md | 2 +- 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 41c902b0d5..560894c716 100644 --- a/README.md +++ b/README.md @@ -32,52 +32,65 @@ webmilio's spin on the SlashCommandService branch, again the state of this is un client.InteractionCreated += Client_InteractionCreated; ... -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task Client_InteractionCreated(SocketInteraction interaction) { - switch (arg.Type) // We want to check the type of this interaction + // Checking the type of this interaction + switch (interaction) { - //Slash commands - case InteractionType.ApplicationCommand: - await MySlashCommandHandler(arg); + // Slash commands + case SocketSlashCommand commandInteraction: + await MySlashCommandHandler(commandInteraction); break; - //Button clicks/selection dropdowns - case InteractionType.MessageComponent: - await MyMessageComponentHandler(arg); + + // Button clicks/selection dropdowns + case SocketMessageComponent componentInteraction: + await MyMessageComponentHandler(componentInteraction); break; - //Unused - case InteractionType.Ping: - break; - //Unknown/Unsupported + + // Unused or Unknown/Unsupported default: - Console.WriteLine("Unsupported interaction type: " + arg.Type); break; } } ``` -### Handling button clicks and selection dropdowns +### Simple handling slash commands ```cs -private async Task MyMessageComponentHandler(SocketInteraction arg) +private async Task MySlashCommandHandler(SocketSlashCommand interaction) +{ + // Checking command name + if (interaction.Data.Name == "ping") + { + // Respond to interaction with message. + // You can also use "ephemeral" so that only the original user of the interaction sees the message + await interaction.RespondAsync($"Pong!", ephemeral: true); + + // Also you can followup with a additional messages, which also can be "ephemeral" + await interaction.FollowupAsync($"PongPong!", ephemeral: true); + } +} +``` + +### Simple handling button clicks and selection dropdowns +```cs +private async Task MyMessageComponentHandler(SocketMessageComponent interaction) { - // Parse the arg - var parsedArg = (SocketMessageComponent) arg; // Get the custom ID - var customId = parsedArg.Data.CustomId; + var customId = interaction.Data.CustomId; // Get the user - var user = (SocketGuildUser) arg.User; + var user = (SocketGuildUser) interaction.User; // Get the guild var guild = user.Guild; - // Respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. - // You can also use "ephemeral" so that only the original user of the interaction sees the message - await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage, ephemeral: true); + // Respond with the update message. This edits the message which this component resides. + await interaction.UpdateAsync(msgProps => msgProps.Content = $"Clicked {interaction.Data.CustomId}!"); - // You can also followup with a second message - await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); + // Also you can followup with a additional messages + await interaction.FollowupAsync($"Clicked {interaction.Data.CustomId}!", ephemeral: true); - //If you are using selection dropdowns, you can get the selected label and values using these: - var selectedLabel = ((SelectMenu) parsedArg.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == parsedArg.Data.Values.FirstOrDefault())?.Label; - var selectedValue = parsedArg.Data.Values.First(); + // If you are using selection dropdowns, you can get the selected label and values using these + var selectedLabel = ((SelectMenu) interaction.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == interaction.Data.Values.FirstOrDefault())?.Label; + var selectedValue = interaction.Data.Values.First(); } ``` @@ -97,18 +110,14 @@ var builder = new ComponentBuilder() .WithSelectMenu(new SelectMenuBuilder() .WithCustomId("id_2") .WithPlaceholder("This is a placeholder") - .WithOptions(new List() - { - new SelectMenuOptionBuilder() - .WithLabel("Option A") - .WithEmote(Emote.Parse("<:evanpog:810017136814194698>")) - .WithDescription("Evan pog champ") - .WithValue("value1"), - new SelectMenuOptionBuilder() - .WithLabel("Option B") - .WithDescription("Option B is poggers") - .WithValue("value2") - })); + .AddOption( + label: "Option", + value: "value1", + description: "Evan pog champ", + emote: Emote.Parse("<:evanpog:810017136814194698>") + ) + .AddOption("Option B", "value2", "Option B is poggers"); + await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); ``` diff --git a/docs/guides/emoji/emoji.md b/docs/guides/emoji/emoji.md index 60a84409cd..dbf654bbfd 100644 --- a/docs/guides/emoji/emoji.md +++ b/docs/guides/emoji/emoji.md @@ -46,14 +46,16 @@ form; this can be obtained in several different ways. ### Emoji Declaration After obtaining the Unicode representation of the emoji, you may -create the @Discord.Emoji object by passing the string into its +create the @Discord.Emoji object by passing the string with unicode into its constructor (e.g. `new Emoji("👌");` or `new Emoji("\uD83D\uDC4C");`). Your method of declaring an @Discord.Emoji should look similar to this: - [!code-csharp[Emoji Sample](samples/emoji-sample.cs)] +Also you can use `Emoji.Parse()` or `Emoji.TryParse()` methods +for parsing emojis from strings like `:heart:`, `<3` or `❤`. + [FileFormat.Info]: https://www.fileformat.info/info/emoji/list.htm ## Emote @@ -97,4 +99,4 @@ this: ## Additional Information To learn more about emote and emojis and how they could be used, -see the documentation of @Discord.IEmote. \ No newline at end of file +see the documentation of @Discord.IEmote. diff --git a/docs/guides/slash-commands/03-responding-to-slash-commands.md b/docs/guides/slash-commands/03-responding-to-slash-commands.md index 8ab7307d4f..ad3c7145b7 100644 --- a/docs/guides/slash-commands/03-responding-to-slash-commands.md +++ b/docs/guides/slash-commands/03-responding-to-slash-commands.md @@ -45,6 +45,6 @@ Let's try this out! Let's go over the response types quickly, as you would only change them for style points :P -> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `ChannelMessageWithSource` or you can choose to send a deferred response with `DeferredChannelMessageWithSource`. If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) +> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`. If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) This seems to be working! Next, we will look at parameters for slash commands. From 4610dd193c08dde41d97bf6d9e93fab50a9e57b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 4 Aug 2021 01:12:14 +0200 Subject: [PATCH 135/494] Fix Emoji UnicodeAndNames throwing exception because of duplicit keys (#76) * Fix Emoji UnicodeAndNames throwing exception because of multiple same keys * Use ToImmutableDictionary instead of new ReadOnlyDictionary for UnicodesAndNames * Use HashSet for Emoji Unicodes parse matching --- src/Discord.Net.Core/Entities/Emotes/Emoji.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Emotes/Emoji.cs b/src/Discord.Net.Core/Entities/Emotes/Emoji.cs index 58392d1bea..60861522c6 100644 --- a/src/Discord.Net.Core/Entities/Emotes/Emoji.cs +++ b/src/Discord.Net.Core/Entities/Emotes/Emoji.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; +using System.Collections.ObjectModel; using System.Linq; namespace Discord @@ -56,7 +58,7 @@ public static bool TryParse(string text, out Emoji result) if (NamesAndUnicodes.ContainsKey(text)) result = new Emoji(NamesAndUnicodes[text]); - if (UnicodesAndNames.ContainsKey(text)) + if (Unicodes.Contains(text)) result = new Emoji(text); return result != null; @@ -5942,12 +5944,30 @@ public static Emoji Parse(string emojiStr) ["♡"] = "❤️" }; - private static IReadOnlyDictionary _unicodesAndNames; - private static IReadOnlyDictionary UnicodesAndNames + private static IReadOnlyCollection _unicodes; + private static IReadOnlyCollection Unicodes { get { - _unicodesAndNames ??= NamesAndUnicodes.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); + _unicodes ??= NamesAndUnicodes.Select(kvp => kvp.Value).ToImmutableHashSet(); + return _unicodes; + } + } + + private static IReadOnlyDictionary> _unicodesAndNames; + private static IReadOnlyDictionary> UnicodesAndNames + { + get + { + _unicodesAndNames ??= + NamesAndUnicodes + .GroupBy(kvp => kvp.Value) + .ToImmutableDictionary( + grouping => grouping.Key, + grouping => grouping.Select(kvp => kvp.Key) + .ToList() + .AsReadOnly() + ); return _unicodesAndNames; } } From 16240ab730faf4e1fc96565f1621e1d10942488e Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 3 Aug 2021 20:27:22 -0300 Subject: [PATCH 136/494] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 560894c716..e06b749a45 100644 --- a/README.md +++ b/README.md @@ -17,14 +17,14 @@ Setting up labs in your project is really simple, here's how to do it: ### Dev The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch -### Interactions -This branch is for anything todo with Discord Interactions, such as [Slash commands](https://discord.com/developers/docs/interactions/slash-commands) and [Message Components](https://discord.com/developers/docs/interactions/message-components). This branch is stable enough to use but does not contain all the features of interactions. +### release/2.x +This branch is what will be pushed to nuget, sometimes its not up to date as we wait for other features to be finished. -### SlashCommandService -This branch is on pause and does not work currently, Once everything is stable with the Interaction branch we will continue working on a slash command service for it. +### old/SlashCommandService +This branch is on pause and does not work currently, There is a pull request open to implement a working version of a slash command service. It can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/pull/52) -### web/SlashCommandService -webmilio's spin on the SlashCommandService branch, again the state of this is unknown. +### feature/xyz +These branches are features for new things, you are more than welcome to clone them and give feedback in the discord server or issues tab. ## Listening for interactions ```cs @@ -124,4 +124,4 @@ await Context.Channel.SendMessageAsync("Test selection!", component: builder.Bui > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. ## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). From aa71929efa611b3c579a5a1fdf44d0a624c2826b Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 3 Aug 2021 20:28:07 -0300 Subject: [PATCH 137/494] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e06b749a45..000d326ab5 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Setting up labs in your project is really simple, here's how to do it: ## Branches ### Dev -The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch +This branch is kept up to date with dnets dev branch. we pull of it to ensure that labs will work with pre existing dnet code. ### release/2.x This branch is what will be pushed to nuget, sometimes its not up to date as we wait for other features to be finished. From 62c3885fb1c7976c91e89b499a31bd54d61a0869 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 3 Aug 2021 20:28:21 -0300 Subject: [PATCH 138/494] Update README.md --- README.md | 103 +++++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 41c902b0d5..000d326ab5 100644 --- a/README.md +++ b/README.md @@ -15,16 +15,16 @@ Setting up labs in your project is really simple, here's how to do it: ## Branches ### Dev -The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch +This branch is kept up to date with dnets dev branch. we pull of it to ensure that labs will work with pre existing dnet code. -### Interactions -This branch is for anything todo with Discord Interactions, such as [Slash commands](https://discord.com/developers/docs/interactions/slash-commands) and [Message Components](https://discord.com/developers/docs/interactions/message-components). This branch is stable enough to use but does not contain all the features of interactions. +### release/2.x +This branch is what will be pushed to nuget, sometimes its not up to date as we wait for other features to be finished. -### SlashCommandService -This branch is on pause and does not work currently, Once everything is stable with the Interaction branch we will continue working on a slash command service for it. +### old/SlashCommandService +This branch is on pause and does not work currently, There is a pull request open to implement a working version of a slash command service. It can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/pull/52) -### web/SlashCommandService -webmilio's spin on the SlashCommandService branch, again the state of this is unknown. +### feature/xyz +These branches are features for new things, you are more than welcome to clone them and give feedback in the discord server or issues tab. ## Listening for interactions ```cs @@ -32,52 +32,65 @@ webmilio's spin on the SlashCommandService branch, again the state of this is un client.InteractionCreated += Client_InteractionCreated; ... -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task Client_InteractionCreated(SocketInteraction interaction) { - switch (arg.Type) // We want to check the type of this interaction + // Checking the type of this interaction + switch (interaction) { - //Slash commands - case InteractionType.ApplicationCommand: - await MySlashCommandHandler(arg); + // Slash commands + case SocketSlashCommand commandInteraction: + await MySlashCommandHandler(commandInteraction); break; - //Button clicks/selection dropdowns - case InteractionType.MessageComponent: - await MyMessageComponentHandler(arg); + + // Button clicks/selection dropdowns + case SocketMessageComponent componentInteraction: + await MyMessageComponentHandler(componentInteraction); break; - //Unused - case InteractionType.Ping: - break; - //Unknown/Unsupported + + // Unused or Unknown/Unsupported default: - Console.WriteLine("Unsupported interaction type: " + arg.Type); break; } } ``` -### Handling button clicks and selection dropdowns +### Simple handling slash commands ```cs -private async Task MyMessageComponentHandler(SocketInteraction arg) +private async Task MySlashCommandHandler(SocketSlashCommand interaction) +{ + // Checking command name + if (interaction.Data.Name == "ping") + { + // Respond to interaction with message. + // You can also use "ephemeral" so that only the original user of the interaction sees the message + await interaction.RespondAsync($"Pong!", ephemeral: true); + + // Also you can followup with a additional messages, which also can be "ephemeral" + await interaction.FollowupAsync($"PongPong!", ephemeral: true); + } +} +``` + +### Simple handling button clicks and selection dropdowns +```cs +private async Task MyMessageComponentHandler(SocketMessageComponent interaction) { - // Parse the arg - var parsedArg = (SocketMessageComponent) arg; // Get the custom ID - var customId = parsedArg.Data.CustomId; + var customId = interaction.Data.CustomId; // Get the user - var user = (SocketGuildUser) arg.User; + var user = (SocketGuildUser) interaction.User; // Get the guild var guild = user.Guild; - // Respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. - // You can also use "ephemeral" so that only the original user of the interaction sees the message - await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage, ephemeral: true); + // Respond with the update message. This edits the message which this component resides. + await interaction.UpdateAsync(msgProps => msgProps.Content = $"Clicked {interaction.Data.CustomId}!"); - // You can also followup with a second message - await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); + // Also you can followup with a additional messages + await interaction.FollowupAsync($"Clicked {interaction.Data.CustomId}!", ephemeral: true); - //If you are using selection dropdowns, you can get the selected label and values using these: - var selectedLabel = ((SelectMenu) parsedArg.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == parsedArg.Data.Values.FirstOrDefault())?.Label; - var selectedValue = parsedArg.Data.Values.First(); + // If you are using selection dropdowns, you can get the selected label and values using these + var selectedLabel = ((SelectMenu) interaction.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == interaction.Data.Values.FirstOrDefault())?.Label; + var selectedValue = interaction.Data.Values.First(); } ``` @@ -97,22 +110,18 @@ var builder = new ComponentBuilder() .WithSelectMenu(new SelectMenuBuilder() .WithCustomId("id_2") .WithPlaceholder("This is a placeholder") - .WithOptions(new List() - { - new SelectMenuOptionBuilder() - .WithLabel("Option A") - .WithEmote(Emote.Parse("<:evanpog:810017136814194698>")) - .WithDescription("Evan pog champ") - .WithValue("value1"), - new SelectMenuOptionBuilder() - .WithLabel("Option B") - .WithDescription("Option B is poggers") - .WithValue("value2") - })); + .AddOption( + label: "Option", + value: "value1", + description: "Evan pog champ", + emote: Emote.Parse("<:evanpog:810017136814194698>") + ) + .AddOption("Option B", "value2", "Option B is poggers"); + await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); ``` > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. ## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). From 77a555577e0c1824d9bd0d1046a5adc51eff344b Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 3 Aug 2021 20:28:34 -0300 Subject: [PATCH 139/494] Update README.md --- README.md | 103 +++++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 41c902b0d5..000d326ab5 100644 --- a/README.md +++ b/README.md @@ -15,16 +15,16 @@ Setting up labs in your project is really simple, here's how to do it: ## Branches ### Dev -The main branch we pull off of to introduce new features into, the dev branch is the same as Discord.Nets dev branch +This branch is kept up to date with dnets dev branch. we pull of it to ensure that labs will work with pre existing dnet code. -### Interactions -This branch is for anything todo with Discord Interactions, such as [Slash commands](https://discord.com/developers/docs/interactions/slash-commands) and [Message Components](https://discord.com/developers/docs/interactions/message-components). This branch is stable enough to use but does not contain all the features of interactions. +### release/2.x +This branch is what will be pushed to nuget, sometimes its not up to date as we wait for other features to be finished. -### SlashCommandService -This branch is on pause and does not work currently, Once everything is stable with the Interaction branch we will continue working on a slash command service for it. +### old/SlashCommandService +This branch is on pause and does not work currently, There is a pull request open to implement a working version of a slash command service. It can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/pull/52) -### web/SlashCommandService -webmilio's spin on the SlashCommandService branch, again the state of this is unknown. +### feature/xyz +These branches are features for new things, you are more than welcome to clone them and give feedback in the discord server or issues tab. ## Listening for interactions ```cs @@ -32,52 +32,65 @@ webmilio's spin on the SlashCommandService branch, again the state of this is un client.InteractionCreated += Client_InteractionCreated; ... -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task Client_InteractionCreated(SocketInteraction interaction) { - switch (arg.Type) // We want to check the type of this interaction + // Checking the type of this interaction + switch (interaction) { - //Slash commands - case InteractionType.ApplicationCommand: - await MySlashCommandHandler(arg); + // Slash commands + case SocketSlashCommand commandInteraction: + await MySlashCommandHandler(commandInteraction); break; - //Button clicks/selection dropdowns - case InteractionType.MessageComponent: - await MyMessageComponentHandler(arg); + + // Button clicks/selection dropdowns + case SocketMessageComponent componentInteraction: + await MyMessageComponentHandler(componentInteraction); break; - //Unused - case InteractionType.Ping: - break; - //Unknown/Unsupported + + // Unused or Unknown/Unsupported default: - Console.WriteLine("Unsupported interaction type: " + arg.Type); break; } } ``` -### Handling button clicks and selection dropdowns +### Simple handling slash commands ```cs -private async Task MyMessageComponentHandler(SocketInteraction arg) +private async Task MySlashCommandHandler(SocketSlashCommand interaction) +{ + // Checking command name + if (interaction.Data.Name == "ping") + { + // Respond to interaction with message. + // You can also use "ephemeral" so that only the original user of the interaction sees the message + await interaction.RespondAsync($"Pong!", ephemeral: true); + + // Also you can followup with a additional messages, which also can be "ephemeral" + await interaction.FollowupAsync($"PongPong!", ephemeral: true); + } +} +``` + +### Simple handling button clicks and selection dropdowns +```cs +private async Task MyMessageComponentHandler(SocketMessageComponent interaction) { - // Parse the arg - var parsedArg = (SocketMessageComponent) arg; // Get the custom ID - var customId = parsedArg.Data.CustomId; + var customId = interaction.Data.CustomId; // Get the user - var user = (SocketGuildUser) arg.User; + var user = (SocketGuildUser) interaction.User; // Get the guild var guild = user.Guild; - // Respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. - // You can also use "ephemeral" so that only the original user of the interaction sees the message - await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage, ephemeral: true); + // Respond with the update message. This edits the message which this component resides. + await interaction.UpdateAsync(msgProps => msgProps.Content = $"Clicked {interaction.Data.CustomId}!"); - // You can also followup with a second message - await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); + // Also you can followup with a additional messages + await interaction.FollowupAsync($"Clicked {interaction.Data.CustomId}!", ephemeral: true); - //If you are using selection dropdowns, you can get the selected label and values using these: - var selectedLabel = ((SelectMenu) parsedArg.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == parsedArg.Data.Values.FirstOrDefault())?.Label; - var selectedValue = parsedArg.Data.Values.First(); + // If you are using selection dropdowns, you can get the selected label and values using these + var selectedLabel = ((SelectMenu) interaction.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == interaction.Data.Values.FirstOrDefault())?.Label; + var selectedValue = interaction.Data.Values.First(); } ``` @@ -97,22 +110,18 @@ var builder = new ComponentBuilder() .WithSelectMenu(new SelectMenuBuilder() .WithCustomId("id_2") .WithPlaceholder("This is a placeholder") - .WithOptions(new List() - { - new SelectMenuOptionBuilder() - .WithLabel("Option A") - .WithEmote(Emote.Parse("<:evanpog:810017136814194698>")) - .WithDescription("Evan pog champ") - .WithValue("value1"), - new SelectMenuOptionBuilder() - .WithLabel("Option B") - .WithDescription("Option B is poggers") - .WithValue("value2") - })); + .AddOption( + label: "Option", + value: "value1", + description: "Evan pog champ", + emote: Emote.Parse("<:evanpog:810017136814194698>") + ) + .AddOption("Option B", "value2", "Option B is poggers"); + await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); ``` > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. ## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) +Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). From 82542d1742d144c1210838571ee26354335e0203 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 3 Aug 2021 20:43:01 -0300 Subject: [PATCH 140/494] Fix invalid code for select dropdowns --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 000d326ab5..f0d40c20cc 100644 --- a/README.md +++ b/README.md @@ -108,15 +108,16 @@ Theres a new field in all `SendMessageAsync` functions that takes in a `MessageC ```cs var builder = new ComponentBuilder() .WithSelectMenu(new SelectMenuBuilder() - .WithCustomId("id_2") - .WithPlaceholder("This is a placeholder") - .AddOption( - label: "Option", - value: "value1", - description: "Evan pog champ", - emote: Emote.Parse("<:evanpog:810017136814194698>") - ) - .AddOption("Option B", "value2", "Option B is poggers"); + .WithCustomId("id_2") + .WithPlaceholder("This is a placeholder") + .AddOption( + label: "Option", + value: "value1", + description: "Evan pog champ", + emote: Emote.Parse("<:evanpog:810017136814194698>") + ) + .AddOption("Option B", "value2", "Option B is poggers") + ); await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); ``` From 6e9d4c63900c6f8e57f1ec49cf5334468786f4f8 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 3 Aug 2021 20:43:16 -0300 Subject: [PATCH 141/494] Update README.md --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 000d326ab5..f0d40c20cc 100644 --- a/README.md +++ b/README.md @@ -108,15 +108,16 @@ Theres a new field in all `SendMessageAsync` functions that takes in a `MessageC ```cs var builder = new ComponentBuilder() .WithSelectMenu(new SelectMenuBuilder() - .WithCustomId("id_2") - .WithPlaceholder("This is a placeholder") - .AddOption( - label: "Option", - value: "value1", - description: "Evan pog champ", - emote: Emote.Parse("<:evanpog:810017136814194698>") - ) - .AddOption("Option B", "value2", "Option B is poggers"); + .WithCustomId("id_2") + .WithPlaceholder("This is a placeholder") + .AddOption( + label: "Option", + value: "value1", + description: "Evan pog champ", + emote: Emote.Parse("<:evanpog:810017136814194698>") + ) + .AddOption("Option B", "value2", "Option B is poggers") + ); await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); ``` From 822f3fe2549e3c26fa75a19f8e1e7cbc1cb2ea63 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 3 Aug 2021 20:43:28 -0300 Subject: [PATCH 142/494] Update README.md --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 000d326ab5..f0d40c20cc 100644 --- a/README.md +++ b/README.md @@ -108,15 +108,16 @@ Theres a new field in all `SendMessageAsync` functions that takes in a `MessageC ```cs var builder = new ComponentBuilder() .WithSelectMenu(new SelectMenuBuilder() - .WithCustomId("id_2") - .WithPlaceholder("This is a placeholder") - .AddOption( - label: "Option", - value: "value1", - description: "Evan pog champ", - emote: Emote.Parse("<:evanpog:810017136814194698>") - ) - .AddOption("Option B", "value2", "Option B is poggers"); + .WithCustomId("id_2") + .WithPlaceholder("This is a placeholder") + .AddOption( + label: "Option", + value: "value1", + description: "Evan pog champ", + emote: Emote.Parse("<:evanpog:810017136814194698>") + ) + .AddOption("Option B", "value2", "Option B is poggers") + ); await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); ``` From 5ddf6f3b72c257c979517910a9c8aa678f5ef643 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 4 Aug 2021 23:19:14 -0300 Subject: [PATCH 143/494] Squashed commit of the following: commit 88c15787f873798a8847f3aa933538e472063c65 Author: quin lynch Date: Wed Aug 4 23:17:43 2021 -0300 Fix full stop commit 50aedfb7c353a57f3665d9a0f02fdd9ec0455adf Author: quin lynch Date: Wed Aug 4 23:13:22 2021 -0300 Threads pre 3 commit f507091a7967e26113560329faac2b877ca6e9c0 Author: quin lynch Date: Wed Aug 4 21:17:44 2021 -0300 Update docs commit c2003031ce791727a046154ba35e05aae37e2a29 Author: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue Aug 3 20:43:34 2021 -0300 Update README.md commit ef77e45c75f613d8a06375ee9ab54278e9d7a9e0 Author: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue Aug 3 20:28:41 2021 -0300 Update README.md commit 09bb562d064c336f058ca338e1e386a21bb71b48 Author: quin lynch Date: Sat Jul 31 21:28:15 2021 -0300 Fix rest guild channel not creating threads. fix private thread feature check --- src/Discord.Net.Core/Discord.Net.Core.xml | 22 +++++++++ .../Entities/Guilds/IGuild.cs | 20 +++++++++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 27 +++++++++++ .../Entities/Channels/RestGuildChannel.cs | 2 + .../Entities/Channels/ThreadHelper.cs | 3 ++ .../Entities/Guilds/RestGuild.cs | 45 +++++++++++++++++++ .../BaseSocketClient.Events.cs | 2 +- .../Discord.Net.WebSocket.xml | 17 ++++++- .../DiscordShardedClient.cs | 7 +++ .../DiscordSocketClient.cs | 3 +- .../Entities/Channels/SocketThreadChannel.cs | 4 +- .../Entities/Guilds/SocketGuild.cs | 16 +++++++ 12 files changed, 163 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 8e54d8ab6b..72820de904 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3410,6 +3410,28 @@ admins and moderators of Community guilds receive notices from Discord; if none is set. + + + Gets a thread channel within this guild. + + The id of the thread channel. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the thread channel. + + + + + Gets a collection of all thread channels in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + thread channels found within this guild. + + Creates a new text channel in this guild. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index e3b0533eb4..e0be51cf57 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -589,6 +589,26 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// admins and moderators of Community guilds receive notices from Discord; if none is set. /// Task GetPublicUpdatesChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); + /// + /// Gets a thread channel within this guild. + /// + /// The id of the thread channel. + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the thread channel. + /// + Task GetThreadChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); + /// + /// Gets a collection of all thread channels in this guild. + /// + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of + /// thread channels found within this guild. + /// + Task> GetThreadChannelsAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); /// /// Creates a new text channel in this guild. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index a30a6e2b49..3aaa2c6a29 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3088,6 +3088,27 @@ message channels found within this guild. + + + Gets a thread channel in this guild. + + The snowflake identifier for the thread channel. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the thread channel associated + with the specified ; if none is found. + + + + + Gets a collection of all thread in this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + threads found within this guild. + + Gets a voice channel in this guild. @@ -3463,6 +3484,12 @@ + + + + + + diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs index fdfee39ea0..27d6cd1a6b 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs @@ -42,6 +42,8 @@ internal static RestGuildChannel Create(BaseDiscordClient discord, IGuild guild, return RestVoiceChannel.Create(discord, guild, model); case ChannelType.Category: return RestCategoryChannel.Create(discord, guild, model); + case ChannelType.PublicThread or ChannelType.PrivateThread or ChannelType.NewsThread: + return RestThreadChannel.Create(discord, guild, model); default: return new RestGuildChannel(discord, guild, model.Id); } diff --git a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs index 958210d85f..f1bf238bce 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs @@ -19,6 +19,9 @@ public static async Task CreateThreadAsync(BaseDiscordClient client, ITex if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !channel.Guild.Features.Contains("THREE_DAY_THREAD_ARCHIVE")) throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!"); + if (type == ThreadType.PrivateThread && !channel.Guild.Features.Contains("PRIVATE_THREADS")) + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!"); + var args = new StartThreadParams() { Name = name, diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index a130dcef95..a184f12902 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -394,6 +394,35 @@ public async Task> GetTextChannelsAsync(Req return channels.OfType().ToImmutableArray(); } + /// + /// Gets a thread channel in this guild. + /// + /// The snowflake identifier for the thread channel. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the thread channel associated + /// with the specified ; if none is found. + /// + public async Task GetThreadChannelAsync(ulong id, RequestOptions options = null) + { + var channel = await GuildHelper.GetChannelAsync(this, Discord, id, options).ConfigureAwait(false); + return channel as RestThreadChannel; + } + + /// + /// Gets a collection of all thread in this guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of + /// threads found within this guild. + /// + public async Task> GetThreadChannelsAsync(RequestOptions options = null) + { + var channels = await GuildHelper.GetChannelsAsync(this, Discord, options).ConfigureAwait(false); + return channels.OfType().ToImmutableArray(); + } + /// /// Gets a voice channel in this guild. /// @@ -891,6 +920,22 @@ async Task IGuild.GetTextChannelAsync(ulong id, CacheMode mode, Re return null; } /// + async Task IGuild.GetThreadChannelAsync(ulong id, CacheMode mode, RequestOptions options) + { + if (mode == CacheMode.AllowDownload) + return await GetThreadChannelAsync(id, options).ConfigureAwait(false); + else + return null; + } + /// + async Task> IGuild.GetThreadChannelsAsync(CacheMode mode, RequestOptions options) + { + if (mode == CacheMode.AllowDownload) + return await GetThreadChannelsAsync(options).ConfigureAwait(false); + else + return null; + } + /// async Task> IGuild.GetVoiceChannelsAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index d49afff25a..32f79f3d1d 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -542,7 +542,7 @@ public event Func ApplicationCommandDeleted internal readonly AsyncEvent> _applicationCommandDeleted = new AsyncEvent>(); /// - /// Fired when a thread is created within a guild. + /// Fired when a thread is created within a guild, or when the current user is added to a thread. /// public event Func ThreadCreated { diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 90cc3dbd2b..01d919d2bd 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -758,7 +758,7 @@ - Fired when a thread is created within a guild. + Fired when a thread is created within a guild. or when the current user is added to a thread. @@ -3058,6 +3058,15 @@ A text channel associated with the specified ; if none is found. + + + Gets a thread in this guild. + + The snowflake identifier for the thread. + + A thread channel associated with the specified ; if none is found. + + Gets a voice channel in this guild. @@ -3393,6 +3402,12 @@ + + + + + + diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 386f9f7e5a..18272eef28 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -379,6 +379,13 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.InviteDeleted += (channel, invite) => _inviteDeletedEvent.InvokeAsync(channel, invite); client.InteractionCreated += (interaction) => _interactionCreatedEvent.InvokeAsync(interaction); + + client.ThreadUpdated += (thread1, thread2) => _threadUpdated.InvokeAsync(thread1, thread2); + client.ThreadCreated += (thread) => _threadCreated.InvokeAsync(thread); + client.ThreadDeleted += (thread) => _threadDeleted.InvokeAsync(thread); + + client.ThreadMemberJoined += (user) => _threadMemberJoined.InvokeAsync(user); + client.ThreadMemberLeft += (user) => _threadMemberLeft.InvokeAsync(user); } //IDiscordClient diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 12802247d8..14a9bbbe86 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2001,8 +2001,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty threadChannel = (SocketThreadChannel)guild.AddChannel(this.State, data); if (data.ThreadMember.IsSpecified) threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); - await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); } + + await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); } break; diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 8065a8b2b7..33832096bc 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -281,14 +281,14 @@ public override Task> GetInvitesAsync(Reque /// This method is not supported in threads. /// public override OverwritePermissions? GetPermissionOverwrite(IRole role) - => throw new NotImplementedException(); + => ParentChannel.GetPermissionOverwrite(role); /// /// /// This method is not supported in threads. /// public override OverwritePermissions? GetPermissionOverwrite(IUser user) - => throw new NotImplementedException(); + => ParentChannel.GetPermissionOverwrite(user); /// /// diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 2fef6ff094..33c266beb0 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -633,6 +633,16 @@ public SocketGuildChannel GetChannel(ulong id) public SocketTextChannel GetTextChannel(ulong id) => GetChannel(id) as SocketTextChannel; /// + /// Gets a thread in this guild. + /// + /// The snowflake identifier for the thread. + /// + /// A thread channel associated with the specified ; if none is found. + /// + public SocketThreadChannel GetThreadChannel(ulong id) + => GetChannel(id) as SocketThreadChannel; + + /// /// Gets a voice channel in this guild. /// /// The snowflake identifier for the voice channel. @@ -1329,6 +1339,12 @@ Task> IGuild.GetTextChannelsAsync(CacheMode mo Task IGuild.GetTextChannelAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetTextChannel(id)); /// + Task IGuild.GetThreadChannelAsync(ulong id, CacheMode mode, RequestOptions options) + => Task.FromResult(GetThreadChannel(id)); + /// + Task> IGuild.GetThreadChannelsAsync(CacheMode mode, RequestOptions options) + => Task.FromResult>(ThreadChannels); + /// Task> IGuild.GetVoiceChannelsAsync(CacheMode mode, RequestOptions options) => Task.FromResult>(VoiceChannels); /// From 0113e26ccabe6efeebd26619ba964a65a878ffa1 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 4 Aug 2021 23:20:02 -0300 Subject: [PATCH 144/494] Squashed commit of the following: commit 73740e41690a63797d340af90649ad8a07ba9d0e Author: quin lynch Date: Wed Aug 4 23:17:04 2021 -0300 add sharded events commit dac6ba3603af21f2e4d6f4a3d1397763bf8be62f Merge: 22e3a529 39b7e715 Author: quin lynch Date: Wed Aug 4 22:16:12 2021 -0300 Merge branch 'feature/stage-channels' of https://github.com/Discord-Net-Labs/Discord.Net-Labs into feature/stage-channels commit 22e3a529e0f997f18f10ed589a645091bdbc423f Author: quin lynch Date: Wed Aug 4 22:15:03 2021 -0300 Threads pre 2 commit 39b7e715f34f1330c7ba892992a89af961b406f1 Author: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue Aug 3 20:43:21 2021 -0300 Update README.md commit 56536f64481759b1a49054d18953f96e2daa8573 Author: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue Aug 3 20:28:27 2021 -0300 Update README.md commit d98e79452c547c3186269c846e2d9df326742926 Author: quin lynch Date: Sat Jul 31 21:22:56 2021 -0300 Request to speak stuff commit 950fe80cecfceba50e4325c325872ca55a97346b Author: quin lynch Date: Sat Jul 31 20:59:11 2021 -0300 Rest stage channels commit 360b9436bbcd4e2dd40d11705890b31c4c1a2d7c Author: quin lynch Date: Sat Jul 31 20:29:38 2021 -0300 Stage channel socket side commit 928edaa03bf24e7536dc0ef1a14835d9a1adcd62 Author: quin lynch Date: Sat Jul 31 19:19:40 2021 -0300 Add models commit ec58a9b7e8de7cf99560d89bfbfa65ad74c58986 Author: quin lynch Date: Sat Jul 31 18:59:09 2021 -0300 initial stage channel events --- src/Discord.Net.Core/Discord.Net.Core.xml | 107 ++++++++++++++++ .../Entities/Channels/IStageChannel.cs | 75 +++++++++++ .../Channels/StageInstanceProperties.cs | 24 ++++ .../Entities/Channels/StagePrivacyLevel.cs | 14 +++ .../Entities/Guilds/IGuild.cs | 21 ++++ .../Entities/Users/IVoiceState.cs | 6 + .../API/Common/StageInstance.cs | 30 +++++ src/Discord.Net.Rest/API/Common/VoiceState.cs | 3 + .../API/Rest/CreateStageInstanceParams.cs | 21 ++++ .../API/Rest/ModifyStageInstanceParams.cs | 19 +++ .../API/Rest/ModifyVoiceStateParams.cs | 17 +++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 69 +++++++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 64 ++++++++++ .../Entities/Channels/ChannelHelper.cs | 16 +++ .../Entities/Channels/RestGuildChannel.cs | 2 + .../Entities/Channels/RestStageChannel.cs | 109 ++++++++++++++++ .../Entities/Guilds/RestGuild.cs | 46 +++++++ .../Entities/Users/RestGroupUser.cs | 3 + .../Entities/Users/RestGuildUser.cs | 2 + .../Entities/Users/RestWebhookUser.cs | 2 + .../API/Gateway/GuildMemberUpdateEvent.cs | 6 +- .../BaseSocketClient.Events.cs | 59 +++++++++ .../Discord.Net.WebSocket.csproj | 5 +- .../Discord.Net.WebSocket.xml | 102 +++++++++++++++ .../DiscordShardedClient.Events.cs | 4 +- .../DiscordShardedClient.cs | 7 ++ .../DiscordSocketClient.cs | 64 ++++++++++ .../Entities/Channels/SocketGuildChannel.cs | 2 + .../Entities/Channels/SocketStageChannel.cs | 116 ++++++++++++++++++ .../Entities/Guilds/SocketGuild.cs | 25 ++++ .../Entities/Users/SocketGroupUser.cs | 3 + .../Entities/Users/SocketGuildUser.cs | 4 + .../Entities/Users/SocketThreadUser.cs | 4 + .../Entities/Users/SocketVoiceState.cs | 10 +- .../Entities/Users/SocketWebhookUser.cs | 2 + 35 files changed, 1056 insertions(+), 7 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Channels/IStageChannel.cs create mode 100644 src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs create mode 100644 src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs create mode 100644 src/Discord.Net.Rest/API/Common/StageInstance.cs create mode 100644 src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyVoiceStateParams.cs create mode 100644 src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 72820de904..ca9e9696f9 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1914,6 +1914,70 @@ A read-only collection of users that can access this channel. + + + Represents a generic Stage Channel. + + + + + Gets the topic of the Stage instance. + + + If the stage isn't live then this property will be set to . + + + + + The of the current stage. + + + If the stage isn't live then this property will be set to . + + + + + if stage discovery is disabled, otherwise . + + + + + when the stage is live, otherwise . + + + If the stage isn't live then this property will be set to . + + + + + Starts the stage, creating a stage instance. + + The topic for the stage/ + The privacy level of the stage + The options to be used when sending the request. + + A task that represents the asynchronous start operation. + + + + + Modifies the current stage instance. + + The properties to modify the stage instance with. + The options to be used when sending the request. + + A task that represents the asynchronous modify operation. + + + + + Stops the stage, deleting the stage instance. + + The options to be used when sending the request. + + A task that represents the asynchronous stop operation. + + Represents a generic channel in a guild that can send and receive messages. @@ -2202,6 +2266,21 @@ Sets the ID of the channel to apply this position to. Sets the new zero-based position of this channel. + + + Represents properties to use when modifying a stage instance. + + + + + Gets or sets the topic of the stage. + + + + + Gets or sets the privacy level of the stage. + + Provides properties that are used to modify an with the specified changes. @@ -3344,6 +3423,29 @@ with the specified ; if none is found. + + + Gets a stage channel in this guild + + The snowflake identifier for the stage channel. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the stage channel associated + with the specified ; if none is found. + + + + + Gets a collection of all stage channels in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + stage channels found within this guild. + + Gets the AFK voice channel in this guild. @@ -9780,6 +9882,11 @@ true if the user is streaming; otherwise false. + + + Gets the time on which the user requested to speak. + + Represents a Webhook Discord user. diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs new file mode 100644 index 0000000000..6f517d100c --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a generic Stage Channel. + /// + public interface IStageChannel : IVoiceChannel + { + /// + /// Gets the topic of the Stage instance. + /// + /// + /// If the stage isn't live then this property will be set to . + /// + string Topic { get; } + + /// + /// The of the current stage. + /// + /// + /// If the stage isn't live then this property will be set to . + /// + StagePrivacyLevel? PrivacyLevel { get; } + + /// + /// if stage discovery is disabled, otherwise . + /// + bool? DiscoverableDisabled { get; } + + /// + /// when the stage is live, otherwise . + /// + /// + /// If the stage isn't live then this property will be set to . + /// + bool Live { get; } + + /// + /// Starts the stage, creating a stage instance. + /// + /// The topic for the stage/ + /// The privacy level of the stage + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous start operation. + /// + Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null); + + /// + /// Modifies the current stage instance. + /// + /// The properties to modify the stage instance with. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modify operation. + /// + Task ModifyInstanceAsync(Action func, RequestOptions options = null); + + /// + /// Stops the stage, deleting the stage instance. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous stop operation. + /// + Task StopStageAsync(RequestOptions options = null); + + Task RequestToSpeak(RequestOptions options = null); + } +} diff --git a/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs b/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs new file mode 100644 index 0000000000..ad539adc39 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents properties to use when modifying a stage instance. + /// + public class StageInstanceProperties + { + /// + /// Gets or sets the topic of the stage. + /// + public Optional Topic { get; set; } + + /// + /// Gets or sets the privacy level of the stage. + /// + public Optional PrivacyLevel { get; set; } + } +} diff --git a/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs new file mode 100644 index 0000000000..6a51ab4acc --- /dev/null +++ b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public enum StagePrivacyLevel + { + Public = 1, + GuildOnly = 2, + } +} diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index e0be51cf57..ad2e0317df 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -530,6 +530,27 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Task GetVoiceChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); /// + /// Gets a stage channel in this guild + /// + /// The snowflake identifier for the stage channel. + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the stage channel associated + /// with the specified ; if none is found. + /// + Task GetStageChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); + /// + /// Gets a collection of all stage channels in this guild. + /// + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of + /// stage channels found within this guild. + /// + Task> GetStageChannelsAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); + /// /// Gets the AFK voice channel in this guild. /// /// The that determines whether the object should be fetched from cache. diff --git a/src/Discord.Net.Core/Entities/Users/IVoiceState.cs b/src/Discord.Net.Core/Entities/Users/IVoiceState.cs index a9b3470039..c9a22761f4 100644 --- a/src/Discord.Net.Core/Entities/Users/IVoiceState.cs +++ b/src/Discord.Net.Core/Entities/Users/IVoiceState.cs @@ -1,3 +1,5 @@ +using System; + namespace Discord { /// @@ -62,5 +64,9 @@ public interface IVoiceState /// true if the user is streaming; otherwise false. /// bool IsStreaming { get; } + /// + /// Gets the time on which the user requested to speak. + /// + DateTimeOffset? RequestToSpeakTimestamp { get; } } } diff --git a/src/Discord.Net.Rest/API/Common/StageInstance.cs b/src/Discord.Net.Rest/API/Common/StageInstance.cs new file mode 100644 index 0000000000..4cb5f58237 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/StageInstance.cs @@ -0,0 +1,30 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class StageInstance + { + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("guild_id")] + public ulong GuildId { get; set; } + + [JsonProperty("channel_id")] + public ulong ChannelId { get; set; } + + [JsonProperty("topic")] + public string Topic { get; set; } + + [JsonProperty("privacy_level")] + public StagePrivacyLevel PrivacyLevel { get; set; } + + [JsonProperty("discoverable_disabled")] + public bool DiscoverableDisabled { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/VoiceState.cs b/src/Discord.Net.Rest/API/Common/VoiceState.cs index c7a571ed06..27aacb6a42 100644 --- a/src/Discord.Net.Rest/API/Common/VoiceState.cs +++ b/src/Discord.Net.Rest/API/Common/VoiceState.cs @@ -1,5 +1,6 @@ #pragma warning disable CS1591 using Newtonsoft.Json; +using System; namespace Discord.API { @@ -28,5 +29,7 @@ internal class VoiceState public bool Suppress { get; set; } [JsonProperty("self_stream")] public bool SelfStream { get; set; } + [JsonProperty("request_to_speak_timestamp")] + public Optional RequestToSpeakTimestamp { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs new file mode 100644 index 0000000000..294f9e1a5c --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class CreateStageInstanceParams + { + [JsonProperty("channel_id")] + public ulong ChannelId { get; set; } + + [JsonProperty("topic")] + public string Topic { get; set; } + + [JsonProperty("privacy_level")] + public Optional PrivacyLevel { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs new file mode 100644 index 0000000000..df73954de8 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ModifyStageInstanceParams + { + + [JsonProperty("topic")] + public Optional Topic { get; set; } + + [JsonProperty("privacy_level")] + public Optional PrivacyLevel { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyVoiceStateParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyVoiceStateParams.cs new file mode 100644 index 0000000000..1ff0f3e08a --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyVoiceStateParams.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json; +using System; + +namespace Discord.API.Rest +{ + internal class ModifyVoiceStateParams + { + [JsonProperty("channel_id")] + public ulong ChannelId { get; set; } + + [JsonProperty("suppress")] + public Optional Suppressed { get; set; } + + [JsonProperty("request_to_speak_timestamp")] + public Optional RequestToSpeakTimestamp { get; set; } + } +} diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 3aaa2c6a29..c8865f786d 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2281,6 +2281,38 @@ Represents a REST-based news channel in a guild that has the same properties as a . + + + Represents a REST-based stage channel in a guild. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a REST-based channel in a guild that can send and receive messages. @@ -3130,6 +3162,28 @@ voice channels found within this guild. + + + Gets a stage channel in this guild + + The snowflake identifier for the stage channel. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the stage channel associated + with the specified ; if none is found. + + + + + Gets a collection of all stage channels in this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of + stage channels found within this guild. + + Gets a collection of all category channels in this guild. @@ -3496,6 +3550,12 @@ + + + + + + @@ -4365,6 +4425,9 @@ + + + Represents a REST-based guild user. @@ -4456,6 +4519,9 @@ + + + Represents the logged-in REST-based user. @@ -4679,6 +4745,9 @@ + + + diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index d34a6a4b9b..99c2dadad3 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -577,6 +577,70 @@ public async Task GetJoinedPrivateArchivedThreadsAsync(ulong cha return await SendAsync("GET", () => $"channels/{channelId}/users/@me/threads/archived/private{query}", bucket, options: options); } + // stage + public async Task CreateStageInstanceAsync(CreateStageInstanceParams args, RequestOptions options = null) + { + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(); + + return await SendJsonAsync("POST", () => $"stage-instances", args, bucket, options: options).ConfigureAwait(false); + } + + public async Task ModifyStageInstanceAsync(ulong channelId, ModifyStageInstanceParams args, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + return await SendJsonAsync("PATCH", () => $"stage-instances/{channelId}", args, bucket, options: options).ConfigureAwait(false); + } + + public async Task DeleteStageInstanceAsync(ulong channelId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + try + { + await SendAsync("DELETE", $"stage-instances/{channelId}", options: options).ConfigureAwait(false); + } + catch (HttpException httpEx) when (httpEx.HttpCode == HttpStatusCode.NotFound) { } + } + + public async Task GetStageInstanceAsync(ulong channelId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + try + { + return await SendAsync("POST", () => $"stage-instances/{channelId}", bucket, options: options).ConfigureAwait(false); + } + catch(HttpException httpEx) when (httpEx.HttpCode == HttpStatusCode.NotFound) + { + return null; + } + } + + public async Task ModifyMyVoiceState(ulong guildId, ModifyVoiceStateParams args, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(); + + await SendJsonAsync("PATCH", () => $"guilds/{guildId}/voice-states/@me", args, bucket, options: options).ConfigureAwait(false); + } + // roles public async Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index f69c010f23..98715bfcec 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Threading.Tasks; using Model = Discord.API.Channel; +using StageInstance = Discord.API.StageInstance; namespace Discord.Rest { @@ -92,6 +93,21 @@ public static async Task ModifyAsync(IVoiceChannel channel, BaseDiscordCl return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); } + public static async Task ModifyAsync(IStageChannel channel, BaseDiscordClient client, + Action func, RequestOptions options = null) + { + var args = new StageInstanceProperties(); + func(args); + + var apiArgs = new ModifyStageInstanceParams() + { + PrivacyLevel = args.PrivacyLevel, + Topic = args.Topic + }; + + return await client.ApiClient.ModifyStageInstanceAsync(channel.Id, apiArgs, options); + } + //Invites public static async Task> GetInvitesAsync(IGuildChannel channel, BaseDiscordClient client, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs index 27d6cd1a6b..f0150aeb23 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs @@ -40,6 +40,8 @@ internal static RestGuildChannel Create(BaseDiscordClient discord, IGuild guild, return RestTextChannel.Create(discord, guild, model); case ChannelType.Voice: return RestVoiceChannel.Create(discord, guild, model); + case ChannelType.Stage: + return RestStageChannel.Create(discord, guild, model); case ChannelType.Category: return RestCategoryChannel.Create(discord, guild, model); case ChannelType.PublicThread or ChannelType.PrivateThread or ChannelType.NewsThread: diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs new file mode 100644 index 0000000000..883a080f12 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Channel; +using StageInstance = Discord.API.StageInstance; + +namespace Discord.Rest +{ + /// + /// Represents a REST-based stage channel in a guild. + /// + public class RestStageChannel : RestVoiceChannel, IStageChannel + { + /// + public string Topic { get; private set; } + + /// + public StagePrivacyLevel? PrivacyLevel { get; private set; } + + /// + public bool? DiscoverableDisabled { get; private set; } + + /// + public bool Live { get; private set; } + internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) + : base(discord, guild, id) + { + + } + + internal static new RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model) + { + var entity = new RestStageChannel(discord, guild, model.Id); + entity.Update(model); + return entity; + } + + internal void Update(StageInstance model, bool isLive = false) + { + this.Live = isLive; + if(isLive) + { + this.Topic = model.Topic; + this.PrivacyLevel = model.PrivacyLevel; + this.DiscoverableDisabled = model.DiscoverableDisabled; + } + else + { + this.Topic = null; + this.PrivacyLevel = null; + this.DiscoverableDisabled = null; + } + } + + /// + public async Task ModifyInstanceAsync(Action func, RequestOptions options = null) + { + var model = await ChannelHelper.ModifyAsync(this, Discord, func, options); + + Update(model, true); + } + + /// + public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null) + { + var args = new API.Rest.CreateStageInstanceParams() + { + ChannelId = this.Id, + PrivacyLevel = privacyLevel, + Topic = topic + }; + + var model = await Discord.ApiClient.CreateStageInstanceAsync(args, options); + + Update(model, true); + } + + /// + public async Task StopStageAsync(RequestOptions options = null) + { + await Discord.ApiClient.DeleteStageInstanceAsync(this.Id, options); + + Update(null, false); + } + + /// + public override async Task UpdateAsync(RequestOptions options = null) + { + await base.UpdateAsync(options); + + var model = await Discord.ApiClient.GetStageInstanceAsync(this.Id, options); + + Update(model, model != null); + } + + /// + public Task RequestToSpeak(RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + RequestToSpeakTimestamp = DateTimeOffset.UtcNow + }; + return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + } + } +} diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index a184f12902..2fab63347e 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -451,6 +451,35 @@ public async Task> GetVoiceChannelsAsync(R var channels = await GuildHelper.GetChannelsAsync(this, Discord, options).ConfigureAwait(false); return channels.OfType().ToImmutableArray(); } + /// + /// Gets a stage channel in this guild + /// + /// The snowflake identifier for the stage channel. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the stage channel associated + /// with the specified ; if none is found. + /// + public async Task GetStageChannelAsync(ulong id, RequestOptions options = null) + { + var channel = await GuildHelper.GetChannelAsync(this, Discord, id, options).ConfigureAwait(false); + return channel as RestStageChannel; + } + + /// + /// Gets a collection of all stage channels in this guild. + /// + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of + /// stage channels found within this guild. + /// + public async Task> GetStageChannelsAsync(RequestOptions options = null) + { + var channels = await GuildHelper.GetChannelsAsync(this, Discord, options).ConfigureAwait(false); + return channels.OfType().ToImmutableArray(); + } /// /// Gets a collection of all category channels in this guild. @@ -952,6 +981,22 @@ async Task> IGuild.GetCategoriesAsync(Cach return null; } /// + async Task IGuild.GetStageChannelAsync(ulong id, CacheMode mode, RequestOptions options ) + { + if (mode == CacheMode.AllowDownload) + return await GetStageChannelAsync(id, options).ConfigureAwait(false); + else + return null; + } + /// + async Task> IGuild.GetStageChannelsAsync(CacheMode mode, RequestOptions options) + { + if (mode == CacheMode.AllowDownload) + return await GetStageChannelsAsync(options).ConfigureAwait(false); + else + return null; + } + /// async Task IGuild.GetVoiceChannelAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) @@ -1109,5 +1154,6 @@ async Task IGuild.GetWebhookAsync(ulong id, RequestOptions options) /// async Task> IGuild.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); + } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs index 55e9843ebc..63b89035b3 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs @@ -1,3 +1,4 @@ +using System; using System.Diagnostics; using Model = Discord.API.User; @@ -37,5 +38,7 @@ internal RestGroupUser(BaseDiscordClient discord, ulong id) string IVoiceState.VoiceSessionId => null; /// bool IVoiceState.IsStreaming => false; + /// + DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index 6e6bbe09cf..d094be6183 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -169,5 +169,7 @@ IGuild IGuildUser.Guild string IVoiceState.VoiceSessionId => null; /// bool IVoiceState.IsStreaming => false; + /// + DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs index 2131fec93d..9297f9af9d 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs @@ -107,5 +107,7 @@ Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions option string IVoiceState.VoiceSessionId => null; /// bool IVoiceState.IsStreaming => false; + /// + DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; } } diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs index a234d6da56..744d2d502a 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs @@ -1,10 +1,14 @@ -#pragma warning disable CS1591 +#pragma warning disable CS1591 using Newtonsoft.Json; +using System; namespace Discord.API.Gateway { internal class GuildMemberUpdateEvent : GuildMember { + [JsonProperty("joined_at")] + public new DateTimeOffset? JoinedAt { get; set; } + [JsonProperty("guild_id")] public ulong GuildId { get; set; } } diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 32f79f3d1d..4982655d7f 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -592,5 +592,64 @@ public event Func ThreadMemberLeft } internal readonly AsyncEvent> _threadMemberLeft = new AsyncEvent>(); + /// + /// Fired when a stage is started. + /// + public event Func StageStarted + { + add { _stageStarted.Add(value); } + remove { _stageStarted.Remove(value); } + } + internal readonly AsyncEvent> _stageStarted = new AsyncEvent>(); + + /// + /// Fired when a stage ends. + /// + public event Func StageEnded + { + add { _stageEnded.Add(value); } + remove { _stageEnded.Remove(value); } + } + internal readonly AsyncEvent> _stageEnded = new AsyncEvent>(); + + /// + /// Fired when a stage is updated. + /// + public event Func StageUpdated + { + add { _stageUpdated.Add(value); } + remove { _stageUpdated.Remove(value); } + } + internal readonly AsyncEvent> _stageUpdated = new AsyncEvent>(); + + /// + /// Fired when a user requests to speak within a stage channel. + /// + public event Func RequestToSpeak + { + add { _requestToSpeak.Add(value); } + remove { _requestToSpeak.Remove(value); } + } + internal readonly AsyncEvent> _requestToSpeak = new AsyncEvent>(); + + /// + /// Fired when a speaker is added in a stage channel. + /// + public event Func SpeakerAdded + { + add { _speakerAdded.Add(value); } + remove { _speakerAdded.Remove(value); } + } + internal readonly AsyncEvent> _speakerAdded = new AsyncEvent>(); + + /// + /// Fired when a speaker is removed from a stage channel. + /// + public event Func SpeakerRemoved + { + add { _speakerRemoved.Add(value); } + remove { _speakerRemoved.Remove(value); } + } + internal readonly AsyncEvent> _speakerRemoved = new AsyncEvent>(); } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 3f1f63db3a..35aabb0104 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,4 +1,4 @@ - + @@ -17,6 +17,9 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml + + DEBUG;TRACE;DEBUG_LIMITS + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 01d919d2bd..93873217ff 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -781,6 +781,36 @@ Fired when a user leaves a thread + + + Fired when a stage is started. + + + + + Fired when a stage ends. + + + + + Fired when a stage is updated. + + + + + Fired when a user requests to speak within a stage channel. + + + + + Fired when a speaker is added in a stage channel. + + + + + Fired when a speaker is removed from a stage channel. + + @@ -2142,6 +2172,40 @@ + + + Represents a stage channel recieved over the gateway. + + + + + + + + + + + + + + + + + Gets a collection of users who are speakers within the stage. + + + + + + + + + + + + + + Represents a WebSocket-based channel in a guild that can send and receive messages. @@ -2901,6 +2965,14 @@ A read-only collection of voice channels found within this guild. + + + Gets a collection of all stage channels in this guild. + + + A read-only collection of stage channels found within this guild. + + Gets a collection of all category channels in this guild. @@ -3076,6 +3148,15 @@ A voice channel associated with the specified ; if none is found. + + + Gets a stage channel in this guild. + + The snowflake identifier for the stage channel. + + A stage channel associated with the specified ; if none is found. + + Gets a category channel in this guild. @@ -3417,6 +3498,12 @@ + + + + + + @@ -4358,6 +4445,9 @@ + + + Represents a WebSocket-based guild user. @@ -4407,6 +4497,9 @@ + + + @@ -4654,6 +4747,9 @@ + + + @@ -4819,6 +4915,9 @@ + + + @@ -4968,6 +5067,9 @@ + + + Represents a WebSocket-based voice server. diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs index c9e679669f..a9e6e311d8 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; namespace Discord.WebSocket @@ -35,4 +35,4 @@ public event Func ShardLatencyUpdated } private readonly AsyncEvent> _shardLatencyUpdatedEvent = new AsyncEvent>(); } -} \ No newline at end of file +} diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 18272eef28..6847d85801 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -386,6 +386,13 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.ThreadMemberJoined += (user) => _threadMemberJoined.InvokeAsync(user); client.ThreadMemberLeft += (user) => _threadMemberLeft.InvokeAsync(user); + client.StageEnded += (stage) => _stageEnded.InvokeAsync(stage); + client.StageStarted += (stage) => _stageStarted.InvokeAsync(stage); + client.StageUpdated += (stage1, stage2) => _stageUpdated.InvokeAsync(stage1, stage2); + + client.RequestToSpeak += (stage, user) => _requestToSpeak.InvokeAsync(stage, user); + client.SpeakerAdded += (stage, user) => _speakerAdded.InvokeAsync(stage, user); + client.SpeakerRemoved += (stage, user) => _speakerRemoved.InvokeAsync(stage, user); } //IDiscordClient diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 14a9bbbe86..3b283a004f 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1770,6 +1770,29 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } + if (user is SocketGuildUser guildUser && data.ChannelId.HasValue) + { + SocketStageChannel stage = guildUser.Guild.GetStageChannel(data.ChannelId.Value); + + if (stage != null && before.VoiceChannel != null && after.VoiceChannel != null) + { + if (!before.RequestToSpeakTimestamp.HasValue && after.RequestToSpeakTimestamp.HasValue) + { + await TimedInvokeAsync(_requestToSpeak, nameof(RequestToSpeak), stage, guildUser); + return; + } + if(before.IsSuppressed && !after.IsSuppressed) + { + await TimedInvokeAsync(_speakerAdded, nameof(SpeakerAdded), stage, guildUser); + return; + } + if(!before.IsSuppressed && after.IsSuppressed) + { + await TimedInvokeAsync(_speakerRemoved, nameof(SpeakerRemoved), stage, guildUser); + } + } + } + await TimedInvokeAsync(_userVoiceStateUpdatedEvent, nameof(UserVoiceStateUpdated), user, before, after).ConfigureAwait(false); } break; @@ -2181,6 +2204,47 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty break; + case "STAGE_INSTANCE_CREATE" or "STAGE_INSTANCE_UPDATE" or "STAGE_INSTANCE_DELETE": + { + await _gatewayLogger.DebugAsync($"Received Dispatch ({type})").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + + if(guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var stageChannel = guild.GetStageChannel(data.ChannelId); + + if(stageChannel == null) + { + await UnknownChannelAsync(type, data.ChannelId).ConfigureAwait(false); + return; + } + + SocketStageChannel before = type == "STAGE_INSTANCE_UPDATE" ? stageChannel.Clone() : null; + + stageChannel.Update(data, type == "STAGE_INSTANCE_CREATE" ? true : type == "STAGE_INSTANCE_DELETE" ? false : false); + + switch (type) + { + case "STAGE_INSTANCE_CREATE": + await TimedInvokeAsync(_stageStarted, nameof(StageStarted), stageChannel); + return; + case "STAGE_INSTANCE_DELETE": + await TimedInvokeAsync(_stageEnded, nameof(StageEnded), stageChannel); + return; + case "STAGE_INSTANCE_UPDATE": + await TimedInvokeAsync(_stageUpdated, nameof(StageUpdated), before, stageChannel); + return; + } + } + break; + //Ignored (User only) case "CHANNEL_PINS_ACK": await _gatewayLogger.DebugAsync("Ignored Dispatch (CHANNEL_PINS_ACK)").ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs index 7187c97716..196f3c558f 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs @@ -58,6 +58,8 @@ internal static SocketGuildChannel Create(SocketGuild guild, ClientState state, return SocketCategoryChannel.Create(guild, state, model); case ChannelType.PrivateThread or ChannelType.PublicThread or ChannelType.NewsThread: return SocketThreadChannel.Create(guild, state, model); + case ChannelType.Stage: + return SocketStageChannel.Create(guild, state, model); default: return new SocketGuildChannel(guild.Discord, model.Id, guild); } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs new file mode 100644 index 0000000000..15e49901ef --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -0,0 +1,116 @@ +using Discord.Rest; +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Channel; +using StageInstance = Discord.API.StageInstance; + +namespace Discord.WebSocket +{ + /// + /// Represents a stage channel recieved over the gateway. + /// + public class SocketStageChannel : SocketVoiceChannel, IStageChannel + { + /// + public string Topic { get; private set; } + + /// + public StagePrivacyLevel? PrivacyLevel { get; private set; } + + /// + public bool? DiscoverableDisabled { get; private set; } + + /// + public bool Live { get; private set; } = false; + + /// + /// Gets a collection of users who are speakers within the stage. + /// + public IReadOnlyCollection Speakers + => this.Users.Where(x => !x.IsSuppressed).ToImmutableArray(); + + internal new SocketStageChannel Clone() => MemberwiseClone() as SocketStageChannel; + + + internal SocketStageChannel(DiscordSocketClient discord, ulong id, SocketGuild guild) + : base(discord, id, guild) + { + + } + + internal new static SocketStageChannel Create(SocketGuild guild, ClientState state, Model model) + { + var entity = new SocketStageChannel(guild.Discord, model.Id, guild); + entity.Update(state, model); + return entity; + } + + internal override void Update(ClientState state, Model model) + { + base.Update(state, model); + } + + internal void Update(StageInstance model, bool isLive = false) + { + this.Live = isLive; + if (isLive) + { + this.Topic = model.Topic; + this.PrivacyLevel = model.PrivacyLevel; + this.DiscoverableDisabled = model.DiscoverableDisabled; + } + else + { + this.Topic = null; + this.PrivacyLevel = null; + this.DiscoverableDisabled = null; + } + } + + /// + public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null) + { + var args = new API.Rest.CreateStageInstanceParams() + { + ChannelId = this.Id, + Topic = topic, + PrivacyLevel = privacyLevel, + }; + + var model = await Discord.ApiClient.CreateStageInstanceAsync(args, options).ConfigureAwait(false); + + this.Update(model, true); + } + + /// + public async Task ModifyInstanceAsync(Action func, RequestOptions options = null) + { + var model = await ChannelHelper.ModifyAsync(this, Discord, func, options); + + this.Update(model, true); + } + + /// + public async Task StopStageAsync(RequestOptions options = null) + { + await Discord.ApiClient.DeleteStageInstanceAsync(this.Id, options); + + Update(null, false); + } + + /// + public Task RequestToSpeak(RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + RequestToSpeakTimestamp = DateTimeOffset.UtcNow + }; + return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 33c266beb0..c32bb3f49f 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -271,6 +271,14 @@ public IReadOnlyCollection TextChannels public IReadOnlyCollection VoiceChannels => Channels.OfType().ToImmutableArray(); /// + /// Gets a collection of all stage channels in this guild. + /// + /// + /// A read-only collection of stage channels found within this guild. + /// + public IReadOnlyCollection StageChannels + => Channels.OfType().ToImmutableArray(); + /// /// Gets a collection of all category channels in this guild. /// /// @@ -652,6 +660,15 @@ public SocketThreadChannel GetThreadChannel(ulong id) public SocketVoiceChannel GetVoiceChannel(ulong id) => GetChannel(id) as SocketVoiceChannel; /// + /// Gets a stage channel in this guild. + /// + /// The snowflake identifier for the stage channel. + /// + /// A stage channel associated with the specified ; if none is found. + /// + public SocketStageChannel GetStageChannel(ulong id) + => GetChannel(id) as SocketStageChannel; + /// /// Gets a category channel in this guild. /// /// The snowflake identifier for the category channel. @@ -1354,6 +1371,12 @@ Task> IGuild.GetCategoriesAsync(CacheMode Task IGuild.GetVoiceChannelAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetVoiceChannel(id)); /// + Task IGuild.GetStageChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + => Task.FromResult(GetStageChannel(id)); + /// + Task> IGuild.GetStageChannelsAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + => Task.FromResult>(StageChannels); + /// Task IGuild.GetAFKChannelAsync(CacheMode mode, RequestOptions options) => Task.FromResult(AFKChannel); /// @@ -1462,5 +1485,7 @@ void IDisposable.Dispose() _audioLock?.Dispose(); _audioClient?.Dispose(); } + + } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs index 8545e492bc..805a881101 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs @@ -1,3 +1,4 @@ +using System; using System.Diagnostics; using Model = Discord.API.User; @@ -66,5 +67,7 @@ internal static SocketGroupUser Create(SocketGroupChannel channel, ClientState s string IVoiceState.VoiceSessionId => null; /// bool IVoiceState.IsStreaming => false; + /// + DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 444c76ffa6..f79fc7afed 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -57,7 +57,11 @@ public class SocketGuildUser : SocketUser, IGuildUser /// public bool IsStreaming => VoiceState?.IsStreaming ?? false; /// + public DateTimeOffset? RequestToSpeakTimestamp => VoiceState?.RequestToSpeakTimestamp ?? null; + /// public bool? IsPending { get; private set; } + + /// public DateTimeOffset? JoinedAt => DateTimeUtils.FromTicks(_joinedAtTicks); /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index df9194d5b9..d1237d598f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -110,6 +110,10 @@ public string VoiceSessionId public bool IsStreaming => GuildUser.IsStreaming; + /// + public DateTimeOffset? RequestToSpeakTimestamp + => GuildUser.RequestToSpeakTimestamp; + private SocketGuildUser GuildUser { get; set; } internal SocketThreadUser(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser member) diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs index 5bf36e796e..816a839fcb 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs @@ -13,7 +13,7 @@ public struct SocketVoiceState : IVoiceState /// /// Initializes a default with everything set to null or false. /// - public static readonly SocketVoiceState Default = new SocketVoiceState(null, null, false, false, false, false, false, false); + public static readonly SocketVoiceState Default = new SocketVoiceState(null, null, null, false, false, false, false, false, false); [Flags] private enum Flags : byte @@ -35,6 +35,8 @@ private enum Flags : byte public SocketVoiceChannel VoiceChannel { get; } /// public string VoiceSessionId { get; } + /// + public DateTimeOffset? RequestToSpeakTimestamp { get; private set; } /// public bool IsMuted => (_voiceStates & Flags.Muted) != 0; @@ -48,11 +50,13 @@ private enum Flags : byte public bool IsSelfDeafened => (_voiceStates & Flags.SelfDeafened) != 0; /// public bool IsStreaming => (_voiceStates & Flags.SelfStream) != 0; + - internal SocketVoiceState(SocketVoiceChannel voiceChannel, string sessionId, bool isSelfMuted, bool isSelfDeafened, bool isMuted, bool isDeafened, bool isSuppressed, bool isStream) + internal SocketVoiceState(SocketVoiceChannel voiceChannel, DateTimeOffset? requestToSpeak, string sessionId, bool isSelfMuted, bool isSelfDeafened, bool isMuted, bool isDeafened, bool isSuppressed, bool isStream) { VoiceChannel = voiceChannel; VoiceSessionId = sessionId; + RequestToSpeakTimestamp = requestToSpeak; Flags voiceStates = Flags.Normal; if (isSelfMuted) @@ -71,7 +75,7 @@ internal SocketVoiceState(SocketVoiceChannel voiceChannel, string sessionId, boo } internal static SocketVoiceState Create(SocketVoiceChannel voiceChannel, Model model) { - return new SocketVoiceState(voiceChannel, model.SessionId, model.SelfMute, model.SelfDeaf, model.Mute, model.Deaf, model.Suppress, model.SelfStream); + return new SocketVoiceState(voiceChannel, model.RequestToSpeakTimestamp.IsSpecified ? model.RequestToSpeakTimestamp.Value : null, model.SessionId, model.SelfMute, model.SelfDeaf, model.Mute, model.Deaf, model.Suppress, model.SelfStream); } /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index 404ab116d9..2b0ecbb19f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -138,5 +138,7 @@ Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions option string IVoiceState.VoiceSessionId => null; /// bool IVoiceState.IsStreaming => false; + /// + DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; } } From 0d292adf2024e9865da96f175d3d825bceb90b9e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 4 Aug 2021 23:35:52 -0300 Subject: [PATCH 145/494] meta: bump versions --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 2 +- src/Discord.Net/Discord.Net.nuspec | 20 +++++++++---------- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 73a2654d22..f0be100599 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 2.4.6 + 3.0.0-pre Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 13cfad83ea..b1efafae21 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.4.6 + 3.0.0-pre Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs 2.3.4 diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 35aabb0104..35ea4ffaa0 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 2.4.9 + 3.0.0-pre https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 93873217ff..b880b2e582 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -758,7 +758,7 @@ - Fired when a thread is created within a guild. or when the current user is added to a thread. + Fired when a thread is created within a guild, or when the current user is added to a thread. diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 79f8893fae..9632d9065b 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 2.4.9$suffix$ + 3.0.0-pre$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -16,23 +16,23 @@ - - - + + + - - - + + + - - - + + + From 3ca4f512786c7afd6c0e8fe5f96298926921b7d5 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 5 Aug 2021 15:43:01 -0300 Subject: [PATCH 146/494] Fix #83 --- .../API/Gateway/GatewayOpCode.cs | 4 +-- .../API/Gateway/IdentifyParams.cs | 2 +- .../API/Gateway/StatusUpdateParams.cs | 9 ++++--- .../ConnectionManager.cs | 5 ++++ .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 2 +- .../DiscordSocketApiClient.cs | 16 +++++++----- .../DiscordSocketClient.cs | 2 +- src/Discord.Net/Discord.Net.nuspec | 26 +++++++++---------- 9 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs b/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs index 13a2bb462a..062aec2244 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs @@ -1,4 +1,4 @@ -#pragma warning disable CS1591 +#pragma warning disable CS1591 namespace Discord.API.Gateway { internal enum GatewayOpCode : byte @@ -10,7 +10,7 @@ internal enum GatewayOpCode : byte /// C→S - Used to associate a connection with a token and specify configuration. Identify = 2, /// C→S - Used to update client's status and current game id. - StatusUpdate = 3, + PresenceUpdate = 3, /// C→S - Used to join a particular voice channel. VoiceStateUpdate = 4, /// C→S - Used to ensure the guild's voice server is alive. diff --git a/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs b/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs index bb54d4cdd1..3b7ef35d64 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs @@ -16,7 +16,7 @@ internal class IdentifyParams [JsonProperty("shard")] public Optional ShardingParams { get; set; } [JsonProperty("presence")] - public Optional Presence { get; set; } + public Optional Presence { get; set; } [JsonProperty("intents")] public Optional Intents { get; set; } } diff --git a/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs b/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs index 5fec8b4bd0..96897024c6 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs @@ -4,15 +4,16 @@ namespace Discord.API.Gateway { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - internal class StatusUpdateParams + internal class PresenceUpdateParams + { [JsonProperty("status")] public UserStatus Status { get; set; } - [JsonProperty("since"), Int53] + [JsonProperty("since", NullValueHandling = NullValueHandling.Include), Int53] public long? IdleSince { get; set; } [JsonProperty("afk")] public bool IsAFK { get; set; } - [JsonProperty("game")] - public Game Game { get; set; } + [JsonProperty("activities")] + public object[] Activities { get; set; } // TODO, change to interface later } } diff --git a/src/Discord.Net.WebSocket/ConnectionManager.cs b/src/Discord.Net.WebSocket/ConnectionManager.cs index e444f359f6..9a19f90f42 100644 --- a/src/Discord.Net.WebSocket/ConnectionManager.cs +++ b/src/Discord.Net.WebSocket/ConnectionManager.cs @@ -185,6 +185,11 @@ public void Error(Exception ex) _readyPromise.TrySetException(ex); _connectionPromise.TrySetException(ex); _connectionCancelToken?.Cancel(); + + _ = Task.Run(async () => + { + await _logger.ErrorAsync($"Failed to start the connection: {ex}", ex); + }); } public void CriticalError(Exception ex) { diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 35ea4ffaa0..b61a630328 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -18,7 +18,7 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - DEBUG;TRACE;DEBUG_LIMITS + TRACE diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index b880b2e582..aac3f2132d 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -13,7 +13,7 @@ C→S - Used to associate a connection with a token and specify configuration. - + C→S - Used to update client's status and current game id. diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index 65fd23d3f2..449bf8e040 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -213,6 +213,10 @@ private async Task SendGatewayInternalAsync(GatewayOpCode opCode, object payload options.BucketId = GatewayBucket.Get(GatewayBucketType.Unbucketed).Id; await RequestQueue.SendAsync(new WebSocketRequest(WebSocketClient, bytes, true, opCode == GatewayOpCode.Heartbeat, options)).ConfigureAwait(false); await _sentGatewayMessageEvent.InvokeAsync(opCode).ConfigureAwait(false); + +#if DEBUG + Console.WriteLine($"Sent {opCode}:\n{SerializeJson(payload)}"); +#endif } public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, int totalShards = 1, GatewayIntents gatewayIntents = GatewayIntents.AllUnprivileged, (UserStatus, bool, long?, GameModel)? presence = null, RequestOptions options = null) @@ -237,12 +241,12 @@ public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, i if (presence.HasValue) { - msg.Presence = new StatusUpdateParams + msg.Presence = new PresenceUpdateParams { Status = presence.Value.Item1, IsAFK = presence.Value.Item2, IdleSince = presence.Value.Item3, - Game = presence.Value.Item4, + Activities = new object[] { presence.Value.Item4 } }; } @@ -264,18 +268,18 @@ public async Task SendHeartbeatAsync(int lastSeq, RequestOptions options = null) options = RequestOptions.CreateOrClone(options); await SendGatewayAsync(GatewayOpCode.Heartbeat, lastSeq, options: options).ConfigureAwait(false); } - public async Task SendStatusUpdateAsync(UserStatus status, bool isAFK, long? since, GameModel game, RequestOptions options = null) + public async Task SendPresenceUpdateAsync(UserStatus status, bool isAFK, long? since, GameModel game, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - var args = new StatusUpdateParams + var args = new PresenceUpdateParams { Status = status, IdleSince = since, IsAFK = isAFK, - Game = game + Activities = new object[] { game } }; options.BucketId = GatewayBucket.Get(GatewayBucketType.PresenceUpdate).Id; - await SendGatewayAsync(GatewayOpCode.StatusUpdate, args, options: options).ConfigureAwait(false); + await SendGatewayAsync(GatewayOpCode.PresenceUpdate, args, options: options).ConfigureAwait(false); } public async Task SendRequestMembersAsync(IEnumerable guildIds, RequestOptions options = null) { diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 3b283a004f..52a5d309db 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -495,7 +495,7 @@ private async Task SendStatusAsync() var presence = BuildCurrentStatus() ?? (UserStatus.Online, false, null, null); - await ApiClient.SendStatusUpdateAsync( + await ApiClient.SendPresenceUpdateAsync( status: presence.Item1, isAFK: presence.Item2, since: presence.Item3, diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 9632d9065b..595203eba0 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.0-pre$suffix$ + 3.0.1-pre$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,25 +14,25 @@ https://avatars.githubusercontent.com/u/84047264 - - + + - - + + - - + + - - + + - - + + - - + + From 448978a985fb742d6229c161c5c09974256fae28 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 5 Aug 2021 15:46:21 -0300 Subject: [PATCH 147/494] Fix bucketing #82 --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 99c2dadad3..e8565b6786 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -442,7 +442,7 @@ public async Task StartThreadAsync(ulong channelId, StartThreadParams a options = RequestOptions.CreateOrClone(options); - var bucket = new BucketIds(0, channelId); + var bucket = new BucketIds(channelId: channelId); return await SendJsonAsync("POST", () => $"channels/{channelId}/threads", args, bucket, options: options).ConfigureAwait(false); } @@ -453,7 +453,9 @@ public async Task JoinThreadAsync(ulong channelId, RequestOptions options = null options = RequestOptions.CreateOrClone(options); - await SendAsync("PUT", $"channels/{channelId}/thread-members/@me", options: options).ConfigureAwait(false); + var bucket = new BucketIds(channelId: channelId); + + await SendAsync("PUT", () => $"channels/{channelId}/thread-members/@me", bucket, options: options).ConfigureAwait(false); } public async Task AddThreadMemberAsync(ulong channelId, ulong userId, RequestOptions options = null) @@ -474,7 +476,9 @@ public async Task LeaveThreadAsync(ulong channelId, RequestOptions options = nul options = RequestOptions.CreateOrClone(options); - await SendAsync("DELETE", $"channels/{channelId}/thread-members/@me", options: options).ConfigureAwait(false); + var bucket = new BucketIds(channelId: channelId); + + await SendAsync("DELETE", () => $"channels/{channelId}/thread-members/@me", bucket, options: options).ConfigureAwait(false); } public async Task RemoveThreadMemberAsync(ulong channelId, ulong userId, RequestOptions options = null) @@ -483,8 +487,9 @@ public async Task RemoveThreadMemberAsync(ulong channelId, ulong userId, Request Preconditions.NotEqual(userId, 0, nameof(channelId)); options = RequestOptions.CreateOrClone(options); + var bucket = new BucketIds(channelId: channelId); - await SendAsync("DELETE", $"channels/{channelId}/thread-members/{userId}", options: options).ConfigureAwait(false); + await SendAsync("DELETE", () => $"channels/{channelId}/thread-members/{userId}", bucket, options: options).ConfigureAwait(false); } public async Task ListThreadMembersAsync(ulong channelId, RequestOptions options = null) @@ -506,7 +511,7 @@ public async Task GetActiveThreadsAsync(ulong channelId, Request var bucket = new BucketIds(channelId: channelId); - return await SendAsync("GET", $"channels/{channelId}/threads/active"); + return await SendAsync("GET", () => $"channels/{channelId}/threads/active", bucket); } public async Task GetPublicArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, RequestOptions options = null) From 8dce6a6e1f815af3c94bdea43d32f54e439400ec Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 5 Aug 2021 15:51:56 -0300 Subject: [PATCH 148/494] Add single embed message property back for backwards compatibility --- .../Entities/Messages/MessageProperties.cs | 8 +++++ .../Entities/Messages/MessageHelper.cs | 29 +++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs index f4971b69e1..19cfacebe9 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs @@ -18,6 +18,14 @@ public class MessageProperties /// public Optional Content { get; set; } + /// + /// Gets or sets a single embed for this message. + /// + /// + /// This property will be added to the array, in the future please use the array rather then this property. + /// + public Optional Embed { get; set; } + /// /// Gets or sets the embeds of the message. /// diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 5812a73163..83ad2777e8 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -61,10 +61,22 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie } } + var embeds = new List(); + + if (args.Embed.IsSpecified) + { + embeds.Add(args.Embed.Value.ToModel()); + } + + if (args.Embeds.IsSpecified) + { + embeds.AddRange(args.Embeds.Value.Select(x => x.ToModel())); + } + var apiArgs = new ModifyMessageParams { Content = args.Content, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, + Embeds = embeds.ToArray(), Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, Flags = args.Flags, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, @@ -105,12 +117,25 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi } } + var embeds = new List(); + + if (args.Embed.IsSpecified) + { + embeds.Add(args.Embed.Value.ToModel()); + } + + if (args.Embeds.IsSpecified) + { + embeds.AddRange(args.Embeds.Value.Select(x => x.ToModel())); + } + var apiArgs = new API.Rest.ModifyMessageParams { Content = args.Content, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value.Select(x => x.ToModel()).ToArray() : Optional.Create(), + Embeds = embeds.ToArray(), Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); } From 284ec0de0ef6f1d0a63f7d0a9572ff09410ffc14 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 5 Aug 2021 16:05:25 -0300 Subject: [PATCH 149/494] Closes #84 --- .../Entities/Channels/IStageChannel.cs | 45 ++++++++++++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 12 +++++ .../Entities/Channels/RestStageChannel.cs | 46 ++++++++++++++++ .../Entities/Channels/SocketStageChannel.cs | 52 +++++++++++++++++++ 4 files changed, 155 insertions(+) diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index 6f517d100c..e3b51b6141 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -70,6 +70,51 @@ public interface IStageChannel : IVoiceChannel /// Task StopStageAsync(RequestOptions options = null); + /// + /// Indicates that the bot would like to speak within a stage channel. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous request to speak operation. + /// Task RequestToSpeak(RequestOptions options = null); + + /// + /// Makes the current user become a speaker within a stage. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous speaker modify operation. + /// + Task BecomeSpeakerAsync(RequestOptions options = null); + + /// + /// Makes the current user a listener. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous stop operation. + /// + Task StopSpeakingAsync(RequestOptions options = null); + + /// + /// Makes a user a speaker within a stage. + /// + /// The user to make the speaker. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous move operation. + /// + Task MoveToSpeaker(IGuildUser user, RequestOptions options = null); + + /// + /// Removes a user from speaking. + /// + /// The user to remove from speaking. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous remove operation. + /// + Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null); } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index e8565b6786..3e9ed43931 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -646,6 +646,18 @@ public async Task ModifyMyVoiceState(ulong guildId, ModifyVoiceStateParams args, await SendJsonAsync("PATCH", () => $"guilds/{guildId}/voice-states/@me", args, bucket, options: options).ConfigureAwait(false); } + public async Task ModifyUserVoiceState(ulong guildId, ulong userId, ModifyVoiceStateParams args, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + Preconditions.NotEqual(userId, 0, nameof(userId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(); + + await SendJsonAsync("PATCH", () => $"guilds/{guildId}/voice-states/{userId}", args, bucket, options: options).ConfigureAwait(false); + } + // roles public async Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs index 883a080f12..c5bad43dad 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -105,5 +105,51 @@ public Task RequestToSpeak(RequestOptions options = null) }; return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); } + + /// + public Task BecomeSpeakerAsync(RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = false + }; + return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + } + + /// + public Task StopSpeakingAsync(RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = true + }; + return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + } + + /// + public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = false + }; + + return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + } + + /// + public Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = true + }; + + return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index 15e49901ef..fb87a05913 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -27,6 +27,12 @@ public class SocketStageChannel : SocketVoiceChannel, IStageChannel /// public bool Live { get; private set; } = false; + /// + /// Returns if the current user is a speaker within the stage, otherwise . + /// + public bool IsSpeaker + => !Guild.CurrentUser.IsSuppressed; + /// /// Gets a collection of users who are speakers within the stage. /// @@ -112,5 +118,51 @@ public Task RequestToSpeak(RequestOptions options = null) }; return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); } + + /// + public Task BecomeSpeakerAsync(RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = false + }; + return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + } + + /// + public Task StopSpeakingAsync(RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = true + }; + return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + } + + /// + public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = false + }; + + return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + } + + /// + public Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null) + { + var args = new API.Rest.ModifyVoiceStateParams() + { + ChannelId = this.Id, + Suppressed = true + }; + + return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + } } } From b07e92c5738a251e2ea5992d8fa32ade047d99fe Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 5 Aug 2021 16:22:25 -0300 Subject: [PATCH 150/494] Add socket debug --- src/Discord.Net.Core/Discord.Net.Core.xml | 55 +++++++++++++++++++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 12 ++++ .../Discord.Net.WebSocket.csproj | 5 +- .../Discord.Net.WebSocket.xml | 17 ++++++ .../DiscordSocketApiClient.cs | 17 +++++- 5 files changed, 102 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index ca9e9696f9..059d9d16b8 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1978,6 +1978,53 @@ A task that represents the asynchronous stop operation. + + + Indicates that the bot would like to speak within a stage channel. + + The options to be used when sending the request. + + A task that represents the asynchronous request to speak operation. + + + + + Makes the current user become a speaker within a stage. + + The options to be used when sending the request. + + A task that represents the asynchronous speaker modify operation. + + + + + Makes the current user a listener. + + The options to be used when sending the request. + + A task that represents the asynchronous stop operation. + + + + + Makes a user a speaker within a stage. + + The user to make the speaker. + The options to be used when sending the request. + + A task that represents the asynchronous move operation. + + + + + Removes a user from speaking. + + The user to remove from speaking. + The options to be used when sending the request. + + A task that represents the asynchronous remove operation. + + Represents a generic channel in a guild that can send and receive messages. @@ -7550,6 +7597,14 @@ This must be less than the constant defined by . + + + Gets or sets a single embed for this message. + + + This property will be added to the array, in the future please use the array rather then this property. + + Gets or sets the embeds of the message. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index c8865f786d..920e0bf603 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2313,6 +2313,18 @@ + + + + + + + + + + + + Represents a REST-based channel in a guild that can send and receive messages. diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index b61a630328..7014c9d30b 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,4 +1,4 @@ - + @@ -17,9 +17,10 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - + TRACE + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index aac3f2132d..d22c004291 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2189,6 +2189,11 @@ + + + Returns if the current user is a speaker within the stage, otherwise . + + Gets a collection of users who are speakers within the stage. @@ -2206,6 +2211,18 @@ + + + + + + + + + + + + Represents a WebSocket-based channel in a guild that can send and receive messages. diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index 449bf8e040..9221a3faa4 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -75,8 +75,15 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr using (var jsonReader = new JsonTextReader(reader)) { var msg = _serializer.Deserialize(jsonReader); + if (msg != null) + { +#if DEBUG_PACKETS + Console.WriteLine($"<- {msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); +#endif + await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); + } } } }; @@ -87,7 +94,13 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr { var msg = _serializer.Deserialize(jsonReader); if (msg != null) + { +#if DEBUG_PACKETS + Console.WriteLine($"<- {msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); +#endif + await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); + } } }; WebSocketClient.Closed += async ex => @@ -214,8 +227,8 @@ private async Task SendGatewayInternalAsync(GatewayOpCode opCode, object payload await RequestQueue.SendAsync(new WebSocketRequest(WebSocketClient, bytes, true, opCode == GatewayOpCode.Heartbeat, options)).ConfigureAwait(false); await _sentGatewayMessageEvent.InvokeAsync(opCode).ConfigureAwait(false); -#if DEBUG - Console.WriteLine($"Sent {opCode}:\n{SerializeJson(payload)}"); +#if DEBUG_PACKETS + Console.WriteLine($"-> {opCode}:\n{SerializeJson(payload)}"); #endif } From ba9da7b2ca9eb057896549044291662fda19415f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 5 Aug 2021 16:49:22 -0300 Subject: [PATCH 151/494] Add rich presence button --- src/Discord.Net.Rest/API/Common/Game.cs | 2 ++ .../API/Common/RichPresenceButton.cs | 18 ++++++++++++++++++ .../Net/Converters/ArrayConverter.cs | 2 +- .../Discord.Net.WebSocket.csproj | 4 ++-- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/Discord.Net.Rest/API/Common/RichPresenceButton.cs diff --git a/src/Discord.Net.Rest/API/Common/Game.cs b/src/Discord.Net.Rest/API/Common/Game.cs index d3a6186971..294b0c7fdf 100644 --- a/src/Discord.Net.Rest/API/Common/Game.cs +++ b/src/Discord.Net.Rest/API/Common/Game.cs @@ -41,6 +41,8 @@ internal class Game public Optional Emoji { get; set; } [JsonProperty("created_at")] public Optional CreatedAt { get; set; } + [JsonProperty("buttons")] + public Optional Buttons { get; set; } [OnError] internal void OnError(StreamingContext context, ErrorContext errorContext) diff --git a/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs b/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs new file mode 100644 index 0000000000..66f34c82e2 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class RichPresenceButton + { + [JsonProperty("label")] + public string Label { get; set; } + + [JsonProperty("url")] + public string Url { get; set; } + } +} diff --git a/src/Discord.Net.Rest/Net/Converters/ArrayConverter.cs b/src/Discord.Net.Rest/Net/Converters/ArrayConverter.cs index 3cededb7b7..ce2e9b1f72 100644 --- a/src/Discord.Net.Rest/Net/Converters/ArrayConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/ArrayConverter.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; using System; using System.Collections.Generic; diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 7014c9d30b..af17578fbd 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,4 +1,4 @@ - + @@ -18,7 +18,7 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - TRACE + TRACE; From 7c3feadd5f6c4b3ba4d498b523c1bba9593c7044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Fri, 6 Aug 2021 17:56:43 +0200 Subject: [PATCH 152/494] Fix SocketSlashCommandDataOption to use long for Number instead of int (#89) --- .../Slash Commands/SocketSlashCommandDataOption.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index f33008cf31..f9c12257ed 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -86,9 +86,9 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) break; case ApplicationCommandOptionType.Integer: { - if (model.Value.Value is int val) + if (model.Value.Value is long val) this.Value = val; - else if (int.TryParse(model.Value.Value.ToString(), out int res)) + else if (long.TryParse(model.Value.Value.ToString(), out long res)) this.Value = res; } break; @@ -109,7 +109,7 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) } break; } - + } this.Options = model.Options.IsSpecified From 860fd824655bbeee69eca35894a9495fdfbf3860 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Fri, 6 Aug 2021 11:58:37 -0400 Subject: [PATCH 153/494] Application webhooks (#86) * Added webhook components for hooks having an application ID. --- src/Discord.Net.Core/Discord.Net.Core.xml | 5 +++++ src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs | 7 ++++++- src/Discord.Net.Rest/API/Common/Webhook.cs | 2 ++ .../API/Rest/ModifyWebhookMessageParams.cs | 2 ++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 3 +++ src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs | 4 ++++ src/Discord.Net.Rest/Extensions/EntityExtensions.cs | 1 + src/Discord.Net.Webhook/Discord.Net.Webhook.xml | 7 ++++++- src/Discord.Net.Webhook/DiscordWebhookClient.cs | 4 ++-- .../Entities/Messages/WebhookMessageProperties.cs | 4 ++++ .../Entities/Webhooks/RestInternalWebhook.cs | 3 +++ src/Discord.Net.Webhook/WebhookClientHelper.cs | 7 +++++-- 12 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index ca9e9696f9..13bbc8eb56 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -10089,6 +10089,11 @@ Gets the user that created this webhook. + + + Gets the ID of the application owning this webhook. + + Modifies this webhook. diff --git a/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs b/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs index b2d017316f..d5bc70d71e 100644 --- a/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs +++ b/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; namespace Discord @@ -49,6 +49,11 @@ public interface IWebhook : IDeletable, ISnowflakeEntity /// IUser Creator { get; } + /// + /// Gets the ID of the application owning this webhook. + /// + ulong? ApplicationId { get; } + /// /// Modifies this webhook. /// diff --git a/src/Discord.Net.Rest/API/Common/Webhook.cs b/src/Discord.Net.Rest/API/Common/Webhook.cs index cbd5fdad55..ff1dca9bd4 100644 --- a/src/Discord.Net.Rest/API/Common/Webhook.cs +++ b/src/Discord.Net.Rest/API/Common/Webhook.cs @@ -21,5 +21,7 @@ internal class Webhook [JsonProperty("user")] public Optional Creator { get; set; } + [JsonProperty("application_id")] + public Optional ApplicationId { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs index ba8fcbb4e1..8298ff19c8 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs @@ -12,5 +12,7 @@ internal class ModifyWebhookMessageParams public Optional Embeds { get; set; } [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } + [JsonProperty("components")] + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index c8865f786d..e92b92725b 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4766,6 +4766,9 @@ + + + diff --git a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs index 9baddf003d..0d24f08dfd 100644 --- a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs +++ b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs @@ -24,6 +24,8 @@ public class RestWebhook : RestEntity, IWebhook, IUpdateable public ulong? GuildId { get; private set; } /// public IUser Creator { get; private set; } + /// + public ulong? ApplicationId { get; private set; } /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -66,6 +68,8 @@ internal void Update(Model model) GuildId = model.GuildId.Value; if (model.Name.IsSpecified) Name = model.Name.Value; + if (model.ApplicationId.IsSpecified) + ApplicationId = model.ApplicationId.Value; } /// diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs index f8676c7834..0c2e0f8c25 100644 --- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs @@ -68,6 +68,7 @@ public static API.Embed ToModel(this Embed entity) model.Video = entity.Video.Value.ToModel(); return model; } + public static API.AllowedMentions ToModel(this AllowedMentions entity) { return new API.AllowedMentions() diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml index f629c2c29b..d1bafb9a37 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml @@ -31,7 +31,7 @@ Thrown if the is an invalid format. Thrown if the is null or whitespace. - + Sends a message to the channel for this webhook. Returns the ID of the created message. @@ -99,6 +99,11 @@ Gets or sets the allowed mentions of the message. + + + Gets or sets the components that the message should display. + + Could not find a webhook with the supplied credentials. diff --git a/src/Discord.Net.Webhook/DiscordWebhookClient.cs b/src/Discord.Net.Webhook/DiscordWebhookClient.cs index 91d0774114..d4affb08ba 100644 --- a/src/Discord.Net.Webhook/DiscordWebhookClient.cs +++ b/src/Discord.Net.Webhook/DiscordWebhookClient.cs @@ -88,8 +88,8 @@ private static API.DiscordRestApiClient CreateApiClient(DiscordRestConfig config /// Sends a message to the channel for this webhook. /// Returns the ID of the created message. public Task SendMessageAsync(string text = null, bool isTTS = false, IEnumerable embeds = null, - string username = null, string avatarUrl = null, RequestOptions options = null, AllowedMentions allowedMentions = null) - => WebhookClientHelper.SendMessageAsync(this, text, isTTS, embeds, username, avatarUrl, allowedMentions, options); + string username = null, string avatarUrl = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageComponent component = null) + => WebhookClientHelper.SendMessageAsync(this, text, isTTS, embeds, username, avatarUrl, allowedMentions, options, component); /// /// Modifies a message posted using this webhook. diff --git a/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs b/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs index dec7b6e3b4..ca2ff10a00 100644 --- a/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs +++ b/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs @@ -22,5 +22,9 @@ public class WebhookMessageProperties /// Gets or sets the allowed mentions of the message. /// public Optional AllowedMentions { get; set; } + /// + /// Gets or sets the components that the message should display. + /// + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs index bbb160fcd5..210d8eda06 100644 --- a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs +++ b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs @@ -17,6 +17,7 @@ internal class RestInternalWebhook : IWebhook public string Name { get; private set; } public string AvatarId { get; private set; } public ulong? GuildId { get; private set; } + public ulong? ApplicationId { get; private set; } public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -44,6 +45,8 @@ internal void Update(Model model) GuildId = model.GuildId.Value; if (model.Name.IsSpecified) Name = model.Name.Value; + if (model.ApplicationId.IsSpecified) + ApplicationId = model.ApplicationId.Value; } public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) diff --git a/src/Discord.Net.Webhook/WebhookClientHelper.cs b/src/Discord.Net.Webhook/WebhookClientHelper.cs index 528848f7f8..6e3651323b 100644 --- a/src/Discord.Net.Webhook/WebhookClientHelper.cs +++ b/src/Discord.Net.Webhook/WebhookClientHelper.cs @@ -21,7 +21,7 @@ public static async Task GetWebhookAsync(DiscordWebhookClie return RestInternalWebhook.Create(client, model); } public static async Task SendMessageAsync(DiscordWebhookClient client, - string text, bool isTTS, IEnumerable embeds, string username, string avatarUrl, AllowedMentions allowedMentions, RequestOptions options) + string text, bool isTTS, IEnumerable embeds, string username, string avatarUrl, AllowedMentions allowedMentions, RequestOptions options, MessageComponent component) { var args = new CreateWebhookMessageParams { @@ -37,6 +37,8 @@ public static async Task SendMessageAsync(DiscordWebhookClient client, args.AvatarUrl = avatarUrl; if (allowedMentions != null) args.AllowedMentions = allowedMentions.ToModel(); + if (component != null) + args.Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray(); var model = await client.ApiClient.CreateWebhookMessageAsync(client.Webhook.Id, args, options: options).ConfigureAwait(false); return model.Id; @@ -83,7 +85,8 @@ public static async Task ModifyMessageAsync(DiscordWebhookClient client, ulong m : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() - : Optional.Create() + : Optional.Create(), + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; await client.ApiClient.ModifyWebhookMessageAsync(client.Webhook.Id, messageId, apiArgs, options) From 75892660d0412e2f875342246d6d4e4a69fb1fee Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 6 Aug 2021 13:09:34 -0300 Subject: [PATCH 154/494] resolved #88 --- .../API/Common/InteractionCallbackData.cs | 2 +- .../API/Rest/CreateWebhookMessageParams.cs | 2 +- .../Discord.Net.WebSocket.xml | 23 ++++++------------- .../SocketMessageComponent.cs | 18 ++++++--------- .../Slash Commands/SocketSlashCommand.cs | 14 ++++------- .../Entities/Interaction/SocketInteraction.cs | 6 +++-- 6 files changed, 25 insertions(+), 40 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index f03cb88701..ba233cc6b7 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -18,7 +18,7 @@ internal class InteractionCallbackData // New flags prop. this make the response "ephemeral". see https://discord.com/developers/docs/interactions/slash-commands#interaction-response-interactionapplicationcommandcallbackdata [JsonProperty("flags")] - public Optional Flags { get; set; } + public Optional Flags { get; set; } [JsonProperty("components")] public Optional Components { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index bd4cc1a6c1..1806d487c5 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -28,7 +28,7 @@ internal class CreateWebhookMessageParams public Optional AllowedMentions { get; set; } [JsonProperty("flags")] - public Optional Flags { get; set; } + public Optional Flags { get; set; } [JsonProperty("components")] public Optional Components { get; set; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index d22c004291..576fcc5f0c 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3628,14 +3628,8 @@ - - - Acknowledges this interaction with the . - - The request options for this async request. - - A task that represents the asynchronous operation of acknowledging the interaction. - + + @@ -3747,13 +3741,8 @@ - - - Acknowledges this interaction with the . - - - A task that represents the asynchronous operation of acknowledging the interaction. - + + @@ -3888,10 +3877,12 @@ A task that represents the asynchronous operation of acknowledging the interaction. - + Acknowledges this interaction. + to send this message ephemerally, otherwise . + The request options for this async request. A task that represents the asynchronous operation of acknowledging the interaction. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 921f81de4a..a31b30f5f9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -123,7 +123,7 @@ public override async Task RespondAsync( }; if (ephemeral) - response.Data.Value.Flags = 64; + response.Data.Value.Flags = MessageFlags.Ephemeral; await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); } @@ -180,7 +180,7 @@ public async Task UpdateAsync(Action func, RequestOptions opt Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, - Flags = args.Flags.IsSpecified ? (int?)args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified + Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified } }; @@ -217,23 +217,19 @@ public override async Task FollowupAsync( }; if (ephemeral) - args.Flags = 64; + args.Flags = MessageFlags.Ephemeral; return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } - /// - /// Acknowledges this interaction with the . - /// - /// The request options for this async request. - /// - /// A task that represents the asynchronous operation of acknowledging the interaction. - /// - public override Task DeferAsync(RequestOptions options = null) + /// + public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { var response = new API.InteractionResponse() { Type = InteractionResponseType.DeferredUpdateMessage, + Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified + }; return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 2452746139..bff5292c57 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -106,7 +106,7 @@ public override async Task RespondAsync( }; if (ephemeral) - response.Data.Value.Flags = 64; + response.Data.Value.Flags = MessageFlags.Ephemeral; await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); } @@ -141,22 +141,18 @@ public override async Task FollowupAsync( }; if (ephemeral) - args.Flags = 64; + args.Flags = MessageFlags.Ephemeral; return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } - /// - /// Acknowledges this interaction with the . - /// - /// - /// A task that represents the asynchronous operation of acknowledging the interaction. - /// - public override Task DeferAsync(RequestOptions options = null) + /// + public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, + Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified }; return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 4b2e3baecf..11145fa2ba 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -156,15 +156,17 @@ public async Task ModifyOriginalResponseAsync(Action [Obsolete("This method deprecated, please use DeferAsync instead")] - public Task AcknowledgeAsync(RequestOptions options = null) => DeferAsync(options); + public Task AcknowledgeAsync(RequestOptions options = null) => DeferAsync(options: options); /// /// Acknowledges this interaction. /// + /// to send this message ephemerally, otherwise . + /// The request options for this async request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public abstract Task DeferAsync(RequestOptions options = null); + public abstract Task DeferAsync(bool ephemeral = false, RequestOptions options = null); private bool CheckToken() { From afd9600af2ed4846d1c04b54a5b7eec257940086 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 6 Aug 2021 13:21:23 -0300 Subject: [PATCH 155/494] resolved #85 --- .../SocketMessageComponent.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index a31b30f5f9..7e21f6043b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -213,7 +213,7 @@ public override async Task FollowupAsync( AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, }; if (ephemeral) @@ -222,6 +222,26 @@ public override async Task FollowupAsync( return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } + /// + /// Defers an interaction and responds with type 5 () + /// + /// to send this message ephemerally, otherwise . + /// The request options for this async request. + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = null) + { + var response = new API.InteractionResponse() + { + Type = InteractionResponseType.DeferredChannelMessageWithSource, + Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified + + }; + + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + } + /// public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { From 26c65280ef7e2d6265725da877fb09c1a66bde80 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 6 Aug 2021 13:28:36 -0300 Subject: [PATCH 156/494] Update device for gateway --- src/Discord.Net.WebSocket/DiscordSocketApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index 9221a3faa4..a862b57783 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -237,7 +237,7 @@ public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, i options = RequestOptions.CreateOrClone(options); var props = new Dictionary { - ["$device"] = "Discord.Net" + ["$device"] = "Discord.Net Labs" }; var msg = new IdentifyParams() { From 505c39a3f096e17ef7f87be148c7942d29933b5f Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Fri, 6 Aug 2021 19:46:33 -0500 Subject: [PATCH 157/494] Fix MessageProperties.Embed being ignored in some methods that modifies a message (#92) --- src/Discord.Net.Core/Discord.Net.Core.xml | 2 +- .../Entities/Messages/MessageProperties.cs | 2 +- .../Interactions/InteractionHelper.cs | 49 +++++++++++++++++-- .../Entities/Messages/MessageHelper.cs | 45 +++++++++++------ .../SocketMessageComponent.cs | 33 ++++++++++--- 5 files changed, 104 insertions(+), 27 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 059d9d16b8..0510de74af 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -7602,7 +7602,7 @@ Gets or sets a single embed for this message. - This property will be added to the array, in the future please use the array rather then this property. + This property will be added to the array, in the future please use the array rather than this property. diff --git a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs index 19cfacebe9..abd09d8562 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs @@ -22,7 +22,7 @@ public class MessageProperties /// Gets or sets a single embed for this message. /// /// - /// This property will be added to the array, in the future please use the array rather then this property. + /// This property will be added to the array, in the future please use the array rather than this property. /// public Optional Embed { get; set; } diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index e4df0d75e6..7ed48a04da 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -296,15 +296,33 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil var args = new MessageProperties(); func(args); + var embed = args.Embed; + var embeds = args.Embeds; + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(message.Content); - bool hasEmbed = args.Embeds.IsSpecified ? args.Embeds.Value != null : message.Embeds.Any(); - if (!hasText && !hasEmbed) + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || message.Embeds.Any(); + + if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; + + if (embed.IsSpecified && embed.Value != null) + { + apiEmbeds.Add(embed.Value.ToModel()); + } + + if (embeds.IsSpecified && embeds.Value != null) + { + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); + } + + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new API.Rest.ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value.Select(x => x.ToModel()).ToArray() : Optional.Create(), + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; @@ -321,10 +339,33 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl var args = new MessageProperties(); func(args); + var embed = args.Embed; + var embeds = args.Embeds; + + bool hasText = !string.IsNullOrEmpty(args.Content.GetValueOrDefault()); + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0); + + if (!hasText && !hasEmbeds) + Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; + + if (embed.IsSpecified && embed.Value != null) + { + apiEmbeds.Add(embed.Value.ToModel()); + } + + if (embeds.IsSpecified && embeds.Value != null) + { + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); + } + + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value?.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, Flags = args.Flags diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 83ad2777e8..9546025b00 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -1,3 +1,4 @@ +using Discord.API; using Discord.API.Rest; using System; using System.Collections.Generic; @@ -33,9 +34,13 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie if (msg.Author.Id != client.CurrentUser.Id && (args.Content.IsSpecified || args.Embeds.IsSpecified || args.AllowedMentions.IsSpecified)) throw new InvalidOperationException("Only the author of a message may modify the message content, embed, or allowed mentions."); + var embed = args.Embed; + var embeds = args.Embeds; + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(msg.Content); - bool hasEmbed = args.Embeds.IsSpecified ? args.Embeds.Value != null : msg.Embeds.Any(); - if (!hasText && !hasEmbed) + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || msg.Embeds.Any(); + + if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); if (args.AllowedMentions.IsSpecified) @@ -61,22 +66,24 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie } } - var embeds = new List(); + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; - if (args.Embed.IsSpecified) + if (embed.IsSpecified && embed.Value != null) { - embeds.Add(args.Embed.Value.ToModel()); + apiEmbeds.Add(embed.Value.ToModel()); } - if (args.Embeds.IsSpecified) + if (embeds.IsSpecified && embeds.Value != null) { - embeds.AddRange(args.Embeds.Value.Select(x => x.ToModel())); + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); } + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new ModifyMessageParams { Content = args.Content, - Embeds = embeds.ToArray(), + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, Flags = args.Flags, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, @@ -90,7 +97,13 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi var args = new MessageProperties(); func(args); - if (args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value) && args.Embeds.IsSpecified && args.Embeds.Value == null) + var embed = args.Embed; + var embeds = args.Embeds; + + bool hasText = args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value); + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0); + + if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); if (args.AllowedMentions.IsSpecified) @@ -117,22 +130,24 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi } } - var embeds = new List(); + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; - if (args.Embed.IsSpecified) + if (embed.IsSpecified && embed.Value != null) { - embeds.Add(args.Embed.Value.ToModel()); + apiEmbeds.Add(embed.Value.ToModel()); } - if (args.Embeds.IsSpecified) + if (embeds.IsSpecified && embeds.Value != null) { - embeds.AddRange(args.Embeds.Value.Select(x => x.ToModel())); + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); } + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new API.Rest.ModifyMessageParams { Content = args.Content, - Embeds = embeds.ToArray(), + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 7e21f6043b..cc91b098f2 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -4,12 +4,13 @@ using Model = Discord.API.Interaction; using DataModel = Discord.API.MessageComponentInteractionData; using Discord.Rest; +using System.Collections.Generic; namespace Discord.WebSocket { - /// - /// Represents a Websocket-based interaction type for Message Components. - /// +/// +/// Represents a Websocket-based interaction type for Message Components. +/// public class SocketMessageComponent : SocketInteraction { /// @@ -149,8 +150,28 @@ public async Task UpdateAsync(Action func, RequestOptions opt Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); } - if (args.Embeds.IsSpecified) - Preconditions.AtMost(args.Embeds.Value?.Length ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var embed = args.Embed; + var embeds = args.Embeds; + + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(Message.Content); + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || Message.Embeds.Any(); + + if (!hasText && !hasEmbeds) + Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; + + if (embed.IsSpecified && embed.Value != null) + { + apiEmbeds.Add(embed.Value.ToModel()); + } + + if (embeds.IsSpecified && embeds.Value != null) + { + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); + } + + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (args.AllowedMentions.IsSpecified && args.AllowedMentions.Value != null && args.AllowedMentions.Value.AllowedTypes.HasValue) @@ -176,7 +197,7 @@ public async Task UpdateAsync(Action func, RequestOptions opt { Content = args.Content, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value?.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, From ea75a6df2c251b7ca34d5b3d8dfa9d71950f00d3 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Fri, 6 Aug 2021 20:46:41 -0400 Subject: [PATCH 158/494] Update label/description lengths for selects (ref: https://github.com/discord/discord-api-docs/pull/3598/files) (#91) https://github.com/discord/discord-api-docs/pull/3598/files --- .../Message Components/ComponentBuilder.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index bb2f80a813..8d4a710ea5 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -13,7 +13,7 @@ public class ComponentBuilder /// /// The max length of a . /// - public const int MaxLabelLength = 80; + public const int MaxButtonLabelLength = 80; /// /// The max length of a . @@ -310,14 +310,14 @@ public class ButtonBuilder /// /// Gets or sets the label of the current button. /// - /// length exceeds . + /// length exceeds . public string Label { get => _label; set { - if (value != null && value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value != null && value.Length > ComponentBuilder.MaxButtonLabelLength) + throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxButtonLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } @@ -834,20 +834,25 @@ public class SelectMenuOptionBuilder /// /// The maximum length of a . /// - public const int MaxDescriptionLength = 50; + public const int MaxDescriptionLength = 100; + + /// + /// The maximum length of a . + /// + public const int MaxSelectLabelLength = 100; /// /// Gets or sets the label of the current select menu. /// - /// length exceeds + /// length exceeds public string Label { get => _label; set { if (value != null) - if (value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value.Length > MaxSelectLabelLength) + throw new ArgumentException(message: $"Button label must be {MaxSelectLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } From e6efead6a1c60e9cbc31f4ac5bd3dfb2c9b98ddd Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Fri, 6 Aug 2021 19:46:58 -0500 Subject: [PATCH 159/494] Fix tests (#90) --- test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs index 137dc55752..bb841fd1bc 100644 --- a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs @@ -91,7 +91,7 @@ void AssertFlag(Func cstr, GuildPermission flag) AssertFlag(() => new GuildPermissions(manageNicknames: true), GuildPermission.ManageNicknames); AssertFlag(() => new GuildPermissions(manageRoles: true), GuildPermission.ManageRoles); AssertFlag(() => new GuildPermissions(manageWebhooks: true), GuildPermission.ManageWebhooks); - AssertFlag(() => new GuildPermissions(manageEmojis: true), GuildPermission.ManageEmojis); + AssertFlag(() => new GuildPermissions(manageEmojis: true), GuildPermission.ManageEmojisAndStickers); } /// @@ -161,7 +161,7 @@ void AssertUtil(GuildPermission permission, AssertUtil(GuildPermission.ManageNicknames, x => x.ManageNicknames, (p, enable) => p.Modify(manageNicknames: enable)); AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); - AssertUtil(GuildPermission.ManageEmojis, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojis: enable)); + AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojis: enable)); } } } From 152a6c7b56f5ef0b109e89c48ea226f6c9b763af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 7 Aug 2021 20:56:52 +0200 Subject: [PATCH 160/494] Fix gateway serialization to include nulls (#96) --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 3e9ed43931..5535f4e5c5 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -55,7 +55,7 @@ public DiscordRestApiClient(RestClientProvider restClientProvider, string userAg _restClientProvider = restClientProvider; UserAgent = userAgent; DefaultRetryMode = defaultRetryMode; - _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver(), NullValueHandling = NullValueHandling.Ignore }; + _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver(), NullValueHandling = NullValueHandling.Include }; UseSystemClock = useSystemClock; RequestQueue = new RequestQueue(); From 7a232b22fe626fd530347689612f46ec08748e05 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Sat, 7 Aug 2021 14:57:07 -0400 Subject: [PATCH 161/494] Add missing guild permissions (#93) * Update GuildPermissions.cs * Update GuildPermissionsTests.cs --- .../Entities/Permissions/GuildPermissions.cs | 55 +++++++++++++++++-- .../GuildPermissionsTests.cs | 16 +++++- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 1914a6f86b..9503e5b3bd 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -81,8 +81,20 @@ public struct GuildPermissions public bool ManageRoles => Permissions.GetValue(RawValue, GuildPermission.ManageRoles); /// If true, a user may edit the webhooks for this guild. public bool ManageWebhooks => Permissions.GetValue(RawValue, GuildPermission.ManageWebhooks); - /// If true, a user may edit the emojis for this guild. + /// If true, a user may edit the emojis and stickers for this guild. public bool ManageEmojisAndStickers => Permissions.GetValue(RawValue, GuildPermission.ManageEmojisAndStickers); + /// If true, a user may use slash commands in this guild. + public bool UseSlashCommands => Permissions.GetValue(RawValue, GuildPermission.UseSlashCommands); + /// If true, a user may request to speak in stage channels. + public bool RequestToSpeak => Permissions.GetValue(RawValue, GuildPermission.RequestToSpeak); + /// If true, a user may manage threads in this guild. + public bool ManageThreads => Permissions.GetValue(RawValue, GuildPermission.ManageThreads); + /// If true, a user may create public threads in this guild. + public bool UsePublicThreads => Permissions.GetValue(RawValue, GuildPermission.UsePublicThreads); + /// If true, a user may create private threads in this guild. + public bool UsePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.UsePrivateThreads); + /// If true, a user may use external stickers in this guild. + public bool UseExternalStickers => Permissions.GetValue(RawValue, GuildPermission.UseExternalStickers); /// Creates a new with the provided packed value. public GuildPermissions(ulong rawValue) { RawValue = rawValue; } @@ -121,7 +133,13 @@ private GuildPermissions(ulong initialValue, bool? manageNicknames = null, bool? manageRoles = null, bool? manageWebhooks = null, - bool? manageEmojisAndStickers = null) + bool? manageEmojisAndStickers = null, + bool? useSlashCommands = null, + bool? requestToSpeak = null, + bool? manageThreads = null, + bool? usePublicThreads = null, + bool? usePrivateThreads = null, + bool? useExternalStickers = null) { ulong value = initialValue; @@ -156,6 +174,12 @@ private GuildPermissions(ulong initialValue, Permissions.SetValue(ref value, manageRoles, GuildPermission.ManageRoles); Permissions.SetValue(ref value, manageWebhooks, GuildPermission.ManageWebhooks); Permissions.SetValue(ref value, manageEmojisAndStickers, GuildPermission.ManageEmojisAndStickers); + Permissions.SetValue(ref value, useSlashCommands, GuildPermission.UseSlashCommands); + Permissions.SetValue(ref value, requestToSpeak, GuildPermission.RequestToSpeak); + Permissions.SetValue(ref value, manageThreads, GuildPermission.ManageThreads); + Permissions.SetValue(ref value, usePublicThreads, GuildPermission.UsePublicThreads); + Permissions.SetValue(ref value, usePrivateThreads, GuildPermission.UseExternalStickers); + Permissions.SetValue(ref value, useExternalStickers, GuildPermission.UseExternalStickers); RawValue = value; } @@ -192,7 +216,13 @@ public GuildPermissions( bool manageNicknames = false, bool manageRoles = false, bool manageWebhooks = false, - bool manageEmojis = false) + bool manageEmojisAndStickers = false, + bool useSlashCommands = false, + bool requestToSpeak = false, + bool manageThreads = false, + bool usePublicThreads = false, + bool usePrivateThreads = false, + bool useExternalStickers = false) : this(0, createInstantInvite: createInstantInvite, manageRoles: manageRoles, @@ -224,7 +254,13 @@ public GuildPermissions( changeNickname: changeNickname, manageNicknames: manageNicknames, manageWebhooks: manageWebhooks, - manageEmojisAndStickers: manageEmojis) + manageEmojisAndStickers: manageEmojisAndStickers, + useSlashCommands: useSlashCommands, + requestToSpeak: requestToSpeak, + manageThreads: manageThreads, + usePublicThreads: usePublicThreads, + usePrivateThreads: usePrivateThreads, + useExternalStickers: useExternalStickers) { } /// Creates a new from this one, changing the provided non-null permissions. @@ -259,11 +295,18 @@ public GuildPermissions Modify( bool? manageNicknames = null, bool? manageRoles = null, bool? manageWebhooks = null, - bool? manageEmojis = null) + bool? manageEmojisAndStickers = null, + bool? useSlashCommands = null, + bool? requestToSpeak = null, + bool? manageThreads = null, + bool? usePublicThreads = null, + bool? usePrivateThreads = null, + bool? useExternalStickers = null) => new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions, viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, - useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojis); + useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers, + useSlashCommands, requestToSpeak, manageThreads, usePublicThreads, usePrivateThreads, useExternalStickers); /// /// Returns a value that indicates if a specific is enabled diff --git a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs index 137dc55752..9be109c6e5 100644 --- a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs @@ -91,7 +91,13 @@ void AssertFlag(Func cstr, GuildPermission flag) AssertFlag(() => new GuildPermissions(manageNicknames: true), GuildPermission.ManageNicknames); AssertFlag(() => new GuildPermissions(manageRoles: true), GuildPermission.ManageRoles); AssertFlag(() => new GuildPermissions(manageWebhooks: true), GuildPermission.ManageWebhooks); - AssertFlag(() => new GuildPermissions(manageEmojis: true), GuildPermission.ManageEmojis); + AssertFlag(() => new GuildPermissions(manageEmojisAndStickers: true), GuildPermission.ManageEmojisAndStickers); + AssertFlag(() => new GuildPermissions(useSlashCommands: true), GuildPermission.UseSlashCommands); + AssertFlag(() => new GuildPermissions(requestToSpeak: true), GuildPermission.RequestToSpeak); + AssertFlag(() => new GuildPermissions(manageThreads: true), GuildPermission.ManageThreads); + AssertFlag(() => new GuildPermissions(usePublicThreads: true), GuildPermission.UsePublicThreads); + AssertFlag(() => new GuildPermissions(usePrivateThreads: true), GuildPermission.UsePrivateThreads); + AssertFlag(() => new GuildPermissions(useExternalStickers: true), GuildPermission.UseExternalStickers); } /// @@ -161,7 +167,13 @@ void AssertUtil(GuildPermission permission, AssertUtil(GuildPermission.ManageNicknames, x => x.ManageNicknames, (p, enable) => p.Modify(manageNicknames: enable)); AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); - AssertUtil(GuildPermission.ManageEmojis, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojis: enable)); + AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojisAndStickers: enable)); + AssertUtil(GuildPermission.UseSlashCommands, x => x.UseSlashCommands, (p, enable) => p.Modify(useSlashCommands: enable)); + AssertUtil(GuildPermission.RequestToSpeak, x => x.RequestToSpeak, (p, enable) => p.Modify(requestToSpeak: enable)); + AssertUtil(GuildPermission.ManageThreads, x => x.ManageThreads, (p, enable) => p.Modify(manageThreads: enable)); + AssertUtil(GuildPermission.UsePublicThreads, x => x.UsePublicThreads, (p, enable) => p.Modify(usePublicThreads: enable)); + AssertUtil(GuildPermission.UsePrivateThreads, x => x.UsePrivateThreads, (p, enable) => p.Modify(usePrivateThreads: enable)); + AssertUtil(GuildPermission.UseExternalStickers, x => x.UseExternalStickers, (p, enable) => p.Modify(useExternalStickers: enable)); } } } From af9519b0f57e511d15aae0dd26d922d8b3f1cecd Mon Sep 17 00:00:00 2001 From: Nikon <47792796+INikonI@users.noreply.github.com> Date: Sat, 7 Aug 2021 23:57:53 +0500 Subject: [PATCH 162/494] Add banner and accent color to user and some fixes/improvements (#81) * Add banner and accent color to user and some fixes * Fix * Fix! * increase size of user banners to 256 * Some changes and mini refactor of color class * add constant maxDecimalValue to color and checks with exceptions * add `NotSupportedException` for `BannerId` and `AccentColor` in `SocketWebhookUser` * Update ComponentBuilder.cs - `MaxLabelLength` from `ComponentBuilder` moved to `ButtonBuilder` - Added `MaxLabelLength` for `SelectMenuOptionBuilder` - Changed `MaxDescriptionLength` to 100 --- src/Discord.Net.Core/CDN.cs | 18 ++++ .../Message Components/ComponentBuilder.cs | 33 +++--- .../Entities/Permissions/GuildPermissions.cs | 8 +- src/Discord.Net.Core/Entities/Roles/Color.cs | 101 ++++++++++-------- src/Discord.Net.Core/Entities/Users/IUser.cs | 32 +++++- src/Discord.Net.Rest/API/Common/User.cs | 4 + .../Entities/Users/RestThreadUser.cs | 4 +- .../Entities/Users/RestUser.cs | 12 +++ .../Entities/Users/SocketGlobalUser.cs | 4 +- .../Entities/Users/SocketGroupUser.cs | 4 + .../Entities/Users/SocketGuildUser.cs | 7 +- .../Entities/Users/SocketSelfUser.cs | 4 + .../Entities/Users/SocketThreadUser.cs | 16 ++- .../Entities/Users/SocketUnknownUser.cs | 9 +- .../Entities/Users/SocketUser.cs | 18 ++++ .../Entities/Users/SocketWebhookUser.cs | 17 +++ .../GuildPermissionsTests.cs | 4 +- 17 files changed, 222 insertions(+), 73 deletions(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index e1e8e5e1a4..b1879eebc1 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -46,6 +46,24 @@ public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size string extension = FormatToExtension(format, avatarId); return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}"; } + + /// + /// Returns a user banner URL. + /// + /// The user snowflake identifier. + /// The banner identifier. + /// The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. + /// The format to return. + /// + /// A URL pointing to the user's banner in the specified size. + /// + public static string GetUserBannerUrl(ulong userId, string bannerId, ushort size, ImageFormat format) + { + if (bannerId == null) + return null; + string extension = FormatToExtension(format, bannerId); + return $"{DiscordConfig.CDNUrl}banners/{userId}/{bannerId}.{extension}?size={size}"; + } /// /// Returns the default user avatar URL. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index bb2f80a813..4027db4088 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -10,11 +10,6 @@ namespace Discord /// public class ComponentBuilder { - /// - /// The max length of a . - /// - public const int MaxLabelLength = 80; - /// /// The max length of a . /// @@ -307,17 +302,22 @@ internal bool CanTakeComponent(IMessageComponent component) /// public class ButtonBuilder { + /// + /// The max length of a . + /// + public const int MaxLabelLength = 80; + /// /// Gets or sets the label of the current button. /// - /// length exceeds . + /// length exceeds . public string Label { get => _label; set { - if (value != null && value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value != null && value.Length > MaxLabelLength) + throw new ArgumentException(message: $"Button label must be {MaxLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } @@ -539,8 +539,8 @@ public ButtonComponent Build() if (string.IsNullOrEmpty(this.Url)) throw new InvalidOperationException("Link buttons must have a link associated with them"); else - UrlValidation.Validate(this.Url); - } + UrlValidation.Validate(this.Url); + } else if (string.IsNullOrEmpty(this.CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); @@ -831,23 +831,28 @@ public SelectMenu Build() /// public class SelectMenuOptionBuilder { + /// + /// The maximum length of a . + /// + public const int MaxLabelLength = 100; + /// /// The maximum length of a . /// - public const int MaxDescriptionLength = 50; + public const int MaxDescriptionLength = 100; /// /// Gets or sets the label of the current select menu. /// - /// length exceeds + /// length exceeds public string Label { get => _label; set { if (value != null) - if (value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value.Length > MaxLabelLength) + throw new ArgumentException(message: $"Button label must be {MaxLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 1914a6f86b..d152976275 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -192,7 +192,7 @@ public GuildPermissions( bool manageNicknames = false, bool manageRoles = false, bool manageWebhooks = false, - bool manageEmojis = false) + bool manageEmojisAndStickers = false) : this(0, createInstantInvite: createInstantInvite, manageRoles: manageRoles, @@ -224,7 +224,7 @@ public GuildPermissions( changeNickname: changeNickname, manageNicknames: manageNicknames, manageWebhooks: manageWebhooks, - manageEmojisAndStickers: manageEmojis) + manageEmojisAndStickers: manageEmojisAndStickers) { } /// Creates a new from this one, changing the provided non-null permissions. @@ -259,11 +259,11 @@ public GuildPermissions Modify( bool? manageNicknames = null, bool? manageRoles = null, bool? manageWebhooks = null, - bool? manageEmojis = null) + bool? manageEmojisAndStickers = null) => new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions, viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, - useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojis); + useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers); /// /// Returns a value that indicates if a specific is enabled diff --git a/src/Discord.Net.Core/Entities/Roles/Color.cs b/src/Discord.Net.Core/Entities/Roles/Color.cs index 7c2d152a4d..ee50710e8e 100644 --- a/src/Discord.Net.Core/Entities/Roles/Color.cs +++ b/src/Discord.Net.Core/Entities/Roles/Color.cs @@ -10,68 +10,70 @@ namespace Discord [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public struct Color { + /// Gets the max decimal value of color. + public const uint MaxDecimalValue = 0xFFFFFF; /// Gets the default user color value. - public static readonly Color Default = new Color(0); + public static readonly Color Default = new(0); /// Gets the teal color value. /// A color struct with the hex value of 1ABC9C. - public static readonly Color Teal = new Color(0x1ABC9C); + public static readonly Color Teal = new(0x1ABC9C); /// Gets the dark teal color value. /// A color struct with the hex value of 11806A. - public static readonly Color DarkTeal = new Color(0x11806A); + public static readonly Color DarkTeal = new(0x11806A); /// Gets the green color value. /// A color struct with the hex value of 2ECC71. - public static readonly Color Green = new Color(0x2ECC71); + public static readonly Color Green = new(0x2ECC71); /// Gets the dark green color value. /// A color struct with the hex value of 1F8B4C. - public static readonly Color DarkGreen = new Color(0x1F8B4C); + public static readonly Color DarkGreen = new(0x1F8B4C); /// Gets the blue color value. /// A color struct with the hex value of 3498DB. - public static readonly Color Blue = new Color(0x3498DB); + public static readonly Color Blue = new(0x3498DB); /// Gets the dark blue color value. /// A color struct with the hex value of 206694. - public static readonly Color DarkBlue = new Color(0x206694); + public static readonly Color DarkBlue = new(0x206694); /// Gets the purple color value. /// A color struct with the hex value of 9B59B6. - public static readonly Color Purple = new Color(0x9B59B6); + public static readonly Color Purple = new(0x9B59B6); /// Gets the dark purple color value. /// A color struct with the hex value of 71368A. - public static readonly Color DarkPurple = new Color(0x71368A); + public static readonly Color DarkPurple = new(0x71368A); /// Gets the magenta color value. /// A color struct with the hex value of E91E63. - public static readonly Color Magenta = new Color(0xE91E63); + public static readonly Color Magenta = new(0xE91E63); /// Gets the dark magenta color value. /// A color struct with the hex value of AD1457. - public static readonly Color DarkMagenta = new Color(0xAD1457); + public static readonly Color DarkMagenta = new(0xAD1457); /// Gets the gold color value. /// A color struct with the hex value of F1C40F. - public static readonly Color Gold = new Color(0xF1C40F); + public static readonly Color Gold = new(0xF1C40F); /// Gets the light orange color value. /// A color struct with the hex value of C27C0E. - public static readonly Color LightOrange = new Color(0xC27C0E); + public static readonly Color LightOrange = new(0xC27C0E); /// Gets the orange color value. /// A color struct with the hex value of E67E22. - public static readonly Color Orange = new Color(0xE67E22); + public static readonly Color Orange = new(0xE67E22); /// Gets the dark orange color value. /// A color struct with the hex value of A84300. - public static readonly Color DarkOrange = new Color(0xA84300); + public static readonly Color DarkOrange = new(0xA84300); /// Gets the red color value. /// A color struct with the hex value of E74C3C. - public static readonly Color Red = new Color(0xE74C3C); + public static readonly Color Red = new(0xE74C3C); /// Gets the dark red color value. /// A color struct with the hex value of 992D22. - public static readonly Color DarkRed = new Color(0x992D22); + public static readonly Color DarkRed = new(0x992D22); /// Gets the light grey color value. /// A color struct with the hex value of 979C9F. - public static readonly Color LightGrey = new Color(0x979C9F); + public static readonly Color LightGrey = new(0x979C9F); /// Gets the lighter grey color value. /// A color struct with the hex value of 95A5A6. - public static readonly Color LighterGrey = new Color(0x95A5A6); + public static readonly Color LighterGrey = new(0x95A5A6); /// Gets the dark grey color value. /// A color struct with the hex value of 607D8B. - public static readonly Color DarkGrey = new Color(0x607D8B); + public static readonly Color DarkGrey = new(0x607D8B); /// Gets the darker grey color value. /// A color struct with the hex value of 546E7A. - public static readonly Color DarkerGrey = new Color(0x546E7A); + public static readonly Color DarkerGrey = new(0x546E7A); /// Gets the encoded value for this color. /// @@ -91,22 +93,27 @@ public struct Color /// Initializes a struct with the given raw value. /// /// - /// The following will create a color that has a hex value of + /// The following will create a color that has a hex value of /// #607D8B. /// /// Color darkGrey = new Color(0x607D8B); /// /// /// The raw value of the color (e.g. 0x607D8B). + /// Value exceeds . public Color(uint rawValue) { + if (rawValue > MaxDecimalValue) + throw new ArgumentException($"{nameof(RawValue)} of color cannot be greater than {MaxDecimalValue}!", nameof(rawValue)); + RawValue = rawValue; } + /// /// Initializes a struct with the given RGB bytes. /// /// - /// The following will create a color that has a value of + /// The following will create a color that has a value of /// #607D8B. /// /// Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); @@ -115,19 +122,24 @@ public Color(uint rawValue) /// The byte that represents the red color. /// The byte that represents the green color. /// The byte that represents the blue color. + /// Value exceeds . public Color(byte r, byte g, byte b) { - RawValue = - ((uint)r << 16) | - ((uint)g << 8) | - (uint)b; + uint value = ((uint)r << 16) + | ((uint)g << 8) + | (uint)b; + + if (value > MaxDecimalValue) + throw new ArgumentException($"{nameof(RawValue)} of color cannot be greater than {MaxDecimalValue}!"); + + RawValue = value; } /// /// Initializes a struct with the given RGB value. /// /// - /// The following will create a color that has a value of + /// The following will create a color that has a value of /// #607D8B. /// /// Color darkGrey = new Color(96, 125, 139); @@ -145,16 +157,15 @@ public Color(int r, int g, int b) throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,255]."); if (b < 0 || b > 255) throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,255]."); - RawValue = - ((uint)r << 16) | - ((uint)g << 8) | - (uint)b; + RawValue = ((uint)r << 16) + | ((uint)g << 8) + | (uint)b; } /// /// Initializes a struct with the given RGB float value. /// /// - /// The following will create a color that has a value of + /// The following will create a color that has a value of /// #607c8c. /// /// Color darkGrey = new Color(0.38f, 0.49f, 0.55f); @@ -172,10 +183,9 @@ public Color(float r, float g, float b) throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,1]."); if (b < 0.0f || b > 1.0f) throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,1]."); - RawValue = - ((uint)(r * 255.0f) << 16) | - ((uint)(g * 255.0f) << 8) | - (uint)(b * 255.0f); + RawValue = ((uint)(r * 255.0f) << 16) + | ((uint)(g * 255.0f) << 8) + | (uint)(b * 255.0f); } public static bool operator ==(Color lhs, Color rhs) @@ -184,15 +194,22 @@ public Color(float r, float g, float b) public static bool operator !=(Color lhs, Color rhs) => lhs.RawValue != rhs.RawValue; + public static implicit operator Color(uint rawValue) + => new(rawValue); + + public static implicit operator uint(Color color) + => color.RawValue; + public override bool Equals(object obj) - => (obj is Color c && RawValue == c.RawValue); + => obj is Color c && RawValue == c.RawValue; public override int GetHashCode() => RawValue.GetHashCode(); - public static implicit operator StandardColor(Color color) => - StandardColor.FromArgb((int)color.RawValue); - public static explicit operator Color(StandardColor color) => - new Color((uint)color.ToArgb() << 8 >> 8); + public static implicit operator StandardColor(Color color) + => StandardColor.FromArgb((int)color.RawValue); + + public static explicit operator Color(StandardColor color) + => new((uint)color.ToArgb() << 8 >> 8); /// /// Gets the hexadecimal representation of the color (e.g. #000ccc). diff --git a/src/Discord.Net.Core/Entities/Users/IUser.cs b/src/Discord.Net.Core/Entities/Users/IUser.cs index 9596a83383..f265bb938a 100644 --- a/src/Discord.Net.Core/Entities/Users/IUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IUser.cs @@ -12,17 +12,29 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// string AvatarId { get; } /// + /// Gets the identifier of this user's banner. + /// + string BannerId { get; } + /// + /// Gets the user's banner color. + /// + /// + /// A struct representing the accent color of this user's banner. + /// + Color? AccentColor { get; } + /// /// Gets the avatar URL for this user. /// /// /// This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar - /// (i.e. their avatar identifier is not set), this property will return null. If you wish to + /// (i.e. their avatar identifier is not set), this method will return null. If you wish to /// retrieve the default avatar for this user, consider using (see /// example). /// /// - /// 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. + /// 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. /// /// @@ -34,6 +46,16 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128); /// + /// Gets the banner URL for this user. + /// + /// The format to return. + /// The size of the image to return in. This can be any power of two between 16 and 2048. + /// + /// + /// A string representing the user's avatar URL; null if the user does not have an banner in place. + /// + string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256); + /// /// Gets the default avatar URL for this user. /// /// @@ -93,8 +115,8 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// This method is used to obtain or create a channel used to send a direct message. /// /// In event that the current user cannot send a message to the target user, a channel can and will - /// still be created by Discord. However, attempting to send a message will yield a - /// with a 403 as its + /// still be created by Discord. However, attempting to send a message will yield a + /// with a 403 as its /// . There are currently no official workarounds by /// Discord. /// diff --git a/src/Discord.Net.Rest/API/Common/User.cs b/src/Discord.Net.Rest/API/Common/User.cs index d1f436afbe..4d1b5b2b7e 100644 --- a/src/Discord.Net.Rest/API/Common/User.cs +++ b/src/Discord.Net.Rest/API/Common/User.cs @@ -15,6 +15,10 @@ internal class User public Optional Bot { get; set; } [JsonProperty("avatar")] public Optional Avatar { get; set; } + [JsonProperty("banner")] + public Optional Banner { get; set; } + [JsonProperty("accent_color")] + public Optional AccentColor { get; set; } //CurrentUser [JsonProperty("verified")] diff --git a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs index d74591e75e..bb981bfdb1 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs @@ -9,7 +9,7 @@ namespace Discord.Rest { /// - /// Represents a thread user recieved over the REST api. + /// Represents a thread user received over the REST api. /// public class RestThreadUser : RestEntity { @@ -51,7 +51,7 @@ internal void Update(Model model) /// Gets the guild user for this thread user. /// /// - /// A task representing the asyncronous get operation. The task returns a + /// A task representing the asynchronous get operation. The task returns a /// that represents the current thread user. /// public Task GetGuildUser() diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs index 7bc1447fe3..618804fefc 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs @@ -22,6 +22,10 @@ public class RestUser : RestEntity, IUser, IUpdateable /// public string AvatarId { get; private set; } /// + public string BannerId { get; private set; } + /// + public Color? AccentColor { get; private set; } + /// public UserProperties? PublicFlags { get; private set; } /// @@ -61,6 +65,10 @@ internal virtual void Update(Model model) { if (model.Avatar.IsSpecified) AvatarId = model.Avatar.Value; + if (model.Banner.IsSpecified) + BannerId = model.Banner.Value; + if (model.AccentColor.IsSpecified) + AccentColor = model.AccentColor.Value; if (model.Discriminator.IsSpecified) DiscriminatorValue = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); if (model.Bot.IsSpecified) @@ -92,6 +100,10 @@ public Task CreateDMChannelAsync(RequestOptions options = null) public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); + /// + public string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256) + => CDN.GetUserBannerUrl(Id, BannerId, size, format); + /// public string GetDefaultAvatarUrl() => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs index 15c5182fc9..b1bce5934d 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs @@ -12,6 +12,8 @@ internal class SocketGlobalUser : SocketUser public override string Username { get; internal set; } public override ushort DiscriminatorValue { get; internal set; } public override string AvatarId { get; internal set; } + public override string BannerId { get; internal set; } + public override Color? AccentColor { get; internal set; } internal override SocketPresence Presence { get; set; } public override bool IsWebhook => false; @@ -47,7 +49,7 @@ internal void RemoveRef(DiscordSocketClient discord) discord.RemoveUser(Id); } } - + internal void Update(ClientState state, PresenceModel model) { Presence = SocketPresence.Create(model); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs index 805a881101..d993105404 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs @@ -29,6 +29,10 @@ public class SocketGroupUser : SocketUser, IGroupUser /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } /// + public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } + /// + public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } + /// internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index f79fc7afed..ac8409a322 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -38,6 +38,11 @@ public class SocketGuildUser : SocketUser, IGuildUser public override ushort DiscriminatorValue { get { return GlobalUser.DiscriminatorValue; } internal set { GlobalUser.DiscriminatorValue = value; } } /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } + /// + public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } + /// + public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } + /// public GuildPermissions GuildPermissions => new GuildPermissions(Permissions.ResolveGuild(Guild, this)); internal override SocketPresence Presence { get; set; } @@ -91,7 +96,7 @@ public IReadOnlyCollection Roles /// Returns the position of the user within the role hierarchy. /// /// - /// The returned value equal to the position of the highest role the user has, or + /// The returned value equal to the position of the highest role the user has, or /// if user is the server owner. /// public int Hierarchy diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs index 7b11257a3b..e821238eef 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs @@ -29,6 +29,10 @@ public class SocketSelfUser : SocketUser, ISelfUser /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } /// + public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } + /// + public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } + /// internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } /// public UserProperties Flags { get; internal set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index d1237d598f..5fb1f56e54 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -36,7 +36,7 @@ public DateTimeOffset? JoinedAt /// public string Nickname - => GuildUser.Nickname; + => GuildUser.Nickname; /// public DateTimeOffset? PremiumSince @@ -53,6 +53,20 @@ public override string AvatarId internal set => GuildUser.AvatarId = value; } + /// + public override string BannerId + { + get => GuildUser.BannerId; + internal set => GuildUser.BannerId = value; + } + + /// + public override Color? AccentColor + { + get => GuildUser.AccentColor; + internal set => GuildUser.AccentColor = value; + } + /// public override ushort DiscriminatorValue { diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs index 840a1c30bf..180e60a3ba 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs @@ -19,9 +19,16 @@ public class SocketUnknownUser : SocketUser public override ushort DiscriminatorValue { get; internal set; } /// public override string AvatarId { get; internal set; } + + /// + public override string BannerId { get; internal set; } + + /// + public override Color? AccentColor { get; internal set; } + /// public override bool IsBot { get; internal set; } - + /// public override bool IsWebhook => false; /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index 025daf29ae..c50fbee4fb 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -25,6 +25,10 @@ public abstract class SocketUser : SocketEntity, IUser /// public abstract string AvatarId { get; internal set; } /// + public abstract string BannerId { get; internal set; } + /// + public abstract Color? AccentColor { get; internal set; } + /// public abstract bool IsWebhook { get; } /// public UserProperties? PublicFlags { get; private set; } @@ -64,6 +68,16 @@ internal virtual bool Update(ClientState state, Model model) AvatarId = model.Avatar.Value; hasChanges = true; } + if (model.Banner.IsSpecified && model.Banner.Value != BannerId) + { + BannerId = model.Banner.Value; + hasChanges = true; + } + if (model.AccentColor.IsSpecified && model.AccentColor.Value != AccentColor?.RawValue) + { + AccentColor = model.AccentColor.Value; + hasChanges = true; + } if (model.Discriminator.IsSpecified) { var newVal = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); @@ -99,6 +113,10 @@ public async Task CreateDMChannelAsync(RequestOptions options = null public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); + /// + public string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256) + => CDN.GetUserBannerUrl(Id, BannerId, size, format); + /// public string GetDefaultAvatarUrl() => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index 2b0ecbb19f..f1269e649f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -24,6 +24,23 @@ public class SocketWebhookUser : SocketUser, IWebhookUser public override ushort DiscriminatorValue { get; internal set; } /// public override string AvatarId { get; internal set; } + + /// + /// Webhook users does not support banners. + public override string BannerId + { + get => throw new NotSupportedException("Webhook users does not support banners."); + internal set => throw new NotSupportedException("Webhook users does not support banners."); + } + + /// + /// Webhook users does not support accent colors. + public override Color? AccentColor + { + get => throw new NotSupportedException("Webhook users does not support accent colors."); + internal set => throw new NotSupportedException("Webhook users does not support accent colors."); + } + /// public override bool IsBot { get; internal set; } diff --git a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs index bb841fd1bc..7ff17ac04c 100644 --- a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs @@ -91,7 +91,7 @@ void AssertFlag(Func cstr, GuildPermission flag) AssertFlag(() => new GuildPermissions(manageNicknames: true), GuildPermission.ManageNicknames); AssertFlag(() => new GuildPermissions(manageRoles: true), GuildPermission.ManageRoles); AssertFlag(() => new GuildPermissions(manageWebhooks: true), GuildPermission.ManageWebhooks); - AssertFlag(() => new GuildPermissions(manageEmojis: true), GuildPermission.ManageEmojisAndStickers); + AssertFlag(() => new GuildPermissions(manageEmojisAndStickers: true), GuildPermission.ManageEmojisAndStickers); } /// @@ -161,7 +161,7 @@ void AssertUtil(GuildPermission permission, AssertUtil(GuildPermission.ManageNicknames, x => x.ManageNicknames, (p, enable) => p.Modify(manageNicknames: enable)); AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); - AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojis: enable)); + AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojisAndStickers: enable)); } } } From c3580fd8931ff57be660da77a779ef0be2d6bc6c Mon Sep 17 00:00:00 2001 From: Cenk Ergen <57065323+Cenngo@users.noreply.github.com> Date: Sun, 8 Aug 2021 19:53:55 +0300 Subject: [PATCH 163/494] Interface Method Declarations for Interaction Methods (#99) * added interface method declarations * inline docs --- src/Discord.Net.Core/Discord.Net.Core.xml | 121 ++++++++++++++++-- .../Entities/Guilds/IGuild.cs | 10 ++ .../Interactions/IApplicationCommand.cs | 9 +- .../Interactions/IDiscordInteraction.cs | 54 ++++++++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 13 ++ .../Entities/Guilds/RestGuild.cs | 15 +++ .../Discord.Net.WebSocket.xml | 28 +++- .../Entities/Guilds/SocketGuild.cs | 3 + .../Entities/Interaction/SocketInteraction.cs | 15 +++ 9 files changed, 243 insertions(+), 25 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 1ab7ab78d0..dfbb2fc500 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3723,6 +3723,16 @@ A task that represents the asynchronous removal operation. + + + Gets this guilds slash commands commands + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of application commands found within the guild. + + Holds information for a guild integration feature. @@ -4293,13 +4303,6 @@ If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - Deletes this command - - The options to be used when sending the request. - A task that represents the asynchronous delete operation. - Represents data of an Interaction Command, see . @@ -4433,6 +4436,58 @@ read-only property, always 1. + + + Responds to an Interaction with type . + + The text of the message to be sent. + A array of embeds to send with this response. Max 10 + if the message should be read out by a text-to-speech reader, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + + + + Sends a followup message for this interaction. + + The text of the message to be sent + A array of embeds to send with this response. Max 10 + if the message should be read out by a text-to-speech reader, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + + The sent message. + + + + + Gets the original response for this interaction. + + The request options for this async request. + A that represents the initial response. + + + + Edits original response for this interaction. + + A delegate containing the properties to modify the message with. + The request options for this async request. + A that represents the initial response. + + + + Acknowledges this interaction. + + + A task that represents the asynchronous operation of acknowledging the interaction. + + Represents an interface used to specify classes that they are a vaild dataype of a class. @@ -4583,7 +4638,7 @@ Represents a builder for creating a . - + The max length of a . @@ -4710,7 +4765,7 @@ Gets or sets the label of the current button. - length exceeds . + length exceeds . @@ -5035,11 +5090,16 @@ The maximum length of a . + + + The maximum length of a . + + Gets or sets the label of the current select menu. - length exceeds + length exceeds @@ -7554,10 +7614,38 @@ The message for when a news channel subscription is added to a text channel. + + + The message for when a guild is disqualified from discovery. + + + + + The message for when a guild is requalified for discovery. + + + + + The message for when the initial warning is sent for the initial grace period discovery. + + + + + The message for when the final warning is sent for the initial grace period discovery. + + + + + The message for when a thread is created. + + The message is an inline reply. + + Only available in API v8 + @@ -7567,6 +7655,19 @@ Only available in API v8 + + + The message that starts a thread. + + + Only available in API v9 + + + + + The message for a invite reminder + + A metadata containing reaction information. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index b8fd858dfc..fb26bdd363 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -892,5 +892,15 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// A task that represents the asynchronous removal operation. /// Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null); + + /// + /// Gets this guilds slash commands commands + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of application commands found within the guild. + /// + Task> GetApplicationCommandsAsync (RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index eb61c539f1..a1a33aceaf 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -9,7 +9,7 @@ namespace Discord /// /// The base command model that belongs to an application. see /// - public interface IApplicationCommand : ISnowflakeEntity + public interface IApplicationCommand : ISnowflakeEntity, IDeletable { /// /// Gets the unique id of the parent application. @@ -35,12 +35,5 @@ public interface IApplicationCommand : ISnowflakeEntity /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// IReadOnlyCollection Options { get; } - - /// - /// Deletes this command - /// - /// The options to be used when sending the request. - /// A task that represents the asynchronous delete operation. - Task DeleteAsync(RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 466bf3e914..b5afddca2c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -39,5 +39,59 @@ public interface IDiscordInteraction : ISnowflakeEntity /// read-only property, always 1. /// int Version { get; } + + /// + /// Responds to an Interaction with type . + /// + /// The text of the message to be sent. + /// A array of embeds to send with this response. Max 10 + /// if the message should be read out by a text-to-speech reader, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); + + /// + /// Sends a followup message for this interaction. + /// + /// The text of the message to be sent + /// A array of embeds to send with this response. Max 10 + /// if the message should be read out by a text-to-speech reader, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + /// + /// The sent message. + /// + Task FollowupAsync (string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); + + /// + /// Gets the original response for this interaction. + /// + /// The request options for this async request. + /// A that represents the initial response. + Task GetOriginalResponseAsync (RequestOptions options = null); + + /// + /// Edits original response for this interaction. + /// + /// A delegate containing the properties to modify the message with. + /// The request options for this async request. + /// A that represents the initial response. + Task ModifyOriginalResponseAsync (Action func, RequestOptions options = null); + + /// + /// Acknowledges this interaction. + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + Task DeferAsync (RequestOptions options = null); } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index eda180f01d..a9630f3821 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3403,6 +3403,16 @@ of webhooks found within the guild. + + + Gets this guilds slash commands commands + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of application commands found within the guild. + + Returns the name of the guild. @@ -3548,6 +3558,9 @@ + + + diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 37491909cc..9c6f6011e8 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -808,6 +808,18 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null public Task> GetWebhooksAsync(RequestOptions options = null) => GuildHelper.GetWebhooksAsync(this, Discord, options); + //Interactions + /// + /// Gets this guilds slash commands commands + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of application commands found within the guild. + /// + public async Task> GetApplicationCommandsAsync (RequestOptions options = null) + => await ClientHelper.GetGuildApplicationCommands(Discord, Id, options).ConfigureAwait(false); + /// /// Returns the name of the guild. /// @@ -1061,5 +1073,8 @@ async Task IGuild.GetWebhookAsync(ulong id, RequestOptions options) /// async Task> IGuild.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); + /// + async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) + => await GetApplicationCommandsAsync(options).ConfigureAwait(false); } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index b17f73024d..72ec97e58c 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3477,6 +3477,9 @@ + + + Represents a Websocket-based interaction type for Message Components. @@ -3492,7 +3495,7 @@ The message that contained the trigger for this interaction. - + @@ -3503,7 +3506,7 @@ The request options for this async request. A task that represents the asynchronous operation of updating the message. - + @@ -3619,10 +3622,10 @@ The data associated with this interaction. - + - + @@ -3708,12 +3711,12 @@ if the token is valid for replying to, otherwise . - + Responds to an Interaction with type . If you have set to , You should use - instead. + instead. The text of the message to be sent. @@ -3723,10 +3726,11 @@ The allowed mentions for this response. The request options for this response. A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. Message content is too long, length must be less or equal to . The parameters provided were invalid or the token was invalid. - + Sends a followup message for this interaction. @@ -3737,6 +3741,7 @@ The allowed mentions for this response. The request options for this response. A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. The sent message. @@ -3772,6 +3777,15 @@ A task that represents the asynchronous operation of acknowledging the interaction. + + + + + + + + + Represents a WebSocket-based invite to a guild. diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index f720db018d..ce188e7072 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1436,6 +1436,9 @@ async Task IGuild.GetWebhookAsync(ulong id, RequestOptions options) /// async Task> IGuild.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); + /// + async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) + => await GetApplicationCommandsAsync(options).ConfigureAwait(false); void IDisposable.Dispose() { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 4b2e3baecf..5547fed1ea 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -171,5 +171,20 @@ private bool CheckToken() // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes <= 15d; } + + // IDiscordInteraction + + /// + async Task IDiscordInteraction.FollowupAsync (string text, Embed[] embeds, bool isTTS, bool ephemeral, AllowedMentions allowedMentions, + RequestOptions options, MessageComponent component, Embed embed) + => await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component, embed).ConfigureAwait(false); + + /// + async Task IDiscordInteraction.GetOriginalResponseAsync (RequestOptions options) + => await GetOriginalResponseAsync(options).ConfigureAwait(false); + + /// + async Task IDiscordInteraction.ModifyOriginalResponseAsync (Action func, RequestOptions options) + => await ModifyOriginalResponseAsync(func, options).ConfigureAwait(false); } } From cc5fc8d288a8b786e9f8209f195ca841166e3764 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 8 Aug 2021 13:56:01 -0300 Subject: [PATCH 164/494] Fix serialization error --- src/Discord.Net.Rest/API/Common/Game.cs | 4 ++-- .../Discord.Net.WebSocket.xml | 10 ++++++++++ .../DiscordSocketApiClient.cs | 17 ++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/Game.cs b/src/Discord.Net.Rest/API/Common/Game.cs index 294b0c7fdf..775b6aabcd 100644 --- a/src/Discord.Net.Rest/API/Common/Game.cs +++ b/src/Discord.Net.Rest/API/Common/Game.cs @@ -41,8 +41,8 @@ internal class Game public Optional Emoji { get; set; } [JsonProperty("created_at")] public Optional CreatedAt { get; set; } - [JsonProperty("buttons")] - public Optional Buttons { get; set; } + //[JsonProperty("buttons")] + //public Optional Buttons { get; set; } [OnError] internal void OnError(StreamingContext context, ErrorContext errorContext) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 576fcc5f0c..6a41708c81 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3628,6 +3628,16 @@ + + + Defers an interaction and responds with type 5 () + + to send this message ephemerally, otherwise . + The request options for this async request. + + A task that represents the asynchronous operation of acknowledging the interaction. + + diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index a862b57783..11ecc08671 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -79,7 +79,7 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr if (msg != null) { #if DEBUG_PACKETS - Console.WriteLine($"<- {msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); + Console.WriteLine($"<- {(GatewayOpCode)msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); #endif await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); @@ -96,7 +96,7 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr if (msg != null) { #if DEBUG_PACKETS - Console.WriteLine($"<- {msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); + Console.WriteLine($"<- {(GatewayOpCode)msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); #endif await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); @@ -105,6 +105,10 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr }; WebSocketClient.Closed += async ex => { +#if DEBUG_PACKETS + Console.WriteLine(ex); +#endif + await DisconnectAsync().ConfigureAwait(false); await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false); }; @@ -166,6 +170,11 @@ internal override async Task ConnectInternalAsync() var gatewayResponse = await GetGatewayAsync().ConfigureAwait(false); _gatewayUrl = $"{gatewayResponse.Url}?v={DiscordConfig.APIVersion}&encoding={DiscordSocketConfig.GatewayEncoding}&compress=zlib-stream"; } + +#if DEBUG + Console.WriteLine("Connecting to gateway: " + _gatewayUrl); +#endif + await WebSocketClient.ConnectAsync(_gatewayUrl).ConfigureAwait(false); ConnectionState = ConnectionState.Connected; @@ -237,7 +246,9 @@ public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, i options = RequestOptions.CreateOrClone(options); var props = new Dictionary { - ["$device"] = "Discord.Net Labs" + ["$device"] = "Discord.Net Labs", + ["$os"] = Environment.OSVersion.Platform.ToString(), + [$"browser"] = "Discord.Net Labs" }; var msg = new IdentifyParams() { From f98d742909683f1fe0f0926bf78b9cee0243d7ad Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 8 Aug 2021 14:06:06 -0300 Subject: [PATCH 165/494] meta: bump versions --- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 +- src/Discord.Net.Core/Discord.Net.Core.xml | 103 ++++++++++++++---- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 13 ++- .../Discord.Net.WebSocket.csproj | 4 +- .../Discord.Net.WebSocket.xml | 49 ++++++++- src/Discord.Net/Discord.Net.nuspec | 20 ++-- 7 files changed, 162 insertions(+), 39 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index f0be100599..309c45fb65 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.0.0-pre + 3.0.1-pre Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 2.3.8 - 2.3.8 + 3.3.1 + 3.0.1 false diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index b41bdd2f86..582210832f 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -100,6 +100,18 @@ A URL pointing to the user's avatar in the specified size. + + + Returns a user banner URL. + + The user snowflake identifier. + The banner identifier. + The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. + The format to return. + + A URL pointing to the user's banner in the specified size. + + Returns the default user avatar URL. @@ -4782,11 +4794,6 @@ Represents a builder for creating a . - - - The max length of a . - - The max length of a . @@ -4905,11 +4912,16 @@ Represents a class used to build 's. + + + The max length of a . + + Gets or sets the label of the current button. - length exceeds . + length exceeds . @@ -5229,6 +5241,11 @@ Represents a class used to build 's. + + + The maximum length of a . + + The maximum length of a . @@ -5238,7 +5255,7 @@ Gets or sets the label of the current select menu. - length exceeds + length exceeds @@ -8645,7 +8662,25 @@ If true, a user may edit the webhooks for this guild. - If true, a user may edit the emojis for this guild. + If true, a user may edit the emojis and stickers for this guild. + + + If true, a user may use slash commands in this guild. + + + If true, a user may request to speak in stage channels. + + + If true, a user may manage threads in this guild. + + + If true, a user may create public threads in this guild. + + + If true, a user may create private threads in this guild. + + + If true, a user may use external stickers in this guild. Creates a new with the provided packed value. @@ -8653,10 +8688,10 @@ Creates a new with the provided packed value after converting to ulong. - + Creates a new structure with the provided permissions. - + Creates a new from this one, changing the provided non-null permissions. @@ -8843,6 +8878,9 @@ Represents a color used in Discord. + + Gets the max decimal value of color. + Gets the default user color value. @@ -8947,20 +8985,21 @@ Initializes a struct with the given raw value. - The following will create a color that has a hex value of + The following will create a color that has a hex value of #607D8B. Color darkGrey = new Color(0x607D8B); The raw value of the color (e.g. 0x607D8B). + Value exceeds . Initializes a struct with the given RGB bytes. - The following will create a color that has a value of + The following will create a color that has a value of #607D8B. Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); @@ -8969,13 +9008,14 @@ The byte that represents the red color. The byte that represents the green color. The byte that represents the blue color. + Value exceeds . Initializes a struct with the given RGB value. - The following will create a color that has a value of + The following will create a color that has a value of #607D8B. Color darkGrey = new Color(96, 125, 139); @@ -8991,7 +9031,7 @@ Initializes a struct with the given RGB float value. - The following will create a color that has a value of + The following will create a color that has a value of #607c8c. Color darkGrey = new Color(0.38f, 0.49f, 0.55f); @@ -9759,19 +9799,33 @@ Gets the identifier of this user's avatar. + + + Gets the identifier of this user's banner. + + + + + Gets the user's banner color. + + + A struct representing the accent color of this user's banner. + + Gets the avatar URL for this user. This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar - (i.e. their avatar identifier is not set), this property will return null. If you wish to + (i.e. their avatar identifier is not set), this method will return null. If you wish to retrieve the default avatar for this user, consider using (see example). - 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. + 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. @@ -9782,6 +9836,17 @@ A string representing the user's avatar URL; null if the user does not have an avatar in place. + + + Gets the banner URL for this user. + + The format to return. + The size of the image to return in. This can be any power of two between 16 and 2048. + + + A string representing the user's avatar URL; null if the user does not have an banner in place. + + Gets the default avatar URL for this user. @@ -9849,8 +9914,8 @@ This method is used to obtain or create a channel used to send a direct message. In event that the current user cannot send a message to the target user, a channel can and will - still be created by Discord. However, attempting to send a message will yield a - with a 403 as its + still be created by Discord. However, attempting to send a message will yield a + with a 403 as its . There are currently no official workarounds by Discord. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index b1efafae21..16b1655754 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.0-pre + 3.0.1-pre Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.4 - 2.3.4 + 3.0.1 + 3.0.1 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index a594fc985f..5d19496507 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4570,7 +4570,7 @@ - Represents a thread user recieved over the REST api. + Represents a thread user received over the REST api. @@ -4593,7 +4593,7 @@ Gets the guild user for this thread user. - A task representing the asyncronous get operation. The task returns a + A task representing the asynchronous get operation. The task returns a that represents the current thread user. @@ -4614,6 +4614,12 @@ + + + + + + @@ -4656,6 +4662,9 @@ + + + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index af17578fbd..167ccebb08 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.0.0-pre + 3.0.1-pre https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,6 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml + 3.0.1 + 3.0.1 TRACE; diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 6a41708c81..62019eab2d 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -4433,6 +4433,12 @@ + + + + + + @@ -4491,6 +4497,12 @@ + + + + + + @@ -4554,7 +4566,7 @@ Returns the position of the user within the role hierarchy. - The returned value equal to the position of the highest role the user has, or + The returned value equal to the position of the highest role the user has, or if user is the server owner. @@ -4676,6 +4688,12 @@ + + + + + + @@ -4729,6 +4747,12 @@ + + + + + + @@ -4836,6 +4860,12 @@ + + + + + + @@ -4866,6 +4896,12 @@ + + + + + + @@ -4904,6 +4940,9 @@ + + + @@ -4985,6 +5024,14 @@ + + + Webhook users does not support banners. + + + + Webhook users does not support accent colors. + diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 595203eba0..eb3bd9b6d5 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.1-pre$suffix$ + 3.0.2-pre$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From 345f06845a71975383477df63b3db7dffe906e00 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 8 Aug 2021 14:30:57 -0300 Subject: [PATCH 166/494] Fix debug pragma --- src/Discord.Net.WebSocket/DiscordSocketApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index 11ecc08671..e19cedb336 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -171,7 +171,7 @@ internal override async Task ConnectInternalAsync() _gatewayUrl = $"{gatewayResponse.Url}?v={DiscordConfig.APIVersion}&encoding={DiscordSocketConfig.GatewayEncoding}&compress=zlib-stream"; } -#if DEBUG +#if DEBUG_PACKETS Console.WriteLine("Connecting to gateway: " + _gatewayUrl); #endif From 4d1ddf8999abf55bda6abc5029f4fab49f182d75 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 8 Aug 2021 17:00:13 -0300 Subject: [PATCH 167/494] meta: bump version --- src/Discord.Net.Webhook/Discord.Net.Webhook.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 13e5cf1115..f04dedf438 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -6,7 +6,7 @@ Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 2.3.4 + 3.0.0-pre Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs From 1b05238d3353a16e6f96c24d7594bfcb995c3e45 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 9 Aug 2021 18:29:55 -0300 Subject: [PATCH 168/494] Remove rich presence button --- .../API/Common/RichPresenceButton.cs | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 src/Discord.Net.Rest/API/Common/RichPresenceButton.cs diff --git a/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs b/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs deleted file mode 100644 index 66f34c82e2..0000000000 --- a/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.API -{ - internal class RichPresenceButton - { - [JsonProperty("label")] - public string Label { get; set; } - - [JsonProperty("url")] - public string Url { get; set; } - } -} From 07962445072e57f231a531f237e01f859fc95871 Mon Sep 17 00:00:00 2001 From: Cenk Ergen <57065323+Cenngo@users.noreply.github.com> Date: Wed, 11 Aug 2021 03:49:25 +0300 Subject: [PATCH 169/494] Assign CurrentUserId in Sharded Client (#100) * added interface method declarations * inline docs * current user id assignment in sharded client --- src/Discord.Net.WebSocket/DiscordShardedClient.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 386f9f7e5a..99a60607a7 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -30,7 +30,16 @@ public partial class DiscordShardedClient : BaseSocketClient, IDiscordClient /// public override IActivity Activity { get => _shards[0].Activity; protected set { } } - internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; + internal new DiscordSocketApiClient ApiClient + { + get + { + if (base.ApiClient.CurrentUserId == null) + base.ApiClient.CurrentUserId = CurrentUser?.Id; + + return base.ApiClient; + } + } /// public override IReadOnlyCollection Guilds => GetGuilds().ToReadOnlyCollection(GetGuildCount); /// From 82d6eda8082f67d2d8dc0ae0fe6bff7f97ae404f Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Tue, 10 Aug 2021 22:15:17 -0500 Subject: [PATCH 170/494] Allow EmbedBuilder.ImageUrl to use attachment scheme syntax (#104) --- src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 2ab2699a60..5b92e02a56 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -411,7 +411,7 @@ public Embed Build() UrlValidation.Validate(Url); if (!string.IsNullOrEmpty(ThumbnailUrl)) UrlValidation.Validate(ThumbnailUrl); - if (!string.IsNullOrEmpty(ImageUrl)) + if (!string.IsNullOrEmpty(ImageUrl) && !ImageUrl.StartsWith("attachment://", StringComparison.Ordinal)) UrlValidation.Validate(ImageUrl); if (Author != null) { From afa480a8e69a1b3626b1c2257759c9c9c7b7989b Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Wed, 11 Aug 2021 20:04:23 -0400 Subject: [PATCH 171/494] Implemented Context Menus Added ApplicationCommand types: Slash : 1 User: 2 Message: 3 And the appropriate CRUD methods. --- Discord.Net.sln | 20 +- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 149 ++++++++ .../ApplicationCommandProperties.cs | 6 +- .../Interactions/ApplicationCommandTypes.cs | 15 + .../Interactions/IApplicationCommand.cs | 5 + .../Interactions/MessageCommandBuilder.cs | 109 ++++++ .../MessageCommandCreationProperties.cs | 30 ++ .../Interactions/SlashCommandBuilder.cs | 3 +- .../SlashCommandCreationProperties.cs | 4 + .../Interactions/UserCommandBuilder.cs | 109 ++++++ .../UserCommandCreationProperties.cs | 30 ++ .../Rest/CreateApplicationCommandParams.cs | 6 +- .../Rest/ModifyApplicationCommandParams.cs | 3 + src/Discord.Net.Rest/Discord.Net.Rest.xml | 97 +++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 134 +++++++ src/Discord.Net.Rest/DiscordRestClient.cs | 17 + .../Interactions/InteractionHelper.cs | 346 ++++++++++++++++++ .../Interactions/RestApplicationCommand.cs | 34 +- .../RestApplicationCommandType.cs | 6 +- .../Interactions/RestGlobalMessageCommand.cs | 41 +++ .../Interactions/RestGlobalUserCommand.cs | 41 +++ .../Interactions/RestGuildMessageCommand.cs | 61 +++ .../Interactions/RestGuildUserCommand.cs | 61 +++ .../Discord.Net.WebSocket.xml | 3 + .../SocketApplicationCommand.cs | 3 + 26 files changed, 1320 insertions(+), 15 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/MessageCommandCreationProperties.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs create mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs diff --git a/Discord.Net.sln b/Discord.Net.sln index 1a32f1270e..c11739aef6 100644 --- a/Discord.Net.sln +++ b/Discord.Net.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28407.52 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31521.260 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Core", "src\Discord.Net.Core\Discord.Net.Core.csproj", "{91E9E7BD-75C9-4E98-84AA-2C271922E5C2}" EndProject @@ -40,7 +40,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FeatureTesting", "..\FeatureTesting\FeatureTesting\FeatureTesting.csproj", "{0CC57A32-3AC7-489D-8DF5-C431925E4675}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -232,6 +234,18 @@ Global {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.Build.0 = Release|Any CPU {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.ActiveCfg = Release|Any CPU {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.Build.0 = Release|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x64.ActiveCfg = Debug|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x64.Build.0 = Debug|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x86.ActiveCfg = Debug|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x86.Build.0 = Debug|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|Any CPU.Build.0 = Release|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x64.ActiveCfg = Release|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x64.Build.0 = Release|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x86.ActiveCfg = Release|Any CPU + {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index f0be100599..babda86b72 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.0.0-pre + 3.3.1.0 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 059d9d16b8..d1e4770e3a 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4452,6 +4452,11 @@ Gets or sets the discription of this command. + + + Gets or sets the type for this command. + + Gets or sets the options for this command. @@ -4472,6 +4477,11 @@ Gets the unique id of the parent application. + + + The type of the command + + The name of the command. @@ -5444,6 +5454,73 @@ Will render this option as selected by default. + + + A class used to build slash commands. + + + + + Returns the maximun length a commands name allowed by Discord + + + + + Returns the maximum length of a commands description allowed by Discord. + + + + + The name of this slash command. + + + + + A 1-100 length description of this slash command + + + + + Build the current builder into a class. + + A that can be used to create user commands over rest. + + + + Sets the field name. + + The value to set the field name to. + + The current builder. + + + + + Sets the description of the current command. + + The description of this command. + The current builder. + + + + A class used to create Message commands. + + + + + The name of this command. + + + + + The discription of this command. + + + + + Gets or sets the type for this command. + + A class used to build slash commands. @@ -5691,6 +5768,11 @@ The discription of this command. + + + Gets or sets the type for this command. + + Gets or sets the options for this command. @@ -5701,6 +5783,73 @@ Whether the command is enabled by default when the app is added to a guild. Default is + + + A class used to build slash commands. + + + + + Returns the maximun length a commands name allowed by Discord + + + + + Returns the maximum length of a commands description allowed by Discord. + + + + + The name of this slash command. + + + + + A 1-100 length description of this slash command + + + + + Build the current builder into a class. + + A that can be used to create user commands over rest. + + + + Sets the field name. + + The value to set the field name to. + + The current builder. + + + + + Sets the description of the current command. + + The description of this command. + The current builder. + + + + A class used to create User commands. + + + + + The name of this command. + + + + + The discription of this command. + + + + + Gets or sets the type for this command. + + Represents a generic invite object. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index e0d10af873..70b430bfc2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -20,7 +20,11 @@ public class ApplicationCommandProperties /// Gets or sets the discription of this command. /// public Optional Description { get; set; } - + + /// + /// Gets or sets the type for this command. + /// + public Optional Type { get; set; } /// /// Gets or sets the options for this command. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs new file mode 100644 index 0000000000..23b00f2a2e --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public enum ApplicationCommandType : byte + { + Slash = 1, + User = 2, + Message = 3 + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index eb61c539f1..ab4b3eac0b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -16,6 +16,11 @@ public interface IApplicationCommand : ISnowflakeEntity /// ulong ApplicationId { get; } + /// + /// The type of the command + /// + ApplicationCommandType Type { get; } + /// /// The name of the command. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs new file mode 100644 index 0000000000..792d7d19f4 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to build slash commands. + /// + public class MessageCommandBuilder + { + /// + /// Returns the maximun length a commands name allowed by Discord + /// + public const int MaxNameLength = 32; + /// + /// Returns the maximum length of a commands description allowed by Discord. + /// + public const int MaxDescriptionLength = 0; + + /// + /// The name of this slash command. + /// + public string Name + { + get + { + return _name; + } + set + { + Preconditions.NotNullOrEmpty(value, nameof(Name)); + Preconditions.AtLeast(value.Length, 3, nameof(Name)); + Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); + + // Discord updated the docs, this regex prevents special characters like @!$%(... etc, + // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand + if (!Regex.IsMatch(value, @"^[\w -]{3,32}$")) + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); + + _name = value; + } + } + + /// + /// A 1-100 length description of this slash command + /// + public string Description + { + get + { + return _description; + } + set + { + Preconditions.Equals(value, ""); + + _description = value; + } + } + + private string _name { get; set; } + private string _description { get; set; } + + /// + /// Build the current builder into a class. + /// + /// A that can be used to create user commands over rest. + public MessageCommandCreationProperties Build() + { + MessageCommandCreationProperties props = new MessageCommandCreationProperties() + { + Name = this.Name, + Description = this.Description, + Type=ApplicationCommandType.Message + }; + + return props; + + } + + /// + /// Sets the field name. + /// + /// The value to set the field name to. + /// + /// The current builder. + /// + public MessageCommandBuilder WithName(string name) + { + this.Name = name; + return this; + } + + /// + /// Sets the description of the current command. + /// + /// The description of this command. + /// The current builder. + public MessageCommandBuilder WithDescription(string description) + { + this.Description = description; + return this; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/MessageCommandCreationProperties.cs new file mode 100644 index 0000000000..7c7dac593d --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/MessageCommandCreationProperties.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to create Message commands. + /// + public class MessageCommandCreationProperties + { + /// + /// The name of this command. + /// + public string Name { get; set; } + + /// + /// The discription of this command. + /// + public string Description { get; set; } + + + /// + /// Gets or sets the type for this command. + /// + public ApplicationCommandType Type { get; set; } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index e0afde50cb..933f511e19 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -102,7 +102,8 @@ public SlashCommandCreationProperties Build() { Name = this.Name, Description = this.Description, - DefaultPermission = this.DefaultPermission + DefaultPermission = this.DefaultPermission, + Type = ApplicationCommandType.Slash }; if (this.Options != null && this.Options.Any()) diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs index 7f4a3a62d6..3021d7a2c2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs @@ -21,6 +21,10 @@ public class SlashCommandCreationProperties /// public string Description { get; set; } + /// + /// Gets or sets the type for this command. + /// + public ApplicationCommandType Type { get; set; } /// /// Gets or sets the options for this command. diff --git a/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs new file mode 100644 index 0000000000..0dc6526ba2 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to build slash commands. + /// + public class UserCommandBuilder + { + /// + /// Returns the maximun length a commands name allowed by Discord + /// + public const int MaxNameLength = 32; + /// + /// Returns the maximum length of a commands description allowed by Discord. + /// + public const int MaxDescriptionLength = 0; + + /// + /// The name of this slash command. + /// + public string Name + { + get + { + return _name; + } + set + { + Preconditions.NotNullOrEmpty(value, nameof(Name)); + Preconditions.AtLeast(value.Length, 3, nameof(Name)); + Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); + + // Discord updated the docs, this regex prevents special characters like @!$%(... etc, + // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand + if (!Regex.IsMatch(value, @"^[\w -]{3,32}$")) + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); + + _name = value; + } + } + + /// + /// A 1-100 length description of this slash command + /// + public string Description + { + get + { + return _description; + } + set + { + Preconditions.Equals(value, ""); + + _description = value; + } + } + + private string _name { get; set; } + private string _description { get; set; } + + /// + /// Build the current builder into a class. + /// + /// A that can be used to create user commands over rest. + public UserCommandCreationProperties Build() + { + UserCommandCreationProperties props = new UserCommandCreationProperties() + { + Name = this.Name, + Description = this.Description, + Type=ApplicationCommandType.User + }; + + return props; + + } + + /// + /// Sets the field name. + /// + /// The value to set the field name to. + /// + /// The current builder. + /// + public UserCommandBuilder WithName(string name) + { + this.Name = name; + return this; + } + + /// + /// Sets the description of the current command. + /// + /// The description of this command. + /// The current builder. + public UserCommandBuilder WithDescription(string description) + { + this.Description = description; + return this; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs new file mode 100644 index 0000000000..323b2ce1da --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to create User commands. + /// + public class UserCommandCreationProperties + { + /// + /// The name of this command. + /// + public string Name { get; set; } + + /// + /// The discription of this command. + /// + public string Description { get; set; } + + + /// + /// Gets or sets the type for this command. + /// + public ApplicationCommandType Type { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs index 2e66245d7b..ff72429a37 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs @@ -13,6 +13,9 @@ internal class CreateApplicationCommandParams [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("type")] + public ApplicationCommandType Type { get; set; } + [JsonProperty("description")] public string Description { get; set; } @@ -23,11 +26,12 @@ internal class CreateApplicationCommandParams public Optional DefaultPermission { get; set; } public CreateApplicationCommandParams() { } - public CreateApplicationCommandParams(string name, string description, ApplicationCommandOption[] options = null) + public CreateApplicationCommandParams(string name, string description, ApplicationCommandType type, ApplicationCommandOption[] options = null) { this.Name = name; this.Description = description; this.Options = Optional.Create(options); + this.Type = type; } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs index 2ed9466c07..29a6ff7968 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs @@ -15,6 +15,9 @@ internal class ModifyApplicationCommandParams [JsonProperty("description")] public Optional Description { get; set; } + [JsonProperty("type")] + public Optional Type { get; set; } + [JsonProperty("options")] public Optional Options { get; set; } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 920e0bf603..c6c81ee75a 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3732,6 +3732,9 @@ + + + @@ -3831,6 +3834,32 @@ The modified command. + + + + + + Modifies this . + + The delegate containing the properties to modify the command with. + The options to be used when sending the request. + + The modified command. + + + + + + + + Modifies this . + + The delegate containing the properties to modify the command with. + The options to be used when sending the request. + + The modified command. + + Represents a Rest-based guild command. @@ -3886,6 +3915,74 @@ . + + + Represents a Rest-based guild command. + + + + + The guild Id where this command originates. + + + + + + + + Modifies this . + + The delegate containing the properties to modify the command with. + The options to be used when sending the request. + + The modified command + + + + + Gets the guild that this slash command resides in. + + if you want the approximate member and presence counts for the guild, otherwise . + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a + . + + + + + Represents a Rest-based guild command. + + + + + The guild Id where this command originates. + + + + + + + + Modifies this . + + The delegate containing the properties to modify the command with. + The options to be used when sending the request. + + The modified command + + + + + Gets the guild that this slash command resides in. + + if you want the approximate member and presence counts for the guild, otherwise . + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a + . + + diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 3e9ed43931..350a156c7b 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -235,6 +235,7 @@ public async Task SendJsonAsync(string method, string endp options.BucketId = bucketId; string json = payload != null ? SerializeJson(payload) : null; + Console.WriteLine($"Sending JSON....\n{json}"); var request = new JsonRestRequest(RestClient, method, endpoint, json, options); return DeserializeJson(await SendInternalAsync(method, endpoint, request).ConfigureAwait(false)); } @@ -1082,6 +1083,18 @@ public async Task ModifyGlobalApplicationCommandAsync(Modify return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } + public async Task ModifyGlobalApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + } + public async Task ModifyGlobalApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + } public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); @@ -1095,6 +1108,46 @@ public async Task BulkOverwriteGlobalApplicationCommands(C return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); } + public async Task CreateGlobalApplicationUserCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); + Preconditions.Equals(command.Description, ""); + + options = RequestOptions.CreateOrClone(options); + + + + return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); + } + public async Task CreateGlobalApplicationMessageCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); + Preconditions.Equals(command.Description, ""); + + options = RequestOptions.CreateOrClone(options); + + + + return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); + } + + public async Task BulkOverwriteGlobalApplicationUserCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); + } + + public async Task BulkOverwriteGlobalApplicationMessageCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); + } public async Task GetGuildApplicationCommandsAsync(ulong guildId, RequestOptions options = null) { @@ -1163,6 +1216,87 @@ public async Task BulkOverwriteGuildApplicationCommands(ul return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); } + public async Task CreateGuildApplicationUserCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); + + } + public async Task ModifyGuildApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + try + { + return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); + } + catch (HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } + + // Re-throw the http exception + throw; + } + } + public async Task BulkOverwriteGuildApplicationUserCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); + } + + public async Task CreateGuildApplicationMessageCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); + + } + public async Task ModifyGuildApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + try + { + return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); + } + catch (HttpException x) + { + if (x.HttpCode == HttpStatusCode.BadRequest) + { + var json = (x.Request as JsonRestRequest).Json; + throw new ApplicationCommandException(json, x); + } + + // Re-throw the http exception + throw; + } + } + + public async Task BulkOverwriteGuildApplicationMessageCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(guildId: guildId); + + return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); + } + //Interaction Responses public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index a8849525e4..cb28d19b65 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -1,3 +1,4 @@ +//using Discord.Rest.Entities.Interactions; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -111,10 +112,26 @@ public Task CreateGlobalCommand(SlashCommandCreationPropertie => InteractionHelper.CreateGlobalCommand(this, properties, options); public Task CreateGlobalCommand(Action func, RequestOptions options = null) => InteractionHelper.CreateGlobalCommand(this, func, options); + public Task CreateGlobalUserCommand(UserCommandCreationProperties properties, RequestOptions options = null) + => InteractionHelper.CreateGlobalUserCommand(this, properties, options); + public Task CreateGlobalUserCommand(Action func, RequestOptions options = null) + => InteractionHelper.CreateGlobalUserCommand(this, func, options); + public Task CreateGlobalMessageCommand(MessageCommandCreationProperties properties, RequestOptions options = null) + => InteractionHelper.CreateGlobalMessageCommand(this, properties, options); + public Task CreateGlobalMessageCommand(Action func, RequestOptions options = null) + => InteractionHelper.CreateGlobalMessageCommand(this, func, options); public Task CreateGuildCommand(SlashCommandCreationProperties properties, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildCommand(this, guildId, properties, options); public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildCommand(this, guildId, func, options); + public Task CreateGuildUserCommand(UserCommandCreationProperties properties, ulong guildId, RequestOptions options = null) + => InteractionHelper.CreateGuildUserCommand(this, guildId, properties, options); + public Task CreateGuildUserCommand(Action func, ulong guildId, RequestOptions options = null) + => InteractionHelper.CreateGuildUserCommand(this, guildId, func, options); + public Task CreateGuildMessageCommand(MessageCommandCreationProperties properties, ulong guildId, RequestOptions options = null) + => InteractionHelper.CreateGuildMessageCommand(this, guildId, properties, options); + public Task CreateGuildMessageCommand(Action func, ulong guildId, RequestOptions options = null) + => InteractionHelper.CreateGuildMessageCommand(this, guildId, func, options); public Task> GetGlobalApplicationCommands(RequestOptions options = null) => ClientHelper.GetGlobalApplicationCommands(this, options); public Task> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index e4df0d75e6..d5006a6a92 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -1,6 +1,7 @@ using Discord.API; using Discord.API.Rest; using Discord.Net; +//using Discord.Rest.Entities.Interactions; using System; using System.Collections.Generic; using System.Linq; @@ -63,6 +64,7 @@ public static async Task CreateGlobalCommand(BaseDiscordClien { Name = arg.Name, Description = arg.Description, + Type= arg.Type, Options = arg.Options.IsSpecified ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified, @@ -94,6 +96,7 @@ public static async Task> BulkOverwriteGl { Name = arg.Name, Description = arg.Description, + Type = arg.Type, Options = arg.Options.IsSpecified ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified, @@ -129,6 +132,7 @@ public static async Task> BulkOverwriteGui { Name = arg.Name, Description = arg.Description, + Type = arg.Type, Options = arg.Options.IsSpecified ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified, @@ -173,6 +177,7 @@ public static async Task ModifyGlobalCommand(BaseDiscordClien { Name = args.Name, Description = args.Description, + Type = args.Type, Options = args.Options.IsSpecified ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified, @@ -195,6 +200,174 @@ public static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGloba await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); } + public static async Task CreateGlobalUserCommand(BaseDiscordClient client, Action func, RequestOptions options = null) + { + var args = new UserCommandCreationProperties(); + func(args); + return await CreateGlobalUserCommand(client, args, options).ConfigureAwait(false); + } + + public static async Task CreateGlobalUserCommand(BaseDiscordClient client, UserCommandCreationProperties arg, RequestOptions options = null) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.Equals(arg.Description, ""); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + var cmd = await client.ApiClient.CreateGlobalApplicationUserCommandAsync(model, options).ConfigureAwait(false); + return RestGlobalUserCommand.Create(client, cmd); + } + + public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, Action func, RequestOptions options = null) + { + var args = new MessageCommandCreationProperties(); + func(args); + return await CreateGlobalMessageCommand(client, args, options).ConfigureAwait(false); + } + + public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, MessageCommandCreationProperties arg, RequestOptions options = null) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.Equals(arg.Description, ""); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + var cmd = await client.ApiClient.CreateGlobalApplicationMessageCommandAsync(model, options).ConfigureAwait(false); + return RestGlobalMessageCommand.Create(client, cmd); + } + + public static async Task> BulkOverwriteGlobalUserCommands(BaseDiscordClient client, UserCommandCreationProperties[] args, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + + List models = new List(); + + foreach (var arg in args) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); + Preconditions.Equals(arg.Type, ApplicationCommandType.User); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + models.Add(model); + } + + var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationUserCommands(models.ToArray(), options); + + return apiModels.Select(x => RestGlobalUserCommand.Create(client, x)).ToArray(); + } + public static async Task ModifyGlobalUserCommand(BaseDiscordClient client, RestGlobalUserCommand command, + Action func, RequestOptions options = null) + { + ApplicationCommandProperties args = new ApplicationCommandProperties(); + func(args); + + if (args.Name.IsSpecified) + { + Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + } + if (args.Description.IsSpecified) + { + Preconditions.Equals(args.Description.Value, ""); + } + + var model = new Discord.API.Rest.ModifyApplicationCommandParams() + { + Name = args.Name, + Description = args.Description + }; + + var msg = await client.ApiClient.ModifyGlobalApplicationUserCommandAsync(model, command.Id, options).ConfigureAwait(false); + command.Update(msg); + return command; + } + + public static async Task DeleteGlobalUserCommand(BaseDiscordClient client, RestGlobalUserCommand command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); + + await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); + } + + public static async Task> BulkOverwriteGlobalMessageCommands(BaseDiscordClient client, MessageCommandCreationProperties[] args, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + + List models = new List(); + + foreach (var arg in args) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); + Preconditions.Equals(arg.Type, ApplicationCommandType.Message); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + models.Add(model); + } + + var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationMessageCommands(models.ToArray(), options); + + return apiModels.Select(x => RestGlobalMessageCommand.Create(client, x)).ToArray(); + } + public static async Task ModifyGlobalMessageCommand(BaseDiscordClient client, RestGlobalMessageCommand command, + Action func, RequestOptions options = null) + { + ApplicationCommandProperties args = new ApplicationCommandProperties(); + func(args); + + if (args.Name.IsSpecified) + { + Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + } + if (args.Description.IsSpecified) + { + Preconditions.Equals(args.Description.Value, ""); + } + + var model = new Discord.API.Rest.ModifyApplicationCommandParams() + { + Name = args.Name, + Description = args.Description + }; + + var msg = await client.ApiClient.ModifyGlobalApplicationMessageCommandAsync(model, command.Id, options).ConfigureAwait(false); + command.Update(msg); + return command; + } + + public static async Task DeleteGlobalMessageCommand(BaseDiscordClient client, RestGlobalMessageCommand command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); + + await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); + } + // Guild Commands public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) @@ -231,6 +404,7 @@ public static async Task CreateGuildCommand(BaseDiscordClient { Name = args.Name, Description = args.Description, + Type = args.Type, Options = args.Options.IsSpecified ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified, @@ -269,6 +443,7 @@ public static async Task ModifyGuildCommand(BaseDiscordClient { Name = args.Name, Description = args.Description, + Type = args.Type, Options = args.Options.IsSpecified ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified, @@ -290,6 +465,177 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); } + public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) + { + var args = new UserCommandCreationProperties(); + func(args); + return await CreateGuildUserCommand(client, guildId, args, options).ConfigureAwait(false); + } + + public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, UserCommandCreationProperties arg, RequestOptions options = null) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.Equals(arg.Description, ""); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + var cmd = await client.ApiClient.CreateGuildApplicationUserCommandAsync(model, guildId, options).ConfigureAwait(false); + return RestGuildUserCommand.Create(client, cmd, guildId); + } + + public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) + { + var args = new MessageCommandCreationProperties(); + func(args); + return await CreateGuildMessageCommand(client, guildId, args, options).ConfigureAwait(false); + } + + public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, MessageCommandCreationProperties arg, RequestOptions options = null) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.Equals(arg.Description, ""); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + var cmd = await client.ApiClient.CreateGuildApplicationMessageCommandAsync(model, guildId, options).ConfigureAwait(false); + return RestGuildMessageCommand.Create(client, cmd, guildId); + } + + public static async Task> BulkOverwriteGuildUserCommands(BaseDiscordClient client, ulong guildId, UserCommandCreationProperties[] args, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + + List models = new List(); + + foreach (var arg in args) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); + Preconditions.Equals(arg.Type, ApplicationCommandType.User); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + models.Add(model); + } + + var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationUserCommands(guildId, models.ToArray(), options); + + return apiModels.Select(x => RestGuildUserCommand.Create(client, x, guildId)).ToArray(); + } + public static async Task ModifyGuildUserCommand(BaseDiscordClient client, RestGuildUserCommand command, + Action func, RequestOptions options = null) + { + ApplicationCommandProperties args = new ApplicationCommandProperties(); + func(args); + + if (args.Name.IsSpecified) + { + Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + } + if (args.Description.IsSpecified) + { + Preconditions.Equals(args.Description.Value, ""); + } + + var model = new Discord.API.Rest.ModifyApplicationCommandParams() + { + Name = args.Name, + Description = args.Description, + Type=args.Type + }; + + var msg = await client.ApiClient.ModifyGuildApplicationUserCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); + command.Update(msg); + return command; + } + + public static async Task DeleteGuildUserCommand(BaseDiscordClient client, ulong guildId, RestGuildUserCommand command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); + + await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); + } + + public static async Task> BulkOverwriteGuildMessageCommands(BaseDiscordClient client, ulong guildId, MessageCommandCreationProperties[] args, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + + List models = new List(); + + foreach (var arg in args) + { + Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); + Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); + Preconditions.Equals(arg.Type, ApplicationCommandType.Message); + + var model = new CreateApplicationCommandParams() + { + Name = arg.Name, + Description = arg.Description, + Type = arg.Type + }; + + models.Add(model); + } + + var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationMessageCommands(guildId, models.ToArray(), options); + + return apiModels.Select(x => RestGuildMessageCommand.Create(client, x, guildId)).ToArray(); + } + public static async Task ModifyGuildMessageCommand(BaseDiscordClient client, RestGuildMessageCommand command, + Action func, RequestOptions options = null) + { + ApplicationCommandProperties args = new ApplicationCommandProperties(); + func(args); + + if (args.Name.IsSpecified) + { + Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + } + if (args.Description.IsSpecified) + { + Preconditions.Equals(args.Description.Value, ""); + } + + var model = new Discord.API.Rest.ModifyApplicationCommandParams() + { + Name = args.Name, + Description = args.Description, + Type = args.Type + }; + + var msg = await client.ApiClient.ModifyGuildApplicationMessageCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); + command.Update(msg); + return command; + } + + public static async Task DeleteGuildMessageCommand(BaseDiscordClient client, ulong guildId, RestGuildMessageCommand command, RequestOptions options = null) + { + Preconditions.NotNull(command, nameof(command)); + Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); + + await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); + } + + public static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index e1a8541875..2744c79679 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -16,6 +16,9 @@ public abstract class RestApplicationCommand : RestEntity, IApplicationCo /// public ulong ApplicationId { get; private set; } + /// + public ApplicationCommandType Type { get; private set; } + /// public string Name { get; private set; } @@ -47,13 +50,30 @@ internal RestApplicationCommand(BaseDiscordClient client, ulong id) internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, RestApplicationCommandType type, ulong guildId = 0) { - if (type == RestApplicationCommandType.GlobalCommand) - return RestGlobalCommand.Create(client, model); - - if (type == RestApplicationCommandType.GuildCommand) - return RestGuildCommand.Create(client, model, guildId); - - return null; + switch (type) + { + case RestApplicationCommandType.GlobalCommand: + return RestGlobalCommand.Create(client, model); + break; + case RestApplicationCommandType.GlobalUserCommand: + return RestGlobalUserCommand.Create(client, model); + break; + case RestApplicationCommandType.GlobalMessageCommand: + return RestGlobalMessageCommand.Create(client, model); + break; + case RestApplicationCommandType.GuildCommand: + return RestGuildCommand.Create(client, model, guildId); + break; + case RestApplicationCommandType.GuildUserCommand: + return RestGuildUserCommand.Create(client, model, guildId); + break; + case RestApplicationCommandType.GuildMessageCommand: + return RestGuildMessageCommand.Create(client, model, guildId); + break; + default: + return null; + break; + } } internal virtual void Update(Model model) diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs index 96ba070534..cf2fb11109 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs @@ -15,10 +15,14 @@ public enum RestApplicationCommandType /// Specifies that this command is a Global command. /// GlobalCommand, + GlobalUserCommand, + GlobalMessageCommand, /// /// Specifies that this command is a Guild specific command. /// - GuildCommand + GuildCommand, + GuildUserCommand, + GuildMessageCommand } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs new file mode 100644 index 0000000000..2c0ed222cd --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + public class RestGlobalMessageCommand : RestApplicationCommand + { + internal RestGlobalMessageCommand(BaseDiscordClient client, ulong id) + : base(client, id) + { + this.CommandType = RestApplicationCommandType.GlobalMessageCommand; +} + + internal static RestGlobalMessageCommand Create(BaseDiscordClient client, Model model) + { + var entity = new RestGlobalMessageCommand(client, model.Id); + entity.Update(model); + return entity; + } + + /// + public override async Task DeleteAsync(RequestOptions options = null) + => await InteractionHelper.DeleteGlobalMessageCommand(Discord, this).ConfigureAwait(false); + + /// + /// Modifies this . + /// + /// The delegate containing the properties to modify the command with. + /// The options to be used when sending the request. + /// + /// The modified command. + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + => await InteractionHelper.ModifyGlobalMessageCommand(Discord, this, func, options).ConfigureAwait(false); + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs new file mode 100644 index 0000000000..9816863796 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + public class RestGlobalUserCommand : RestApplicationCommand + { + internal RestGlobalUserCommand(BaseDiscordClient client, ulong id) + : base(client, id) + { + this.CommandType = RestApplicationCommandType.GlobalUserCommand; + } + + internal static RestGlobalUserCommand Create(BaseDiscordClient client, Model model) + { + var entity = new RestGlobalUserCommand(client, model.Id); + entity.Update(model); + return entity; + } + + /// + public override async Task DeleteAsync(RequestOptions options = null) + => await InteractionHelper.DeleteGlobalUserCommand(Discord, this).ConfigureAwait(false); + + /// + /// Modifies this . + /// + /// The delegate containing the properties to modify the command with. + /// The options to be used when sending the request. + /// + /// The modified command. + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + => await InteractionHelper.ModifyGlobalUserCommand(Discord, this, func, options).ConfigureAwait(false); + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs new file mode 100644 index 0000000000..e057b2fe31 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + /// + /// Represents a Rest-based guild command. + /// + public class RestGuildMessageCommand : RestApplicationCommand + { + /// + /// The guild Id where this command originates. + /// + public ulong GuildId { get; private set; } + + internal RestGuildMessageCommand(BaseDiscordClient client, ulong id, ulong guildId) + : base(client, id) + { + this.CommandType = RestApplicationCommandType.GuildMessageCommand; + this.GuildId = guildId; + } + + internal static RestGuildMessageCommand Create(BaseDiscordClient client, Model model, ulong guildId) + { + var entity = new RestGuildMessageCommand(client, model.Id, guildId); + entity.Update(model); + return entity; + } + + /// + public override async Task DeleteAsync(RequestOptions options = null) + => await InteractionHelper.DeleteGuildMessageCommand(Discord, GuildId, this).ConfigureAwait(false); + + /// + /// Modifies this . + /// + /// The delegate containing the properties to modify the command with. + /// The options to be used when sending the request. + /// + /// The modified command + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + => await InteractionHelper.ModifyGuildMessageCommand(Discord, this, func, options).ConfigureAwait(false); + + /// + /// Gets the guild that this slash command resides in. + /// + /// if you want the approximate member and presence counts for the guild, otherwise . + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a + /// . + /// + public Task GetGuild(bool withCounts = false, RequestOptions options = null) + => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); + } +} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs new file mode 100644 index 0000000000..02dc173db1 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommand; + +namespace Discord.Rest +{ + /// + /// Represents a Rest-based guild command. + /// + public class RestGuildUserCommand : RestApplicationCommand + { + /// + /// The guild Id where this command originates. + /// + public ulong GuildId { get; private set; } + + internal RestGuildUserCommand(BaseDiscordClient client, ulong id, ulong guildId) + : base(client, id) + { + this.CommandType = RestApplicationCommandType.GuildUserCommand; + this.GuildId = guildId; + } + + internal static RestGuildUserCommand Create(BaseDiscordClient client, Model model, ulong guildId) + { + var entity = new RestGuildUserCommand(client, model.Id, guildId); + entity.Update(model); + return entity; + } + + /// + public override async Task DeleteAsync(RequestOptions options = null) + => await InteractionHelper.DeleteGuildUserCommand(Discord, GuildId, this).ConfigureAwait(false); + + /// + /// Modifies this . + /// + /// The delegate containing the properties to modify the command with. + /// The options to be used when sending the request. + /// + /// The modified command + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + => await InteractionHelper.ModifyGuildUserCommand(Discord, this, func, options).ConfigureAwait(false); + + /// + /// Gets the guild that this slash command resides in. + /// + /// if you want the approximate member and presence counts for the guild, otherwise . + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a + /// . + /// + public Task GetGuild(bool withCounts = false, RequestOptions options = null) + => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); + } +} diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index d22c004291..bec25d2859 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3668,6 +3668,9 @@ + + + diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs index 81decb4be4..9f53af562b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs @@ -20,6 +20,9 @@ public class SocketApplicationCommand : SocketEntity, IApplicationCommand /// public string Name { get; private set; } + /// + public ApplicationCommandType Type { get; private set; } + /// public string Description { get; private set; } From 9fb64e6eb5abc9e6c1f9b3a4cd6016ebbd06c615 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Fri, 13 Aug 2021 14:56:37 -0400 Subject: [PATCH 172/494] oops --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index babda86b72..f0be100599 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.3.1.0 + 3.0.0-pre Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png From d48874437852b7ad65897a0fa80ee0efac655de1 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Sat, 14 Aug 2021 07:57:04 -0400 Subject: [PATCH 173/494] handling context menu usage events --- .../ApplicationCommandInteractionData.cs | 3 + ...plicationCommandInteractionDataResolved.cs | 2 + .../Discord.Net.WebSocket.xml | 64 +++++++ .../SocketApplicationMessageCommand.cs | 165 ++++++++++++++++++ .../SocketApplicationMessageCommandData.cs | 140 +++++++++++++++ .../SocketApplicationUserCommand.cs | 165 ++++++++++++++++++ .../SocketApplicationUserCommandData.cs | 113 ++++++++++++ .../Entities/Interaction/SocketInteraction.cs | 14 ++ 8 files changed, 666 insertions(+) create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index c0ced154ac..ed86b0b4a8 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -17,5 +17,8 @@ internal class ApplicationCommandInteractionData : IDiscordInteractionData [JsonProperty("resolved")] public Optional Resolved { get; set; } + [JsonProperty("type")] + public Optional Type { get; set; } + } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs index 46eca6b718..5b4b83e233 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataResolved.cs @@ -16,5 +16,7 @@ internal class ApplicationCommandInteractionDataResolved [JsonProperty("roles")] public Optional> Roles { get; set; } + [JsonProperty("messages")] + public Optional> Messages { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index bec25d2859..c2af7b3587 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3599,6 +3599,70 @@ + + + Represents a Websocket-based slash command received over the gateway. + + + + + The data associated with this interaction. + + + + + + + + + + + Acknowledges this interaction with the . + + + A task that represents the asynchronous operation of acknowledging the interaction. + + + + + Represents the data tied with the interaction. + + + + + + + + Represents a Websocket-based slash command received over the gateway. + + + + + The data associated with this interaction. + + + + + + + + + + + Acknowledges this interaction with the . + + + A task that represents the asynchronous operation of acknowledging the interaction. + + + + + Represents the data tied with the interaction. + + + + + Represents a Websocket-based interaction type for Message Components. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs new file mode 100644 index 0000000000..0a483b2bf6 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs @@ -0,0 +1,165 @@ +using Discord.Rest; +using System; +using System.Linq; +using System.Threading.Tasks; +using DataModel = Discord.API.ApplicationCommandInteractionData; +using Model = Discord.API.Interaction; + +namespace Discord.WebSocket +{ + /// + /// Represents a Websocket-based slash command received over the gateway. + /// + public class SocketApplicationMessageCommand : SocketSlashCommand + { + /// + /// The data associated with this interaction. + /// + new public SocketApplicationMessageCommandData Data { get; } + + internal SocketApplicationMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + : base(client, model, channel) + { + var dataModel = model.Data.IsSpecified ? + (DataModel)model.Data.Value + : null; + + ulong? guildId = null; + if (this.Channel is SocketGuildChannel guildChannel) + guildId = guildChannel.Guild.Id; + + Data = SocketApplicationMessageCommandData.Create(client, dataModel, model.Id, guildId); + } + + new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + { + var entity = new SocketApplicationMessageCommand(client, model, channel); + entity.Update(model); + return entity; + } + + internal override void Update(Model model) + { + var data = model.Data.IsSpecified ? + (DataModel)model.Data.Value + : null; + + this.Data.Update(data); + + base.Update(model); + } + + /// + public override async Task RespondAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + + if (Discord.AlwaysAcknowledgeInteractions) + { + await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); + return; + } + + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); + } + } + + var response = new API.InteractionResponse + { + Type = InteractionResponseType.ChannelMessageWithSource, + Data = new API.InteractionCallbackData + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + TTS = isTTS ? true : Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + } + }; + + if (ephemeral) + response.Data.Value.Flags = 64; + + await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); + } + + /// + public override async Task FollowupAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + + var args = new API.Rest.CreateWebhookMessageParams + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + }; + + if (ephemeral) + args.Flags = 64; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + + /// + /// Acknowledges this interaction with the . + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + public override Task DeferAsync(RequestOptions options = null) + { + var response = new API.InteractionResponse + { + Type = InteractionResponseType.DeferredChannelMessageWithSource, + }; + + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs new file mode 100644 index 0000000000..e548e4cf7e --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs @@ -0,0 +1,140 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using Model = Discord.API.ApplicationCommandInteractionData; + +namespace Discord.WebSocket +{ + /// + /// Represents the data tied with the interaction. + /// + public class SocketApplicationMessageCommandData : SocketEntity, IApplicationCommandInteractionData + { + /// + public string Name { get; private set; } + public SocketMessage Message { get; private set; } + + internal Dictionary guildMembers { get; private set; } + = new Dictionary(); + internal Dictionary users { get; private set; } + = new Dictionary(); + internal Dictionary channels { get; private set; } + = new Dictionary(); + internal Dictionary roles { get; private set; } + = new Dictionary(); + + IReadOnlyCollection IApplicationCommandInteractionData.Options => throw new System.NotImplementedException(); + + private ulong? guildId; + + private ApplicationCommandType Type; + + internal SocketApplicationMessageCommandData(DiscordSocketClient client, Model model, ulong? guildId) + : base(client, model.Id) + { + this.guildId = guildId; + + this.Type = (ApplicationCommandType)model.Type; + + if (model.Resolved.IsSpecified) + { + var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; + + var resolved = model.Resolved.Value; + + if (resolved.Users.IsSpecified) + { + foreach (var user in resolved.Users.Value) + { + var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); + + this.users.Add(ulong.Parse(user.Key), socketUser); + } + } + + if (resolved.Channels.IsSpecified) + { + foreach (var channel in resolved.Channels.Value) + { + SocketChannel socketChannel = guild != null + ? guild.GetChannel(channel.Value.Id) + : Discord.GetChannel(channel.Value.Id); + + if (socketChannel == null) + { + var channelModel = guild != null + ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() + : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); + + socketChannel = guild != null + ? SocketGuildChannel.Create(guild, Discord.State, channelModel) + : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); + } + + Discord.State.AddChannel(socketChannel); + this.channels.Add(ulong.Parse(channel.Key), socketChannel); + } + } + + if (resolved.Members.IsSpecified) + { + foreach (var member in resolved.Members.Value) + { + member.Value.User = resolved.Users.Value[member.Key]; + var user = guild.AddOrUpdateUser(member.Value); + this.guildMembers.Add(ulong.Parse(member.Key), user); + } + } + + if (resolved.Roles.IsSpecified) + { + foreach (var role in resolved.Roles.Value) + { + var socketRole = guild.AddOrUpdateRole(role.Value); + this.roles.Add(ulong.Parse(role.Key), socketRole); + } + } + + if (resolved.Messages.IsSpecified) + { + foreach (var msg in resolved.Messages.Value) + { + var channel = client.GetChannel(msg.Value.ChannelId) as ISocketMessageChannel; + + SocketUser author; + if (guild != null) + { + if (msg.Value.WebhookId.IsSpecified) + author = SocketWebhookUser.Create(guild, client.State, msg.Value.Author.Value, msg.Value.WebhookId.Value); + else + author = guild.GetUser(msg.Value.Author.Value.Id); + } + else + author = (channel as SocketChannel).GetUser(msg.Value.Author.Value.Id); + + if (channel == null) + { + if (!msg.Value.GuildId.IsSpecified) // assume it is a DM + { + channel = client.CreateDMChannel(msg.Value.ChannelId, msg.Value.Author.Value, client.State); + } + } + + this.Message = SocketMessage.Create(client, client.State, author, channel, msg.Value); + } + } + } + } + + internal static SocketApplicationMessageCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + { + var entity = new SocketApplicationMessageCommandData(client, model, guildId); + entity.Update(model); + return entity; + } + internal void Update(Model model) + { + this.Name = model.Name; + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs new file mode 100644 index 0000000000..37bdd40bdb --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs @@ -0,0 +1,165 @@ +using Discord.Rest; +using System; +using System.Linq; +using System.Threading.Tasks; +using DataModel = Discord.API.ApplicationCommandInteractionData; +using Model = Discord.API.Interaction; + +namespace Discord.WebSocket +{ + /// + /// Represents a Websocket-based slash command received over the gateway. + /// + public class SocketApplicationUserCommand : SocketSlashCommand + { + /// + /// The data associated with this interaction. + /// + new public SocketApplicationUserCommandData Data { get; } + + internal SocketApplicationUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + : base(client, model, channel) + { + var dataModel = model.Data.IsSpecified ? + (DataModel)model.Data.Value + : null; + + ulong? guildId = null; + if (this.Channel is SocketGuildChannel guildChannel) + guildId = guildChannel.Guild.Id; + + Data = SocketApplicationUserCommandData.Create(client, dataModel, model.Id, guildId); + } + + new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + { + var entity = new SocketApplicationUserCommand(client, model, channel); + entity.Update(model); + return entity; + } + + internal override void Update(Model model) + { + var data = model.Data.IsSpecified ? + (DataModel)model.Data.Value + : null; + + this.Data.Update(data); + + base.Update(model); + } + + /// + public override async Task RespondAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + + if (Discord.AlwaysAcknowledgeInteractions) + { + await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); + return; + } + + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); + } + } + + var response = new API.InteractionResponse + { + Type = InteractionResponseType.ChannelMessageWithSource, + Data = new API.InteractionCallbackData + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + TTS = isTTS ? true : Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + } + }; + + if (ephemeral) + response.Data.Value.Flags = 64; + + await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); + } + + /// + public override async Task FollowupAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + + var args = new API.Rest.CreateWebhookMessageParams + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + }; + + if (ephemeral) + args.Flags = 64; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + + /// + /// Acknowledges this interaction with the . + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + public override Task DeferAsync(RequestOptions options = null) + { + var response = new API.InteractionResponse + { + Type = InteractionResponseType.DeferredChannelMessageWithSource, + }; + + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs new file mode 100644 index 0000000000..0c5a540c7d --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs @@ -0,0 +1,113 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using Model = Discord.API.ApplicationCommandInteractionData; + +namespace Discord.WebSocket +{ + /// + /// Represents the data tied with the interaction. + /// + public class SocketApplicationUserCommandData : SocketEntity, IApplicationCommandInteractionData + { + /// + public string Name { get; private set; } + + public SocketUser Member { get; private set; } + + internal Dictionary guildMembers { get; private set; } + = new Dictionary(); + internal Dictionary users { get; private set; } + = new Dictionary(); + internal Dictionary channels { get; private set; } + = new Dictionary(); + internal Dictionary roles { get; private set; } + = new Dictionary(); + + IReadOnlyCollection IApplicationCommandInteractionData.Options => throw new System.NotImplementedException(); + + private ulong? guildId; + + private ApplicationCommandType Type; + + internal SocketApplicationUserCommandData(DiscordSocketClient client, Model model, ulong? guildId) + : base(client, model.Id) + { + this.guildId = guildId; + + this.Type = (ApplicationCommandType)model.Type; + + if (model.Resolved.IsSpecified) + { + var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; + + var resolved = model.Resolved.Value; + + if (resolved.Users.IsSpecified) + { + foreach (var user in resolved.Users.Value) + { + var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); + + this.users.Add(ulong.Parse(user.Key), socketUser); + } + } + + if (resolved.Channels.IsSpecified) + { + foreach (var channel in resolved.Channels.Value) + { + SocketChannel socketChannel = guild != null + ? guild.GetChannel(channel.Value.Id) + : Discord.GetChannel(channel.Value.Id); + + if (socketChannel == null) + { + var channelModel = guild != null + ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() + : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); + + socketChannel = guild != null + ? SocketGuildChannel.Create(guild, Discord.State, channelModel) + : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); + } + + Discord.State.AddChannel(socketChannel); + this.channels.Add(ulong.Parse(channel.Key), socketChannel); + } + } + + if (resolved.Members.IsSpecified) + { + foreach (var member in resolved.Members.Value) + { + member.Value.User = resolved.Users.Value[member.Key]; + var user = guild.AddOrUpdateUser(member.Value); + this.guildMembers.Add(ulong.Parse(member.Key), user); + this.Member = user; + } + } + + if (resolved.Roles.IsSpecified) + { + foreach (var role in resolved.Roles.Value) + { + var socketRole = guild.AddOrUpdateRole(role.Value); + this.roles.Add(ulong.Parse(role.Key), socketRole); + } + } + } + } + + internal static SocketApplicationUserCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + { + var entity = new SocketApplicationUserCommandData(client, model, guildId); + entity.Update(model); + return entity; + } + internal void Update(Model model) + { + this.Name = model.Name; + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 4b2e3baecf..01b3874f7f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -2,6 +2,7 @@ using System; using System.Threading.Tasks; using Model = Discord.API.Interaction; +using DataModel = Discord.API.ApplicationCommandInteractionData; namespace Discord.WebSocket { @@ -61,6 +62,19 @@ internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageC internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { if (model.Type == InteractionType.ApplicationCommand) + if(model.ApplicationId != null) + { + var dataModel = model.Data.IsSpecified ? + (DataModel)model.Data.Value + : null; + if(dataModel != null) + { + if (dataModel.Type.Equals(ApplicationCommandType.User)) + return SocketApplicationUserCommand.Create(client, model, channel); + if (dataModel.Type.Equals(ApplicationCommandType.Message)) + return SocketApplicationMessageCommand.Create(client, model, channel); + } + } return SocketSlashCommand.Create(client, model, channel); if (model.Type == InteractionType.MessageComponent) return SocketMessageComponent.Create(client, model, channel); From 66a8f9a684d14f29551c18e8af8e4f29f0e2c4b1 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Sat, 14 Aug 2021 08:24:02 -0400 Subject: [PATCH 174/494] debugging line removed. --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 350a156c7b..42cde4cfc8 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -235,7 +235,7 @@ public async Task SendJsonAsync(string method, string endp options.BucketId = bucketId; string json = payload != null ? SerializeJson(payload) : null; - Console.WriteLine($"Sending JSON....\n{json}"); + var request = new JsonRestRequest(RestClient, method, endpoint, json, options); return DeserializeJson(await SendInternalAsync(method, endpoint, request).ConfigureAwait(false)); } From 8c1a26f6978414b1a4aff3fa9ccff5c4f75f7321 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Sat, 14 Aug 2021 11:10:22 -0400 Subject: [PATCH 175/494] Moved SocketCommandBase in front of slash/user/message commands --- .../Discord.Net.WebSocket.xml | 114 ++++++------ .../SocketApplicationMessageCommand.cs | 126 +------------- .../SocketApplicationMessageCommandData.cs | 2 +- .../SocketApplicationUserCommand.cs | 128 +------------- .../SocketApplicationUserCommandData.cs | 2 +- .../Slash Commands/SocketSlashCommand.cs | 130 +------------- .../SocketApplicationCommand.cs | 0 .../SocketApplicationCommandChoice.cs | 0 .../SocketApplicationCommandOption.cs | 0 .../SocketBaseCommand/SocketCommandBase.cs | 164 ++++++++++++++++++ .../SocketCommandBaseData.cs | 145 ++++++++++++++++ .../SocketCommandBaseDataOption.cs | 130 ++++++++++++++ .../Entities/Interaction/SocketInteraction.cs | 6 +- 13 files changed, 502 insertions(+), 445 deletions(-) rename src/Discord.Net.WebSocket/Entities/Interaction/{Slash Commands => SocketBaseCommand}/SocketApplicationCommand.cs (100%) rename src/Discord.Net.WebSocket/Entities/Interaction/{Slash Commands => SocketBaseCommand}/SocketApplicationCommandChoice.cs (100%) rename src/Discord.Net.WebSocket/Entities/Interaction/{Slash Commands => SocketBaseCommand}/SocketApplicationCommandOption.cs (100%) create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index c2af7b3587..742bebac08 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3609,23 +3609,9 @@ The data associated with this interaction. - - - - - - - - - Acknowledges this interaction with the . - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - Represents the data tied with the interaction. + Represents the data tied with the interaction. @@ -3641,23 +3627,9 @@ The data associated with this interaction. - - - - - - - - - Acknowledges this interaction with the . - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - Represents the data tied with the interaction. + Represents the data tied with the interaction. @@ -3721,6 +3693,48 @@ The value(s) of a interaction response. + + + Represents a Websocket-based slash command received over the gateway. + + + + + The data associated with this interaction. + + + + + Represents the data tied with the interaction. + + + + + + + + The 's received with this interaction. + + + + + Represents a Websocket-based recieved by the gateway + + + + + + + + + + + + + + The sub command options received for this sub command group. + + Represends a Websocket-based recieved over the gateway. @@ -3798,23 +3812,18 @@ If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - Represents a Websocket-based slash command received over the gateway. - - - + The data associated with this interaction. - + - + - + Acknowledges this interaction with the . @@ -3822,34 +3831,13 @@ A task that represents the asynchronous operation of acknowledging the interaction. - - - Represents the data tied with the interaction. - - - - - - - - The 's received with this interaction. - - - - - Represents a Websocket-based recieved by the gateway - - - - - - + - + - + The sub command options received for this sub command group. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs index 0a483b2bf6..828ed14bb1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs @@ -10,7 +10,7 @@ namespace Discord.WebSocket /// /// Represents a Websocket-based slash command received over the gateway. /// - public class SocketApplicationMessageCommand : SocketSlashCommand + public class SocketApplicationMessageCommand : SocketCommandBase { /// /// The data associated with this interaction. @@ -37,129 +37,5 @@ internal SocketApplicationMessageCommand(DiscordSocketClient client, Model model entity.Update(model); return entity; } - - internal override void Update(Model model) - { - var data = model.Data.IsSpecified ? - (DataModel)model.Data.Value - : null; - - this.Data.Update(data); - - base.Update(model); - } - - /// - public override async Task RespondAsync( - string text = null, - Embed[] embeds = null, - bool isTTS = false, - bool ephemeral = false, - AllowedMentions allowedMentions = null, - RequestOptions options = null, - MessageComponent component = null, - Embed embed = null) - { - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - if (embeds == null && embed != null) - embeds = new[] { embed }; - - if (Discord.AlwaysAcknowledgeInteractions) - { - await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); - return; - } - - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - - // check that user flag and user Id list are exclusive, same with role flag and role Id list - if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) - { - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && - allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) - { - throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); - } - - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && - allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) - { - throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); - } - } - - var response = new API.InteractionResponse - { - Type = InteractionResponseType.ChannelMessageWithSource, - Data = new API.InteractionCallbackData - { - Content = text, - AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - TTS = isTTS ? true : Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified - } - }; - - if (ephemeral) - response.Data.Value.Flags = 64; - - await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); - } - - /// - public override async Task FollowupAsync( - string text = null, - Embed[] embeds = null, - bool isTTS = false, - bool ephemeral = false, - AllowedMentions allowedMentions = null, - RequestOptions options = null, - MessageComponent component = null, - Embed embed = null) - { - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - if (embeds == null && embed != null) - embeds = new[] { embed }; - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - - var args = new API.Rest.CreateWebhookMessageParams - { - Content = text, - AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified - }; - - if (ephemeral) - args.Flags = 64; - - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); - } - - /// - /// Acknowledges this interaction with the . - /// - /// - /// A task that represents the asynchronous operation of acknowledging the interaction. - /// - public override Task DeferAsync(RequestOptions options = null) - { - var response = new API.InteractionResponse - { - Type = InteractionResponseType.DeferredChannelMessageWithSource, - }; - - return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); - } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs index e548e4cf7e..ead330ef64 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs @@ -6,7 +6,7 @@ namespace Discord.WebSocket { /// - /// Represents the data tied with the interaction. + /// Represents the data tied with the interaction. /// public class SocketApplicationMessageCommandData : SocketEntity, IApplicationCommandInteractionData { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs index 37bdd40bdb..603a113973 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs @@ -10,7 +10,7 @@ namespace Discord.WebSocket /// /// Represents a Websocket-based slash command received over the gateway. /// - public class SocketApplicationUserCommand : SocketSlashCommand + public class SocketApplicationUserCommand : SocketCommandBase { /// /// The data associated with this interaction. @@ -36,130 +36,6 @@ internal SocketApplicationUserCommand(DiscordSocketClient client, Model model, I var entity = new SocketApplicationUserCommand(client, model, channel); entity.Update(model); return entity; - } - - internal override void Update(Model model) - { - var data = model.Data.IsSpecified ? - (DataModel)model.Data.Value - : null; - - this.Data.Update(data); - - base.Update(model); - } - - /// - public override async Task RespondAsync( - string text = null, - Embed[] embeds = null, - bool isTTS = false, - bool ephemeral = false, - AllowedMentions allowedMentions = null, - RequestOptions options = null, - MessageComponent component = null, - Embed embed = null) - { - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - if (embeds == null && embed != null) - embeds = new[] { embed }; - - if (Discord.AlwaysAcknowledgeInteractions) - { - await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); - return; - } - - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - - // check that user flag and user Id list are exclusive, same with role flag and role Id list - if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) - { - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && - allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) - { - throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); - } - - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && - allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) - { - throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); - } - } - - var response = new API.InteractionResponse - { - Type = InteractionResponseType.ChannelMessageWithSource, - Data = new API.InteractionCallbackData - { - Content = text, - AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - TTS = isTTS ? true : Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified - } - }; - - if (ephemeral) - response.Data.Value.Flags = 64; - - await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); - } - - /// - public override async Task FollowupAsync( - string text = null, - Embed[] embeds = null, - bool isTTS = false, - bool ephemeral = false, - AllowedMentions allowedMentions = null, - RequestOptions options = null, - MessageComponent component = null, - Embed embed = null) - { - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - if (embeds == null && embed != null) - embeds = new[] { embed }; - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - - var args = new API.Rest.CreateWebhookMessageParams - { - Content = text, - AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified - }; - - if (ephemeral) - args.Flags = 64; - - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); - } - - /// - /// Acknowledges this interaction with the . - /// - /// - /// A task that represents the asynchronous operation of acknowledging the interaction. - /// - public override Task DeferAsync(RequestOptions options = null) - { - var response = new API.InteractionResponse - { - Type = InteractionResponseType.DeferredChannelMessageWithSource, - }; - - return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); - } + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs index 0c5a540c7d..a6eb24ca52 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs @@ -6,7 +6,7 @@ namespace Discord.WebSocket { /// - /// Represents the data tied with the interaction. + /// Represents the data tied with the interaction. /// public class SocketApplicationUserCommandData : SocketEntity, IApplicationCommandInteractionData { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 2452746139..3013099c75 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -10,7 +10,7 @@ namespace Discord.WebSocket /// /// Represents a Websocket-based slash command received over the gateway. /// - public class SocketSlashCommand : SocketInteraction + public class SocketSlashCommand : SocketCommandBase { /// /// The data associated with this interaction. @@ -18,7 +18,7 @@ public class SocketSlashCommand : SocketInteraction new public SocketSlashCommandData Data { get; } internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) - : base(client, model.Id, channel) + : base(client, model, channel) { var dataModel = model.Data.IsSpecified ? (DataModel)model.Data.Value @@ -36,130 +36,6 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess var entity = new SocketSlashCommand(client, model, channel); entity.Update(model); return entity; - } - - internal override void Update(Model model) - { - var data = model.Data.IsSpecified ? - (DataModel)model.Data.Value - : null; - - this.Data.Update(data); - - base.Update(model); - } - - /// - public override async Task RespondAsync( - string text = null, - Embed[] embeds = null, - bool isTTS = false, - bool ephemeral = false, - AllowedMentions allowedMentions = null, - RequestOptions options = null, - MessageComponent component = null, - Embed embed = null) - { - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - if (embeds == null && embed != null) - embeds = new[] { embed }; - - if (Discord.AlwaysAcknowledgeInteractions) - { - await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); - return; - } - - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - - // check that user flag and user Id list are exclusive, same with role flag and role Id list - if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) - { - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && - allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) - { - throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); - } - - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && - allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) - { - throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); - } - } - - var response = new API.InteractionResponse - { - Type = InteractionResponseType.ChannelMessageWithSource, - Data = new API.InteractionCallbackData - { - Content = text, - AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - TTS = isTTS ? true : Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified - } - }; - - if (ephemeral) - response.Data.Value.Flags = 64; - - await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); - } - - /// - public override async Task FollowupAsync( - string text = null, - Embed[] embeds = null, - bool isTTS = false, - bool ephemeral = false, - AllowedMentions allowedMentions = null, - RequestOptions options = null, - MessageComponent component = null, - Embed embed = null) - { - if (!IsValidToken) - throw new InvalidOperationException("Interaction token is no longer valid"); - - if (embeds == null && embed != null) - embeds = new[] { embed }; - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - - var args = new API.Rest.CreateWebhookMessageParams - { - Content = text, - AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified - }; - - if (ephemeral) - args.Flags = 64; - - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); - } - - /// - /// Acknowledges this interaction with the . - /// - /// - /// A task that represents the asynchronous operation of acknowledging the interaction. - /// - public override Task DeferAsync(RequestOptions options = null) - { - var response = new API.InteractionResponse - { - Type = InteractionResponseType.DeferredChannelMessageWithSource, - }; - - return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); - } + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs similarity index 100% rename from src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommand.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandChoice.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs similarity index 100% rename from src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandChoice.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs similarity index 100% rename from src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketApplicationCommandOption.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs new file mode 100644 index 0000000000..9fd25ac5dd --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -0,0 +1,164 @@ +using Discord.Rest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataModel = Discord.API.ApplicationCommandInteractionData; +using Model = Discord.API.Interaction; + +namespace Discord.WebSocket +{ + public class SocketCommandBase : SocketInteraction + { + /// + /// The data associated with this interaction. + /// + new internal SocketCommandBaseData Data { get; } + + internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + : base(client, model.Id, channel) + { + var dataModel = model.Data.IsSpecified ? + (DataModel)model.Data.Value + : null; + + ulong? guildId = null; + if (this.Channel is SocketGuildChannel guildChannel) + guildId = guildChannel.Guild.Id; + + Data = SocketCommandBaseData.Create(client, dataModel, model.Id, guildId); + } + + new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + { + var entity = new SocketSlashCommand(client, model, channel); + entity.Update(model); + return entity; + } + + internal override void Update(Model model) + { + var data = model.Data.IsSpecified ? + (DataModel)model.Data.Value + : null; + + this.Data.Update(data); + + base.Update(model); + } + + /// + public override async Task RespondAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + + if (Discord.AlwaysAcknowledgeInteractions) + { + await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); + return; + } + + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + + // check that user flag and user Id list are exclusive, same with role flag and role Id list + if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) + { + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && + allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) + { + throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); + } + + if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && + allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) + { + throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); + } + } + + var response = new API.InteractionResponse + { + Type = InteractionResponseType.ChannelMessageWithSource, + Data = new API.InteractionCallbackData + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + TTS = isTTS ? true : Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + } + }; + + if (ephemeral) + response.Data.Value.Flags = 64; + + await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); + } + + /// + public override async Task FollowupAsync( + string text = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + + var args = new API.Rest.CreateWebhookMessageParams + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + }; + + if (ephemeral) + args.Flags = 64; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + + /// + /// Acknowledges this interaction with the . + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + public override Task DeferAsync(RequestOptions options = null) + { + var response = new API.InteractionResponse + { + Type = InteractionResponseType.DeferredChannelMessageWithSource, + }; + + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs new file mode 100644 index 0000000000..7d7dbbce7b --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs @@ -0,0 +1,145 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using Model = Discord.API.ApplicationCommandInteractionData; + +namespace Discord.WebSocket +{ + public class SocketCommandBaseData : SocketEntity, IApplicationCommandInteractionData + { + public string Name { get; private set; } + + public IReadOnlyCollection Options { get; private set; } + // id + // type + internal Dictionary guildMembers { get; private set; } + = new Dictionary(); + internal Dictionary users { get; private set; } + = new Dictionary(); + internal Dictionary channels { get; private set; } + = new Dictionary(); + internal Dictionary roles { get; private set; } + = new Dictionary(); + + private ulong? guildId; + + internal SocketMessage Message { get; private set; } + + private ApplicationCommandType Type { get; set; } + + internal SocketCommandBaseData(DiscordSocketClient client, Model model, ulong? guildId) + : base(client, model.Id) + { + this.guildId = guildId; + + this.Type = (ApplicationCommandType)model.Type; + + if (model.Resolved.IsSpecified) + { + var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; + + var resolved = model.Resolved.Value; + + if (resolved.Users.IsSpecified) + { + foreach (var user in resolved.Users.Value) + { + var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); + + this.users.Add(ulong.Parse(user.Key), socketUser); + } + } + + if (resolved.Channels.IsSpecified) + { + foreach (var channel in resolved.Channels.Value) + { + SocketChannel socketChannel = guild != null + ? guild.GetChannel(channel.Value.Id) + : Discord.GetChannel(channel.Value.Id); + + if (socketChannel == null) + { + var channelModel = guild != null + ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() + : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); + + socketChannel = guild != null + ? SocketGuildChannel.Create(guild, Discord.State, channelModel) + : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); + } + + Discord.State.AddChannel(socketChannel); + this.channels.Add(ulong.Parse(channel.Key), socketChannel); + } + } + + if (resolved.Members.IsSpecified) + { + foreach (var member in resolved.Members.Value) + { + member.Value.User = resolved.Users.Value[member.Key]; + var user = guild.AddOrUpdateUser(member.Value); + this.guildMembers.Add(ulong.Parse(member.Key), user); + } + } + + if (resolved.Roles.IsSpecified) + { + foreach (var role in resolved.Roles.Value) + { + var socketRole = guild.AddOrUpdateRole(role.Value); + this.roles.Add(ulong.Parse(role.Key), socketRole); + } + } + + if (resolved.Messages.IsSpecified) + { + foreach (var msg in resolved.Messages.Value) + { + var channel = client.GetChannel(msg.Value.ChannelId) as ISocketMessageChannel; + + SocketUser author; + if (guild != null) + { + if (msg.Value.WebhookId.IsSpecified) + author = SocketWebhookUser.Create(guild, client.State, msg.Value.Author.Value, msg.Value.WebhookId.Value); + else + author = guild.GetUser(msg.Value.Author.Value.Id); + } + else + author = (channel as SocketChannel).GetUser(msg.Value.Author.Value.Id); + + if (channel == null) + { + if (!msg.Value.GuildId.IsSpecified) // assume it is a DM + { + channel = client.CreateDMChannel(msg.Value.ChannelId, msg.Value.Author.Value, client.State); + } + } + + this.Message = SocketMessage.Create(client, client.State, author, channel, msg.Value); + } + } + } + } + + internal static SocketCommandBaseData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + { + var entity = new SocketCommandBaseData(client, model, guildId); + entity.Update(model); + return entity; + } + + internal void Update(Model model) + { + this.Name = model.Name; + + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => new SocketCommandBaseDataOption(this, x)).ToImmutableArray() + : null; + } + + IReadOnlyCollection IApplicationCommandInteractionData.Options => Options; + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs new file mode 100644 index 0000000000..369f1f868e --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.ApplicationCommandInteractionDataOption; + +namespace Discord.WebSocket +{ + public class SocketCommandBaseDataOption : IApplicationCommandInteractionDataOption + { + public string Name { get; private set; } + + /// + public object Value { get; private set; } + + /// + public ApplicationCommandOptionType Type { get; private set; } + + /// + /// The sub command options received for this sub command group. + /// + public IReadOnlyCollection Options { get; private set; } + + internal SocketCommandBaseDataOption() { } + internal SocketCommandBaseDataOption(SocketCommandBaseData data, Model model) + { + this.Name = model.Name; + this.Type = model.Type; + + if (model.Value.IsSpecified) + { + switch (Type) + { + case ApplicationCommandOptionType.User: + case ApplicationCommandOptionType.Role: + case ApplicationCommandOptionType.Channel: + case ApplicationCommandOptionType.Mentionable: + if (ulong.TryParse($"{model.Value.Value}", out var valueId)) + { + switch (this.Type) + { + case ApplicationCommandOptionType.User: + { + var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; + + if (guildUser != null) + this.Value = guildUser; + else + this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + } + break; + case ApplicationCommandOptionType.Channel: + this.Value = data.channels.FirstOrDefault(x => x.Key == valueId).Value; + break; + case ApplicationCommandOptionType.Role: + this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; + break; + case ApplicationCommandOptionType.Mentionable: + { + if (data.guildMembers.Any(x => x.Key == valueId) || data.users.Any(x => x.Key == valueId)) + { + var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; + + if (guildUser != null) + this.Value = guildUser; + else + this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + } + else if (data.roles.Any(x => x.Key == valueId)) + { + this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; + } + } + break; + default: + this.Value = model.Value.Value; + break; + } + } + break; + case ApplicationCommandOptionType.String: + this.Value = model.Value.ToString(); + break; + case ApplicationCommandOptionType.Integer: + { + if (model.Value.Value is int val) + this.Value = val; + else if (int.TryParse(model.Value.Value.ToString(), out int res)) + this.Value = res; + } + break; + case ApplicationCommandOptionType.Boolean: + { + if (model.Value.Value is bool val) + this.Value = val; + else if (bool.TryParse(model.Value.Value.ToString(), out bool res)) + this.Value = res; + } + break; + case ApplicationCommandOptionType.Number: + { + if (model.Value.Value is int val) + this.Value = val; + else if (double.TryParse(model.Value.Value.ToString(), out double res)) + this.Value = res; + } + break; + } + + } + + this.Options = model.Options.IsSpecified + ? model.Options.Value.Select(x => new SocketCommandBaseDataOption(data, x)).ToImmutableArray() + : null; + } + + // Converters + public static explicit operator bool(SocketCommandBaseDataOption option) + => (bool)option.Value; + public static explicit operator int(SocketCommandBaseDataOption option) + => (int)option.Value; + public static explicit operator string(SocketCommandBaseDataOption option) + => option.Value.ToString(); + + IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options; + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 01b3874f7f..59bae6f083 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -62,12 +62,13 @@ internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageC internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { if (model.Type == InteractionType.ApplicationCommand) - if(model.ApplicationId != null) + { + if (model.ApplicationId != null) { var dataModel = model.Data.IsSpecified ? (DataModel)model.Data.Value : null; - if(dataModel != null) + if (dataModel != null) { if (dataModel.Type.Equals(ApplicationCommandType.User)) return SocketApplicationUserCommand.Create(client, model, channel); @@ -76,6 +77,7 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model } } return SocketSlashCommand.Create(client, model, channel); + } if (model.Type == InteractionType.MessageComponent) return SocketMessageComponent.Create(client, model, channel); else From 555fed862e8bd89bef0180d27c60dcfaf2eb92d2 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Sat, 14 Aug 2021 11:20:29 -0400 Subject: [PATCH 176/494] Oops --- .../Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 9fd25ac5dd..4dbadc552d 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -32,7 +32,7 @@ internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessa new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { - var entity = new SocketSlashCommand(client, model, channel); + var entity = new SocketCommandBase(client, model, channel); entity.Update(model); return entity; } From 50f8fbfa62b805d55f7171e711b6f9d5b4cfb057 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Sun, 15 Aug 2021 17:00:35 -0400 Subject: [PATCH 177/494] guides revamped for slash/user/message commands --- .../01-getting-started.md | 25 ++++++ .../creating-context-menu-commands.md | 82 ++++++++++++++++++ .../02-creating-slash-commands.md | 0 .../03-responding-to-slash-commands.md | 0 .../slash-commands/04-parameters.md | 0 .../05-responding-ephemerally.md | 0 .../slash-commands/06-subcommands.md | 0 .../slash-commands/07-choice-slash-command.md | 0 .../slash-commands/README.md | 22 ++--- .../slash-commands/images/ephemeral1.png | Bin .../slash-commands/images/feedback1.png | Bin .../slash-commands/images/feedback2.png | Bin .../slash-commands/images/listroles1.png | Bin .../slash-commands/images/listroles2.png | Bin .../slash-commands/images/oauth.png | Bin .../slash-commands/images/settings1.png | Bin .../slash-commands/images/settings2.png | Bin .../slash-commands/images/settings3.png | Bin .../slash-commands/images/slashcommand1.png | Bin .../slash-commands/images/slashcommand2.png | Bin .../slash-commands/01-getting-started.md | 23 ----- 21 files changed, 118 insertions(+), 34 deletions(-) create mode 100644 docs/guides/application-commands/01-getting-started.md create mode 100644 docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md rename docs/guides/{ => application-commands}/slash-commands/02-creating-slash-commands.md (100%) rename docs/guides/{ => application-commands}/slash-commands/03-responding-to-slash-commands.md (100%) rename docs/guides/{ => application-commands}/slash-commands/04-parameters.md (100%) rename docs/guides/{ => application-commands}/slash-commands/05-responding-ephemerally.md (100%) rename docs/guides/{ => application-commands}/slash-commands/06-subcommands.md (100%) rename docs/guides/{ => application-commands}/slash-commands/07-choice-slash-command.md (100%) rename docs/guides/{ => application-commands}/slash-commands/README.md (99%) rename docs/guides/{ => application-commands}/slash-commands/images/ephemeral1.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/feedback1.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/feedback2.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/listroles1.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/listroles2.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/oauth.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/settings1.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/settings2.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/settings3.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/slashcommand1.png (100%) rename docs/guides/{ => application-commands}/slash-commands/images/slashcommand2.png (100%) delete mode 100644 docs/guides/slash-commands/01-getting-started.md diff --git a/docs/guides/application-commands/01-getting-started.md b/docs/guides/application-commands/01-getting-started.md new file mode 100644 index 0000000000..28d5fc8177 --- /dev/null +++ b/docs/guides/application-commands/01-getting-started.md @@ -0,0 +1,25 @@ +# Getting started with application commands. + +Welcome! This guide will show you how to use application commands. If you have extra questions that aren't covered here you can come to our [Discord](https://discord.com/invite/dvSfUTet3K) server and ask around there. + +## What is an application command? + +Application commands consist of three different types. Slash commands, context menu User commands and context menu Message commands. +Slash commands are made up of a name, description, and a block of options, which you can think of like arguments to a function. The name and description help users find your command among many others, and the options validate user input as they fill out your command. +Message and User commands are only a name, to the user. So try to make the name descriptive. They're accessed by right clicking (or long press, on mobile) a user or a message, respectively. + +All three varieties of application commands have both Global and Guild variants. Your global commands are available in every guild that adds your application. You can also make commands for a specific guild; they're only available in that guild. The User and Message commands are more limited in quantity than the slash commands. For specifics, check out their respective guide pages. + +An Interaction is the message that your application receives when a user uses a command. It includes the values that the user submitted, as well as some metadata about this particular instance of the command being used: the guild_id, channel_id, member and other fields. You can find all the values in our data models. + +## Authorizing your bot for application commands + +There is a new special OAuth2 scope for applications called `applications.commands`. In order to make Application Commands work within a guild, the guild must authorize your application with the `applications.commands` scope. The bot scope is not enough. + +Head over to your discord applications OAuth2 screen and make sure to select the `application.commands` scope. + +![OAuth2 scoping](images/oauth.png) + +From there you can then use the link to add your bot to a server. + +**Note**: In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild. diff --git a/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md b/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md new file mode 100644 index 0000000000..4e1a429875 --- /dev/null +++ b/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md @@ -0,0 +1,82 @@ +# Creating context menu commands. + +There are two kinds of Context Menu Commands: User Commands and Message Commands. +Each of these have a Global and Guild variant. +Global menu commands are available for every guild that adds your app. An individual app's global commands are also available in DMs if that app has a bot that shares a mutual guild with the user. + +Guild commands are specific to the guild you specify when making them. Guild commands are not available in DMs. Command names are unique per application within each scope (global and guild). That means: + +- Your app cannot have two global commands with the same name +- Your app cannot have two guild commands within the same name on the same guild +- Your app can have a global and guild command with the same name +- 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). + +## SlashCommandBuilder + +The slash command builder will help you create slash commands. The builder has these available fields and methods: + +| Name | Type | Description | +| --------------------- | -------------------------------- | -------------------------------------------------------------------------------------------- | +| Name | string | The name of this context menu command. | +| Description | string | A 0 length string. Left in place for possible future use. | +| WithName | Function | Sets the field name. | +| Build | Function | Builds the builder into the appropriate `CommandCreationProperties` class used to make Menu commands | + +**Note**: Context Menu command names can be upper and lowercase, and use spaces. + +Let's use the user command builder to make a global and guild command. + +```cs +// Let's hook the ready event for creating our commands in. +client.Ready += Client_Ready; + +... + +public async Task Client_Ready() +{ + // Let's build a guild command! We're going to need a guild id so lets just put that in a variable. + ulong guildId = 848176216011046962; + + // Next, lets create our user and message command builder. This is like the embed builder but for context menu commands. + var guildUserCommand = new UserCommandBuilder(); + var guildMessageCommand = new MessageCommandBuilder(); + + // Note: Names have to be all lowercase and match the regular expression ^[\w -]{3,32}$ + guildUserCommand.WithName("Guild User Command"); + guildMessageCommand.WithName("Guild Message Command"); + + // Descriptions are not used with User and Message commands + //guildCommand.WithDescription(""); + + // Let's do our global commands + var globalCommand = new UserCommandBuilder(); + globalCommand.WithName("Global User Command"); + var globalMessageCommand = new MessageCommandBuilder(); + globalMessageCommand.WithName("Global Message Command"); + + try + { + // Now that we have our builder, we can call the rest API to make our slash command. + await client.Rest.CreateGuildUserCommand(guildUserCommand.Build(), guildId); + await client.Rest.CreateGuildMessageCommand(guildMessageCommand.Build(), guildId); + + // With global commands we dont need the guild id. + await client.Rest.CreateGlobalUserCommand(globalUserCommand.Build()); + await client.Rest.CreateGlobalMessageCommand(globalMessageCommand.Build()); + } + catch(ApplicationCommandException exception) + { + // If our command was invalid, we should catch an ApplicationCommandException. This exception contains the path of the error as well as the error message. You can serialize the Error field in the exception to get a visual of where your error is. + var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); + + // You can send this error somewhere or just print it to the console, for this example we're just going to print it. + Console.WriteLine(json); + } +} + +``` +**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. diff --git a/docs/guides/slash-commands/02-creating-slash-commands.md b/docs/guides/application-commands/slash-commands/02-creating-slash-commands.md similarity index 100% rename from docs/guides/slash-commands/02-creating-slash-commands.md rename to docs/guides/application-commands/slash-commands/02-creating-slash-commands.md diff --git a/docs/guides/slash-commands/03-responding-to-slash-commands.md b/docs/guides/application-commands/slash-commands/03-responding-to-slash-commands.md similarity index 100% rename from docs/guides/slash-commands/03-responding-to-slash-commands.md rename to docs/guides/application-commands/slash-commands/03-responding-to-slash-commands.md diff --git a/docs/guides/slash-commands/04-parameters.md b/docs/guides/application-commands/slash-commands/04-parameters.md similarity index 100% rename from docs/guides/slash-commands/04-parameters.md rename to docs/guides/application-commands/slash-commands/04-parameters.md diff --git a/docs/guides/slash-commands/05-responding-ephemerally.md b/docs/guides/application-commands/slash-commands/05-responding-ephemerally.md similarity index 100% rename from docs/guides/slash-commands/05-responding-ephemerally.md rename to docs/guides/application-commands/slash-commands/05-responding-ephemerally.md diff --git a/docs/guides/slash-commands/06-subcommands.md b/docs/guides/application-commands/slash-commands/06-subcommands.md similarity index 100% rename from docs/guides/slash-commands/06-subcommands.md rename to docs/guides/application-commands/slash-commands/06-subcommands.md diff --git a/docs/guides/slash-commands/07-choice-slash-command.md b/docs/guides/application-commands/slash-commands/07-choice-slash-command.md similarity index 100% rename from docs/guides/slash-commands/07-choice-slash-command.md rename to docs/guides/application-commands/slash-commands/07-choice-slash-command.md diff --git a/docs/guides/slash-commands/README.md b/docs/guides/application-commands/slash-commands/README.md similarity index 99% rename from docs/guides/slash-commands/README.md rename to docs/guides/application-commands/slash-commands/README.md index 702aec6de0..3b672792ca 100644 --- a/docs/guides/slash-commands/README.md +++ b/docs/guides/application-commands/slash-commands/README.md @@ -1,11 +1,11 @@ -## Slash command guides - -Here you can find some guides on how to use slash commands. - -1. [Getting started](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/01-getting-started.md) -2. [Creating a slash command](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/02-creating-slash-commands.md) -3. [Responding to slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/03-responding-to-slash-commands.md) -4. [Parameters in slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/04-parameters.md) -5. [Responding ephemerally](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/05-responding-ephemerally.md) -6. [Subcommands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/06-subcommands.md) -7. [Choices](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/07-choice-slash-command.md) +## Slash command guides + +Here you can find some guides on how to use slash commands. + +1. [Getting started](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/01-getting-started.md) +2. [Creating a slash command](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/02-creating-slash-commands.md) +3. [Responding to slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/03-responding-to-slash-commands.md) +4. [Parameters in slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/04-parameters.md) +5. [Responding ephemerally](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/05-responding-ephemerally.md) +6. [Subcommands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/06-subcommands.md) +7. [Choices](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/07-choice-slash-command.md) diff --git a/docs/guides/slash-commands/images/ephemeral1.png b/docs/guides/application-commands/slash-commands/images/ephemeral1.png similarity index 100% rename from docs/guides/slash-commands/images/ephemeral1.png rename to docs/guides/application-commands/slash-commands/images/ephemeral1.png diff --git a/docs/guides/slash-commands/images/feedback1.png b/docs/guides/application-commands/slash-commands/images/feedback1.png similarity index 100% rename from docs/guides/slash-commands/images/feedback1.png rename to docs/guides/application-commands/slash-commands/images/feedback1.png diff --git a/docs/guides/slash-commands/images/feedback2.png b/docs/guides/application-commands/slash-commands/images/feedback2.png similarity index 100% rename from docs/guides/slash-commands/images/feedback2.png rename to docs/guides/application-commands/slash-commands/images/feedback2.png diff --git a/docs/guides/slash-commands/images/listroles1.png b/docs/guides/application-commands/slash-commands/images/listroles1.png similarity index 100% rename from docs/guides/slash-commands/images/listroles1.png rename to docs/guides/application-commands/slash-commands/images/listroles1.png diff --git a/docs/guides/slash-commands/images/listroles2.png b/docs/guides/application-commands/slash-commands/images/listroles2.png similarity index 100% rename from docs/guides/slash-commands/images/listroles2.png rename to docs/guides/application-commands/slash-commands/images/listroles2.png diff --git a/docs/guides/slash-commands/images/oauth.png b/docs/guides/application-commands/slash-commands/images/oauth.png similarity index 100% rename from docs/guides/slash-commands/images/oauth.png rename to docs/guides/application-commands/slash-commands/images/oauth.png diff --git a/docs/guides/slash-commands/images/settings1.png b/docs/guides/application-commands/slash-commands/images/settings1.png similarity index 100% rename from docs/guides/slash-commands/images/settings1.png rename to docs/guides/application-commands/slash-commands/images/settings1.png diff --git a/docs/guides/slash-commands/images/settings2.png b/docs/guides/application-commands/slash-commands/images/settings2.png similarity index 100% rename from docs/guides/slash-commands/images/settings2.png rename to docs/guides/application-commands/slash-commands/images/settings2.png diff --git a/docs/guides/slash-commands/images/settings3.png b/docs/guides/application-commands/slash-commands/images/settings3.png similarity index 100% rename from docs/guides/slash-commands/images/settings3.png rename to docs/guides/application-commands/slash-commands/images/settings3.png diff --git a/docs/guides/slash-commands/images/slashcommand1.png b/docs/guides/application-commands/slash-commands/images/slashcommand1.png similarity index 100% rename from docs/guides/slash-commands/images/slashcommand1.png rename to docs/guides/application-commands/slash-commands/images/slashcommand1.png diff --git a/docs/guides/slash-commands/images/slashcommand2.png b/docs/guides/application-commands/slash-commands/images/slashcommand2.png similarity index 100% rename from docs/guides/slash-commands/images/slashcommand2.png rename to docs/guides/application-commands/slash-commands/images/slashcommand2.png diff --git a/docs/guides/slash-commands/01-getting-started.md b/docs/guides/slash-commands/01-getting-started.md deleted file mode 100644 index 093178878c..0000000000 --- a/docs/guides/slash-commands/01-getting-started.md +++ /dev/null @@ -1,23 +0,0 @@ -# Getting started with slash commands. - -Welcome! This guide will show you how to use slash commands. If you have extra questions that aren't covered here you can come to our [Discord](https://discord.com/invite/dvSfUTet3K) server and ask around there. - -## What is a slash command? - -Slash Commands _(synonymous with application 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. - -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. - -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 slash commands - -There is a new special OAuth2 scope for applications called `applications.commands`. In order to make Slash Commands work within a guild, the guild must authorize your application with the `applications.commands` scope. The bot scope is not enough. - -Head over to your discord applications OAuth2 screen and make sure to select the `application.commands` scope. - -![OAuth2 scoping](images/oauth.png) - -From there you can then use the link to add your bot to a server. - -**Note**: In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild. From a0173dcd9c6521df5663158112599d3e97fd7265 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Sun, 15 Aug 2021 17:22:37 -0400 Subject: [PATCH 178/494] Added Receive event guides --- .../receiving-context-menu-command-events.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md diff --git a/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md b/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md new file mode 100644 index 0000000000..a1492fc504 --- /dev/null +++ b/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md @@ -0,0 +1,43 @@ +# Receiving Context Menu events + +User commands and Message commands have their own unique objects returned. Different from Slash commands. To get the appropriate object returned, you can use a similar method to the slash commands. + +```cs +client.InteractionCreated += InteractionCreatedHandler; + +... + +public async Task InteractionCreatedHandler(SocketInteraction arg) +{ + if ( arg.Type == InteractionType.ApplicationCommand) + Task.Run(() => ApplicationCommandHandler(arg)); +} + +public async Task ApplicationCommandHandler(SocketInteraction arg) +{ + var slashCommand = arg as SocketSlashCommand; + if(slashCommand != null) + Console.Writeline("Slash command received!") + + var userCommand = arg as SocketApplicationUserCommand; + if(userCommand != null) + { + Console.Writeline("User command received!") + // userCommand.User = User who ran command. + // userCommand.Data.Member = User who was clicked. + } + + var messageCommand = arg as SocketApplicationMessageCommand; + if(messageCommand != null) + { + Console.Writeline("Message command received!") + // messageCommand.User = User who ran command. + // messageCommand.Data.Message = Message that was clicked. + } +} +``` + +User commands return a SocketUser object, showing the user that was clicked to run the command. +Message commands return a SocketMessage object, showing the message that was clicked to run the command. + +Both return the user who ran the command, the guild (if any), channel, etc. \ No newline at end of file From 2435b873c797dba329e1c0a394055881d38a17a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Thu, 19 Aug 2021 06:57:08 +0200 Subject: [PATCH 179/494] Make Webhook ApplicationId nullable instead of optional + fix IDiscordInteraction DeferAsync method (#110) * Make Webhook ApplicationId nullable instead of optional * Fix IDiscordInteraction DeferAsync to account for ephemeral defer --- src/Discord.Net.Core/Discord.Net.Core.xml | 2 +- .../Entities/Interactions/IDiscordInteraction.cs | 2 +- src/Discord.Net.Rest/API/Common/Webhook.cs | 2 +- src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs | 4 ++-- .../Entities/Webhooks/RestInternalWebhook.cs | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 8031270090..94b0c5cf65 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4691,7 +4691,7 @@ The request options for this async request. A that represents the initial response. - + Acknowledges this interaction. diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index b5afddca2c..ae015c2a68 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -92,6 +92,6 @@ Task FollowupAsync (string text = null, Embed[] embeds = null, boo /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - Task DeferAsync (RequestOptions options = null); + Task DeferAsync (bool ephemeral = false, RequestOptions options = null); } } diff --git a/src/Discord.Net.Rest/API/Common/Webhook.cs b/src/Discord.Net.Rest/API/Common/Webhook.cs index ff1dca9bd4..eb504a27c2 100644 --- a/src/Discord.Net.Rest/API/Common/Webhook.cs +++ b/src/Discord.Net.Rest/API/Common/Webhook.cs @@ -22,6 +22,6 @@ internal class Webhook [JsonProperty("user")] public Optional Creator { get; set; } [JsonProperty("application_id")] - public Optional ApplicationId { get; set; } + public ulong? ApplicationId { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs index 0d24f08dfd..5ae09fde0b 100644 --- a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs +++ b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs @@ -68,8 +68,8 @@ internal void Update(Model model) GuildId = model.GuildId.Value; if (model.Name.IsSpecified) Name = model.Name.Value; - if (model.ApplicationId.IsSpecified) - ApplicationId = model.ApplicationId.Value; + + ApplicationId = model.ApplicationId; } /// diff --git a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs index 210d8eda06..2a5c4786e4 100644 --- a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs +++ b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs @@ -45,8 +45,8 @@ internal void Update(Model model) GuildId = model.GuildId.Value; if (model.Name.IsSpecified) Name = model.Name.Value; - if (model.ApplicationId.IsSpecified) - ApplicationId = model.ApplicationId.Value; + + ApplicationId = model.ApplicationId; } public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) From 6b36285053133d110ab09f20fdee15ca99f4735e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 19 Aug 2021 02:43:49 -0300 Subject: [PATCH 180/494] Fix application command and thread starter messages being created as SocketSystemMessage --- src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 82c656486d..1b62d14dd8 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -122,7 +122,10 @@ internal SocketMessage(DiscordSocketClient discord, ulong id, ISocketMessageChan } internal static SocketMessage Create(DiscordSocketClient discord, ClientState state, SocketUser author, ISocketMessageChannel channel, Model model) { - if (model.Type == MessageType.Default || model.Type == MessageType.Reply) + if (model.Type == MessageType.Default || + model.Type == MessageType.Reply || + model.Type == MessageType.ApplicationCommand || + model.Type == MessageType.ThreadStarterMessage) return SocketUserMessage.Create(discord, state, author, channel, model); else return SocketSystemMessage.Create(discord, state, author, channel, model); From 8993911d68a241a96d756f427a3a096f2528bf82 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Fri, 20 Aug 2021 23:03:27 -0400 Subject: [PATCH 181/494] Implemented Context Menus (#106) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README.md * Update README.md * Fix SocketSlashCommandDataOption to use long for Number instead of int (#89) * Application webhooks (#86) * Added webhook components for hooks having an application ID. * resolved #88 * resolved #85 * Update device for gateway * Fix MessageProperties.Embed being ignored in some methods that modifies a message (#92) * Update label/description lengths for selects (ref: https://github.com/discord/discord-api-docs/pull/3598/files) (#91) https://github.com/discord/discord-api-docs/pull/3598/files * Fix tests (#90) * Fix gateway serialization to include nulls (#96) * Add missing guild permissions (#93) * Update GuildPermissions.cs * Update GuildPermissionsTests.cs * Add banner and accent color to user and some fixes/improvements (#81) * Add banner and accent color to user and some fixes * Fix * Fix! * increase size of user banners to 256 * Some changes and mini refactor of color class * add constant maxDecimalValue to color and checks with exceptions * add `NotSupportedException` for `BannerId` and `AccentColor` in `SocketWebhookUser` * Update ComponentBuilder.cs - `MaxLabelLength` from `ComponentBuilder` moved to `ButtonBuilder` - Added `MaxLabelLength` for `SelectMenuOptionBuilder` - Changed `MaxDescriptionLength` to 100 * Interface Method Declarations for Interaction Methods (#99) * added interface method declarations * inline docs * Fix serialization error * meta: bump versions * Fix debug pragma * meta: bump version * Remove rich presence button * Assign CurrentUserId in Sharded Client (#100) * added interface method declarations * inline docs * current user id assignment in sharded client * Allow EmbedBuilder.ImageUrl to use attachment scheme syntax (#104) * Make Webhook ApplicationId nullable instead of optional + fix IDiscordInteraction DeferAsync method (#110) * Make Webhook ApplicationId nullable instead of optional * Fix IDiscordInteraction DeferAsync to account for ephemeral defer * Fix application command and thread starter messages being created as SocketSystemMessage * Added description of ApplicationCommandType Enums * Requested Fixes renamed SocketApplicationUserCommand to SocketUserCommand renamed SocketApplicationMessageCommand to SocketMessageCommand using ContextMenuCreationProperties for both User and Message commands * Added Summary to public members removed whitespace from DiscordRestApiClient.cs * Fixing guide to use switch statement * implemented TrySendApplicationCommandAsync * implemented ephemeral in SocketCommandBase Defer, and RespondAsync. assigning int 64 was error. changed to "MessageFlags.Ephemeral", built and tested to work. * removed ApplicationCommandType from SocketUser and SocketMessageCommandData Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com> Co-authored-by: František Boháček Co-authored-by: quin lynch Co-authored-by: d4n3436 Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Co-authored-by: Nikon <47792796+INikonI@users.noreply.github.com> Co-authored-by: Cenk Ergen <57065323+Cenngo@users.noreply.github.com> --- Discord.Net.sln | 2 - .../creating-context-menu-commands.md | 15 +- .../receiving-context-menu-command-events.md | 31 +- src/Discord.Net.Core/CDN.cs | 18 ++ src/Discord.Net.Core/Discord.Net.Core.csproj | 8 +- src/Discord.Net.Core/Discord.Net.Core.xml | 286 ++++++++++++------ .../Entities/Guilds/IGuild.cs | 10 + .../Interactions/ApplicationCommandTypes.cs | 12 + ...> ContextMenuCommandCreationProperties.cs} | 8 +- .../Interactions/IApplicationCommand.cs | 9 +- .../Interactions/IDiscordInteraction.cs | 54 ++++ .../Message Components/ComponentBuilder.cs | 35 ++- .../Interactions/MessageCommandBuilder.cs | 48 +-- .../Interactions/UserCommandBuilder.cs | 48 +-- .../Entities/Messages/EmbedBuilder.cs | 2 +- .../Entities/Messages/MessageProperties.cs | 2 +- .../Entities/Permissions/GuildPermissions.cs | 55 +++- src/Discord.Net.Core/Entities/Roles/Color.cs | 101 ++++--- src/Discord.Net.Core/Entities/Users/IUser.cs | 32 +- .../Entities/Webhooks/IWebhook.cs | 7 +- src/Discord.Net.Rest/API/Common/Game.cs | 4 +- .../API/Common/InteractionCallbackData.cs | 2 +- .../API/Common/RichPresenceButton.cs | 18 -- src/Discord.Net.Rest/API/Common/User.cs | 4 + src/Discord.Net.Rest/API/Common/Webhook.cs | 2 + .../API/Rest/CreateWebhookMessageParams.cs | 2 +- .../API/Rest/ModifyWebhookMessageParams.cs | 2 + src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 29 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 62 +--- src/Discord.Net.Rest/DiscordRestClient.cs | 16 +- .../Entities/Guilds/RestGuild.cs | 16 +- .../Interactions/InteractionHelper.cs | 97 +++--- .../Entities/Messages/MessageHelper.cs | 45 ++- .../Entities/Users/RestThreadUser.cs | 4 +- .../Entities/Users/RestUser.cs | 12 + .../Entities/Webhooks/RestWebhook.cs | 4 + .../Extensions/EntityExtensions.cs | 1 + .../Discord.Net.WebSocket.csproj | 4 +- .../Discord.Net.WebSocket.xml | 121 +++++++- .../DiscordShardedClient.cs | 11 +- .../DiscordSocketApiClient.cs | 17 +- .../Entities/Guilds/SocketGuild.cs | 3 + ...sageCommand.cs => SocketMessageCommand.cs} | 10 +- ...andData.cs => SocketMessageCommandData.cs} | 17 +- ...ionUserCommand.cs => SocketUserCommand.cs} | 10 +- ...ommandData.cs => SocketUserCommandData.cs} | 18 +- .../SocketMessageComponent.cs | 61 +++- .../Slash Commands/SocketSlashCommand.cs | 2 +- .../SocketSlashCommandDataOption.cs | 6 +- .../SocketBaseCommand/SocketCommandBase.cs | 9 +- .../SocketCommandBaseData.cs | 10 +- .../SocketCommandBaseDataOption.cs | 4 + .../Entities/Interaction/SocketInteraction.cs | 25 +- .../Entities/Messages/SocketMessage.cs | 5 +- .../Entities/Users/SocketGlobalUser.cs | 4 +- .../Entities/Users/SocketGroupUser.cs | 4 + .../Entities/Users/SocketGuildUser.cs | 7 +- .../Entities/Users/SocketSelfUser.cs | 4 + .../Entities/Users/SocketThreadUser.cs | 16 +- .../Entities/Users/SocketUnknownUser.cs | 9 +- .../Entities/Users/SocketUser.cs | 18 ++ .../Entities/Users/SocketWebhookUser.cs | 17 ++ .../Discord.Net.Webhook.csproj | 2 +- .../Discord.Net.Webhook.xml | 7 +- .../DiscordWebhookClient.cs | 4 +- .../Messages/WebhookMessageProperties.cs | 4 + .../Entities/Webhooks/RestInternalWebhook.cs | 3 + .../WebhookClientHelper.cs | 7 +- src/Discord.Net/Discord.Net.nuspec | 20 +- .../GuildPermissionsTests.cs | 16 +- 71 files changed, 1067 insertions(+), 517 deletions(-) rename src/Discord.Net.Core/Entities/Interactions/{MessageCommandCreationProperties.cs => ContextMenuCommandCreationProperties.cs} (73%) delete mode 100644 src/Discord.Net.Rest/API/Common/RichPresenceButton.cs rename src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/{SocketApplicationMessageCommand.cs => SocketMessageCommand.cs} (69%) rename src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/{SocketApplicationMessageCommandData.cs => SocketMessageCommandData.cs} (89%) rename src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/{SocketApplicationUserCommand.cs => SocketUserCommand.cs} (70%) rename src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/{SocketApplicationUserCommandData.cs => SocketUserCommandData.cs} (86%) diff --git a/Discord.Net.sln b/Discord.Net.sln index c11739aef6..9f888cd124 100644 --- a/Discord.Net.sln +++ b/Discord.Net.sln @@ -42,8 +42,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FeatureTesting", "..\FeatureTesting\FeatureTesting\FeatureTesting.csproj", "{0CC57A32-3AC7-489D-8DF5-C431925E4675}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md b/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md index 4e1a429875..9100c3b423 100644 --- a/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md +++ b/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md @@ -15,14 +15,23 @@ Guild commands are specific to the guild you specify when making them. Guild com 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). -## SlashCommandBuilder +## UserCommandBuilder -The slash command builder will help you create slash commands. The builder has these available fields and methods: +The context menu user command builder will help you create user commands. The builder has these available fields and methods: + +| Name | Type | Description | +| --------------------- | -------------------------------- | -------------------------------------------------------------------------------------------- | +| Name | string | The name of this context menu command. | +| WithName | Function | Sets the field name. | +| Build | Function | Builds the builder into the appropriate `CommandCreationProperties` class used to make Menu commands | + +## MessageCommandBuilder + +The context menu message command builder will help you create message commands. The builder has these available fields and methods: | Name | Type | Description | | --------------------- | -------------------------------- | -------------------------------------------------------------------------------------------- | | Name | string | The name of this context menu command. | -| Description | string | A 0 length string. Left in place for possible future use. | | WithName | Function | Sets the field name. | | Build | Function | Builds the builder into the appropriate `CommandCreationProperties` class used to make Menu commands | diff --git a/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md b/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md index a1492fc504..52bc303e75 100644 --- a/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md +++ b/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md @@ -15,24 +15,21 @@ public async Task InteractionCreatedHandler(SocketInteraction arg) public async Task ApplicationCommandHandler(SocketInteraction arg) { - var slashCommand = arg as SocketSlashCommand; - if(slashCommand != null) - Console.Writeline("Slash command received!") - - var userCommand = arg as SocketApplicationUserCommand; - if(userCommand != null) + switch (arg) { - Console.Writeline("User command received!") - // userCommand.User = User who ran command. - // userCommand.Data.Member = User who was clicked. - } - - var messageCommand = arg as SocketApplicationMessageCommand; - if(messageCommand != null) - { - Console.Writeline("Message command received!") - // messageCommand.User = User who ran command. - // messageCommand.Data.Message = Message that was clicked. + case SocketSlashCommand slashCommand: + Console.Writeline("Slash command received!"); + break; + case SocketUserCommand userCommand: + Console.Writeline("User command received!") + // userCommand.User = User who ran command. + // userCommand.Data.Member = User who was clicked. + break; + case SocketMessageCommand messageCommand: + Console.Writeline("Message command received!") + // messageCommand.User = User who ran command. + // messageCommand.Data.Message = Message that was clicked. + break; } } ``` diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index e1e8e5e1a4..b1879eebc1 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -46,6 +46,24 @@ public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size string extension = FormatToExtension(format, avatarId); return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}"; } + + /// + /// Returns a user banner URL. + /// + /// The user snowflake identifier. + /// The banner identifier. + /// The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. + /// The format to return. + /// + /// A URL pointing to the user's banner in the specified size. + /// + public static string GetUserBannerUrl(ulong userId, string bannerId, ushort size, ImageFormat format) + { + if (bannerId == null) + return null; + string extension = FormatToExtension(format, bannerId); + return $"{DiscordConfig.CDNUrl}banners/{userId}/{bannerId}.{extension}?size={size}"; + } /// /// Returns the default user avatar URL. /// diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index f0be100599..ac54b259c7 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,4 +1,4 @@ - + @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.0.0-pre + 3.0.1-pre Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 2.3.8 - 2.3.8 + 3.3.1 + 3.0.1 false diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index d1e4770e3a..8be13e6bd6 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -100,6 +100,18 @@ A URL pointing to the user's avatar in the specified size. + + + Returns a user banner URL. + + The user snowflake identifier. + The banner identifier. + The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. + The format to return. + + A URL pointing to the user's banner in the specified size. + + Returns the default user avatar URL. @@ -3902,6 +3914,16 @@ A task that represents the asynchronous removal operation. + + + Gets this guilds slash commands commands + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of application commands found within the guild. + + Holds information for a guild integration feature. @@ -4467,6 +4489,41 @@ Whether the command is enabled by default when the app is added to a guild. Default is + + + ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message + + + + + ApplicationCommandType.Slash is Slash command type + + + + + ApplicationCommandType.User is Context Menu User command type + + + + + ApplicationCommandType.Message is Context Menu Message command type + + + + + A class used to create Message commands. + + + + + The name of this command. + + + + + Gets or sets the type for this command. + + The base command model that belongs to an application. see @@ -4502,13 +4559,6 @@ If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - Deletes this command - - The options to be used when sending the request. - A task that represents the asynchronous delete operation. - Represents data of an Interaction Command, see . @@ -4642,6 +4692,58 @@ read-only property, always 1. + + + Responds to an Interaction with type . + + The text of the message to be sent. + A array of embeds to send with this response. Max 10 + if the message should be read out by a text-to-speech reader, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + + + + Sends a followup message for this interaction. + + The text of the message to be sent + A array of embeds to send with this response. Max 10 + if the message should be read out by a text-to-speech reader, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + + The sent message. + + + + + Gets the original response for this interaction. + + The request options for this async request. + A that represents the initial response. + + + + Edits original response for this interaction. + + A delegate containing the properties to modify the message with. + The request options for this async request. + A that represents the initial response. + + + + Acknowledges this interaction. + + + A task that represents the asynchronous operation of acknowledging the interaction. + + Represents an interface used to specify classes that they are a vaild dataype of a class. @@ -4792,7 +4894,7 @@ Represents a builder for creating a . - + The max length of a . @@ -4915,11 +5017,16 @@ Represents a class used to build 's. + + + The max length of a . + + Gets or sets the label of the current button. - length exceeds . + length exceeds . @@ -5239,16 +5346,26 @@ Represents a class used to build 's. + + + The maximum length of a . + + The maximum length of a . + + + The maximum length of a . + + Gets or sets the label of the current select menu. - length exceeds + length exceeds @@ -5456,7 +5573,7 @@ - A class used to build slash commands. + A class used to build Message commands. @@ -5464,26 +5581,16 @@ Returns the maximun length a commands name allowed by Discord - - - Returns the maximum length of a commands description allowed by Discord. - - - The name of this slash command. - - - - - A 1-100 length description of this slash command + The name of this Message command. - Build the current builder into a class. + Build the current builder into a class. - A that can be used to create user commands over rest. + A that can be used to create message commands over rest. @@ -5494,33 +5601,6 @@ The current builder. - - - Sets the description of the current command. - - The description of this command. - The current builder. - - - - A class used to create Message commands. - - - - - The name of this command. - - - - - The discription of this command. - - - - - Gets or sets the type for this command. - - A class used to build slash commands. @@ -5785,7 +5865,7 @@ - A class used to build slash commands. + A class used to build user commands. @@ -5793,26 +5873,16 @@ Returns the maximun length a commands name allowed by Discord - - - Returns the maximum length of a commands description allowed by Discord. - - - The name of this slash command. - - - - - A 1-100 length description of this slash command + The name of this User command. - Build the current builder into a class. + Build the current builder into a class. - A that can be used to create user commands over rest. + A that can be used to create user commands over rest. @@ -5823,13 +5893,6 @@ The current builder. - - - Sets the description of the current command. - - The description of this command. - The current builder. - A class used to create User commands. @@ -7751,7 +7814,7 @@ Gets or sets a single embed for this message. - This property will be added to the array, in the future please use the array rather then this property. + This property will be added to the array, in the future please use the array rather than this property. @@ -8794,7 +8857,25 @@ If true, a user may edit the webhooks for this guild. - If true, a user may edit the emojis for this guild. + If true, a user may edit the emojis and stickers for this guild. + + + If true, a user may use slash commands in this guild. + + + If true, a user may request to speak in stage channels. + + + If true, a user may manage threads in this guild. + + + If true, a user may create public threads in this guild. + + + If true, a user may create private threads in this guild. + + + If true, a user may use external stickers in this guild. Creates a new with the provided packed value. @@ -8802,10 +8883,10 @@ Creates a new with the provided packed value after converting to ulong. - + Creates a new structure with the provided permissions. - + Creates a new from this one, changing the provided non-null permissions. @@ -8992,6 +9073,9 @@ Represents a color used in Discord. + + Gets the max decimal value of color. + Gets the default user color value. @@ -9096,20 +9180,21 @@ Initializes a struct with the given raw value. - The following will create a color that has a hex value of + The following will create a color that has a hex value of #607D8B. Color darkGrey = new Color(0x607D8B); The raw value of the color (e.g. 0x607D8B). + Value exceeds . Initializes a struct with the given RGB bytes. - The following will create a color that has a value of + The following will create a color that has a value of #607D8B. Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); @@ -9118,13 +9203,14 @@ The byte that represents the red color. The byte that represents the green color. The byte that represents the blue color. + Value exceeds . Initializes a struct with the given RGB value. - The following will create a color that has a value of + The following will create a color that has a value of #607D8B. Color darkGrey = new Color(96, 125, 139); @@ -9140,7 +9226,7 @@ Initializes a struct with the given RGB float value. - The following will create a color that has a value of + The following will create a color that has a value of #607c8c. Color darkGrey = new Color(0.38f, 0.49f, 0.55f); @@ -9908,19 +9994,33 @@ Gets the identifier of this user's avatar. + + + Gets the identifier of this user's banner. + + + + + Gets the user's banner color. + + + A struct representing the accent color of this user's banner. + + Gets the avatar URL for this user. This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar - (i.e. their avatar identifier is not set), this property will return null. If you wish to + (i.e. their avatar identifier is not set), this method will return null. If you wish to retrieve the default avatar for this user, consider using (see example). - 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. + 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. @@ -9931,6 +10031,17 @@ A string representing the user's avatar URL; null if the user does not have an avatar in place. + + + Gets the banner URL for this user. + + The format to return. + The size of the image to return in. This can be any power of two between 16 and 2048. + + + A string representing the user's avatar URL; null if the user does not have an banner in place. + + Gets the default avatar URL for this user. @@ -9998,8 +10109,8 @@ This method is used to obtain or create a channel used to send a direct message. In event that the current user cannot send a message to the target user, a channel can and will - still be created by Discord. However, attempting to send a message will yield a - with a 403 as its + still be created by Discord. However, attempting to send a message will yield a + with a 403 as its . There are currently no official workarounds by Discord. @@ -10293,6 +10404,11 @@ Gets the user that created this webhook. + + + Gets the ID of the application owning this webhook. + + Modifies this webhook. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index ad2e0317df..414b6fe73e 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -941,5 +941,15 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// A task that represents the asynchronous removal operation. /// Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null); + + /// + /// Gets this guilds slash commands commands + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of application commands found within the guild. + /// + Task> GetApplicationCommandsAsync (RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs index 23b00f2a2e..de9c1a2635 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs @@ -6,10 +6,22 @@ namespace Discord { + /// + /// ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message + /// public enum ApplicationCommandType : byte { + /// + /// ApplicationCommandType.Slash is Slash command type + /// Slash = 1, + /// + /// ApplicationCommandType.User is Context Menu User command type + /// User = 2, + /// + /// ApplicationCommandType.Message is Context Menu Message command type + /// Message = 3 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ContextMenuCommandCreationProperties.cs similarity index 73% rename from src/Discord.Net.Core/Entities/Interactions/MessageCommandCreationProperties.cs rename to src/Discord.Net.Core/Entities/Interactions/ContextMenuCommandCreationProperties.cs index 7c7dac593d..4ddc0a7b1c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageCommandCreationProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ContextMenuCommandCreationProperties.cs @@ -9,19 +9,13 @@ namespace Discord /// /// A class used to create Message commands. /// - public class MessageCommandCreationProperties + public class ContextMenuCommandCreationProperties { /// /// The name of this command. /// public string Name { get; set; } - /// - /// The discription of this command. - /// - public string Description { get; set; } - - /// /// Gets or sets the type for this command. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index ab4b3eac0b..e15843d988 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -9,7 +9,7 @@ namespace Discord /// /// The base command model that belongs to an application. see /// - public interface IApplicationCommand : ISnowflakeEntity + public interface IApplicationCommand : ISnowflakeEntity, IDeletable { /// /// Gets the unique id of the parent application. @@ -40,12 +40,5 @@ public interface IApplicationCommand : ISnowflakeEntity /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// IReadOnlyCollection Options { get; } - - /// - /// Deletes this command - /// - /// The options to be used when sending the request. - /// A task that represents the asynchronous delete operation. - Task DeleteAsync(RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 466bf3e914..ae015c2a68 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -39,5 +39,59 @@ public interface IDiscordInteraction : ISnowflakeEntity /// read-only property, always 1. /// int Version { get; } + + /// + /// Responds to an Interaction with type . + /// + /// The text of the message to be sent. + /// A array of embeds to send with this response. Max 10 + /// if the message should be read out by a text-to-speech reader, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false, + bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); + + /// + /// Sends a followup message for this interaction. + /// + /// The text of the message to be sent + /// A array of embeds to send with this response. Max 10 + /// if the message should be read out by a text-to-speech reader, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + /// + /// The sent message. + /// + Task FollowupAsync (string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); + + /// + /// Gets the original response for this interaction. + /// + /// The request options for this async request. + /// A that represents the initial response. + Task GetOriginalResponseAsync (RequestOptions options = null); + + /// + /// Edits original response for this interaction. + /// + /// A delegate containing the properties to modify the message with. + /// The request options for this async request. + /// A that represents the initial response. + Task ModifyOriginalResponseAsync (Action func, RequestOptions options = null); + + /// + /// Acknowledges this interaction. + /// + /// + /// A task that represents the asynchronous operation of acknowledging the interaction. + /// + Task DeferAsync (bool ephemeral = false, RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index bb2f80a813..085c62cef2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -13,7 +13,7 @@ public class ComponentBuilder /// /// The max length of a . /// - public const int MaxLabelLength = 80; + public const int MaxButtonLabelLength = 80; /// /// The max length of a . @@ -307,17 +307,22 @@ internal bool CanTakeComponent(IMessageComponent component) /// public class ButtonBuilder { + /// + /// The max length of a . + /// + public const int MaxLabelLength = 80; + /// /// Gets or sets the label of the current button. /// - /// length exceeds . + /// length exceeds . public string Label { get => _label; set { - if (value != null && value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value != null && value.Length > ComponentBuilder.MaxButtonLabelLength) + throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxButtonLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } @@ -539,8 +544,8 @@ public ButtonComponent Build() if (string.IsNullOrEmpty(this.Url)) throw new InvalidOperationException("Link buttons must have a link associated with them"); else - UrlValidation.Validate(this.Url); - } + UrlValidation.Validate(this.Url); + } else if (string.IsNullOrEmpty(this.CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); @@ -831,23 +836,33 @@ public SelectMenu Build() /// public class SelectMenuOptionBuilder { + /// + /// The maximum length of a . + /// + public const int MaxLabelLength = 100; + /// /// The maximum length of a . /// - public const int MaxDescriptionLength = 50; + public const int MaxDescriptionLength = 100; + + /// + /// The maximum length of a . + /// + public const int MaxSelectLabelLength = 100; /// /// Gets or sets the label of the current select menu. /// - /// length exceeds + /// length exceeds public string Label { get => _label; set { if (value != null) - if (value.Length > ComponentBuilder.MaxLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxLabelLength} characters or less!", paramName: nameof(Label)); + if (value.Length > MaxSelectLabelLength) + throw new ArgumentException(message: $"Button label must be {MaxSelectLabelLength} characters or less!", paramName: nameof(Label)); _label = value; } diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs index 792d7d19f4..b658a181b9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs @@ -8,7 +8,7 @@ namespace Discord { /// - /// A class used to build slash commands. + /// A class used to build Message commands. /// public class MessageCommandBuilder { @@ -16,13 +16,9 @@ public class MessageCommandBuilder /// Returns the maximun length a commands name allowed by Discord /// public const int MaxNameLength = 32; - /// - /// Returns the maximum length of a commands description allowed by Discord. - /// - public const int MaxDescriptionLength = 0; /// - /// The name of this slash command. + /// The name of this Message command. /// public string Name { @@ -45,36 +41,17 @@ public string Name } } - /// - /// A 1-100 length description of this slash command - /// - public string Description - { - get - { - return _description; - } - set - { - Preconditions.Equals(value, ""); - - _description = value; - } - } - private string _name { get; set; } - private string _description { get; set; } /// - /// Build the current builder into a class. + /// Build the current builder into a class. /// - /// A that can be used to create user commands over rest. - public MessageCommandCreationProperties Build() + /// A that can be used to create message commands over rest. + public ContextMenuCommandCreationProperties Build() { - MessageCommandCreationProperties props = new MessageCommandCreationProperties() + ContextMenuCommandCreationProperties props = new ContextMenuCommandCreationProperties() { Name = this.Name, - Description = this.Description, Type=ApplicationCommandType.Message }; @@ -93,17 +70,6 @@ public MessageCommandBuilder WithName(string name) { this.Name = name; return this; - } - - /// - /// Sets the description of the current command. - /// - /// The description of this command. - /// The current builder. - public MessageCommandBuilder WithDescription(string description) - { - this.Description = description; - return this; - } + } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs index 0dc6526ba2..f10b6b1234 100644 --- a/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs @@ -8,7 +8,7 @@ namespace Discord { /// - /// A class used to build slash commands. + /// A class used to build user commands. /// public class UserCommandBuilder { @@ -16,13 +16,9 @@ public class UserCommandBuilder /// Returns the maximun length a commands name allowed by Discord /// public const int MaxNameLength = 32; - /// - /// Returns the maximum length of a commands description allowed by Discord. - /// - public const int MaxDescriptionLength = 0; /// - /// The name of this slash command. + /// The name of this User command. /// public string Name { @@ -45,36 +41,17 @@ public string Name } } - /// - /// A 1-100 length description of this slash command - /// - public string Description - { - get - { - return _description; - } - set - { - Preconditions.Equals(value, ""); - - _description = value; - } - } - private string _name { get; set; } - private string _description { get; set; } /// - /// Build the current builder into a class. + /// Build the current builder into a class. /// - /// A that can be used to create user commands over rest. - public UserCommandCreationProperties Build() + /// A that can be used to create user commands over rest. + public ContextMenuCommandCreationProperties Build() { - UserCommandCreationProperties props = new UserCommandCreationProperties() + ContextMenuCommandCreationProperties props = new ContextMenuCommandCreationProperties() { Name = this.Name, - Description = this.Description, Type=ApplicationCommandType.User }; @@ -93,17 +70,6 @@ public UserCommandBuilder WithName(string name) { this.Name = name; return this; - } - - /// - /// Sets the description of the current command. - /// - /// The description of this command. - /// The current builder. - public UserCommandBuilder WithDescription(string description) - { - this.Description = description; - return this; - } + } } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 2ab2699a60..5b92e02a56 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -411,7 +411,7 @@ public Embed Build() UrlValidation.Validate(Url); if (!string.IsNullOrEmpty(ThumbnailUrl)) UrlValidation.Validate(ThumbnailUrl); - if (!string.IsNullOrEmpty(ImageUrl)) + if (!string.IsNullOrEmpty(ImageUrl) && !ImageUrl.StartsWith("attachment://", StringComparison.Ordinal)) UrlValidation.Validate(ImageUrl); if (Author != null) { diff --git a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs index 19cfacebe9..abd09d8562 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs @@ -22,7 +22,7 @@ public class MessageProperties /// Gets or sets a single embed for this message. /// /// - /// This property will be added to the array, in the future please use the array rather then this property. + /// This property will be added to the array, in the future please use the array rather than this property. /// public Optional Embed { get; set; } diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 1914a6f86b..9503e5b3bd 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -81,8 +81,20 @@ public struct GuildPermissions public bool ManageRoles => Permissions.GetValue(RawValue, GuildPermission.ManageRoles); /// If true, a user may edit the webhooks for this guild. public bool ManageWebhooks => Permissions.GetValue(RawValue, GuildPermission.ManageWebhooks); - /// If true, a user may edit the emojis for this guild. + /// If true, a user may edit the emojis and stickers for this guild. public bool ManageEmojisAndStickers => Permissions.GetValue(RawValue, GuildPermission.ManageEmojisAndStickers); + /// If true, a user may use slash commands in this guild. + public bool UseSlashCommands => Permissions.GetValue(RawValue, GuildPermission.UseSlashCommands); + /// If true, a user may request to speak in stage channels. + public bool RequestToSpeak => Permissions.GetValue(RawValue, GuildPermission.RequestToSpeak); + /// If true, a user may manage threads in this guild. + public bool ManageThreads => Permissions.GetValue(RawValue, GuildPermission.ManageThreads); + /// If true, a user may create public threads in this guild. + public bool UsePublicThreads => Permissions.GetValue(RawValue, GuildPermission.UsePublicThreads); + /// If true, a user may create private threads in this guild. + public bool UsePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.UsePrivateThreads); + /// If true, a user may use external stickers in this guild. + public bool UseExternalStickers => Permissions.GetValue(RawValue, GuildPermission.UseExternalStickers); /// Creates a new with the provided packed value. public GuildPermissions(ulong rawValue) { RawValue = rawValue; } @@ -121,7 +133,13 @@ private GuildPermissions(ulong initialValue, bool? manageNicknames = null, bool? manageRoles = null, bool? manageWebhooks = null, - bool? manageEmojisAndStickers = null) + bool? manageEmojisAndStickers = null, + bool? useSlashCommands = null, + bool? requestToSpeak = null, + bool? manageThreads = null, + bool? usePublicThreads = null, + bool? usePrivateThreads = null, + bool? useExternalStickers = null) { ulong value = initialValue; @@ -156,6 +174,12 @@ private GuildPermissions(ulong initialValue, Permissions.SetValue(ref value, manageRoles, GuildPermission.ManageRoles); Permissions.SetValue(ref value, manageWebhooks, GuildPermission.ManageWebhooks); Permissions.SetValue(ref value, manageEmojisAndStickers, GuildPermission.ManageEmojisAndStickers); + Permissions.SetValue(ref value, useSlashCommands, GuildPermission.UseSlashCommands); + Permissions.SetValue(ref value, requestToSpeak, GuildPermission.RequestToSpeak); + Permissions.SetValue(ref value, manageThreads, GuildPermission.ManageThreads); + Permissions.SetValue(ref value, usePublicThreads, GuildPermission.UsePublicThreads); + Permissions.SetValue(ref value, usePrivateThreads, GuildPermission.UseExternalStickers); + Permissions.SetValue(ref value, useExternalStickers, GuildPermission.UseExternalStickers); RawValue = value; } @@ -192,7 +216,13 @@ public GuildPermissions( bool manageNicknames = false, bool manageRoles = false, bool manageWebhooks = false, - bool manageEmojis = false) + bool manageEmojisAndStickers = false, + bool useSlashCommands = false, + bool requestToSpeak = false, + bool manageThreads = false, + bool usePublicThreads = false, + bool usePrivateThreads = false, + bool useExternalStickers = false) : this(0, createInstantInvite: createInstantInvite, manageRoles: manageRoles, @@ -224,7 +254,13 @@ public GuildPermissions( changeNickname: changeNickname, manageNicknames: manageNicknames, manageWebhooks: manageWebhooks, - manageEmojisAndStickers: manageEmojis) + manageEmojisAndStickers: manageEmojisAndStickers, + useSlashCommands: useSlashCommands, + requestToSpeak: requestToSpeak, + manageThreads: manageThreads, + usePublicThreads: usePublicThreads, + usePrivateThreads: usePrivateThreads, + useExternalStickers: useExternalStickers) { } /// Creates a new from this one, changing the provided non-null permissions. @@ -259,11 +295,18 @@ public GuildPermissions Modify( bool? manageNicknames = null, bool? manageRoles = null, bool? manageWebhooks = null, - bool? manageEmojis = null) + bool? manageEmojisAndStickers = null, + bool? useSlashCommands = null, + bool? requestToSpeak = null, + bool? manageThreads = null, + bool? usePublicThreads = null, + bool? usePrivateThreads = null, + bool? useExternalStickers = null) => new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions, viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, - useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojis); + useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers, + useSlashCommands, requestToSpeak, manageThreads, usePublicThreads, usePrivateThreads, useExternalStickers); /// /// Returns a value that indicates if a specific is enabled diff --git a/src/Discord.Net.Core/Entities/Roles/Color.cs b/src/Discord.Net.Core/Entities/Roles/Color.cs index 7c2d152a4d..ee50710e8e 100644 --- a/src/Discord.Net.Core/Entities/Roles/Color.cs +++ b/src/Discord.Net.Core/Entities/Roles/Color.cs @@ -10,68 +10,70 @@ namespace Discord [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public struct Color { + /// Gets the max decimal value of color. + public const uint MaxDecimalValue = 0xFFFFFF; /// Gets the default user color value. - public static readonly Color Default = new Color(0); + public static readonly Color Default = new(0); /// Gets the teal color value. /// A color struct with the hex value of 1ABC9C. - public static readonly Color Teal = new Color(0x1ABC9C); + public static readonly Color Teal = new(0x1ABC9C); /// Gets the dark teal color value. /// A color struct with the hex value of 11806A. - public static readonly Color DarkTeal = new Color(0x11806A); + public static readonly Color DarkTeal = new(0x11806A); /// Gets the green color value. /// A color struct with the hex value of 2ECC71. - public static readonly Color Green = new Color(0x2ECC71); + public static readonly Color Green = new(0x2ECC71); /// Gets the dark green color value. /// A color struct with the hex value of 1F8B4C. - public static readonly Color DarkGreen = new Color(0x1F8B4C); + public static readonly Color DarkGreen = new(0x1F8B4C); /// Gets the blue color value. /// A color struct with the hex value of 3498DB. - public static readonly Color Blue = new Color(0x3498DB); + public static readonly Color Blue = new(0x3498DB); /// Gets the dark blue color value. /// A color struct with the hex value of 206694. - public static readonly Color DarkBlue = new Color(0x206694); + public static readonly Color DarkBlue = new(0x206694); /// Gets the purple color value. /// A color struct with the hex value of 9B59B6. - public static readonly Color Purple = new Color(0x9B59B6); + public static readonly Color Purple = new(0x9B59B6); /// Gets the dark purple color value. /// A color struct with the hex value of 71368A. - public static readonly Color DarkPurple = new Color(0x71368A); + public static readonly Color DarkPurple = new(0x71368A); /// Gets the magenta color value. /// A color struct with the hex value of E91E63. - public static readonly Color Magenta = new Color(0xE91E63); + public static readonly Color Magenta = new(0xE91E63); /// Gets the dark magenta color value. /// A color struct with the hex value of AD1457. - public static readonly Color DarkMagenta = new Color(0xAD1457); + public static readonly Color DarkMagenta = new(0xAD1457); /// Gets the gold color value. /// A color struct with the hex value of F1C40F. - public static readonly Color Gold = new Color(0xF1C40F); + public static readonly Color Gold = new(0xF1C40F); /// Gets the light orange color value. /// A color struct with the hex value of C27C0E. - public static readonly Color LightOrange = new Color(0xC27C0E); + public static readonly Color LightOrange = new(0xC27C0E); /// Gets the orange color value. /// A color struct with the hex value of E67E22. - public static readonly Color Orange = new Color(0xE67E22); + public static readonly Color Orange = new(0xE67E22); /// Gets the dark orange color value. /// A color struct with the hex value of A84300. - public static readonly Color DarkOrange = new Color(0xA84300); + public static readonly Color DarkOrange = new(0xA84300); /// Gets the red color value. /// A color struct with the hex value of E74C3C. - public static readonly Color Red = new Color(0xE74C3C); + public static readonly Color Red = new(0xE74C3C); /// Gets the dark red color value. /// A color struct with the hex value of 992D22. - public static readonly Color DarkRed = new Color(0x992D22); + public static readonly Color DarkRed = new(0x992D22); /// Gets the light grey color value. /// A color struct with the hex value of 979C9F. - public static readonly Color LightGrey = new Color(0x979C9F); + public static readonly Color LightGrey = new(0x979C9F); /// Gets the lighter grey color value. /// A color struct with the hex value of 95A5A6. - public static readonly Color LighterGrey = new Color(0x95A5A6); + public static readonly Color LighterGrey = new(0x95A5A6); /// Gets the dark grey color value. /// A color struct with the hex value of 607D8B. - public static readonly Color DarkGrey = new Color(0x607D8B); + public static readonly Color DarkGrey = new(0x607D8B); /// Gets the darker grey color value. /// A color struct with the hex value of 546E7A. - public static readonly Color DarkerGrey = new Color(0x546E7A); + public static readonly Color DarkerGrey = new(0x546E7A); /// Gets the encoded value for this color. /// @@ -91,22 +93,27 @@ public struct Color /// Initializes a struct with the given raw value. /// /// - /// The following will create a color that has a hex value of + /// The following will create a color that has a hex value of /// #607D8B. /// /// Color darkGrey = new Color(0x607D8B); /// /// /// The raw value of the color (e.g. 0x607D8B). + /// Value exceeds . public Color(uint rawValue) { + if (rawValue > MaxDecimalValue) + throw new ArgumentException($"{nameof(RawValue)} of color cannot be greater than {MaxDecimalValue}!", nameof(rawValue)); + RawValue = rawValue; } + /// /// Initializes a struct with the given RGB bytes. /// /// - /// The following will create a color that has a value of + /// The following will create a color that has a value of /// #607D8B. /// /// Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); @@ -115,19 +122,24 @@ public Color(uint rawValue) /// The byte that represents the red color. /// The byte that represents the green color. /// The byte that represents the blue color. + /// Value exceeds . public Color(byte r, byte g, byte b) { - RawValue = - ((uint)r << 16) | - ((uint)g << 8) | - (uint)b; + uint value = ((uint)r << 16) + | ((uint)g << 8) + | (uint)b; + + if (value > MaxDecimalValue) + throw new ArgumentException($"{nameof(RawValue)} of color cannot be greater than {MaxDecimalValue}!"); + + RawValue = value; } /// /// Initializes a struct with the given RGB value. /// /// - /// The following will create a color that has a value of + /// The following will create a color that has a value of /// #607D8B. /// /// Color darkGrey = new Color(96, 125, 139); @@ -145,16 +157,15 @@ public Color(int r, int g, int b) throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,255]."); if (b < 0 || b > 255) throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,255]."); - RawValue = - ((uint)r << 16) | - ((uint)g << 8) | - (uint)b; + RawValue = ((uint)r << 16) + | ((uint)g << 8) + | (uint)b; } /// /// Initializes a struct with the given RGB float value. /// /// - /// The following will create a color that has a value of + /// The following will create a color that has a value of /// #607c8c. /// /// Color darkGrey = new Color(0.38f, 0.49f, 0.55f); @@ -172,10 +183,9 @@ public Color(float r, float g, float b) throw new ArgumentOutOfRangeException(nameof(g), "Value must be within [0,1]."); if (b < 0.0f || b > 1.0f) throw new ArgumentOutOfRangeException(nameof(b), "Value must be within [0,1]."); - RawValue = - ((uint)(r * 255.0f) << 16) | - ((uint)(g * 255.0f) << 8) | - (uint)(b * 255.0f); + RawValue = ((uint)(r * 255.0f) << 16) + | ((uint)(g * 255.0f) << 8) + | (uint)(b * 255.0f); } public static bool operator ==(Color lhs, Color rhs) @@ -184,15 +194,22 @@ public Color(float r, float g, float b) public static bool operator !=(Color lhs, Color rhs) => lhs.RawValue != rhs.RawValue; + public static implicit operator Color(uint rawValue) + => new(rawValue); + + public static implicit operator uint(Color color) + => color.RawValue; + public override bool Equals(object obj) - => (obj is Color c && RawValue == c.RawValue); + => obj is Color c && RawValue == c.RawValue; public override int GetHashCode() => RawValue.GetHashCode(); - public static implicit operator StandardColor(Color color) => - StandardColor.FromArgb((int)color.RawValue); - public static explicit operator Color(StandardColor color) => - new Color((uint)color.ToArgb() << 8 >> 8); + public static implicit operator StandardColor(Color color) + => StandardColor.FromArgb((int)color.RawValue); + + public static explicit operator Color(StandardColor color) + => new((uint)color.ToArgb() << 8 >> 8); /// /// Gets the hexadecimal representation of the color (e.g. #000ccc). diff --git a/src/Discord.Net.Core/Entities/Users/IUser.cs b/src/Discord.Net.Core/Entities/Users/IUser.cs index 9596a83383..f265bb938a 100644 --- a/src/Discord.Net.Core/Entities/Users/IUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IUser.cs @@ -12,17 +12,29 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// string AvatarId { get; } /// + /// Gets the identifier of this user's banner. + /// + string BannerId { get; } + /// + /// Gets the user's banner color. + /// + /// + /// A struct representing the accent color of this user's banner. + /// + Color? AccentColor { get; } + /// /// Gets the avatar URL for this user. /// /// /// This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar - /// (i.e. their avatar identifier is not set), this property will return null. If you wish to + /// (i.e. their avatar identifier is not set), this method will return null. If you wish to /// retrieve the default avatar for this user, consider using (see /// example). /// /// - /// 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. + /// 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. /// /// @@ -34,6 +46,16 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128); /// + /// Gets the banner URL for this user. + /// + /// The format to return. + /// The size of the image to return in. This can be any power of two between 16 and 2048. + /// + /// + /// A string representing the user's avatar URL; null if the user does not have an banner in place. + /// + string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256); + /// /// Gets the default avatar URL for this user. /// /// @@ -93,8 +115,8 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// This method is used to obtain or create a channel used to send a direct message. /// /// In event that the current user cannot send a message to the target user, a channel can and will - /// still be created by Discord. However, attempting to send a message will yield a - /// with a 403 as its + /// still be created by Discord. However, attempting to send a message will yield a + /// with a 403 as its /// . There are currently no official workarounds by /// Discord. /// diff --git a/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs b/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs index b2d017316f..d5bc70d71e 100644 --- a/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs +++ b/src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; namespace Discord @@ -49,6 +49,11 @@ public interface IWebhook : IDeletable, ISnowflakeEntity /// IUser Creator { get; } + /// + /// Gets the ID of the application owning this webhook. + /// + ulong? ApplicationId { get; } + /// /// Modifies this webhook. /// diff --git a/src/Discord.Net.Rest/API/Common/Game.cs b/src/Discord.Net.Rest/API/Common/Game.cs index 294b0c7fdf..775b6aabcd 100644 --- a/src/Discord.Net.Rest/API/Common/Game.cs +++ b/src/Discord.Net.Rest/API/Common/Game.cs @@ -41,8 +41,8 @@ internal class Game public Optional Emoji { get; set; } [JsonProperty("created_at")] public Optional CreatedAt { get; set; } - [JsonProperty("buttons")] - public Optional Buttons { get; set; } + //[JsonProperty("buttons")] + //public Optional Buttons { get; set; } [OnError] internal void OnError(StreamingContext context, ErrorContext errorContext) diff --git a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index f03cb88701..ba233cc6b7 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -18,7 +18,7 @@ internal class InteractionCallbackData // New flags prop. this make the response "ephemeral". see https://discord.com/developers/docs/interactions/slash-commands#interaction-response-interactionapplicationcommandcallbackdata [JsonProperty("flags")] - public Optional Flags { get; set; } + public Optional Flags { get; set; } [JsonProperty("components")] public Optional Components { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs b/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs deleted file mode 100644 index 66f34c82e2..0000000000 --- a/src/Discord.Net.Rest/API/Common/RichPresenceButton.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.API -{ - internal class RichPresenceButton - { - [JsonProperty("label")] - public string Label { get; set; } - - [JsonProperty("url")] - public string Url { get; set; } - } -} diff --git a/src/Discord.Net.Rest/API/Common/User.cs b/src/Discord.Net.Rest/API/Common/User.cs index d1f436afbe..4d1b5b2b7e 100644 --- a/src/Discord.Net.Rest/API/Common/User.cs +++ b/src/Discord.Net.Rest/API/Common/User.cs @@ -15,6 +15,10 @@ internal class User public Optional Bot { get; set; } [JsonProperty("avatar")] public Optional Avatar { get; set; } + [JsonProperty("banner")] + public Optional Banner { get; set; } + [JsonProperty("accent_color")] + public Optional AccentColor { get; set; } //CurrentUser [JsonProperty("verified")] diff --git a/src/Discord.Net.Rest/API/Common/Webhook.cs b/src/Discord.Net.Rest/API/Common/Webhook.cs index cbd5fdad55..eb504a27c2 100644 --- a/src/Discord.Net.Rest/API/Common/Webhook.cs +++ b/src/Discord.Net.Rest/API/Common/Webhook.cs @@ -21,5 +21,7 @@ internal class Webhook [JsonProperty("user")] public Optional Creator { get; set; } + [JsonProperty("application_id")] + public ulong? ApplicationId { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index bd4cc1a6c1..1806d487c5 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -28,7 +28,7 @@ internal class CreateWebhookMessageParams public Optional AllowedMentions { get; set; } [JsonProperty("flags")] - public Optional Flags { get; set; } + public Optional Flags { get; set; } [JsonProperty("components")] public Optional Components { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs index ba8fcbb4e1..8298ff19c8 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs @@ -12,5 +12,7 @@ internal class ModifyWebhookMessageParams public Optional Embeds { get; set; } [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } + [JsonProperty("components")] + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index b1efafae21..16b1655754 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.0-pre + 3.0.1-pre Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 2.3.4 - 2.3.4 + 3.0.1 + 3.0.1 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index c6c81ee75a..0fc188b2e9 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3493,6 +3493,16 @@ of webhooks found within the guild. + + + Gets this guilds slash commands commands + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of application commands found within the guild. + + Returns the name of the guild. @@ -3650,6 +3660,9 @@ + + + @@ -4667,7 +4680,7 @@ - Represents a thread user recieved over the REST api. + Represents a thread user received over the REST api. @@ -4690,7 +4703,7 @@ Gets the guild user for this thread user. - A task representing the asyncronous get operation. The task returns a + A task representing the asynchronous get operation. The task returns a that represents the current thread user. @@ -4711,6 +4724,12 @@ + + + + + + @@ -4753,6 +4772,9 @@ + + + @@ -4875,6 +4897,9 @@ + + + diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 42cde4cfc8..8bf7f6e43f 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -55,7 +55,7 @@ public DiscordRestApiClient(RestClientProvider restClientProvider, string userAg _restClientProvider = restClientProvider; UserAgent = userAgent; DefaultRetryMode = defaultRetryMode; - _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver(), NullValueHandling = NullValueHandling.Ignore }; + _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver(), NullValueHandling = NullValueHandling.Include }; UseSystemClock = useSystemClock; RequestQueue = new RequestQueue(); @@ -1113,11 +1113,8 @@ public async Task CreateGlobalApplicationUserCommandAsync(Cr Preconditions.NotNull(command, nameof(command)); Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - Preconditions.Equals(command.Description, ""); - options = RequestOptions.CreateOrClone(options); - - + options = RequestOptions.CreateOrClone(options); return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); } @@ -1126,12 +1123,9 @@ public async Task CreateGlobalApplicationMessageCommandAsync Preconditions.NotNull(command, nameof(command)); Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - Preconditions.Equals(command.Description, ""); options = RequestOptions.CreateOrClone(options); - - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); } @@ -1174,7 +1168,6 @@ public async Task CreateGuildApplicationCommandAsync(CreateA var bucket = new BucketIds(guildId: guildId); return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); - } public async Task ModifyGuildApplicationCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1182,21 +1175,7 @@ public async Task ModifyGuildApplicationCommandAsync(ModifyA var bucket = new BucketIds(guildId: guildId); - try - { - return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); - } - catch (HttpException x) - { - if (x.HttpCode == HttpStatusCode.BadRequest) - { - var json = (x.Request as JsonRestRequest).Json; - throw new ApplicationCommandException(json, x); - } - - // Re-throw the http exception - throw; - } + return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1223,29 +1202,15 @@ public async Task CreateGuildApplicationUserCommandAsync(Cre var bucket = new BucketIds(guildId: guildId); return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); - } + public async Task ModifyGuildApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(guildId: guildId); - try - { - return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); - } - catch (HttpException x) - { - if (x.HttpCode == HttpStatusCode.BadRequest) - { - var json = (x.Request as JsonRestRequest).Json; - throw new ApplicationCommandException(json, x); - } - - // Re-throw the http exception - throw; - } + return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); } public async Task BulkOverwriteGuildApplicationUserCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) { @@ -1263,7 +1228,6 @@ public async Task CreateGuildApplicationMessageCommandAsync( var bucket = new BucketIds(guildId: guildId); return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); - } public async Task ModifyGuildApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1271,21 +1235,7 @@ public async Task ModifyGuildApplicationMessageCommandAsync( var bucket = new BucketIds(guildId: guildId); - try - { - return await SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); - } - catch (HttpException x) - { - if (x.HttpCode == HttpStatusCode.BadRequest) - { - var json = (x.Request as JsonRestRequest).Json; - throw new ApplicationCommandException(json, x); - } - - // Re-throw the http exception - throw; - } + return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); } public async Task BulkOverwriteGuildApplicationMessageCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index cb28d19b65..c204a2d1c6 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -112,25 +112,25 @@ public Task CreateGlobalCommand(SlashCommandCreationPropertie => InteractionHelper.CreateGlobalCommand(this, properties, options); public Task CreateGlobalCommand(Action func, RequestOptions options = null) => InteractionHelper.CreateGlobalCommand(this, func, options); - public Task CreateGlobalUserCommand(UserCommandCreationProperties properties, RequestOptions options = null) + public Task CreateGlobalUserCommand(ContextMenuCommandCreationProperties properties, RequestOptions options = null) => InteractionHelper.CreateGlobalUserCommand(this, properties, options); - public Task CreateGlobalUserCommand(Action func, RequestOptions options = null) + public Task CreateGlobalUserCommand(Action func, RequestOptions options = null) => InteractionHelper.CreateGlobalUserCommand(this, func, options); - public Task CreateGlobalMessageCommand(MessageCommandCreationProperties properties, RequestOptions options = null) + public Task CreateGlobalMessageCommand(ContextMenuCommandCreationProperties properties, RequestOptions options = null) => InteractionHelper.CreateGlobalMessageCommand(this, properties, options); - public Task CreateGlobalMessageCommand(Action func, RequestOptions options = null) + public Task CreateGlobalMessageCommand(Action func, RequestOptions options = null) => InteractionHelper.CreateGlobalMessageCommand(this, func, options); public Task CreateGuildCommand(SlashCommandCreationProperties properties, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildCommand(this, guildId, properties, options); public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildCommand(this, guildId, func, options); - public Task CreateGuildUserCommand(UserCommandCreationProperties properties, ulong guildId, RequestOptions options = null) + public Task CreateGuildUserCommand(ContextMenuCommandCreationProperties properties, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildUserCommand(this, guildId, properties, options); - public Task CreateGuildUserCommand(Action func, ulong guildId, RequestOptions options = null) + public Task CreateGuildUserCommand(Action func, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildUserCommand(this, guildId, func, options); - public Task CreateGuildMessageCommand(MessageCommandCreationProperties properties, ulong guildId, RequestOptions options = null) + public Task CreateGuildMessageCommand(ContextMenuCommandCreationProperties properties, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildMessageCommand(this, guildId, properties, options); - public Task CreateGuildMessageCommand(Action func, ulong guildId, RequestOptions options = null) + public Task CreateGuildMessageCommand(Action func, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildMessageCommand(this, guildId, func, options); public Task> GetGlobalApplicationCommands(RequestOptions options = null) => ClientHelper.GetGlobalApplicationCommands(this, options); diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 2fab63347e..126a211c85 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -869,6 +869,18 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null public Task> GetWebhooksAsync(RequestOptions options = null) => GuildHelper.GetWebhooksAsync(this, Discord, options); + //Interactions + /// + /// Gets this guilds slash commands commands + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of application commands found within the guild. + /// + public async Task> GetApplicationCommandsAsync (RequestOptions options = null) + => await ClientHelper.GetGuildApplicationCommands(Discord, Id, options).ConfigureAwait(false); + /// /// Returns the name of the guild. /// @@ -1154,6 +1166,8 @@ async Task IGuild.GetWebhookAsync(ulong id, RequestOptions options) /// async Task> IGuild.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); - + /// + async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) + => await GetApplicationCommandsAsync(options).ConfigureAwait(false); } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index d5006a6a92..b5c3540476 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -200,22 +200,20 @@ public static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGloba await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); } - public static async Task CreateGlobalUserCommand(BaseDiscordClient client, Action func, RequestOptions options = null) + public static async Task CreateGlobalUserCommand(BaseDiscordClient client, Action func, RequestOptions options = null) { - var args = new UserCommandCreationProperties(); + var args = new ContextMenuCommandCreationProperties(); func(args); return await CreateGlobalUserCommand(client, args, options).ConfigureAwait(false); } - public static async Task CreateGlobalUserCommand(BaseDiscordClient client, UserCommandCreationProperties arg, RequestOptions options = null) + public static async Task CreateGlobalUserCommand(BaseDiscordClient client, ContextMenuCommandCreationProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Description, ""); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -223,22 +221,20 @@ public static async Task CreateGlobalUserCommand(BaseDisc return RestGlobalUserCommand.Create(client, cmd); } - public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, Action func, RequestOptions options = null) + public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, Action func, RequestOptions options = null) { - var args = new MessageCommandCreationProperties(); + var args = new ContextMenuCommandCreationProperties(); func(args); return await CreateGlobalMessageCommand(client, args, options).ConfigureAwait(false); } - public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, MessageCommandCreationProperties arg, RequestOptions options = null) + public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, ContextMenuCommandCreationProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Description, ""); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -246,7 +242,7 @@ public static async Task CreateGlobalMessageCommand(Ba return RestGlobalMessageCommand.Create(client, cmd); } - public static async Task> BulkOverwriteGlobalUserCommands(BaseDiscordClient client, UserCommandCreationProperties[] args, RequestOptions options = null) + public static async Task> BulkOverwriteGlobalUserCommands(BaseDiscordClient client, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -255,13 +251,11 @@ public static async Task> BulkOverwri foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); Preconditions.Equals(arg.Type, ApplicationCommandType.User); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -307,7 +301,7 @@ public static async Task DeleteGlobalUserCommand(BaseDiscordClient client, RestG await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); } - public static async Task> BulkOverwriteGlobalMessageCommands(BaseDiscordClient client, MessageCommandCreationProperties[] args, RequestOptions options = null) + public static async Task> BulkOverwriteGlobalMessageCommands(BaseDiscordClient client, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -316,13 +310,11 @@ public static async Task> BulkOver foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); Preconditions.Equals(arg.Type, ApplicationCommandType.Message); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -465,22 +457,20 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); } - public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) + public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) { - var args = new UserCommandCreationProperties(); + var args = new ContextMenuCommandCreationProperties(); func(args); return await CreateGuildUserCommand(client, guildId, args, options).ConfigureAwait(false); } - public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, UserCommandCreationProperties arg, RequestOptions options = null) + public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Description, ""); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -488,22 +478,20 @@ public static async Task CreateGuildUserCommand(BaseDiscor return RestGuildUserCommand.Create(client, cmd, guildId); } - public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) + public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) { - var args = new MessageCommandCreationProperties(); + var args = new ContextMenuCommandCreationProperties(); func(args); return await CreateGuildMessageCommand(client, guildId, args, options).ConfigureAwait(false); } - public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, MessageCommandCreationProperties arg, RequestOptions options = null) + public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Description, ""); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -511,7 +499,7 @@ public static async Task CreateGuildMessageCommand(Base return RestGuildMessageCommand.Create(client, cmd, guildId); } - public static async Task> BulkOverwriteGuildUserCommands(BaseDiscordClient client, ulong guildId, UserCommandCreationProperties[] args, RequestOptions options = null) + public static async Task> BulkOverwriteGuildUserCommands(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -520,13 +508,11 @@ public static async Task> BulkOverwrit foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); Preconditions.Equals(arg.Type, ApplicationCommandType.User); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -573,7 +559,7 @@ public static async Task DeleteGuildUserCommand(BaseDiscordClient client, ulong await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); } - public static async Task> BulkOverwriteGuildMessageCommands(BaseDiscordClient client, ulong guildId, MessageCommandCreationProperties[] args, RequestOptions options = null) + public static async Task> BulkOverwriteGuildMessageCommands(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -582,13 +568,11 @@ public static async Task> BulkOverw foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); Preconditions.Equals(arg.Type, ApplicationCommandType.Message); var model = new CreateApplicationCommandParams() { Name = arg.Name, - Description = arg.Description, Type = arg.Type }; @@ -642,15 +626,33 @@ public static async Task DeleteGuildMessageCommand(BaseDiscordClient client, ulo var args = new MessageProperties(); func(args); + var embed = args.Embed; + var embeds = args.Embeds; + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(message.Content); - bool hasEmbed = args.Embeds.IsSpecified ? args.Embeds.Value != null : message.Embeds.Any(); - if (!hasText && !hasEmbed) + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || message.Embeds.Any(); + + if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; + + if (embed.IsSpecified && embed.Value != null) + { + apiEmbeds.Add(embed.Value.ToModel()); + } + + if (embeds.IsSpecified && embeds.Value != null) + { + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); + } + + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new API.Rest.ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value.Select(x => x.ToModel()).ToArray() : Optional.Create(), + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; @@ -667,10 +669,33 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl var args = new MessageProperties(); func(args); + var embed = args.Embed; + var embeds = args.Embeds; + + bool hasText = !string.IsNullOrEmpty(args.Content.GetValueOrDefault()); + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0); + + if (!hasText && !hasEmbeds) + Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; + + if (embed.IsSpecified && embed.Value != null) + { + apiEmbeds.Add(embed.Value.ToModel()); + } + + if (embeds.IsSpecified && embeds.Value != null) + { + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); + } + + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new ModifyInteractionResponseParams { Content = args.Content, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value?.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, Flags = args.Flags diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 83ad2777e8..9546025b00 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -1,3 +1,4 @@ +using Discord.API; using Discord.API.Rest; using System; using System.Collections.Generic; @@ -33,9 +34,13 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie if (msg.Author.Id != client.CurrentUser.Id && (args.Content.IsSpecified || args.Embeds.IsSpecified || args.AllowedMentions.IsSpecified)) throw new InvalidOperationException("Only the author of a message may modify the message content, embed, or allowed mentions."); + var embed = args.Embed; + var embeds = args.Embeds; + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(msg.Content); - bool hasEmbed = args.Embeds.IsSpecified ? args.Embeds.Value != null : msg.Embeds.Any(); - if (!hasText && !hasEmbed) + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || msg.Embeds.Any(); + + if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); if (args.AllowedMentions.IsSpecified) @@ -61,22 +66,24 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie } } - var embeds = new List(); + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; - if (args.Embed.IsSpecified) + if (embed.IsSpecified && embed.Value != null) { - embeds.Add(args.Embed.Value.ToModel()); + apiEmbeds.Add(embed.Value.ToModel()); } - if (args.Embeds.IsSpecified) + if (embeds.IsSpecified && embeds.Value != null) { - embeds.AddRange(args.Embeds.Value.Select(x => x.ToModel())); + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); } + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new ModifyMessageParams { Content = args.Content, - Embeds = embeds.ToArray(), + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, Flags = args.Flags, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, @@ -90,7 +97,13 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi var args = new MessageProperties(); func(args); - if (args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value) && args.Embeds.IsSpecified && args.Embeds.Value == null) + var embed = args.Embed; + var embeds = args.Embeds; + + bool hasText = args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value); + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0); + + if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); if (args.AllowedMentions.IsSpecified) @@ -117,22 +130,24 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi } } - var embeds = new List(); + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; - if (args.Embed.IsSpecified) + if (embed.IsSpecified && embed.Value != null) { - embeds.Add(args.Embed.Value.ToModel()); + apiEmbeds.Add(embed.Value.ToModel()); } - if (args.Embeds.IsSpecified) + if (embeds.IsSpecified && embeds.Value != null) { - embeds.AddRange(args.Embeds.Value.Select(x => x.ToModel())); + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); } + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var apiArgs = new API.Rest.ModifyMessageParams { Content = args.Content, - Embeds = embeds.ToArray(), + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, diff --git a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs index d74591e75e..bb981bfdb1 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs @@ -9,7 +9,7 @@ namespace Discord.Rest { /// - /// Represents a thread user recieved over the REST api. + /// Represents a thread user received over the REST api. /// public class RestThreadUser : RestEntity { @@ -51,7 +51,7 @@ internal void Update(Model model) /// Gets the guild user for this thread user. /// /// - /// A task representing the asyncronous get operation. The task returns a + /// A task representing the asynchronous get operation. The task returns a /// that represents the current thread user. /// public Task GetGuildUser() diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs index 7bc1447fe3..618804fefc 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs @@ -22,6 +22,10 @@ public class RestUser : RestEntity, IUser, IUpdateable /// public string AvatarId { get; private set; } /// + public string BannerId { get; private set; } + /// + public Color? AccentColor { get; private set; } + /// public UserProperties? PublicFlags { get; private set; } /// @@ -61,6 +65,10 @@ internal virtual void Update(Model model) { if (model.Avatar.IsSpecified) AvatarId = model.Avatar.Value; + if (model.Banner.IsSpecified) + BannerId = model.Banner.Value; + if (model.AccentColor.IsSpecified) + AccentColor = model.AccentColor.Value; if (model.Discriminator.IsSpecified) DiscriminatorValue = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); if (model.Bot.IsSpecified) @@ -92,6 +100,10 @@ public Task CreateDMChannelAsync(RequestOptions options = null) public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); + /// + public string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256) + => CDN.GetUserBannerUrl(Id, BannerId, size, format); + /// public string GetDefaultAvatarUrl() => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); diff --git a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs index 9baddf003d..5ae09fde0b 100644 --- a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs +++ b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs @@ -24,6 +24,8 @@ public class RestWebhook : RestEntity, IWebhook, IUpdateable public ulong? GuildId { get; private set; } /// public IUser Creator { get; private set; } + /// + public ulong? ApplicationId { get; private set; } /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -66,6 +68,8 @@ internal void Update(Model model) GuildId = model.GuildId.Value; if (model.Name.IsSpecified) Name = model.Name.Value; + + ApplicationId = model.ApplicationId; } /// diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs index f8676c7834..0c2e0f8c25 100644 --- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs @@ -68,6 +68,7 @@ public static API.Embed ToModel(this Embed entity) model.Video = entity.Video.Value.ToModel(); return model; } + public static API.AllowedMentions ToModel(this AllowedMentions entity) { return new API.AllowedMentions() diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index af17578fbd..167ccebb08 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.0.0-pre + 3.0.1-pre https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,6 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml + 3.0.1 + 3.0.1 TRACE; diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 742bebac08..485a83a612 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3599,40 +3599,43 @@ - + + + + Represents a Websocket-based slash command received over the gateway. - + The data associated with this interaction. - + - Represents the data tied with the interaction. + Represents the data tied with the interaction. - + - + Represents a Websocket-based slash command received over the gateway. - + The data associated with this interaction. - + - Represents the data tied with the interaction. + Represents the data tied with the interaction. - + @@ -3664,15 +3667,19 @@ - + - Acknowledges this interaction with the . + Defers an interaction and responds with type 5 () + to send this message ephemerally, otherwise . The request options for this async request. A task that represents the asynchronous operation of acknowledging the interaction. + + + Represents the data sent with a . @@ -3812,6 +3819,11 @@ If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + Base class for User, Message, and Slash command interactions + + The data associated with this interaction. @@ -3823,7 +3835,7 @@ - + Acknowledges this interaction with the . @@ -3831,6 +3843,27 @@ A task that represents the asynchronous operation of acknowledging the interaction. + + + Represents the base data tied with the interaction. + + + + + + + + The 's received with this interaction. + + + + + Represents the base Websocket-based recieved by the gateway + + + + + @@ -3943,14 +3976,25 @@ A task that represents the asynchronous operation of acknowledging the interaction. - + Acknowledges this interaction. + to send this message ephemerally, otherwise . + The request options for this async request. A task that represents the asynchronous operation of acknowledging the interaction. + + + + + + + + + Represents a WebSocket-based invite to a guild. @@ -4487,6 +4531,12 @@ + + + + + + @@ -4545,6 +4595,12 @@ + + + + + + @@ -4608,7 +4664,7 @@ Returns the position of the user within the role hierarchy. - The returned value equal to the position of the highest role the user has, or + The returned value equal to the position of the highest role the user has, or if user is the server owner. @@ -4730,6 +4786,12 @@ + + + + + + @@ -4783,6 +4845,12 @@ + + + + + + @@ -4890,6 +4958,12 @@ + + + + + + @@ -4920,6 +4994,12 @@ + + + + + + @@ -4958,6 +5038,9 @@ + + + @@ -5039,6 +5122,14 @@ + + + Webhook users does not support banners. + + + + Webhook users does not support accent colors. + diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 6847d85801..450145f1cd 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -30,7 +30,16 @@ public partial class DiscordShardedClient : BaseSocketClient, IDiscordClient /// public override IActivity Activity { get => _shards[0].Activity; protected set { } } - internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; + internal new DiscordSocketApiClient ApiClient + { + get + { + if (base.ApiClient.CurrentUserId == null) + base.ApiClient.CurrentUserId = CurrentUser?.Id; + + return base.ApiClient; + } + } /// public override IReadOnlyCollection Guilds => GetGuilds().ToReadOnlyCollection(GetGuildCount); /// diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index 9221a3faa4..e19cedb336 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -79,7 +79,7 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr if (msg != null) { #if DEBUG_PACKETS - Console.WriteLine($"<- {msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); + Console.WriteLine($"<- {(GatewayOpCode)msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); #endif await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); @@ -96,7 +96,7 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr if (msg != null) { #if DEBUG_PACKETS - Console.WriteLine($"<- {msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); + Console.WriteLine($"<- {(GatewayOpCode)msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}"); #endif await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); @@ -105,6 +105,10 @@ public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketPr }; WebSocketClient.Closed += async ex => { +#if DEBUG_PACKETS + Console.WriteLine(ex); +#endif + await DisconnectAsync().ConfigureAwait(false); await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false); }; @@ -166,6 +170,11 @@ internal override async Task ConnectInternalAsync() var gatewayResponse = await GetGatewayAsync().ConfigureAwait(false); _gatewayUrl = $"{gatewayResponse.Url}?v={DiscordConfig.APIVersion}&encoding={DiscordSocketConfig.GatewayEncoding}&compress=zlib-stream"; } + +#if DEBUG_PACKETS + Console.WriteLine("Connecting to gateway: " + _gatewayUrl); +#endif + await WebSocketClient.ConnectAsync(_gatewayUrl).ConfigureAwait(false); ConnectionState = ConnectionState.Connected; @@ -237,7 +246,9 @@ public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, i options = RequestOptions.CreateOrClone(options); var props = new Dictionary { - ["$device"] = "Discord.Net" + ["$device"] = "Discord.Net Labs", + ["$os"] = Environment.OSVersion.Platform.ToString(), + [$"browser"] = "Discord.Net Labs" }; var msg = new IdentifyParams() { diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index c32bb3f49f..5c385fe010 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1478,6 +1478,9 @@ async Task IGuild.GetWebhookAsync(ulong id, RequestOptions options) /// async Task> IGuild.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); + /// + async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) + => await GetApplicationCommandsAsync(options).ConfigureAwait(false); void IDisposable.Dispose() { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs similarity index 69% rename from src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs index 828ed14bb1..5d8b0af43f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs @@ -10,14 +10,14 @@ namespace Discord.WebSocket /// /// Represents a Websocket-based slash command received over the gateway. /// - public class SocketApplicationMessageCommand : SocketCommandBase + public class SocketMessageCommand : SocketCommandBase { /// /// The data associated with this interaction. /// - new public SocketApplicationMessageCommandData Data { get; } + new public SocketMessageCommandData Data { get; } - internal SocketApplicationMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { var dataModel = model.Data.IsSpecified ? @@ -28,12 +28,12 @@ internal SocketApplicationMessageCommand(DiscordSocketClient client, Model model if (this.Channel is SocketGuildChannel guildChannel) guildId = guildChannel.Guild.Id; - Data = SocketApplicationMessageCommandData.Create(client, dataModel, model.Id, guildId); + Data = SocketMessageCommandData.Create(client, dataModel, model.Id, guildId); } new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { - var entity = new SocketApplicationMessageCommand(client, model, channel); + var entity = new SocketMessageCommand(client, model, channel); entity.Update(model); return entity; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs similarity index 89% rename from src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs index ead330ef64..9c925c4ce2 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketApplicationMessageCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs @@ -6,12 +6,15 @@ namespace Discord.WebSocket { /// - /// Represents the data tied with the interaction. + /// Represents the data tied with the interaction. /// - public class SocketApplicationMessageCommandData : SocketEntity, IApplicationCommandInteractionData + public class SocketMessageCommandData : SocketEntity, IApplicationCommandInteractionData { /// public string Name { get; private set; } + /// + /// The message selected to run the command + /// public SocketMessage Message { get; private set; } internal Dictionary guildMembers { get; private set; } @@ -27,15 +30,11 @@ public class SocketApplicationMessageCommandData : SocketEntity, IApplica private ulong? guildId; - private ApplicationCommandType Type; - - internal SocketApplicationMessageCommandData(DiscordSocketClient client, Model model, ulong? guildId) + internal SocketMessageCommandData(DiscordSocketClient client, Model model, ulong? guildId) : base(client, model.Id) { this.guildId = guildId; - this.Type = (ApplicationCommandType)model.Type; - if (model.Resolved.IsSpecified) { var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; @@ -126,9 +125,9 @@ internal SocketApplicationMessageCommandData(DiscordSocketClient client, Model m } } - internal static SocketApplicationMessageCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + internal static SocketMessageCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) { - var entity = new SocketApplicationMessageCommandData(client, model, guildId); + var entity = new SocketMessageCommandData(client, model, guildId); entity.Update(model); return entity; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs similarity index 70% rename from src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs index 603a113973..f4c3a8b7b4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs @@ -10,14 +10,14 @@ namespace Discord.WebSocket /// /// Represents a Websocket-based slash command received over the gateway. /// - public class SocketApplicationUserCommand : SocketCommandBase + public class SocketUserCommand : SocketCommandBase { /// /// The data associated with this interaction. /// - new public SocketApplicationUserCommandData Data { get; } + new public SocketUserCommandData Data { get; } - internal SocketApplicationUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { var dataModel = model.Data.IsSpecified ? @@ -28,12 +28,12 @@ internal SocketApplicationUserCommand(DiscordSocketClient client, Model model, I if (this.Channel is SocketGuildChannel guildChannel) guildId = guildChannel.Guild.Id; - Data = SocketApplicationUserCommandData.Create(client, dataModel, model.Id, guildId); + Data = SocketUserCommandData.Create(client, dataModel, model.Id, guildId); } new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { - var entity = new SocketApplicationUserCommand(client, model, channel); + var entity = new SocketUserCommand(client, model, channel); entity.Update(model); return entity; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs similarity index 86% rename from src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs rename to src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs index a6eb24ca52..1cdfed0977 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketApplicationUserCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs @@ -6,13 +6,15 @@ namespace Discord.WebSocket { /// - /// Represents the data tied with the interaction. + /// Represents the data tied with the interaction. /// - public class SocketApplicationUserCommandData : SocketEntity, IApplicationCommandInteractionData + public class SocketUserCommandData : SocketEntity, IApplicationCommandInteractionData { /// public string Name { get; private set; } - + /// + /// The user used to run the command + /// public SocketUser Member { get; private set; } internal Dictionary guildMembers { get; private set; } @@ -28,15 +30,11 @@ public class SocketApplicationUserCommandData : SocketEntity, IApplicatio private ulong? guildId; - private ApplicationCommandType Type; - - internal SocketApplicationUserCommandData(DiscordSocketClient client, Model model, ulong? guildId) + internal SocketUserCommandData(DiscordSocketClient client, Model model, ulong? guildId) : base(client, model.Id) { this.guildId = guildId; - this.Type = (ApplicationCommandType)model.Type; - if (model.Resolved.IsSpecified) { var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; @@ -99,9 +97,9 @@ internal SocketApplicationUserCommandData(DiscordSocketClient client, Model mode } } - internal static SocketApplicationUserCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + internal static SocketUserCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) { - var entity = new SocketApplicationUserCommandData(client, model, guildId); + var entity = new SocketUserCommandData(client, model, guildId); entity.Update(model); return entity; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 921f81de4a..cc91b098f2 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -4,12 +4,13 @@ using Model = Discord.API.Interaction; using DataModel = Discord.API.MessageComponentInteractionData; using Discord.Rest; +using System.Collections.Generic; namespace Discord.WebSocket { - /// - /// Represents a Websocket-based interaction type for Message Components. - /// +/// +/// Represents a Websocket-based interaction type for Message Components. +/// public class SocketMessageComponent : SocketInteraction { /// @@ -123,7 +124,7 @@ public override async Task RespondAsync( }; if (ephemeral) - response.Data.Value.Flags = 64; + response.Data.Value.Flags = MessageFlags.Ephemeral; await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); } @@ -149,8 +150,28 @@ public async Task UpdateAsync(Action func, RequestOptions opt Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); } - if (args.Embeds.IsSpecified) - Preconditions.AtMost(args.Embeds.Value?.Length ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); + var embed = args.Embed; + var embeds = args.Embeds; + + bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(Message.Content); + bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || Message.Embeds.Any(); + + if (!hasText && !hasEmbeds) + Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); + + var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; + + if (embed.IsSpecified && embed.Value != null) + { + apiEmbeds.Add(embed.Value.ToModel()); + } + + if (embeds.IsSpecified && embeds.Value != null) + { + apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); + } + + Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (args.AllowedMentions.IsSpecified && args.AllowedMentions.Value != null && args.AllowedMentions.Value.AllowedTypes.HasValue) @@ -176,11 +197,11 @@ public async Task UpdateAsync(Action func, RequestOptions opt { Content = args.Content, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, - Embeds = args.Embeds.IsSpecified ? args.Embeds.Value?.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, - Flags = args.Flags.IsSpecified ? (int?)args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified + Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified } }; @@ -213,27 +234,43 @@ public override async Task FollowupAsync( AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, }; if (ephemeral) - args.Flags = 64; + args.Flags = MessageFlags.Ephemeral; return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } /// - /// Acknowledges this interaction with the . + /// Defers an interaction and responds with type 5 () /// + /// to send this message ephemerally, otherwise . /// The request options for this async request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public override Task DeferAsync(RequestOptions options = null) + public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = null) + { + var response = new API.InteractionResponse() + { + Type = InteractionResponseType.DeferredChannelMessageWithSource, + Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified + + }; + + return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + } + + /// + public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { var response = new API.InteractionResponse() { Type = InteractionResponseType.DeferredUpdateMessage, + Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified + }; return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 3013099c75..36542f15ad 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -36,6 +36,6 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess var entity = new SocketSlashCommand(client, model, channel); entity.Update(model); return entity; - } + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index f33008cf31..f9c12257ed 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -86,9 +86,9 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) break; case ApplicationCommandOptionType.Integer: { - if (model.Value.Value is int val) + if (model.Value.Value is long val) this.Value = val; - else if (int.TryParse(model.Value.Value.ToString(), out int res)) + else if (long.TryParse(model.Value.Value.ToString(), out long res)) this.Value = res; } break; @@ -109,7 +109,7 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) } break; } - + } this.Options = model.Options.IsSpecified diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 4dbadc552d..6ba9ba05ab 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -9,6 +9,9 @@ namespace Discord.WebSocket { + /// + /// Base class for User, Message, and Slash command interactions + /// public class SocketCommandBase : SocketInteraction { /// @@ -105,7 +108,7 @@ public override async Task RespondAsync( }; if (ephemeral) - response.Data.Value.Flags = 64; + response.Data.Value.Flags = MessageFlags.Ephemeral; await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); } @@ -140,7 +143,7 @@ public override async Task FollowupAsync( }; if (ephemeral) - args.Flags = 64; + args.Flags = MessageFlags.Ephemeral; return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } @@ -151,7 +154,7 @@ public override async Task FollowupAsync( /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public override Task DeferAsync(RequestOptions options = null) + public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { var response = new API.InteractionResponse { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs index 7d7dbbce7b..dde981eb9c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs @@ -5,13 +5,17 @@ namespace Discord.WebSocket { + /// + /// Represents the base data tied with the interaction. + /// public class SocketCommandBaseData : SocketEntity, IApplicationCommandInteractionData { + /// public string Name { get; private set; } - + /// + /// The 's received with this interaction. + /// public IReadOnlyCollection Options { get; private set; } - // id - // type internal Dictionary guildMembers { get; private set; } = new Dictionary(); internal Dictionary users { get; private set; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs index 369f1f868e..6aa15978ef 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs @@ -9,8 +9,12 @@ namespace Discord.WebSocket { + /// + /// Represents the base Websocket-based recieved by the gateway + /// public class SocketCommandBaseDataOption : IApplicationCommandInteractionDataOption { + /// public string Name { get; private set; } /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 59bae6f083..9b42ed0e28 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -71,9 +71,9 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model if (dataModel != null) { if (dataModel.Type.Equals(ApplicationCommandType.User)) - return SocketApplicationUserCommand.Create(client, model, channel); + return SocketUserCommand.Create(client, model, channel); if (dataModel.Type.Equals(ApplicationCommandType.Message)) - return SocketApplicationMessageCommand.Create(client, model, channel); + return SocketMessageCommand.Create(client, model, channel); } } return SocketSlashCommand.Create(client, model, channel); @@ -172,20 +172,37 @@ public async Task ModifyOriginalResponseAsync(Action [Obsolete("This method deprecated, please use DeferAsync instead")] - public Task AcknowledgeAsync(RequestOptions options = null) => DeferAsync(options); + public Task AcknowledgeAsync(RequestOptions options = null) => DeferAsync(options: options); /// /// Acknowledges this interaction. /// + /// to send this message ephemerally, otherwise . + /// The request options for this async request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public abstract Task DeferAsync(RequestOptions options = null); + public abstract Task DeferAsync(bool ephemeral = false, RequestOptions options = null); private bool CheckToken() { // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes <= 15d; } + + // IDiscordInteraction + + /// + async Task IDiscordInteraction.FollowupAsync (string text, Embed[] embeds, bool isTTS, bool ephemeral, AllowedMentions allowedMentions, + RequestOptions options, MessageComponent component, Embed embed) + => await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component, embed).ConfigureAwait(false); + + /// + async Task IDiscordInteraction.GetOriginalResponseAsync (RequestOptions options) + => await GetOriginalResponseAsync(options).ConfigureAwait(false); + + /// + async Task IDiscordInteraction.ModifyOriginalResponseAsync (Action func, RequestOptions options) + => await ModifyOriginalResponseAsync(func, options).ConfigureAwait(false); } } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 82c656486d..1b62d14dd8 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -122,7 +122,10 @@ internal SocketMessage(DiscordSocketClient discord, ulong id, ISocketMessageChan } internal static SocketMessage Create(DiscordSocketClient discord, ClientState state, SocketUser author, ISocketMessageChannel channel, Model model) { - if (model.Type == MessageType.Default || model.Type == MessageType.Reply) + if (model.Type == MessageType.Default || + model.Type == MessageType.Reply || + model.Type == MessageType.ApplicationCommand || + model.Type == MessageType.ThreadStarterMessage) return SocketUserMessage.Create(discord, state, author, channel, model); else return SocketSystemMessage.Create(discord, state, author, channel, model); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs index 15c5182fc9..b1bce5934d 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs @@ -12,6 +12,8 @@ internal class SocketGlobalUser : SocketUser public override string Username { get; internal set; } public override ushort DiscriminatorValue { get; internal set; } public override string AvatarId { get; internal set; } + public override string BannerId { get; internal set; } + public override Color? AccentColor { get; internal set; } internal override SocketPresence Presence { get; set; } public override bool IsWebhook => false; @@ -47,7 +49,7 @@ internal void RemoveRef(DiscordSocketClient discord) discord.RemoveUser(Id); } } - + internal void Update(ClientState state, PresenceModel model) { Presence = SocketPresence.Create(model); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs index 805a881101..d993105404 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs @@ -29,6 +29,10 @@ public class SocketGroupUser : SocketUser, IGroupUser /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } /// + public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } + /// + public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } + /// internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index f79fc7afed..ac8409a322 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -38,6 +38,11 @@ public class SocketGuildUser : SocketUser, IGuildUser public override ushort DiscriminatorValue { get { return GlobalUser.DiscriminatorValue; } internal set { GlobalUser.DiscriminatorValue = value; } } /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } + /// + public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } + /// + public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } + /// public GuildPermissions GuildPermissions => new GuildPermissions(Permissions.ResolveGuild(Guild, this)); internal override SocketPresence Presence { get; set; } @@ -91,7 +96,7 @@ public IReadOnlyCollection Roles /// Returns the position of the user within the role hierarchy. /// /// - /// The returned value equal to the position of the highest role the user has, or + /// The returned value equal to the position of the highest role the user has, or /// if user is the server owner. /// public int Hierarchy diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs index 7b11257a3b..e821238eef 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs @@ -29,6 +29,10 @@ public class SocketSelfUser : SocketUser, ISelfUser /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } /// + public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } + /// + public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } + /// internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } /// public UserProperties Flags { get; internal set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index d1237d598f..5fb1f56e54 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -36,7 +36,7 @@ public DateTimeOffset? JoinedAt /// public string Nickname - => GuildUser.Nickname; + => GuildUser.Nickname; /// public DateTimeOffset? PremiumSince @@ -53,6 +53,20 @@ public override string AvatarId internal set => GuildUser.AvatarId = value; } + /// + public override string BannerId + { + get => GuildUser.BannerId; + internal set => GuildUser.BannerId = value; + } + + /// + public override Color? AccentColor + { + get => GuildUser.AccentColor; + internal set => GuildUser.AccentColor = value; + } + /// public override ushort DiscriminatorValue { diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs index 840a1c30bf..180e60a3ba 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs @@ -19,9 +19,16 @@ public class SocketUnknownUser : SocketUser public override ushort DiscriminatorValue { get; internal set; } /// public override string AvatarId { get; internal set; } + + /// + public override string BannerId { get; internal set; } + + /// + public override Color? AccentColor { get; internal set; } + /// public override bool IsBot { get; internal set; } - + /// public override bool IsWebhook => false; /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index 025daf29ae..c50fbee4fb 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -25,6 +25,10 @@ public abstract class SocketUser : SocketEntity, IUser /// public abstract string AvatarId { get; internal set; } /// + public abstract string BannerId { get; internal set; } + /// + public abstract Color? AccentColor { get; internal set; } + /// public abstract bool IsWebhook { get; } /// public UserProperties? PublicFlags { get; private set; } @@ -64,6 +68,16 @@ internal virtual bool Update(ClientState state, Model model) AvatarId = model.Avatar.Value; hasChanges = true; } + if (model.Banner.IsSpecified && model.Banner.Value != BannerId) + { + BannerId = model.Banner.Value; + hasChanges = true; + } + if (model.AccentColor.IsSpecified && model.AccentColor.Value != AccentColor?.RawValue) + { + AccentColor = model.AccentColor.Value; + hasChanges = true; + } if (model.Discriminator.IsSpecified) { var newVal = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); @@ -99,6 +113,10 @@ public async Task CreateDMChannelAsync(RequestOptions options = null public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); + /// + public string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256) + => CDN.GetUserBannerUrl(Id, BannerId, size, format); + /// public string GetDefaultAvatarUrl() => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index 2b0ecbb19f..f1269e649f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -24,6 +24,23 @@ public class SocketWebhookUser : SocketUser, IWebhookUser public override ushort DiscriminatorValue { get; internal set; } /// public override string AvatarId { get; internal set; } + + /// + /// Webhook users does not support banners. + public override string BannerId + { + get => throw new NotSupportedException("Webhook users does not support banners."); + internal set => throw new NotSupportedException("Webhook users does not support banners."); + } + + /// + /// Webhook users does not support accent colors. + public override Color? AccentColor + { + get => throw new NotSupportedException("Webhook users does not support accent colors."); + internal set => throw new NotSupportedException("Webhook users does not support accent colors."); + } + /// public override bool IsBot { get; internal set; } diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 13e5cf1115..f04dedf438 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -6,7 +6,7 @@ Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 2.3.4 + 3.0.0-pre Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml index f629c2c29b..d1bafb9a37 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml @@ -31,7 +31,7 @@ Thrown if the is an invalid format. Thrown if the is null or whitespace. - + Sends a message to the channel for this webhook. Returns the ID of the created message. @@ -99,6 +99,11 @@ Gets or sets the allowed mentions of the message. + + + Gets or sets the components that the message should display. + + Could not find a webhook with the supplied credentials. diff --git a/src/Discord.Net.Webhook/DiscordWebhookClient.cs b/src/Discord.Net.Webhook/DiscordWebhookClient.cs index 91d0774114..d4affb08ba 100644 --- a/src/Discord.Net.Webhook/DiscordWebhookClient.cs +++ b/src/Discord.Net.Webhook/DiscordWebhookClient.cs @@ -88,8 +88,8 @@ private static API.DiscordRestApiClient CreateApiClient(DiscordRestConfig config /// Sends a message to the channel for this webhook. /// Returns the ID of the created message. public Task SendMessageAsync(string text = null, bool isTTS = false, IEnumerable embeds = null, - string username = null, string avatarUrl = null, RequestOptions options = null, AllowedMentions allowedMentions = null) - => WebhookClientHelper.SendMessageAsync(this, text, isTTS, embeds, username, avatarUrl, allowedMentions, options); + string username = null, string avatarUrl = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageComponent component = null) + => WebhookClientHelper.SendMessageAsync(this, text, isTTS, embeds, username, avatarUrl, allowedMentions, options, component); /// /// Modifies a message posted using this webhook. diff --git a/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs b/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs index dec7b6e3b4..ca2ff10a00 100644 --- a/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs +++ b/src/Discord.Net.Webhook/Entities/Messages/WebhookMessageProperties.cs @@ -22,5 +22,9 @@ public class WebhookMessageProperties /// Gets or sets the allowed mentions of the message. /// public Optional AllowedMentions { get; set; } + /// + /// Gets or sets the components that the message should display. + /// + public Optional Components { get; set; } } } diff --git a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs index bbb160fcd5..2a5c4786e4 100644 --- a/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs +++ b/src/Discord.Net.Webhook/Entities/Webhooks/RestInternalWebhook.cs @@ -17,6 +17,7 @@ internal class RestInternalWebhook : IWebhook public string Name { get; private set; } public string AvatarId { get; private set; } public ulong? GuildId { get; private set; } + public ulong? ApplicationId { get; private set; } public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -44,6 +45,8 @@ internal void Update(Model model) GuildId = model.GuildId.Value; if (model.Name.IsSpecified) Name = model.Name.Value; + + ApplicationId = model.ApplicationId; } public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) diff --git a/src/Discord.Net.Webhook/WebhookClientHelper.cs b/src/Discord.Net.Webhook/WebhookClientHelper.cs index 528848f7f8..6e3651323b 100644 --- a/src/Discord.Net.Webhook/WebhookClientHelper.cs +++ b/src/Discord.Net.Webhook/WebhookClientHelper.cs @@ -21,7 +21,7 @@ public static async Task GetWebhookAsync(DiscordWebhookClie return RestInternalWebhook.Create(client, model); } public static async Task SendMessageAsync(DiscordWebhookClient client, - string text, bool isTTS, IEnumerable embeds, string username, string avatarUrl, AllowedMentions allowedMentions, RequestOptions options) + string text, bool isTTS, IEnumerable embeds, string username, string avatarUrl, AllowedMentions allowedMentions, RequestOptions options, MessageComponent component) { var args = new CreateWebhookMessageParams { @@ -37,6 +37,8 @@ public static async Task SendMessageAsync(DiscordWebhookClient client, args.AvatarUrl = avatarUrl; if (allowedMentions != null) args.AllowedMentions = allowedMentions.ToModel(); + if (component != null) + args.Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray(); var model = await client.ApiClient.CreateWebhookMessageAsync(client.Webhook.Id, args, options: options).ConfigureAwait(false); return model.Id; @@ -83,7 +85,8 @@ public static async Task ModifyMessageAsync(DiscordWebhookClient client, ulong m : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() - : Optional.Create() + : Optional.Create(), + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; await client.ApiClient.ModifyWebhookMessageAsync(client.Webhook.Id, messageId, apiArgs, options) diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 595203eba0..eb3bd9b6d5 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.1-pre$suffix$ + 3.0.2-pre$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + diff --git a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs index 137dc55752..9be109c6e5 100644 --- a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs @@ -91,7 +91,13 @@ void AssertFlag(Func cstr, GuildPermission flag) AssertFlag(() => new GuildPermissions(manageNicknames: true), GuildPermission.ManageNicknames); AssertFlag(() => new GuildPermissions(manageRoles: true), GuildPermission.ManageRoles); AssertFlag(() => new GuildPermissions(manageWebhooks: true), GuildPermission.ManageWebhooks); - AssertFlag(() => new GuildPermissions(manageEmojis: true), GuildPermission.ManageEmojis); + AssertFlag(() => new GuildPermissions(manageEmojisAndStickers: true), GuildPermission.ManageEmojisAndStickers); + AssertFlag(() => new GuildPermissions(useSlashCommands: true), GuildPermission.UseSlashCommands); + AssertFlag(() => new GuildPermissions(requestToSpeak: true), GuildPermission.RequestToSpeak); + AssertFlag(() => new GuildPermissions(manageThreads: true), GuildPermission.ManageThreads); + AssertFlag(() => new GuildPermissions(usePublicThreads: true), GuildPermission.UsePublicThreads); + AssertFlag(() => new GuildPermissions(usePrivateThreads: true), GuildPermission.UsePrivateThreads); + AssertFlag(() => new GuildPermissions(useExternalStickers: true), GuildPermission.UseExternalStickers); } /// @@ -161,7 +167,13 @@ void AssertUtil(GuildPermission permission, AssertUtil(GuildPermission.ManageNicknames, x => x.ManageNicknames, (p, enable) => p.Modify(manageNicknames: enable)); AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); - AssertUtil(GuildPermission.ManageEmojis, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojis: enable)); + AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojisAndStickers: enable)); + AssertUtil(GuildPermission.UseSlashCommands, x => x.UseSlashCommands, (p, enable) => p.Modify(useSlashCommands: enable)); + AssertUtil(GuildPermission.RequestToSpeak, x => x.RequestToSpeak, (p, enable) => p.Modify(requestToSpeak: enable)); + AssertUtil(GuildPermission.ManageThreads, x => x.ManageThreads, (p, enable) => p.Modify(manageThreads: enable)); + AssertUtil(GuildPermission.UsePublicThreads, x => x.UsePublicThreads, (p, enable) => p.Modify(usePublicThreads: enable)); + AssertUtil(GuildPermission.UsePrivateThreads, x => x.UsePrivateThreads, (p, enable) => p.Modify(usePrivateThreads: enable)); + AssertUtil(GuildPermission.UseExternalStickers, x => x.UseExternalStickers, (p, enable) => p.Modify(useExternalStickers: enable)); } } } From 8e19bd77ea510b7ae777f462ae832ab6d96aee95 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 21 Aug 2021 00:54:06 -0300 Subject: [PATCH 182/494] Code cleanup and simplification --- .../ApplicationCommandInteractionData.cs | 4 +- src/Discord.Net.Rest/API/Net/IResolvable.cs | 14 ++ .../Discord.Net.WebSocket.xml | 56 ++++---- .../Message Commands/SocketMessageCommand.cs | 2 +- .../SocketMessageCommandData.cs | 128 ++--------------- .../User Commands/SocketUserCommand.cs | 2 +- .../User Commands/SocketUserCommandData.cs | 98 ++----------- .../Slash Commands/SocketSlashCommand.cs | 2 +- .../Slash Commands/SocketSlashCommandData.cs | 94 +----------- .../SocketSlashCommandDataOption.cs | 22 +-- .../SocketBaseCommand/SocketCommandBase.cs | 2 +- .../SocketCommandBaseData.cs | 127 +++-------------- .../SocketCommandBaseDataOption.cs | 134 ------------------ .../SocketBaseCommand/SocketResolvableData.cs | 113 +++++++++++++++ 14 files changed, 216 insertions(+), 582 deletions(-) create mode 100644 src/Discord.Net.Rest/API/Net/IResolvable.cs delete mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index ed86b0b4a8..bb395df139 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -3,7 +3,7 @@ namespace Discord.API { - internal class ApplicationCommandInteractionData : IDiscordInteractionData + internal class ApplicationCommandInteractionData : IResolvable, IDiscordInteractionData { [JsonProperty("id")] public ulong Id { get; set; } @@ -18,7 +18,7 @@ internal class ApplicationCommandInteractionData : IDiscordInteractionData public Optional Resolved { get; set; } [JsonProperty("type")] - public Optional Type { get; set; } + public ApplicationCommandType Type { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Net/IResolvable.cs b/src/Discord.Net.Rest/API/Net/IResolvable.cs new file mode 100644 index 0000000000..fe31cd75ef --- /dev/null +++ b/src/Discord.Net.Rest/API/Net/IResolvable.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal interface IResolvable + { + Optional Resolved { get; } + + } +} diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 485a83a612..f7137c90c0 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3617,8 +3617,16 @@ Represents the data tied with the interaction. - + + + Gets the messagte associated with this message command. + + + + + Note Not implemented for + @@ -3635,8 +3643,16 @@ Represents the data tied with the interaction. - + + + The user used to run the command + + + + + Note Not implemented for + @@ -3715,14 +3731,6 @@ Represents the data tied with the interaction. - - - - - - The 's received with this interaction. - - Represents a Websocket-based recieved by the gateway @@ -3821,7 +3829,7 @@ - Base class for User, Message, and Slash command interactions + Base class for User, Message, and Slash command interactions @@ -3843,36 +3851,22 @@ A task that represents the asynchronous operation of acknowledging the interaction. - + Represents the base data tied with the interaction. - + - + - The 's received with this interaction. + The received with this interaction. - - - Represents the base Websocket-based recieved by the gateway - - - - - - - - - - - - + - The sub command options received for this sub command group. + Represents the base data tied with the interaction. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs index 5d8b0af43f..72f040cc61 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs @@ -15,7 +15,7 @@ public class SocketMessageCommand : SocketCommandBase /// /// The data associated with this interaction. /// - new public SocketMessageCommandData Data { get; } + public new SocketMessageCommandData Data { get; } internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs index 9c925c4ce2..e78da223d9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; using Model = Discord.API.ApplicationCommandInteractionData; @@ -8,132 +7,29 @@ namespace Discord.WebSocket /// /// Represents the data tied with the interaction. /// - public class SocketMessageCommandData : SocketEntity, IApplicationCommandInteractionData + public class SocketMessageCommandData : SocketCommandBaseData { - /// - public string Name { get; private set; } /// - /// The message selected to run the command + /// Gets the messagte associated with this message command. /// - public SocketMessage Message { get; private set; } - - internal Dictionary guildMembers { get; private set; } - = new Dictionary(); - internal Dictionary users { get; private set; } - = new Dictionary(); - internal Dictionary channels { get; private set; } - = new Dictionary(); - internal Dictionary roles { get; private set; } - = new Dictionary(); - - IReadOnlyCollection IApplicationCommandInteractionData.Options => throw new System.NotImplementedException(); + public SocketMessage Message + => ResolvableData?.Messages.FirstOrDefault().Value; - private ulong? guildId; + /// + /// + /// Note Not implemented for + /// + public override IReadOnlyCollection Options + => throw new System.NotImplementedException(); internal SocketMessageCommandData(DiscordSocketClient client, Model model, ulong? guildId) - : base(client, model.Id) - { - this.guildId = guildId; - - if (model.Resolved.IsSpecified) - { - var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; - - var resolved = model.Resolved.Value; - - if (resolved.Users.IsSpecified) - { - foreach (var user in resolved.Users.Value) - { - var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); - - this.users.Add(ulong.Parse(user.Key), socketUser); - } - } - - if (resolved.Channels.IsSpecified) - { - foreach (var channel in resolved.Channels.Value) - { - SocketChannel socketChannel = guild != null - ? guild.GetChannel(channel.Value.Id) - : Discord.GetChannel(channel.Value.Id); - - if (socketChannel == null) - { - var channelModel = guild != null - ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() - : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); + : base(client, model, guildId) { } - socketChannel = guild != null - ? SocketGuildChannel.Create(guild, Discord.State, channelModel) - : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); - } - - Discord.State.AddChannel(socketChannel); - this.channels.Add(ulong.Parse(channel.Key), socketChannel); - } - } - - if (resolved.Members.IsSpecified) - { - foreach (var member in resolved.Members.Value) - { - member.Value.User = resolved.Users.Value[member.Key]; - var user = guild.AddOrUpdateUser(member.Value); - this.guildMembers.Add(ulong.Parse(member.Key), user); - } - } - - if (resolved.Roles.IsSpecified) - { - foreach (var role in resolved.Roles.Value) - { - var socketRole = guild.AddOrUpdateRole(role.Value); - this.roles.Add(ulong.Parse(role.Key), socketRole); - } - } - - if (resolved.Messages.IsSpecified) - { - foreach (var msg in resolved.Messages.Value) - { - var channel = client.GetChannel(msg.Value.ChannelId) as ISocketMessageChannel; - - SocketUser author; - if (guild != null) - { - if (msg.Value.WebhookId.IsSpecified) - author = SocketWebhookUser.Create(guild, client.State, msg.Value.Author.Value, msg.Value.WebhookId.Value); - else - author = guild.GetUser(msg.Value.Author.Value.Id); - } - else - author = (channel as SocketChannel).GetUser(msg.Value.Author.Value.Id); - - if (channel == null) - { - if (!msg.Value.GuildId.IsSpecified) // assume it is a DM - { - channel = client.CreateDMChannel(msg.Value.ChannelId, msg.Value.Author.Value, client.State); - } - } - - this.Message = SocketMessage.Create(client, client.State, author, channel, msg.Value); - } - } - } - } - - internal static SocketMessageCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + internal new static SocketMessageCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) { var entity = new SocketMessageCommandData(client, model, guildId); entity.Update(model); return entity; } - internal void Update(Model model) - { - this.Name = model.Name; - } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs index f4c3a8b7b4..5345c08f7a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs @@ -15,7 +15,7 @@ public class SocketUserCommand : SocketCommandBase /// /// The data associated with this interaction. /// - new public SocketUserCommandData Data { get; } + public new SocketUserCommandData Data { get; } internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs index 1cdfed0977..70eb4adff9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; using Model = Discord.API.ApplicationCommandInteractionData; namespace Discord.WebSocket @@ -8,104 +6,28 @@ namespace Discord.WebSocket /// /// Represents the data tied with the interaction. /// - public class SocketUserCommandData : SocketEntity, IApplicationCommandInteractionData + public class SocketUserCommandData : SocketCommandBaseData { - /// - public string Name { get; private set; } /// - /// The user used to run the command + /// The user used to run the command /// public SocketUser Member { get; private set; } - internal Dictionary guildMembers { get; private set; } - = new Dictionary(); - internal Dictionary users { get; private set; } - = new Dictionary(); - internal Dictionary channels { get; private set; } - = new Dictionary(); - internal Dictionary roles { get; private set; } - = new Dictionary(); - - IReadOnlyCollection IApplicationCommandInteractionData.Options => throw new System.NotImplementedException(); - - private ulong? guildId; + /// + /// + /// Note Not implemented for + /// + public override IReadOnlyCollection Options + => throw new System.NotImplementedException(); internal SocketUserCommandData(DiscordSocketClient client, Model model, ulong? guildId) - : base(client, model.Id) - { - this.guildId = guildId; - - if (model.Resolved.IsSpecified) - { - var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; - - var resolved = model.Resolved.Value; - - if (resolved.Users.IsSpecified) - { - foreach (var user in resolved.Users.Value) - { - var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); - - this.users.Add(ulong.Parse(user.Key), socketUser); - } - } + : base(client, model, guildId) { } - if (resolved.Channels.IsSpecified) - { - foreach (var channel in resolved.Channels.Value) - { - SocketChannel socketChannel = guild != null - ? guild.GetChannel(channel.Value.Id) - : Discord.GetChannel(channel.Value.Id); - - if (socketChannel == null) - { - var channelModel = guild != null - ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() - : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); - - socketChannel = guild != null - ? SocketGuildChannel.Create(guild, Discord.State, channelModel) - : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); - } - - Discord.State.AddChannel(socketChannel); - this.channels.Add(ulong.Parse(channel.Key), socketChannel); - } - } - - if (resolved.Members.IsSpecified) - { - foreach (var member in resolved.Members.Value) - { - member.Value.User = resolved.Users.Value[member.Key]; - var user = guild.AddOrUpdateUser(member.Value); - this.guildMembers.Add(ulong.Parse(member.Key), user); - this.Member = user; - } - } - - if (resolved.Roles.IsSpecified) - { - foreach (var role in resolved.Roles.Value) - { - var socketRole = guild.AddOrUpdateRole(role.Value); - this.roles.Add(ulong.Parse(role.Key), socketRole); - } - } - } - } - - internal static SocketUserCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + internal new static SocketUserCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) { var entity = new SocketUserCommandData(client, model, guildId); entity.Update(model); return entity; } - internal void Update(Model model) - { - this.Name = model.Name; - } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 36542f15ad..05c051f12f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -28,7 +28,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess if (this.Channel is SocketGuildChannel guildChannel) guildId = guildChannel.Guild.Id; - Data = SocketSlashCommandData.Create(client, dataModel, model.Id, guildId); + Data = SocketSlashCommandData.Create(client, dataModel, guildId); } new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 6ed77b997b..4b6764bf71 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -8,108 +8,24 @@ namespace Discord.WebSocket /// /// Represents the data tied with the interaction. /// - public class SocketSlashCommandData : SocketEntity, IApplicationCommandInteractionData + public class SocketSlashCommandData : SocketCommandBaseData { - /// - public string Name { get; private set; } - - /// - /// The 's received with this interaction. - /// - public IReadOnlyCollection Options { get; private set; } - - internal Dictionary guildMembers { get; private set; } - = new Dictionary(); - internal Dictionary users { get; private set; } - = new Dictionary(); - internal Dictionary channels { get; private set; } - = new Dictionary(); - internal Dictionary roles { get; private set; } - = new Dictionary(); - - private ulong? guildId; - internal SocketSlashCommandData(DiscordSocketClient client, Model model, ulong? guildId) - : base(client, model.Id) - { - this.guildId = guildId; - - if (model.Resolved.IsSpecified) - { - var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; - - var resolved = model.Resolved.Value; - - if (resolved.Users.IsSpecified) - { - foreach (var user in resolved.Users.Value) - { - var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); - - this.users.Add(ulong.Parse(user.Key), socketUser); - } - } + : base(client, model, guildId) { } - if (resolved.Channels.IsSpecified) - { - foreach (var channel in resolved.Channels.Value) - { - SocketChannel socketChannel = guild != null - ? guild.GetChannel(channel.Value.Id) - : Discord.GetChannel(channel.Value.Id); - - if (socketChannel == null) - { - var channelModel = guild != null - ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() - : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); - - socketChannel = guild != null - ? SocketGuildChannel.Create(guild, Discord.State, channelModel) - : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); - } - - Discord.State.AddChannel(socketChannel); - this.channels.Add(ulong.Parse(channel.Key), socketChannel); - } - } - - if (resolved.Members.IsSpecified) - { - foreach (var member in resolved.Members.Value) - { - member.Value.User = resolved.Users.Value[member.Key]; - var user = guild.AddOrUpdateUser(member.Value); - this.guildMembers.Add(ulong.Parse(member.Key), user); - } - } - - if (resolved.Roles.IsSpecified) - { - foreach (var role in resolved.Roles.Value) - { - var socketRole = guild.AddOrUpdateRole(role.Value); - this.roles.Add(ulong.Parse(role.Key), socketRole); - } - } - } - } - - internal static SocketSlashCommandData Create(DiscordSocketClient client, Model model, ulong id, ulong? guildId) + internal static SocketSlashCommandData Create(DiscordSocketClient client, Model model, ulong? guildId) { var entity = new SocketSlashCommandData(client, model, guildId); entity.Update(model); return entity; } - internal void Update(Model model) + internal override void Update(Model model) { - this.Name = model.Name; + base.Update(model); this.Options = model.Options.IsSpecified ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(this, x)).ToImmutableArray() : null; } - - IReadOnlyCollection IApplicationCommandInteractionData.Options => Options; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index f9c12257ed..a79a9724c8 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -44,34 +44,34 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) { case ApplicationCommandOptionType.User: { - var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; + var guildUser = data.ResolvableData.GuildMembers.FirstOrDefault(x => x.Key == valueId).Value; if (guildUser != null) this.Value = guildUser; else - this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + this.Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; } break; case ApplicationCommandOptionType.Channel: - this.Value = data.channels.FirstOrDefault(x => x.Key == valueId).Value; + this.Value = data.ResolvableData.Channels.FirstOrDefault(x => x.Key == valueId).Value; break; case ApplicationCommandOptionType.Role: - this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; + this.Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; break; case ApplicationCommandOptionType.Mentionable: { - if(data.guildMembers.Any(x => x.Key == valueId) || data.users.Any(x => x.Key == valueId)) + if(data.ResolvableData.GuildMembers.Any(x => x.Key == valueId) || data.ResolvableData.Users.Any(x => x.Key == valueId)) { - var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; + var guildUser = data.ResolvableData.GuildMembers.FirstOrDefault(x => x.Key == valueId).Value; if (guildUser != null) this.Value = guildUser; else - this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; + this.Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; } - else if(data.roles.Any(x => x.Key == valueId)) + else if(data.ResolvableData.Roles.Any(x => x.Key == valueId)) { - this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; + this.Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; } } break; @@ -125,6 +125,8 @@ public static explicit operator int(SocketSlashCommandDataOption option) public static explicit operator string(SocketSlashCommandDataOption option) => option.Value.ToString(); - IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options; + // IApplicationCommandInteractionDataOption + IReadOnlyCollection IApplicationCommandInteractionDataOption.Options + => this.Options; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 6ba9ba05ab..7c8e2422e0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -10,7 +10,7 @@ namespace Discord.WebSocket { /// - /// Base class for User, Message, and Slash command interactions + /// Base class for User, Message, and Slash command interactions /// public class SocketCommandBase : SocketInteraction { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs index dde981eb9c..64aeb5d241 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs @@ -8,123 +8,28 @@ namespace Discord.WebSocket /// /// Represents the base data tied with the interaction. /// - public class SocketCommandBaseData : SocketEntity, IApplicationCommandInteractionData + public class SocketCommandBaseData : SocketEntity, IApplicationCommandInteractionData where TOption : IApplicationCommandInteractionDataOption { /// public string Name { get; private set; } + /// - /// The 's received with this interaction. + /// The received with this interaction. /// - public IReadOnlyCollection Options { get; private set; } - internal Dictionary guildMembers { get; private set; } - = new Dictionary(); - internal Dictionary users { get; private set; } - = new Dictionary(); - internal Dictionary channels { get; private set; } - = new Dictionary(); - internal Dictionary roles { get; private set; } - = new Dictionary(); - - private ulong? guildId; + public virtual IReadOnlyCollection Options { get; internal set; } - internal SocketMessage Message { get; private set; } + internal readonly SocketResolvableData ResolvableData; private ApplicationCommandType Type { get; set; } internal SocketCommandBaseData(DiscordSocketClient client, Model model, ulong? guildId) : base(client, model.Id) { - this.guildId = guildId; - - this.Type = (ApplicationCommandType)model.Type; + this.Type = model.Type; if (model.Resolved.IsSpecified) { - var guild = this.guildId.HasValue ? Discord.GetGuild(this.guildId.Value) : null; - - var resolved = model.Resolved.Value; - - if (resolved.Users.IsSpecified) - { - foreach (var user in resolved.Users.Value) - { - var socketUser = Discord.GetOrCreateUser(this.Discord.State, user.Value); - - this.users.Add(ulong.Parse(user.Key), socketUser); - } - } - - if (resolved.Channels.IsSpecified) - { - foreach (var channel in resolved.Channels.Value) - { - SocketChannel socketChannel = guild != null - ? guild.GetChannel(channel.Value.Id) - : Discord.GetChannel(channel.Value.Id); - - if (socketChannel == null) - { - var channelModel = guild != null - ? Discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() - : Discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); - - socketChannel = guild != null - ? SocketGuildChannel.Create(guild, Discord.State, channelModel) - : (SocketChannel)SocketChannel.CreatePrivate(Discord, Discord.State, channelModel); - } - - Discord.State.AddChannel(socketChannel); - this.channels.Add(ulong.Parse(channel.Key), socketChannel); - } - } - - if (resolved.Members.IsSpecified) - { - foreach (var member in resolved.Members.Value) - { - member.Value.User = resolved.Users.Value[member.Key]; - var user = guild.AddOrUpdateUser(member.Value); - this.guildMembers.Add(ulong.Parse(member.Key), user); - } - } - - if (resolved.Roles.IsSpecified) - { - foreach (var role in resolved.Roles.Value) - { - var socketRole = guild.AddOrUpdateRole(role.Value); - this.roles.Add(ulong.Parse(role.Key), socketRole); - } - } - - if (resolved.Messages.IsSpecified) - { - foreach (var msg in resolved.Messages.Value) - { - var channel = client.GetChannel(msg.Value.ChannelId) as ISocketMessageChannel; - - SocketUser author; - if (guild != null) - { - if (msg.Value.WebhookId.IsSpecified) - author = SocketWebhookUser.Create(guild, client.State, msg.Value.Author.Value, msg.Value.WebhookId.Value); - else - author = guild.GetUser(msg.Value.Author.Value.Id); - } - else - author = (channel as SocketChannel).GetUser(msg.Value.Author.Value.Id); - - if (channel == null) - { - if (!msg.Value.GuildId.IsSpecified) // assume it is a DM - { - channel = client.CreateDMChannel(msg.Value.ChannelId, msg.Value.Author.Value, client.State); - } - } - - this.Message = SocketMessage.Create(client, client.State, author, channel, msg.Value); - } - } + ResolvableData = new SocketResolvableData(client, guildId, model); } } @@ -135,15 +40,21 @@ internal static SocketCommandBaseData Create(DiscordSocketClient client, Model m return entity; } - internal void Update(Model model) + internal virtual void Update(Model model) { this.Name = model.Name; - - this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketCommandBaseDataOption(this, x)).ToImmutableArray() - : null; } - IReadOnlyCollection IApplicationCommandInteractionData.Options => Options; + IReadOnlyCollection IApplicationCommandInteractionData.Options + => (IReadOnlyCollection)Options; + } + + /// + /// Represents the base data tied with the interaction. + /// + public class SocketCommandBaseData : SocketCommandBaseData + { + internal SocketCommandBaseData(DiscordSocketClient client, Model model, ulong? guildId) + : base(client, model, guildId) { } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs deleted file mode 100644 index 6aa15978ef..0000000000 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseDataOption.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using Model = Discord.API.ApplicationCommandInteractionDataOption; - -namespace Discord.WebSocket -{ - /// - /// Represents the base Websocket-based recieved by the gateway - /// - public class SocketCommandBaseDataOption : IApplicationCommandInteractionDataOption - { - /// - public string Name { get; private set; } - - /// - public object Value { get; private set; } - - /// - public ApplicationCommandOptionType Type { get; private set; } - - /// - /// The sub command options received for this sub command group. - /// - public IReadOnlyCollection Options { get; private set; } - - internal SocketCommandBaseDataOption() { } - internal SocketCommandBaseDataOption(SocketCommandBaseData data, Model model) - { - this.Name = model.Name; - this.Type = model.Type; - - if (model.Value.IsSpecified) - { - switch (Type) - { - case ApplicationCommandOptionType.User: - case ApplicationCommandOptionType.Role: - case ApplicationCommandOptionType.Channel: - case ApplicationCommandOptionType.Mentionable: - if (ulong.TryParse($"{model.Value.Value}", out var valueId)) - { - switch (this.Type) - { - case ApplicationCommandOptionType.User: - { - var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; - - if (guildUser != null) - this.Value = guildUser; - else - this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; - } - break; - case ApplicationCommandOptionType.Channel: - this.Value = data.channels.FirstOrDefault(x => x.Key == valueId).Value; - break; - case ApplicationCommandOptionType.Role: - this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; - break; - case ApplicationCommandOptionType.Mentionable: - { - if (data.guildMembers.Any(x => x.Key == valueId) || data.users.Any(x => x.Key == valueId)) - { - var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value; - - if (guildUser != null) - this.Value = guildUser; - else - this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value; - } - else if (data.roles.Any(x => x.Key == valueId)) - { - this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value; - } - } - break; - default: - this.Value = model.Value.Value; - break; - } - } - break; - case ApplicationCommandOptionType.String: - this.Value = model.Value.ToString(); - break; - case ApplicationCommandOptionType.Integer: - { - if (model.Value.Value is int val) - this.Value = val; - else if (int.TryParse(model.Value.Value.ToString(), out int res)) - this.Value = res; - } - break; - case ApplicationCommandOptionType.Boolean: - { - if (model.Value.Value is bool val) - this.Value = val; - else if (bool.TryParse(model.Value.Value.ToString(), out bool res)) - this.Value = res; - } - break; - case ApplicationCommandOptionType.Number: - { - if (model.Value.Value is int val) - this.Value = val; - else if (double.TryParse(model.Value.Value.ToString(), out double res)) - this.Value = res; - } - break; - } - - } - - this.Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => new SocketCommandBaseDataOption(data, x)).ToImmutableArray() - : null; - } - - // Converters - public static explicit operator bool(SocketCommandBaseDataOption option) - => (bool)option.Value; - public static explicit operator int(SocketCommandBaseDataOption option) - => (int)option.Value; - public static explicit operator string(SocketCommandBaseDataOption option) - => option.Value.ToString(); - - IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options; - } -} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs new file mode 100644 index 0000000000..17c96724ca --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.WebSocket +{ + internal class SocketResolvableData where T : API.IResolvable + { + internal readonly Dictionary GuildMembers + = new Dictionary(); + internal readonly Dictionary Users + = new Dictionary(); + internal readonly Dictionary Channels + = new Dictionary(); + internal readonly Dictionary Roles + = new Dictionary(); + + internal readonly Dictionary Messages + = new Dictionary(); + + internal SocketResolvableData(DiscordSocketClient discord, ulong? guildId, T model) + { + var guild = guildId.HasValue ? discord.GetGuild(guildId.Value) : null; + + var resolved = model.Resolved.Value; + + if (resolved.Users.IsSpecified) + { + foreach (var user in resolved.Users.Value) + { + var socketUser = discord.GetOrCreateUser(discord.State, user.Value); + + this.Users.Add(ulong.Parse(user.Key), socketUser); + } + } + + if (resolved.Channels.IsSpecified) + { + foreach (var channel in resolved.Channels.Value) + { + SocketChannel socketChannel = guild != null + ? guild.GetChannel(channel.Value.Id) + : discord.GetChannel(channel.Value.Id); + + if (socketChannel == null) + { + var channelModel = guild != null + ? discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() + : discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); + + socketChannel = guild != null + ? SocketGuildChannel.Create(guild, discord.State, channelModel) + : (SocketChannel)SocketChannel.CreatePrivate(discord, discord.State, channelModel); + } + + discord.State.AddChannel(socketChannel); + this.Channels.Add(ulong.Parse(channel.Key), socketChannel); + } + } + + if (resolved.Members.IsSpecified) + { + foreach (var member in resolved.Members.Value) + { + member.Value.User = resolved.Users.Value[member.Key]; + var user = guild.AddOrUpdateUser(member.Value); + this.GuildMembers.Add(ulong.Parse(member.Key), user); + } + } + + if (resolved.Roles.IsSpecified) + { + foreach (var role in resolved.Roles.Value) + { + var socketRole = guild.AddOrUpdateRole(role.Value); + this.Roles.Add(ulong.Parse(role.Key), socketRole); + } + } + + if (resolved.Messages.IsSpecified) + { + foreach (var msg in resolved.Messages.Value) + { + var channel = discord.GetChannel(msg.Value.ChannelId) as ISocketMessageChannel; + + SocketUser author; + if (guild != null) + { + if (msg.Value.WebhookId.IsSpecified) + author = SocketWebhookUser.Create(guild, discord.State, msg.Value.Author.Value, msg.Value.WebhookId.Value); + else + author = guild.GetUser(msg.Value.Author.Value.Id); + } + else + author = (channel as SocketChannel).GetUser(msg.Value.Author.Value.Id); + + if (channel == null) + { + if (!msg.Value.GuildId.IsSpecified) // assume it is a DM + { + channel = discord.CreateDMChannel(msg.Value.ChannelId, msg.Value.Author.Value, discord.State); + } + } + + var message = SocketMessage.Create(discord, discord.State, author, channel, msg.Value); + this.Messages.Add(message.Id, message); + } + } + } + } +} From ae95d284faff7bcb361d6df73119e9e53d179733 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 21 Aug 2021 02:40:10 -0300 Subject: [PATCH 183/494] Simply internal usage of context menus --- src/Discord.Net.Core/Discord.Net.Core.xml | 197 +++--- .../ApplicationCommandProperties.cs | 26 +- .../Interactions/ApplicationCommandTypes.cs | 10 +- .../MessageCommandBuilder.cs | 11 +- .../Context Menus/MessageCommandProperties.cs | 16 + .../{ => Context Menus}/UserCommandBuilder.cs | 9 +- .../Context Menus/UserCommandProperties.cs | 16 + .../ContextMenuCommandCreationProperties.cs | 24 - .../Interactions/IApplicationCommand.cs | 12 +- .../Interactions/SlashCommandBuilder.cs | 9 +- ...roperties.cs => SlashCommandProperties.cs} | 17 +- .../UserCommandCreationProperties.cs | 30 - .../API/Common/ApplicationCommand.cs | 8 + src/Discord.Net.Rest/API/Net/IResolvable.cs | 1 - .../Rest/ModifyApplicationCommandParams.cs | 3 - src/Discord.Net.Rest/Discord.Net.Rest.xml | 121 +--- src/Discord.Net.Rest/DiscordRestClient.cs | 28 +- .../Interactions/InteractionHelper.cs | 568 ++++-------------- .../Interactions/RestApplicationCommand.cs | 39 +- .../RestApplicationCommandOption.cs | 7 +- .../RestApplicationCommandType.cs | 28 - .../Interactions/RestGlobalCommand.cs | 11 +- .../Interactions/RestGlobalMessageCommand.cs | 41 -- .../Interactions/RestGlobalUserCommand.cs | 41 -- .../Entities/Interactions/RestGuildCommand.cs | 10 +- .../Interactions/RestGuildMessageCommand.cs | 61 -- .../Interactions/RestGuildUserCommand.cs | 61 -- .../ApplicationCommandCreatedUpdatedEvent.cs | 22 +- .../Discord.Net.WebSocket.xml | 25 +- .../DiscordSocketClient.cs | 33 +- .../SocketApplicationCommand.cs | 70 ++- 31 files changed, 429 insertions(+), 1126 deletions(-) rename src/Discord.Net.Core/Entities/Interactions/{ => Context Menus}/MessageCommandBuilder.cs (81%) create mode 100644 src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs rename src/Discord.Net.Core/Entities/Interactions/{ => Context Menus}/UserCommandBuilder.cs (81%) create mode 100644 src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs delete mode 100644 src/Discord.Net.Core/Entities/Interactions/ContextMenuCommandCreationProperties.cs rename src/Discord.Net.Core/Entities/Interactions/{SlashCommandCreationProperties.cs => SlashCommandProperties.cs} (66%) delete mode 100644 src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs delete mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs delete mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs delete mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs delete mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs delete mode 100644 src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 8be13e6bd6..187461b93a 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4461,7 +4461,7 @@ - Provides properties that are used to modify a with the specified changes. + Represents the base class to create/modify application commands. @@ -4469,64 +4469,101 @@ Gets or sets the name of this command. - + - Gets or sets the discription of this command. + ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message - + - Gets or sets the type for this command. + ApplicationCommandType.Slash is Slash command type - + - Gets or sets the options for this command. + ApplicationCommandType.User is Context Menu User command type - + - Whether the command is enabled by default when the app is added to a guild. Default is + ApplicationCommandType.Message is Context Menu Message command type - + - ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message + A class used to build Message commands. - + + + Returns the maximun length a commands name allowed by Discord + + + - ApplicationCommandType.Slash is Slash command type + The name of this Message command. - + - ApplicationCommandType.User is Context Menu User command type + Build the current builder into a class. + + A that can be used to create message commands. + - + - ApplicationCommandType.Message is Context Menu Message command type + Sets the field name. + The value to set the field name to. + + The current builder. + - + - A class used to create Message commands. + A class used to create message commands. - + - The name of this command. + A class used to build user commands. + + + + + Returns the maximun length a commands name allowed by Discord + + + + + The name of this User command. + + + + + Build the current builder into a class. + A that can be used to create user commands. - + - Gets or sets the type for this command. + Sets the field name. + + The value to set the field name to. + + The current builder. + + + + + A class used to create User commands. - The base command model that belongs to an application. see + The base command model that belongs to an application. @@ -4559,6 +4596,16 @@ If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + Modifies the current application command. + + The new properties to use when modifying the command. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + Represents data of an Interaction Command, see . @@ -5571,36 +5618,6 @@ Will render this option as selected by default. - - - A class used to build Message commands. - - - - - Returns the maximun length a commands name allowed by Discord - - - - - The name of this Message command. - - - - - Build the current builder into a class. - - A that can be used to create message commands over rest. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - A class used to build slash commands. @@ -5643,9 +5660,9 @@ - Build the current builder into a class. + Build the current builder into a class. - A that can be used to create slash commands over rest. + A that can be used to create slash commands over rest. @@ -5833,86 +5850,26 @@ The type to set. The current builder. - + A class used to create slash commands. - - - The name of this command. - - - + The discription of this command. - - - Gets or sets the type for this command. - - - + Gets or sets the options for this command. - + Whether the command is enabled by default when the app is added to a guild. Default is - - - A class used to build user commands. - - - - - Returns the maximun length a commands name allowed by Discord - - - - - The name of this User command. - - - - - Build the current builder into a class. - - A that can be used to create user commands over rest. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - A class used to create User commands. - - - - - The name of this command. - - - - - The discription of this command. - - - - - Gets or sets the type for this command. - - Represents a generic invite object. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 70b430bfc2..2ccb0148b4 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -7,33 +7,17 @@ namespace Discord { /// - /// Provides properties that are used to modify a with the specified changes. + /// Represents the base class to create/modify application commands. /// - public class ApplicationCommandProperties + public abstract class ApplicationCommandProperties { + internal abstract ApplicationCommandType Type { get; } + /// /// Gets or sets the name of this command. /// public Optional Name { get; set; } - /// - /// Gets or sets the discription of this command. - /// - public Optional Description { get; set; } - - /// - /// Gets or sets the type for this command. - /// - public Optional Type { get; set; } - - /// - /// Gets or sets the options for this command. - /// - public Optional> Options { get; set; } - - /// - /// Whether the command is enabled by default when the app is added to a guild. Default is - /// - public Optional DefaultPermission { get; set; } + internal ApplicationCommandProperties() { } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs index de9c1a2635..3cfa97a5a1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs @@ -7,20 +7,22 @@ namespace Discord { /// - /// ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message + /// ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message /// public enum ApplicationCommandType : byte { /// - /// ApplicationCommandType.Slash is Slash command type + /// ApplicationCommandType.Slash is Slash command type /// Slash = 1, + /// - /// ApplicationCommandType.User is Context Menu User command type + /// ApplicationCommandType.User is Context Menu User command type /// User = 2, + /// - /// ApplicationCommandType.Message is Context Menu Message command type + /// ApplicationCommandType.Message is Context Menu Message command type /// Message = 3 } diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs similarity index 81% rename from src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs rename to src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index b658a181b9..9907dd2cf1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -44,15 +44,16 @@ public string Name private string _name { get; set; } /// - /// Build the current builder into a class. + /// Build the current builder into a class. /// - /// A that can be used to create message commands over rest. - public ContextMenuCommandCreationProperties Build() + /// + /// A that can be used to create message commands. + /// + public MessageCommandProperties Build() { - ContextMenuCommandCreationProperties props = new ContextMenuCommandCreationProperties() + MessageCommandProperties props = new MessageCommandProperties() { Name = this.Name, - Type=ApplicationCommandType.Message }; return props; diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs new file mode 100644 index 0000000000..3af9b47f36 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to create message commands. + /// + public class MessageCommandProperties : ApplicationCommandProperties + { + internal override ApplicationCommandType Type => ApplicationCommandType.Message; + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs similarity index 81% rename from src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs rename to src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index f10b6b1234..d415a99a6b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -44,15 +44,14 @@ public string Name private string _name { get; set; } /// - /// Build the current builder into a class. + /// Build the current builder into a class. /// - /// A that can be used to create user commands over rest. - public ContextMenuCommandCreationProperties Build() + /// A that can be used to create user commands. + public UserCommandProperties Build() { - ContextMenuCommandCreationProperties props = new ContextMenuCommandCreationProperties() + UserCommandProperties props = new UserCommandProperties() { Name = this.Name, - Type=ApplicationCommandType.User }; return props; diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs new file mode 100644 index 0000000000..091166a175 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// A class used to create User commands. + /// + public class UserCommandProperties : ApplicationCommandProperties + { + internal override ApplicationCommandType Type => ApplicationCommandType.User; + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/ContextMenuCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ContextMenuCommandCreationProperties.cs deleted file mode 100644 index 4ddc0a7b1c..0000000000 --- a/src/Discord.Net.Core/Entities/Interactions/ContextMenuCommandCreationProperties.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord -{ - /// - /// A class used to create Message commands. - /// - public class ContextMenuCommandCreationProperties - { - /// - /// The name of this command. - /// - public string Name { get; set; } - - /// - /// Gets or sets the type for this command. - /// - public ApplicationCommandType Type { get; set; } - } -} diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index e15843d988..e0cf605d2d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -7,7 +7,7 @@ namespace Discord { /// - /// The base command model that belongs to an application. see + /// The base command model that belongs to an application. /// public interface IApplicationCommand : ISnowflakeEntity, IDeletable { @@ -40,5 +40,15 @@ public interface IApplicationCommand : ISnowflakeEntity, IDeletable /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// IReadOnlyCollection Options { get; } + + /// + /// Modifies the current application command. + /// + /// The new properties to use when modifying the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + Task ModifyAsync(Action func, RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index 933f511e19..8a1bd83144 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -93,17 +93,16 @@ public List Options private List _options { get; set; } /// - /// Build the current builder into a class. + /// Build the current builder into a class. /// - /// A that can be used to create slash commands over rest. - public SlashCommandCreationProperties Build() + /// A that can be used to create slash commands over rest. + public SlashCommandProperties Build() { - SlashCommandCreationProperties props = new SlashCommandCreationProperties() + SlashCommandProperties props = new SlashCommandProperties() { Name = this.Name, Description = this.Description, DefaultPermission = this.DefaultPermission, - Type = ApplicationCommandType.Slash }; if (this.Options != null && this.Options.Any()) diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs similarity index 66% rename from src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs rename to src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs index 3021d7a2c2..72c7c322bf 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandCreationProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs @@ -9,22 +9,13 @@ namespace Discord /// /// A class used to create slash commands. /// - public class SlashCommandCreationProperties + public class SlashCommandProperties : ApplicationCommandProperties { - /// - /// The name of this command. - /// - public string Name { get; set; } - + internal override ApplicationCommandType Type => ApplicationCommandType.Slash; /// /// The discription of this command. /// - public string Description { get; set; } - - /// - /// Gets or sets the type for this command. - /// - public ApplicationCommandType Type { get; set; } + public Optional Description { get; set; } /// /// Gets or sets the options for this command. @@ -35,5 +26,7 @@ public class SlashCommandCreationProperties /// Whether the command is enabled by default when the app is added to a guild. Default is /// public Optional DefaultPermission { get; set; } + + internal SlashCommandProperties() { } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs b/src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs deleted file mode 100644 index 323b2ce1da..0000000000 --- a/src/Discord.Net.Core/Entities/Interactions/UserCommandCreationProperties.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord -{ - /// - /// A class used to create User commands. - /// - public class UserCommandCreationProperties - { - /// - /// The name of this command. - /// - public string Name { get; set; } - - /// - /// The discription of this command. - /// - public string Description { get; set; } - - - /// - /// Gets or sets the type for this command. - /// - public ApplicationCommandType Type { get; set; } - } -} diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs index 39c40a1ee3..9de2727066 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs @@ -11,14 +11,22 @@ internal class ApplicationCommand { [JsonProperty("id")] public ulong Id { get; set; } + + [JsonProperty("type")] + public ApplicationCommandType Type { get; set; } = ApplicationCommandType.Slash; // defaults to 1 which is slash. + [JsonProperty("application_id")] public ulong ApplicationId { get; set; } + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("description")] public string Description { get; set; } + [JsonProperty("options")] public Optional Options { get; set; } + [JsonProperty("default_permission")] public Optional DefaultPermissions { get; set; } } diff --git a/src/Discord.Net.Rest/API/Net/IResolvable.cs b/src/Discord.Net.Rest/API/Net/IResolvable.cs index fe31cd75ef..7485f5de8f 100644 --- a/src/Discord.Net.Rest/API/Net/IResolvable.cs +++ b/src/Discord.Net.Rest/API/Net/IResolvable.cs @@ -9,6 +9,5 @@ namespace Discord.API internal interface IResolvable { Optional Resolved { get; } - } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs index 29a6ff7968..2ed9466c07 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs @@ -15,9 +15,6 @@ internal class ModifyApplicationCommandParams [JsonProperty("description")] public Optional Description { get; set; } - [JsonProperty("type")] - public Optional Type { get; set; } - [JsonProperty("options")] public Optional Options { get; set; } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 0fc188b2e9..0378df092f 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3762,17 +3762,15 @@ The options of this command. - - - The type of this rest application command. - - + + + Represents a Rest-based implementation of . @@ -3814,24 +3812,9 @@ A collection of 's for this command. - - - Represents a type of Rest-based command. - - - - - Specifies that this command is a Global command. - - - - - Specifies that this command is a Guild specific command. - - - Represents a global Slash command. + Represents a Rest-based global application command. @@ -3847,35 +3830,9 @@ The modified command. - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command. - - - Represents a Rest-based guild command. + Represents a Rest-based guild application command. @@ -3928,74 +3885,6 @@ . - - - Represents a Rest-based guild command. - - - - - The guild Id where this command originates. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command - - - - - Gets the guild that this slash command resides in. - - if you want the approximate member and presence counts for the guild, otherwise . - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - . - - - - - Represents a Rest-based guild command. - - - - - The guild Id where this command originates. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command - - - - - Gets the guild that this slash command resides in. - - if you want the approximate member and presence counts for the guild, otherwise . - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - . - - diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index c204a2d1c6..32dbaf40e0 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -108,37 +108,21 @@ public Task GetVoiceRegionAsync(string id, RequestOptions optio public Task GetWebhookAsync(ulong id, RequestOptions options = null) => ClientHelper.GetWebhookAsync(this, id, options); - public Task CreateGlobalCommand(SlashCommandCreationProperties properties, RequestOptions options = null) + public Task CreateGlobalCommand(ApplicationCommandProperties properties, RequestOptions options = null) => InteractionHelper.CreateGlobalCommand(this, properties, options); - public Task CreateGlobalCommand(Action func, RequestOptions options = null) + public Task CreateGlobalCommand(Action func, RequestOptions options = null) => InteractionHelper.CreateGlobalCommand(this, func, options); - public Task CreateGlobalUserCommand(ContextMenuCommandCreationProperties properties, RequestOptions options = null) - => InteractionHelper.CreateGlobalUserCommand(this, properties, options); - public Task CreateGlobalUserCommand(Action func, RequestOptions options = null) - => InteractionHelper.CreateGlobalUserCommand(this, func, options); - public Task CreateGlobalMessageCommand(ContextMenuCommandCreationProperties properties, RequestOptions options = null) - => InteractionHelper.CreateGlobalMessageCommand(this, properties, options); - public Task CreateGlobalMessageCommand(Action func, RequestOptions options = null) - => InteractionHelper.CreateGlobalMessageCommand(this, func, options); - public Task CreateGuildCommand(SlashCommandCreationProperties properties, ulong guildId, RequestOptions options = null) + public Task CreateGuildCommand(ApplicationCommandProperties properties, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildCommand(this, guildId, properties, options); - public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) + public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) => InteractionHelper.CreateGuildCommand(this, guildId, func, options); - public Task CreateGuildUserCommand(ContextMenuCommandCreationProperties properties, ulong guildId, RequestOptions options = null) - => InteractionHelper.CreateGuildUserCommand(this, guildId, properties, options); - public Task CreateGuildUserCommand(Action func, ulong guildId, RequestOptions options = null) - => InteractionHelper.CreateGuildUserCommand(this, guildId, func, options); - public Task CreateGuildMessageCommand(ContextMenuCommandCreationProperties properties, ulong guildId, RequestOptions options = null) - => InteractionHelper.CreateGuildMessageCommand(this, guildId, properties, options); - public Task CreateGuildMessageCommand(Action func, ulong guildId, RequestOptions options = null) - => InteractionHelper.CreateGuildMessageCommand(this, guildId, func, options); public Task> GetGlobalApplicationCommands(RequestOptions options = null) => ClientHelper.GetGlobalApplicationCommands(this, options); public Task> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) => ClientHelper.GetGuildApplicationCommands(this, guildId, options); - public Task> BulkOverwriteGlobalCommands(SlashCommandCreationProperties[] commandProperties, RequestOptions options = null) + public Task> BulkOverwriteGlobalCommands(ApplicationCommandProperties[] commandProperties, RequestOptions options = null) => InteractionHelper.BulkOverwriteGlobalCommands(this, commandProperties, options); - public Task> BulkOverwriteGuildCommands(SlashCommandCreationProperties[] commandProperties, ulong guildId, RequestOptions options = null) + public Task> BulkOverwriteGuildCommands(ApplicationCommandProperties[] commandProperties, ulong guildId, RequestOptions options = null) => InteractionHelper.BulkOverwriteGuildCommands(this, guildId, commandProperties, options); public Task> BatchEditGuildCommandPermissions(ulong guildId, IDictionary permissions, RequestOptions options = null) => InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options); diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index b5c3540476..fbbce4f4b9 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -44,41 +44,45 @@ public static async Task SendFollowupAsync(BaseDiscordClien } // Global commands - public static async Task CreateGlobalCommand(BaseDiscordClient client, - Action func, RequestOptions options = null) + public static async Task CreateGlobalCommand(BaseDiscordClient client, + Action func, RequestOptions options) where TArg : ApplicationCommandProperties { - var args = new SlashCommandCreationProperties(); - func(args); - return await CreateGlobalCommand(client, args, options).ConfigureAwait(false); + var args = Activator.CreateInstance(typeof(TArg)); + func((TArg)args); + return await CreateGlobalCommand(client, (TArg)args, options); } public static async Task CreateGlobalCommand(BaseDiscordClient client, - SlashCommandCreationProperties arg, RequestOptions options = null) + ApplicationCommandProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); - - if (arg.Options.IsSpecified) - Preconditions.AtMost(arg.Options.Value.Count, 25, nameof(arg.Options)); var model = new CreateApplicationCommandParams() { - Name = arg.Name, - Description = arg.Description, - Type= arg.Type, - Options = arg.Options.IsSpecified - ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value - : Optional.Unspecified + Name = arg.Name.Value, + Type = arg.Type, }; + if (arg is SlashCommandProperties slashProps) + { + Preconditions.NotNullOrEmpty(slashProps.Description, nameof(slashProps.Description)); + + model.Description = slashProps.Description.Value; + + model.Options = slashProps.Options.IsSpecified + ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; + + model.DefaultPermission = slashProps.DefaultPermission.IsSpecified + ? slashProps.DefaultPermission.Value + : Optional.Unspecified; + } + var cmd = await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); return RestGlobalCommand.Create(client, cmd); } public static async Task> BulkOverwriteGlobalCommands(BaseDiscordClient client, - SlashCommandCreationProperties[] args, RequestOptions options = null) + ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -87,24 +91,28 @@ public static async Task> BulkOverwriteGl foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); - - if (arg.Options.IsSpecified) - Preconditions.AtMost(arg.Options.Value.Count, 25, nameof(arg.Options)); var model = new CreateApplicationCommandParams() { - Name = arg.Name, - Description = arg.Description, + Name = arg.Name.Value, Type = arg.Type, - Options = arg.Options.IsSpecified - ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value - : Optional.Unspecified }; + if (arg is SlashCommandProperties slashProps) + { + Preconditions.NotNullOrEmpty(slashProps.Description, nameof(slashProps.Description)); + + model.Description = slashProps.Description.Value; + + model.Options = slashProps.Options.IsSpecified + ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; + + model.DefaultPermission = slashProps.DefaultPermission.IsSpecified + ? slashProps.DefaultPermission.Value + : Optional.Unspecified; + } + models.Add(model); } @@ -114,7 +122,7 @@ public static async Task> BulkOverwriteGl } public static async Task> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, - SlashCommandCreationProperties[] args, RequestOptions options = null) + ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -123,236 +131,88 @@ public static async Task> BulkOverwriteGui foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); - - if (arg.Options.IsSpecified) - Preconditions.AtMost(arg.Options.Value.Count, 25, nameof(arg.Options)); var model = new CreateApplicationCommandParams() { - Name = arg.Name, - Description = arg.Description, + Name = arg.Name.Value, Type = arg.Type, - Options = arg.Options.IsSpecified - ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value - : Optional.Unspecified }; - models.Add(model); - } - - var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options); - - return apiModels.Select(x => RestGuildCommand.Create(client, x, guildId)).ToArray(); - } + if (arg is SlashCommandProperties slashProps) + { + Preconditions.NotNullOrEmpty(slashProps.Description, nameof(slashProps.Description)); - public static async Task ModifyGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, - Action func, RequestOptions options = null) - { - ApplicationCommandProperties args = new ApplicationCommandProperties(); - func(args); + model.Description = slashProps.Description.Value; - if (args.Name.IsSpecified) - { - Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); - } - if (args.Description.IsSpecified) - { - Preconditions.AtMost(args.Description.Value.Length, 100, nameof(args.Description)); - Preconditions.AtLeast(args.Description.Value.Length, 1, nameof(args.Description)); - } + model.Options = slashProps.Options.IsSpecified + ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; + model.DefaultPermission = slashProps.DefaultPermission.IsSpecified + ? slashProps.DefaultPermission.Value + : Optional.Unspecified; + } - if (args.Options.IsSpecified) - { - if (args.Options.Value.Count > 10) - throw new ArgumentException("Option count must be 10 or less"); + models.Add(model); } - var model = new Discord.API.Rest.ModifyApplicationCommandParams() - { - Name = args.Name, - Description = args.Description, - Type = args.Type, - Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified, - DefaultPermission = args.DefaultPermission.IsSpecified - ? args.DefaultPermission.Value - : Optional.Unspecified - }; - - var msg = await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); - command.Update(msg); - return command; - } - - - public static async Task DeleteGlobalCommand(BaseDiscordClient client, RestGlobalCommand command, RequestOptions options = null) - { - Preconditions.NotNull(command, nameof(command)); - Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); - - await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); - } - - public static async Task CreateGlobalUserCommand(BaseDiscordClient client, Action func, RequestOptions options = null) - { - var args = new ContextMenuCommandCreationProperties(); - func(args); - return await CreateGlobalUserCommand(client, args, options).ConfigureAwait(false); - } - - public static async Task CreateGlobalUserCommand(BaseDiscordClient client, ContextMenuCommandCreationProperties arg, RequestOptions options = null) - { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - - var model = new CreateApplicationCommandParams() - { - Name = arg.Name, - Type = arg.Type - }; - - var cmd = await client.ApiClient.CreateGlobalApplicationUserCommandAsync(model, options).ConfigureAwait(false); - return RestGlobalUserCommand.Create(client, cmd); - } + var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options); - public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, Action func, RequestOptions options = null) - { - var args = new ContextMenuCommandCreationProperties(); - func(args); - return await CreateGlobalMessageCommand(client, args, options).ConfigureAwait(false); + return apiModels.Select(x => RestGuildCommand.Create(client, x, guildId)).ToArray(); } - public static async Task CreateGlobalMessageCommand(BaseDiscordClient client, ContextMenuCommandCreationProperties arg, RequestOptions options = null) + public static Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, + Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - - var model = new CreateApplicationCommandParams() - { - Name = arg.Name, - Type = arg.Type - }; - - var cmd = await client.ApiClient.CreateGlobalApplicationMessageCommandAsync(model, options).ConfigureAwait(false); - return RestGlobalMessageCommand.Create(client, cmd); + var arg = (TArg)Activator.CreateInstance(typeof(TArg)); + func(arg); + return ModifyGlobalCommand(client, command, arg, options); } - public static async Task> BulkOverwriteGlobalUserCommands(BaseDiscordClient client, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) + public static async Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, + ApplicationCommandProperties args, RequestOptions options = null) { - Preconditions.NotNull(args, nameof(args)); - - List models = new List(); - - foreach (var arg in args) - { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Type, ApplicationCommandType.User); - - var model = new CreateApplicationCommandParams() - { - Name = arg.Name, - Type = arg.Type - }; - - models.Add(model); - } - - var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationUserCommands(models.ToArray(), options); - - return apiModels.Select(x => RestGlobalUserCommand.Create(client, x)).ToArray(); - } - public static async Task ModifyGlobalUserCommand(BaseDiscordClient client, RestGlobalUserCommand command, - Action func, RequestOptions options = null) - { - ApplicationCommandProperties args = new ApplicationCommandProperties(); - func(args); - if (args.Name.IsSpecified) { Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); } - if (args.Description.IsSpecified) - { - Preconditions.Equals(args.Description.Value, ""); - } var model = new Discord.API.Rest.ModifyApplicationCommandParams() { Name = args.Name, - Description = args.Description }; - var msg = await client.ApiClient.ModifyGlobalApplicationUserCommandAsync(model, command.Id, options).ConfigureAwait(false); - command.Update(msg); - return command; - } - - public static async Task DeleteGlobalUserCommand(BaseDiscordClient client, RestGlobalUserCommand command, RequestOptions options = null) - { - Preconditions.NotNull(command, nameof(command)); - Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); - - await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); - } - - public static async Task> BulkOverwriteGlobalMessageCommands(BaseDiscordClient client, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) - { - Preconditions.NotNull(args, nameof(args)); - - List models = new List(); - - foreach (var arg in args) + if(args is SlashCommandProperties slashProps) { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Type, ApplicationCommandType.Message); - - var model = new CreateApplicationCommandParams() + if (slashProps.Description.IsSpecified) { - Name = arg.Name, - Type = arg.Type - }; + Preconditions.AtMost(slashProps.Description.Value.Length, 100, nameof(slashProps.Description)); + Preconditions.AtLeast(slashProps.Description.Value.Length, 1, nameof(slashProps.Description)); + } - models.Add(model); - } + if (slashProps.Options.IsSpecified) + { + if (slashProps.Options.Value.Count > 10) + throw new ArgumentException("Option count must be 10 or less"); + } - var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationMessageCommands(models.ToArray(), options); + model.Description = slashProps.Description; - return apiModels.Select(x => RestGlobalMessageCommand.Create(client, x)).ToArray(); - } - public static async Task ModifyGlobalMessageCommand(BaseDiscordClient client, RestGlobalMessageCommand command, - Action func, RequestOptions options = null) - { - ApplicationCommandProperties args = new ApplicationCommandProperties(); - func(args); + model.Options = slashProps.Options.IsSpecified + ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; - if (args.Name.IsSpecified) - { - Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); - } - if (args.Description.IsSpecified) - { - Preconditions.Equals(args.Description.Value, ""); + model.DefaultPermission = slashProps.DefaultPermission.IsSpecified + ? slashProps.DefaultPermission.Value + : Optional.Unspecified; } - var model = new Discord.API.Rest.ModifyApplicationCommandParams() - { - Name = args.Name, - Description = args.Description - }; - - var msg = await client.ApiClient.ModifyGlobalApplicationMessageCommandAsync(model, command.Id, options).ConfigureAwait(false); - command.Update(msg); - return command; + return await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); } - public static async Task DeleteGlobalMessageCommand(BaseDiscordClient client, RestGlobalMessageCommand command, RequestOptions options = null) + + public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); @@ -361,197 +221,77 @@ public static async Task DeleteGlobalMessageCommand(BaseDiscordClient client, Re } // Guild Commands - public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, - Action func, RequestOptions options = null) + public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + Action func, RequestOptions options) where TArg : ApplicationCommandProperties { - var args = new SlashCommandCreationProperties(); - func(args); - - return await CreateGuildCommand(client, guildId, args, options).ConfigureAwait(false); + var args = Activator.CreateInstance(typeof(TArg)); + func((TArg)args); + return await CreateGuildCommand(client, guildId, (TArg)args, options); } + public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, - SlashCommandCreationProperties args, RequestOptions options = null) + ApplicationCommandProperties arg, RequestOptions options = null) { - Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); - Preconditions.NotNullOrEmpty(args.Description, nameof(args.Description)); - - Preconditions.AtMost(args.Name.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Length, 3, nameof(args.Name)); - Preconditions.AtMost(args.Description.Length, 100, nameof(args.Description)); - Preconditions.AtLeast(args.Description.Length, 1, nameof(args.Description)); - - if (args.Options.IsSpecified) - { - if (args.Options.Value.Count > 10) - throw new ArgumentException("Option count must be 10 or less"); - - foreach (var item in args.Options.Value) - { - Preconditions.NotNullOrEmpty(item.Name, nameof(item.Name)); - Preconditions.NotNullOrEmpty(item.Description, nameof(item.Description)); - } - } - var model = new CreateApplicationCommandParams() { - Name = args.Name, - Description = args.Description, - Type = args.Type, - Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified, - DefaultPermission = args.DefaultPermission.IsSpecified - ? args.DefaultPermission.Value - : Optional.Unspecified + Name = arg.Name.Value, + Type = arg.Type, }; - var cmd = await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); - return RestGuildCommand.Create(client, cmd, guildId); - } - public static async Task ModifyGuildCommand(BaseDiscordClient client, RestGuildCommand command, - Action func, RequestOptions options = null) - { - ApplicationCommandProperties args = new ApplicationCommandProperties(); - func(args); - - if (args.Name.IsSpecified) - { - Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); - } - if (args.Description.IsSpecified) + if (arg is SlashCommandProperties slashProps) { - Preconditions.AtMost(args.Description.Value.Length, 100, nameof(args.Description)); - Preconditions.AtLeast(args.Description.Value.Length, 1, nameof(args.Description)); - } + Preconditions.NotNullOrEmpty(slashProps.Description, nameof(slashProps.Description)); - if (args.Options.IsSpecified) - { - if (args.Options.Value.Count > 10) - throw new ArgumentException("Option count must be 10 or less"); - } + model.Description = slashProps.Description.Value; - var model = new Discord.API.Rest.ModifyApplicationCommandParams() - { - Name = args.Name, - Description = args.Description, - Type = args.Type, - Options = args.Options.IsSpecified - ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified, - DefaultPermission = args.DefaultPermission.IsSpecified - ? args.DefaultPermission.Value - : Optional.Unspecified - }; - - var msg = await client.ApiClient.ModifyGuildApplicationCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); - command.Update(msg); - return command; - } - - public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) - { - Preconditions.NotNull(command, nameof(command)); - Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); - - await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); - } - - public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) - { - var args = new ContextMenuCommandCreationProperties(); - func(args); - return await CreateGuildUserCommand(client, guildId, args, options).ConfigureAwait(false); - } + model.Options = slashProps.Options.IsSpecified + ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; - public static async Task CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties arg, RequestOptions options = null) - { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - - var model = new CreateApplicationCommandParams() - { - Name = arg.Name, - Type = arg.Type - }; + model.DefaultPermission = slashProps.DefaultPermission.IsSpecified + ? slashProps.DefaultPermission.Value + : Optional.Unspecified; + } - var cmd = await client.ApiClient.CreateGuildApplicationUserCommandAsync(model, guildId, options).ConfigureAwait(false); - return RestGuildUserCommand.Create(client, cmd, guildId); + var cmd = await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); + return RestGuildCommand.Create(client, cmd, guildId); } - public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options = null) + public static Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, + Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { - var args = new ContextMenuCommandCreationProperties(); - func(args); - return await CreateGuildMessageCommand(client, guildId, args, options).ConfigureAwait(false); + var arg = (TArg)Activator.CreateInstance(typeof(TArg)); + func(arg); + return ModifyGuildCommand(client, command, guildId, arg, options); } - public static async Task CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties arg, RequestOptions options = null) + public static async Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, + ApplicationCommandProperties arg, RequestOptions options = null) { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - - var model = new CreateApplicationCommandParams() + var model = new ModifyApplicationCommandParams() { - Name = arg.Name, - Type = arg.Type + Name = arg.Name.Value, }; - var cmd = await client.ApiClient.CreateGuildApplicationMessageCommandAsync(model, guildId, options).ConfigureAwait(false); - return RestGuildMessageCommand.Create(client, cmd, guildId); - } - - public static async Task> BulkOverwriteGuildUserCommands(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) - { - Preconditions.NotNull(args, nameof(args)); - - List models = new List(); - - foreach (var arg in args) + if (arg is SlashCommandProperties slashProps) { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Type, ApplicationCommandType.User); + Preconditions.NotNullOrEmpty(slashProps.Description, nameof(slashProps.Description)); - var model = new CreateApplicationCommandParams() - { - Name = arg.Name, - Type = arg.Type - }; + model.Description = slashProps.Description.Value; - models.Add(model); - } - - var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationUserCommands(guildId, models.ToArray(), options); - - return apiModels.Select(x => RestGuildUserCommand.Create(client, x, guildId)).ToArray(); - } - public static async Task ModifyGuildUserCommand(BaseDiscordClient client, RestGuildUserCommand command, - Action func, RequestOptions options = null) - { - ApplicationCommandProperties args = new ApplicationCommandProperties(); - func(args); + model.Options = slashProps.Options.IsSpecified + ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; - if (args.Name.IsSpecified) - { - Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); - } - if (args.Description.IsSpecified) - { - Preconditions.Equals(args.Description.Value, ""); + model.DefaultPermission = slashProps.DefaultPermission.IsSpecified + ? slashProps.DefaultPermission.Value + : Optional.Unspecified; } - var model = new Discord.API.Rest.ModifyApplicationCommandParams() - { - Name = args.Name, - Description = args.Description, - Type=args.Type - }; - - var msg = await client.ApiClient.ModifyGuildApplicationUserCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); - command.Update(msg); - return command; + return await client.ApiClient.ModifyGuildApplicationCommandAsync(model, guildId, command.Id, options).ConfigureAwait(false); } - public static async Task DeleteGuildUserCommand(BaseDiscordClient client, ulong guildId, RestGuildUserCommand command, RequestOptions options = null) + public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); @@ -559,67 +299,19 @@ public static async Task DeleteGuildUserCommand(BaseDiscordClient client, ulong await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); } - public static async Task> BulkOverwriteGuildMessageCommands(BaseDiscordClient client, ulong guildId, ContextMenuCommandCreationProperties[] args, RequestOptions options = null) + public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null) { - Preconditions.NotNull(args, nameof(args)); - - List models = new List(); - - foreach (var arg in args) + if (guildId.HasValue) { - Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - Preconditions.Equals(arg.Type, ApplicationCommandType.Message); - - var model = new CreateApplicationCommandParams() - { - Name = arg.Name, - Type = arg.Type - }; - - models.Add(model); - } - - var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationMessageCommands(guildId, models.ToArray(), options); - - return apiModels.Select(x => RestGuildMessageCommand.Create(client, x, guildId)).ToArray(); - } - public static async Task ModifyGuildMessageCommand(BaseDiscordClient client, RestGuildMessageCommand command, - Action func, RequestOptions options = null) - { - ApplicationCommandProperties args = new ApplicationCommandProperties(); - func(args); - - if (args.Name.IsSpecified) - { - Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + return DeleteGuildCommand(client, guildId.Value, command, options); } - if (args.Description.IsSpecified) + else { - Preconditions.Equals(args.Description.Value, ""); + return DeleteGlobalCommand(client, command, options); } - - var model = new Discord.API.Rest.ModifyApplicationCommandParams() - { - Name = args.Name, - Description = args.Description, - Type = args.Type - }; - - var msg = await client.ApiClient.ModifyGuildApplicationMessageCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); - command.Update(msg); - return command; } - public static async Task DeleteGuildMessageCommand(BaseDiscordClient client, ulong guildId, RestGuildMessageCommand command, RequestOptions options = null) - { - Preconditions.NotNull(command, nameof(command)); - Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); - - await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); - } - - + // Responses public static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 2744c79679..dcba1ee87f 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -33,11 +33,6 @@ public abstract class RestApplicationCommand : RestEntity, IApplicationCo /// public IReadOnlyCollection Options { get; private set; } - /// - /// The type of this rest application command. - /// - public RestApplicationCommandType CommandType { get; internal set; } - /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(this.Id); @@ -48,31 +43,15 @@ internal RestApplicationCommand(BaseDiscordClient client, ulong id) } - internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, RestApplicationCommandType type, ulong guildId = 0) + internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, ulong? guildId) { - switch (type) + if (guildId.HasValue) + { + return RestGuildCommand.Create(client, model, guildId.Value); + } + else { - case RestApplicationCommandType.GlobalCommand: - return RestGlobalCommand.Create(client, model); - break; - case RestApplicationCommandType.GlobalUserCommand: - return RestGlobalUserCommand.Create(client, model); - break; - case RestApplicationCommandType.GlobalMessageCommand: - return RestGlobalMessageCommand.Create(client, model); - break; - case RestApplicationCommandType.GuildCommand: - return RestGuildCommand.Create(client, model, guildId); - break; - case RestApplicationCommandType.GuildUserCommand: - return RestGuildUserCommand.Create(client, model, guildId); - break; - case RestApplicationCommandType.GuildMessageCommand: - return RestGuildMessageCommand.Create(client, model, guildId); - break; - default: - return null; - break; + return RestGlobalCommand.Create(client, model); } } @@ -92,7 +71,9 @@ internal virtual void Update(Model model) /// public abstract Task DeleteAsync(RequestOptions options = null); - IReadOnlyCollection IApplicationCommand.Options => Options; + /// + public abstract Task ModifyAsync(Action func, RequestOptions options = null); + IReadOnlyCollection IApplicationCommand.Options => Options; } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index a8e37873e0..b135ae578d 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -68,7 +68,10 @@ internal void Update(Model model) : null; } - IReadOnlyCollection IApplicationCommandOption.Options => Options; - IReadOnlyCollection IApplicationCommandOption.Choices => Choices; + //IApplicationCommandOption + IReadOnlyCollection IApplicationCommandOption.Options + => Options; + IReadOnlyCollection IApplicationCommandOption.Choices + => Choices; } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs deleted file mode 100644 index cf2fb11109..0000000000 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandType.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.Rest -{ - /// - /// Represents a type of Rest-based command. - /// - public enum RestApplicationCommandType - { - /// - /// Specifies that this command is a Global command. - /// - GlobalCommand, - GlobalUserCommand, - GlobalMessageCommand, - - /// - /// Specifies that this command is a Guild specific command. - /// - GuildCommand, - GuildUserCommand, - GuildMessageCommand - } -} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs index 230243c7a3..7e3ca0a4e2 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -8,14 +8,14 @@ namespace Discord.Rest { /// - /// Represents a global Slash command. + /// Represents a Rest-based global application command. /// public class RestGlobalCommand : RestApplicationCommand { internal RestGlobalCommand(BaseDiscordClient client, ulong id) : base(client, id) { - this.CommandType = RestApplicationCommandType.GlobalCommand; + } internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) @@ -37,7 +37,10 @@ public override async Task DeleteAsync(RequestOptions options = null) /// /// The modified command. /// - public async Task ModifyAsync(Action func, RequestOptions options = null) - => await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + public override async Task ModifyAsync(Action func, RequestOptions options = null) + { + var cmd = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + this.Update(cmd); + } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs deleted file mode 100644 index 2c0ed222cd..0000000000 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalMessageCommand.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using Model = Discord.API.ApplicationCommand; - -namespace Discord.Rest -{ - public class RestGlobalMessageCommand : RestApplicationCommand - { - internal RestGlobalMessageCommand(BaseDiscordClient client, ulong id) - : base(client, id) - { - this.CommandType = RestApplicationCommandType.GlobalMessageCommand; -} - - internal static RestGlobalMessageCommand Create(BaseDiscordClient client, Model model) - { - var entity = new RestGlobalMessageCommand(client, model.Id); - entity.Update(model); - return entity; - } - - /// - public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGlobalMessageCommand(Discord, this).ConfigureAwait(false); - - /// - /// Modifies this . - /// - /// The delegate containing the properties to modify the command with. - /// The options to be used when sending the request. - /// - /// The modified command. - /// - public async Task ModifyAsync(Action func, RequestOptions options = null) - => await InteractionHelper.ModifyGlobalMessageCommand(Discord, this, func, options).ConfigureAwait(false); - } -} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs deleted file mode 100644 index 9816863796..0000000000 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalUserCommand.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using Model = Discord.API.ApplicationCommand; - -namespace Discord.Rest -{ - public class RestGlobalUserCommand : RestApplicationCommand - { - internal RestGlobalUserCommand(BaseDiscordClient client, ulong id) - : base(client, id) - { - this.CommandType = RestApplicationCommandType.GlobalUserCommand; - } - - internal static RestGlobalUserCommand Create(BaseDiscordClient client, Model model) - { - var entity = new RestGlobalUserCommand(client, model.Id); - entity.Update(model); - return entity; - } - - /// - public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGlobalUserCommand(Discord, this).ConfigureAwait(false); - - /// - /// Modifies this . - /// - /// The delegate containing the properties to modify the command with. - /// The options to be used when sending the request. - /// - /// The modified command. - /// - public async Task ModifyAsync(Action func, RequestOptions options = null) - => await InteractionHelper.ModifyGlobalUserCommand(Discord, this, func, options).ConfigureAwait(false); - } -} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index 33ab78dbbd..aa236d4b1f 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -8,7 +8,7 @@ namespace Discord.Rest { /// - /// Represents a Rest-based guild command. + /// Represents a Rest-based guild application command. /// public class RestGuildCommand : RestApplicationCommand { @@ -20,7 +20,6 @@ public class RestGuildCommand : RestApplicationCommand internal RestGuildCommand(BaseDiscordClient client, ulong id, ulong guildId) : base(client, id) { - this.CommandType = RestApplicationCommandType.GuildCommand; this.GuildId = guildId; } @@ -43,8 +42,11 @@ public override async Task DeleteAsync(RequestOptions options = null) /// /// The modified command /// - public async Task ModifyAsync(Action func, RequestOptions options = null) - => await InteractionHelper.ModifyGuildCommand(Discord, this, func, options).ConfigureAwait(false); + public override async Task ModifyAsync(Action func, RequestOptions options = null) + { + var model = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId, func, options).ConfigureAwait(false); + this.Update(model); + } /// /// Gets this commands permissions inside of the current guild. diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs deleted file mode 100644 index e057b2fe31..0000000000 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildMessageCommand.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Model = Discord.API.ApplicationCommand; - -namespace Discord.Rest -{ - /// - /// Represents a Rest-based guild command. - /// - public class RestGuildMessageCommand : RestApplicationCommand - { - /// - /// The guild Id where this command originates. - /// - public ulong GuildId { get; private set; } - - internal RestGuildMessageCommand(BaseDiscordClient client, ulong id, ulong guildId) - : base(client, id) - { - this.CommandType = RestApplicationCommandType.GuildMessageCommand; - this.GuildId = guildId; - } - - internal static RestGuildMessageCommand Create(BaseDiscordClient client, Model model, ulong guildId) - { - var entity = new RestGuildMessageCommand(client, model.Id, guildId); - entity.Update(model); - return entity; - } - - /// - public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGuildMessageCommand(Discord, GuildId, this).ConfigureAwait(false); - - /// - /// Modifies this . - /// - /// The delegate containing the properties to modify the command with. - /// The options to be used when sending the request. - /// - /// The modified command - /// - public async Task ModifyAsync(Action func, RequestOptions options = null) - => await InteractionHelper.ModifyGuildMessageCommand(Discord, this, func, options).ConfigureAwait(false); - - /// - /// Gets the guild that this slash command resides in. - /// - /// if you want the approximate member and presence counts for the guild, otherwise . - /// The options to be used when sending the request. - /// - /// A task that represents the asynchronous get operation. The task result contains a - /// . - /// - public Task GetGuild(bool withCounts = false, RequestOptions options = null) - => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); - } -} diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs deleted file mode 100644 index 02dc173db1..0000000000 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildUserCommand.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Model = Discord.API.ApplicationCommand; - -namespace Discord.Rest -{ - /// - /// Represents a Rest-based guild command. - /// - public class RestGuildUserCommand : RestApplicationCommand - { - /// - /// The guild Id where this command originates. - /// - public ulong GuildId { get; private set; } - - internal RestGuildUserCommand(BaseDiscordClient client, ulong id, ulong guildId) - : base(client, id) - { - this.CommandType = RestApplicationCommandType.GuildUserCommand; - this.GuildId = guildId; - } - - internal static RestGuildUserCommand Create(BaseDiscordClient client, Model model, ulong guildId) - { - var entity = new RestGuildUserCommand(client, model.Id, guildId); - entity.Update(model); - return entity; - } - - /// - public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGuildUserCommand(Discord, GuildId, this).ConfigureAwait(false); - - /// - /// Modifies this . - /// - /// The delegate containing the properties to modify the command with. - /// The options to be used when sending the request. - /// - /// The modified command - /// - public async Task ModifyAsync(Action func, RequestOptions options = null) - => await InteractionHelper.ModifyGuildUserCommand(Discord, this, func, options).ConfigureAwait(false); - - /// - /// Gets the guild that this slash command resides in. - /// - /// if you want the approximate member and presence counts for the guild, otherwise . - /// The options to be used when sending the request. - /// - /// A task that represents the asynchronous get operation. The task result contains a - /// . - /// - public Task GetGuild(bool withCounts = false, RequestOptions options = null) - => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); - } -} diff --git a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs index 190eca89da..9d41ecf488 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs @@ -7,27 +7,9 @@ namespace Discord.API.Gateway { - internal class ApplicationCommandCreatedUpdatedEvent + internal class ApplicationCommandCreatedUpdatedEvent : API.ApplicationCommand { - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("id")] - public ulong Id { get; set; } - - [JsonProperty("description")] - public string Description { get; set; } - - [JsonProperty("application_id")] - public ulong ApplicationId { get; set; } - [JsonProperty("guild_id")] - public ulong GuildId { get; set; } - - [JsonProperty("options")] - public Optional> Options { get; set; } - - [JsonProperty("default_permission")] - public Optional DefaultPermission { get; set; } + public Optional GuildId { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index f7137c90c0..b2a8237414 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3752,7 +3752,12 @@ - Represends a Websocket-based recieved over the gateway. + Represends a Websocket-based . + + + + + if this command is a global command, otherwise . @@ -3772,20 +3777,34 @@ - A collection of 's recieved over the gateway. + A collection of 's for this command. + + If the is not a slash command, this field will be an empty collection. + - The where this application was created. + Returns the guild this command resides in, if this command is a global command then it will return + + + Modifies the current application command. + + The new properties to use when modifying the command. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + Thrown when you pass in an invalid type. + Represents a choice for a . diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 52a5d309db..0da71faf2c 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1946,11 +1946,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var data = (payload as JToken).ToObject(_serializer); - var guild = State.GetGuild(data.GuildId); - if(guild == null) + if (data.GuildId.IsSpecified) { - await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); - return; + var guild = State.GetGuild(data.GuildId.Value); + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId.Value).ConfigureAwait(false); + return; + } } var applicationCommand = SocketApplicationCommand.Create(this, data); @@ -1964,11 +1967,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var data = (payload as JToken).ToObject(_serializer); - var guild = State.GetGuild(data.GuildId); - if (guild == null) + if (data.GuildId.IsSpecified) { - await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); - return; + var guild = State.GetGuild(data.GuildId.Value); + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId.Value).ConfigureAwait(false); + return; + } } var applicationCommand = SocketApplicationCommand.Create(this, data); @@ -1982,11 +1988,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var data = (payload as JToken).ToObject(_serializer); - var guild = State.GetGuild(data.GuildId); - if (guild == null) + if (data.GuildId.IsSpecified) { - await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); - return; + var guild = State.GetGuild(data.GuildId.Value); + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId.Value).ConfigureAwait(false); + return; + } } var applicationCommand = SocketApplicationCommand.Create(this, data); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index 9f53af562b..8d4a4d4857 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -10,10 +10,16 @@ namespace Discord.WebSocket { /// - /// Represends a Websocket-based recieved over the gateway. + /// Represends a Websocket-based . /// public class SocketApplicationCommand : SocketEntity, IApplicationCommand { + /// + /// if this command is a global command, otherwise . + /// + public bool IsGlobalCommand + => Guild == null; + /// public ulong ApplicationId { get; private set; } @@ -30,8 +36,11 @@ public class SocketApplicationCommand : SocketEntity, IApplicationCommand public bool DefaultPermission { get; private set; } /// - /// A collection of 's recieved over the gateway. + /// A collection of 's for this command. /// + /// + /// If the is not a slash command, this field will be an empty collection. + /// public IReadOnlyCollection Options { get; private set; } /// @@ -39,32 +48,31 @@ public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(this.Id); /// - /// The where this application was created. + /// Returns the guild this command resides in, if this command is a global command then it will return /// public SocketGuild Guild - => Discord.GetGuild(this.GuildId); - private ulong GuildId { get; set; } + => GuildId.HasValue ? Discord.GetGuild(this.GuildId.Value) : null; + + private ulong? GuildId { get; set; } - internal SocketApplicationCommand(DiscordSocketClient client, ulong id) + internal SocketApplicationCommand(DiscordSocketClient client, ulong id, ulong? guildId) : base(client, id) { - + this.GuildId = guildId; } internal static SocketApplicationCommand Create(DiscordSocketClient client, Model model) { - var entity = new SocketApplicationCommand(client, model.Id); + var entity = new SocketApplicationCommand(client, model.Id, model.GuildId.ToNullable()); entity.Update(model); return entity; } - internal void Update(Model model) + internal void Update(API.ApplicationCommand model) { this.ApplicationId = model.ApplicationId; this.Description = model.Description; this.Name = model.Name; - this.GuildId = model.GuildId; - this.DefaultPermission = model.DefaultPermission.GetValueOrDefault(true); - + this.DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); this.Options = model.Options.IsSpecified ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() @@ -73,8 +81,44 @@ internal void Update(Model model) /// public Task DeleteAsync(RequestOptions options = null) - => InteractionHelper.DeleteGuildCommand(Discord, this.GuildId, this, options); + => InteractionHelper.DeleteUnknownApplicationCommand(Discord, this.GuildId, this, options); + + /// + /// Modifies the current application command. + /// + /// The new properties to use when modifying the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + /// Thrown when you pass in an invalid type. + public async Task ModifyAsync(Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties + { + switch (typeof(TArg)) + { + case Type messageCommand when messageCommand == typeof(MessageCommandProperties) && this.Type != ApplicationCommandType.Message: + case Type slashCommand when slashCommand == typeof(SlashCommandProperties) && this.Type != ApplicationCommandType.Slash: + case Type userCommand when userCommand == typeof(UserCommandProperties) && this.Type != ApplicationCommandType.User: + throw new InvalidOperationException($"Cannot modify this application command with the parameter type {nameof(TArg)}"); + } + + API.ApplicationCommand command = null; + + if (this.IsGlobalCommand) + { + command = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + } + else + { + command = await InteractionHelper.ModifyGuildCommand(Discord, this, this.GuildId.Value, func, options); + } + + this.Update(command); + } + // IApplicationCommand IReadOnlyCollection IApplicationCommand.Options => Options; + Task IApplicationCommand.ModifyAsync(Action func, RequestOptions options) + => ModifyAsync(func, options); } } From 6326a1efd4f4d74a0d58df9f7f868c46b7d411f3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 21 Aug 2021 05:06:09 -0300 Subject: [PATCH 184/494] Add more methods for application commands, clean up of code, and add proper caching of socket application commands. --- src/Discord.Net.Core/Discord.Net.Core.xml | 35 ++++++++- .../Entities/Guilds/IGuild.cs | 15 +++- src/Discord.Net.Core/IDiscordClient.cs | 21 ++++++ src/Discord.Net.Rest/BaseDiscordClient.cs | 8 +++ src/Discord.Net.Rest/ClientHelper.cs | 20 +++++- src/Discord.Net.Rest/Discord.Net.Rest.xml | 23 ++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 71 +++++-------------- src/Discord.Net.Rest/DiscordRestClient.cs | 7 ++ .../Entities/Guilds/RestGuild.cs | 22 +++++- .../Interactions/InteractionHelper.cs | 22 ++++-- src/Discord.Net.WebSocket/ClientState.cs | 19 +++++ .../Discord.Net.WebSocket.xml | 27 +++++++ .../DiscordSocketClient.cs | 63 +++++++++++++++- .../Entities/Guilds/SocketGuild.cs | 63 +++++++++------- .../Slash Commands/SocketSlashCommandCache.cs | 48 ------------- .../SocketApplicationCommand.cs | 16 +++-- 16 files changed, 333 insertions(+), 147 deletions(-) delete mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 187461b93a..879e5613dd 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3916,7 +3916,7 @@ - Gets this guilds slash commands commands + Gets this guilds application commands. The options to be used when sending the request. @@ -3924,6 +3924,18 @@ of application commands found within the guild. + + + Gets an application command within this guild with the specified id. + + The id of the application command to get. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A ValueTask that represents the asynchronous get operation. The task result contains a + if found, otherwise . + + Holds information for a guild integration feature. @@ -10971,6 +10983,27 @@ A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. + + + Gets a global application command. + + The id of the command. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the application command if found, otherwise + . + + + + + Gets a collection of all global commands. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of global + application commands. + + Gets a guild. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 414b6fe73e..a94c1ed336 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -943,7 +943,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null); /// - /// Gets this guilds slash commands commands + /// Gets this guilds application commands. /// /// The options to be used when sending the request. /// @@ -951,5 +951,18 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// of application commands found within the guild. /// Task> GetApplicationCommandsAsync (RequestOptions options = null); + + /// + /// Gets an application command within this guild with the specified id. + /// + /// The id of the application command to get. + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A ValueTask that represents the asynchronous get operation. The task result contains a + /// if found, otherwise . + /// + Task GetApplicationCommandAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, + RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/IDiscordClient.cs b/src/Discord.Net.Core/IDiscordClient.cs index d7d6d28561..a728e6096c 100644 --- a/src/Discord.Net.Core/IDiscordClient.cs +++ b/src/Discord.Net.Core/IDiscordClient.cs @@ -141,6 +141,27 @@ public interface IDiscordClient : IDisposable /// Task> GetConnectionsAsync(RequestOptions options = null); + /// + /// Gets a global application command. + /// + /// The id of the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the application command if found, otherwise + /// . + /// + Task GetGlobalApplicationCommandAsync(ulong id, RequestOptions options = null); + + /// + /// Gets a collection of all global commands. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of global + /// application commands. + /// + Task> GetGlobalApplicationCommandsAsync(RequestOptions options = null); + /// /// Gets a guild. /// diff --git a/src/Discord.Net.Rest/BaseDiscordClient.cs b/src/Discord.Net.Rest/BaseDiscordClient.cs index 68589a4f12..c947232819 100644 --- a/src/Discord.Net.Rest/BaseDiscordClient.cs +++ b/src/Discord.Net.Rest/BaseDiscordClient.cs @@ -216,6 +216,14 @@ Task IDiscordClient.GetVoiceRegionAsync(string id, RequestOptions Task IDiscordClient.GetWebhookAsync(ulong id, RequestOptions options) => Task.FromResult(null); + /// + Task IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) + => Task.FromResult(null); + + /// + Task> IDiscordClient.GetGlobalApplicationCommandsAsync(RequestOptions options) + => Task.FromResult>(ImmutableArray.Create()); + /// Task IDiscordClient.StartAsync() => Task.Delay(0); diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 0161483c94..19c3b1325c 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -194,7 +194,8 @@ public static async Task GetBotGatewayAsync(BaseDiscordClient client }; } - public static async Task> GetGlobalApplicationCommands(BaseDiscordClient client, RequestOptions options) + public static async Task> GetGlobalApplicationCommands(BaseDiscordClient client, + RequestOptions options = null) { var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(options).ConfigureAwait(false); @@ -203,8 +204,16 @@ public static async Task> GetGlobalApplic return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); } + public static async Task GetGlobalApplicationCommand(BaseDiscordClient client, ulong id, + RequestOptions options = null) + { + var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options); + + return model != null ? RestGlobalCommand.Create(client, model) : null; + } - public static async Task> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, RequestOptions options) + public static async Task> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, + RequestOptions options = null) { var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, options).ConfigureAwait(false); @@ -213,6 +222,13 @@ public static async Task> GetGuildApplicat return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); } + public static async Task GetGuildApplicationCommand(BaseDiscordClient client, ulong id, ulong guildId, + RequestOptions options = null) + { + var model = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, id, options); + + return model != null ? RestGuildCommand.Create(client, model, guildId) : null; + } public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 0378df092f..2167ad1c5f 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -226,6 +226,12 @@ + + + + + + @@ -299,6 +305,12 @@ + + + + + + Represents a configuration class for . @@ -3503,6 +3515,17 @@ of application commands found within the guild. + + + Gets an application command within this guild with the specified id. + + The id of the application command to get. + The options to be used when sending the request. + + A ValueTask that represents the asynchronous get operation. The task result contains a + if found, otherwise . + + Returns the name of the guild. diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 8bf7f6e43f..f73799943f 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1063,6 +1063,18 @@ public async Task GetGlobalApplicationCommandsAsync(Reques return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/commands", new BucketIds(), options: options).ConfigureAwait(false); } + public async Task GetGlobalApplicationCommandAsync(ulong id, RequestOptions options = null) + { + Preconditions.NotEqual(id, 0, nameof(id)); + + options = RequestOptions.CreateOrClone(options); + + try + { + return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/commands/{id}", new BucketIds(), options: options).ConfigureAwait(false); + } + catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } + } public async Task CreateGlobalApplicationCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) { @@ -1074,7 +1086,6 @@ public async Task CreateGlobalApplicationCommandAsync(Create options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) @@ -1158,7 +1169,11 @@ public async Task GetGuildApplicationCommandAsync(ulong guil var bucket = new BucketIds(guildId: guildId); - return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options); + try + { + return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options); + } + catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } } public async Task CreateGuildApplicationCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) @@ -1195,58 +1210,6 @@ public async Task BulkOverwriteGuildApplicationCommands(ul return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); } - public async Task CreateGuildApplicationUserCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - var bucket = new BucketIds(guildId: guildId); - - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); - } - - public async Task ModifyGuildApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - var bucket = new BucketIds(guildId: guildId); - - return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); - } - public async Task BulkOverwriteGuildApplicationUserCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - var bucket = new BucketIds(guildId: guildId); - - return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); - } - - public async Task CreateGuildApplicationMessageCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - var bucket = new BucketIds(guildId: guildId); - - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); - } - public async Task ModifyGuildApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - var bucket = new BucketIds(guildId: guildId); - - return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); - } - - public async Task BulkOverwriteGuildApplicationMessageCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - var bucket = new BucketIds(guildId: guildId); - - return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); - } - //Interaction Responses public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 32dbaf40e0..feef4c12a0 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -226,5 +226,12 @@ async Task IDiscordClient.GetVoiceRegionAsync(string id, RequestOp /// async Task IDiscordClient.GetWebhookAsync(ulong id, RequestOptions options) => await GetWebhookAsync(id, options).ConfigureAwait(false); + + /// + async Task> IDiscordClient.GetGlobalApplicationCommandsAsync(RequestOptions options) + => await GetGlobalApplicationCommands(options).ConfigureAwait(false); + /// + async Task IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) + => await ClientHelper.GetGlobalApplicationCommand(this, id, options).ConfigureAwait(false); } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 126a211c85..bf4365a5fa 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -878,8 +878,19 @@ public Task> GetWebhooksAsync(RequestOptions op /// A task that represents the asynchronous get operation. The task result contains a read-only collection /// of application commands found within the guild. /// - public async Task> GetApplicationCommandsAsync (RequestOptions options = null) + public async Task> GetApplicationCommandsAsync (RequestOptions options = null) => await ClientHelper.GetGuildApplicationCommands(Discord, Id, options).ConfigureAwait(false); + /// + /// Gets an application command within this guild with the specified id. + /// + /// The id of the application command to get. + /// The options to be used when sending the request. + /// + /// A ValueTask that represents the asynchronous get operation. The task result contains a + /// if found, otherwise . + /// + public async Task GetApplicationCommandAsync(ulong id, RequestOptions options = null) + => await ClientHelper.GetGuildApplicationCommand(Discord, id, this.Id, options); /// /// Returns the name of the guild. @@ -1169,5 +1180,14 @@ async Task> IGuild.GetWebhooksAsync(RequestOptions /// async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) => await GetApplicationCommandsAsync(options).ConfigureAwait(false); + async Task IGuild.GetApplicationCommandAsync(ulong id, CacheMode mode, RequestOptions options) + { + if (mode == CacheMode.AllowDownload) + { + return await GetApplicationCommandAsync(id, options); + } + else + return null; + } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index fbbce4f4b9..adf6226e2d 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -44,12 +44,20 @@ public static async Task SendFollowupAsync(BaseDiscordClien } // Global commands - public static async Task CreateGlobalCommand(BaseDiscordClient client, - Action func, RequestOptions options) where TArg : ApplicationCommandProperties + public static async Task GetGlobalCommandAsync(BaseDiscordClient client, ulong id, + RequestOptions options = null) + { + var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); + + + return RestGlobalCommand.Create(client, model); + } + public static Task CreateGlobalCommand(BaseDiscordClient client, + Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); func((TArg)args); - return await CreateGlobalCommand(client, (TArg)args, options); + return CreateGlobalCommand(client, (TArg)args, options); } public static async Task CreateGlobalCommand(BaseDiscordClient client, ApplicationCommandProperties arg, RequestOptions options = null) @@ -116,7 +124,7 @@ public static async Task> BulkOverwriteGl models.Add(model); } - var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationCommands(models.ToArray(), options); + var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationCommands(models.ToArray(), options).ConfigureAwait(false); return apiModels.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); } @@ -156,7 +164,7 @@ public static async Task> BulkOverwriteGui models.Add(model); } - var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options); + var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options).ConfigureAwait(false); return apiModels.Select(x => RestGuildCommand.Create(client, x, guildId)).ToArray(); } @@ -221,12 +229,12 @@ public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicat } // Guild Commands - public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); func((TArg)args); - return await CreateGuildCommand(client, guildId, (TArg)args, options); + return CreateGuildCommand(client, guildId, (TArg)args, options); } public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, diff --git a/src/Discord.Net.WebSocket/ClientState.cs b/src/Discord.Net.WebSocket/ClientState.cs index f2e370d029..653eec4c83 100644 --- a/src/Discord.Net.WebSocket/ClientState.cs +++ b/src/Discord.Net.WebSocket/ClientState.cs @@ -16,12 +16,14 @@ internal class ClientState private readonly ConcurrentDictionary _guilds; private readonly ConcurrentDictionary _users; private readonly ConcurrentHashSet _groupChannels; + private readonly ConcurrentDictionary _commands; internal IReadOnlyCollection Channels => _channels.ToReadOnlyCollection(); internal IReadOnlyCollection DMChannels => _dmChannels.ToReadOnlyCollection(); internal IReadOnlyCollection GroupChannels => _groupChannels.Select(x => GetChannel(x) as SocketGroupChannel).ToReadOnlyCollection(_groupChannels); internal IReadOnlyCollection Guilds => _guilds.ToReadOnlyCollection(); internal IReadOnlyCollection Users => _users.ToReadOnlyCollection(); + internal IReadOnlyCollection Commands => _commands.ToReadOnlyCollection(); internal IReadOnlyCollection PrivateChannels => _dmChannels.Select(x => x.Value as ISocketPrivateChannel).Concat( @@ -139,5 +141,22 @@ internal void PurgeUsers() foreach (var guild in _guilds.Values) guild.PurgeGuildUserCache(); } + + internal SocketApplicationCommand GetCommand(ulong id) + { + if (_commands.TryGetValue(id, out SocketApplicationCommand command)) + return command; + return null; + } + internal void AddCommand(SocketApplicationCommand command) + { + _commands[command.Id] = command; + } + internal SocketApplicationCommand RemoveCommand(ulong id) + { + if (_commands.TryRemove(id, out SocketApplicationCommand command)) + return command; + return null; + } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index b2a8237414..faacf90ab8 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1078,6 +1078,27 @@ + + + Gets a global application command. + + The id of the command. + The options to be used when sending the request. + + A ValueTask that represents the asynchronous get operation. The task result contains the application command if found, otherwise + . + + + + + Gets a collection of all global commands. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection of global + application commands. + + Clears cached users from the client. @@ -1166,6 +1187,12 @@ + + + + + + diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 0da71faf2c..53d712dbf6 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -343,6 +343,54 @@ public override SocketUser GetUser(ulong id) /// public override SocketUser GetUser(string username, string discriminator) => State.Users.FirstOrDefault(x => x.Discriminator == discriminator && x.Username == username); + + /// + /// Gets a global application command. + /// + /// The id of the command. + /// The options to be used when sending the request. + /// + /// A ValueTask that represents the asynchronous get operation. The task result contains the application command if found, otherwise + /// . + /// + public async ValueTask GetGlobalApplicationCommandAsync(ulong id, RequestOptions options = null) + { + var command = State.GetCommand(id); + + if (command != null) + return command; + + var model = await ApiClient.GetGlobalApplicationCommandAsync(id, options); + + if (model == null) + return null; + + command = SocketApplicationCommand.Create(this, model); + + State.AddCommand(command); + + return command; + } + /// + /// Gets a collection of all global commands. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection of global + /// application commands. + /// + public async Task> GetGlobalApplicationCommandsAsync(RequestOptions options = null) + { + var commands = (await ApiClient.GetGlobalApplicationCommandsAsync(options)).Select(x => SocketApplicationCommand.Create(this, x)); + + foreach(var command in commands) + { + State.AddCommand(command); + } + + return commands.ToImmutableArray(); + } + /// /// Clears cached users from the client. /// @@ -1891,8 +1939,6 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty { await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); - // 0x546861742062696720656e6469616e20656e636f64696e67206d616b6573206d79316d687a20636c6f636b207469636b - var data = (payload as JToken).ToObject(_serializer); SocketChannel channel = null; @@ -1958,6 +2004,8 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var applicationCommand = SocketApplicationCommand.Create(this, data); + State.AddCommand(applicationCommand); + await TimedInvokeAsync(_applicationCommandCreated, nameof(ApplicationCommandCreated), applicationCommand).ConfigureAwait(false); } break; @@ -1979,6 +2027,8 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var applicationCommand = SocketApplicationCommand.Create(this, data); + State.AddCommand(applicationCommand); + await TimedInvokeAsync(_applicationCommandUpdated, nameof(ApplicationCommandUpdated), applicationCommand).ConfigureAwait(false); } break; @@ -2000,6 +2050,8 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var applicationCommand = SocketApplicationCommand.Create(this, data); + State.RemoveCommand(applicationCommand.Id); + await TimedInvokeAsync(_applicationCommandDeleted, nameof(ApplicationCommandDeleted), applicationCommand).ConfigureAwait(false); } break; @@ -2611,6 +2663,13 @@ async Task> IDiscordClient.GetVoiceRegionsAsyn async Task IDiscordClient.GetVoiceRegionAsync(string id, RequestOptions options) => await GetVoiceRegionAsync(id, options).ConfigureAwait(false); + /// + async Task IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) + => await GetGlobalApplicationCommandAsync(id, options); + /// + async Task> IDiscordClient.GetGlobalApplicationCommandsAsync(RequestOptions options) + => await GetGlobalApplicationCommandsAsync(options); + /// async Task IDiscordClient.StartAsync() => await StartAsync().ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 5c385fe010..3b92e6a223 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -785,13 +785,13 @@ public Task CreateIntegrationAsync(ulong id, string type, //Interactions /// - /// Deletes all slash commands in the current guild. + /// Deletes all application commands in the current guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous delete operation. /// - public Task DeleteSlashCommandsAsync(RequestOptions options = null) + public Task DeleteApplicationCommandsAsync(RequestOptions options = null) => InteractionHelper.DeleteAllGuildCommandsAsync(Discord, this.Id, options); /// @@ -802,20 +802,39 @@ public Task DeleteSlashCommandsAsync(RequestOptions options = null) /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// slash commands created by the current user. /// - public Task> GetSlashCommandsAsync(RequestOptions options = null) - => GuildHelper.GetSlashCommandsAsync(this, Discord, options); + public async Task> GetApplicationCommandsAsync(RequestOptions options = null) + { + var commands = (await Discord.ApiClient.GetGuildApplicationCommandsAsync(this.Id, options)).Select(x => SocketApplicationCommand.Create(Discord, x)); - /// - /// Gets a slash command in the current guild. - /// - /// The unique identifier of the slash command. - /// The options to be used when sending the request. - /// - /// A task that represents the asynchronous get operation. The task result contains a - /// slash command created by the current user. - /// - public Task GetSlashCommandAsync(ulong id, RequestOptions options = null) - => GuildHelper.GetSlashCommandAsync(this, id, Discord, options); + foreach (var command in commands) + { + Discord.State.AddCommand(command); + } + + return commands.ToImmutableArray(); + } + + public async ValueTask GetApplicationCommandAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + { + var command = Discord.State.GetCommand(id); + + if (command != null) + return command; + + if (mode == CacheMode.CacheOnly) + return null; + + var model = await Discord.ApiClient.GetGlobalApplicationCommandAsync(id, options); + + if (model == null) + return null; + + command = SocketApplicationCommand.Create(Discord, model); + + Discord.State.AddCommand(command); + + return command; + } //Invites /// @@ -1079,18 +1098,6 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null public Task> GetWebhooksAsync(RequestOptions options = null) => GuildHelper.GetWebhooksAsync(this, Discord, options); - //Interactions - /// - /// Gets this guilds slash commands commands - /// - /// The options to be used when sending the request. - /// - /// A task that represents the asynchronous get operation. The task result contains a read-only collection - /// of application commands found within the guild. - /// - public async Task> GetApplicationCommandsAsync(RequestOptions options = null) - => await Discord.Rest.GetGuildApplicationCommands(this.Id, options); - //Emotes /// public Task> GetEmotesAsync(RequestOptions options = null) @@ -1481,6 +1488,8 @@ async Task> IGuild.GetWebhooksAsync(RequestOptions /// async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) => await GetApplicationCommandsAsync(options).ConfigureAwait(false); + async Task IGuild.GetApplicationCommandAsync(ulong id, CacheMode mode, RequestOptions options) + => await GetApplicationCommandAsync(id, mode, options); void IDisposable.Dispose() { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs deleted file mode 100644 index 7dd30151dc..0000000000 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandCache.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.WebSocket.Entities.Interaction -{ - internal class SlashCommandCache - { - private readonly ConcurrentDictionary _slashCommands; - private readonly ConcurrentQueue _orderedSlashCommands; - private readonly int _size; - - public IReadOnlyCollection Messages => _slashCommands.ToReadOnlyCollection(); - - public SlashCommandCache(DiscordSocketClient client) - { - _size = 256; - _slashCommands = new ConcurrentDictionary(); - - } - - public void Add(SocketSlashCommand slashCommand) - { - if (_slashCommands.TryAdd(slashCommand.Id, slashCommand)) - { - _orderedSlashCommands.Enqueue(slashCommand.Id); - - while (_orderedSlashCommands.Count > _size && _orderedSlashCommands.TryDequeue(out ulong msgId)) - _slashCommands.TryRemove(msgId, out _); - } - } - - public SocketSlashCommand Remove(ulong id) - { - _slashCommands.TryRemove(id, out var slashCommand); - return slashCommand; - } - - public SocketSlashCommand Get(ulong id) - { - _slashCommands.TryGetValue(id, out var slashCommands); - return slashCommands; - } - } -} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index 8d4a4d4857..77a43a1e31 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -5,7 +5,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using Model = Discord.API.Gateway.ApplicationCommandCreatedUpdatedEvent; +using GatewayModel = Discord.API.Gateway.ApplicationCommandCreatedUpdatedEvent; +using Model = Discord.API.ApplicationCommand; namespace Discord.WebSocket { @@ -60,14 +61,21 @@ internal SocketApplicationCommand(DiscordSocketClient client, ulong id, ulong? g { this.GuildId = guildId; } - internal static SocketApplicationCommand Create(DiscordSocketClient client, Model model) + internal static SocketApplicationCommand Create(DiscordSocketClient client, GatewayModel model) { var entity = new SocketApplicationCommand(client, model.Id, model.GuildId.ToNullable()); entity.Update(model); return entity; } - internal void Update(API.ApplicationCommand model) + internal static SocketApplicationCommand Create(DiscordSocketClient client, Model model, ulong? guildId = null) + { + var entity = new SocketApplicationCommand(client, model.Id, guildId); + entity.Update(model); + return entity; + } + + internal void Update(Model model) { this.ApplicationId = model.ApplicationId; this.Description = model.Description; @@ -102,7 +110,7 @@ public async Task ModifyAsync(Action func, RequestOptions options = throw new InvalidOperationException($"Cannot modify this application command with the parameter type {nameof(TArg)}"); } - API.ApplicationCommand command = null; + Model command = null; if (this.IsGlobalCommand) { From 8b5d5724c96542414292910053d0d33497b6c9bd Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 21 Aug 2021 05:35:24 -0300 Subject: [PATCH 185/494] Fix some bugs --- .../Context Menus/MessageCommandBuilder.cs | 5 ---- .../Context Menus/UserCommandBuilder.cs | 5 ---- .../API/Common/InteractionCallbackData.cs | 1 - .../Discord.Net.WebSocket.xml | 29 +++---------------- .../User Commands/SocketUserCommandData.cs | 6 ++-- .../SocketBaseCommand/SocketCommandBase.cs | 6 ++-- 6 files changed, 10 insertions(+), 42 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index 9907dd2cf1..801aca302f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -32,11 +32,6 @@ public string Name Preconditions.AtLeast(value.Length, 3, nameof(Name)); Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); - // Discord updated the docs, this regex prevents special characters like @!$%(... etc, - // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(value, @"^[\w -]{3,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); - _name = value; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index d415a99a6b..5629a70142 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -32,11 +32,6 @@ public string Name Preconditions.AtLeast(value.Length, 3, nameof(Name)); Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); - // Discord updated the docs, this regex prevents special characters like @!$%(... etc, - // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(value, @"^[\w -]{3,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); - _name = value; } } diff --git a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index ba233cc6b7..2101f79f4d 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -16,7 +16,6 @@ internal class InteractionCallbackData [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } - // New flags prop. this make the response "ephemeral". see https://discord.com/developers/docs/interactions/slash-commands#interaction-response-interactionapplicationcommandcallbackdata [JsonProperty("flags")] public Optional Flags { get; set; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index faacf90ab8..1a7504102e 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3271,16 +3271,16 @@ voice regions the guild can access. - + - Deletes all slash commands in the current guild. + Deletes all application commands in the current guild. The options to be used when sending the request. A task that represents the asynchronous delete operation. - + Gets a collection of slash commands created by the current user in this guild. @@ -3290,17 +3290,6 @@ slash commands created by the current user. - - - Gets a slash command in the current guild. - - The unique identifier of the slash command. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - slash command created by the current user. - - Gets a collection of all invites in this guild. @@ -3439,16 +3428,6 @@ of webhooks found within the guild. - - - Gets this guilds slash commands commands - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of application commands found within the guild. - - @@ -3672,7 +3651,7 @@ - The user used to run the command + Gets the user who this command targets. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs index 70eb4adff9..d6c2a79906 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommandData.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using Model = Discord.API.ApplicationCommandInteractionData; namespace Discord.WebSocket @@ -9,9 +10,10 @@ namespace Discord.WebSocket public class SocketUserCommandData : SocketCommandBaseData { /// - /// The user used to run the command + /// Gets the user who this command targets. /// - public SocketUser Member { get; private set; } + public SocketUser Member + => (SocketUser)ResolvableData.GuildMembers.Values.FirstOrDefault() ?? ResolvableData.Users.Values.FirstOrDefault(); /// /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 7c8e2422e0..8ca20aa7c4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -103,13 +103,11 @@ public override async Task RespondAsync( AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, TTS = isTTS ? true : Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + Flags = ephemeral ? MessageFlags.Ephemeral : Optional.Unspecified } }; - if (ephemeral) - response.Data.Value.Flags = MessageFlags.Ephemeral; - await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); } From f5d064dfc389b831538e6bd51cdacdb40db84690 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 21 Aug 2021 07:10:49 -0300 Subject: [PATCH 186/494] Add more routes to guilds and clients. --- src/Discord.Net.Core/Discord.Net.Core.xml | 40 ++++++++++++ .../Entities/Guilds/IGuild.cs | 21 +++++++ src/Discord.Net.Core/IDiscordClient.cs | 20 ++++++ src/Discord.Net.Rest/BaseDiscordClient.cs | 5 ++ src/Discord.Net.Rest/ClientHelper.cs | 27 ++++++++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 29 +++++++++ src/Discord.Net.Rest/DiscordRestClient.cs | 12 ++-- .../Entities/Guilds/RestGuild.cs | 37 +++++++++++ .../Interactions/InteractionHelper.cs | 26 +++----- src/Discord.Net.WebSocket/ClientState.cs | 12 ++++ .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 32 ++++++++++ .../DiscordSocketClient.cs | 29 +++++++++ .../Entities/Guilds/SocketGuild.cs | 63 ++++++++++++++++++- 14 files changed, 328 insertions(+), 27 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 879e5613dd..c8695e4f13 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3936,6 +3936,26 @@ if found, otherwise . + + + Creates an application command within this guild. + + The properties to use when creating the command. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the command that was created. + + + + + Overwrites the application commands within this guild. + + A collection of properties to use when creating the commands. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. + + Holds information for a guild integration feature. @@ -11004,6 +11024,26 @@ application commands. + + + Creates a global application command. + + The properties to use when creating the command. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created application command. + + + + + Bulk overwrites all global application commands. + + A collection of properties to use when creating the commands. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains a collection of application commands that were created. + + Gets a guild. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index a94c1ed336..cd578e621e 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -964,5 +964,26 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// Task GetApplicationCommandAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); + + /// + /// Creates an application command within this guild. + /// + /// The properties to use when creating the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the command that was created. + /// + Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null); + + /// + /// Overwrites the application commands within this guild. + /// + /// A collection of properties to use when creating the commands. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. + /// + Task> BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, + RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/IDiscordClient.cs b/src/Discord.Net.Core/IDiscordClient.cs index a728e6096c..f6981d5523 100644 --- a/src/Discord.Net.Core/IDiscordClient.cs +++ b/src/Discord.Net.Core/IDiscordClient.cs @@ -162,6 +162,26 @@ public interface IDiscordClient : IDisposable /// Task> GetGlobalApplicationCommandsAsync(RequestOptions options = null); + /// + /// Creates a global application command. + /// + /// The properties to use when creating the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created application command. + /// + Task CreateGlobalApplicationCommand(ApplicationCommandProperties properties, RequestOptions options = null); + + /// + /// Bulk overwrites all global application commands. + /// + /// A collection of properties to use when creating the commands. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains a collection of application commands that were created. + /// + Task> BulkOverwriteGlobalApplicationCommand(ApplicationCommandProperties[] properties, RequestOptions options = null); + /// /// Gets a guild. /// diff --git a/src/Discord.Net.Rest/BaseDiscordClient.cs b/src/Discord.Net.Rest/BaseDiscordClient.cs index c947232819..93b82c929b 100644 --- a/src/Discord.Net.Rest/BaseDiscordClient.cs +++ b/src/Discord.Net.Rest/BaseDiscordClient.cs @@ -223,6 +223,11 @@ Task IDiscordClient.GetGlobalApplicationCommandAsync(ulong /// Task> IDiscordClient.GetGlobalApplicationCommandsAsync(RequestOptions options) => Task.FromResult>(ImmutableArray.Create()); + Task IDiscordClient.CreateGlobalApplicationCommand(ApplicationCommandProperties properties, RequestOptions options) + => Task.FromResult(null); + Task> IDiscordClient.BulkOverwriteGlobalApplicationCommand(ApplicationCommandProperties[] properties, + RequestOptions options) + => Task.FromResult>(ImmutableArray.Create()); /// Task IDiscordClient.StartAsync() diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 19c3b1325c..2fc382900a 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -229,7 +229,34 @@ public static async Task GetGuildApplicationCommand(BaseDiscor return model != null ? RestGuildCommand.Create(client, model, guildId) : null; } + public static async Task CreateGuildApplicationCommand(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties, + RequestOptions options = null) + { + var model = await InteractionHelper.CreateGuildCommand(client, guildId, properties, options); + + return RestGuildCommand.Create(client, model, guildId); + } + public static async Task CreateGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties properties, + RequestOptions options = null) + { + var model = await InteractionHelper.CreateGlobalCommand(client, properties, options); + + return RestGlobalCommand.Create(client, model); + } + public static async Task> BulkOverwriteGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties[] properties, + RequestOptions options = null) + { + var models = await InteractionHelper.BulkOverwriteGlobalCommands(client, properties, options); + return models.Select(x => RestGlobalCommand.Create(client, x)).ToImmutableArray(); + } + public static async Task> BulkOverwriteGuildApplicationCommand(BaseDiscordClient client, ulong guildId, + ApplicationCommandProperties[] properties, RequestOptions options = null) + { + var models = await InteractionHelper.BulkOverwriteGuildCommands(client, guildId, properties, options); + + return models.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); + } public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) => client.ApiClient.AddRoleAsync(guildId, userId, roleId, options); diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 2167ad1c5f..02065499d7 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3526,6 +3526,26 @@ if found, otherwise . + + + Creates an application command within this guild. + + The properties to use when creating the command. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the command that was created. + + + + + Overwrites the application commands within this guild. + + A collection of properties to use when creating the commands. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. + + Returns the name of the guild. @@ -3686,6 +3706,15 @@ + + + + + + + + + diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index feef4c12a0..10a4c40a9c 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -109,21 +109,17 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null => ClientHelper.GetWebhookAsync(this, id, options); public Task CreateGlobalCommand(ApplicationCommandProperties properties, RequestOptions options = null) - => InteractionHelper.CreateGlobalCommand(this, properties, options); - public Task CreateGlobalCommand(Action func, RequestOptions options = null) - => InteractionHelper.CreateGlobalCommand(this, func, options); + => ClientHelper.CreateGlobalApplicationCommand(this, properties, options); public Task CreateGuildCommand(ApplicationCommandProperties properties, ulong guildId, RequestOptions options = null) - => InteractionHelper.CreateGuildCommand(this, guildId, properties, options); - public Task CreateGuildCommand(Action func, ulong guildId, RequestOptions options = null) - => InteractionHelper.CreateGuildCommand(this, guildId, func, options); + => ClientHelper.CreateGuildApplicationCommand(this, guildId, properties, options); public Task> GetGlobalApplicationCommands(RequestOptions options = null) => ClientHelper.GetGlobalApplicationCommands(this, options); public Task> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) => ClientHelper.GetGuildApplicationCommands(this, guildId, options); public Task> BulkOverwriteGlobalCommands(ApplicationCommandProperties[] commandProperties, RequestOptions options = null) - => InteractionHelper.BulkOverwriteGlobalCommands(this, commandProperties, options); + => ClientHelper.BulkOverwriteGlobalApplicationCommand(this, commandProperties, options); public Task> BulkOverwriteGuildCommands(ApplicationCommandProperties[] commandProperties, ulong guildId, RequestOptions options = null) - => InteractionHelper.BulkOverwriteGuildCommands(this, guildId, commandProperties, options); + => ClientHelper.BulkOverwriteGuildApplicationCommand(this, guildId, commandProperties, options); public Task> BatchEditGuildCommandPermissions(ulong guildId, IDictionary permissions, RequestOptions options = null) => InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options); public Task DeleteAllGlobalCommandsAsync(RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index bf4365a5fa..1c453910d1 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -891,6 +891,35 @@ public async Task> GetApplicationCommandsA /// public async Task GetApplicationCommandAsync(ulong id, RequestOptions options = null) => await ClientHelper.GetGuildApplicationCommand(Discord, id, this.Id, options); + /// + /// Creates an application command within this guild. + /// + /// The properties to use when creating the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the command that was created. + /// + public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) + { + var model = await InteractionHelper.CreateGuildCommand(Discord, this.Id, properties, options); + + return RestGuildCommand.Create(Discord, model, this.Id); + } + /// + /// Overwrites the application commands within this guild. + /// + /// A collection of properties to use when creating the commands. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. + /// + public async Task> BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, + RequestOptions options = null) + { + var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, this.Id, properties, options); + + return models.Select(x => RestGuildCommand.Create(Discord, x, this.Id)).ToImmutableArray(); + } /// /// Returns the name of the guild. @@ -1180,6 +1209,14 @@ async Task> IGuild.GetWebhooksAsync(RequestOptions /// async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) => await GetApplicationCommandsAsync(options).ConfigureAwait(false); + /// + async Task IGuild.CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options) + => await CreateApplicationCommandAsync(properties, options); + /// + async Task> IGuild.BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, + RequestOptions options) + => await BulkOverwriteApplicationCommandsAsync(properties, options); + /// async Task IGuild.GetApplicationCommandAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index adf6226e2d..59d5c4f2b8 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -52,14 +52,14 @@ public static async Task GetGlobalCommandAsync(BaseDiscordCli return RestGlobalCommand.Create(client, model); } - public static Task CreateGlobalCommand(BaseDiscordClient client, + public static Task CreateGlobalCommand(BaseDiscordClient client, Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); func((TArg)args); return CreateGlobalCommand(client, (TArg)args, options); } - public static async Task CreateGlobalCommand(BaseDiscordClient client, + public static async Task CreateGlobalCommand(BaseDiscordClient client, ApplicationCommandProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); @@ -85,11 +85,10 @@ public static async Task CreateGlobalCommand(BaseDiscordClien : Optional.Unspecified; } - var cmd = await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); - return RestGlobalCommand.Create(client, cmd); + return await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); } - public static async Task> BulkOverwriteGlobalCommands(BaseDiscordClient client, + public static async Task BulkOverwriteGlobalCommands(BaseDiscordClient client, ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -124,12 +123,10 @@ public static async Task> BulkOverwriteGl models.Add(model); } - var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationCommands(models.ToArray(), options).ConfigureAwait(false); - - return apiModels.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); + return await client.ApiClient.BulkOverwriteGlobalApplicationCommands(models.ToArray(), options).ConfigureAwait(false); } - public static async Task> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, + public static async Task> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); @@ -164,9 +161,7 @@ public static async Task> BulkOverwriteGui models.Add(model); } - var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options).ConfigureAwait(false); - - return apiModels.Select(x => RestGuildCommand.Create(client, x, guildId)).ToArray(); + return await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options).ConfigureAwait(false); } public static Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, @@ -229,7 +224,7 @@ public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicat } // Guild Commands - public static Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); @@ -237,7 +232,7 @@ public static Task CreateGuildCommand(BaseDiscordClient return CreateGuildCommand(client, guildId, (TArg)args, options); } - public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties arg, RequestOptions options = null) { var model = new CreateApplicationCommandParams() @@ -261,8 +256,7 @@ public static async Task CreateGuildCommand(BaseDiscordClient : Optional.Unspecified; } - var cmd = await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); - return RestGuildCommand.Create(client, cmd, guildId); + return await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); } public static Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, diff --git a/src/Discord.Net.WebSocket/ClientState.cs b/src/Discord.Net.WebSocket/ClientState.cs index 653eec4c83..7129feb48c 100644 --- a/src/Discord.Net.WebSocket/ClientState.cs +++ b/src/Discord.Net.WebSocket/ClientState.cs @@ -39,6 +39,7 @@ public ClientState(int guildCount, int dmChannelCount) _guilds = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(guildCount * CollectionMultiplier)); _users = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(estimatedUsersCount * CollectionMultiplier)); _groupChannels = new ConcurrentHashSet(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(10 * CollectionMultiplier)); + _commands = new ConcurrentDictionary(); } internal SocketChannel GetChannel(ulong id) @@ -152,11 +153,22 @@ internal void AddCommand(SocketApplicationCommand command) { _commands[command.Id] = command; } + internal SocketApplicationCommand GetOrAddCommand(ulong id, Func commandFactory) + { + return _commands.GetOrAdd(id, commandFactory); + } internal SocketApplicationCommand RemoveCommand(ulong id) { if (_commands.TryRemove(id, out SocketApplicationCommand command)) return command; return null; } + internal void PurgeCommands(Func precondition) + { + var ids = _commands.Where(x => precondition(x.Value)).Select(x => x.Key); + + foreach (var id in ids) + _commands.TryRemove(id, out var _); + } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 167ccebb08..e6352780e9 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -20,7 +20,7 @@ 3.0.1 - TRACE; + TRACE diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 1a7504102e..1fb19d2075 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3290,6 +3290,38 @@ slash commands created by the current user. + + + Gets an application command within this guild with the specified id. + + The id of the application command to get. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A ValueTask that represents the asynchronous get operation. The task result contains a + if found, otherwise . + + + + + Creates an application command within this guild. + + The properties to use when creating the command. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the command that was created. + + + + + Overwrites the application commands within this guild. + + A collection of properties to use when creating the commands. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. + + Gets a collection of all invites in this guild. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 53d712dbf6..2f99e60d39 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -391,6 +391,35 @@ public async Task> GetGlobalApplic return commands.ToImmutableArray(); } + public async Task CreateGlobalApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) + { + var model = await InteractionHelper.CreateGlobalCommand(this, properties, options).ConfigureAwait(false); + + var entity = State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(this, model)); + + // update it incase it was cached + entity.Update(model); + + return entity; + } + public async Task> BulkOverwriteGlobalApplicationCommandsAsync( + ApplicationCommandProperties[] properties, RequestOptions options = null) + { + var models = await InteractionHelper.BulkOverwriteGlobalCommands(this, properties, options); + + var entities = models.Select(x => SocketApplicationCommand.Create(this, x)); + + // purge our previous commands + State.PurgeCommands(x => x.IsGlobalCommand); + + foreach(var entity in entities) + { + State.AddCommand(entity); + } + + return entities.ToImmutableArray(); + } + /// /// Clears cached users from the client. /// diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 3b92e6a223..19af8038fe 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -804,7 +804,7 @@ public Task DeleteApplicationCommandsAsync(RequestOptions options = null) /// public async Task> GetApplicationCommandsAsync(RequestOptions options = null) { - var commands = (await Discord.ApiClient.GetGuildApplicationCommandsAsync(this.Id, options)).Select(x => SocketApplicationCommand.Create(Discord, x)); + var commands = (await Discord.ApiClient.GetGuildApplicationCommandsAsync(this.Id, options)).Select(x => SocketApplicationCommand.Create(Discord, x, this.Id)); foreach (var command in commands) { @@ -814,6 +814,16 @@ public async Task> GetApplicationC return commands.ToImmutableArray(); } + /// + /// Gets an application command within this guild with the specified id. + /// + /// The id of the application command to get. + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A ValueTask that represents the asynchronous get operation. The task result contains a + /// if found, otherwise . + /// public async ValueTask GetApplicationCommandAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) { var command = Discord.State.GetCommand(id); @@ -829,13 +839,57 @@ public async ValueTask GetApplicationCommandAsync(ulon if (model == null) return null; - command = SocketApplicationCommand.Create(Discord, model); + command = SocketApplicationCommand.Create(Discord, model, this.Id); Discord.State.AddCommand(command); return command; } + /// + /// Creates an application command within this guild. + /// + /// The properties to use when creating the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the command that was created. + /// + public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) + { + var model = await InteractionHelper.CreateGuildCommand(Discord, this.Id, properties, options); + + var entity = Discord.State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(Discord, model)); + + entity.Update(model); + + return entity; + } + + /// + /// Overwrites the application commands within this guild. + /// + /// A collection of properties to use when creating the commands. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. + /// + public async Task> BulkOverwriteApplicationCommandAsync(ApplicationCommandProperties[] properties, + RequestOptions options = null) + { + var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, this.Id, properties, options); + + var entities = models.Select(x => SocketApplicationCommand.Create(Discord, x)); + + Discord.State.PurgeCommands(x => !x.IsGlobalCommand && x.Guild.Id == this.Id); + + foreach(var entity in entities) + { + Discord.State.AddCommand(entity); + } + + return entities.ToImmutableArray(); + } + //Invites /// /// Gets a collection of all invites in this guild. @@ -1490,6 +1544,11 @@ async Task> IGuild.GetApplicationComman => await GetApplicationCommandsAsync(options).ConfigureAwait(false); async Task IGuild.GetApplicationCommandAsync(ulong id, CacheMode mode, RequestOptions options) => await GetApplicationCommandAsync(id, mode, options); + async Task IGuild.CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options) + => await CreateApplicationCommandAsync(properties, options); + async Task> IGuild.BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, + RequestOptions options) + => await BulkOverwriteApplicationCommandAsync(properties, options); void IDisposable.Dispose() { From ba69f15c9e942a142e5f93c51eb1d9a8353ef010 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 22 Aug 2021 07:05:38 -0300 Subject: [PATCH 187/494] Stickers pt1 --- src/Discord.Net.Core/CDN.cs | 28 ++++ .../Entities/Guilds/IGuild.cs | 53 ++++++ .../Entities/Stickers/ICustomSticker.cs | 62 +++++++ .../{Messages => Stickers}/ISticker.cs | 7 + .../Entities/Stickers/StickerProperties.cs | 29 ++++ src/Discord.Net.Rest/API/Common/Guild.cs | 2 + src/Discord.Net.Rest/API/Common/Message.cs | 4 +- .../API/Common/NitroStickerPacks.cs | 15 ++ src/Discord.Net.Rest/API/Common/Sticker.cs | 2 + .../API/Common/StickerItem.cs | 21 +++ .../API/Common/StickerPack.cs | 27 ++++ .../API/Rest/CreateStickerParams.cs | 32 ++++ .../API/Rest/ModifyStickerParams.cs | 19 +++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 87 ++++++++++ .../Entities/Guilds/GuildHelper.cs | 47 ++++++ .../Entities/Messages/Sticker.cs | 3 +- .../Entities/Messages/StickerItem.cs | 46 ++++++ .../Entities/Guilds/SocketGuild.cs | 151 +++++++++++++++++- .../Entities/Messages/SocketCustomSticker.cs | 73 +++++++++ .../Entities/Messages/SocketSticker.cs | 68 ++++++++ 20 files changed, 772 insertions(+), 4 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs rename src/Discord.Net.Core/Entities/{Messages => Stickers}/ISticker.cs (92%) create mode 100644 src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs create mode 100644 src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs create mode 100644 src/Discord.Net.Rest/API/Common/StickerItem.cs create mode 100644 src/Discord.Net.Rest/API/Common/StickerPack.cs create mode 100644 src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs create mode 100644 src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs create mode 100644 src/Discord.Net.Rest/Entities/Messages/StickerItem.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Messages/SocketCustomSticker.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Messages/SocketSticker.cs diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index b1879eebc1..1e8fd624d8 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -177,6 +177,34 @@ public static string GetSpotifyAlbumArtUrl(string albumArtId) public static string GetSpotifyDirectUrl(string trackId) => $"https://open.spotify.com/track/{trackId}"; + /// + /// Gets a stickers url based off the id and format. + /// + /// The id of the sticker. + /// The format of the sticker + /// + /// A URL to the sticker. + /// + public static string GetStickerUrl(ulong stickerId, StickerFormatType format = StickerFormatType.Png) + => $"{DiscordConfig.CDNUrl}stickers/{stickerId}.{FormatToExtension(format)}"; + + private static string FormatToExtension(StickerFormatType format) + { + switch (format) + { + case StickerFormatType.None: + case StickerFormatType.Png: + return "png"; + case StickerFormatType.Lottie: + return "lottie"; + case StickerFormatType.Apng: + return "apng"; + default: + throw new ArgumentException(nameof(format)); + + } + } + private static string FormatToExtension(ImageFormat format, string imageId) { if (format == ImageFormat.Auto) diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 414b6fe73e..d9daf80cd8 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -199,6 +199,13 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// IReadOnlyCollection Emotes { get; } /// + /// Gets a collection of all custom stickers for this guild. + /// + /// + /// A read-only collection of all custom stickers for this guild. + /// + IReadOnlyCollection Stickers { get; } + /// /// Gets a collection of all extra features added to this guild. /// /// @@ -942,6 +949,52 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null); + /// + /// Creates a new sticker in this guild. + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The image of the new emote. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + Task CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options = null); + + /// + /// Gets a specific sticker within this guild. + /// + /// The id of the sticker to get. + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the sticker found with the + /// specified ; if none is found. + /// + Task GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); + + /// + /// Gets a collection of all stickers within this guild. + /// + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of stickers found within the guild. + /// + Task> GetStickersAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); + + /// + /// Deletes a sticker within this guild. + /// + /// The sticker to delete. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous removal operation. + /// + Task DeleteStickerAsync(ICustomSticker sticker, RequestOptions options = null); + /// /// Gets this guilds slash commands commands /// diff --git a/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs new file mode 100644 index 0000000000..03f4ac2eb3 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a custom sticker within a guild. + /// + public interface ICustomSticker : ISticker + { + /// + /// Gets the users id who uploaded the sticker. + /// + /// + /// In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. + /// + ulong? AuthorId { get; } + + /// + /// Gets the guild that this custom sticker is in. + /// + IGuild Guild { get; } + + /// + /// Modifies this sticker. + /// + /// + /// This method modifies this sticker with the specified properties. To see an example of this + /// method and what properties are available, please refer to . + ///
+ ///
+ /// The bot needs the MANAGE_EMOJIS_AND_STICKERS permission within the guild in order to modify stickers. + ///
+ /// + /// The following example replaces the name of the sticker with kekw. + /// + /// await sticker.ModifyAsync(x => x.Name = "kekw"); + /// + /// + /// A delegate containing the properties to modify the sticker with. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + Task ModifyAsync(Action func, RequestOptions options = null); + + /// + /// Deletes the current sticker. + /// + /// + /// The bot neeeds the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous deletion operation. + /// + Task DeleteAsync(RequestOptions options = null); + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/ISticker.cs b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs similarity index 92% rename from src/Discord.Net.Core/Entities/Messages/ISticker.cs rename to src/Discord.Net.Core/Entities/Stickers/ISticker.cs index e7e4405b63..eca613051a 100644 --- a/src/Discord.Net.Core/Entities/Messages/ISticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs @@ -1,4 +1,6 @@ +using System; using System.Collections.Generic; +using System.Threading.Tasks; namespace Discord { @@ -63,5 +65,10 @@ public interface ISticker /// A with the format type of this sticker. /// StickerFormatType FormatType { get; } + + /// + /// Gets the image url for this sticker. + /// + string GetStickerUrl(); } } diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs b/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs new file mode 100644 index 0000000000..21267cdda3 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a class used to modify stickers. + /// + public class StickerProperties + { + /// + /// Gets or sets the name of the sticker. + /// + public Optional Name { get; set; } + + /// + /// Gets or sets the description of the sticker. + /// + public Optional Description { get; set; } + + /// + /// Gets or sets the tags of the sticker. + /// + public Optional> Tags { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/Guild.cs b/src/Discord.Net.Rest/API/Common/Guild.cs index a22df9a30c..c5ec00117e 100644 --- a/src/Discord.Net.Rest/API/Common/Guild.cs +++ b/src/Discord.Net.Rest/API/Common/Guild.cs @@ -80,5 +80,7 @@ internal class Guild public Optional Threads { get; set; } [JsonProperty("nsfw_level")] public NsfwLevel NsfwLevel { get; set; } + [JsonProperty("stickers")] + public Sticker[] Stickers { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index 0474fec5b1..e88a94af8c 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -60,7 +60,7 @@ internal class Message public Optional ReferencedMessage { get; set; } [JsonProperty("components")] public Optional Components { get; set; } - [JsonProperty("stickers")] - public Optional Stickers { get; set; } + [JsonProperty("sticker_items")] + public Optional StickerItems { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs b/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs new file mode 100644 index 0000000000..ddb9b0bc53 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs @@ -0,0 +1,15 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class NitroStickerPacks + { + [JsonProperty("sticker_packs")] + public List StickerPacks { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/Sticker.cs b/src/Discord.Net.Rest/API/Common/Sticker.cs index 0d1cac9749..31bd973701 100644 --- a/src/Discord.Net.Rest/API/Common/Sticker.cs +++ b/src/Discord.Net.Rest/API/Common/Sticker.cs @@ -21,5 +21,7 @@ internal class Sticker public string PreviewAsset { get; set; } [JsonProperty("format_type")] public StickerFormatType FormatType { get; set; } + [JsonProperty("user")] + public Optional User { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/StickerItem.cs b/src/Discord.Net.Rest/API/Common/StickerItem.cs new file mode 100644 index 0000000000..9ec0fb503b --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/StickerItem.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class StickerItem + { + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("format_type")] + public StickerFormatType FormatType { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/StickerPack.cs b/src/Discord.Net.Rest/API/Common/StickerPack.cs new file mode 100644 index 0000000000..aa3314d7ce --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/StickerPack.cs @@ -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 +{ + internal class StickerPack + { + [JsonProperty("id")] + public ulong Id { get; set; } + [JsonProperty("stickers")] + public Sticker[] Stickers { get; set; } + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("sku_id")] + public ulong SkuId { get; set; } + [JsonProperty("cover_sticker_id")] + public Optional CoverStickerId { get; set; } + [JsonProperty("description")] + public string Description { get; set; } + [JsonProperty("banner_asset_id")] + public ulong BannerAssetId { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs new file mode 100644 index 0000000000..291052f3a3 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs @@ -0,0 +1,32 @@ +using Discord.Net.Rest; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class CreateStickerParams + { + public Stream File { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string Tags { get; set; } + + public IReadOnlyDictionary ToDictionary() + { + var d = new Dictionary(); + + d["file"] = new MultipartFile(File, Name); + + d["name"] = Name; + d["description"] = Description; + d["tags"] = Tags; + + return d; + } + } +} diff --git a/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs new file mode 100644 index 0000000000..47331b5a06 --- /dev/null +++ b/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Rest +{ + internal class ModifyStickerParams + { + [JsonProperty("name")] + public Optional Name { get; set; } + [JsonProperty("description")] + public Optional Description { get; set; } + [JsonProperty("tags")] + public Optional Tags { get; set; } + } +} diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 5535f4e5c5..14aba69ea2 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -886,6 +886,67 @@ public async Task ModifyMessageAsync(ulong channelId, ulong messageId, return await SendJsonAsync("PATCH", () => $"channels/{channelId}/messages/{messageId}", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); } + // Stickers + public async Task GetStickerAsync(ulong id, RequestOptions options = null) + { + Preconditions.NotEqual(id, 0, nameof(id)); + + options = RequestOptions.CreateOrClone(options); + + return await NullifyNotFound(SendAsync("GET", () => $"stickers/{id}", new BucketIds(), options: options)).ConfigureAwait(false); + } + public async Task GetGuildStickerAsync(ulong guildId, ulong id, RequestOptions options = null) + { + Preconditions.NotEqual(id, 0, nameof(id)); + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + + options = RequestOptions.CreateOrClone(options); + + return await NullifyNotFound(SendAsync("GET", () => $"guilds/{guildId}/stickers/{id}", new BucketIds(guildId), options: options)).ConfigureAwait(false); + } + public async Task ListGuildStickersAsync(ulong guildId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + + options = RequestOptions.CreateOrClone(options); + + return await SendAsync("GET", () => $"guilds/{guildId}/stickers", new BucketIds(guildId), options: options).ConfigureAwait(false); + } + public async Task ListNitroStickerPacksAsync(RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + + return await SendAsync("GET", () => $"sticker-packs", new BucketIds(), options: options).ConfigureAwait(false); + } + public async Task CreateGuildStickerAsync(CreateStickerParams args, ulong guildId, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + + options = RequestOptions.CreateOrClone(options); + + return await SendMultipartAsync("POST", () => $"guilds/{guildId}/stickers", args.ToDictionary(), new BucketIds(guildId), options: options).ConfigureAwait(false); + } + public async Task ModifyStickerAsync(ModifyStickerParams args, ulong guildId, ulong stickerId, RequestOptions options = null) + { + Preconditions.NotNull(args, nameof(args)); + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + Preconditions.NotEqual(stickerId, 0, nameof(stickerId)); + + options = RequestOptions.CreateOrClone(options); + + return await SendJsonAsync("PATCH", () => $"guilds/{guildId}/stickers/{stickerId}", args, new BucketIds(guildId), options: options).ConfigureAwait(false); + } + public async Task DeleteStickerAsync(ulong guildId, ulong stickerId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + Preconditions.NotEqual(stickerId, 0, nameof(stickerId)); + + options = RequestOptions.CreateOrClone(options); + + await SendAsync("DELETE", () => $"guilds/{guildId}/stickers/{stickerId}", new BucketIds(guildId), options: options).ConfigureAwait(false); + } + public async Task AddReactionAsync(ulong channelId, ulong messageId, string emoji, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -2002,6 +2063,32 @@ protected async Task TrySendApplicationCommand(Task sendTask) } } + protected async Task NullifyNotFound(Task sendTask) where T : class + { + try + { + var result = await sendTask.ConfigureAwait(false); + + if (sendTask.Exception != null) + { + if (sendTask.Exception.InnerException is HttpException x) + { + if (x.HttpCode == HttpStatusCode.NotFound) + { + return null; + } + } + + throw sendTask.Exception; + } + else + return result; + } + catch (HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) + { + return null; + } + } internal class BucketIds { public ulong GuildId { get; internal set; } diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index f0eaaf7dff..820461e9a3 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -535,5 +535,52 @@ public static async Task ModifyEmoteAsync(IGuild guild, BaseDiscordC } public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) => client.ApiClient.DeleteGuildEmoteAsync(guild.Id, id, options); + + public static async Task CreateStickerAsync(BaseDiscordClient client, IGuild guild, string name, string description, IEnumerable tags, + Image image, RequestOptions options = null) + { + Preconditions.NotNull(name, nameof(name)); + Preconditions.NotNull(description, nameof(description)); + + Preconditions.AtLeast(name.Length, 2, nameof(name)); + Preconditions.AtLeast(description.Length, 2, nameof(description)); + + Preconditions.AtMost(name.Length, 30, nameof(name)); + Preconditions.AtMost(description.Length, 100, nameof(name)); + + var apiArgs = new CreateStickerParams() + { + Name = name, + Description = description, + File = image.Stream, + Tags = string.Join(", ", tags) + }; + + return await client.ApiClient.CreateGuildStickerAsync(apiArgs, guild.Id, options).ConfigureAwait(false); + } + + public static async Task ModifyStickerAsync(BaseDiscordClient client, IGuild guild, ISticker sticker, Action func, + RequestOptions options = null) + { + if (func == null) + throw new ArgumentNullException(paramName: nameof(func)); + + var props = new StickerProperties(); + func(props); + + var apiArgs = new ModifyStickerParams() + { + Description = props.Description, + Name = props.Name, + Tags = props.Tags.IsSpecified ? + string.Join(", ", props.Tags.Value) : + Optional.Unspecified + }; + + return await client.ApiClient.ModifyStickerAsync(apiArgs, guild.Id, sticker.Id, options).ConfigureAwait(false); + } + + public static async Task DeleteStickerAsync(BaseDiscordClient client, IGuild guild, ISticker sticker, RequestOptions options = null) + => await client.ApiClient.DeleteStickerAsync(guild.Id, sticker.Id, options).ConfigureAwait(false); } } diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index 5482bed740..aa4960f5be 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using Model = Discord.API.Sticker; namespace Discord @@ -39,7 +40,7 @@ internal Sticker(ulong id, ulong packId, string name, string description, string internal static Sticker Create(Model model) { return new Sticker(model.Id, model.PackId, model.Name, model.Desription, - model.Tags.IsSpecified ? model.Tags.Value.Split(',') : new string[0], + model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0], model.Asset, model.PreviewAsset, model.FormatType); } diff --git a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs new file mode 100644 index 0000000000..61284e6040 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.StickerItem; + +namespace Discord.Rest +{ + /// + /// Represents a partial sticker received in a message. + /// + public class StickerItem : RestEntity + { + /// + /// The name of this sticker. + /// + public readonly string Name; + + /// + /// The format of this sticker. + /// + public readonly StickerFormatType Format; + + internal StickerItem(BaseDiscordClient client, Model model) + : base(client, model.Id) + { + this.Name = model.Name; + this.Format = model.FormatType; + } + + /// + /// Resolves this sticker item by fetching the from the API. + /// + /// + /// A task representing the download operation, the result of the task is a sticker object. + /// + + public async Task ResolveStickerAsync() + { + var model = await Discord.ApiClient.GetStickerAsync(this.Id); + + return Sticker.Create(model); + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 5c385fe010..2521d6b2bd 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -19,6 +19,7 @@ using RoleModel = Discord.API.Role; using UserModel = Discord.API.User; using VoiceStateModel = Discord.API.VoiceState; +using StickerModel = Discord.API.Sticker; namespace Discord.WebSocket { @@ -36,7 +37,9 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable private ConcurrentDictionary _members; private ConcurrentDictionary _roles; private ConcurrentDictionary _voiceStates; + private ConcurrentDictionary _stickers; private ImmutableArray _emotes; + private ImmutableArray _features; private AudioClient _audioClient; #pragma warning restore IDISP002, IDISP006 @@ -322,6 +325,11 @@ public IReadOnlyCollection Channels } /// public IReadOnlyCollection Emotes => _emotes; + /// + /// Gets a collection of all custom stickers for this guild. + /// + public IReadOnlyCollection Stickers + => _stickers.Select(x => x.Value).ToImmutableArray(); /// public IReadOnlyCollection Features => _features; /// @@ -440,6 +448,8 @@ internal void Update(ClientState state, ExtendedModel model) } _voiceStates = voiceStates; + + _syncPromise = new TaskCompletionSource(); _downloaderPromise = new TaskCompletionSource(); var _ = _syncPromise.TrySetResultAsync(true); @@ -509,6 +519,23 @@ internal void Update(ClientState state, Model model) } } _roles = roles; + + if (model.Stickers != null) + { + var stickers = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.Stickers.Length * 1.05)); + for (int i = 0; i < model.Stickers.Length; i++) + { + var sticker = model.Stickers[i]; + if (sticker.User.IsSpecified) + AddOrUpdateUser(sticker.User.Value); + + var entity = SocketCustomSticker.Create(Discord, sticker, this, sticker.User.IsSpecified ? sticker.User.Value.Id : null); + + stickers.TryAdd(sticker.Id, entity); + } + } + else + _stickers = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, 7); } /*internal void Update(ClientState state, GuildSyncModel model) //TODO remove? userbot related { @@ -898,6 +925,33 @@ internal SocketRole AddOrUpdateRole(RoleModel model) return role; } + internal SocketCustomSticker AddSticker(StickerModel model) + { + if (model.User.IsSpecified) + AddOrUpdateUser(model.User.Value); + + var sticker = SocketCustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null); + _stickers[model.Id] = sticker; + return sticker; + } + + internal SocketCustomSticker AddOrUpdateSticker(StickerModel model) + { + if (_stickers.TryGetValue(model.Id, out SocketCustomSticker sticker)) + _stickers[model.Id].Update(model); + else + sticker = AddSticker(model); + + return sticker; + } + + internal SocketCustomSticker RemoveSticker(ulong id) + { + if (_stickers.TryRemove(id, out SocketCustomSticker sticker)) + return sticker; + return null; + } + //Users /// public Task AddGuildUserAsync(ulong id, string accessToken, Action func = null, RequestOptions options = null) @@ -1109,6 +1163,92 @@ public Task ModifyEmoteAsync(GuildEmote emote, Action GuildHelper.DeleteEmoteAsync(this, Discord, emote.Id, options); + //Stickers + /// + /// Gets a specific sticker within this guild. + /// + /// The id of the sticker to get. + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the sticker found with the + /// specified ; if none is found. + /// + public async ValueTask GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + { + var sticker = _stickers[id]; + + if (sticker != null) + return sticker; + + if (mode == CacheMode.CacheOnly) + return null; + + var model = await Discord.ApiClient.GetGuildStickerAsync(this.Id, id, options).ConfigureAwait(false); + + if (model == null) + return null; + + return AddOrUpdateSticker(model); + } + /// + /// Gets a collection of all stickers within this guild. + /// + /// The that determines whether the object should be fetched from cache. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of stickers found within the guild. + /// + public async ValueTask> GetStickersAsync(CacheMode mode = CacheMode.AllowDownload, + RequestOptions options = null) + { + if (this.Stickers.Count > 0) + return this.Stickers; + + if (mode == CacheMode.CacheOnly) + return ImmutableArray.Create(); + + var models = await Discord.ApiClient.ListGuildStickersAsync(this.Id, options).ConfigureAwait(false); + + List stickers = new(); + + foreach (var model in models) + { + stickers.Add(AddOrUpdateSticker(model)); + } + + return stickers; + } + /// + /// Creates a new sticker in this guild. + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The image of the new emote. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + public async Task CreateStickerAsync(string name, string description, IEnumerable tags, Image image, + RequestOptions options = null) + { + var model = await GuildHelper.CreateStickerAsync(Discord, this, name, description, tags, image, options).ConfigureAwait(false); + + return AddOrUpdateSticker(model); + } + /// + /// Deletes a sticker within this guild. + /// + /// The sticker to delete. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous removal operation. + /// + public Task DeleteStickerAsync(SocketCustomSticker sticker, RequestOptions options = null) + => sticker.DeleteAsync(options); + //Voice States internal async Task AddOrUpdateVoiceStateAsync(ClientState state, VoiceStateModel model) { @@ -1332,6 +1472,8 @@ internal async Task RepopulateAudioStreamsAsync() int? IGuild.ApproximateMemberCount => null; /// int? IGuild.ApproximatePresenceCount => null; + /// + IReadOnlyCollection IGuild.Stickers => Stickers; /// async Task> IGuild.GetBansAsync(RequestOptions options) @@ -1481,6 +1623,13 @@ async Task> IGuild.GetWebhooksAsync(RequestOptions /// async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) => await GetApplicationCommandsAsync(options).ConfigureAwait(false); + async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options) + => await CreateStickerAsync(name, description, tags, image, options); + async Task IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options) + => await GetStickerAsync(id, mode, options); + async Task> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options) + => await GetStickersAsync(mode, options); + Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) => throw new NotImplementedException(); void IDisposable.Dispose() { @@ -1489,6 +1638,6 @@ void IDisposable.Dispose() _audioClient?.Dispose(); } - + } } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketCustomSticker.cs new file mode 100644 index 0000000000..4e00873c78 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketCustomSticker.cs @@ -0,0 +1,73 @@ +using Discord.Rest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Sticker; + + +namespace Discord.WebSocket +{ + public class SocketCustomSticker : SocketSticker, ICustomSticker + { + /// + /// Gets the user that uploaded the guild sticker. + /// + /// + /// + /// This may return in the WebSocket implementation due to incomplete user collection in + /// large guilds, or the bot doesnt have the MANAGE_EMOJIS_AND_STICKERS permission. + /// + /// + public SocketGuildUser Author + => this.AuthorId.HasValue ? Guild.GetUser(this.AuthorId.Value) : null; + + /// + /// Gets the guild the sticker lives in. + /// + public SocketGuild Guild { get; } + + /// + public ulong? AuthorId { get; set; } + + internal SocketCustomSticker(DiscordSocketClient client, ulong id, SocketGuild guild, ulong? authorId = null) + : base(client, id) + { + this.Guild = guild; + this.AuthorId = authorId; + } + + internal static SocketCustomSticker Create(DiscordSocketClient client, Model model, SocketGuild guild, ulong? authorId = null) + { + var entity = new SocketCustomSticker(client, model.Id, guild, authorId); + entity.Update(model); + return entity; + } + + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + { + if(!Guild.CurrentUser.GuildPermissions.Has(GuildPermission.ManageEmojisAndStickers)) + throw new InvalidOperationException($"Missing permission {nameof(GuildPermission.ManageEmojisAndStickers)}"); + + var model = await GuildHelper.ModifyStickerAsync(this.Discord, this.Guild, this, func, options); + + this.Update(model); + } + + /// + public async Task DeleteAsync(RequestOptions options = null) + { + await GuildHelper.DeleteStickerAsync(Discord, Guild, this, options); + Guild.RemoveSticker(this.Id); + } + + // ICustomSticker + ulong? ICustomSticker.AuthorId + => this.AuthorId; + + IGuild ICustomSticker.Guild + => this.Guild; + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketSticker.cs new file mode 100644 index 0000000000..4b4f6a6053 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketSticker.cs @@ -0,0 +1,68 @@ +using Discord.Rest; +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Sticker; + +namespace Discord.WebSocket +{ + public class SocketSticker : SocketEntity, ISticker + { + /// + public ulong PackId { get; private set; } + + /// + public string Name { get; private set; } + + /// + public string Description { get; private set; } + + /// + public IReadOnlyCollection Tags { get; private set; } + + /// + public string Asset { get; private set; } + + /// + public string PreviewAsset { get; private set; } + + /// + public StickerFormatType FormatType { get; private set; } + + /// + public string GetStickerUrl() + => CDN.GetStickerUrl(this.Id, this.FormatType); + + internal SocketSticker(DiscordSocketClient client, ulong id) + : base(client, id) { } + + internal static SocketSticker Create(DiscordSocketClient client, Model model) + { + var entity = new SocketSticker(client, model.Id); + entity.Update(model); + return entity; + } + + internal virtual void Update(Model model) + { + this.Name = model.Name; + this.Description = model.Desription; + this.PackId = model.PackId; + this.Asset = model.Asset; + this.PreviewAsset = model.PreviewAsset; + this.FormatType = model.FormatType; + + if (model.Tags.IsSpecified) + { + this.Tags = model.Tags.Value.Split(',').Select(x => x.Trim()).ToImmutableArray(); + } + else + { + this.Tags = ImmutableArray.Empty; + } + } + } +} From 9b5a5e498cdfdf9430b4f3b66f86199e27a5db96 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 22 Aug 2021 10:16:23 -0300 Subject: [PATCH 188/494] Stickers pt2 --- src/Discord.Net.Core/Discord.Net.Core.xml | 350 ++++++++++++++---- .../Entities/Messages/IMessage.cs | 7 +- .../Entities/Stickers/ISticker.cs | 4 +- .../Entities/Stickers/IStickerItem.cs | 29 ++ .../Entities/Stickers/StickerPack.cs | 63 ++++ src/Discord.Net.Rest/API/Common/Sticker.cs | 2 + src/Discord.Net.Rest/Discord.Net.Rest.xml | 144 +++++-- .../Entities/Guilds/GuildHelper.cs | 8 +- .../Entities/Guilds/RestGuild.cs | 111 ++++++ .../Entities/Messages/CustomSticker.cs | 73 ++++ .../Entities/Messages/RestMessage.cs | 4 +- .../Entities/Messages/RestUserMessage.cs | 14 +- .../Entities/Messages/Sticker.cs | 52 +-- .../Entities/Messages/StickerItem.cs | 19 +- src/Discord.Net.WebSocket/BaseSocketClient.cs | 14 + .../Discord.Net.WebSocket.csproj | 2 +- .../Discord.Net.WebSocket.xml | 173 +++++++++ .../DiscordShardedClient.cs | 68 ++++ .../DiscordSocketClient.cs | 83 +++++ .../Entities/Guilds/SocketGuild.cs | 12 +- .../Entities/Messages/SocketMessage.cs | 4 +- .../Entities/Messages/SocketUserMessage.cs | 31 +- .../SocketCustomSticker.cs | 4 +- .../{Messages => Stickers}/SocketSticker.cs | 26 +- .../Entities/Stickers/SocketUnknownSticker.cs | 60 +++ 25 files changed, 1185 insertions(+), 172 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs create mode 100644 src/Discord.Net.Core/Entities/Stickers/StickerPack.cs create mode 100644 src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs rename src/Discord.Net.WebSocket/Entities/{Messages => Stickers}/SocketCustomSticker.cs (94%) rename src/Discord.Net.WebSocket/Entities/{Messages => Stickers}/SocketSticker.cs (62%) create mode 100644 src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 94b0c5cf65..989f35ec11 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -212,6 +212,16 @@ A URL pointing to the Spotify track. + + + Gets a stickers url based off the id and format. + + The id of the sticker. + The format of the sticker + + A URL to the sticker. + + Represents a context of a command. This may include the client, guild, channel, user, and message. @@ -3121,6 +3131,14 @@ A read-only collection of all custom emotes for this guild. + + + Gets a collection of all custom stickers for this guild. + + + A read-only collection of all custom stickers for this guild. + + Gets a collection of all extra features added to this guild. @@ -3914,6 +3932,52 @@ A task that represents the asynchronous removal operation. + + + Creates a new sticker in this guild. + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The image of the new emote. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + + + Gets a specific sticker within this guild. + + The id of the sticker to get. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the sticker found with the + specified ; if none is found. + + + + + Gets a collection of all stickers within this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of stickers found within the guild. + + + + + Deletes a sticker within this guild. + + The sticker to delete. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + Gets this guilds slash commands commands @@ -7282,7 +7346,14 @@ The 's attached to this message - + + + Gets all stickers items included in this message. + + + A read-only collection of sticker item objects. + + Gets the flags related to this message. @@ -7411,75 +7482,6 @@ The used in the reaction. - - - Represents a discord sticker. - - - - - Gets the ID of this sticker. - - - A snowflake ID associated with this sticker. - - - - - Gets the ID of the pack of this sticker. - - - A snowflake ID associated with the pack of this sticker. - - - - - Gets the name of this sticker. - - - A with the name of this sticker. - - - - - Gets the description of this sticker. - - - A with the description of this sticker. - - - - - Gets the list of tags of this sticker. - - - A read-only list with the tags of this sticker. - - - - - Gets the asset hash of this sticker. - - - A with the asset hash of this sticker. - - - - - Gets the preview asset hash of this sticker. - - - A with the preview asset hash of this sticker. - - - - - Gets the format type of this sticker. - - - A with the format type of this sticker. - - Represents a generic message sent by the system. @@ -9329,6 +9331,214 @@ otherwise . + + + Represents a custom sticker within a guild. + + + + + Gets the users id who uploaded the sticker. + + + In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. + + + + + Gets the guild that this custom sticker is in. + + + + + Modifies this sticker. + + + This method modifies this sticker with the specified properties. To see an example of this + method and what properties are available, please refer to . +
+
+ The bot needs the MANAGE_EMOJIS_AND_STICKERS permission within the guild in order to modify stickers. +
+ + The following example replaces the name of the sticker with kekw. + + await sticker.ModifyAsync(x => x.Name = "kekw"); + + + A delegate containing the properties to modify the sticker with. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + +
+ + + Deletes the current sticker. + + + The bot neeeds the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. + + The options to be used when sending the request. + + A task that represents the asynchronous deletion operation. + + + + + Represents a discord sticker. + + + + + Gets the ID of this sticker. + + + A snowflake ID associated with this sticker. + + + + + Gets the ID of the pack of this sticker. + + + A snowflake ID associated with the pack of this sticker. + + + + + Gets the name of this sticker. + + + A with the name of this sticker. + + + + + Gets the description of this sticker. + + + A with the description of this sticker. + + + + + Gets the list of tags of this sticker. + + + A read-only list with the tags of this sticker. + + + + + Gets the asset hash of this sticker. + + + A with the asset hash of this sticker. + + + + + Gets the preview asset hash of this sticker. + + + A with the preview asset hash of this sticker. + + + + + Gets the format type of this sticker. + + + A with the format type of this sticker. + + + + + Gets the image url for this sticker. + + + + + Represents a partial sticker item received with a message. + + + + + The id of the sticker. + + + + + The name of the sticker. + + + + + The format of the sticker. + + + + + Represents a discord sticker pack. + + The type of the stickers within the collection + + + + Gets the id of the sticker pack. + + + + + Gets a collection of the stickers in the pack. + + + + + Gets the name of the sticker pack. + + + + + Gets the id of the pack's SKU. + + + + + Gets the id of a sticker in the pack which is shown as the pack's icon. + + + + + Gets the description of the sticker pack. + + + + + Gets the id of the sticker pack's banner image + + + + + Represents a class used to modify stickers. + + + + + Gets or sets the name of the sticker. + + + + + Gets or sets the description of the sticker. + + + + + Gets or sets the tags of the sticker. + + Represents a Discord Team. diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index f80abbe38f..39419f0683 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -169,12 +169,13 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// IReadOnlyCollection Components { get; } - /// Gets all stickers included in this message. + /// + /// Gets all stickers items included in this message. /// /// - /// A read-only collection of sticker objects. + /// A read-only collection of sticker item objects. /// - IReadOnlyCollection Stickers { get; } + IReadOnlyCollection Stickers { get; } /// /// Gets the flags related to this message. diff --git a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs index eca613051a..e16e039906 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs @@ -7,7 +7,7 @@ namespace Discord /// /// Represents a discord sticker. /// - public interface ISticker + public interface ISticker : IStickerItem { /// /// Gets the ID of this sticker. @@ -64,7 +64,7 @@ public interface ISticker /// /// A with the format type of this sticker. /// - StickerFormatType FormatType { get; } + StickerFormatType Format { get; } /// /// Gets the image url for this sticker. diff --git a/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs b/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs new file mode 100644 index 0000000000..3825a27026 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a partial sticker item received with a message. + /// + public interface IStickerItem + { + /// + /// The id of the sticker. + /// + ulong Id { get; } + + /// + /// The name of the sticker. + /// + string Name { get; } + + /// + /// The format of the sticker. + /// + StickerFormatType Format { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs new file mode 100644 index 0000000000..b0750efc16 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a discord sticker pack. + /// + /// The type of the stickers within the collection + public class StickerPack where TSticker : ISticker + { + /// + /// Gets the id of the sticker pack. + /// + public ulong Id { get; } + + /// + /// Gets a collection of the stickers in the pack. + /// + public IReadOnlyCollection Stickers { get; } + + /// + /// Gets the name of the sticker pack. + /// + public string Name { get; } + + /// + /// Gets the id of the pack's SKU. + /// + public ulong SkuId { get; } + + /// + /// Gets the id of a sticker in the pack which is shown as the pack's icon. + /// + public ulong? CoverStickerId { get; } + + /// + /// Gets the description of the sticker pack. + /// + public string Description { get; } + + /// + /// Gets the id of the sticker pack's banner image + /// + public ulong BannerAssetId { get; } + + internal StickerPack(string name, ulong id, ulong skuid, ulong? coverStickerId, string description, ulong bannerAssetId, IEnumerable stickers) + { + this.Name = name; + this.Id = id; + this.SkuId = skuid; + this.CoverStickerId = coverStickerId; + this.Description = description; + this.BannerAssetId = bannerAssetId; + + this.Stickers = stickers.ToImmutableArray(); + } + } +} diff --git a/src/Discord.Net.Rest/API/Common/Sticker.cs b/src/Discord.Net.Rest/API/Common/Sticker.cs index 31bd973701..da171a802e 100644 --- a/src/Discord.Net.Rest/API/Common/Sticker.cs +++ b/src/Discord.Net.Rest/API/Common/Sticker.cs @@ -21,6 +21,8 @@ internal class Sticker public string PreviewAsset { get; set; } [JsonProperty("format_type")] public StickerFormatType FormatType { get; set; } + [JsonProperty("guild_id")] + public Optional GuildId { get; set; } [JsonProperty("user")] public Optional User { get; set; } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 8aa36360f2..4cb5f6e021 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3527,6 +3527,50 @@ + + + Creates a new sticker in this guild. + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The image of the new emote. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + + + Gets a specific sticker within this guild. + + The id of the sticker to get. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the sticker found with the + specified ; if none is found. + + + + + Gets a collection of all stickers within this guild. + + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of stickers found within the guild. + + + + + Deletes a sticker within this guild. + + The sticker to delete. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + @@ -3970,6 +4014,33 @@ + + + Represents a Rest-based custom sticker within a guild. + + + + + Gets the users id who uploaded the sticker. + + + In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. + + + + + Gets the guild that this custom sticker is in. + + + Note: This property can be if the sticker wasnt fetched from a guild. + + + + + + + + Regex used to check if some text is formatted as inline code. @@ -4268,6 +4339,52 @@ This operation may only be called on a channel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a partial sticker received in a message. + + + + + + + + + + + Resolves this sticker item by fetching the from the API. + + + A task representing the download operation, the result of the task is a sticker object. + + Represents a REST-based entity that contains information about a Discord application created via the developer portal. @@ -4870,32 +4987,5 @@ A string containing the filename of this attachment. - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 820461e9a3..bedb9de2f6 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -559,7 +559,7 @@ public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulon return await client.ApiClient.CreateGuildStickerAsync(apiArgs, guild.Id, options).ConfigureAwait(false); } - public static async Task ModifyStickerAsync(BaseDiscordClient client, IGuild guild, ISticker sticker, Action func, + public static async Task ModifyStickerAsync(BaseDiscordClient client, ulong guildId, ISticker sticker, Action func, RequestOptions options = null) { if (func == null) @@ -577,10 +577,10 @@ public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulon Optional.Unspecified }; - return await client.ApiClient.ModifyStickerAsync(apiArgs, guild.Id, sticker.Id, options).ConfigureAwait(false); + return await client.ApiClient.ModifyStickerAsync(apiArgs, guildId, sticker.Id, options).ConfigureAwait(false); } - public static async Task DeleteStickerAsync(BaseDiscordClient client, IGuild guild, ISticker sticker, RequestOptions options = null) - => await client.ApiClient.DeleteStickerAsync(guild.Id, sticker.Id, options).ConfigureAwait(false); + public static async Task DeleteStickerAsync(BaseDiscordClient client, ulong guildId, ISticker sticker, RequestOptions options = null) + => await client.ApiClient.DeleteStickerAsync(guildId, sticker.Id, options).ConfigureAwait(false); } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 126a211c85..e87e24b255 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -19,6 +19,7 @@ public class RestGuild : RestEntity, IGuild, IUpdateable { private ImmutableDictionary _roles; private ImmutableArray _emotes; + private ImmutableArray _stickers; private ImmutableArray _features; /// @@ -112,6 +113,7 @@ public class RestGuild : RestEntity, IGuild, IUpdateable public IReadOnlyCollection Roles => _roles.ToReadOnlyCollection(); /// public IReadOnlyCollection Emotes => _emotes; + public IReadOnlyCollection Stickers => _stickers; /// public IReadOnlyCollection Features => _features; @@ -190,6 +192,23 @@ internal void Update(Model model) } _roles = roles.ToImmutable(); + if (model.Stickers != null) + { + var stickers = new ImmutableArray(); + for (int i = 0; i < model.Stickers.Length; i++) + { + var sticker = model.Stickers[i]; + + var entity = CustomSticker.Create(Discord, sticker, this, sticker.User.IsSpecified ? sticker.User.Value.Id : null); + + stickers.Add(entity); + } + + _stickers = stickers; + } + else + _stickers = new ImmutableArray(); + Available = true; } internal void Update(WidgetModel model) @@ -908,6 +927,78 @@ public Task ModifyEmoteAsync(GuildEmote emote, Action GuildHelper.DeleteEmoteAsync(this, Discord, emote.Id, options); + //Stickers + /// + /// Creates a new sticker in this guild. + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The image of the new emote. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + public async Task CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options = null) + { + var model = await GuildHelper.CreateStickerAsync(Discord, this, name, description, tags, image, options).ConfigureAwait(false); + + return CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null); + } + /// + /// Gets a specific sticker within this guild. + /// + /// The id of the sticker to get. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains the sticker found with the + /// specified ; if none is found. + /// + public async Task GetStickerAsync(ulong id, RequestOptions options = null) + { + var model = await Discord.ApiClient.GetGuildStickerAsync(this.Id, id, options).ConfigureAwait(false); + + if (model == null) + return null; + + return CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null); + } + /// + /// Gets a collection of all stickers within this guild. + /// + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous get operation. The task result contains a read-only collection + /// of stickers found within the guild. + /// + public async Task> GetStickersAsync(RequestOptions options = null) + { + var models = await Discord.ApiClient.ListGuildStickersAsync(this.Id, options).ConfigureAwait(false); + + if (models.Length == 0) + return null; + + List stickers = new List(); + + foreach(var model in models) + { + var entity = CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null); + stickers.Add(entity); + } + + return stickers.ToImmutableArray(); + } + /// + /// Deletes a sticker within this guild. + /// + /// The sticker to delete. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous removal operation. + /// + public Task DeleteStickerAsync(CustomSticker sticker, RequestOptions options = null) + => sticker.DeleteAsync(options); + //IGuild /// bool IGuild.Available => Available; @@ -918,6 +1009,8 @@ public Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null) /// IReadOnlyCollection IGuild.Roles => Roles; + IReadOnlyCollection IGuild.Stickers => Stickers; + /// async Task> IGuild.GetBansAsync(RequestOptions options) => await GetBansAsync(options).ConfigureAwait(false); @@ -1169,5 +1262,23 @@ async Task> IGuild.GetWebhooksAsync(RequestOptions /// async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) => await GetApplicationCommandsAsync(options).ConfigureAwait(false); + async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options) + => await CreateStickerAsync(name, description, tags, image, options); + async Task IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options) + { + if (mode != CacheMode.AllowDownload) + return null; + + return await GetStickerAsync(id, options); + } + async Task> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options) + { + if (mode != CacheMode.AllowDownload) + return null; + + return await GetStickersAsync(options); + } + Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) + => sticker.DeleteAsync(); } } diff --git a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs new file mode 100644 index 0000000000..41462572cf --- /dev/null +++ b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Sticker; + +namespace Discord.Rest +{ + /// + /// Represents a Rest-based custom sticker within a guild. + /// + public class CustomSticker : Sticker, ICustomSticker + { + /// + /// Gets the users id who uploaded the sticker. + /// + /// + /// In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. + /// + public ulong? AuthorId { get; private set; } + + /// + /// Gets the guild that this custom sticker is in. + /// + /// + /// Note: This property can be if the sticker wasnt fetched from a guild. + /// + public RestGuild Guild { get; private set; } + + private ulong GuildId { get; set; } + + internal CustomSticker(BaseDiscordClient client, ulong id, RestGuild guild, ulong? authorId = null) + : base(client, id) + { + this.AuthorId = authorId; + this.Guild = guild; + } + internal CustomSticker(BaseDiscordClient client, ulong id, ulong guildId, ulong? authorId = null) + : base(client, id) + { + this.AuthorId = authorId; + this.GuildId = guildId; + } + + internal static CustomSticker Create(BaseDiscordClient client, Model model, RestGuild guild, ulong? authorId = null) + { + var entity = new CustomSticker(client, model.Id, guild, authorId); + entity.Update(model); + return entity; + } + + internal static CustomSticker Create(BaseDiscordClient client, Model model, ulong guildId, ulong? authorId = null) + { + var entity = new CustomSticker(client, model.Id, guildId, authorId); + entity.Update(model); + return entity; + } + + /// + public Task DeleteAsync(RequestOptions options = null) + => GuildHelper.DeleteStickerAsync(Discord, GuildId, this, options); + + /// + public async Task ModifyAsync(Action func, RequestOptions options = null) + { + var model = await GuildHelper.ModifyStickerAsync(Discord, GuildId, this, func, options); + Update(model); + } + + IGuild ICustomSticker.Guild => Guild; + } +} diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index c9aba15f82..cc77beba28 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -60,7 +60,7 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); /// - public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); + public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); /// public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); @@ -236,7 +236,7 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.Components => Components; /// - IReadOnlyCollection IMessage.Stickers => Stickers; + IReadOnlyCollection IMessage.Stickers => Stickers; /// public IReadOnlyDictionary Reactions => _reactions.ToDictionary(x => x.Emote, x => new ReactionMetadata { ReactionCount = x.Count, IsMe = x.Me }); diff --git a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs index aa6b44da6e..e6f3ac30d4 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs @@ -21,7 +21,7 @@ public class RestUserMessage : RestMessage, IUserMessage private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentionIds = ImmutableArray.Create(); private ImmutableArray _userMentions = ImmutableArray.Create(); - private ImmutableArray _stickers = ImmutableArray.Create(); + private ImmutableArray _stickers = ImmutableArray.Create(); /// public override bool IsTTS => _isTTS; @@ -46,7 +46,7 @@ public class RestUserMessage : RestMessage, IUserMessage /// public override IReadOnlyCollection Tags => _tags; /// - public override IReadOnlyCollection Stickers => _stickers; + public override IReadOnlyCollection Stickers => _stickers; /// public IUserMessage ReferencedMessage => _referencedMessage; @@ -136,18 +136,18 @@ internal override void Update(Model model) _referencedMessage = RestUserMessage.Create(Discord, Channel, refMsgAuthor, refMsg); } - if (model.Stickers.IsSpecified) + if (model.StickerItems.IsSpecified) { - var value = model.Stickers.Value; + var value = model.StickerItems.Value; if (value.Length > 0) { - var stickers = ImmutableArray.CreateBuilder(value.Length); + var stickers = ImmutableArray.CreateBuilder(value.Length); for (int i = 0; i < value.Length; i++) - stickers.Add(Sticker.Create(value[i])); + stickers.Add(new StickerItem(Discord, value[i])); _stickers = stickers.ToImmutable(); } else - _stickers = ImmutableArray.Create(); + _stickers = ImmutableArray.Create(); } } diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index aa4960f5be..6a5d35a3bf 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -3,45 +3,49 @@ using System.Linq; using Model = Discord.API.Sticker; -namespace Discord +namespace Discord.Rest { /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] - public class Sticker : ISticker + public class Sticker : RestEntity, ISticker { /// - public ulong Id { get; } + public ulong PackId { get; internal set; } /// - public ulong PackId { get; } + public string Name { get; internal set; } /// - public string Name { get; } + public string Description { get; internal set; } /// - public string Description { get; } + public IReadOnlyCollection Tags { get; internal set; } /// - public IReadOnlyCollection Tags { get; } + public string Asset { get; internal set; } /// - public string Asset { get; } + public string PreviewAsset { get; internal set; } /// - public string PreviewAsset { get; } - /// - public StickerFormatType FormatType { get; } + public StickerFormatType Format { get; internal set; } + + /// + public string GetStickerUrl() + => CDN.GetStickerUrl(this.Id, this.Format); - internal Sticker(ulong id, ulong packId, string name, string description, string[] tags, string asset, string previewAsset, StickerFormatType formatType) + internal Sticker(BaseDiscordClient client, ulong id) + : base(client, id) { } + internal static Sticker Create(BaseDiscordClient client, Model model) { - Id = id; - PackId = packId; - Name = name; - Description = description; - Tags = tags.ToReadOnlyCollection(); - Asset = asset; - PreviewAsset = previewAsset; - FormatType = formatType; + var entity = new Sticker(client, model.Id); + entity.Update(model); + return entity; } - internal static Sticker Create(Model model) + + internal void Update(Model model) { - return new Sticker(model.Id, model.PackId, model.Name, model.Desription, - model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0], - model.Asset, model.PreviewAsset, model.FormatType); + PackId = model.PackId; + Name = model.Name; + Description = model.Desription; + Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0]; + Asset = model.Asset; + PreviewAsset = model.PreviewAsset; + Format = model.FormatType; } private string DebuggerDisplay => $"{Name} ({Id})"; diff --git a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs index 61284e6040..dade33bb97 100644 --- a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs +++ b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs @@ -10,17 +10,13 @@ namespace Discord.Rest /// /// Represents a partial sticker received in a message. /// - public class StickerItem : RestEntity + public class StickerItem : RestEntity, IStickerItem { - /// - /// The name of this sticker. - /// - public readonly string Name; + /// + public string Name { get; } - /// - /// The format of this sticker. - /// - public readonly StickerFormatType Format; + /// + public StickerFormatType Format { get; } internal StickerItem(BaseDiscordClient client, Model model) : base(client, model.Id) @@ -40,7 +36,10 @@ public async Task ResolveStickerAsync() { var model = await Discord.ApiClient.GetStickerAsync(this.Id); - return Sticker.Create(model); + if (model.GuildId.IsSpecified) + return CustomSticker.Create(Discord, model, model.GuildId.Value, model.User.IsSpecified ? model.User.Value.Id : null); + else + return Sticker.Create(Discord, model); } } } diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.cs b/src/Discord.Net.WebSocket/BaseSocketClient.cs index 1cfe6c8bfb..e8c5ca6caa 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.cs @@ -44,6 +44,10 @@ public abstract partial class BaseSocketClient : BaseDiscordClient, IDiscordClie internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; + /// + /// Gets a collection of default stickers. + /// + public abstract IReadOnlyCollection> DefaultStickerPacks { get; } /// /// Gets the current logged-in user. /// @@ -268,6 +272,16 @@ public Task> GetConnectionsAsync(RequestOpti /// public Task GetInviteAsync(string inviteId, RequestOptions options = null) => ClientHelper.GetInviteAsync(this, inviteId, options ?? RequestOptions.Default); + /// + /// Gets a sticker. + /// + /// Whether or not to allow downloading from the api. + /// The id of the sticker to get. + /// The options to be used when sending the request. + /// + /// A if found, otherwise . + /// + public abstract Task GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); // IDiscordClient /// diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 167ccebb08..bcaf81f317 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -20,7 +20,7 @@ 3.0.1 - TRACE; + TRACE;DEBUG;DEBUG_PACKETS diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 61e22ffaab..60a45c0059 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -118,6 +118,11 @@ Provides access to a REST-only client with a shared state from this client. + + + Gets a collection of default stickers. + + Gets the current logged-in user. @@ -349,6 +354,17 @@ A task that represents the asynchronous get operation. The task result contains the invite information. + + + Gets a sticker. + + Whether or not to allow downloading from the api. + The id of the sticker to get. + The options to be used when sending the request. + + A if found, otherwise . + + @@ -820,6 +836,9 @@ + + + @@ -858,6 +877,9 @@ + + + @@ -959,6 +981,9 @@ + + + @@ -1083,6 +1108,16 @@ Clears cached users from the client. + + + + + + Gets a sticker. + + The unique identifier of the sticker. + A sticker if found, otherwise . + @@ -3030,6 +3065,11 @@ + + + Gets a collection of all custom stickers for this guild. + + @@ -3438,6 +3478,59 @@ + + + Gets a specific sticker within this guild. + + The id of the sticker to get. + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains the sticker found with the + specified ; if none is found. + + + + + Gets a specific sticker within this guild. + + The id of the sticker to get. + A sticker, if none is found then . + + + + Gets a collection of all stickers within this guild. + + The that determines whether the object should be fetched from cache. + The options to be used when sending the request. + + A task that represents the asynchronous get operation. The task result contains a read-only collection + of stickers found within the guild. + + + + + Creates a new sticker in this guild. + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The image of the new emote. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + + + Deletes a sticker within this guild. + + The sticker to delete. + The options to be used when sending the request. + + A task that represents the asynchronous removal operation. + + Gets the name of the guild. @@ -3479,6 +3572,9 @@ + + + @@ -4417,6 +4513,83 @@ + + + Gets the user that uploaded the guild sticker. + + + + This may return in the WebSocket implementation due to incomplete user collection in + large guilds, or the bot doesnt have the MANAGE_EMOJIS_AND_STICKERS permission. + + + + + + Gets the guild the sticker lives in. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents an unknown sticker received over the gateway. + + + + + + + + + + + + + + + + + + + + Attempts to try to find the sticker. + + + The sticker representing this unknown stickers Id, if none is found then . + + Represents a WebSocket-based group user. diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 450145f1cd..30ec5ef198 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Threading.Tasks; using System.Threading; +using System.Collections.Immutable; namespace Discord.WebSocket { @@ -16,6 +17,7 @@ public partial class DiscordShardedClient : BaseSocketClient, IDiscordClient private readonly bool _automaticShards; private int[] _shardIds; private DiscordSocketClient[] _shards; + private ImmutableArray> _defaultStickers; private int _totalShards; private SemaphoreSlim[] _identifySemaphores; private object _semaphoreResetLock; @@ -40,6 +42,10 @@ public partial class DiscordShardedClient : BaseSocketClient, IDiscordClient return base.ApiClient; } } + /// + public override IReadOnlyCollection> DefaultStickerPacks + => _defaultStickers.ToReadOnlyCollection(); + /// public override IReadOnlyCollection Guilds => GetGuilds().ToReadOnlyCollection(GetGuildCount); /// @@ -77,6 +83,7 @@ private DiscordShardedClient(int[] ids, DiscordSocketConfig config, API.DiscordS _shardIdsToIndex = new Dictionary(); config.DisplayInitialLog = false; _baseConfig = config; + _defaultStickers = new ImmutableArray>(); if (config.TotalShards == null) _automaticShards = true; @@ -155,6 +162,10 @@ internal override async Task OnLoginAsync(TokenType tokenType, string token) //Assume thread safe: already in a connection lock for (int i = 0; i < _shards.Length; i++) await _shards[i].LoginAsync(tokenType, token); + + if(this._defaultStickers.Length == 0) + await DownloadDefaultStickersAsync().ConfigureAwait(false); + } internal override async Task OnLogoutAsync() { @@ -247,6 +258,63 @@ private int GetGuildCount() result += _shards[i].Guilds.Count; return result; } + /// + public override async Task GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + { + var sticker = _defaultStickers.FirstOrDefault(x => x.Stickers.Any(y => y.Id == id))?.Stickers.FirstOrDefault(x => x.Id == id); + + if (sticker != null) + return sticker; + + foreach (var guild in Guilds) + { + sticker = await guild.GetStickerAsync(id, CacheMode.CacheOnly).ConfigureAwait(false); + + if (sticker != null) + return sticker; + } + + if (mode == CacheMode.CacheOnly) + return null; + + var model = await ApiClient.GetStickerAsync(id, options).ConfigureAwait(false); + + if (model == null) + return null; + + + if (model.GuildId.IsSpecified) + { + var guild = GetGuild(model.GuildId.Value); + sticker = guild.AddOrUpdateSticker(model); + return sticker; + } + else + { + return SocketSticker.Create(_shards[0], model); + } + } + private async Task DownloadDefaultStickersAsync() + { + var models = await ApiClient.ListNitroStickerPacksAsync().ConfigureAwait(false); + + foreach(var model in models.StickerPacks) + { + var stickers = model.Stickers.Select(x => SocketSticker.Create(_shards[0], x)); + + var pack = new StickerPack( + model.Name, + model.Id, + model.SkuId, + model.CoverStickerId.ToNullable(), + model.Description, + model.BannerAssetId, + stickers + ); + + _defaultStickers.Add(pack); + } + } /// public override SocketUser GetUser(ulong id) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 52a5d309db..789f4aa53c 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -44,6 +44,7 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient private RestApplication _applicationInfo; private bool _isDisposed; private GatewayIntents _gatewayIntents; + private ImmutableArray> _defaultStickers; /// /// Provides access to a REST-only client with a shared state from this client. @@ -76,6 +77,17 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; /// public override IReadOnlyCollection Guilds => State.Guilds; + /// + public override IReadOnlyCollection> DefaultStickerPacks + { + get + { + if (this._shardedClient != null) + return this._shardedClient.DefaultStickerPacks; + else + return _defaultStickers.ToReadOnlyCollection(); + } + } /// public override IReadOnlyCollection PrivateChannels => State.PrivateChannels; /// @@ -137,6 +149,7 @@ private DiscordSocketClient(DiscordSocketConfig config, API.DiscordSocketApiClie Rest = new DiscordSocketRestClient(config, ApiClient); _heartbeatTimes = new ConcurrentQueue(); _gatewayIntents = config.GatewayIntents; + _defaultStickers = new ImmutableArray>(); _stateLock = new SemaphoreSlim(1, 1); _gatewayLogger = LogManager.CreateLogger(ShardId == 0 && TotalShards == 1 ? "Gateway" : $"Shard #{ShardId}"); @@ -195,6 +208,31 @@ internal override void Dispose(bool disposing) base.Dispose(disposing); } + internal override async Task OnLoginAsync(TokenType tokenType, string token) + { + if(this._shardedClient != null && this._defaultStickers.Length == 0) + { + var models = await ApiClient.ListNitroStickerPacksAsync().ConfigureAwait(false); + + foreach (var model in models.StickerPacks) + { + var stickers = model.Stickers.Select(x => SocketSticker.Create(this, x)); + + var pack = new StickerPack( + model.Name, + model.Id, + model.SkuId, + model.CoverStickerId.ToNullable(), + model.Description, + model.BannerAssetId, + stickers + ); + + _defaultStickers.Add(pack); + } + } + } + /// internal override async Task OnLogoutAsync() { @@ -368,6 +406,51 @@ internal SocketGlobalUser GetOrCreateSelfUser(ClientState state, Discord.API.Use internal void RemoveUser(ulong id) => State.RemoveUser(id); + /// + public override async Task GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + { + var sticker = _defaultStickers.FirstOrDefault(x => x.Stickers.Any(y => y.Id == id))?.Stickers.FirstOrDefault(x => x.Id == id); + + if (sticker != null) + return sticker; + + foreach(var guild in Guilds) + { + sticker = await guild.GetStickerAsync(id, CacheMode.CacheOnly).ConfigureAwait(false); + + if (sticker != null) + return sticker; + } + + if (mode == CacheMode.CacheOnly) + return null; + + var model = await ApiClient.GetStickerAsync(id, options).ConfigureAwait(false); + + if(model == null) + return null; + + + if (model.GuildId.IsSpecified) + { + var guild = State.GetGuild(model.GuildId.Value); + sticker = guild.AddOrUpdateSticker(model); + return sticker; + } + else + { + return SocketSticker.Create(this, model); + } + } + + /// + /// Gets a sticker. + /// + /// The unique identifier of the sticker. + /// A sticker if found, otherwise . + public SocketSticker GetSticker(ulong id) + => GetStickerAsync(id, CacheMode.CacheOnly).GetAwaiter().GetResult(); + /// public override async ValueTask> GetVoiceRegionsAsync(RequestOptions options = null) { diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 2521d6b2bd..390bc0512d 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -533,6 +533,8 @@ internal void Update(ClientState state, Model model) stickers.TryAdd(sticker.Id, entity); } + + _stickers = stickers; } else _stickers = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, 7); @@ -1192,6 +1194,13 @@ public async ValueTask GetStickerAsync(ulong id, CacheMode return AddOrUpdateSticker(model); } /// + /// Gets a specific sticker within this guild. + /// + /// The id of the sticker to get. + /// A sticker, if none is found then . + public SocketCustomSticker GetSticker(ulong id) + => GetStickerAsync(id, CacheMode.CacheOnly).GetAwaiter().GetResult(); + /// /// Gets a collection of all stickers within this guild. /// /// The that determines whether the object should be fetched from cache. @@ -1629,7 +1638,8 @@ async Task IGuild.GetStickerAsync(ulong id, CacheMode mode, Requ => await GetStickerAsync(id, mode, options); async Task> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options) => await GetStickersAsync(mode, options); - Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) => throw new NotImplementedException(); + Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) + => DeleteStickerAsync(_stickers[sticker.Id], options); void IDisposable.Dispose() { diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 1b62d14dd8..167440069a 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -106,7 +106,7 @@ public abstract class SocketMessage : SocketEntity, IMessage /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); /// - public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); + public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); /// public IReadOnlyDictionary Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); @@ -261,7 +261,7 @@ public Task DeleteAsync(RequestOptions options = null) IReadOnlyCollection IMessage.Components => Components; /// - IReadOnlyCollection IMessage.Stickers => Stickers; + IReadOnlyCollection IMessage.Stickers => Stickers; internal void AddReaction(SocketReaction reaction) { diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 597544f4d6..8127d54f5a 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -23,7 +23,7 @@ public class SocketUserMessage : SocketMessage, IUserMessage private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentions = ImmutableArray.Create(); private ImmutableArray _userMentions = ImmutableArray.Create(); - private ImmutableArray _stickers = ImmutableArray.Create(); + private ImmutableArray _stickers = ImmutableArray.Create(); /// public override bool IsTTS => _isTTS; @@ -48,7 +48,7 @@ public class SocketUserMessage : SocketMessage, IUserMessage /// public override IReadOnlyCollection MentionedUsers => _userMentions; /// - public override IReadOnlyCollection Stickers => _stickers; + public override IReadOnlyCollection Stickers => _stickers; /// public IUserMessage ReferencedMessage => _referencedMessage; @@ -162,18 +162,35 @@ internal override void Update(ClientState state, Model model) _referencedMessage = SocketUserMessage.Create(Discord, state, refMsgAuthor, Channel, refMsg); } - if (model.Stickers.IsSpecified) + if (model.StickerItems.IsSpecified) { - var value = model.Stickers.Value; + var value = model.StickerItems.Value; if (value.Length > 0) { - var stickers = ImmutableArray.CreateBuilder(value.Length); + var stickers = ImmutableArray.CreateBuilder(value.Length); for (int i = 0; i < value.Length; i++) - stickers.Add(Sticker.Create(value[i])); + { + var stickerItem = value[i]; + SocketSticker sticker = null; + + if (guild != null) + { + sticker = guild.GetSticker(stickerItem.Id); + } + + if(sticker == null) + { + sticker = Discord.GetSticker(stickerItem.Id); + } + + // if its still null, create an unknown + sticker = SocketUnknownSticker.Create(Discord, stickerItem); + } + _stickers = stickers.ToImmutable(); } else - _stickers = ImmutableArray.Create(); + _stickers = ImmutableArray.Create(); } } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs similarity index 94% rename from src/Discord.Net.WebSocket/Entities/Messages/SocketCustomSticker.cs rename to src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index 4e00873c78..b8c29ed353 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -51,7 +51,7 @@ public async Task ModifyAsync(Action func, RequestOptions opt if(!Guild.CurrentUser.GuildPermissions.Has(GuildPermission.ManageEmojisAndStickers)) throw new InvalidOperationException($"Missing permission {nameof(GuildPermission.ManageEmojisAndStickers)}"); - var model = await GuildHelper.ModifyStickerAsync(this.Discord, this.Guild, this, func, options); + var model = await GuildHelper.ModifyStickerAsync(this.Discord, this.Guild.Id, this, func, options); this.Update(model); } @@ -59,7 +59,7 @@ public async Task ModifyAsync(Action func, RequestOptions opt /// public async Task DeleteAsync(RequestOptions options = null) { - await GuildHelper.DeleteStickerAsync(Discord, Guild, this, options); + await GuildHelper.DeleteStickerAsync(Discord, this.Guild.Id, this, options); Guild.RemoveSticker(this.Id); } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs similarity index 62% rename from src/Discord.Net.WebSocket/Entities/Messages/SocketSticker.cs rename to src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index 4b4f6a6053..b450e4c367 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -12,36 +12,42 @@ namespace Discord.WebSocket public class SocketSticker : SocketEntity, ISticker { /// - public ulong PackId { get; private set; } + public virtual ulong PackId { get; private set; } /// - public string Name { get; private set; } + public string Name { get; internal set; } /// - public string Description { get; private set; } + public virtual string Description { get; private set; } /// - public IReadOnlyCollection Tags { get; private set; } + public virtual IReadOnlyCollection Tags { get; private set; } /// - public string Asset { get; private set; } + public virtual string Asset { get; private set; } /// - public string PreviewAsset { get; private set; } + public virtual string PreviewAsset { get; private set; } /// - public StickerFormatType FormatType { get; private set; } + public StickerFormatType Format { get; internal set; } /// public string GetStickerUrl() - => CDN.GetStickerUrl(this.Id, this.FormatType); + => CDN.GetStickerUrl(this.Id, this.Format); internal SocketSticker(DiscordSocketClient client, ulong id) : base(client, id) { } internal static SocketSticker Create(DiscordSocketClient client, Model model) { - var entity = new SocketSticker(client, model.Id); + SocketSticker entity; + + if (model.GuildId.IsSpecified) + entity = new SocketCustomSticker(client, model.Id, client.GetGuild(model.GuildId.Value), model.User.IsSpecified ? model.User.Value.Id : null); + else + entity = new SocketSticker(client, model.Id); + entity.Update(model); return entity; } @@ -53,7 +59,7 @@ internal virtual void Update(Model model) this.PackId = model.PackId; this.Asset = model.Asset; this.PreviewAsset = model.PreviewAsset; - this.FormatType = model.FormatType; + this.Format = model.FormatType; if (model.Tags.IsSpecified) { diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs new file mode 100644 index 0000000000..b54af37294 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.StickerItem; + +namespace Discord.WebSocket +{ + /// + /// Represents an unknown sticker received over the gateway. + /// + public class SocketUnknownSticker : SocketSticker + { + /// + public override string Asset + => null; + + /// + public override IReadOnlyCollection Tags + => null; + + /// + public override string Description + => null; + + /// + public override ulong PackId + => 0; + + /// + public override string PreviewAsset + => null; + + internal SocketUnknownSticker(DiscordSocketClient client, ulong id) + : base(client, id) { } + + internal static SocketUnknownSticker Create(DiscordSocketClient client, Model model) + { + var entity = new SocketUnknownSticker(client, model.Id); + entity.Update(model); + return entity; + } + + internal void Update(Model model) + { + this.Name = model.Name; + this.Format = model.FormatType; + } + + /// + /// Attempts to try to find the sticker. + /// + /// + /// The sticker representing this unknown stickers Id, if none is found then . + /// + public Task ResolveAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + => Discord.GetStickerAsync(this.Id, mode, options); + } +} From 39fa586b59a0975c15abef582489256d754e4f62 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 23 Aug 2021 10:00:49 -0300 Subject: [PATCH 189/494] Stickers pt3 --- .../API/Rest/CreateStickerParams.cs | 2 +- .../Entities/Messages/CustomSticker.cs | 4 ++ .../API/Gateway/GuildStickerUpdateEvent.cs | 18 +++++++ .../BaseSocketClient.Events.cs | 30 +++++++++++ .../Discord.Net.WebSocket.xml | 28 ++++++++++ .../DiscordSocketClient.cs | 53 +++++++++++++++++++ .../Entities/Stickers/SocketCustomSticker.cs | 9 ++++ .../Entities/Stickers/SocketSticker.cs | 27 ++++++++++ .../Entities/Stickers/SocketUnknownSticker.cs | 4 ++ 9 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs diff --git a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs index 291052f3a3..be9cb05f04 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs @@ -20,7 +20,7 @@ public IReadOnlyDictionary ToDictionary() { var d = new Dictionary(); - d["file"] = new MultipartFile(File, Name); + d["file"] = new MultipartFile(File, Name + ".dat"); d["name"] = Name; d["description"] = Description; diff --git a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs index 41462572cf..5307c49200 100644 --- a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,6 +11,7 @@ namespace Discord.Rest /// /// Represents a Rest-based custom sticker within a guild. /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class CustomSticker : Sticker, ICustomSticker { /// @@ -68,6 +70,8 @@ public async Task ModifyAsync(Action func, RequestOptions opt Update(model); } + private string DebuggerDisplay => this.Guild != null ? $"{Name} in {Guild.Name} ({Id})" : $"{Name} ({Id})"; + IGuild ICustomSticker.Guild => Guild; } } diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs new file mode 100644 index 0000000000..8f3ba683b9 --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs @@ -0,0 +1,18 @@ +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 GuildStickerUpdateEvent + { + [JsonProperty("guild_id")] + public ulong GuildId { get; set; } + + [JsonProperty("stickers")] + public Sticker[] Stickers { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 4982655d7f..1ed489aa5f 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -651,5 +651,35 @@ public event Func SpeakerRemoved remove { _speakerRemoved.Remove(value); } } internal readonly AsyncEvent> _speakerRemoved = new AsyncEvent>(); + + /// + /// Fired when a sticker in a guild is created. + /// + public event Func GuildStickerCreated + { + add { _guildStickerCreated.Add(value); } + remove { _guildStickerCreated.Remove(value); } + } + internal readonly AsyncEvent> _guildStickerCreated = new AsyncEvent>(); + + /// + /// Fired when a sticker in a guild is updated. + /// + public event Func GuildStickerUpdated + { + add { _guildStickerUpdated.Add(value); } + remove { _guildStickerUpdated.Remove(value); } + } + internal readonly AsyncEvent> _guildStickerUpdated = new AsyncEvent>(); + + /// + /// Fired when a sticker in a guild is deleted. + /// + public event Func GuildStickerDeleted + { + add { _guildStickerDeleted.Add(value); } + remove { _guildStickerDeleted.Remove(value); } + } + internal readonly AsyncEvent> _guildStickerDeleted = new AsyncEvent>(); } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 60a45c0059..2649e0aac4 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -827,6 +827,21 @@ Fired when a speaker is removed from a stage channel. + + + Fired when a sticker in a guild is created. + + + + + Fired when a sticker in a guild is updated. + + + + + Fired when a sticker in a guild is deleted. + + @@ -4513,6 +4528,11 @@ + + + Represents a custom sticker within a guild received over the gateway. + + Gets the user that uploaded the guild sticker. @@ -4538,6 +4558,11 @@ + + + Represents a general sticker received over the gateway. + + @@ -4562,6 +4587,9 @@ + + + Represents an unknown sticker received over the gateway. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 789f4aa53c..fcef7463a1 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2327,6 +2327,59 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + case "GUILD_STICKERS_UPDATE": + { + await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_STICKERS_UPDATE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var newStickers = data.Stickers.Where(x => !guild.Stickers.Any(y => y.Id == x.Id)); + var deletedStickers = guild.Stickers.Where(x => !data.Stickers.Any(y => y.Id == x.Id)); + var updatedStickers = data.Stickers.Select(x => + { + var s = guild.Stickers.FirstOrDefault(y => y.Id == x.Id); + if (s == null) + return null; + + var e = s.Equals(x); + if (!e) + { + return (s, x) as (SocketCustomSticker Entity, API.Sticker Model)?; + } + else + { + return null; + } + }).Where(x => x.HasValue).Select(x => x.Value).ToArray(); + + foreach(var model in newStickers) + { + var entity = guild.AddSticker(model); + await TimedInvokeAsync(_guildStickerCreated, nameof(GuildStickerCreated), entity); + } + foreach(var sticker in deletedStickers) + { + var entity = guild.RemoveSticker(sticker.Id); + await TimedInvokeAsync(_guildStickerDeleted, nameof(GuildStickerDeleted), entity); + } + foreach(var entityModelPair in updatedStickers) + { + var before = entityModelPair.Entity.Clone(); + + entityModelPair.Entity.Update(entityModelPair.Model); + + await TimedInvokeAsync(_guildStickerUpdated, nameof(GuildStickerUpdated), before, entityModelPair.Entity); + } + } + break; //Ignored (User only) case "CHANNEL_PINS_ACK": diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index b8c29ed353..97aad4f2fc 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -1,6 +1,7 @@ using Discord.Rest; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,6 +10,10 @@ namespace Discord.WebSocket { + /// + /// Represents a custom sticker within a guild received over the gateway. + /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketCustomSticker : SocketSticker, ICustomSticker { /// @@ -63,6 +68,10 @@ public async Task DeleteAsync(RequestOptions options = null) Guild.RemoveSticker(this.Id); } + internal SocketCustomSticker Clone() => MemberwiseClone() as SocketCustomSticker; + + private string DebuggerDisplay => $"{Name} in {Guild.Name} ({Id})"; + // ICustomSticker ulong? ICustomSticker.AuthorId => this.AuthorId; diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index b450e4c367..ec3977f19c 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,6 +10,10 @@ namespace Discord.WebSocket { + /// + /// Represents a general sticker received over the gateway. + /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketSticker : SocketEntity, ISticker { /// @@ -70,5 +75,27 @@ internal virtual void Update(Model model) this.Tags = ImmutableArray.Empty; } } + + private string DebuggerDisplay => $"{Name} ({Id})"; + + /// + public override bool Equals(object obj) + { + if (obj is API.Sticker stickerModel) + { + return stickerModel.Name == this.Name && + stickerModel.Desription == this.Description && + stickerModel.FormatType == this.Format && + stickerModel.Id == this.Id && + stickerModel.PackId == this.PackId && + stickerModel.Asset == this.Asset && + stickerModel.PreviewAsset == this.PreviewAsset && + (stickerModel.Tags.IsSpecified ? + stickerModel.Tags.Value == string.Join(", ", this.Tags) : + true); + } + else + return base.Equals(obj); + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs index b54af37294..771a4c413e 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,6 +11,7 @@ namespace Discord.WebSocket /// /// Represents an unknown sticker received over the gateway. /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketUnknownSticker : SocketSticker { /// @@ -56,5 +58,7 @@ internal void Update(Model model) /// public Task ResolveAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) => Discord.GetStickerAsync(this.Id, mode, options); + + private string DebuggerDisplay => $"{Name} ({Id})"; } } From e9b807a0dd5ea877d54ee856aa2581b57086d814 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 24 Aug 2021 03:18:20 -0300 Subject: [PATCH 190/494] Fix #115. Added 2 more methods to upload stickers via filepath or stream --- src/Discord.Net.Core/Discord.Net.Core.xml | 27 +++++++++++ .../Entities/Guilds/IGuild.cs | 28 +++++++++++ src/Discord.Net.Rest/API/Net/MultipartFile.cs | 6 ++- .../API/Rest/CreateStickerParams.cs | 14 ++++-- src/Discord.Net.Rest/Discord.Net.Rest.xml | 45 ++++++++++++++++++ .../Entities/Guilds/GuildHelper.cs | 27 +++++++++++ .../Entities/Guilds/RestGuild.cs | 47 +++++++++++++++++++ src/Discord.Net.Rest/Net/DefaultRestClient.cs | 13 ++++- .../Entities/Guilds/SocketGuild.cs | 47 +++++++++++++++++++ 9 files changed, 247 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 989f35ec11..f60adb42c5 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3945,6 +3945,33 @@ A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + Creates a new sticker in this guild + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The path of the file to upload. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + + + Creates a new sticker in this guild + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The stream containing the file data. + The name of the file with the extension, ex: image.png + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + Gets a specific sticker within this guild. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index d9daf80cd8..314e7e6c3e 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Threading.Tasks; namespace Discord @@ -962,6 +963,33 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// Task CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options = null); + /// + /// Creates a new sticker in this guild + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The path of the file to upload. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + Task CreateStickerAsync(string name, string description, IEnumerable tags, string path, RequestOptions options = null); + + /// + /// Creates a new sticker in this guild + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The stream containing the file data. + /// The name of the file with the extension, ex: image.png + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + Task CreateStickerAsync(string name, string description, IEnumerable tags, Stream stream, string filename, RequestOptions options = null); + /// /// Gets a specific sticker within this guild. /// diff --git a/src/Discord.Net.Rest/API/Net/MultipartFile.cs b/src/Discord.Net.Rest/API/Net/MultipartFile.cs index 604852e904..ab28c0dbc6 100644 --- a/src/Discord.Net.Rest/API/Net/MultipartFile.cs +++ b/src/Discord.Net.Rest/API/Net/MultipartFile.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; namespace Discord.Net.Rest { @@ -6,11 +6,13 @@ internal struct MultipartFile { public Stream Stream { get; } public string Filename { get; } + public string ContentType { get; } - public MultipartFile(Stream stream, string filename) + public MultipartFile(Stream stream, string filename, string contentType = null) { Stream = stream; Filename = filename; + this.ContentType = contentType; } } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs index be9cb05f04..405d3e04e6 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs @@ -15,17 +15,25 @@ internal class CreateStickerParams public string Name { get; set; } public string Description { get; set; } public string Tags { get; set; } + public string FileName { get; set; } public IReadOnlyDictionary ToDictionary() { var d = new Dictionary(); - d["file"] = new MultipartFile(File, Name + ".dat"); - - d["name"] = Name; + d["name"] = $"{Name}"; d["description"] = Description; d["tags"] = Tags; + string contentType = "image/png"; + + if (File is FileStream fileStream) + contentType = $"image/{Path.GetExtension(fileStream.Name)}"; + else if(FileName != null) + contentType = $"image/{Path.GetExtension(FileName)}"; + + d["file"] = new MultipartFile(File, FileName ?? "image", contentType.Replace(".", "")); + return d; } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 4cb5f6e021..2c53beefc1 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3540,6 +3540,33 @@ A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + Creates a new sticker in this guild + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The path of the file to upload. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + + + Creates a new sticker in this guild + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The stream containing the file data. + The name of the file with the extension, ex: image.png + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + Gets a specific sticker within this guild. @@ -3707,6 +3734,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index bedb9de2f6..b1fb2f044b 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -8,6 +8,7 @@ using Model = Discord.API.Guild; using RoleModel = Discord.API.Role; using ImageModel = Discord.API.Image; +using System.IO; namespace Discord.Rest { @@ -559,6 +560,32 @@ public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulon return await client.ApiClient.CreateGuildStickerAsync(apiArgs, guild.Id, options).ConfigureAwait(false); } + public static async Task CreateStickerAsync(BaseDiscordClient client, IGuild guild, string name, string description, IEnumerable tags, + Stream file, string filename, RequestOptions options = null) + { + Preconditions.NotNull(name, nameof(name)); + Preconditions.NotNull(description, nameof(description)); + Preconditions.NotNull(file, nameof(file)); + Preconditions.NotNull(filename, nameof(filename)); + + Preconditions.AtLeast(name.Length, 2, nameof(name)); + Preconditions.AtLeast(description.Length, 2, nameof(description)); + + Preconditions.AtMost(name.Length, 30, nameof(name)); + Preconditions.AtMost(description.Length, 100, nameof(name)); + + var apiArgs = new CreateStickerParams() + { + Name = name, + Description = description, + File = file, + Tags = string.Join(", ", tags), + FileName = filename + }; + + return await client.ApiClient.CreateGuildStickerAsync(apiArgs, guild.Id, options).ConfigureAwait(false); + } + public static async Task ModifyStickerAsync(BaseDiscordClient client, ulong guildId, ISticker sticker, Action func, RequestOptions options = null) { diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index e87e24b255..b27bcd9969 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using WidgetModel = Discord.API.GuildWidget; using Model = Discord.API.Guild; +using System.IO; namespace Discord.Rest { @@ -946,6 +947,42 @@ public async Task CreateStickerAsync(string name, string descript return CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null); } /// + /// Creates a new sticker in this guild + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The path of the file to upload. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + public Task CreateStickerAsync(string name, string description, IEnumerable tags, string path, + RequestOptions options = null) + { + var fs = File.OpenRead(path); + return CreateStickerAsync(name, description, tags, fs, Path.GetFileName(fs.Name), options); + } + /// + /// Creates a new sticker in this guild + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The stream containing the file data. + /// The name of the file with the extension, ex: image.png + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + public async Task CreateStickerAsync(string name, string description, IEnumerable tags, Stream stream, + string filename, RequestOptions options = null) + { + var model = await GuildHelper.CreateStickerAsync(Discord, this, name, description, tags, stream, filename, options).ConfigureAwait(false); + + return CustomSticker.Create(Discord, model, this, model.User.IsSpecified ? model.User.Value.Id : null); + } + /// /// Gets a specific sticker within this guild. /// /// The id of the sticker to get. @@ -1262,8 +1299,16 @@ async Task> IGuild.GetWebhooksAsync(RequestOptions /// async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) => await GetApplicationCommandsAsync(options).ConfigureAwait(false); + /// async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options) => await CreateStickerAsync(name, description, tags, image, options); + /// + async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, Stream stream, string filename, RequestOptions options) + => await CreateStickerAsync(name, description, tags, stream, filename, options); + /// + async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, string path, RequestOptions options) + => await CreateStickerAsync(name, description, tags, path, options); + /// async Task IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode != CacheMode.AllowDownload) @@ -1271,6 +1316,7 @@ async Task IGuild.GetStickerAsync(ulong id, CacheMode mode, Requ return await GetStickerAsync(id, options); } + /// async Task> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options) { if (mode != CacheMode.AllowDownload) @@ -1278,6 +1324,7 @@ async Task> IGuild.GetStickersAsync(CacheMod return await GetStickersAsync(options); } + /// Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) => sticker.DeleteAsync(); } diff --git a/src/Discord.Net.Rest/Net/DefaultRestClient.cs b/src/Discord.Net.Rest/Net/DefaultRestClient.cs index b5036d94ec..62ebd6d785 100644 --- a/src/Discord.Net.Rest/Net/DefaultRestClient.cs +++ b/src/Discord.Net.Rest/Net/DefaultRestClient.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Net; using System.Net.Http; +using System.Net.Http.Headers; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -101,7 +102,7 @@ public async Task SendAsync(string method, string endpoint, IReadO switch (p.Value) { #pragma warning disable IDISP004 - case string stringValue: { content.Add(new StringContent(stringValue), p.Key); continue; } + case string stringValue: { content.Add(new StringContent(stringValue, Encoding.UTF8, "text/plain"), p.Key); continue; } case byte[] byteArrayValue: { content.Add(new ByteArrayContent(byteArrayValue), p.Key); continue; } case Stream streamValue: { content.Add(new StreamContent(streamValue), p.Key); continue; } case MultipartFile fileValue: @@ -116,8 +117,16 @@ public async Task SendAsync(string method, string endpoint, IReadO stream = memoryStream; #pragma warning restore IDISP001 } - content.Add(new StreamContent(stream), p.Key, fileValue.Filename); + + var streamContent = new StreamContent(stream); + var extension = fileValue.Filename.Split('.').Last(); + + if(fileValue.ContentType != null) + streamContent.Headers.ContentType = new MediaTypeHeaderValue(fileValue.ContentType); + + content.Add(streamContent, p.Key, fileValue.Filename); #pragma warning restore IDISP004 + continue; } default: throw new InvalidOperationException($"Unsupported param type \"{p.Value.GetType().Name}\"."); diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 390bc0512d..2056426343 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -20,6 +20,7 @@ using UserModel = Discord.API.User; using VoiceStateModel = Discord.API.VoiceState; using StickerModel = Discord.API.Sticker; +using System.IO; namespace Discord.WebSocket { @@ -1248,6 +1249,42 @@ public async Task CreateStickerAsync(string name, string de return AddOrUpdateSticker(model); } /// + /// Creates a new sticker in this guild + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The path of the file to upload. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + public Task CreateStickerAsync(string name, string description, IEnumerable tags, string path, + RequestOptions options = null) + { + var fs = File.OpenRead(path); + return CreateStickerAsync(name, description, tags, fs, Path.GetFileName(fs.Name), options); + } + /// + /// Creates a new sticker in this guild + /// + /// The name of the sticker. + /// The description of the sticker. + /// The tags of the sticker. + /// The stream containing the file data. + /// The name of the file with the extension, ex: image.png + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the created sticker. + /// + public async Task CreateStickerAsync(string name, string description, IEnumerable tags, Stream stream, + string filename, RequestOptions options = null) + { + var model = await GuildHelper.CreateStickerAsync(Discord, this, name, description, tags, stream, filename, options).ConfigureAwait(false); + + return AddOrUpdateSticker(model); + } + /// /// Deletes a sticker within this guild. /// /// The sticker to delete. @@ -1632,12 +1669,22 @@ async Task> IGuild.GetWebhooksAsync(RequestOptions /// async Task> IGuild.GetApplicationCommandsAsync (RequestOptions options) => await GetApplicationCommandsAsync(options).ConfigureAwait(false); + /// async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options) => await CreateStickerAsync(name, description, tags, image, options); + /// + async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, Stream stream, string filename, RequestOptions options) + => await CreateStickerAsync(name, description, tags, stream, filename, options); + /// + async Task IGuild.CreateStickerAsync(string name, string description, IEnumerable tags, string path, RequestOptions options) + => await CreateStickerAsync(name, description, tags, path, options); + /// async Task IGuild.GetStickerAsync(ulong id, CacheMode mode, RequestOptions options) => await GetStickerAsync(id, mode, options); + /// async Task> IGuild.GetStickersAsync(CacheMode mode, RequestOptions options) => await GetStickersAsync(mode, options); + /// Task IGuild.DeleteStickerAsync(ICustomSticker sticker, RequestOptions options) => DeleteStickerAsync(_stickers[sticker.Id], options); From f6708f9a5823a4cd992fe396064f8f7d9aa84885 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 24 Aug 2021 03:26:18 -0300 Subject: [PATCH 191/494] Add missing docs --- .../Discord.Net.WebSocket.xml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 9366cf1f73..d6f7e78c15 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3574,6 +3574,33 @@ A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + Creates a new sticker in this guild + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The path of the file to upload. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + + + + Creates a new sticker in this guild + + The name of the sticker. + The description of the sticker. + The tags of the sticker. + The stream containing the file data. + The name of the file with the extension, ex: image.png + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the created sticker. + + Deletes a sticker within this guild. @@ -3751,6 +3778,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a Websocket-based slash command received over the gateway. From 858f393c20842ca8c7e326959301b6ef38947433 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 24 Aug 2021 03:30:40 -0300 Subject: [PATCH 192/494] Add sharded events --- src/Discord.Net.WebSocket/DiscordShardedClient.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 30ec5ef198..0d9b4ad1a2 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -470,6 +470,10 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.RequestToSpeak += (stage, user) => _requestToSpeak.InvokeAsync(stage, user); client.SpeakerAdded += (stage, user) => _speakerAdded.InvokeAsync(stage, user); client.SpeakerRemoved += (stage, user) => _speakerRemoved.InvokeAsync(stage, user); + + client.GuildStickerCreated += (sticker) => _guildStickerCreated.InvokeAsync(sticker); + client.GuildStickerDeleted += (sticker) => _guildStickerDeleted.InvokeAsync(sticker); + client.GuildStickerUpdated += (before, after) => _guildStickerUpdated.InvokeAsync(before, after); } //IDiscordClient From 7efb6eede49ab4fbb7c90bcca8d238e8c59c02f2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 24 Aug 2021 03:54:21 -0300 Subject: [PATCH 193/494] Add different events for different interaction types --- .../BaseSocketClient.Events.cs | 51 ++++++++++++++++++- .../Discord.Net.WebSocket.xml | 27 +++++++++- .../DiscordShardedClient.cs | 5 ++ .../DiscordSocketClient.cs | 19 +++++++ 4 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 1ed489aa5f..1cd35768db 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -457,7 +457,7 @@ public event Func InviteDeleted //Interactions /// - /// Fired when an Interaction is created. + /// Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands. /// /// /// @@ -475,6 +475,55 @@ public event Func InteractionCreated } internal readonly AsyncEvent> _interactionCreatedEvent = new AsyncEvent>(); + /// + /// Fired when a button is clicked and its interaction is received. + /// + public event Func ButtonExecuted + { + add => _buttonExecuted.Add(value); + remove => _buttonExecuted.Remove(value); + } + internal readonly AsyncEvent> _buttonExecuted = new AsyncEvent>(); + + /// + /// Fired when a select menu is used and its interaction is received. + /// + public event Func SelectMenuExecuted + { + add => _selectMenuExecuted.Add(value); + remove => _selectMenuExecuted.Remove(value); + } + internal readonly AsyncEvent> _selectMenuExecuted = new AsyncEvent>(); + /// + /// Fired when a slash command is used and its interaction is received. + /// + public event Func SlashCommandExecuted + { + add => _slashCommandExecuted.Add(value); + remove => _slashCommandExecuted.Remove(value); + } + internal readonly AsyncEvent> _slashCommandExecuted = new AsyncEvent>(); + + /// + /// Fired when a user command is used and its interaction is received. + /// + public event Func UserCommandExecuted + { + add => _userCommandExecuted.Add(value); + remove => _userCommandExecuted.Remove(value); + } + internal readonly AsyncEvent> _userCommandExecuted = new AsyncEvent>(); + + /// + /// Fired when a message command is used and its interaction is received. + /// + public event Func MessageCommandExecuted + { + add => _messageCommandExecuted.Add(value); + remove => _messageCommandExecuted.Remove(value); + } + internal readonly AsyncEvent> _messageCommandExecuted = new AsyncEvent>(); + /// /// Fired when a guild application command is created. /// diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index d6f7e78c15..ba30f85d49 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -709,7 +709,7 @@ - Fired when an Interaction is created. + Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands. @@ -721,6 +721,31 @@ + + + Fired when a button is clicked and its interaction is received. + + + + + Fired when a select menu is used and its interaction is received. + + + + + Fired when a slash command is used and its interaction is received. + + + + + Fired when a user command is used and its interaction is received. + + + + + Fired when a message command is used and its interaction is received. + + Fired when a guild application command is created. diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 0d9b4ad1a2..4b67322a30 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -456,6 +456,11 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.InviteDeleted += (channel, invite) => _inviteDeletedEvent.InvokeAsync(channel, invite); client.InteractionCreated += (interaction) => _interactionCreatedEvent.InvokeAsync(interaction); + client.ButtonExecuted += (arg) => _buttonExecuted.InvokeAsync(arg); + client.SelectMenuExecuted += (arg) => _selectMenuExecuted.InvokeAsync(arg); + client.SlashCommandExecuted += (arg) => _slashCommandExecuted.InvokeAsync(arg); + client.UserCommandExecuted += (arg) => _userCommandExecuted.InvokeAsync(arg); + client.MessageCommandExecuted += (arg) => _messageCommandExecuted.InvokeAsync(arg); client.ThreadUpdated += (thread1, thread2) => _threadUpdated.InvokeAsync(thread1, thread2); client.ThreadCreated += (thread) => _threadCreated.InvokeAsync(thread); diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 1eb0344343..ced0f80e7b 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2090,6 +2090,25 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty await interaction.DeferAsync().ConfigureAwait(false); await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); + + switch (interaction) + { + case SocketSlashCommand slashCommand: + await TimedInvokeAsync(_slashCommandExecuted, nameof(SlashCommandExecuted), slashCommand).ConfigureAwait(false); + break; + case SocketMessageComponent messageComponent: + if(messageComponent.Data.Type == ComponentType.SelectMenu) + await TimedInvokeAsync(_selectMenuExecuted, nameof(SelectMenuExecuted), messageComponent).ConfigureAwait(false); + if(messageComponent.Data.Type == ComponentType.Button) + await TimedInvokeAsync(_buttonExecuted, nameof(ButtonExecuted), messageComponent).ConfigureAwait(false); + break; + case SocketUserCommand userCommand: + await TimedInvokeAsync(_userCommandExecuted, nameof(UserCommandExecuted), userCommand).ConfigureAwait(false); + break; + case SocketMessageCommand messageCommand: + await TimedInvokeAsync(_messageCommandExecuted, nameof(MessageCommandExecuted), messageCommand).ConfigureAwait(false); + break; + } } else { From db9dcdb2375a17700920d808dfb6bd8040636a59 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 24 Aug 2021 04:06:32 -0300 Subject: [PATCH 194/494] Fix some function names --- src/Discord.Net.Core/Entities/Channels/IStageChannel.cs | 6 +++--- src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs | 6 +++--- .../Entities/Channels/SocketStageChannel.cs | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index e3b51b6141..1461d8e509 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -77,7 +77,7 @@ public interface IStageChannel : IVoiceChannel /// /// A task that represents the asynchronous request to speak operation. /// - Task RequestToSpeak(RequestOptions options = null); + Task RequestToSpeakAsync(RequestOptions options = null); /// /// Makes the current user become a speaker within a stage. @@ -105,7 +105,7 @@ public interface IStageChannel : IVoiceChannel /// /// A task that represents the asynchronous move operation. /// - Task MoveToSpeaker(IGuildUser user, RequestOptions options = null); + Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null); /// /// Removes a user from speaking. @@ -115,6 +115,6 @@ public interface IStageChannel : IVoiceChannel /// /// A task that represents the asynchronous remove operation. /// - Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null); + Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null); } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs index c5bad43dad..dd5d2bfa91 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -96,7 +96,7 @@ public override async Task UpdateAsync(RequestOptions options = null) } /// - public Task RequestToSpeak(RequestOptions options = null) + public Task RequestToSpeakAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { @@ -129,7 +129,7 @@ public Task StopSpeakingAsync(RequestOptions options = null) } /// - public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) + public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { @@ -141,7 +141,7 @@ public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) } /// - public Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null) + public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index fb87a05913..0aa89ac8f8 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -109,7 +109,7 @@ public async Task StopStageAsync(RequestOptions options = null) } /// - public Task RequestToSpeak(RequestOptions options = null) + public Task RequestToSpeakAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { @@ -142,7 +142,7 @@ public Task StopSpeakingAsync(RequestOptions options = null) } /// - public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) + public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { @@ -154,7 +154,7 @@ public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) } /// - public Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null) + public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { From c7fab6fd0feba2dc3efb090a6d349718403f4fbd Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 24 Aug 2021 05:02:47 -0300 Subject: [PATCH 195/494] meta: bump versions --- .../Discord.Net.Commands.csproj | 4 +-- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 ++-- src/Discord.Net.Core/Discord.Net.Core.xml | 6 ++-- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 ++-- src/Discord.Net.Rest/Discord.Net.Rest.xml | 6 ++-- .../Discord.Net.WebSocket.csproj | 6 ++-- .../Discord.Net.WebSocket.xml | 6 ++-- .../Discord.Net.Webhook.csproj | 2 +- src/Discord.Net/Discord.Net.nuspec | 32 +++++++++---------- 9 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 1d786bae4b..d38ea4dd04 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 2.3.5 + 3.0.0 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index ac54b259c7..2abc981b50 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.0.1-pre + 3.0.0 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 3.3.1 - 3.0.1 + 3.0.0 + 3.0.0 false diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index bcd7040d7b..a1337a3eb7 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -2000,7 +2000,7 @@ A task that represents the asynchronous stop operation. - + Indicates that the bot would like to speak within a stage channel. @@ -2027,7 +2027,7 @@ A task that represents the asynchronous stop operation. - + Makes a user a speaker within a stage. @@ -2037,7 +2037,7 @@ A task that represents the asynchronous move operation. - + Removes a user from speaking. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 16b1655754..97fc501c21 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.1-pre + 3.0.0 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.1 - 3.0.1 + 3.0.0 + 3.0.0 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 196c93168c..6e4d93991b 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2322,7 +2322,7 @@ - + @@ -2331,10 +2331,10 @@ - + - + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index e6352780e9..a374e07294 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.0.1-pre + 3.0.0 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,8 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.0.1 - 3.0.1 + 3.0.0 + 3.0.0 TRACE diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index ba30f85d49..eb05b12e29 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2310,7 +2310,7 @@ - + @@ -2319,10 +2319,10 @@ - + - + diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index f04dedf438..cf9d10de1f 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -6,7 +6,7 @@ Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 3.0.0-pre + 3.0.0 Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index eb3bd9b6d5..1166cab12d 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.2-pre$suffix$ + 3.0.0$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,25 +14,25 @@ https://avatars.githubusercontent.com/u/84047264 - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From 67cb80e18467ff049192cae4638a9ad56171e13b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 24 Aug 2021 05:06:56 -0300 Subject: [PATCH 196/494] Change default user agent --- src/Discord.Net.Core/DiscordConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/DiscordConfig.cs b/src/Discord.Net.Core/DiscordConfig.cs index da85256449..621c8184c1 100644 --- a/src/Discord.Net.Core/DiscordConfig.cs +++ b/src/Discord.Net.Core/DiscordConfig.cs @@ -43,7 +43,7 @@ public class DiscordConfig /// /// The user agent used in each Discord.Net request. /// - public static string UserAgent { get; } = $"DiscordBot (https://github.com/discord-net/Discord.Net, v{Version})"; + public static string UserAgent { get; } = $"DiscordBot (https://github.com/Discord-Net-Labs/Discord.Net-Labs, v{Version})"; /// /// Returns the base Discord API URL. /// From 65a3245c832f19b740e22c55f1e4750392eab068 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 06:22:42 -0300 Subject: [PATCH 197/494] Fix NRE with default stickers --- src/Discord.Net.WebSocket/DiscordShardedClient.cs | 2 +- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 4b67322a30..48c5951667 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -83,7 +83,7 @@ private DiscordShardedClient(int[] ids, DiscordSocketConfig config, API.DiscordS _shardIdsToIndex = new Dictionary(); config.DisplayInitialLog = false; _baseConfig = config; - _defaultStickers = new ImmutableArray>(); + _defaultStickers = ImmutableArray.Create>(); if (config.TotalShards == null) _automaticShards = true; diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index ced0f80e7b..9c5766ba70 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -149,7 +149,7 @@ private DiscordSocketClient(DiscordSocketConfig config, API.DiscordSocketApiClie Rest = new DiscordSocketRestClient(config, ApiClient); _heartbeatTimes = new ConcurrentQueue(); _gatewayIntents = config.GatewayIntents; - _defaultStickers = new ImmutableArray>(); + _defaultStickers = ImmutableArray.Create>(); _stateLock = new SemaphoreSlim(1, 1); _gatewayLogger = LogManager.CreateLogger(ShardId == 0 && TotalShards == 1 ? "Gateway" : $"Shard #{ShardId}"); @@ -210,7 +210,7 @@ internal override void Dispose(bool disposing) internal override async Task OnLoginAsync(TokenType tokenType, string token) { - if(this._shardedClient != null && this._defaultStickers.Length == 0) + if(this._shardedClient == null && this._defaultStickers.Length == 0) { var models = await ApiClient.ListNitroStickerPacksAsync().ConfigureAwait(false); From 0752a2af5f65f6a1c715519706b783eee0477f00 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 06:24:04 -0300 Subject: [PATCH 198/494] Fix #109 --- src/Discord.Net.Rest/Entities/Messages/RestMessage.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index cc77beba28..c13d72a756 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -87,7 +87,10 @@ internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channe } internal static RestMessage Create(BaseDiscordClient discord, IMessageChannel channel, IUser author, Model model) { - if (model.Type == MessageType.Default || model.Type == MessageType.Reply) + if (model.Type == MessageType.Default || + model.Type == MessageType.Reply || + model.Type == MessageType.ApplicationCommand || + model.Type == MessageType.ThreadStarterMessage) return RestUserMessage.Create(discord, channel, author, model); else return RestSystemMessage.Create(discord, channel, author, model); From e489a8004d68ee4cd7a6bf7d6fe922847b830975 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 07:06:58 -0300 Subject: [PATCH 199/494] Fix KeyNotFoundException for stickers in messages --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 7 ++++++- .../Entities/Guilds/SocketGuild.cs | 6 +++--- .../Entities/Messages/SocketUserMessage.cs | 11 +++++------ .../Entities/Stickers/SocketCustomSticker.cs | 2 +- .../Entities/Stickers/SocketSticker.cs | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 9c5766ba70..455420b6d0 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -511,7 +511,12 @@ public override async Task GetStickerAsync(ulong id, CacheMode mo if (model.GuildId.IsSpecified) { var guild = State.GetGuild(model.GuildId.Value); - sticker = guild.AddOrUpdateSticker(model); + + // since the sticker can be from another guild, check if we are in the guild or its in the cache + if (guild != null) + sticker = guild.AddOrUpdateSticker(model); + else + sticker = SocketSticker.Create(this, model); return sticker; } else diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index e34c498110..1d1175f52c 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1240,10 +1240,10 @@ public Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null) /// public async ValueTask GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) { - var sticker = _stickers[id]; + var sticker = _stickers.FirstOrDefault(x => x.Key == id); - if (sticker != null) - return sticker; + if (sticker.Value != null) + return sticker.Value; if (mode == CacheMode.CacheOnly) return null; diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 8127d54f5a..7ff55c6138 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -174,17 +174,16 @@ internal override void Update(ClientState state, Model model) SocketSticker sticker = null; if (guild != null) - { sticker = guild.GetSticker(stickerItem.Id); - } - if(sticker == null) - { + if (sticker == null) sticker = Discord.GetSticker(stickerItem.Id); - } // if its still null, create an unknown - sticker = SocketUnknownSticker.Create(Discord, stickerItem); + if (sticker == null) + sticker = SocketUnknownSticker.Create(Discord, stickerItem); + + stickers.Add(sticker); } _stickers = stickers.ToImmutable(); diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index 97aad4f2fc..b9c10f4c23 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -70,7 +70,7 @@ public async Task DeleteAsync(RequestOptions options = null) internal SocketCustomSticker Clone() => MemberwiseClone() as SocketCustomSticker; - private string DebuggerDisplay => $"{Name} in {Guild.Name} ({Id})"; + private new string DebuggerDisplay => Guild == null ? base.DebuggerDisplay : $"{Name} in {Guild.Name} ({Id})"; // ICustomSticker ulong? ICustomSticker.AuthorId diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index ec3977f19c..ce0d3f4fa9 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -76,7 +76,7 @@ internal virtual void Update(Model model) } } - private string DebuggerDisplay => $"{Name} ({Id})"; + internal string DebuggerDisplay => $"{Name} ({Id})"; /// public override bool Equals(object obj) From 605b074e9d2057f4cb33a4f2948f22902eb9069c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 07:16:41 -0300 Subject: [PATCH 200/494] Fix NRE of description check for user/message commands --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 54 +++++++------------- 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 09d2847854..6a5daaf8dd 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1142,8 +1142,13 @@ public async Task CreateGlobalApplicationCommandAsync(Create Preconditions.NotNull(command, nameof(command)); Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); - Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + + if (command.Type == ApplicationCommandType.Slash) + { + Preconditions.NotNullOrEmpty(command.Description, nameof(command.Description)); + Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + } options = RequestOptions.CreateOrClone(options); @@ -1180,40 +1185,6 @@ public async Task BulkOverwriteGlobalApplicationCommands(C return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); } - public async Task CreateGlobalApplicationUserCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) - { - Preconditions.NotNull(command, nameof(command)); - Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); - Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - - options = RequestOptions.CreateOrClone(options); - - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); - } - public async Task CreateGlobalApplicationMessageCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) - { - Preconditions.NotNull(command, nameof(command)); - Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); - Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); - - options = RequestOptions.CreateOrClone(options); - - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); - } - - public async Task BulkOverwriteGlobalApplicationUserCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); - } - - public async Task BulkOverwriteGlobalApplicationMessageCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) - { - options = RequestOptions.CreateOrClone(options); - - return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); - } public async Task GetGuildApplicationCommandsAsync(ulong guildId, RequestOptions options = null) { @@ -1239,6 +1210,17 @@ public async Task GetGuildApplicationCommandAsync(ulong guil public async Task CreateGuildApplicationCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) { + Preconditions.NotNull(command, nameof(command)); + Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); + Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); + + if (command.Type == ApplicationCommandType.Slash) + { + Preconditions.NotNullOrEmpty(command.Description, nameof(command.Description)); + Preconditions.AtMost(command.Description.Length, 100, nameof(command.Description)); + Preconditions.AtLeast(command.Description.Length, 1, nameof(command.Description)); + } + options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(guildId: guildId); From 6aaaf681b0531cde84430e329f68f851e8e94e14 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 08:32:06 -0300 Subject: [PATCH 201/494] Fix immutabe builders and bump versions --- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +++--- .../Discord.Net.WebSocket.csproj | 6 +++--- src/Discord.Net.WebSocket/DiscordShardedClient.cs | 8 ++++++-- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 6 +++++- src/Discord.Net/Discord.Net.nuspec | 14 +++++++------- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 97fc501c21..a83a8fe758 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.0 + 3.0.1 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.0 - 3.0.0 + 3.0.1 + 3.0.1 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index a374e07294..fbf104b2bc 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.0.0 + 3.0.1 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,8 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.0.0 - 3.0.0 + 3.0.1 + 3.0.1 TRACE diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 48c5951667..fbcd320342 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -298,7 +298,9 @@ private async Task DownloadDefaultStickersAsync() { var models = await ApiClient.ListNitroStickerPacksAsync().ConfigureAwait(false); - foreach(var model in models.StickerPacks) + var builder = ImmutableArray.CreateBuilder>(); + + foreach (var model in models.StickerPacks) { var stickers = model.Stickers.Select(x => SocketSticker.Create(_shards[0], x)); @@ -312,8 +314,10 @@ private async Task DownloadDefaultStickersAsync() stickers ); - _defaultStickers.Add(pack); + builder.Add(pack); } + + _defaultStickers = builder.ToImmutable(); } /// diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 455420b6d0..82b3605c5c 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -214,6 +214,8 @@ internal override async Task OnLoginAsync(TokenType tokenType, string token) { var models = await ApiClient.ListNitroStickerPacksAsync().ConfigureAwait(false); + var builder = ImmutableArray.CreateBuilder>(); + foreach (var model in models.StickerPacks) { var stickers = model.Stickers.Select(x => SocketSticker.Create(this, x)); @@ -228,8 +230,10 @@ internal override async Task OnLoginAsync(TokenType tokenType, string token) stickers ); - _defaultStickers.Add(pack); + builder.Add(pack); } + + _defaultStickers = builder.ToImmutable(); } } diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 1166cab12d..e1de36188b 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.0$suffix$ + 3.0.1$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -15,22 +15,22 @@ - - + + - - + + - - + + From 87350f8f0b31b203de5aad228e694bbcaa95451c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 18:40:31 -0300 Subject: [PATCH 202/494] Add methods to create builders from messages --- .../Message Components/ComponentBuilder.cs | 41 +++++++++++++++++++ .../Discord.Net.WebSocket.csproj | 6 +-- src/Discord.Net/Discord.Net.nuspec | 8 ++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 085c62cef2..f91bdba36e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -45,6 +45,47 @@ public List ActionRows private List _actionRows { get; set; } + /// + /// Creates a new builder from a message. + /// + /// The message to create the builder from. + /// The newly created builder. + public static ComponentBuilder FromMessage(IMessage message) + => FromComponents(message.Components); + + /// + /// Creates a new builder from the provided list of components. + /// + /// The components to create the builder from. + /// The newly created builder. + public static ComponentBuilder FromComponents(IReadOnlyCollection components) + { + var builder = new ComponentBuilder(); + for(int i = 0; i != components.Count; i++) + { + var component = components.ElementAt(i); + builder.AddComponent(component, i); + } + return builder; + } + + internal void AddComponent(IMessageComponent component, int row) + { + switch (component) + { + case ButtonComponent button: + this.WithButton(button.Label, button.CustomId, button.Style, button.Emote, button.Url, button.Disabled, row); + break; + case ActionRowComponent actionRow: + foreach (var cmp in actionRow.Components) + AddComponent(cmp, row); + break; + case SelectMenu menu: + this.WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); + break; + } + } + /// /// Adds a to the at the specific row. /// If the row cannot accept the component then it will add it to a row that can. diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index fbf104b2bc..9aa71cc3d3 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.0.1 + 3.0.2 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,8 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.0.1 - 3.0.1 + 3.0.2 + 3.0.2 TRACE diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index e1de36188b..dbee186721 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.1$suffix$ + 3.0.2$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -16,21 +16,21 @@ - + - + - + From fb101cdc88ab676c4bb7993d45232163343f3e16 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 18:43:31 -0300 Subject: [PATCH 203/494] meta: docs --- src/Discord.Net.Core/Discord.Net.Core.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index a1337a3eb7..f11fe4e9a0 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -5086,6 +5086,20 @@ cannot be null. count exceeds . + + + Creates a new builder from a message. + + The message to create the builder from. + The newly created builder. + + + + Creates a new builder from the provided list of components. + + The components to create the builder from. + The newly created builder. + Adds a to the at the specific row. From 612b12dd0b8f6b61c3c2e771e5119c32f80dde1b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 26 Aug 2021 08:24:39 -0300 Subject: [PATCH 204/494] meta: bump version --- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 2abc981b50..a8ef5783ea 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.0.0 + 3.0.1 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 3.0.0 - 3.0.0 + 3.0.1 + 3.0.1 false From eb271a9ccc59b45f6a70556ef065ff2fbc531fce Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Fri, 27 Aug 2021 15:03:03 -0500 Subject: [PATCH 205/494] Fix nullref in thread_update event (#125) --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 82b3605c5c..b79eeb0993 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2245,6 +2245,12 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var channel = (SocketThreadChannel)guild.GetChannel(data.Id); + if (channel == null) + { + await UnknownChannelAsync(type, data.Id); + return; + } + var before = channel.Clone(); channel.Update(State, data); From 755f3c05c1d2562b56a2745743a0c0cc3d7d02a8 Mon Sep 17 00:00:00 2001 From: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com> Date: Mon, 30 Aug 2021 10:52:31 -0500 Subject: [PATCH 206/494] Fix ephemeral command differs (#128) --- .../Interaction/SocketBaseCommand/SocketCommandBase.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 8ca20aa7c4..158368b8e9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -157,6 +157,10 @@ public override Task DeferAsync(bool ephemeral = false, RequestOptions options = var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, + Data = new API.InteractionCallbackData + { + Flags = ephemeral ? MessageFlags.Ephemeral : Optional.Unspecified + } }; return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); From 0fa7bf8ff3ad04209b0e5499aac3a2480d905848 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 30 Aug 2021 23:29:40 -0300 Subject: [PATCH 207/494] Fix NRE in RestGuild --- src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index f257ef8984..5b9436970f 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -195,20 +195,20 @@ internal void Update(Model model) if (model.Stickers != null) { - var stickers = new ImmutableArray(); + var stickers = ImmutableArray.CreateBuilder(); for (int i = 0; i < model.Stickers.Length; i++) { var sticker = model.Stickers[i]; - + var entity = CustomSticker.Create(Discord, sticker, this, sticker.User.IsSpecified ? sticker.User.Value.Id : null); stickers.Add(entity); } - _stickers = stickers; + _stickers = stickers.ToImmutable(); } else - _stickers = new ImmutableArray(); + _stickers = ImmutableArray.Create(); Available = true; } From a3b257394490391a7b47858925ad81c43189d058 Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Tue, 31 Aug 2021 18:16:05 -0400 Subject: [PATCH 208/494] Fix Guild Owner and Admin GuildPermissions.All (#132) * Fix Guild Owner and Admin GuildPermissions.All added bits for new permissions * added _ spacing back --- src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 9503e5b3bd..6c03ed0adb 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -12,7 +12,7 @@ public struct GuildPermissions /// Gets a that grants all guild permissions for webhook users. public static readonly GuildPermissions Webhook = new GuildPermissions(0b00000_0000000_0001101100000_000000); /// Gets a that grants all guild permissions. - public static readonly GuildPermissions All = new GuildPermissions(0b11111_1111111_1111111111111_111111); + public static readonly GuildPermissions All = new GuildPermissions(0b11111111_11111_1111111_1111111111111_11111); /// Gets a packed value representing all the permissions in this . public ulong RawValue { get; } From 562e509f576de32c7c7fa100a5bf3642bdf1e719 Mon Sep 17 00:00:00 2001 From: exsersewo Date: Tue, 31 Aug 2021 23:18:32 +0100 Subject: [PATCH 209/494] Allow file uploading on followup (#131) --- .../API/Rest/CreateWebhookMessageParams.cs | 46 +++++++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 7 +- .../Discord.Net.WebSocket.xml | 48 +++++++++++ .../SocketMessageComponent.cs | 81 +++++++++++++++++++ .../SocketBaseCommand/SocketCommandBase.cs | 81 +++++++++++++++++++ .../Entities/Interaction/SocketInteraction.cs | 39 +++++++++ 6 files changed, 300 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index 1806d487c5..47f5bb2a9c 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -1,11 +1,18 @@ #pragma warning disable CS1591 +using Discord.Net.Converters; +using Discord.Net.Rest; using Newtonsoft.Json; +using System.Collections.Generic; +using System.IO; +using System.Text; namespace Discord.API.Rest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] internal class CreateWebhookMessageParams { + private static JsonSerializer _serializer = new JsonSerializer { ContractResolver = new DiscordContractResolver() }; + [JsonProperty("content")] public string Content { get; set; } @@ -32,5 +39,44 @@ internal class CreateWebhookMessageParams [JsonProperty("components")] public Optional Components { get; set; } + + [JsonProperty("file")] + public Optional File { get; set; } + + public IReadOnlyDictionary ToDictionary() + { + var d = new Dictionary(); + + if (File.IsSpecified) + { + d["file"] = File.Value; + } + + var payload = new Dictionary(); + + payload["content"] = Content; + + if (IsTTS.IsSpecified) + payload["tts"] = IsTTS.Value.ToString(); + if (Nonce.IsSpecified) + payload["nonce"] = Nonce.Value; + if (Username.IsSpecified) + payload["username"] = Username.Value; + if (AvatarUrl.IsSpecified) + payload["avatar_url"] = AvatarUrl.Value; + if (Embeds.IsSpecified) + payload["embeds"] = Embeds.Value; + if (AllowedMentions.IsSpecified) + payload["allowed_mentions"] = AllowedMentions.Value; + + var json = new StringBuilder(); + using (var text = new StringWriter(json)) + using (var writer = new JsonTextWriter(text)) + _serializer.Serialize(writer, payload); + + d["payload_json"] = json.ToString(); + + return d; + } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 6a5daaf8dd..ead0c0e8ae 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1286,7 +1286,7 @@ public async Task DeleteInteractionResponse(string interactionToken, RequestOpti public async Task CreateInteractionFollowupMessage(CreateWebhookMessageParams args, string token, RequestOptions options = null) { - if (!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) + if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) && !args.File.IsSpecified) Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content)); if (args.Content?.Length > DiscordConfig.MaxMessageSize) @@ -1294,7 +1294,10 @@ public async Task CreateInteractionFollowupMessage(CreateWebhookMessage options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("POST", () => $"webhooks/{CurrentUserId}/{token}?wait=true", args, new BucketIds(), options: options).ConfigureAwait(false); + if (!args.File.IsSpecified) + return await SendJsonAsync("POST", () => $"webhooks/{CurrentUserId}/{token}?wait=true", args, new BucketIds(), options: options).ConfigureAwait(false); + else + return await SendMultipartAsync("POST", () => $"webhooks/{CurrentUserId}/{token}?wait=true", args.ToDictionary(), new BucketIds(), options: options).ConfigureAwait(false); } public async Task ModifyInteractionFollowupMessage(ModifyInteractionResponseParams args, ulong id, string token, RequestOptions options = null) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index eb05b12e29..e253692db0 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3911,6 +3911,12 @@ + + + + + + Defers an interaction and responds with type 5 () @@ -4090,6 +4096,12 @@ + + + + + + Acknowledges this interaction with the . @@ -4194,6 +4206,42 @@ The sent message. + + + Sends a followup message for this interaction. + + The text of the message to be sent + The file to upload + The file name of the attachment + A array of embeds to send with this response. Max 10 + if the message should be read out by a text-to-speech reader, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + + The sent message. + + + + + Sends a followup message for this interaction. + + The text of the message to be sent + The file to upload + The file name of the attachment + A array of embeds to send with this response. Max 10 + if the message should be read out by a text-to-speech reader, otherwise . + if the response should be hidden to everyone besides the invoker of the command, otherwise . + The allowed mentions for this response. + The request options for this response. + A to be sent with this response + A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + + The sent message. + + Gets the original response for this interaction. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index cc91b098f2..006c707581 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -5,6 +5,8 @@ using DataModel = Discord.API.MessageComponentInteractionData; using Discord.Rest; using System.Collections.Generic; +using Discord.Net.Rest; +using System.IO; namespace Discord.WebSocket { @@ -243,6 +245,85 @@ public override async Task FollowupAsync( return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } + /// + public override async Task FollowupWithFileAsync( + string text = null, + Stream fileStream = null, + string fileName = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.NotNull(fileStream, nameof(fileStream), "File Stream must have data"); + Preconditions.NotNullOrWhitespace(fileName, nameof(fileName), "File Name must not be empty or null"); + + var args = new API.Rest.CreateWebhookMessageParams + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + File = fileStream is not null ? new MultipartFile(fileStream, fileName) : Optional.Unspecified + }; + + if (ephemeral) + args.Flags = MessageFlags.Ephemeral; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + + /// + public override async Task FollowupWithFileAsync( + string text = null, + string filePath = null, + string fileName = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.NotNullOrWhitespace(filePath, nameof(filePath), "Path must exist"); + + var args = new API.Rest.CreateWebhookMessageParams + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + File = !string.IsNullOrEmpty(filePath) ? new MultipartFile(new MemoryStream(File.ReadAllBytes(filePath), false), fileName) : Optional.Unspecified + }; + + if (ephemeral) + args.Flags = MessageFlags.Ephemeral; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + /// /// Defers an interaction and responds with type 5 () /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 158368b8e9..4161a84737 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -1,6 +1,8 @@ +using Discord.Net.Rest; using Discord.Rest; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -146,6 +148,85 @@ public override async Task FollowupAsync( return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); } + /// + public override async Task FollowupWithFileAsync( + string text = null, + Stream fileStream = null, + string fileName = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.NotNull(fileStream, nameof(fileStream), "File Stream must have data"); + Preconditions.NotNullOrWhitespace(fileName, nameof(fileName), "File Name must not be empty or null"); + + var args = new API.Rest.CreateWebhookMessageParams + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + File = fileStream is not null ? new MultipartFile(fileStream, fileName) : Optional.Unspecified + }; + + if (ephemeral) + args.Flags = MessageFlags.Ephemeral; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + + /// + public override async Task FollowupWithFileAsync( + string text = null, + string filePath = null, + string fileName = null, + Embed[] embeds = null, + bool isTTS = false, + bool ephemeral = false, + AllowedMentions allowedMentions = null, + RequestOptions options = null, + MessageComponent component = null, + Embed embed = null) + { + if (!IsValidToken) + throw new InvalidOperationException("Interaction token is no longer valid"); + + if (embeds == null && embed != null) + embeds = new[] { embed }; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.NotNullOrWhitespace(filePath, nameof(filePath), "Path must exist"); + + var args = new API.Rest.CreateWebhookMessageParams + { + Content = text, + AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + File = !string.IsNullOrEmpty(filePath) ? new MultipartFile(new MemoryStream(File.ReadAllBytes(filePath), false), fileName) : Optional.Unspecified + }; + + if (ephemeral) + args.Flags = MessageFlags.Ephemeral; + + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + } + /// /// Acknowledges this interaction with the . /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 9b42ed0e28..8a13738e2b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Model = Discord.API.Interaction; using DataModel = Discord.API.ApplicationCommandInteractionData; +using System.IO; namespace Discord.WebSocket { @@ -145,6 +146,44 @@ public abstract Task RespondAsync(string text = null, Embed[] embeds = null, boo public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); + /// + /// Sends a followup message for this interaction. + /// + /// The text of the message to be sent + /// The file to upload + /// The file name of the attachment + /// A array of embeds to send with this response. Max 10 + /// if the message should be read out by a text-to-speech reader, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + /// + /// The sent message. + /// + public abstract Task FollowupWithFileAsync(string text = null, Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); + + /// + /// Sends a followup message for this interaction. + /// + /// The text of the message to be sent + /// The file to upload + /// The file name of the attachment + /// A array of embeds to send with this response. Max 10 + /// if the message should be read out by a text-to-speech reader, otherwise . + /// if the response should be hidden to everyone besides the invoker of the command, otherwise . + /// The allowed mentions for this response. + /// The request options for this response. + /// A to be sent with this response + /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. + /// + /// The sent message. + /// + public abstract Task FollowupWithFileAsync(string text = null, string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); + /// /// Gets the original response for this interaction. /// From bc0ff3f28281610be3e6f95df259fac8111552b0 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 2 Sep 2021 12:10:24 -0300 Subject: [PATCH 210/494] Fix UpdateAsync with null components doesnt clear components --- .../Interaction/Message Components/SocketMessageComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index cc91b098f2..f427513ff1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -199,7 +199,7 @@ public async Task UpdateAsync(Action func, RequestOptions opt AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Components = args.Components.IsSpecified - ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() + ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] : Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified } From 2339501572d431ddfc88fc97901ee94ebabe96fa Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 2 Sep 2021 12:16:00 -0300 Subject: [PATCH 211/494] Add custom id to IMessageComponent --- .../Message Components/ActionRowComponent.cs | 4 ++++ .../Message Components/ButtonComponent.cs | 2 -- .../Message Components/IMessageComponent.cs | 12 ++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index c5bbc8d081..d4ae023836 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -20,10 +20,14 @@ public class ActionRowComponent : IMessageComponent /// public IReadOnlyCollection Components { get; internal set; } + + internal ActionRowComponent() { } internal ActionRowComponent(List components) { this.Components = components; } + + string IMessageComponent.CustomId => null; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index aede746878..bc67a0ec5f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -57,7 +57,5 @@ internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string c this.Url = url; this.Disabled = disabled; } - - } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs index cc54722951..7614fbfd53 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs @@ -6,11 +6,19 @@ namespace Discord { + /// + /// Represents a message component on a message. + /// public interface IMessageComponent { /// - /// The of this Message Component. + /// Gets the of this Message Component. /// - public ComponentType Type { get; } + ComponentType Type { get; } + + /// + /// Gets the custom id of the component if possible; otherwise . + /// + string CustomId { get; } } } From 8042ff539d0e97acd2618fc7b81520792ca52409 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 2 Sep 2021 12:18:07 -0300 Subject: [PATCH 212/494] Fix interface impl --- src/Discord.Net.Core/Discord.Net.Core.xml | 12 +++++++++++- .../API/Common/ActionRowComponent.cs | 3 +++ src/Discord.Net.Rest/API/Common/ButtonComponent.cs | 4 +++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index f11fe4e9a0..24ced574ca 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -5667,9 +5667,19 @@ A select menu for picking from choices + + + Represents a message component on a message. + + - The of this Message Component. + Gets the of this Message Component. + + + + + Gets the custom id of the component if possible; otherwise . diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs index 4de9d6fe1e..43b48f01af 100644 --- a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -33,5 +33,8 @@ internal ActionRowComponent(Discord.ActionRowComponent c) } }).ToArray(); } + + [JsonIgnore] + string IMessageComponent.CustomId => null; } } diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index b9d1147a2e..afd50701b3 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -30,7 +30,6 @@ internal class ButtonComponent : IMessageComponent [JsonProperty("disabled")] public Optional Disabled { get; set; } - public ButtonComponent() { } public ButtonComponent(Discord.ButtonComponent c) @@ -62,5 +61,8 @@ public ButtonComponent(Discord.ButtonComponent c) } } } + + [JsonIgnore] + string IMessageComponent.CustomId => this.CustomId.GetValueOrDefault(); } } From fd9d3c8f76e75216e4ad125858fee461067dab4b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 2 Sep 2021 12:19:55 -0300 Subject: [PATCH 213/494] Fix removing components when using ModifyAsync on a message --- src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 9546025b00..0faca002da 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -84,7 +84,7 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie { Content = args.Content, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] : Optional.Unspecified, Flags = args.Flags, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, }; @@ -150,7 +150,7 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] : Optional.Unspecified, }; return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); } From 4efc907bf27532ce61e3a7b81c0bed47beeec38d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 8 Sep 2021 01:09:02 -0300 Subject: [PATCH 214/494] Add component docs and few SOL changes to components --- .../01-getting-started.md | 0 .../creating-context-menu-commands.md | 0 .../receiving-context-menu-command-events.md | 0 .../02-creating-slash-commands.md | 0 .../03-responding-to-slash-commands.md | 0 .../slash-commands/04-parameters.md | 0 .../05-responding-ephemerally.md | 0 .../slash-commands/06-subcommands.md | 0 .../slash-commands/07-choice-slash-command.md | 0 .../slash-commands/README.md | 0 .../slash-commands/images/ephemeral1.png | Bin .../slash-commands/images/feedback1.png | Bin .../slash-commands/images/feedback2.png | Bin .../slash-commands/images/listroles1.png | Bin .../slash-commands/images/listroles2.png | Bin .../slash-commands/images/oauth.png | Bin .../slash-commands/images/settings1.png | Bin .../slash-commands/images/settings2.png | Bin .../slash-commands/images/settings3.png | Bin .../slash-commands/images/slashcommand1.png | Bin .../slash-commands/images/slashcommand2.png | Bin .../message-components/01-getting-started.md | 61 ++++++++++++++ .../02-responding-to-buttons.md | 54 +++++++++++++ .../message-components/03-buttons-in-depth.md | 40 ++++++++++ .../message-components/04-select-menus.md | 71 +++++++++++++++++ .../message-components/05-advanced.md | 75 ++++++++++++++++++ .../message-components/images/image1.png | Bin 0 -> 17256 bytes .../message-components/images/image2.png | Bin 0 -> 19725 bytes .../message-components/images/image3.png | Bin 0 -> 40520 bytes .../message-components/images/image4.png | Bin 0 -> 20983 bytes .../message-components/images/image5.png | Bin 0 -> 17868 bytes .../message-components/images/image6.png | Bin 0 -> 39425 bytes .../Message Components/ButtonComponent.cs | 9 +++ .../Message Components/SelectMenu.cs | 15 ++++ 34 files changed, 325 insertions(+) rename docs/guides/{ => interactions}/application-commands/01-getting-started.md (100%) rename docs/guides/{ => interactions}/application-commands/context-menu-commands/creating-context-menu-commands.md (100%) rename docs/guides/{ => interactions}/application-commands/context-menu-commands/receiving-context-menu-command-events.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/02-creating-slash-commands.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/03-responding-to-slash-commands.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/04-parameters.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/05-responding-ephemerally.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/06-subcommands.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/07-choice-slash-command.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/README.md (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/ephemeral1.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/feedback1.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/feedback2.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/listroles1.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/listroles2.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/oauth.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/settings1.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/settings2.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/settings3.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/slashcommand1.png (100%) rename docs/guides/{ => interactions}/application-commands/slash-commands/images/slashcommand2.png (100%) create mode 100644 docs/guides/interactions/message-components/01-getting-started.md create mode 100644 docs/guides/interactions/message-components/02-responding-to-buttons.md create mode 100644 docs/guides/interactions/message-components/03-buttons-in-depth.md create mode 100644 docs/guides/interactions/message-components/04-select-menus.md create mode 100644 docs/guides/interactions/message-components/05-advanced.md create mode 100644 docs/guides/interactions/message-components/images/image1.png create mode 100644 docs/guides/interactions/message-components/images/image2.png create mode 100644 docs/guides/interactions/message-components/images/image3.png create mode 100644 docs/guides/interactions/message-components/images/image4.png create mode 100644 docs/guides/interactions/message-components/images/image5.png create mode 100644 docs/guides/interactions/message-components/images/image6.png diff --git a/docs/guides/application-commands/01-getting-started.md b/docs/guides/interactions/application-commands/01-getting-started.md similarity index 100% rename from docs/guides/application-commands/01-getting-started.md rename to docs/guides/interactions/application-commands/01-getting-started.md diff --git a/docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md b/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md similarity index 100% rename from docs/guides/application-commands/context-menu-commands/creating-context-menu-commands.md rename to docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md diff --git a/docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md b/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md similarity index 100% rename from docs/guides/application-commands/context-menu-commands/receiving-context-menu-command-events.md rename to docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md diff --git a/docs/guides/application-commands/slash-commands/02-creating-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md similarity index 100% rename from docs/guides/application-commands/slash-commands/02-creating-slash-commands.md rename to docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md diff --git a/docs/guides/application-commands/slash-commands/03-responding-to-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md similarity index 100% rename from docs/guides/application-commands/slash-commands/03-responding-to-slash-commands.md rename to docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md diff --git a/docs/guides/application-commands/slash-commands/04-parameters.md b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md similarity index 100% rename from docs/guides/application-commands/slash-commands/04-parameters.md rename to docs/guides/interactions/application-commands/slash-commands/04-parameters.md diff --git a/docs/guides/application-commands/slash-commands/05-responding-ephemerally.md b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md similarity index 100% rename from docs/guides/application-commands/slash-commands/05-responding-ephemerally.md rename to docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md diff --git a/docs/guides/application-commands/slash-commands/06-subcommands.md b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md similarity index 100% rename from docs/guides/application-commands/slash-commands/06-subcommands.md rename to docs/guides/interactions/application-commands/slash-commands/06-subcommands.md diff --git a/docs/guides/application-commands/slash-commands/07-choice-slash-command.md b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md similarity index 100% rename from docs/guides/application-commands/slash-commands/07-choice-slash-command.md rename to docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md diff --git a/docs/guides/application-commands/slash-commands/README.md b/docs/guides/interactions/application-commands/slash-commands/README.md similarity index 100% rename from docs/guides/application-commands/slash-commands/README.md rename to docs/guides/interactions/application-commands/slash-commands/README.md diff --git a/docs/guides/application-commands/slash-commands/images/ephemeral1.png b/docs/guides/interactions/application-commands/slash-commands/images/ephemeral1.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/ephemeral1.png rename to docs/guides/interactions/application-commands/slash-commands/images/ephemeral1.png diff --git a/docs/guides/application-commands/slash-commands/images/feedback1.png b/docs/guides/interactions/application-commands/slash-commands/images/feedback1.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/feedback1.png rename to docs/guides/interactions/application-commands/slash-commands/images/feedback1.png diff --git a/docs/guides/application-commands/slash-commands/images/feedback2.png b/docs/guides/interactions/application-commands/slash-commands/images/feedback2.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/feedback2.png rename to docs/guides/interactions/application-commands/slash-commands/images/feedback2.png diff --git a/docs/guides/application-commands/slash-commands/images/listroles1.png b/docs/guides/interactions/application-commands/slash-commands/images/listroles1.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/listroles1.png rename to docs/guides/interactions/application-commands/slash-commands/images/listroles1.png diff --git a/docs/guides/application-commands/slash-commands/images/listroles2.png b/docs/guides/interactions/application-commands/slash-commands/images/listroles2.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/listroles2.png rename to docs/guides/interactions/application-commands/slash-commands/images/listroles2.png diff --git a/docs/guides/application-commands/slash-commands/images/oauth.png b/docs/guides/interactions/application-commands/slash-commands/images/oauth.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/oauth.png rename to docs/guides/interactions/application-commands/slash-commands/images/oauth.png diff --git a/docs/guides/application-commands/slash-commands/images/settings1.png b/docs/guides/interactions/application-commands/slash-commands/images/settings1.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/settings1.png rename to docs/guides/interactions/application-commands/slash-commands/images/settings1.png diff --git a/docs/guides/application-commands/slash-commands/images/settings2.png b/docs/guides/interactions/application-commands/slash-commands/images/settings2.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/settings2.png rename to docs/guides/interactions/application-commands/slash-commands/images/settings2.png diff --git a/docs/guides/application-commands/slash-commands/images/settings3.png b/docs/guides/interactions/application-commands/slash-commands/images/settings3.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/settings3.png rename to docs/guides/interactions/application-commands/slash-commands/images/settings3.png diff --git a/docs/guides/application-commands/slash-commands/images/slashcommand1.png b/docs/guides/interactions/application-commands/slash-commands/images/slashcommand1.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/slashcommand1.png rename to docs/guides/interactions/application-commands/slash-commands/images/slashcommand1.png diff --git a/docs/guides/application-commands/slash-commands/images/slashcommand2.png b/docs/guides/interactions/application-commands/slash-commands/images/slashcommand2.png similarity index 100% rename from docs/guides/application-commands/slash-commands/images/slashcommand2.png rename to docs/guides/interactions/application-commands/slash-commands/images/slashcommand2.png diff --git a/docs/guides/interactions/message-components/01-getting-started.md b/docs/guides/interactions/message-components/01-getting-started.md new file mode 100644 index 0000000000..206d7a6655 --- /dev/null +++ b/docs/guides/interactions/message-components/01-getting-started.md @@ -0,0 +1,61 @@ +# Message Components + +Message components are a framework for adding interactive elements to a message your app or bot sends. They;re accessible, customizable, and easy to use. + +## What is a Component + +Components are a new parameter you can use when sending messages with your bot. There are currently 2 different types of components you can use: Buttons and Select Menus. + +## Creating components + +Lets create a simple component that has a button. First thing we need is a way to trigger the message, this can be done via commands or simply a ready event. Lets make a command that triggers our button message. + +```cs +[Command("spawner")] +public async Task Spawn() +{ + // Reply with some components +} +``` + +We now have our command, but we need to actually send the buttons with the command. To do that, lets look at the `ComponentBuilder` class: + +| Name | Description | +| ---------------- | --------------------------------------------------------------------------- | +| `FromMessage` | Creates a new builder from a message. | +| `FromComponents` | Creates a new builder from the provided list of components. | +| `WithSelectMenu` | Adds a `SelectMenuBuilder` to the `ComponentBuilder` at the specific row. | +| `WithButton` | Adds a `ButtonBuilder` to the `ComponentBuilder` at the specific row. | +| `Build` | Builds this builder into a `MessageComponent` used to send your components. | + +We see that we can use the `WithButton` function so lets do that. looking at its parameters it takes: + +- `label` - The display text of the button. +- `customId` - The custom id of the button, this is whats sent by discord when your button is clicked. +- `style` - The discord defined style of the button. +- `emote` - An emote to be displayed with the button. +- `url` - The url of the button if its a link button. +- `disabled` - Whether or not the button is disabled. +- `row` - The row the button will occupy. + +Since were just making a busic button, we dont have to specify anything else besides the label and custom id. + +```cs +var builder = new ComponentBuilder() + .WithButton("label", "custom-id"); +``` + +Lets add this to our command: + +```cs +[Command("spawner")] +public async Task Spawn() +{ + var builder = new ComponentBuilder() + .WithButton("label", "custom-id"); + + await ReplyAsync("Here is a button!", components: builder.Build()); +} +``` + +![](images\image1.png) diff --git a/docs/guides/interactions/message-components/02-responding-to-buttons.md b/docs/guides/interactions/message-components/02-responding-to-buttons.md new file mode 100644 index 0000000000..c83f1b9d24 --- /dev/null +++ b/docs/guides/interactions/message-components/02-responding-to-buttons.md @@ -0,0 +1,54 @@ +# Responding to button clicks + +Responding to buttons is pretty simple, there are a couple ways of doing it and we can cover both. + +### Method 1: Hooking the InteractionCreated Event + +We can hook the `InteractionCreated` event since button clicks are a form of interactions: + +```cs +client.IntreactionCreated += MyInteractionHandler; +``` + +Now, lets write our handler. + +```cs +public async Task MyInteractionHandler(SocketInteraction arg) +{ + // first we check the type of the interaction, this can be done with a switch statement + switch(arg) + { + case SocketMessageComponent component: + // we now have a variable defined as 'component' which contains our component data, lets pass it to a different handler. + + break; + } +} + +public async Task MyButtonHandler(SocketMessageComponent component) +{ + // We can now check for our custom id + switch(component.Data.CustomId) + { + // Since we set our buttons custom id as 'custom-id', we can check for it like this: + case "custom-id": + // Lets respond by sending a message saying they clicked the button + await component.RespondAsync($"{component.User.Mention} has clicked the button!"); + break; + } +} +``` + +Running it and clicking the button: + +![](Images/image2.png) + +### Method 2: Hooking the ButtonExecuted Event + +This method skips the first switch statement because the `ButtonExecuted` event is only fired when a button is clicked, meaning we dont have to check the type of the interaction. + +```cs +client.ButtonExecuted += MyButtonHandler; +``` + +The rest of the code is the same and produces the same result. diff --git a/docs/guides/interactions/message-components/03-buttons-in-depth.md b/docs/guides/interactions/message-components/03-buttons-in-depth.md new file mode 100644 index 0000000000..db38685017 --- /dev/null +++ b/docs/guides/interactions/message-components/03-buttons-in-depth.md @@ -0,0 +1,40 @@ +# Buttons in depth + +There are many changes you can make to buttons, lets take a look at the parameters in the `WithButton` function" +| Name | Type | Description | +|----------|---------------|----------------------------------------------------------------| +| label | `string` | The label text for the button. | +| customId | `string` | The custom id of the button. | +| style | `ButtonStyle` | The style of the button. | +| emote | `IEmote` | A IEmote to be used with this button. | +| url | `string` | A URL to be used only if the `ButtonStyle` is a Link. | +| disabled | `bool` | Whether or not the button is disabled. | +| row | `int` | The row to place the button if it has enough room, otherwise 0 | + +### Label + +This is the front facing text that the user sees. The maximum length is 80 characters. + +### CustomId + +This is the property sent to you by discord when a button is clicked. It is not required for link buttons as they do not emit an event. The maximum length is 100 characters. + +### Style + +Styling your buttons are important for indicating different actions: + +![](Images/image3.png) + +You can do this by using the `ButtonStyle` which has all the styles defined. + +### Emote + +You can specify an `IEmote` when creating buttons to add them to your button. They have the same restrictions as putting guild based emotes in messages. + +### Url + +If you use the link style with your button you can specify a url. When this button is clicked the user is taken to that url. + +### Disabled + +You can specify if your button is disabled, meaning users won't be able to click on it. diff --git a/docs/guides/interactions/message-components/04-select-menus.md b/docs/guides/interactions/message-components/04-select-menus.md new file mode 100644 index 0000000000..3f06aa389b --- /dev/null +++ b/docs/guides/interactions/message-components/04-select-menus.md @@ -0,0 +1,71 @@ +# Select menus + +Select menus allow users to select from a range of options, this can be quite useful with configuration commands etc. + +## Creating a select menu + +We can use a `SelectMenuBuilder` to create our menu. + +```cs +var menuBuilder = new SelectMenuBuilder() + .WithPlaceholder("Select an option") + .WithCustomId("menu-1") + .WithMinValues(1) + .WithMaxValues(1) + .AddOption("Option A", "opt-a", "Option B is lying!") + .AddOption("Option B", "opt-b", "Option A is telling the truth!"); + +var builder = new ComponentBuilder() + .WithSelectMenu(menuBuilder); +``` + +Lets add this to a command: + +```cs +[Command("spawner")] +public async Task Spawn() +{ + var menuBuilder = new SelectMenuBuilder() + .WithPlaceholder("Select an option") + .WithCustomId("menu-1") + .WithMinValues(1) + .WithMaxValues(1) + .AddOption("Option A", "opt-a", "Option B is lying!") + .AddOption("Option B", "opt-b", "Option A is telling the truth!"); + + var builder = new ComponentBuilder() + .WithSelectMenu(menuBuilder); + + await ReplyAsync("Whos really lying?", components: builder.Build()); +} +``` + +Running this produces this result: + +![](Images/image4.png) + +And opening the menu we see: + +![](Images/image5.png) + +Lets handle the selection of an option, as before we can hook the `InteractionCreated` event and check the type ourself but for this example im just going to use the `SelectMenuExecuted` event + +```cs +client.SelectMenuExecuted += MyMenuHandler; +``` + +The `SelectMenuExecuted` also supplies a `SocketMessageComponent` argument, we can confirm that its a select menu by checking the `ComponentType` inside of the data field if we need, but the library will do that for us and only execute our handler if its a select menu. + +The values that the user has selected will be inside of the `Values` collection in the Data field. we can list all of them back to the user for this example. + +```cs +public async Task MyMenuHandler(SocketMessageComponent arg) +{ + var text = string.Join(", ", arg.Data.Values); + await arg.RespondAsync($"You have selected {text}"); +} +``` + +Running this produces this result: + +![](Images/image6.png) diff --git a/docs/guides/interactions/message-components/05-advanced.md b/docs/guides/interactions/message-components/05-advanced.md new file mode 100644 index 0000000000..638886ad32 --- /dev/null +++ b/docs/guides/interactions/message-components/05-advanced.md @@ -0,0 +1,75 @@ +# Advanced + +Lets say you have some components on an ephemeral slash command, and you want to modify the message that the button is on. The issue with this is that ephemeral messages are not stored and can not be get via rest or other means. + +Luckily, Discord thought of this and introduced a way to modify them with interactions. + +### Using the UpdateAsync method + +Components come with an `UpdateAsync` method that can update the message that the component was on. You can use it like a `ModifyAsync` method. + +Lets use it with a command, we first create our command, in this example im just going to use a message command: + +```cs +var command = new MessageCommandBuilder() + .WithName("testing").Build(); + +await client.GetGuild(guildId).BulkOverwriteApplicationCommandAsync(new [] { command, buttonCommand }); +``` + +Next, we listen for this command, and respond with some components when its used: + +```cs +var menu = new SelectMenuBuilder() +{ + CustomId = "select-1", + Placeholder = "Select Somthing!", + MaxValues = 1, + MinValues = 1, +}; + +menu.AddOption("Meh", "1", "Its not gaming.") + .AddOption("Ish", "2", "Some would say that this is gaming.") + .AddOption("Moderate", "3", "It could pass as gaming") + .AddOption("Confirmed", "4", "We are gaming") + .AddOption("Excellent", "5", "It is renowned as gaming nation wide", new Emoji("🔥")); + +var components = new ComponentBuilder() + .WithSelectMenu(menu); + + +await arg.RespondAsync("On a scale of one to five, how gaming is this?", component: componBuild(), ephemeral: true); +break; +``` + +Now, let's listen to the select menu executed event and add a case for `select-1` + +```cs +switch (arg.Data.CustomId) +{ + case "select-1": + var value = arg.Data.Values.First(); + var menu = new SelectMenuBuilder() + { + CustomId = "select-1", + Placeholder = $"{(arg.Message.Components.First().Components.First() as SelectMenu).Options.FirstOrDefault(x => x.Value == value).Label}", + MaxValues = 1, + MinValues = 1, + Disabled = true + }; + + menu.AddOption("Meh", "1", "Its not gaming.") + .AddOption("Ish", "2", "Some would say that this is gaming.") + .AddOption("Moderate", "3", "It could pass as gaming") + .AddOption("Confirmed", "4", "We are gaming") + .AddOption("Excellent", "5", "It is renowned as gaming nation wide", new Emoji("🔥")); + + // We use UpdateAsync to update the message and its original content and components. + await arg.UpdateAsync(x => + { + x.Content = $"Thank you {arg.User.Mention} for rating us {value}/5 on the gaming scale"; + x.Components = new ComponentBuilder().WithSelectMenu(menu).Build(); + }); + break; +} +``` diff --git a/docs/guides/interactions/message-components/images/image1.png b/docs/guides/interactions/message-components/images/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..a161d8a61f2eaba566050f1f538e06e3667855e5 GIT binary patch literal 17256 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 LtDnm{r-UW|LtD*h literal 0 HcmV?d00001 diff --git a/docs/guides/interactions/message-components/images/image2.png b/docs/guides/interactions/message-components/images/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..9303de91beeede1a90c4cdc8e6416f755c0938d9 GIT binary patch literal 19725 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�@2a2iMP%awMs+3f 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 literal 0 HcmV?d00001 diff --git a/docs/guides/interactions/message-components/images/image3.png b/docs/guides/interactions/message-components/images/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..7480e1da90a413f8dfe8e13b66a9a2a8c5dc2bb2 GIT binary patch literal 40520 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 CfS#QI literal 0 HcmV?d00001 diff --git a/docs/guides/interactions/message-components/images/image4.png b/docs/guides/interactions/message-components/images/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..c54ab791f3f7faea366b4d849e05da7410a43b4c GIT binary patch literal 20983 zcma&MRa9I}6E2JdcMtCF1osRMfndSiJ-EBO2KV5>26rD^gS!kCoPh)e|9QW2_urgz zvG?v?yH|I0RdrYQ^HhwgiW~+i2`UT>42FWdv^oq7ocw#a7#Z>XEjl4N_5Oi%Qg9_1rN`1%4v(tE z(0g_*p6p zGIcmMK%S@ynuZN{FGn*`;r#avFAkRe?-y<)9Pa;Gd_R(S}f~vsw;Pr78ZNpAVI!3XZ{Jq!AV-kuAYVV^9WYX=MOw3>ff2 zag7W96OM>d*VS$W9&A64Md7aLuv!P zLJosyZu60%mKK68ud9)f1X2hysiKlnN@gZff-G$v2Gc<*HDB8UI&PMB)o=d}l0-HH zQ5W@gyfUDQ>Q9Is#<}?+IF(3CasY`Ui9^M%g(SzcK+*n2P^YnCsKVrm^+}8>9Q$Tk z4%QaCcrS7V7lP*S?HhsJ>8YxbZj5IIS_AP~^cTfpNbJHY&@>FlhNa=};{*&ou%`ZH z*-PS-hJUI-LDyp@HIK$mCt)pjK8ndS6)0~29z5v2`GsyXS%CUYA0C}g4pjB-1HC6q zR2acXq*WhX+wbl?+YLBYFFY&JamFYFV1G9-e566QapI*Fk-*YjTN~u*woTZlj=9$d z^C`SEB&7}IQ$_q*kIG7Lk|#G~m!X33D8p*F5-O^?MyN=+{l#vN>d!*{Gx2*A=!&2M z7l8awULr0JzYD9taDmCMRZXB*OE^A0Ze!Qbf8pNvzyqqNpvh1U+dvCbAI`8RdZdR~ z35mPkJo*aEULXCsBUXg+NrF_c@H4hweCepGeQ4h`s#X-xiR<`D6L>tn)~U{P7BJ}A zT~+51LIP_E+^luev|-g6%;t#txrCL?-rg|Kx-d@88e!Rr+6sq2W_~c}D;|b_N>Vt7 z6tfZt@o_x=xNgnzoBK1YR~|Y`6P9{gdkO`vs{huvtY~;aCqhOSgiQ14K^@*7nk8XL zljht`C#W@9A_!@WUqRvLAH8#{Okxo928ilUaZc1A@3w{E~7=@3h9qwM>nm zt@<~dIIUOF%3+PQI6O)4f!TnpOD;>mmio{gktn5qc1FW(QFDvrQ6t*IBdFC;Y0T16 zXJUd2i(J8cPs6V0)Fu>k9L8rUy1u{&uyhQi_p=*w5$t+2Mxav{1oO-ZTVdvm&dBKB z@wUgKsOscK@c6c*a3vYT73v|ilo{!aa%wkPa)yjzV|dsbCfUyXp{racjkxhc=T==^ zUu}(B>(Bw+<9sOCHZp`Mx zz&3R-M*R;ld}c$u7N3JK@YxP!u_EAF7PzZX8a@hYog9ocp5$nC$ldSr?ZFt}n6SSBFdPE`6NK5JKRoPcxi4^K;y&Se62Nplx`9 z%B75h44?sa)A{V-*iw$RD>8*hrFZe;bNm@ib4zaxEfs`=q7e0B{x3^Tk;cVVri@C+ z`lx=SXmkj`a>D+RP`sUrRL9AZIKuK<5@ls2J~T>(#jl3L6DHV$g+J0mI46^gSDe)a zDIIk+B9edBi?M_Y%6(x$<8a&iCI{RXWcZPbG?(FW8%|YXwUWAe?l-X*yMF*;Y4XNjkuc1@;T;pM{!4cndRDwN)Dc>07DQLV z$B9HTfI%J#f3C8Qc=KI!Qr9E0yb=6UTwo2Hs~^ncP}o~UwapzGpK_!W#h*k!T~$+} zLUdv{MdoHpBkJANQ6_9vg`%Ca&*zAlKtr!k^a6QiO%HMEG4xh)BP9!FEz|+_OGl)? zNTPF1mTMvX!*HtBlBpYTbLqa=4I3C++?;+FXqRya%-`5IGWkk{6|o~i!7+21Q3$1f zY1qEFnDt>NTkSS}gH-zN>vlJ_kyT85-My~6FcUOG)!G}$#`T9xxvgrNerD}rx)S<1 z_~Tm>PSCSGSxe*D!QY^vX^jA=!C3nkh#ZQHQ-L)w4hPd$d5h)(o)N&&?bWVSZXC5n+lz`Kye+jH zL=dyxAdRjRX8LOj=Hs5J#HW6~RweAc7@L51J~Q7-J)MF8aD@sP!o z*htpMZ#XO;vdA%JNIvKS*&R(1GF{P+wy@my!oIOwtZh-f(W}iPW{b9@b$XL?cr*66 z$X(%uyiDY4nTpI*O1IYG#&m7VemNn+Pei63^4!Kn#ggN8fvB>igMY+fVF^783JVKk zlM}~uY8(oxs)wH55js4%!}Ho<-ouK2_vZSjBRK+>u1H1<^F4IGMO>Wy`+Dk- zumT6K8>DOU+2K#AjTx*>p+2;_5KFzQ@Qr$F=`a7Pr$LN5wS(5$Zeeg>e z)W5gxlVN15E~+=}s`zTJ_r+4SP{;_s*odL85Ng^IxY@~kqztg28KE)pfsP?MY#!Y$ z3P+)1K!36PpaL%44`BigjJYmX6$_Kw*e)!9nT(m>#j%191Fn-}^=y{*Vu7n??%!eLSt#tzcJq zT5g<>#u~WIckQC`+cZSmT3TbzthhY(d*;ei_+35tP$1(18-T{>rMvbZJ{_8y6VYO0 zs!Ndy?d%>0vNy>iONdrpJCB~6ens6IvHfBqVd)T6SWaB(}*xBcS7SI za#6JZg!V-w0yr{G?l|}u*y_0LKQffMcwu%t&y*)6{$bVqjsqA_ihSn$+?|6NI5=b3 zA{c=Uh&=8_C`G1yG9f4^z_V~{D{AN^^x*qeV)iGl(6|V2ZA}4*0^E?$yo=Oc(t|;| zS2>xg==R& z12WlwG~Ha!GwJ!R_(p&y`3&o1w@BD?GJly)rqFUpM*S_W8hxsF>UVkgVDPm67PYe- zMC9}^W03{gxW!BGrSjx)>U?-=@37a2W$VCm6+@F9lcv#MUHgr1V4AhA!O%YxDv6JV zqTZ&F=j-X+z84ZIK-_XPb4p@hrh$9q#+&Lr23A(dho?OLInmkx*$0kV7MDZ)D%<~7 z*if{Y%w3l`e8)C!m>LPiy2>41sm*pPQLP>-#34{z(qar}k~0uS`^0_jFN@NmuV`O_ zogtbd&(BVnbM&jY&^-IgssI)+qsG?ocrGW8GhEnKer%sl(@qN!fGnhOOiu+7mn-Iz zbIj0k*Qo_i=Kr1|TCVDB%AU61LHW!qE>0n^?Hz_q=Y64OCCi{WacNgH_XWSVRz;L* zoIMb_6wKD7rS zJ_A|Lgo<5J@9$THTd^1^jo1h0j7}3B-A5H>s$^^u+n67Zsd_}GzuA@sJ)+Zmy}&(2 zgy=DE+inqLBkKcN=kUj*a>^UjDvKcoRKs!@l z-i&n;)S#_^lf)aN#q-TC>itV{3CSWVEMJZTf}mSY>m^1uEUTyvl-;ciTvJ{yOdB{9 zeEqMpx$B)k$%B|vihJos$j5BeN&JolTHZB?rMKIjbJgLCXwPrkft32~!NP6v@WemT z@uq2tr)`DDQ6NtsdQ zNK3`NfXs^PO`6^NF3{#ZY`b!reNaOPS{EyucOx>hvtuA2 zAOINMwkd5_>I?_B9G_cX*VpwH7niB}hp;D+9b8~{WR1Om9^hGFaDLef3rbFA^;~zf zp=LQt#KzmSwynu)B4V9;_8dN=Y3`m^bcZs}>dm2zULB#+1!ZEfL)6arh=@+t{K5OS z5Y8%tc#FzMwsun&sa_>Qh2CA#@hJ^K(3F_KPi(F}omlIRH91RyNNup4L>Db6y6cDz z*&ObHx2D~f1h=cs%QY)iS+$FNkQPSR^IRrfl#;c6+S)#D5hcszUy{pyp2^&5)BT6M zs$1vV=T#H=)KRmEe-hFV7@aDbyXB^e`{BSu;#T0kPS7IHMG zq$YO7P|P{2>K^%_jT-UUiF2E=!gJYUaLZP74zt|leM(u4>VG7srBcMGwcDHG?=eo# z?}w!D`<4nhhbC7APh5-f1h4Sxn%f$A1S344`S#C(Q1%yg^JCQfc`3-o!-HoJNza^h zJdz6q(7WCBEFOTd5S&DZJi2^L4u(J9F_QX?TC5>hzXqQD^{ey1s@a+_1`QW5wkE>q z)d10d5NT<{czw?P9lr8``CtG|{5u1gfK%Re|Jcoq>)xcDj~i*dGEZ*qu4h*SB;#l| zbFGmz5=hbK=U7BSr}FKXC=@LyGFe1iM;~OL;4Nn>{8xxv5ap zAVk}JjDC*d9(DE`_fw-$`FG>ahmUS9#pJfNOJPD**!WpT8 znh#e2tKm}(>STLf4JT>bmfHZf9(V2|qFE5xU8mq$%n)U7M8ZE6Pe8Rx(PmO!2kUh{ zy&IR`j3`^aaX8(mxIYx4(A+q5CqN+;L4(wE%rOG?agac>qM2?ard%GOWmR22hyf7g3sWgJE-eWaZwDc9)j{bviJA zHX2Oc{nRB=|3t=*Iysr|@W!^w`aFI%PquyPU)*ZRqLsT90B|BIXT!_)2ttpsL$8(E^4Zh`p+YPxqaX+vC1;3Ut@M{<1|VP`l}L+4cRm?WszV(A4UMAlx2< zCpr71rKLZpk55s-mYn_%` z06Ox|kA-Y(fqwSn0Ql5p18Noe@Z|55sPaQp=}^--`_;l(*kUYPEV+EI)^STz`Bmd4 z|C}!zQe8`!5`7r)2KevmEM~<`wuO6#4nG;0nl2h{o_N<-lr>X>|40PvW{>@h6F(b>-Gr z)hqgAQ|2s<{IFc||3gHxZs(C={zDxP%m94<7jQHS=c2Us_b4rm75d*1cN>ftRojwc zO=7APmWT(~K2oPl0uDd4^JQUo9hTqQ{$z=XDKAIv?_IwKX_sZ#m?#>J(=Q+ff(F$e zbSmT&T`h#lEqz_?y@&xpTct0wy0LsS0q+MTGG~i(+3=++OS#L=%mshy|VQ9q4 zGlEnyAPZV%KNK`s4G=SJNtGv--Pgd_yQ4HPK0uZNOAh6v&!V2={QhuBTU?&{eOj{A z{|8DvqgJ#1nPLbvv>-4F8sU?L-`j})S_t35Pe`7zaP315&Wn@U&KqtApQbZi2PH`H zfkA5LW~^88++~{>9fNdX82&%}J zaXaq9B6@SB7!UD*oL)J$zY?;(o>3aPgP5I%9PRLdGW^dAF%@qUNCGOWAtPe>`yAat zq2J#vF*a<{AB>MK=S9mB7%F)9oGK3!0iZ!wL)njL%)3vP?rkAS^0@{(NjT`Cq^@~G zT2L(z{k`9qk;Da$h%&06Qz20T&|nLpI)kYZEN`F(5+$5-(*uR|aXZozYs9yita)st zw5mR865o#YT`uO5QImNnUF9%DO@<*#9p{dl-g4o`4YhWV5&@fcl%o{Oaj}F$@_ma8 zbF&)tv5?}9pHMcTnuF1gxuY9aC(6eH8mG3}r~nO+w?I`^mgtL-NN-7iyNI-eL1600mFMsMqT4 zy%}1$7T#E?Rl*%c0F>gJ^6g;h-+AzN-~4?UTa3PaY&c5EynbxnZAI6u4*ys1He28* zGwAaAk8e*pv{->*d3-{ZA2Y4X8czD?eVLT&mTpX%WEcD0w$x%kry;e z)nzC!{Y4`?k0~UoC$L1#KzvRM@%>}cB9qI2Y3dnmkv4{y zb3AeY?#)P9KUHF6nw?pSP#}ZVY(c_F1oPZYjG`EL^b3YcE;pi-uz?g|tkulg?tb`*bBOho- zEdLZQu!OUeRYC{RRv2x^e#m#87J45R9A@RzMa2dH8I|**^n)ONHH4YL+&IL#Ct1RW zS~US4}}yoE4J z&0#8Y2ON$bJDl>Hhe6NbnwEE|Xq6ol@f1Zy*HrB=IlR4!Iw944r^kUa4z zkS1B^(yD0cgP6mTrK#K;P`mlN1dA(*3;~FAfoVbJ7wf4OnLHw^v z0P0M4OS*KDvFYW{qp!aXiK;U^1#)vkL-QU6=iO^!_kt#G6(gG6*oBup_cG{X8v@w)EkC+HH9 zhvXL=t(}05c7CAWF=2PtrS-rIo7vFw8N@6mmmnmfK0Tj&G!A%o$C@(AalPEbxy#_P zM*Md7$zPqFV?If)w+-f#IC3k7?!7qPxtqt!{-9v_PEsM~Y;a@AhoD|ddXBzVU$)*o zYJaWCSfLl;=jR&}?+z;k95YKNGW{U2BM8q;z|OPaw*Q;G{|pgyG{^+v03n0C8Up(2 zb~|>LpTSmN_!`~*LZsR+Z_Zq{ei5|WzPPlnaT`Idydsyh%J%2=0b_K zL|#%<0URNwuQJ;2V^3&r1OsO;NA60s?PNmdkce|p4T)o-i3Wo;^F~NdS%qnZ}}^npjJvRKC{wS*ikK5*KQ zUGWbT`B=}Nb#(}HHZHGDF4W<9wMK<31IJ|fC0*${gWM#~?d}CQ5?##i&^Jwy6{W)@ zXUtH1On&+W?ne(-3;M<++}7^VNe-=1hd<8VYe;(c2+^4-nI7(Drn{70yK-M0KTM)Z z{yVF5B(wseWkQ?q&@c%opHa29A#&Y*nt83~dS4EeZ9V)TnVG_VcgqcEub5=!6;upC zICVG`fj5iw*Vm6d124|ZF@nq3o7n?Q%LQNFFw4uE3a3S`7rz=0H|%O^)%7^%5A(gu z+s7t@IO1DGjQf?!z)NMmw69)gE_XB}co{XQDtJsdxqNs&`9$+2l)I3MRUaI=Coj^Y zBf)qNGpDSk=PGdTrwm{<$q zSN85@#||>{X4tH+iHX6biIj}I@XGlH;XiGgxZM;ne*!v3$IM5}guj>PkmN})i#6{t zl5{j3o8HBrWbsxZYgEjRod4vtd3Y*U9Q5WF%Z*r4QC|?8%G=gL20%S3yNH>@+c$jD28H{#`M zm88fF&PoPW^3wOusm1-$BK)h9MRrv1&akW22i2cE?BF=nQ|b=HSp(wXv^f>}f7)_$ z33OcF$$8k=I5*5q0GXT`nYLUvodiG6hC z7zJvkJ-}z5HNOvtVO?R%N#o(+37J2-@!gp8yv-^a1F>0P z=NayhgYevHDkx2mt{3V<+)%kmvFUtT|1|D~)O?#&K#(3t*`%CNG_(q_+6`2PYZ2 z5(O%oCLEPj2{x2%Ip;hl$OM^uDaRy?Lwai~M&wAMd|1P|?trhXYDFW`&t?lImf=or zz=?`8bmw0x9-5Yjh8k?6ue>NsO-@YutKD|^uDD)fgW6fWcGHps?zkNWs7+&NHXoy2e4wIlu)~0(?rB@a8qq?{gC$htLy%S@R^@+%Fd)1?mt&P`cuY0YZ zYsKNz4KPjhJ!tg~I#D7ONJJ-@-W+oV^Y`N7ulO5-SC}Gav1BNyuhYRR6!YK=018X5 z^WJc+!wn82MbKIpNiCWEGGgKPzg<_X*ej<4)w6LVb)l_MZuHy#aEApg__>!O+ZDjw8%HaIyNoCrFSi%c}83 z%@5~q;^D^kEVQJr&!3$?U;f$fh9+L^-;~|D9FouOZk0F~2Eb+*Hf6m8Mo<1dtR~cn zK&vF!2z+wB3J`_L)$A~{3Gwi+Lx%Kg20tZ+?_FX(+w~yj3)Jylx`X=yM+#F8`WJ#c zc8i~Cp?lx+R(+NWz!ItrZh~{3t;)%u&$hJgQEiUZ254fa)@VNe_|B<)kM1cu?j708<<%el;P2d z!;cNp<=}i0n0Vw_yun(k@qsG4==jR(#*18abF6X;vC6h9cRoO)prxI+v)9r!D){RK zo#d79-$ANJGoY^;oo$)T2Z8u^5Z>Toy`XLtZ~dF2&7?Kc;V*iwq?ZQdo6tr2I6vNs zrONk#iGnawIiITyWpw>W3NP6r*(qa7$wyNh+BSzx7gwdlT6SR zmCs6PmW#j!5KuzI?ZWl}Br~+Oh+Ozzb?LzNlO0Ys)1MlHjumPgbisE39Vr zV0ikz`t7m?0h^q8xN!|~E+risE6jM8xt@&6Is9x!Xt%m8;N&Q4*%H@tXFjhZ23|Gx zW7iT8-&qRB%q3Eo14MkZo=5*YvF?I!YMl1>kvk9ti!rtGA|dX2^C3&N!A z^_9@7&k8~CZ|F3cR-O8>aot6^6RrPttJZz9J=xyGR8wwqYz%ooX)Wa;sy6mU`3iIt zd;B};eW)Fm@_Q|uFL`7)5PiQME#pvYuVcPnG`?Myw;OiQ*HXogP4l5I zdw}Mg+}#A?u+2)$#icufq(~sS#CO+uz^uLd%#ArCi#0=e99F0MG6nkb-*8OE)js-B zTQaM9tQFyqKj;S|CtZWFn!__{zHD>zA8Rg%2?>2y`-*2UH@c7JHs>%sToJ)N#Vz)M z)Y2%X>DaDne;!wa!7Xyx9D?E_ONdGbb%-PWwsg*Ex=k(8FCGBp>aX}Sw&HK-eYJi6b`2d(2R0`2n(mny zbjD*extapC!D+_@1HQd;aY4h6J?BHlvw&e`2~ZBJ70p7x$FnzUC7r%;!r*Z$=MeS%0e(KtFTT6{io1b&Os#TT0jtpu|ha>Rsw8k zF?4PqW>CQop8eX#!S+pGEyl{2mnZgUFE;mbu$FD{i;4E+`UU6i9%E>WYQK@_zhxud z2DBg4_6!>{u54LMQ<4`NeIrtDt8sdT6vRy+w+0|G@p-%F+djhc1G=z<{?yy(tH_^} zLbn0ecq&gdaZeyg$N|k%fymcC{$%?sLjydJwa={@g0Ay$mMn!5NDHHXemi$|r8W2L z@#fGgWC=#qigY0}Khs=cTYK8o%D`VeZw|o880Qyde{M53-S^~Ek2^9^`3$&6`b~^Y zLC+PBWT*(Q{?Rp-t0^lzA-`m8VRYy~eE8Md9=%l-Qwg{>b#-C1u%#NObyvNlrcbWk zbrhaY-WMw|6#i~k?B3}@0X1da=VU=!i)*E?{xzsOU802JD0+EyZTp3kizX+V-giW` zh#U8O`wR8#*Ns?&+thx`-eMg2nbG7?`l@P6A>f}MKhiFGd%5wcDyO22w3UsO`TCvW=)b#Hzd2)dliyn>ZZA%ld=7uuNR6d(FN7{1b z)I}(!McqD>HFWDHtdK#RE!r+|D-uO1$V$Zp0CihitB@N-iu#KB?B@q*b*R|$ZxV1R z#ow_!tq&I`^{Vq+s-+(tMB?KSNZ(*?XQ=}N56)>pR~N@*IDp=z@L&*S=U5+KP$_#3 zK?waY!&sSmci#zbyex)UyyCgoYDn1O#q|SJMj=!_3|+to2djQEK`V~(!AG{;kV5*; zAy6oU(O762P7TJ_119cB8mtomKdN#gVb}#f9}`etRD7f45|7Pu^MeaSf`gM5GR1_3 z85BU4frjny9&P=xUmcc7hod^rHGGLi0s(A%`pC=b|=p z_PK=!w7vLGSWm&zTnJp&>bz*`qMFRQ!FK&b#`?wICW@{0D(eOi7$>zeXZfgE^g@!_ zc!$nXB8O=M(XCxX2&paP*(yBE-}W@PqQv!6-;-cN!h=ia6A!dKKO`4a_J>2BnI~a+ zTLsnBk1SHgITr~b{rH=;A5b$231=+!zA%K$lJ?&jTAhn*!uHHWo!9KrTHjMT43@e5 z#HK9km)NdH+a?%F`-2V|l;amVo*R^3zO;M?5R@>Vf z_p#aK1}@Mb>ZCNKV@>Gn83rQFopB5(D)>i&QfV?G++3w@vf1ZxD=!)`<(M-q2CBg# z5ZaaI&-HU+Gq%$s{KR5wWrF{t9m~cpD9smxApVa#Ao*qTF{LpXuj)Oucxhaow<>&{ z#w`xdlChRcng!cdl?qTFsYo3$dnFY&9Fw|FIF_!+mPLVQ_k3W zk{Ia`XpDS@INH?#+%Vk3Vn8vP`0jJ2*T%6m3`W{jcii1Ch7k;?VV$9K{It4z? z{oV^(x{O%Z$8mbAue>d8$QBrGKps|C^ZHItQ5R_x*X+0d0!)HtE^!P6oYjS%%;B|P z&6XL`qqY3C{%ZD55KTO27q)xxxNU-SFd(QKbKEj$c^yZXjwiw1~GMNu~QjZpk3fZ(3xYs%`o}2MCl=8(iO3?Ac?BuEO{#B;J^#BHzNspkd zeDkgIWY82suQ%MRQ$rk{oE}|leIIf4(E+Uxk9QlRHS>gFma|Ifd0uk#eT?GxUpB`8v4b$zXFuR|%gbKW?$T<5J zqNn{FDl0Pw_RAd)4vj}O0BPeDW*qz!L2ek|1vFiWhzBEZF4t!HaGSft@;Oq@}G=M|D$i8 zBUT*4_-Tmsq*A%Uka9Qi3F-_BkP{RUySAe4`+g1iQReD;q7-@C@iyBDo#q&N-|i!7 zE6oF2)Kp;{AK@t{lWUR1U1bkEGV0 zJmhe9>3@vG zaEGe{gLAd&@t5^^X|Yfcv3^aE%+`4$wePG;PNAG3s zeOA`SA8cy+@Na;=^GoMBA{%MF%=B+N!lczFmj>fzNr^`VJ8R2^uCr+26baHk4P) z9#VI?m#&!QW@}1h2IfhfC$U1Wz8$;xjj#`S)n~(PaoqLBC`B#=S|ikvR)1b9$7=Z3 zEST~h4-giUXnSGKaBg7BAAJ+ik- zuk>(^7pG^){r&F5v%IN6ie~gTFNxrdxNtQ!Of3nh;N{b$=Ep6^%E~sW+%EJs2?*U~ z_DYlNWMcrDr^khC+_ye|vNmH~iQuT!?!EVk;Modj}wD~xO@u|ni|3id=eC?)8&HHKWlvCw%W#Me+x-J|KbI{T1wOL3lP^q z9fshgJGiZwUNmunze@C=qKzC=2^ksi#=Ahsy)A@9L=N?VudFUK?;#8Amz<>Cck!5! zg$)q*uI4wSa}~~WPYH$uKJdsSF3?qt#zBRWKX5Jn-_=TS_6rKRiD_(GB8t@5TV$kh zuvBCn28K9q-gY9t){&dz*$mI>;yI09wqVHKw7u}Hf`d32S&(%Q{if-(gOXbsRTcY? zmEV<{>4dWM@M9OG#BUi))aMU#|2jI#gq6i*r4^{Xn&V6M7USX`U;Tv4N)p?$wW zn*KwUH?TbE+r94yUy=JNtc(0BVq;%Mu@RNRli~><#<3_PVG{a>QhiT(90;7N6Zk(ZH@2;^8SbS$NKM{fUpKKjRvbuF#ILtJUXRb2 zBcXaCTx|YOl%PPw_*b*rpT1m13!ET#Ibs+D{m2M9`7iEt8^Mkr+6;_`)i-J5Lc4j$ z>YeusN%bJ-q#oX{)4~p0mQn%sFm<1L7=yxpkUvJLF5m8(lL;P1@_W#XK!!MSqVhg& zcYE>*>R(gbH39o`*HRz;fKkRYn=E_l&YC<2_epDBX~|{b(bUrmqxY%rGKxp4f|*OS zb5s6^Ijn9WF4TxzKQ|@qr4()jAL5CGtx(ml`TzArR0Xoh8%D|nK1n7O3nu0#%i}R1 z5TVBw#C&Vpi5e}`iOMt%#0lza0gA|@hrK8h3X3UZZ4wCIa!W)Zv}pKUpE%#(G`-!H za5bq4)m9Ta(=(K@stv*YQMGd%^o#sAKPXj%<07`53IGw)U9SR$tOVlH99ybzul^$U zzbi&I%m_BdzVaE@!))}}1Rb38{a{wuEUw7}^hVSzj?qKyNVk;nT{hs5(B=FYTGWh7 zp}`-UMxUjb7sj;Rtu=r9XGiE=8LmJ&1SXCzQLTr(t&!}Xc-XFi_SNd^FGT|d=c~^L zThQ_Sdh=Um&$R*|a`jaJF6Z0pXx7e?RX4R;uFpKl z03eyZ`vcwc+>THSm%*vsqg>DnDvD9KSElX#mIK^NU?0%S`tcraf03=WNhEAs`hPq# zdivOvxP;kLuS&`9z$8=6OsN#tA8N}Vf28gpSTbsakb9nN6m9RJSM#wDQ{nJ)H@8{3 zfThmcy>ewrc?tBCa=$moIMQIlsrxU~Tr8Jf>PPn-SK#(PI+ypGVTnQ?Yz*tx1NwRn z;JafVkWG2iIXwL&6c`l0-y(SfA{a}+fk?-Q?XDZE`d3n2W=y*SM$bJa{ z+vJ$$e?3*7kc9T=t1gqpgg&g8o(R%z-1%+2^hS=qnliH_hbd?qM<@tUkiDG-xXg?( z8SxX1FN=9U_Ud21P;MpoQ3l|UBHD?QDi(6RPl5;(3_E^xTV(N+CT5??foJKz;;ZG3&saYLdA`b$w`l)UYc+vfttV3LQMYO%gCbZqh7e+jcmD2(#!oETJ0 ztdZNL<_GFDC=VvmRz!8bEPvd$+!rHA`dazzZV*W$5y{Zj=0kX`psFWEW zX|lm>>Z9jfvt-i?NB5)mbQHdYu4e{xO`32k4~Tv3iSCo=!wm9wXTR*Sq(5T(w^i5i zXxh5@>3(h{?){X-#A_l64y8V+suNcrg1dU3?-M1bi6H8)H66rHUFCOc-ODioO+H*a zUuR!WZEFH-u^foCQDzq&o~qBTq3lgX2W{aJ*G6wIzIrUC8Am1$Sd{&RMu%rT(Gpu- z$Riq8duv2kv1k}c0h4&%H!bkj79JUgGNNy*By7>&hmOzQ5UDvSUP-sNojz}ZpRPrB zu9~pSl~c$`DT3-(hA5&+toGFw$5w^dH^KxSp8>nY8^A7H{#N$M;-sjp-+ollEet5;*ysD~LAg)mZ))5C20{js3+cp?^EZIJz;_vla7r zvOeExV?B?<45;jVes+O>c51oZqW0tEu{xsFJq|fsbnZnBGc3BDH`PS<>IuQn%lPAt zPiMPl_4z{j;{PkCPW3xNb_p-S-~U0NW3G!>*bDFJCe z$`cIbsYsC`ihvNhbPywmbdVlIDFVJ)E||c~cH^Ytpc)&H>erqizlp9*0lx@ml9BOL)l)YeIPCA4r;OWjZF)A@M6!*G_3N zG$n%kOb5ur@hG))Q!3FoA8NApp6X4^_YMKw5*?cy8-Ag+WbZP?woT4H*s#_-D2>4S&!rz*K4i2}c?|y=setum5^7jnD;QgS}r+%j%4+rk!?} zk2M*;y|5yjYS?I)L?vIEB|jIuKD_RK&d~2vX{BJw?B#B?O>`_^2l&6HuF1(sp~_O@%-tf<{cZDH%!f0C z=1Rh+0$Z79x(Q{RTZ27w#ke!#1JTSCP5&GD(5uo;RR{d0LEH!7w4t=07&Ack-0zZS zNfrjl-&xAbXZ6;!D;@tbcy+`UHNF-}ris9&3H+D|B3YA*q+&GbI9;Is~i(If&2*~nh$U`C^Ro(8YCktqrtF!!wTrTw%9U(#WXLIepf`jl5+9jb^;PA@<~8irmIZUNeDL;m$&=9~2KsUO{w3cZB+*E(&J` zn6rBhXq(roo~=3!{gGOlC*+E$vzW4szN9r9J;Su`a?ogecz>KX%lZ{r9-*Ay%MF)t zQ}Evuybet;m)}{;orz!9l~N50xYR$eaQ4nfAP_^6t&q=z9F1JsfMS2RaxZP(4h)z7 z95tsHH5)ah{!kUA&sE(3;i(uP#J1i#3!Vl{cbdR|?;VnQ2L{+HzF&%w-#c_^BMZNp zg`2!4{KYm#7eCF^SCORWUdVc#f*T)+YJXFYZP>*Q_mT5Xd?fX2PgT_&gN{017mDnD z0*r*&;e;od3Tm7gOVHZ`HlI$!qH`^ItbZ72QMGdV@K#1jwpCB>toqEGF{;E+7h9` zevUiWDnH*KVhg&bKK{sblOR<<(pq=f}rO30j;Tu!SjOQ`By zYSb-M^+%9XzmG3UPcKgOV4%oTR1%1#=l9hHQd&mJC81ELh=IOZA^t^pJg)GyhU4^0Jz~Apc_fpiF(qr z3`>nhkc*5<2Ea-mvh z2Hfk|@06Q9hR2qw$w_YQNJs|7OB5j};=y|>m#9Al{eacOybPs*j+BsEhRw?=O~s~( zy0PtvhxILV@df-#;Qak$qN4Y=P&dNaD!tQ zZG|N#J13-MDpM`~Hq2|?8)x;2#m!kglM>h3GRA^g4S2*^5@6}_ccZY3eD%AvZ;$?R zokxoY759y$bX#0>8ebK2@FVx(AG^$s{vva%?!6vy@TW^iFX~tu_qoSYF#vyut?~koUXitzV$%X zGu+B8bUlXkc-C>(!T{LBY*N`X0n|)7;+!quuE%#s{o_NL>=xFOk~K}8iCjA5@6`W^ zvv7&3`=Qt`cs|iIHR`34mNH%|^4my_z;OC(%q0AZ7+}YkmE{X#*8K)B<}l3VLA#=X z5!L{UN~sjE8XO`9Dao-n;~GM)1&cbZzIq}ucBshz1K6}~izUULZ4g@cT_O&9E1i@; znmzd$QL>V_IREv*;|Tpw4bHEK#?feoOkI1;t~7GR=!(0)xB{4=3xvy>3NOf0fPt@Y z7QbGQtSsWuJjdtt{Mo$T1y0UmHaD}Uu#uWXoW0q{nc+S^C%)5Q?LRwEXo5LG?UGk| zPO(~PNK+e$wFf>_sg>3I8j>n3zNOCz17!$zy#J!}lA+B0fHa9f?BEl!FA6rAwEfYM z4a3fd?@gI5*o4;rQugdk=O~`aRR(K8ul~{O#kOzV7@~Ch&4!`bkO>2Hfg^%Q|NLdBae%^;&ZjyE%bibYT=LFg^vX7I79DAs_ypRwoqDudu>1Xu z7N|N*o}*fRpGayi5(wkFnOIOh6lz@P`7S2~^lsiug) z;%`_}tihJ?PRU)##mch^4mXx8p=_C=`X543C_dUO36BT6W|T-{?vZd2h9zDny> z7ltL&-aPfftRPcdn(f#;7yeA{y|`qW>c1~nrRH&*6Bttt_R2uA_hQFj5Hw$UaDok_W7 z0f;cXa7U5-b+?-9WcNi4f-BW-19xk-XN1?`-e@0V1qIVPIo5O6$AdTjoqF!L_VZ;e zOeBK-NPuJE>YuG0zqoijd;{NY0Xze)*#{Sls2F_2lw`xRspD&#%?IWxFh#h-y_Ki~ z7O&vw9q=(``Z+V)n(@~-Ye)@<7OoMmvO_YPM)}V?mw-V<08?KoEcv)36pI=f7`)?s za@=|ImJ$sOxXTZUQ}it#$om)>g8aM`pi-r#78jo?Lo(LqHs%62u-5^Tc5&wLds{(- zH_W_(k(1p&MTSGi1Q=yD2|Sj%@Rs2BZRg#n-~GEKYdDfBW$+79xQ$p zg3)vL=sTt3T2$V+GFQB8VK6Q^_{l{(!)+WQD%z1bFd?;I$0k}cYUV|f$AXP(C+6i` zaTJO#A>}Qgcd@8SBS_WGT<|T=mr>SRMvM#2(dqP5#w--u@z;s-+$O#HDHS4CFW&wn z9sJ>=`J8@z!nL!rT+CrH;YN9sgCE+*T3mYhw)SWQXR7dhHPHET#m=rWu~GI&(O%Pn#^Spzetd0(Rkf{^2-Q%)SOaIBs}4+$#~Iq7z%_=r-jpn| zS*>V-VAs0fE<)MOl?A#imj(Y6mT1s(*l~xqV#+^Yc7A(kEkfA&>SFN+J=8{^ZaMQi z-vj1!$k!mg0um2vID~VNi=+BS`}Q|of$XU04j(jDST&qV7i&GxI?3}xrHDpsQ;7(f z9x7_?stru=-P2-<7bHq@s#)5}gD@GFYe27H@mhIizz_?8{VmPp$*O!N(Wwnv8}lBh zrY5WZ?rsM=DVOZO(%U|-F1o= zu~{#OTXr^H&@{R-A{*{e^%Pyy1-o$Jh9Kx>l7FHiy1g^UEa=XcD$(wl+A=rDK(3_nvA{LdM2Usm52t z#Kq#&;fPR#GgK_(AO2o{Yg*PPOeiu;Ie|N&uqirSIeSEZ`pS5F55srXs}U5)M%;n4 zIE*9d#AY!S7j_sNvS?|45DcRs?0Ub3l%F$D2%nS+zX=9>q~IR*_Wr37#FlMY5`A+a z=HsGp(|9c!_!@Q2^WD{xUr2MctN?-L^17fF`pW6opXrW?{kCCcm2Z8m9sKPccjAv) z5G?iYGe&|~kKq=dCFSz@*{1udYZkd5+AFA){wgW*KD7CiFlID)^o51iTS`-yc6j`Y z#D}JwJ@IKj#fl^%(m}ovPNH%Vj3;t*HEzSDbyqQg=Rx z#-1t1c2s78%B#_}GsUTYDQVy9alN;7)Kdgy23nOmKHgaF@Z|AwYnTAi;fb8{8eX`TlnQ z*sa=EuU=OH)AV%r?R#&Zb3Ssz)l}rrQHfDsym*1GATO=);>9aP;PW6dBJi7A-|ZUs z^U_5_PVzu0qzux-5T#lgnLjz>aM zeBLGJU;*~9J^$ASvD>|!n5aG2JFT&|Mlu6;b{IrVK79(lT7G)L-c>6(>Mdnqfq2-q zErg6xvr<}|-5nC09>o)Q)M(%!AuCHPC?t3?_9yxJdR@Dpn2IVdx7UE$}_6iI4t@e0vei{|8{qN{YlQ=*$lM%lQei8d)FBlj@u9V z6-KJZg5Umd+19WB+=Bf4e6kd*GEVnXJ@jo_9Afh8QHqs}aNKjBvDIFWvkLcfnkpIl zL&E!=(5LXYI4qH6llA_XDT$%^P2cn;TNyJm?2n3yHQ+rr(C$h)r!R3H6?L@0dz)E~ zD6({$A)re$eF;ZvZF%zx3f{T3k=4|2e)sLZ`LFSHn7s+98A2ez zSFc{FnV7`t>b8dz714pBwRU-S#i{qq(@Qn!_BNj$R$@=)BT|nu9hQT$#ZEb<%Z-CC z_C$NdvY$xkR0Wap8QL-=F(^2+HO1eYO-BCwjlfli&-St-V42i*o zZFeC7H8(XGuw8p>GHGdR@2!0BThs%+1$zJa0SF2T3#sVnWVJloxK^O3d4(1 zV|pAMoO5rDghUQuA%oB)gjC~zurNoXDY_|rOyT3#=3mgIWG!0lf3Z?gQ=MO~Yw@GJ zecM}Y_T%@+AC0@1>Ah68Pf?*MVkJ^Kj*c9!UcbJ$rFfdbbXx9Mo?iIXH+TNk&~5J3 zqW5T1eA4%lGAz5An&!iK8)2PN%0 zZ#w!*|ChH76RX0NT7$|dgMyR`f4mFyRj%*u*7IX^KM&U0fJeDPd;O!%UCGSZzKamt zT~Yj7s4!?E&+m^KsAyU$-EK?xN!@WwGepYoh&5yMq-B zJAg+W)78 zAKtusN7~bI<%`+owzFxb22p6p9LA3v8BsBU*ZJOIkfp({uhK28tj3~i z<)TT=Y*~AWwAOaNK9($qk_l>+EN_Q@*pJbCsXEVCp?QS8$7d_8{UsSg4X1!c?Ri?; z0n=Lil^jSa-;Y(>L<4;~lO+)>39Z=>QP~ccGUO>Uoq&y*4P9g>F({xUBw;l)HWDlP zBZ3WUmFDqf+;;nT)wnH`XVT5l?UDPk{0hIn{O<*TTK(yaYI3l(M4<`nB%%}%kKAHJN@80Ag<`}Zxg?ex6X zzt!;)p*2Dkx{~F0OQe*>wZ7xJx%TBZJHx*PbPCZ75F0l3*r!mlLB)djb4B*9yw|~6 z?hhLSn5Jj_4PFV@&4pSD(;cU9RG;gyf&Mnb@$re{lhC8J4)^6>7kq}rih%{{SCQ-; zc{93NT07Y|0laqCq+;IJkaHhhoO00z^M=D|_JdIKFn@QL*XvY6E(#6U`CQuQ$=p{P zLlVq5H1ziaG*Sqzkn)Iq_p3t@ImIddEg<;+H-tMU^jW`fyF4{gkCCm`sS_F4*v5d! zk@c&;pGtsHp(~|-4)bXr`vY(5yhO*vWg7##I|AKJ`?beRv*Oaj+Sow#S_5QPjZS2D zL!AL93#NYb1i=)`dp#^Z825tf!?)Qs_bSoG!|6(+(4r!XC0=U}x0ISB;APtXiL`sU zrbS-BTp-cp`b23N3@<1zAJX%pB9ayN zstV`Hu9~uoL`>XQg+2(A;R4;eyH$a-%f)iBrq!zfLHqEW%+#MenOSOxV}P9Z`*jL% z$Tf*&IGaz`{p_erKN|QiV$76d;J#}REs!XQh08;zpA#lJVajus6gJfZ_NY$3nT7v% ze#rBes4)NE2Y(hjUy>Hba!L(kXsUe^kEsI^scV0NQwnc!A(0DxY@o(vK%mBRPtUdU zFcdm`cAj@$=K+sRPQDNm69d_seg=U!++l`>uB*Y{g*~}KzF_xGvWL8zN z)2Vz9OPRK)e|~k4O-y&TRP@;*14sSl`%K%i}cxxFn?`4Pc|m-6SMVl+?ji0>n%HO1a^C3gxA_L$ms zMfER4n6c|_Ve04GbE}ea=r0Gz9Zly|$I+gGacWZ1=gAWFW;m1?TtXbSzdA=))FUOW z*Ie^v_N+%w6;R)%ij^02vaDgvP@6O!yBV|LouoO`3WNl*kz}ySsnxh1yQNx zqJHH{1&67I4I~sQVp*fhNJ#kC5bTVXl~uJ6FE`u1?2jf3jTuo%N=n)RAC4+2D9C>K zf`HFzSfbckV3b^63@zDdsZf>l5tfZ5imt8Y@?E47W|QVQr8jse@u*&ttnlTXl!cdxYX3I zwlAe+WLM{HD!Z%8l^T{r4gLDQ@Vnol`TA~nwN*KonNb$0rWaKn;SBw7iMMag&d!F^ zAH>&#TR$45%0%LSzHfGd-|b49nquMmfL`iraqREx{L{`2mXVPg%?=9-5!LBM=X7f1 zuP;ltp1~hhV){5rPeW(AQ4-(0HzEW!wX(IA^pJjoU-qKTaTTvM-Zf*m zsMGRo!5W*OAY!f>LD;ZURIX#Oo>5O3=nl8IRQQ71D z{gAw(V((SdzFbHM!X%>-d;nJex|Cl^iycV z#>TsXvN*hVq$M+LRYy%nog}G-Ug5_0IgdrJsp!T$=(wIUl{+}552u`j<}E}_ zY;tC5ouKQQ*6-%8+{rAcOHvuk+FvS8MJo~ea62>G>Dz|!nZ4^A$M1F`8$ORUa|L?&e10vQ56#fLu7OH{?Nz;Bx%8jYqRF6i?R@_ea#RJFAU>yQOZrajDu@rKkzl|9E6AM>;c(2Qc099 zNKZ1V1=i5eKz5+ATx7qUG-6r!gv1tBi!dk9 z>oh8Ibv|oR+IHJ2=qgC+#UK2Zjo$=Gf)N{9wU+H!hIfwH=f9{w+=xY}3jsc%UOAi>sM_Gv3-7CU*l;)0U~; zDUOxyda-@=_(}_3qaMk<)_W&il8d5(f?1C#2#za&&|Fp9E18&>z^2G(&f3bEsBNg8 zp_mli-SGwW0s24mSEvvu7&3*R3*k7LUZlj|Ne4m9@cWY~|V zL-N(|fB+J1tj8qYFb(uT{9jcZM`gc)5NRamu>Dx{S&Gp6+NSFZ;%l7vcL~D z?nkMXmL)TV;^7(y#Ur~~p(t@0v_$-x&{=ZGy%UQ`CuywcEi>t^^MNv5B8JUF>1W#i zK~t&nQ}cI6T~!NI!|8lTS1@mOwvKb0r9F6z(9zGS8J3BKj)zO3R-=UUH$O@zir|$u z8lRmfl=-^x2_g?3^E42<=>eK)47H?07#z{up}JEMk~ z*-1;=%^z>5iH3#PL@{3a`_DFe*41on0PohG8DfF;QDxha&V*6(<-E-~2iD;~0k27h z#Vd-d)%m@usWTv2UG!9M$Y^Ms-Yts-=Jm?OrKAK1xD-U*`Ya)I)Yjra9?wjwt(u*XBgj1dU~37_4hgoIcAlIsK?C(E8*EC*jHm)BuS z*SaEJ+K7mI>tO>O2vvdaq3hv5V5x0SYtZS>&5*D|5vnbvUYi?Pme(yK*}FR`^!7sa zi!Z50MX?8s3-(h7B{0a*!+HZ1cnAg5v<0d&c?MOCZ$juX20Nvxwr=BW-@^^E&QHr0wXSqNYCIgTvFv2dG*v zTWv1FVC;`)2oHJy0Z}#pGvo40Na9G=P4c##+=sb4+&wTUuyYfA{R6X>(*`Hk)ISxx zISkpW8h}rgfpwoWDWh8)+D{N|m)a57JML?1CbhpXtZNq*6|I&QKdSOs(^KVft12pT zf3_RwrxyOi@`;!RM`MGISrhUqvVL>7jHDwdvi7uA)Em-rB{CV15VwjJ5gCa@nq=xFjGj?m&VR2gY5~ax^E7P*sI*kM?(V#C~(KrOd#joea|DDGdzT%iy-fo!Mtah}h9f^*PZfpga zO4e$d`wTKW1>@CY^os(hzR&CK<^7NTD*pelVHuaaiW1%UOZf8S z3^rWoBiw%xp&P%$V_%u213(~;dx2=iLZNk4u5T8L9J`c4n^P;`KQ@iNn3iQX=bg<& zY}Tu#DVz|xN_+q(S1vyj?T@DDw7D6ECYC*KdOpcbWL12GK2qhT+ zi^9Sd5ye=*jG6H`gI5%)0)Xu+_C zo?Z|qa82p2X|1iqqK84xCslL)?=X7*!v%Kdgwhfj42l4#2|LqDuNJt}{~tlP(txy! z7(9zboE#l@to6oV9UF@j<>>{pkJ6)8$HZ6&ulMWy;VDad1_{ss<)p4}cuGH4hhNER zpeq2RMr>hTafgh-v?%hNgPPcx91;ixi9+AELOyHZJ4nckwNm0`sL-;o>boLr8S;~; zkEwfgLTgbee9k#_$~}w#eo&c1ff%*^QJ zbv6~z`LueWiyEA@)Bs&!X?gRpSHn_^4u@;IB<{nQ-WpkQU%I-_%Iis8GL94JQDyLXGY(WrP!8ko2|)UQu2Ojtua6TEoyF3JIdWxTNud+V^E)Ow&G4I#s{^vOm0j zTh%DEvmnz>qb~LCvs!z=U{+b^2aqdXWGXo)`$=PRqWyzvtwX(539}?_WtPONIM- zQw?}LU3EpuL2i%%gs!Hm8>(F<$~pZ^Gx&O;D^}*XQc&4~qG*d#KMbFoosDTqFIxJt zNbzt0kq{eeg$e8;m@$yd)H2BRiQe46Gqw$-`NOzz>8pW;ndO3jf#TLyW)W7ra1@m9 zLXejjr2HjKiISncmMQhCkpF=BNWU6tbQQN7j)pXz4HZ%^* zf~){K7&d5JYg{<$Z#(kMxgvtT`d-Y$;~AUu*~oiXgREzMVc`UJN3j-&DaO?Z#7V)s zbK(?PrA}P4vAO=mUA%WIzXYf&^gPUH*s}0qemjZ<^`Q;?E_Ej|$S}enWBPT~`6RWm zc`&W*(a-=E{Qm3LFG7R!1Aw*1Cb5}_t}YaMipgwqwe$k$`+wu(0l$AEM-g)N%o3NB zm-hhBgJ9{hw7OcYtBU;)5qA2+yK}ZI6en)HTn=&)Rs*1}vAN=bYMO%}#4_o@UFt$+ zm1}-7j?%$_T#VJ76@*G~??hmYsoT4vD3pQU^;miV53cH(L9Fibjb;fy$7W|sOpp)} z0a5~#`%4+xZ=P9FRyA`JUwO5pP`$ge!?ATcYK<--{;i9R(%MdBIz&F^@2X>uE$`k> zSEfbucF29=X7g_az$La1am8k#DA|c zqA$uNVD;;zKw9c6t*qaF>VM*x>bQuOR60m$gCkLOD=(aFrD{?aVeD7C$G8C0`mvp9 z!y;laJ>+sBIA`(n2pfp!x=AzTA`_F^$HNY8zwKGV|d_4?e(E0IjGsc%;$d~~W14zNN!?U+CxIR9UUKAG!vJJ_k`J{VlRM7<{o)d5r%m@;0+>g2LhI@>j#!WY9&O_Ple)-0^QvzEZ^~h z_g&vw+bo=%-pQFdxSL8_FbFPW@H;nux4GdWOUSodS-QCc2O%4>%Twq7VY6N@XOI?iFEqGT5BRbNPP zw7`*IGSV)p)j!syCmFwP%B6{lw&LttR)A(K_pTVUTr?W3qfeyI%vY>vv|os+t#tvXru4d}HLFJVKB9i30=?qoVm5SVWiPdoF>}JjHzJJ95y#bWDET=+0@VtG2eAus za`C)CQGa>uDn*nwzu&z3N6+WUVE6Z*xc;R>%GVjlsLoU$qEP0tGYvBoC-f3a6vxja=W4$eXjsS`I7a+|ev+wJ=T^OEYL_s*;Yl9$zw(49P1_& zVj?Z$(^^|^(6($4TBR@z7~B^(jeGspLaukts>i=arz5tq-52AzvbHZWwHXCnX0YH2 z)~qb51qEO4-ZrC?K&!oc>3R1pWtB6ff@$VHJ`A7~^zl0#Hp}BdX-sd*IJ84lr}^H` zE=P&uC4Ky}Z>jxhFX8Mn7WQtayI6&!TwAGuRsyuyV;v6|lX&+ZuL3%5X0hls)`8J< zEkOOClBC;2%wuRDo{RxqQ5}Dn>M|l+ttvw&df^s4ox9QvoD~-RBaS4P0mzOFVG1XKs{GcYW zGHJU^VFn%1onLAj6)w-X2|ls`I)zQFajyl&{jeR2?JKEr7wxuBNm1x~>YBKsj78E}Q+;tNXF751_s_S_YgxgS0dDyhh&pPWwq>bo(M4#A_t^V(No zWQ7KINI{1R0uBj7(_+!iWXub?{5tFv1?Gh^2s4R-cGvTqN}92c$}4|%QoHf{7Jeu_ zYLtfw{@2n&CA&++^-ad(8qjnBvR;7EYuQ7w$#3_PLO$l=3V3ddP6~d4J{e)*oV#*4 zvtP`QIxgg6-u{x|&NFjxTFXqHDyclwI=ax-T$WJq*dzt!b(q&mx{&AU>CY8QklV_J zQ;UFr|95U4ePZ!kqs{zn6QOUio*0#HXnB74kUFLnkPf1iMv%l41)ZC}h3^@t=`Tdd zoZ*sGb2NM{D&24AL zx{Uk?iyA`v@PRk4vT|g0ZF2DU&iX*KoTANJeFKB&!eTjnePTLgL8Ql*k3ezuA?1>d zlk+8GDPu|bj<2C{j${Qi|=9nfT0cmVvxsfkZ`9jVnsWJ-!xbhJyNYCyHZo zvH{d5N6T+Gj*3^Yk$ACvr3;>8<2m5iYF{_+Nzfu=TUOk%SreW;6tHbS&Q7xZ*0_2{k#R#VVwX$SZy_7(XsCu=hA+g_T~0F z&f0nnAkx=2HIdk;((p|6RMUbYA|evK>J?SDmnjrbP=1r8M{+eRw;OrF@6i77 z*$RXLv|sP?@>5c5MHdZ+iRUJjtE(&NlIqp^iG`lvoXwU3;D)Gdx27ED<~rVlv0v0a zX7wKLv#{tnGD=EHR-5(8f*7&KR!(*FxOk??xs1K&Xytq45DKa}5>Z9*hcd}yn73v3 z1`>aZrBDfSVNKA>o6;u5N<^y>)8i9NyYJ6%Il)T&)@26OUYZE7`{s95 z?b(klxcsUq2+C+S#!WPnWbq z=YfZX`Rxz51qnI61ImiKmsi^qu3ekbo08&^~@ZJC+q@;uaG`K<>WrL569h0#tAg{9u$$=9S zBi_rs0>nl$XqEFr@J{%IoL3E)inH+US8m!EGNiYpkG)C8{s_GG9{(Ia#&sDx?7=6)}R_&(C{1HAWmZ!p~oUr|K zu-64iM|wHih0svZO_e!T}->96li(pkMcUDpJT_r93QCH~>yj8`$_SqM>NuchQtdc}dbZwHi43_jnp=T|TcBtK3FX1A@H0d^hV<-HaakQ4k2}fNle) zP|<8-vl8em?<4EDot{*S>gjMGc7bvKv*s_2AQTk_rn-7~>#bJ@ zn(TwHOC!G0}`vfddD$5 zII(d^O$*2s3mFah*S#W}PWD7p8XUB$cu7e)_qpah3yW6hrasHY{GXX0p8J-_=$~QkuHyPk6K>k z%SB6eqFx>xkloffPkFLl_rLNj2h4Tfi(}ZSgbhvPZj=<|s~?x(qXNH=Vzkil$wc$I z-csdFblXfho@W19WA!Q$GHGxdw`A^YU_i*13)!tGTr4i^t8~Cf`}0ALN&k31!sq_B z>c->p!nu5YF(^R8q~7(qrxYpSTr>TLcJrx-phQ4QtT2x5^c6edML`otY-!E5rd8zQ zGgY2|i&v7KzGN?_Wge6j8>yiMHeI&1X}I+dx8#5Oi;rnAt`gH zl_VadD@k|NGB2n!9+X#|$zJ9CIwI42(!YmIL=;>*?i^G~lK!T+FS2Uff6|thnwAF- zpqhGoua+X!ndE<;%ud#@8#GD-(k#yT#hsi8y4Govxm9s11r(NUe5G_=WwNW2SlEf{qvVLL{bP5Esc&aZBmbfskexXE0*sd_ zmSTq=G8dih?3hT0rvB0x8hWhSf`1X~dT*FJ~66fRfIC;iwq_q+L>8S|L$~T2}Yf9+U(ciDu_I2wPj0c`k6Mg`-;AV`6gCNNzNiUw z>h%;jLU%jc+;;9t;CB~6r3MI~v|}+8@nrTUA#HfELcScnd3dQqQL?TcIj9O4Ni+3p zi4B{xm%+DxmuA~b$`P1hj04?N^!f(F$47t(3%w6M}a1XSqZy* zPu*v0Tv8wR@v16+j{039Umh%1EiWV|9V=xDA|z`kUoRa!VyZqp65XGsc4@t=zyis} zPSd`$$8UJbY;#-74Sl2_f0zQbc2_LE*eseSK`|J=tIY2(3Z~I**p4Av00^3(Re`x% z;ajN@AzB_H0K8szJ-Lu=KRq5%!!I;}GK8zqIi6RhBeUzyM^S6m>;8oPeEWV^6*A5T z-`!T(yE-|ShAk|P2bes-XRfC}UHxJv9_oCbRaM-A13z((26lB(7<=t%KbuUgyC7q< zbQc%sxAX4opYG4Hp8{gV9`%6X#S}Rg8?d8(`DNkKuEURlz|gT1!}RI#DjhB;QsF0; zHF=Z@UFHOWn%(nz-9(Cq=sQKh(&c^1`0(kJ>~gbibb95-*Tl#q0S)L;M8&&h@r6NLol(e&eL!3+C?($^^yq& z<&z_KEw|*ki&G@C!3o^^3%}NU>0yzz{~vywB=e+0HpY_F!H#Gf2;1wo9|7WgtUSiI zBrX?s5i;gIK0RF-P-xVZl73vA?c-eEDhZ7*@REVPz{OnyN{in^Lz5!Wjdn|Z^$*cn z+;*^b1Pd|l+R(3iU-F<(Vv6>s?lC6zIpdzV;%}7bZHWoE>gvXoG0Rh%FmtX_N1Z}N z(%Ra(C{~d~5*JNP?zOeGYLAo81;xd?zKRVw#m3;JmQh_%hpnL>tw~n(sKL&*8qNe{ zzNhG=Z4i2JLxZ4)yf}^olkJ}d8!NY9w7JgQO5@a1`J-z8({o?>27PON=q;N8HW^;U zs3x5l1k$1GMN#N45-)zS7RkN`6>!)+I@0o-`*-uijI9pYt)_{<^f7JM@X3HzjhcR+ z5_9uD-8&wNM3}viDf6p7NIt^>;D0DP2JhP34CcCgINJN0DgN<`?_Hm@r+B;;b1gAD zGHJASG~VLj3nK*LhS{oDC!(&VO?ido1Y^_{%-un6Fa1SH(p zEE;JAf_s$p0TKf*Iy>9Pi(8V`ipcu)ma`F|<9||rIU$ceM!}ONhw0Tp6-3+?q?rXD zRFKqB)&k9+Iv?Z~#0EJrDMSrT2vA}+H}U#)V3f4H7AAEVqltj~*DFgygTYJ>`T_|^ znK%dt2>qnk*cY3YdeADtZ>K#VkunT?p1hWZ*TcgYQGZbeE(iuzNeKG$OB--0Dl2== z98yY1>RRbbO*gfy6jY5KXT%N@Xh4Fu627Wmf^F1`V?0aZLTWVnc&WYyJw~?D&%qJt z`MLth=Xt^_4?ZFGl-n*Xh3!sXj(K6Mk5P`s*6-kk9oe}<}(pX`1ok+>rl7c-AvY&q){E|$(l zpI&D}{Jgv!aIigl$Es;C4sHlYGb`b_>=-4GMHq{$fj3eD&g*}br=trte~$0FFhEON zUiFPXjBaF~RAsky5;0UNOCdB`go!~pm1pF1a$iYMFWW1PG0EE84kbN31-L@L?DYR# zQpjKD%$Lj6L5R#0@}?kB2vCSXC9hx-CuL;gOu1D4m_NU7C$Bil&sIJt{vGFE45{di zQ;<0eEs>_etJOmhZ&y{3E1Kx`tHY(p<71Ac<|cM$+rwizZJwj9r56RWC{IZX=5pFo=V_U5eU zy=@80$sFvlBAax}>OMYCW&U?mB3}#roBEu6zSC0);*t`i?6XesSFg)l{6Wej>%6Yb zL9gmG3H)lz)J+sgdKKViT*oCSfu$4IA}k)JB|J!40A zzR20?RJlmgCRF|OA|i&gKP+Rl`Tq2;YkHpN*%n;(AD7@o3>m#xPfJuG&D2-VHa8;0 z82XnV1Jcl5{?nC@hq<^f`_fmoc>NGH5f}-_rQ3lDyQe-KdI>`2ii45?y8ZLqIIX;j z!t~5>jF7$N#6c_4oN4@cK0a7!{1AQ#sQn_xDNs-xETAKq>5umYF^2APtm{~6{L-Bi ztnSMhzONAhdj~3ja;LTh9bm$XkSBNW`cc;TwtN3D+3&nODo*c9TM_f0B3C{JSDkww zL*DJ|@Bdo>oG989au5Z~cEH_eza$j{=)5k5dN^M~b@FMRa3AI`MmvR(b+aC;c(wUn z-DH<7mOLff!L%~EPzysvdA34Q$b{V100Uwjn^QcwiSv4Vby6~q5})bg!t!GbtAQ#h z{5=m3-ZEeWSoHeKDzBp4eS1N2a>N%CP1fM~7hh{;atCo}#>Aa91pV)aX;Nywb;#qo z%)V}})qFi;t4O>nduq;kETlch+d30%7fg2$04;;oT>bU!A758cV=iNuK`)z_Z1ET$ z8!Ih4kc}p)7}br@jJf*hAE?(be&Ic11XRuk-~wsr&aqh(i5UJekTY9CG>EC9=Qq7D z5mBUY)Ns~u&pjkgOMYPBQPG$#`kW~@Z*HY~qeY$Cw)V<|f=R0O9GX?G-1e(3_V`NT z9>@b;1v*~v=nV5_p~6be5jn{Bv6 z0ogkyr{Ynw>~AR27Z4=2xk^FP)6$Is8QdCN=QK8;|BnCst=g%Cjko=s=ym%-N@cZg zp#CY>!Lh^XsIBP%0}%!JwOtkUHnqrabMrG;7UQ(G!}gKra!5!>B1Z57ZFCE*lI=nx z8M98i1q+}eE_w7`v^6<} zbp~9E;?l#~j8q}^49@Fk?~;OoB2FVtMIF2jeX~bM=EMUN;?5Wu84q;TaQ>@=kc1de zC_t09dIsg>+6%0llrK4JI4#u%-qU{VhzBM0Z@)(WC^=#<0(pM~Y*BHeNu!5*K$F;S zU@F^31OQ1q$j2#Q*K%^pKTcS8`dc8ZhMb2s~|e99zAg&wfz)c*4hdPxSd`w zuSJEbDMzC(F&!8uyLC}5kEbd;8TIP(UF!m%!*hWt>*mKe#9Eb5%_YOXcSfy}Qh{xM z{+OTd3z2Dm19&_R7&K&0R}ZIg@+|I0o7NKPt&rqNX)rBOkGNNduXc2c>i_K-;Rfs% zt%=6Y>0&;|&Hl_til4@|XRpU%Lv5@00HX2scE^2CLpN9bhy3r1z@4D*{)8;FcJorG zN1|Vlg3(1dW`xMne;y0K19C9sC=wsC47ee*Ez`c4+FS+hn&?^EGfZRts$kIvJ$8&)-7~OJH6ui3XIaPh6J}WWN&|)11~a$Q znq5CcO&lKa>|Wm);@#*Op9}e)&u;T19)KwT+n0=!<)VjXv}iuZ1=s+#*Q#Dk{Tfs9()oaMgdNT>*Ki91m_hf4=!2e-zD=)keK?Vg)7 zWlLMD&nVAMd?Lxix#(f#;|m_o1EQ*Z^qJ7@)l0^(S`X!;uq!{!7Bt!hqloPaACl$Z~CqMjmd-&YeSeU`#cdD$UVqo81#Fmyuj73OjK6H_&`hrSh;Jy1I;fDEFN^0uY z3Y@td4O6*|ExofPU7tCvFKN);HsqI=ARhEOM0|Pi+y=CM9HewfKEefTBRX+!aeFeNiEso7EQRiShGIi%ZbJj~_uCUA!NrdGkk842oVz7noBklARrI?2upP1{IlV>6D8adw;tVETZiH z9MaK=U(w(A$oc8FLZnOy?F+hP@i(Eel+(*#+n%(f$nqrI(S>(};Tz?vw}c6kV3bQc z2~a+n5vD{J-?V=#+=4&WFBMMsYVt^>L(sU^f7(i3D7s}tyw32_i+w9S0&2|y8uQi z@^Hq|FsGDN`HDM&qU~z)!S5kNpaioE-PQaN|CL$k3mDBCK5|)^i5j7LT2GuJWqCPQ zOO7E7Bqa&6u&@Xz4S8;ib1x@;(t4LzAO?4E|m7^J+PNl)k$Wz;`=`(o(MOryUOb$p^Z7%%%40qUZ)O|%%{yzT`^$5Iv<5lwx;jwWs{wroYJ#4&o{ zB_(+4k3dOmqSSy5OM0e=SYOQB4uzM;7s`F#7qz5IbGB?6-_uaxhg&b4_Sz6If zOh+@izcP1_kGw^b8++Ubi$ruG zB48YcRKWGkUi6W-ipde|Yv)wV{vi~UGes}yhHG`lQ!qc@DO-Z`n zLoRB4a}xyfIDXjgg-P;IB)Ljf zH8kc8&pMYpS|)!r*d^a6Q}kCO`K+3EmwVS{^?NyRJbz}`KjgKyS_zki+Gi@Ns6sY3 zQdm3w9W;6!%$qA=f&)&0y8szlFI+?awkGF%1tL~J@5ySuq-Ng>EMB!!K}!30X*xkq zv2tcaYw47R9nX#ZNw&HnBzP}dqXN8|;WGlR=1e(6II zLE5vXUHO5H?{@zbKEKfVgz#BTDsX=m)555apQG}q2tiwWpeId{6%L=oba@ja7KAbT z$qUFcWmzASXlQtNcy<+xx3@7Le*UWdU`cApIOmV<4V~J1|EsS}GNGz-%`NF@!M{CI zL`mc0B=v>t15BUvaM#ybP>qt$^U4j5>}5y#L5(ixi*hf*L_a0>G-id|rP)G=YK>PD z!QJ9rGse94fUslbQNRC4)iEKE{P8=I85HE56K9?}e0GrN)*C+t7Uq|#U%fcHa>oOI z;8BPqGjaWp1gMOmrIp^LAqKem(aTjuaB^625tEVf7K{zKyZdzFEsGUlJic`l>{i94h>JJ}T#B28|B{Xsb|7`1KW1{9L6n>$G&1rcZN zIbXsFH@W9TBx?bx?HMU0 z3`QL~y4y^g*3b%#)xoIQ0*{V+{>S*RoeF%F(#jNgi6afz>h-1tYK*jA&R&B}n;H#G z%g4Ib(xiEa z{?4jN+a%=l5bXJ|a%=x>C&+#|nil(3V_G-AcJKP-^Y{hazY=b~hg1tWxK~LGDg#bW z0E@5Fw^~>J)Z_k8&1cAtI8QQ?z)z0bzx93?zerLV>z<`XoRC%vm3a| zp;Ydx7V+nNLn$;@{s*w)!|x6C-(-p5C6^lSrsQjWhj*+BlIUZ7&j>5op_vUJ-8n{= zl$Ynv<96n>mnOc4W9GE0Hi*A36|dzY_RhacY*m|s z(Ik)?zK>PL^iGZ;d#l<-E18AqT6J5a1ax#F6#erkh$at>cY-haOzuv-TdNke$mh#| z;Qql(S(|-g^)i5IzqL-UkpHNbJ7FR5wTuj-3%MZXkBrxMB36Wj>asYCk2HG+HI+~GHfG_mZa1=ZwaKo8kMu8p9#S5E@*8)%UyKqjld-ilT zIqrOu;Qd#G)a5TCwch zZH%*D^m888+HyFQI#f+#0oohTp%VOmZT*jkmPloR#oIVDO86Ns_(t=-s!b9Qm+rmc zBD&#`lHiSqhPBb&f)j+eH-{gZbjs9ssYX7ZONx`yqeqh`%*b$#SYY+6dG^My4sSO$ z+VyT=S|+ zS*gtqxF}%$$;)Y93(A*#+LYANDtkY0 z&wigeMuXoaix%%aT-=;0FMOu1&cO0E`@Mh1Q`+|548ME-YPGe^p6h$(w%5)$^Qyx4 zRmJTqAEi!LrPNGYe3;LF_m{TC*EcLr?viciK7Q*$$phmx)+-iGUoWZV{(qgR)zyvP zmusE%|(C@XL`fXNBe-O6~kGLtWPApO&pNI&4V=D^_C#&6%sz*`p1nbg(Qb#(L? rKJ$Y)53;`+|AuPPT~WpQr~Z`pzqIw82k!w-U}5ld^>bP0l+XkKZ9XZJ literal 0 HcmV?d00001 diff --git a/docs/guides/interactions/message-components/images/image6.png b/docs/guides/interactions/message-components/images/image6.png new file mode 100644 index 0000000000000000000000000000000000000000..1536096d088c4502fbad8d21bfbcd6cb776af97e GIT binary patch literal 39425 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%0AFvb#N7fe8Hdhlf=EO&m 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 H+rIxV45D%) literal 0 HcmV?d00001 diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index bc67a0ec5f..6347e9d2d9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -48,6 +48,15 @@ public class ButtonComponent : IMessageComponent ///

public bool Disabled { get; } + /// + /// Turns this button into a button builder. + /// + /// + /// A newly created button builder with the same properties as this button. + /// + public ButtonBuilder ToBuilder() + => new ButtonBuilder(this.Label, this.CustomId, this.Style, this.Url, this.Emote, this.Disabled); + internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) { this.Style = style; diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs index 13eb53c6af..46e53e4706 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs @@ -44,6 +44,21 @@ public class SelectMenu : IMessageComponent ///
public bool Disabled { get; } + /// + /// Turns this select menu into a builder. + /// + /// + /// A newly create builder with the same properties as this select menu. + /// + public SelectMenuBuilder ToBuilder() + => new SelectMenuBuilder( + this.CustomId, + this.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), + this.Placeholder, + this.MaxValues, + this.MinValues, + this.Disabled); + internal SelectMenu(string customId, List options, string placeholder, int minValues, int maxValues, bool disabled) { this.CustomId = customId; From 1a2e8432fb82183ecd00d748ca7704751e8ccf6d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 8 Sep 2021 01:37:21 -0300 Subject: [PATCH 215/494] Fix some inconsistency with docs --- .../01-getting-started.md | 2 +- .../creating-context-menu-commands.md | 48 +++++++++++-------- .../02-creating-slash-commands.md | 13 ++--- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/docs/guides/interactions/application-commands/01-getting-started.md b/docs/guides/interactions/application-commands/01-getting-started.md index 28d5fc8177..20201f46c4 100644 --- a/docs/guides/interactions/application-commands/01-getting-started.md +++ b/docs/guides/interactions/application-commands/01-getting-started.md @@ -18,7 +18,7 @@ There is a new special OAuth2 scope for applications called `applications.comman Head over to your discord applications OAuth2 screen and make sure to select the `application.commands` scope. -![OAuth2 scoping](images/oauth.png) +![OAuth2 scoping](slash-commands/images/oauth.png) From there you can then use the link to add your bot to a server. diff --git a/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md b/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md index 9100c3b423..d497ca1e6e 100644 --- a/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md +++ b/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md @@ -19,21 +19,21 @@ If you don't have the code for a bot ready yet please follow [this guide](https: The context menu user command builder will help you create user commands. The builder has these available fields and methods: -| Name | Type | Description | -| --------------------- | -------------------------------- | -------------------------------------------------------------------------------------------- | -| Name | string | The name of this context menu command. | -| WithName | Function | Sets the field name. | -| Build | Function | Builds the builder into the appropriate `CommandCreationProperties` class used to make Menu commands | +| Name | Type | Description | +| -------- | -------- | ------------------------------------------------------------------------------------------------ | +| Name | string | The name of this context menu command. | +| WithName | Function | Sets the field name. | +| Build | Function | Builds the builder into the appropriate `UserCommandProperties` class used to make Menu commands | ## MessageCommandBuilder The context menu message command builder will help you create message commands. The builder has these available fields and methods: -| Name | Type | Description | -| --------------------- | -------------------------------- | -------------------------------------------------------------------------------------------- | -| Name | string | The name of this context menu command. | -| WithName | Function | Sets the field name. | -| Build | Function | Builds the builder into the appropriate `CommandCreationProperties` class used to make Menu commands | +| Name | Type | Description | +| -------- | -------- | --------------------------------------------------------------------------------------------------- | +| Name | string | The name of this context menu command. | +| WithName | Function | Sets the field name. | +| 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. @@ -47,8 +47,8 @@ client.Ready += Client_Ready; public async Task Client_Ready() { - // Let's build a guild command! We're going to need a guild id so lets just put that in a variable. - ulong guildId = 848176216011046962; + // Let's build a guild command! We're going to need a guild so lets just put that in a variable. + var guild = client.GetGuild(guildId); // Next, lets create our user and message command builder. This is like the embed builder but for context menu commands. var guildUserCommand = new UserCommandBuilder(); @@ -62,20 +62,27 @@ public async Task Client_Ready() //guildCommand.WithDescription(""); // Let's do our global commands - var globalCommand = new UserCommandBuilder(); + var globalUserCommand = new UserCommandBuilder(); globalCommand.WithName("Global User Command"); var globalMessageCommand = new MessageCommandBuilder(); globalMessageCommand.WithName("Global Message Command"); + try { - // Now that we have our builder, we can call the rest API to make our slash command. - await client.Rest.CreateGuildUserCommand(guildUserCommand.Build(), guildId); - await client.Rest.CreateGuildMessageCommand(guildMessageCommand.Build(), guildId); - - // With global commands we dont need the guild id. - await client.Rest.CreateGlobalUserCommand(globalUserCommand.Build()); - await client.Rest.CreateGlobalMessageCommand(globalMessageCommand.Build()); + // Now that we have our builder, we can call the BulkOverwriteApplicationCommandAsync to make our context commands. Note: this will overwrite all your previous commands with this array. + await guild.BulkOverwriteApplicationCommandAsync(new ApplicationCommandProperties[] + { + guildUserCommand.Build(), + guildMessageCommand.Build() + }); + + // With global commands we dont need the guild. + await client.BulkOverwriteGlobalApplicationCommandsAsync(new ApplicationCommandProperties[] + { + globalUserCommand.Build(), + globalMessageCommand.Build() + }) } catch(ApplicationCommandException exception) { @@ -88,4 +95,5 @@ public async Task Client_Ready() } ``` + **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. diff --git a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md index 902a6b3ab9..6e48921229 100644 --- a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md @@ -45,8 +45,8 @@ client.Ready += Client_Ready; public async Task Client_Ready() { - // Let's build a guild command! We're going to need a guild id so lets just put that in a variable. - ulong guildId = 848176216011046962; + // Let's build a guild command! We're going to need a guild so lets just put that in a variable. + var guild = client.GetGuild(guildId); // Next, lets create our slash command builder. This is like the embed builder but for slash commands. var guildCommand = new SlashCommandBuilder(); @@ -64,11 +64,11 @@ public async Task Client_Ready() try { - // Now that we have our builder, we can call the rest API to make our slash command. - await client.Rest.CreateGuildCommand(guildCommand.Build(), guildId); + // Now that we have our builder, we can call the CreateApplicationCommandAsync method to make our slash command. + await guild.CreateApplicationCommandAsync(guildCommand.Build()); - // With global commands we dont need the guild id. - await client.Rest.CreateGlobalCommand(globalCommand.Build()); + // With global commands we dont need the guild. + await client.CreateGlobalApplicationCommandAsync(globalCommand.Build()); } catch(ApplicationCommandException exception) { @@ -81,4 +81,5 @@ public async Task Client_Ready() } ``` + **Note**: Slash 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 slash commands. From df04c50092648466382468061606beb2dbdb45dd Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 8 Sep 2021 02:06:19 -0300 Subject: [PATCH 216/494] QOL for emotes/emoji --- src/Discord.Net.Core/Entities/Emotes/Emoji.cs | 7 ++++--- src/Discord.Net.Core/Entities/Emotes/Emote.cs | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Emotes/Emoji.cs b/src/Discord.Net.Core/Entities/Emotes/Emoji.cs index 60861522c6..15c20148e1 100644 --- a/src/Discord.Net.Core/Entities/Emotes/Emoji.cs +++ b/src/Discord.Net.Core/Entities/Emotes/Emoji.cs @@ -64,9 +64,8 @@ public static bool TryParse(string text, out Emoji result) return result != null; } - /// Parse an from its raw format. - /// The raw encoding of an emoji. For example: :heart: or ❤ - /// An emoji. + /// Parse an from its raw format. + /// The raw encoding of an emoji. For example: :heart: or ❤ /// String is not emoji or unicode! public static Emoji Parse(string emojiStr) { @@ -5971,5 +5970,7 @@ private static IReadOnlyDictionary> UnicodesA return _unicodesAndNames; } } + + public static implicit operator Emoji(string s) => Parse(s); } } diff --git a/src/Discord.Net.Core/Entities/Emotes/Emote.cs b/src/Discord.Net.Core/Entities/Emotes/Emote.cs index 6054b3f747..cd88f97cc7 100644 --- a/src/Discord.Net.Core/Entities/Emotes/Emote.cs +++ b/src/Discord.Net.Core/Entities/Emotes/Emote.cs @@ -102,5 +102,7 @@ public static bool TryParse(string text, out Emote result) /// A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). /// public override string ToString() => $"<{(Animated ? "a" : "")}:{Name}:{Id}>"; + + public static implicit operator Emote(string s) => Parse(s); } } From 1f57f62c47e7e334c857ef70eae5efddfd5139bb Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 8 Sep 2021 15:38:36 -0300 Subject: [PATCH 217/494] Update README.md --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f0d40c20cc..8eba553340 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,10 @@ This branch is on pause and does not work currently, There is a pull request ope ### feature/xyz These branches are features for new things, you are more than welcome to clone them and give feedback in the discord server or issues tab. -## Listening for interactions +## Listening for Interactions + +Interaction docs can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions). They are much more in depth than this readme. + ```cs // Subscribe to the InteractionCreated event client.InteractionCreated += Client_InteractionCreated; @@ -124,5 +127,8 @@ await Context.Channel.SendMessageAsync("Test selection!", component: builder.Bui > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. -## Slash commands -Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/Interactions/docs/guides/slash-commands). +## Slash Commands & Context Menu Commands +Slash command & Context command examples and how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions/application-commands). + +## Message Components +Message components (buttons, menus, etc) examples and how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions/message-components) From ef7fc382dabffb921aa7f945c898d2098a2a2a1a Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 8 Sep 2021 15:38:58 -0300 Subject: [PATCH 218/494] Update 01-getting-started.md --- .../interactions/message-components/01-getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/interactions/message-components/01-getting-started.md b/docs/guides/interactions/message-components/01-getting-started.md index 206d7a6655..2b1d3f5ff5 100644 --- a/docs/guides/interactions/message-components/01-getting-started.md +++ b/docs/guides/interactions/message-components/01-getting-started.md @@ -1,6 +1,6 @@ # Message Components -Message components are a framework for adding interactive elements to a message your app or bot sends. They;re accessible, customizable, and easy to use. +Message components are a framework for adding interactive elements to a message your app or bot sends. They're accessible, customizable, and easy to use. ## What is a Component From c21a189fbfc704a02bdedb09c34aa6109909363a Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 8 Sep 2021 23:05:46 -0300 Subject: [PATCH 219/494] Create FUNDING.yml --- .github/FUNDING.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..693e23543e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: quinchs +custom: https://paypal.me/quinchs From d8b2cbdd6c9e2a37b30b0ba8b25453befe9102a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Thu, 9 Sep 2021 04:17:34 +0200 Subject: [PATCH 220/494] Fix modifying application command by generic ModifyAsync (#121) * Fix Modify calls of application commands * Fix modification of guild command to use optional name value * Fix RestApplicationCommand update to set type correctly * Add non generic ModifyAsync for application commands to determine type correctly --- src/Discord.Net.Core/Discord.Net.Core.xml | 13 +++++++- .../Interactions/IApplicationCommand.cs | 14 ++++++++- src/Discord.Net.Rest/Discord.Net.Rest.xml | 7 +++-- .../Interactions/InteractionHelper.cs | 30 +++++++++++++++---- .../Interactions/RestApplicationCommand.cs | 11 +++++-- .../Interactions/RestGlobalCommand.cs | 4 +-- .../Entities/Interactions/RestGuildCommand.cs | 4 +-- .../Discord.Net.WebSocket.xml | 13 +++----- .../SocketApplicationCommand.cs | 30 ++++++------------- 9 files changed, 80 insertions(+), 46 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 24ced574ca..99148bacea 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4686,7 +4686,7 @@
- The base command model that belongs to an application. + The base command model that belongs to an application. @@ -4729,6 +4729,17 @@ A task that represents the asynchronous modification operation. + + + Modifies the current application command. + + The new properties to use when modifying the command. + The options to be used when sending the request. + + A task that represents the asynchronous modification operation. + + Thrown when you pass in an invalid type. + Represents data of an Interaction Command, see . diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index e0cf605d2d..c5f6697556 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -7,7 +7,7 @@ namespace Discord { /// - /// The base command model that belongs to an application. + /// The base command model that belongs to an application. /// public interface IApplicationCommand : ISnowflakeEntity, IDeletable { @@ -50,5 +50,17 @@ public interface IApplicationCommand : ISnowflakeEntity, IDeletable /// A task that represents the asynchronous modification operation. /// Task ModifyAsync(Action func, RequestOptions options = null); + + /// + /// Modifies the current application command. + /// + /// The new properties to use when modifying the command. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous modification operation. + /// + /// Thrown when you pass in an invalid type. + Task ModifyAsync(Action func, RequestOptions options = null) + where TArg : ApplicationCommandProperties; } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 6e4d93991b..9ffed332c8 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3910,6 +3910,9 @@ + + + @@ -3961,7 +3964,7 @@ - + Modifies this . @@ -3984,7 +3987,7 @@ - + Modifies this . diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 59d5c4f2b8..9b15ace17b 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -48,7 +48,7 @@ public static async Task GetGlobalCommandAsync(BaseDiscordCli RequestOptions options = null) { var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); - + return RestGlobalCommand.Create(client, model); } @@ -164,10 +164,28 @@ public static async Task> BulkOverwriteG return await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options).ConfigureAwait(false); } + private static TArg GetApplicationCommandProperties(IApplicationCommand command) + where TArg : ApplicationCommandProperties + { + bool isBaseClass = typeof(TArg) == typeof(ApplicationCommandProperties); + + switch (true) + { + case true when (typeof(TArg) == typeof(SlashCommandProperties) || isBaseClass) && command.Type == ApplicationCommandType.Slash: + return new SlashCommandProperties() as TArg; + case true when (typeof(TArg) == typeof(MessageCommandProperties) || isBaseClass) && command.Type == ApplicationCommandType.Message: + return new MessageCommandProperties() as TArg; + case true when (typeof(TArg) == typeof(UserCommandProperties) || isBaseClass) && command.Type == ApplicationCommandType.User: + return new UserCommandProperties() as TArg; + default: + throw new InvalidOperationException($"Cannot modify application command of type {command.Type} with the parameter type {typeof(TArg).FullName}"); + } + } + public static Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, - Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties + Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { - var arg = (TArg)Activator.CreateInstance(typeof(TArg)); + var arg = GetApplicationCommandProperties(command); func(arg); return ModifyGlobalCommand(client, command, arg, options); } @@ -260,9 +278,9 @@ public static async Task CreateGuildCommand(BaseDiscordClien } public static Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, - Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties + Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { - var arg = (TArg)Activator.CreateInstance(typeof(TArg)); + var arg = GetApplicationCommandProperties(command); func(arg); return ModifyGuildCommand(client, command, guildId, arg, options); } @@ -272,7 +290,7 @@ public static async Task ModifyGuildCommand(BaseDiscordClien { var model = new ModifyApplicationCommandParams() { - Name = arg.Name.Value, + Name = arg.Name, }; if (arg is SlashCommandProperties slashProps) diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index dcba1ee87f..439790f262 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -57,6 +57,7 @@ internal static RestApplicationCommand Create(BaseDiscordClient client, Model mo internal virtual void Update(Model model) { + this.Type = model.Type; this.ApplicationId = model.ApplicationId; this.Name = model.Name; this.Description = model.Description; @@ -67,12 +68,18 @@ internal virtual void Update(Model model) : null; } - /// public abstract Task DeleteAsync(RequestOptions options = null); + /// + public Task ModifyAsync(Action func, RequestOptions options = null) + { + return ModifyAsync(func, options); + } + /// - public abstract Task ModifyAsync(Action func, RequestOptions options = null); + public abstract Task ModifyAsync(Action func, RequestOptions options = null) + where TArg : ApplicationCommandProperties; IReadOnlyCollection IApplicationCommand.Options => Options; } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs index 7e3ca0a4e2..8d8ae5983a 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -37,9 +37,9 @@ public override async Task DeleteAsync(RequestOptions options = null) /// /// The modified command. /// - public override async Task ModifyAsync(Action func, RequestOptions options = null) + public override async Task ModifyAsync(Action func, RequestOptions options = null) { - var cmd = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + var cmd = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); this.Update(cmd); } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index aa236d4b1f..48f4022973 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -42,9 +42,9 @@ public override async Task DeleteAsync(RequestOptions options = null) /// /// The modified command /// - public override async Task ModifyAsync(Action func, RequestOptions options = null) + public override async Task ModifyAsync(Action func, RequestOptions options = null) { - var model = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId, func, options).ConfigureAwait(false); this.Update(model); } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index e253692db0..cfdd0e89c4 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -4028,16 +4028,11 @@ + + + - - Modifies the current application command. - - The new properties to use when modifying the command. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - Thrown when you pass in an invalid type. + diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index 77a43a1e31..f0b8929e84 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -91,34 +91,24 @@ internal void Update(Model model) public Task DeleteAsync(RequestOptions options = null) => InteractionHelper.DeleteUnknownApplicationCommand(Discord, this.GuildId, this, options); - /// - /// Modifies the current application command. - /// - /// The new properties to use when modifying the command. - /// The options to be used when sending the request. - /// - /// A task that represents the asynchronous modification operation. - /// - /// Thrown when you pass in an invalid type. + /// + public Task ModifyAsync(Action func, RequestOptions options = null) + { + return ModifyAsync(func, options); + } + + /// public async Task ModifyAsync(Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { - switch (typeof(TArg)) - { - case Type messageCommand when messageCommand == typeof(MessageCommandProperties) && this.Type != ApplicationCommandType.Message: - case Type slashCommand when slashCommand == typeof(SlashCommandProperties) && this.Type != ApplicationCommandType.Slash: - case Type userCommand when userCommand == typeof(UserCommandProperties) && this.Type != ApplicationCommandType.User: - throw new InvalidOperationException($"Cannot modify this application command with the parameter type {nameof(TArg)}"); - } - Model command = null; if (this.IsGlobalCommand) { - command = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + command = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); } else { - command = await InteractionHelper.ModifyGuildCommand(Discord, this, this.GuildId.Value, func, options); + command = await InteractionHelper.ModifyGuildCommand(Discord, this, this.GuildId.Value, func, options); } this.Update(command); @@ -126,7 +116,5 @@ public async Task ModifyAsync(Action func, RequestOptions options = // IApplicationCommand IReadOnlyCollection IApplicationCommand.Options => Options; - Task IApplicationCommand.ModifyAsync(Action func, RequestOptions options) - => ModifyAsync(func, options); } } From 747836d188fc4e9c8d46063dc49751df326a1b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Thu, 9 Sep 2021 04:18:40 +0200 Subject: [PATCH 221/494] Fix validation of arguments for modifying guild permissions of application command (#120) Resolves #114 --- src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 9b15ace17b..a6d8c524b8 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -453,7 +453,7 @@ public static async Task ModifyGuildCommandPe { Preconditions.NotNull(args, nameof(args)); Preconditions.AtMost(args.Length, 10, nameof(args)); - Preconditions.GreaterThan(args.Length, 0, nameof(args)); + Preconditions.AtLeast(args.Length, 0, nameof(args)); List permissionsList = new List(); From d6a7a61c61b4cd353c5dd833a43f16653ccd7e96 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 8 Sep 2021 23:56:58 -0300 Subject: [PATCH 222/494] Added ratelimit callback to RequestOptions --- src/Discord.Net.Core/Discord.Net.Core.xml | 76 ++++++++++++++++++- .../Net/Rest/IRateLimitInfo.cs | 59 ++++++++++++++ src/Discord.Net.Core/RequestOptions.cs | 18 +++++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 32 ++++++++ .../Net/Queue/RequestQueueBucket.cs | 4 +- src/Discord.Net.Rest/Net/RateLimitInfo.cs | 27 ++++++- 6 files changed, 210 insertions(+), 6 deletions(-) create mode 100644 src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 24ced574ca..fa2c894cbf 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -2504,9 +2504,8 @@ An emoji. - Parse an from its raw format. - The raw encoding of an emoji. For example: :heart: or ❤ - An emoji. + Parse an from its raw format. + The raw encoding of an emoji. For example: :heart: or ❤ String is not emoji or unicode! @@ -5029,6 +5028,14 @@ Whether this button is disabled or not. + + + Turns this button into a button builder. + + + A newly created button builder with the same properties as this button. + + Represents different styles to use with buttons. You can see an example of the different styles at @@ -5735,6 +5742,14 @@ Whether this menu is disabled or not. + + + Turns this select menu into a builder. + + + A newly create builder with the same properties as this select menu. + + Represents a choice for a . @@ -11802,6 +11817,56 @@ and an optional reason. + + + Represents a generic ratelimit info. + + + + + Gets whether or not this ratelimit info is global. + + + + + Gets the number of requests that can be made. + + + + + Gets the number of remaining requests that can be made. + + + + + Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision + + + + + Gets the at which the rate limit resets + + + + + Gets the absolute time when this ratelimit resets. + + + + + Gets a unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path). + + + + + Gets the amount of lag for the request. This is used to denote the precise time of when the ratelimit expires. + + + + + Gets the endpoint that this ratelimit info came from. + + Represents options that should be used when sending a request. @@ -11859,6 +11924,11 @@ hosting system is known to have a desynced clock. + + + Gets or sets the callback to execute regarding ratelimits for this request. + + Initializes a new class with the default request timeout set in diff --git a/src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs b/src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs new file mode 100644 index 0000000000..00d446b106 --- /dev/null +++ b/src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a generic ratelimit info. + /// + public interface IRateLimitInfo + { + /// + /// Gets whether or not this ratelimit info is global. + /// + bool IsGlobal { get; } + + /// + /// Gets the number of requests that can be made. + /// + int? Limit { get; } + + /// + /// Gets the number of remaining requests that can be made. + /// + int? Remaining { get; } + + /// + /// Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision + /// + int? RetryAfter { get; } + + /// + /// Gets the at which the rate limit resets + /// + DateTimeOffset? Reset { get; } + + /// + /// Gets the absolute time when this ratelimit resets. + /// + TimeSpan? ResetAfter { get; } + + /// + /// Gets a unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path). + /// + string Bucket { get; } + + /// + /// Gets the amount of lag for the request. This is used to denote the precise time of when the ratelimit expires. + /// + TimeSpan? Lag { get; } + + /// + /// Gets the endpoint that this ratelimit info came from. + /// + string Endpoint { get; } + } +} diff --git a/src/Discord.Net.Core/RequestOptions.cs b/src/Discord.Net.Core/RequestOptions.cs index dbb240273f..101925ab2d 100644 --- a/src/Discord.Net.Core/RequestOptions.cs +++ b/src/Discord.Net.Core/RequestOptions.cs @@ -1,5 +1,7 @@ using Discord.Net; +using System; using System.Threading; +using System.Threading.Tasks; namespace Discord { @@ -57,6 +59,11 @@ public class RequestOptions /// public bool? UseSystemClock { get; set; } + /// + /// Gets or sets the callback to execute regarding ratelimits for this request. + /// + public Func RatelimitCallback { get; set; } + internal bool IgnoreState { get; set; } internal BucketId BucketId { get; set; } internal bool IsClientBucket { get; set; } @@ -71,6 +78,17 @@ internal static RequestOptions CreateOrClone(RequestOptions options) return options.Clone(); } + internal void ExecuteRatelimitCallback(IRateLimitInfo info) + { + if (RatelimitCallback != null) + { + _ = Task.Run(async () => + { + await RatelimitCallback(info); + }); + } + } + /// /// Initializes a new class with the default request timeout set in /// . diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 6e4d93991b..db5b2d29bf 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -149,6 +149,38 @@ Cannot read from image. + + + Represents a REST-Based ratelimit info. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the login state of the client. diff --git a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs index d986f5c372..d2a7cabee8 100644 --- a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs +++ b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs @@ -65,7 +65,9 @@ public async Task SendAsync(RestRequest request) try { var response = await request.SendAsync().ConfigureAwait(false); - info = new RateLimitInfo(response.Headers); + info = new RateLimitInfo(response.Headers, request.Endpoint); + + request.Options.ExecuteRatelimitCallback(info); if (response.StatusCode < (HttpStatusCode)200 || response.StatusCode >= (HttpStatusCode)300) { diff --git a/src/Discord.Net.Rest/Net/RateLimitInfo.cs b/src/Discord.Net.Rest/Net/RateLimitInfo.cs index 6a7df7b01b..2fe845f3c0 100644 --- a/src/Discord.Net.Rest/Net/RateLimitInfo.cs +++ b/src/Discord.Net.Rest/Net/RateLimitInfo.cs @@ -4,19 +4,42 @@ namespace Discord.Net { - internal struct RateLimitInfo + /// + /// Represents a REST-Based ratelimit info. + /// + public struct RateLimitInfo : IRateLimitInfo { + /// public bool IsGlobal { get; } + + /// public int? Limit { get; } + + /// public int? Remaining { get; } + + /// public int? RetryAfter { get; } + + /// public DateTimeOffset? Reset { get; } + + /// public TimeSpan? ResetAfter { get; } + + /// public string Bucket { get; } + + /// public TimeSpan? Lag { get; } - internal RateLimitInfo(Dictionary headers) + /// + public string Endpoint { get; } + + internal RateLimitInfo(Dictionary headers, string endpoint) { + Endpoint = endpoint; + IsGlobal = headers.TryGetValue("X-RateLimit-Global", out string temp) && bool.TryParse(temp, out var isGlobal) && isGlobal; Limit = headers.TryGetValue("X-RateLimit-Limit", out temp) && From 6d75fc47684b0adbbd1265f6f3419e796fbfcd7a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 9 Sep 2021 00:49:09 -0300 Subject: [PATCH 223/494] Add docs for ratelimits and fix grammer --- docs/guides/concepts/ratelimits.md | 49 +++++++++++++++++++ src/Discord.Net.Core/Discord.Net.Core.xml | 4 +- .../Net/Rest/IRateLimitInfo.cs | 4 +- 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 docs/guides/concepts/ratelimits.md diff --git a/docs/guides/concepts/ratelimits.md b/docs/guides/concepts/ratelimits.md new file mode 100644 index 0000000000..3565f13704 --- /dev/null +++ b/docs/guides/concepts/ratelimits.md @@ -0,0 +1,49 @@ +# Ratelimits + +Ratelimits are a core concept of the discord api, each verified library must follow the ratelimit guidelines. Labs introduces a ratelimit exposure system to help you follow these ratelimits in your own code. + +### Using the ratelimit callback + +There is a new property within `RequestOptions` called RatelimitCallback. This callback is called when a request is made via the rest api. The callback is called with a `IRateLimitInfo` parameter: + +| Name | Type | Description | +| ---------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| IsGlobal | bool | Whether or not this ratelimit info is global. | +| Limit | int? | The number of requests that can be made. | +| Remaining | int? | The number of remaining requests that can be made. | +| RetryAfter | int? | The total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision. | +| Reset | DateTimeOffset? | The time at which the rate limit resets. | +| ResetAfter | TimeSpan? | The absolute time when this ratelimit resets. | +| Bucket | string | A unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path). | +| Lag | TimeSpan? | The amount of lag for the request. This is used to denote the precise time of when the ratelimit expires. | +| Endpoint | string | The endpoint that this ratelimit info came from. | + +Let's set up a ratelimit callback that will print out the ratelimit info to the console. + +```cs +public async Task MyRatelimitCallback(IRateLimitInfo info) +{ + Console.WriteLine($"{info.IsGlobal} {info.Limit} {info.Remaining} {info.RetryAfter} {info.Reset} {info.ResetAfter} {info.Bucket} {info.Lag} {info.Endpoint}"); +} +``` + +Let's use this callback in a send message function + +```cs +[Command("ping")] +public async Task ping() +{ + var options = new RequestOptions() + { + RatelimitCallback = MyRatelimitCallback + }; + + await Context.Channel.SendMessageAsync("Pong!", options: options); +} +``` + +Running this produces the following output: + +``` +False 5 4 2021-09-09 3:48:14 AM +00:00 00:00:05 a06de0de4a08126315431cc0c55ee3dc 00:00:00.9891364 channels/848511736872828929/messages +``` diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index c254ad31f0..b73b58fb31 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -11850,12 +11850,12 @@ - Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision + Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision. - Gets the at which the rate limit resets + Gets the at which the rate limit resets. diff --git a/src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs b/src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs index 00d446b106..816f25af46 100644 --- a/src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs +++ b/src/Discord.Net.Core/Net/Rest/IRateLimitInfo.cs @@ -27,12 +27,12 @@ public interface IRateLimitInfo int? Remaining { get; } /// - /// Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision + /// Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision. /// int? RetryAfter { get; } /// - /// Gets the at which the rate limit resets + /// Gets the at which the rate limit resets. /// DateTimeOffset? Reset { get; } From 608e66836b96fa4ca65019eafbc58b7beaae74a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Sun, 12 Sep 2021 08:04:10 +0200 Subject: [PATCH 224/494] Changed the copy right year from 2019 to 2021 (#139) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 3765bf39c7..fb94801691 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015-2019 Discord.Net Contributors +Copyright (c) 2015-2021 Discord.Net Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 6e0329a02d06ff79da27b4804c6c9181f79c9322 Mon Sep 17 00:00:00 2001 From: IS4 Date: Sun, 12 Sep 2021 08:06:21 +0200 Subject: [PATCH 225/494] Property name: auto_archive_duration (#137) According to [Discord Developer Portal](https://discord.com/developers/docs/resources/channel#start-thread-with-message), the property should be named `auto_archive_duration`, not just `duration`. --- src/Discord.Net.Rest/API/Rest/StartThreadParams.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs index c41398d93e..ed3701cad1 100644 --- a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs +++ b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs @@ -12,7 +12,7 @@ internal class StartThreadParams [JsonProperty("name")] public string Name { get; set; } - [JsonProperty("duration")] + [JsonProperty("auto_archive_duration")] public ThreadArchiveDuration Duration { get; set; } [JsonProperty("type")] From 7e36fbc7c1ebf15f8ba6bf7561aa08282ce97021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Sun, 12 Sep 2021 08:07:09 +0200 Subject: [PATCH 226/494] Whoops missed a few (#142) --- .../Interactions/SlashCommandBuilder.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index 8a1bd83144..97d9f7760e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -37,12 +37,12 @@ public string Name set { Preconditions.NotNullOrEmpty(value, nameof(Name)); - Preconditions.AtLeast(value.Length, 3, nameof(Name)); + Preconditions.AtLeast(value.Length, 1, nameof(Name)); Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); // Discord updated the docs, this regex prevents special characters like @!$%(... etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(value, @"^[\w-]{3,32}$")) + if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); _name = value; @@ -169,17 +169,17 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); - Preconditions.AtLeast(name.Length, 3, nameof(name)); + Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, MaxNameLength, nameof(name)); // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(name, @"^[\w-]{3,32}$")) + if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); // same with description Preconditions.NotNullOrEmpty(description, nameof(description)); - Preconditions.AtLeast(description.Length, 3, nameof(description)); + Preconditions.AtLeast(description.Length, 1, nameof(description)); Preconditions.AtMost(description.Length, MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true @@ -301,7 +301,7 @@ public string Name throw new ArgumentException("Name length must at least 1 characters in length"); if (value != null) - if (!Regex.IsMatch(value, @"^[\w-]{3,32}$")) + if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) throw new ArgumentException("Option name cannot contian any special characters or whitespaces!"); _name = value; @@ -392,17 +392,17 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); - Preconditions.AtLeast(name.Length, 3, nameof(name)); + Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, SlashCommandBuilder.MaxNameLength, nameof(name)); // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(name, @"^[\w-]{3,32}$")) + if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); // same with description Preconditions.NotNullOrEmpty(description, nameof(description)); - Preconditions.AtLeast(description.Length, 3, nameof(description)); + Preconditions.AtLeast(description.Length, 1, nameof(description)); Preconditions.AtMost(description.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true From d7937f2df043b2adfd4b3a5f605f8911c5ea31f6 Mon Sep 17 00:00:00 2001 From: Adam Gauthier Date: Sun, 12 Sep 2021 02:08:45 -0400 Subject: [PATCH 227/494] Cache unknown thread channel on THREAD_UPDATE (#136) In the case where a thread is archived upon login, the thread channel is not cached by the client. When the thread channel is unarchived, the library simply outputs an unknown channel warning. When messages are sent in the unarchived thread, the library won't have it cached and will only output warnings. This change makes it so the channel is cached when unarchived and ThreadUpdated is invoked with an non specified "before" parameter. From that point, the channel will be available for future events. --- .../BaseSocketClient.Events.cs | 4 +-- .../DiscordSocketClient.cs | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 1cd35768db..fe13d327e8 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -603,13 +603,13 @@ public event Func ThreadCreated /// /// Fired when a thread is updated within a guild. /// - public event Func ThreadUpdated + public event Func, SocketThreadChannel, Task> ThreadUpdated { add { _threadUpdated.Add(value); } remove { _threadUpdated.Remove(value); } } - internal readonly AsyncEvent> _threadUpdated = new AsyncEvent>(); + internal readonly AsyncEvent, SocketThreadChannel, Task>> _threadUpdated = new(); /// /// Fired when a thread is deleted. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index b79eeb0993..007e9f68a4 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2243,16 +2243,25 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty return; } - var channel = (SocketThreadChannel)guild.GetChannel(data.Id); + var threadChannel = guild.ThreadChannels.FirstOrDefault(x => x.Id == data.Id); + var before = threadChannel != null + ? new Cacheable(threadChannel.Clone(), data.Id, true, () => Task.FromResult((SocketThreadChannel)null)) + : new Cacheable(null, data.Id, false, () => Task.FromResult((SocketThreadChannel)null)); - if (channel == null) + if (threadChannel != null) { - await UnknownChannelAsync(type, data.Id); - return; - } + threadChannel.Update(State, data); - var before = channel.Clone(); - channel.Update(State, data); + if (data.ThreadMember.IsSpecified) + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); + } + else + { + // Thread is updated but was not cached, likely meaning the thread was unarchived. + threadChannel = (SocketThreadChannel)guild.AddChannel(State, data); + if (data.ThreadMember.IsSpecified) + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); + } if (!(guild?.IsSynced ?? true)) { @@ -2260,7 +2269,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty return; } - await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, channel).ConfigureAwait(false); + await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, threadChannel).ConfigureAwait(false); } break; case "THREAD_DELETE": From f1a7ee843ebbef385d2800a429ccb422721b5cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Mon, 13 Sep 2021 09:05:30 +0200 Subject: [PATCH 228/494] Created 08-bulk-overwrite-of-global-slash-commands.md (#138) * Create Create 08-bulk-overwrite-of-global-slash-commands.md Just added what i was trying to figure out it might help others that are looking for an example. * added a little comment * Removed create from file name --- ...bulk-overwrite-of-global-slash-commands.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md diff --git a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md new file mode 100644 index 0000000000..71bc296539 --- /dev/null +++ b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md @@ -0,0 +1,31 @@ +If you have too many global commands then you might want to consider doing a bulk overwrite. +```cs +public async Task Client_Ready() { + List applicationCommandProperties = new(); + try { + // Simple help slash command. + SlashCommandBuilder globalCommandHelp = new SlashCommandBuilder(); + globalCommandHelp.WithName("help"); + globalCommandHelp.WithDescription("Shows information about the bot."); + applicationCommandProperties.Add(globalCommandHelp.Build()); + + // Slash command with name as its parameter. + SlashCommandOptionBuilder slashCommandOptionBuilder = new(); + slashCommandOptionBuilder.WithName("name"); + slashCommandOptionBuilder.WithType(ApplicationCommandOptionType.String); + slashCommandOptionBuilder.WithDescription("Add a family"); + slashCommandOptionBuilder.WithRequired(true); // Only add this if you want it to be required + + SlashCommandBuilder globalCommandAddFamily = new SlashCommandBuilder(); + globalCommandAddFamily.WithName("add-family"); + globalCommandAddFamily.WithDescription("Add a family"); + applicationCommandProperties.Add(globalCommandAddFamily.Build()); + + await _client.BulkOverwriteGlobalApplicationCommandsAsync(applicationCommandProperties.ToArray()); + } catch (ApplicationCommandException exception) { + var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); + Console.WriteLine(json); + } + Console.WriteLine("Client Ready: Finished"); +} +``` From 881bd51bfcd194a9ed5f86244351c5649985691e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Mon, 13 Sep 2021 09:06:57 +0200 Subject: [PATCH 229/494] I've added a link to Bulk overwrite of global slash commands for when it gets commited (#145) * I've added a link to Bulk overwrite of global slash commands for when it gets commited * Fix link for 3.x Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com> --- .../interactions/application-commands/slash-commands/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guides/interactions/application-commands/slash-commands/README.md b/docs/guides/interactions/application-commands/slash-commands/README.md index 3b672792ca..70e31a8b4f 100644 --- a/docs/guides/interactions/application-commands/slash-commands/README.md +++ b/docs/guides/interactions/application-commands/slash-commands/README.md @@ -9,3 +9,4 @@ Here you can find some guides on how to use slash commands. 5. [Responding ephemerally](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/05-responding-ephemerally.md) 6. [Subcommands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/06-subcommands.md) 7. [Choices](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/07-choice-slash-command.md) +7. [Bulk overwrite of global slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/release/3.x/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md) From 118de5dd1d3e40c3c12bf155e17dd8cfce714502 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 13 Sep 2021 04:37:14 -0300 Subject: [PATCH 230/494] Add Hierarchy to RestGuildUser --- src/Discord.Net.Core/Discord.Net.Core.xml | 5 +++++ src/Discord.Net.Core/Entities/Users/IGuildUser.cs | 5 +++++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 6 ++++++ src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs | 12 ++++++++++++ .../Entities/Users/RestWebhookUser.cs | 2 ++ 5 files changed, 30 insertions(+) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index b73b58fb31..5ace1922d0 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -10056,6 +10056,11 @@ Whether the user has passed the guild's Membership Screening requirements. + + + Gets the users position within the role hierarchy. + + Gets the level permissions granted to this user to a given channel. diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs index 492cb95666..e131a6a612 100644 --- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs @@ -73,6 +73,11 @@ public interface IGuildUser : IUser, IVoiceState /// bool? IsPending { get; } + /// + /// Gets the users position within the role hierarchy. + /// + int Hierarchy { get; } + /// /// Gets the level permissions granted to this user to a given channel. /// diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 92a1734afb..4e2846c9e0 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4711,6 +4711,9 @@ + + + Resolving permissions requires the parent guild to be downloaded. @@ -4954,6 +4957,9 @@ + + + diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index d094be6183..9ad36a0740 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -31,6 +31,18 @@ public class RestGuildUser : RestUser, IGuildUser public ulong GuildId => Guild.Id; /// public bool? IsPending { get; private set; } + /// + public int Hierarchy + { + get + { + if (Guild.OwnerId == Id) + return int.MaxValue; + + var orderedRoles = Guild.Roles.OrderByDescending(x => x.Position); + return orderedRoles.Where(x => RoleIds.Contains(x.Id)).Max(x => x.Position); + } + } /// /// Resolving permissions requires the parent guild to be downloaded. diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs index 9297f9af9d..40a173976c 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs @@ -54,6 +54,8 @@ IGuild IGuildUser.Guild /// bool? IGuildUser.IsPending => null; /// + int IGuildUser.Hierarchy => 0; + /// GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; /// From 69797dd5fe7dd9db1468e71bc35961dc9f48d273 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 13 Sep 2021 04:44:44 -0300 Subject: [PATCH 231/494] meta: bump version --- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 +++--- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +++--- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index a8ef5783ea..dd6dcb60aa 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.0.1 + 3.0.2 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 3.0.1 - 3.0.1 + 3.0.2 + 3.0.2 false diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index a83a8fe758..34635f8301 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.1 + 3.0.2 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.1 - 3.0.1 + 3.0.2 + 3.0.2 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 9aa71cc3d3..d4e860c392 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.0.2 + 3.0.3 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,8 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.0.2 - 3.0.2 + 3.0.3 + 3.0.3 TRACE From 7de4ba07f39690c0ba447bbf3172409204b74e81 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Mon, 13 Sep 2021 05:55:22 -0300 Subject: [PATCH 232/494] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8eba553340..581c9eecd2 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Setting up labs in your project is really simple, here's how to do it: ### Dev This branch is kept up to date with dnets dev branch. we pull of it to ensure that labs will work with pre existing dnet code. -### release/2.x +### release/3.x This branch is what will be pushed to nuget, sometimes its not up to date as we wait for other features to be finished. ### old/SlashCommandService From cf08976e1037425d1cc78a597bcaadc53ffea0d3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 13 Sep 2021 16:51:40 -0300 Subject: [PATCH 233/494] Fix #147 --- .../Discord.Net.WebSocket.xml | 6 ++++++ .../Entities/Users/SocketThreadUser.cs | 3 +++ .../Entities/Users/SocketWebhookUser.cs | 2 ++ src/Discord.Net/Discord.Net.nuspec | 20 +++++++++---------- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index cfdd0e89c4..6c83a737ad 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -5216,6 +5216,9 @@ + + + @@ -5534,6 +5537,9 @@ + + + diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index 5fb1f56e54..f892216d9e 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -45,6 +45,9 @@ public DateTimeOffset? PremiumSince /// public bool? IsPending => GuildUser.IsPending; + /// + public int Hierarchy + => GuildUser.Hierarchy; /// public override string AvatarId diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index f1269e649f..0c37fcd03f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -84,6 +84,8 @@ internal static SocketWebhookUser Create(SocketGuild guild, ClientState state, M /// bool? IGuildUser.IsPending => null; /// + int IGuildUser.Hierarchy => 0; + /// GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; /// diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index dbee186721..5a342c024d 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.2$suffix$ + 3.0.3$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From 8f6173e7131bf549106b1566b74102884303cdd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Wed, 15 Sep 2021 04:06:49 +0200 Subject: [PATCH 234/494] Agument error corrections (#149) * Changed arguments to use the variables for errors * Changed name to description on error ArgumentException * Added value?.Length < 1 for Name and Description * Removed old note and added a paragraph * change para to for Value --- .../Entities/Interactions/ApplicationCommandOption.cs | 4 +++- .../Interactions/ApplicationCommandOptionChoice.cs | 7 +++++-- .../Entities/Interactions/SlashCommandBuilder.cs | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index d33990da10..8d6e22ec1d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -45,7 +45,9 @@ public string Description set { if (value?.Length > 100) - throw new ArgumentException("Name length must be less than or equal to 32"); + throw new ArgumentException("Description length must be less than or equal to 100"); + if (value?.Length < 1) + throw new ArgumentException("Description length must at least 1 character in length"); _description = value; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs index 53332c74b8..4a1339dc25 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -23,14 +23,17 @@ public string Name { if(value?.Length > 100) throw new ArgumentException("Name length must be less than or equal to 100"); + if (value?.Length < 1) + throw new ArgumentException("Name length must at least 1 character in length"); _name = value; } } - // Note: discord allows strings & ints as values. how should that be handled? - // should we make this an object and then just type check it? /// /// The value of this choice. + /// + /// Discord only accepts int and string as the input. + /// /// public object Value { diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs index 97d9f7760e..0f3ae1d2d4 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs @@ -296,7 +296,7 @@ public string Name set { if (value?.Length > SlashCommandBuilder.MaxNameLength) - throw new ArgumentException("Name length must be less than or equal to 32"); + throw new ArgumentException($"Name length must be less than or equal to {SlashCommandBuilder.MaxNameLength}"); if (value?.Length < 1) throw new ArgumentException("Name length must at least 1 characters in length"); @@ -317,9 +317,9 @@ public string Description set { if (value?.Length > SlashCommandBuilder.MaxDescriptionLength) - throw new ArgumentException("Description length must be less than or equal to 100"); + throw new ArgumentException($"Description length must be less than or equal to {SlashCommandBuilder.MaxDescriptionLength}"); if (value?.Length < 1) - throw new ArgumentException("Name length must at least 1 character in length"); + throw new ArgumentException("Description length must at least 1 character in length"); _description = value; } From d6c62335eda529d45b9ed379ea7bd4bb0c431a0e Mon Sep 17 00:00:00 2001 From: Cenk Ergen <57065323+Cenngo@users.noreply.github.com> Date: Sat, 18 Sep 2021 13:20:50 +0300 Subject: [PATCH 235/494] added deafult permission option to context commands (#155) --- .../ApplicationCommandProperties.cs | 5 +++ .../Context Menus/MessageCommandBuilder.cs | 19 ++++++++- .../Context Menus/UserCommandBuilder.cs | 19 ++++++++- .../Interactions/SlashCommandProperties.cs | 5 --- .../Interactions/InteractionHelper.cs | 42 ++++++++----------- 5 files changed, 59 insertions(+), 31 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 2ccb0148b4..55c91bc64e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -18,6 +18,11 @@ public abstract class ApplicationCommandProperties /// public Optional Name { get; set; } + /// + /// Whether the command is enabled by default when the app is added to a guild. Default is + /// + public Optional DefaultPermission { get; set; } + internal ApplicationCommandProperties() { } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index 801aca302f..ce9c75452a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -36,6 +36,11 @@ public string Name } } + /// + /// Whether the command is enabled by default when the app is added to a guild + /// + public bool DefaultPermission { get; set; } = true; + private string _name { get; set; } /// @@ -49,6 +54,7 @@ public MessageCommandProperties Build() MessageCommandProperties props = new MessageCommandProperties() { Name = this.Name, + DefaultPermission = this.DefaultPermission }; return props; @@ -66,6 +72,17 @@ public MessageCommandBuilder WithName(string name) { this.Name = name; return this; - } + } + + /// + /// Sets the default permission of the current command. + /// + /// The default permission value to set. + /// The current builder. + public MessageCommandBuilder WithDefaultPermission (bool value) + { + this.DefaultPermission = value; + return this; + } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index 5629a70142..a49250d088 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -36,6 +36,11 @@ public string Name } } + /// + /// Whether the command is enabled by default when the app is added to a guild + /// + public bool DefaultPermission { get; set; } = true; + private string _name { get; set; } /// @@ -47,6 +52,7 @@ public UserCommandProperties Build() UserCommandProperties props = new UserCommandProperties() { Name = this.Name, + DefaultPermission = this.DefaultPermission }; return props; @@ -64,6 +70,17 @@ public UserCommandBuilder WithName(string name) { this.Name = name; return this; - } + } + + /// + /// Sets the default permission of the current command. + /// + /// The default permission value to set. + /// The current builder. + public UserCommandBuilder WithDefaultPermission (bool value) + { + this.DefaultPermission = value; + return this; + } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs index 72c7c322bf..e9b7222d4a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs @@ -22,11 +22,6 @@ public class SlashCommandProperties : ApplicationCommandProperties /// public Optional> Options { get; set; } - /// - /// Whether the command is enabled by default when the app is added to a guild. Default is - /// - public Optional DefaultPermission { get; set; } - internal SlashCommandProperties() { } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index a6d8c524b8..8bc87339eb 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -68,6 +68,9 @@ public static async Task CreateGlobalCommand(BaseDiscordClie { Name = arg.Name.Value, Type = arg.Type, + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value + : Optional.Unspecified }; if (arg is SlashCommandProperties slashProps) @@ -79,10 +82,6 @@ public static async Task CreateGlobalCommand(BaseDiscordClie model.Options = slashProps.Options.IsSpecified ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - - model.DefaultPermission = slashProps.DefaultPermission.IsSpecified - ? slashProps.DefaultPermission.Value - : Optional.Unspecified; } return await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); @@ -103,6 +102,9 @@ public static async Task BulkOverwriteGlobalCommands(BaseD { Name = arg.Name.Value, Type = arg.Type, + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value + : Optional.Unspecified }; if (arg is SlashCommandProperties slashProps) @@ -114,10 +116,6 @@ public static async Task BulkOverwriteGlobalCommands(BaseD model.Options = slashProps.Options.IsSpecified ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - - model.DefaultPermission = slashProps.DefaultPermission.IsSpecified - ? slashProps.DefaultPermission.Value - : Optional.Unspecified; } models.Add(model); @@ -141,6 +139,9 @@ public static async Task> BulkOverwriteG { Name = arg.Name.Value, Type = arg.Type, + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value + : Optional.Unspecified }; if (arg is SlashCommandProperties slashProps) @@ -152,10 +153,6 @@ public static async Task> BulkOverwriteG model.Options = slashProps.Options.IsSpecified ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - - model.DefaultPermission = slashProps.DefaultPermission.IsSpecified - ? slashProps.DefaultPermission.Value - : Optional.Unspecified; } models.Add(model); @@ -202,6 +199,9 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie var model = new Discord.API.Rest.ModifyApplicationCommandParams() { Name = args.Name, + DefaultPermission = args.DefaultPermission.IsSpecified + ? args.DefaultPermission.Value + : Optional.Unspecified }; if(args is SlashCommandProperties slashProps) @@ -223,10 +223,6 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie model.Options = slashProps.Options.IsSpecified ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - - model.DefaultPermission = slashProps.DefaultPermission.IsSpecified - ? slashProps.DefaultPermission.Value - : Optional.Unspecified; } return await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); @@ -257,6 +253,9 @@ public static async Task CreateGuildCommand(BaseDiscordClien { Name = arg.Name.Value, Type = arg.Type, + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value + : Optional.Unspecified }; if (arg is SlashCommandProperties slashProps) @@ -268,10 +267,6 @@ public static async Task CreateGuildCommand(BaseDiscordClien model.Options = slashProps.Options.IsSpecified ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - - model.DefaultPermission = slashProps.DefaultPermission.IsSpecified - ? slashProps.DefaultPermission.Value - : Optional.Unspecified; } return await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); @@ -291,6 +286,9 @@ public static async Task ModifyGuildCommand(BaseDiscordClien var model = new ModifyApplicationCommandParams() { Name = arg.Name, + DefaultPermission = arg.DefaultPermission.IsSpecified + ? arg.DefaultPermission.Value + : Optional.Unspecified }; if (arg is SlashCommandProperties slashProps) @@ -302,10 +300,6 @@ public static async Task ModifyGuildCommand(BaseDiscordClien model.Options = slashProps.Options.IsSpecified ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - - model.DefaultPermission = slashProps.DefaultPermission.IsSpecified - ? slashProps.DefaultPermission.Value - : Optional.Unspecified; } return await client.ApiClient.ModifyGuildApplicationCommandAsync(model, guildId, command.Id, options).ConfigureAwait(false); From 7d8508d42ec3cd792151706c45acb9b5e528ce07 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 18 Sep 2021 15:40:49 -0300 Subject: [PATCH 236/494] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 581c9eecd2..dceb2a7a8e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs +If this projects benefits you (*and your financially stable*) consider donating or becoming a sponsor as it really helps out! + ## Known issues Labs will not work with normal package of Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib. You can instead use the [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs) package which implements some of the features added in Discord.Net-Labs. From 15a8cf879aafd6f20104933bacdc1ddd7add9322 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Sun, 19 Sep 2021 04:01:33 -0400 Subject: [PATCH 237/494] Add note about global commands taking up to an hour to apply to docs (#160) --- .../slash-commands/02-creating-slash-commands.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md index 6e48921229..830c52aa52 100644 --- a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md @@ -12,6 +12,8 @@ Guild commands are specific to the guild you specify when making them. Guild com **Note**: Apps can have a maximum of 100 global commands, and an additional 100 guild-specific commands per guild. +**Note**: Global commands will take up to 1 hour to create, delete or modify on guilds. If you need to update a command quickly for testing you can create it as a guild command. + 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). ## SlashCommandBuilder From 436cbae8170f178b8fc0ad58f99061f1adbb4b45 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 19 Sep 2021 05:24:34 -0300 Subject: [PATCH 238/494] Remove obsolete method from interaction base --- .../Entities/Interaction/SocketInteraction.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 8a13738e2b..4c98be7eea 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -204,15 +204,6 @@ public async Task ModifyOriginalResponseAsync(Action - /// Acknowledges this interaction. - /// - /// - /// A task that represents the asynchronous operation of acknowledging the interaction. - /// - [Obsolete("This method deprecated, please use DeferAsync instead")] - public Task AcknowledgeAsync(RequestOptions options = null) => DeferAsync(options: options); - /// /// Acknowledges this interaction. /// From 97d3b0ee63cfd1122e35d63587d7eb32cbc6d309 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 19 Sep 2021 12:04:45 -0300 Subject: [PATCH 239/494] Renamed SelectMenu to SelectMenuComponent --- .../Message Components/ComponentBuilder.cs | 22 +++++++++---------- .../{SelectMenu.cs => SelectMenuComponent.cs} | 4 ++-- .../Message Components/SelectMenuOption.cs | 2 +- .../API/Common/SelectMenuComponent.cs | 2 +- .../Entities/Messages/RestMessage.cs | 2 +- .../SocketMessageComponentData.cs | 2 +- .../Entities/Messages/SocketMessage.cs | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) rename src/Discord.Net.Core/Entities/Interactions/Message Components/{SelectMenu.cs => SelectMenuComponent.cs} (91%) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index f91bdba36e..07cc0b6abd 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -80,7 +80,7 @@ internal void AddComponent(IMessageComponent component, int row) foreach (var cmp in actionRow.Components) AddComponent(cmp, row); break; - case SelectMenu menu: + case SelectMenuComponent menu: this.WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); break; } @@ -595,22 +595,22 @@ public ButtonComponent Build() } /// - /// Represents a class used to build 's. + /// Represents a class used to build 's. /// public class SelectMenuBuilder { /// - /// The max length of a . + /// The max length of a . /// public const int MaxPlaceholderLength = 100; /// - /// The maximum number of values for the and properties. + /// The maximum number of values for the and properties. /// public const int MaxValuesCount = 25; /// - /// The maximum number of options a can have. + /// The maximum number of options a can have. /// public const int MaxOptionCount = 25; @@ -709,9 +709,9 @@ public List Options public SelectMenuBuilder() { } /// - /// Creates a new instance of a from instance of . + /// Creates a new instance of a from instance of . /// - public SelectMenuBuilder(SelectMenu selectMenu) + public SelectMenuBuilder(SelectMenuComponent selectMenu) { this.Placeholder = selectMenu.Placeholder; this.CustomId = selectMenu.Placeholder; @@ -861,14 +861,14 @@ public SelectMenuBuilder WithDisabled(bool disabled) } /// - /// Builds a + /// Builds a /// - /// The newly built - public SelectMenu Build() + /// The newly built + public SelectMenuComponent Build() { var options = this.Options?.Select(x => x.Build()).ToList(); - return new SelectMenu(this.CustomId, options, this.Placeholder, this.MinValues, this.MaxValues, this.Disabled); + return new SelectMenuComponent(this.CustomId, options, this.Placeholder, this.MinValues, this.MaxValues, this.Disabled); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs similarity index 91% rename from src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs rename to src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs index 46e53e4706..6ea4c07fe5 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenu.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs @@ -9,7 +9,7 @@ namespace Discord /// /// Represents a select menu component defined at /// - public class SelectMenu : IMessageComponent + public class SelectMenuComponent : IMessageComponent { /// public ComponentType Type => ComponentType.SelectMenu; @@ -59,7 +59,7 @@ public SelectMenuBuilder ToBuilder() this.MinValues, this.Disabled); - internal SelectMenu(string customId, List options, string placeholder, int minValues, int maxValues, bool disabled) + internal SelectMenuComponent(string customId, List options, string placeholder, int minValues, int maxValues, bool disabled) { this.CustomId = customId; this.Options = options; diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs index 74da89cae6..e5425971af 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs @@ -7,7 +7,7 @@ namespace Discord { /// - /// Represents a choice for a . + /// Represents a choice for a . /// public class SelectMenuOption { diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs index 6de1d4a4db..f99b8aa7dd 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -32,7 +32,7 @@ internal class SelectMenuComponent : IMessageComponent public SelectMenuComponent() { } - public SelectMenuComponent(Discord.SelectMenu component) + public SelectMenuComponent(Discord.SelectMenuComponent component) { this.Type = component.Type; this.CustomId = component.CustomId; diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index c13d72a756..09e262f006 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -163,7 +163,7 @@ internal virtual void Update(Model model) case ComponentType.SelectMenu: { var parsed = (API.SelectMenuComponent)y; - return new SelectMenu( + return new SelectMenuComponent( parsed.CustomId, parsed.Options.Select(z => new SelectMenuOption( z.Label, diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs index 45e6882660..a24fd59ac9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs @@ -23,7 +23,7 @@ public class SocketMessageComponentData public ComponentType Type { get; } /// - /// The value(s) of a interaction response. + /// The value(s) of a interaction response. /// public IReadOnlyCollection Values { get; } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 167440069a..20df3446e0 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -198,7 +198,7 @@ internal virtual void Update(ClientState state, Model model) case ComponentType.SelectMenu: { var parsed = (API.SelectMenuComponent)y; - return new SelectMenu( + return new SelectMenuComponent( parsed.CustomId, parsed.Options.Select(z => new SelectMenuOption( z.Label, From 0ca6f506a813e00b486417577f2d4bc6a4698088 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 19 Sep 2021 12:12:29 -0300 Subject: [PATCH 240/494] Update refs to selects --- src/Discord.Net.Rest/API/Common/ActionRowComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs index 43b48f01af..270532a18d 100644 --- a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -27,7 +27,7 @@ internal ActionRowComponent(Discord.ActionRowComponent c) case ComponentType.Button: return new ButtonComponent(x as Discord.ButtonComponent); case ComponentType.SelectMenu: - return new SelectMenuComponent(x as Discord.SelectMenu); + return new SelectMenuComponent(x as Discord.SelectMenuComponent); default: return null; } From f880bbb7ef8c6efcd754b7ff0dee7570fa0d5f7f Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Sun, 19 Sep 2021 23:29:14 -0400 Subject: [PATCH 241/494] Add punctuation to sponsor note. (#162) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dceb2a7a8e..f8e4d28393 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs -If this projects benefits you (*and your financially stable*) consider donating or becoming a sponsor as it really helps out! +If this projects benefits you (*and you're financially stable*) consider donating or becoming a sponsor as it really helps out! ## Known issues Labs will not work with normal package of Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib. You can instead use the [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs) package which implements some of the features added in Discord.Net-Labs. From e9df2015981bcc08bd4e7755e0708e745508280a Mon Sep 17 00:00:00 2001 From: MysticalSoul <68410167+MysticalSoul@users.noreply.github.com> Date: Sun, 19 Sep 2021 23:29:40 -0400 Subject: [PATCH 242/494] Fixed minor typo in summary (#161) --- src/Discord.Net.Core/GatewayIntents.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/GatewayIntents.cs b/src/Discord.Net.Core/GatewayIntents.cs index 6976806b23..fb0aac6bcf 100644 --- a/src/Discord.Net.Core/GatewayIntents.cs +++ b/src/Discord.Net.Core/GatewayIntents.cs @@ -40,8 +40,8 @@ public enum GatewayIntents /// This intent includes TYPING_START DirectMessageTyping = 1 << 14, /// - /// This intent includes all but and - /// that are privileged must be enabled for the application. + /// This intent includes all but and + /// which are privileged and must be enabled in the Developer Portal. /// AllUnprivileged = Guilds | GuildBans | GuildEmojis | GuildIntegrations | GuildWebhooks | GuildInvites | GuildVoiceStates | GuildMessages | GuildMessageReactions | GuildMessageTyping | DirectMessages | From 3cd351f2bfd71ba9f29d1545c2a9a39b0d546000 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 20 Sep 2021 02:27:44 -0300 Subject: [PATCH 243/494] Create stage channels --- src/Discord.Net.Core/Discord.Net.Core.xml | 73 +++++++++++++------ .../Entities/Guilds/IGuild.cs | 11 +++ .../Entities/Guilds/GuildHelper.cs | 28 +++++++ .../Entities/Guilds/RestGuild.cs | 15 ++++ .../Entities/Guilds/SocketGuild.cs | 16 ++++ 5 files changed, 120 insertions(+), 23 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 5ace1922d0..6d415630ee 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4524,6 +4524,9 @@ The value of this choice. + + Discord only accepts int and string as the input. + @@ -4591,6 +4594,11 @@ Gets or sets the name of this command. + + + Whether the command is enabled by default when the app is added to a guild. Default is + + ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message @@ -4626,6 +4634,11 @@ The name of this Message command. + + + Whether the command is enabled by default when the app is added to a guild + + Build the current builder into a class. @@ -4643,6 +4656,13 @@ The current builder. + + + Sets the default permission of the current command. + + The default permission value to set. + The current builder. + A class used to create message commands. @@ -4663,6 +4683,11 @@ The name of this User command. + + + Whether the command is enabled by default when the app is added to a guild + + Build the current builder into a class. @@ -4678,6 +4703,13 @@ The current builder. + + + Sets the default permission of the current command. + + The default permission value to set. + The current builder. + A class used to create User commands. @@ -5379,22 +5411,22 @@ - Represents a class used to build 's. + Represents a class used to build 's. - The max length of a . + The max length of a . - The maximum number of values for the and properties. + The maximum number of values for the and properties. - The maximum number of options a can have. + The maximum number of options a can have. @@ -5438,9 +5470,9 @@ Creates a new instance of a . - + - Creates a new instance of a from instance of . + Creates a new instance of a from instance of . @@ -5539,9 +5571,9 @@ - Builds a + Builds a - The newly built + The newly built @@ -5715,45 +5747,45 @@ Returns a empty . - + Represents a select menu component defined at - + - + The custom id of this Select menu that will be sent with a . - + The menus options to select from. - + A custom placeholder text if nothing is selected, max 100 characters. - + The minimum number of items that must be chosen; default 1, min 0, max 25 - + The maximum number of items that can be chosen; default 1, max 25 - + Whether this menu is disabled or not. - + Turns this select menu into a builder. @@ -5763,7 +5795,7 @@ - Represents a choice for a . + Represents a choice for a . @@ -6038,11 +6070,6 @@ Gets or sets the options for this command. - - - Whether the command is enabled by default when the app is added to a guild. Default is - - Represents a generic invite object. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 83efb158b1..76ff9eb4fb 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -667,6 +667,17 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Task CreateVoiceChannelAsync(string name, Action func = null, RequestOptions options = null); /// + /// Creates a new stage channel in this guild. + /// + /// The new name for the stage channel. + /// The delegate containing the properties to be applied to the channel upon its creation. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the newly created + /// stage channel. + /// + Task CreateStageChannelAsync(string name, Action func = null, RequestOptions options = null); + /// /// Creates a new channel category in this guild. /// /// The new name for the category. diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index b1fb2f044b..73f59b5666 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -221,6 +221,34 @@ public static async Task CreateVoiceChannelAsync(IGuild guild, var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); return RestVoiceChannel.Create(client, guild, model); } + public static async Task CreateStageChannelAsync(IGuild guild, BaseDiscordClient client, + string name, RequestOptions options, Action func = null) + { + if (name == null) + throw new ArgumentNullException(paramName: nameof(name)); + + var props = new VoiceChannelProperties(); + func?.Invoke(props); + + var args = new CreateGuildChannelParams(name, ChannelType.Stage) + { + CategoryId = props.CategoryId, + Bitrate = props.Bitrate, + UserLimit = props.UserLimit, + Position = props.Position, + Overwrites = props.PermissionOverwrites.IsSpecified + ? props.PermissionOverwrites.Value.Select(overwrite => new API.Overwrite + { + TargetId = overwrite.TargetId, + TargetType = overwrite.TargetType, + Allow = overwrite.Permissions.AllowValue.ToString(), + Deny = overwrite.Permissions.DenyValue.ToString() + }).ToArray() + : Optional.Create(), + }; + var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); + return RestStageChannel.Create(client, guild, model); + } /// is null. public static async Task CreateCategoryChannelAsync(IGuild guild, BaseDiscordClient client, string name, RequestOptions options, Action func = null) diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 5b9436970f..3608c2d8ba 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -663,6 +663,18 @@ public Task CreateTextChannelAsync(string name, Action CreateVoiceChannelAsync(string name, Action func = null, RequestOptions options = null) => GuildHelper.CreateVoiceChannelAsync(this, Discord, name, options, func); /// + /// Creates a new stage channel in this guild. + /// + /// The new name for the stage channel. + /// The delegate containing the properties to be applied to the channel upon its creation. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the newly created + /// stage channel. + /// + public Task CreateStageChannelAsync(string name, Action func = null, RequestOptions options = null) + => GuildHelper.CreateStageChannelAsync(this, Discord, name, options, func); + /// /// Creates a category channel with the provided name. /// /// The name of the new channel. @@ -1241,6 +1253,9 @@ async Task IGuild.CreateTextChannelAsync(string name, Action IGuild.CreateVoiceChannelAsync(string name, Action func, RequestOptions options) => await CreateVoiceChannelAsync(name, func, options).ConfigureAwait(false); /// + async Task IGuild.CreateStageChannelAsync(string name, Action func, RequestOptions options) + => await CreateStageChannelAsync(name, func, options).ConfigureAwait(false); + /// async Task IGuild.CreateCategoryAsync(string name, Action func, RequestOptions options) => await CreateCategoryChannelAsync(name, func, options).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 1d1175f52c..0c211f394c 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -746,6 +746,19 @@ public Task CreateTextChannelAsync(string name, Action public Task CreateVoiceChannelAsync(string name, Action func = null, RequestOptions options = null) => GuildHelper.CreateVoiceChannelAsync(this, Discord, name, options, func); + + /// + /// Creates a new stage channel in this guild. + /// + /// The new name for the stage channel. + /// The delegate containing the properties to be applied to the channel upon its creation. + /// The options to be used when sending the request. + /// + /// A task that represents the asynchronous creation operation. The task result contains the newly created + /// stage channel. + /// + public Task CreateStageChannelAsync(string name, Action func = null, RequestOptions options = null) + => GuildHelper.CreateStageChannelAsync(this, Discord, name, options, func); /// /// Creates a new channel category in this guild. /// @@ -1650,6 +1663,9 @@ async Task IGuild.CreateTextChannelAsync(string name, Action IGuild.CreateVoiceChannelAsync(string name, Action func, RequestOptions options) => await CreateVoiceChannelAsync(name, func, options).ConfigureAwait(false); /// + async Task IGuild.CreateStageChannelAsync(string name, Action func, RequestOptions options) + => await CreateStageChannelAsync(name, func, options).ConfigureAwait(false); + /// async Task IGuild.CreateCategoryAsync(string name, Action func, RequestOptions options) => await CreateCategoryChannelAsync(name, func, options).ConfigureAwait(false); From 895ce0a9f2877dd945f62789ca83468a81e0b18c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 20 Sep 2021 03:39:57 -0300 Subject: [PATCH 244/494] Add sticker param to send message functions --- src/Discord.Net.Commands/ModuleBase.cs | 6 +- src/Discord.Net.Core/Discord.Net.Core.xml | 63 ++++++++---- .../Entities/Channels/IMessageChannel.cs | 9 +- .../Entities/Stickers/ISticker.cs | 29 +++--- .../Entities/Stickers/StickerType.cs | 24 +++++ src/Discord.Net.Rest/API/Common/Sticker.cs | 10 +- .../API/Rest/CreateMessageParams.cs | 4 + .../API/Rest/UploadFileParams.cs | 3 + src/Discord.Net.Rest/Discord.Net.Rest.xml | 76 +++++++++----- .../Entities/Channels/ChannelHelper.cs | 22 +++-- .../Entities/Channels/IRestMessageChannel.cs | 16 ++- .../Entities/Channels/RestDMChannel.cs | 24 ++--- .../Entities/Channels/RestGroupChannel.cs | 24 ++--- .../Entities/Channels/RestTextChannel.cs | 24 ++--- .../Entities/Messages/Sticker.cs | 21 ++-- .../Discord.Net.WebSocket.xml | 99 +++++++++++-------- .../Channels/ISocketMessageChannel.cs | 13 ++- .../Entities/Channels/SocketDMChannel.cs | 24 ++--- .../Entities/Channels/SocketGroupChannel.cs | 25 ++--- .../Entities/Channels/SocketTextChannel.cs | 24 ++--- .../Entities/Stickers/SocketCustomSticker.cs | 2 +- .../Entities/Stickers/SocketSticker.cs | 21 ++-- .../Entities/Stickers/SocketUnknownSticker.cs | 15 +-- .../MockedEntities/MockedDMChannel.cs | 19 +--- .../MockedEntities/MockedGroupChannel.cs | 6 +- .../MockedEntities/MockedTextChannel.cs | 6 +- 26 files changed, 368 insertions(+), 241 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Stickers/StickerType.cs diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index 366cab4509..159b44fb81 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -36,9 +36,11 @@ public abstract class ModuleBase : IModuleBase /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - protected virtual async Task ReplyAsync(string message = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the file. + protected virtual async Task ReplyAsync(string message = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) { - return await Context.Channel.SendMessageAsync(message, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + return await Context.Channel.SendMessageAsync(message, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); } /// /// The method to execute before executing the command. diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 6d415630ee..220f3fae4b 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1507,7 +1507,7 @@ Represents a generic channel that can send and receive messages. - + Sends a message to this message channel. @@ -1527,12 +1527,13 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions + A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. @@ -1566,12 +1567,13 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions + A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. @@ -1602,6 +1604,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions + A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -3639,6 +3642,18 @@ voice channel. + + + Creates a new stage channel in this guild. + + The new name for the stage channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + stage channel. + + Creates a new channel category in this guild. @@ -5205,7 +5220,7 @@ Builds this builder into a used to send your components. - A that can be sent with . + A that can be sent with . @@ -9652,21 +9667,10 @@ A read-only list with the tags of this sticker. - + - Gets the asset hash of this sticker. + Gets the type of this sticker. - - A with the asset hash of this sticker. - - - - - Gets the preview asset hash of this sticker. - - - A with the preview asset hash of this sticker. - @@ -9676,6 +9680,16 @@ A with the format type of this sticker. + + + Gets whether this guild sticker can be used, may be false due to loss of Server Boosts + + + + + Gets the standard sticker's sort order within its pack + + Gets the image url for this sticker. @@ -9762,6 +9776,21 @@ Gets or sets the tags of the sticker. + + + Represents a type of sticker + + + + + Represents a discord standard sticker, this type of sticker cannot be modified by an application. + + + + + Represents a sticker that was created within a guild. + + Represents a Discord Team. diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index 11998c28b3..1fffea6e9f 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -29,11 +29,12 @@ public interface IMessageChannel : IChannel /// /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -67,11 +68,12 @@ public interface IMessageChannel : IChannel /// /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -102,11 +104,12 @@ public interface IMessageChannel : IChannel /// /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs index e16e039906..6d0eee1b4e 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs @@ -15,7 +15,7 @@ public interface ISticker : IStickerItem /// /// A snowflake ID associated with this sticker. /// - ulong Id { get; } + new ulong Id { get; } /// /// Gets the ID of the pack of this sticker. /// @@ -29,7 +29,7 @@ public interface ISticker : IStickerItem /// /// A with the name of this sticker. /// - string Name { get; } + new string Name { get; } /// /// Gets the description of this sticker. /// @@ -45,27 +45,26 @@ public interface ISticker : IStickerItem /// IReadOnlyCollection Tags { get; } /// - /// Gets the asset hash of this sticker. + /// Gets the type of this sticker. /// - /// - /// A with the asset hash of this sticker. - /// - string Asset { get; } - /// - /// Gets the preview asset hash of this sticker. - /// - /// - /// A with the preview asset hash of this sticker. - /// - string PreviewAsset { get; } + StickerType Type { get; } /// /// Gets the format type of this sticker. /// /// /// A with the format type of this sticker. /// - StickerFormatType Format { get; } + new StickerFormatType Format { get; } + /// + /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts + /// + bool? Available { get; } + + /// + /// Gets the standard sticker's sort order within its pack + /// + int? SortOrder { get; } /// /// Gets the image url for this sticker. /// diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerType.cs b/src/Discord.Net.Core/Entities/Stickers/StickerType.cs new file mode 100644 index 0000000000..35946df7a2 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Stickers/StickerType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a type of sticker + /// + public enum StickerType + { + /// + /// Represents a discord standard sticker, this type of sticker cannot be modified by an application. + /// + Standard = 1, + + /// + /// Represents a sticker that was created within a guild. + /// + Guild = 2, + } +} diff --git a/src/Discord.Net.Rest/API/Common/Sticker.cs b/src/Discord.Net.Rest/API/Common/Sticker.cs index da171a802e..490c16dbe5 100644 --- a/src/Discord.Net.Rest/API/Common/Sticker.cs +++ b/src/Discord.Net.Rest/API/Common/Sticker.cs @@ -15,15 +15,17 @@ internal class Sticker public string Desription { get; set; } [JsonProperty("tags")] public Optional Tags { get; set; } - [JsonProperty("asset")] - public string Asset { get; set; } - [JsonProperty("preview_asset")] - public string PreviewAsset { get; set; } + [JsonProperty("type")] + public StickerType Type { get; set; } [JsonProperty("format_type")] public StickerFormatType FormatType { get; set; } + [JsonProperty("available")] + public bool? Available { get; set; } [JsonProperty("guild_id")] public Optional GuildId { get; set; } [JsonProperty("user")] public Optional User { get; set; } + [JsonProperty("sort_value")] + public int? SortValue { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs index 0d6710a036..b8ee153c9e 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs @@ -26,6 +26,10 @@ internal class CreateMessageParams [JsonProperty("components")] public Optional Components { get; set; } + + [JsonProperty("sticker_ids")] + public Optional Stickers { get; set; } + public CreateMessageParams(string content) { Content = content; diff --git a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs index 31a975aabd..1ee918ae70 100644 --- a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs +++ b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs @@ -22,6 +22,7 @@ internal class UploadFileParams public Optional AllowedMentions { get; set; } public Optional MessageReference { get; set; } public Optional MessageComponent { get; set; } + public Optional Stickers { get; set; } public bool IsSpoiler { get; set; } = false; public UploadFileParams(Stream file) @@ -54,6 +55,8 @@ public IReadOnlyDictionary ToDictionary() payload["hasSpoiler"] = IsSpoiler.ToString(); if (MessageReference.IsSpecified) payload["message_reference"] = MessageReference.Value; + if (Stickers.IsSpecified) + payload["sticker_ids"] = Stickers.Value; var json = new StringBuilder(); using (var text = new StringWriter(json)) diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 4e2846c9e0..43c2a05bc8 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -1718,10 +1718,10 @@ must be lesser than 86400. - + Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more invalid characters as defined by . @@ -1747,7 +1747,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -1764,12 +1764,12 @@ Represents a REST-based channel that can send and receive messages. - + Sends a message to this message channel. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The message to be sent. @@ -1781,18 +1781,20 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. This method follows the same behavior as described in - . Please visit + . Please visit its documentation for more details on this method. The file path of the file. @@ -1806,17 +1808,19 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The of the file to be sent. @@ -1831,6 +1835,8 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -2010,11 +2016,11 @@ - + Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more @@ -2041,7 +2047,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -2092,13 +2098,13 @@ - + - + - + @@ -2148,11 +2154,11 @@ - + Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more @@ -2179,7 +2185,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -2438,11 +2444,11 @@ - + Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more @@ -2469,7 +2475,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -2602,13 +2608,13 @@ - + - + - + @@ -3347,6 +3353,18 @@ The created voice channel. + + + Creates a new stage channel in this guild. + + The new name for the stage channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + stage channel. + + Creates a category channel with the provided name. @@ -3751,6 +3769,9 @@ + + + @@ -4472,10 +4493,13 @@ - + + + + - + diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 98715bfcec..bf95cfa6d5 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -264,7 +264,7 @@ public static async Task> GetPinnedMessagesAsyn /// Message content is too long, length must be less or equal to . public static async Task SendMessageAsync(IMessageChannel channel, BaseDiscordClient client, - string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, RequestOptions options) + string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options) { Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -285,7 +285,12 @@ public static async Task SendMessageAsync(IMessageChannel chann } } - var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; + if(stickers != null) + { + Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed."); + } + + var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified}; var model = await client.ApiClient.CreateMessageAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } @@ -315,16 +320,16 @@ public static async Task SendMessageAsync(IMessageChannel chann /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, - string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, RequestOptions options, bool isSpoiler) + string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler) { string filename = Path.GetFileName(filePath); using (var file = File.OpenRead(filePath)) - return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler).ConfigureAwait(false); + return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler).ConfigureAwait(false); } /// Message content is too long, length must be less or equal to . public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, - Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, RequestOptions options, bool isSpoiler) + Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler) { Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -345,7 +350,12 @@ public static async Task SendFileAsync(IMessageChannel channel, } } - var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embed = embed?.ToModel() ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, IsSpoiler = isSpoiler }; + if (stickers != null) + { + Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed."); + } + + var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embed = embed?.ToModel() ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, IsSpoiler = isSpoiler, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified }; var model = await client.ApiClient.UploadFileAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } diff --git a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs index 919360ce83..b7f4940557 100644 --- a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs @@ -25,17 +25,19 @@ public interface IRestMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Sends a file to this message channel with an optional caption. /// /// /// This method follows the same behavior as described in - /// . Please visit + /// . Please visit /// its documentation for more details on this method. /// /// The file path of the file. @@ -49,16 +51,18 @@ public interface IRestMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The of the file to be sent. @@ -73,11 +77,13 @@ public interface IRestMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index 7bfd73ee63..6fe2c862c7 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -93,8 +93,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); /// /// @@ -121,12 +121,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -204,14 +204,14 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); //IChannel /// diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index fb7a7a215b..25d34cd0b5 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -99,8 +99,8 @@ public async Task ModifyMessageAsync(ulong messageId, Action /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); /// /// @@ -127,12 +127,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers,options, isSpoiler); /// public Task TriggerTypingAsync(RequestOptions options = null) @@ -182,14 +182,14 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); //IAudioChannel /// diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index 6343aed03a..ffe989dbfe 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -102,8 +102,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); /// /// @@ -130,13 +130,13 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -315,15 +315,15 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); //IGuildChannel /// diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index 6a5d35a3bf..46dbc3418d 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -10,19 +10,21 @@ namespace Discord.Rest public class Sticker : RestEntity, ISticker { /// - public ulong PackId { get; internal set; } + public ulong PackId { get; protected set; } /// - public string Name { get; internal set; } + public string Name { get; protected set; } /// - public string Description { get; internal set; } + public string Description { get; protected set; } /// - public IReadOnlyCollection Tags { get; internal set; } + public IReadOnlyCollection Tags { get; protected set; } /// - public string Asset { get; internal set; } + public StickerType Type { get; protected set; } /// - public string PreviewAsset { get; internal set; } + public bool? Available { get; protected set; } /// - public StickerFormatType Format { get; internal set; } + public int? SortOrder { get; protected set; } + /// + public StickerFormatType Format { get; protected set; } /// public string GetStickerUrl() @@ -43,8 +45,9 @@ internal void Update(Model model) Name = model.Name; Description = model.Desription; Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0]; - Asset = model.Asset; - PreviewAsset = model.PreviewAsset; + Type = model.Type; + SortOrder = model.SortValue; + Available = model.Available; Format = model.FormatType; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 6c83a737ad..610555b61e 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1480,12 +1480,12 @@ A read-only collection of WebSocket-based messages. - + Sends a message to this message channel. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The message to be sent. @@ -1498,17 +1498,18 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions + A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The file path of the file. @@ -1523,17 +1524,18 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions + A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The of the file to be sent. @@ -1549,6 +1551,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions + A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -1831,14 +1834,14 @@ - + Message content is too long, length must be less or equal to . - + - + Message content is too long, length must be less or equal to . @@ -1901,13 +1904,13 @@ - + - + - + @@ -2022,15 +2025,16 @@ - + Message content is too long, length must be less or equal to . - + - + + Message content is too long, length must be less or equal to . @@ -2088,13 +2092,13 @@ - + - + - + @@ -2478,14 +2482,14 @@ - + Message content is too long, length must be less or equal to . - + - + Message content is too long, length must be less or equal to . @@ -2591,13 +2595,13 @@ - + - + - + @@ -3328,6 +3332,18 @@ voice channel. + + + Creates a new stage channel in this guild. + + The new name for the stage channel. + The delegate containing the properties to be applied to the channel upon its creation. + The options to be used when sending the request. + + A task that represents the asynchronous creation operation. The task result contains the newly created + stage channel. + + Creates a new channel category in this guild. @@ -3746,6 +3762,9 @@ + + + @@ -3947,7 +3966,7 @@ - The value(s) of a interaction response. + The value(s) of a interaction response. @@ -4252,14 +4271,6 @@ The request options for this async request. A that represents the initial response. - - - Acknowledges this interaction. - - - A task that represents the asynchronous operation of acknowledging the interaction. - - Acknowledges this interaction. @@ -4805,7 +4816,7 @@ - Gets the guild the sticker lives in. + Gets the guild the sticker was created in. @@ -4834,13 +4845,16 @@ - + - + - + + + + @@ -4854,9 +4868,6 @@ Represents an unknown sticker received over the gateway. - - - @@ -4866,7 +4877,13 @@ - + + + + + + + diff --git a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs index fb25ddbd79..7a82b2c3f8 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs @@ -35,16 +35,17 @@ public interface ISocketMessageChannel : IMessageChannel /// /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The file path of the file. @@ -59,16 +60,17 @@ public interface ISocketMessageChannel : IMessageChannel /// /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The of the file to be sent. @@ -84,11 +86,12 @@ public interface ISocketMessageChannel : IMessageChannel /// /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions + /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null); + new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); /// /// Gets a cached message from this channel. diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs index fd3fd1002b..27e720669a 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs @@ -137,16 +137,16 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); @@ -238,14 +238,14 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); //IChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index c7adc994e9..a97806be87 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -171,15 +171,16 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -305,14 +306,14 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); //IAudioChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index a0d14fdabd..0bc62168f0 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -209,17 +209,17 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions options = null) @@ -363,14 +363,14 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); // INestedChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index b9c10f4c23..e7bff2ff09 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -29,7 +29,7 @@ public SocketGuildUser Author => this.AuthorId.HasValue ? Guild.GetUser(this.AuthorId.Value) : null; /// - /// Gets the guild the sticker lives in. + /// Gets the guild the sticker was created in. /// public SocketGuild Guild { get; } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index ce0d3f4fa9..eaf80f9c20 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -20,7 +20,7 @@ public class SocketSticker : SocketEntity, ISticker public virtual ulong PackId { get; private set; } /// - public string Name { get; internal set; } + public string Name { get; protected set; } /// public virtual string Description { get; private set; } @@ -29,13 +29,16 @@ public class SocketSticker : SocketEntity, ISticker public virtual IReadOnlyCollection Tags { get; private set; } /// - public virtual string Asset { get; private set; } + public virtual StickerType Type { get; private set; } /// - public virtual string PreviewAsset { get; private set; } + public StickerFormatType Format { get; protected set; } /// - public StickerFormatType Format { get; internal set; } + public virtual bool? Available { get; protected set; } + + /// + public virtual int? SortOrder { get; private set; } /// public string GetStickerUrl() @@ -62,9 +65,10 @@ internal virtual void Update(Model model) this.Name = model.Name; this.Description = model.Desription; this.PackId = model.PackId; - this.Asset = model.Asset; - this.PreviewAsset = model.PreviewAsset; + this.Available = model.Available; this.Format = model.FormatType; + this.Type = model.Type; + this.SortOrder = model.SortValue; if (model.Tags.IsSpecified) { @@ -88,8 +92,9 @@ public override bool Equals(object obj) stickerModel.FormatType == this.Format && stickerModel.Id == this.Id && stickerModel.PackId == this.PackId && - stickerModel.Asset == this.Asset && - stickerModel.PreviewAsset == this.PreviewAsset && + stickerModel.Type == this.Type && + stickerModel.SortValue == this.SortOrder && + stickerModel.Available == this.Available && (stickerModel.Tags.IsSpecified ? stickerModel.Tags.Value == string.Join(", ", this.Tags) : true); diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs index 771a4c413e..da8199c4ca 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -14,10 +14,6 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketUnknownSticker : SocketSticker { - /// - public override string Asset - => null; - /// public override IReadOnlyCollection Tags => null; @@ -29,9 +25,16 @@ public override string Description /// public override ulong PackId => 0; + /// + public override bool? Available + => null; + + /// + public override int? SortOrder + => null; /// - public override string PreviewAsset + public new StickerType? Type => null; internal SocketUnknownSticker(DiscordSocketClient client, ulong id) @@ -59,6 +62,6 @@ internal void Update(Model model) public Task ResolveAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) => Discord.GetStickerAsync(this.Id, mode, options); - private string DebuggerDisplay => $"{Name} ({Id})"; + private new string DebuggerDisplay => $"{Name} ({Id})"; } } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs index 2cc46d3d35..52eed6bc9f 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs @@ -78,24 +78,13 @@ public IAsyncEnumerable> GetUsersAsync(CacheMode mode throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - { - throw new NotImplementedException(); - } - - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - { - throw new NotImplementedException(); - } - - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) - { - throw new NotImplementedException(); - } - public Task TriggerTypingAsync(RequestOptions options = null) { throw new NotImplementedException(); } + + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); } } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs index e124bc923e..bc4f66ed42 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs @@ -86,17 +86,17 @@ public Task LeaveAsync(RequestOptions options = null) throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) { throw new NotImplementedException(); } - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) { throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) { throw new NotImplementedException(); } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs index 18ff3b3ed9..fc39a2b077 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs @@ -176,17 +176,17 @@ public Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) { throw new NotImplementedException(); } - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) { throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null) + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) { throw new NotImplementedException(); } From 057ad644edd79dd8d3e3b6d347a256c339af9b99 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 20 Sep 2021 03:45:07 -0300 Subject: [PATCH 245/494] Fix CDN format for sticker --- src/Discord.Net.Core/CDN.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index 1e8fd624d8..a744c93fe3 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -194,11 +194,10 @@ private static string FormatToExtension(StickerFormatType format) { case StickerFormatType.None: case StickerFormatType.Png: + case StickerFormatType.Apng: // In the case of the Sticker endpoint, the sticker will be available as PNG if its format_type is PNG or APNG, and as Lottie if its format_type is LOTTIE. return "png"; case StickerFormatType.Lottie: return "lottie"; - case StickerFormatType.Apng: - return "apng"; default: throw new ArgumentException(nameof(format)); From 428e8f57abccf9055b369a683d17f4db068b4c07 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 20 Sep 2021 04:25:06 -0300 Subject: [PATCH 246/494] Remove unused model --- .../API/Common/InteractionFollowupMessage.cs | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs diff --git a/src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs b/src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs deleted file mode 100644 index 28de67ee6c..0000000000 --- a/src/Discord.Net.Rest/API/Common/InteractionFollowupMessage.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord.API -{ - internal class InteractionFollowupMessage - { - public string Content { get; set; } - public Optional Username { get; set; } - public Optional AvatarUrl { get; set; } - public Optional TTS { get; set; } - public Optional File { get; set; } - public Embed[] Embeds { get; set; } - - } -} From 1d16c2da86a318e1589d44b144e815e284ffdca0 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 20 Sep 2021 05:11:56 -0300 Subject: [PATCH 247/494] Fix Color tests for out of range exception. Fix GuildPermission PrivateThreads --- src/Discord.Net.Commands/Discord.Net.Commands.xml | 4 +++- src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 3 +++ src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml | 3 +++ test/Discord.Net.Tests.Unit/ColorTests.cs | 3 +-- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml index 7da918622b..e44d712293 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ b/src/Discord.Net.Commands/Discord.Net.Commands.xml @@ -1129,7 +1129,7 @@ - + Sends a message to the source channel. @@ -1143,6 +1143,8 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + A collection of stickers to send with the file. diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 6c03ed0adb..d68c3f582f 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -178,7 +178,7 @@ private GuildPermissions(ulong initialValue, Permissions.SetValue(ref value, requestToSpeak, GuildPermission.RequestToSpeak); Permissions.SetValue(ref value, manageThreads, GuildPermission.ManageThreads); Permissions.SetValue(ref value, usePublicThreads, GuildPermission.UsePublicThreads); - Permissions.SetValue(ref value, usePrivateThreads, GuildPermission.UseExternalStickers); + Permissions.SetValue(ref value, usePrivateThreads, GuildPermission.UsePrivateThreads); Permissions.SetValue(ref value, useExternalStickers, GuildPermission.UseExternalStickers); RawValue = value; diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 43c2a05bc8..f7d0a8ab37 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2803,6 +2803,9 @@ + + + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 610555b61e..3596bdb4b9 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2825,6 +2825,9 @@ A category channel representing the parent of this channel; null if none is set. + + + diff --git a/test/Discord.Net.Tests.Unit/ColorTests.cs b/test/Discord.Net.Tests.Unit/ColorTests.cs index 87c76e4e26..46d8feabb4 100644 --- a/test/Discord.Net.Tests.Unit/ColorTests.cs +++ b/test/Discord.Net.Tests.Unit/ColorTests.cs @@ -10,12 +10,11 @@ namespace Discord /// public class ColorTests { - [Fact] public void Color_New() { Assert.Equal(0u, new Color().RawValue); Assert.Equal(uint.MinValue, new Color(uint.MinValue).RawValue); - Assert.Equal(uint.MaxValue, new Color(uint.MaxValue).RawValue); + Assert.Throws(() => new Color(uint.MaxValue)); } [Fact] public void Color_Default() From 6719d141f7bdd431aa3c8dd49b2d6b941812799b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 20 Sep 2021 05:41:18 -0300 Subject: [PATCH 248/494] Remove funding and revert readme to DNET --- .github/FUNDING.yml | 4 - README.md | 203 +++++++++++++++----------------------------- 2 files changed, 67 insertions(+), 140 deletions(-) delete mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 693e23543e..0000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,4 +0,0 @@ -# These are supported funding model platforms - -github: quinchs -custom: https://paypal.me/quinchs diff --git a/README.md b/README.md index dceb2a7a8e..87b46fb642 100644 --- a/README.md +++ b/README.md @@ -1,136 +1,67 @@ -# Discord.Net Labs -[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs) -[![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dvSfUTet3K) - -This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs - -If this projects benefits you (*and your financially stable*) consider donating or becoming a sponsor as it really helps out! - -## Known issues -Labs will not work with normal package of Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib. You can instead use the [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs) package which implements some of the features added in Discord.Net-Labs. - -## How to use -Setting up labs in your project is really simple, here's how to do it: -1) Remove Discord.Net from your project -2) Add Discord.Net Labs nuget to your project -3) Enjoy! - -## Branches -### Dev -This branch is kept up to date with dnets dev branch. we pull of it to ensure that labs will work with pre existing dnet code. - -### release/3.x -This branch is what will be pushed to nuget, sometimes its not up to date as we wait for other features to be finished. - -### old/SlashCommandService -This branch is on pause and does not work currently, There is a pull request open to implement a working version of a slash command service. It can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/pull/52) - -### feature/xyz -These branches are features for new things, you are more than welcome to clone them and give feedback in the discord server or issues tab. - -## Listening for Interactions - -Interaction docs can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions). They are much more in depth than this readme. - -```cs -// Subscribe to the InteractionCreated event -client.InteractionCreated += Client_InteractionCreated; - -... -private async Task Client_InteractionCreated(SocketInteraction interaction) -{ - // Checking the type of this interaction - switch (interaction) - { - // Slash commands - case SocketSlashCommand commandInteraction: - await MySlashCommandHandler(commandInteraction); - break; - - // Button clicks/selection dropdowns - case SocketMessageComponent componentInteraction: - await MyMessageComponentHandler(componentInteraction); - break; - - // Unused or Unknown/Unsupported - default: - break; - } -} -``` - -### Simple handling slash commands -```cs -private async Task MySlashCommandHandler(SocketSlashCommand interaction) -{ - // Checking command name - if (interaction.Data.Name == "ping") - { - // Respond to interaction with message. - // You can also use "ephemeral" so that only the original user of the interaction sees the message - await interaction.RespondAsync($"Pong!", ephemeral: true); - - // Also you can followup with a additional messages, which also can be "ephemeral" - await interaction.FollowupAsync($"PongPong!", ephemeral: true); - } -} -``` - -### Simple handling button clicks and selection dropdowns -```cs -private async Task MyMessageComponentHandler(SocketMessageComponent interaction) -{ - // Get the custom ID - var customId = interaction.Data.CustomId; - // Get the user - var user = (SocketGuildUser) interaction.User; - // Get the guild - var guild = user.Guild; - - // Respond with the update message. This edits the message which this component resides. - await interaction.UpdateAsync(msgProps => msgProps.Content = $"Clicked {interaction.Data.CustomId}!"); - - // Also you can followup with a additional messages - await interaction.FollowupAsync($"Clicked {interaction.Data.CustomId}!", ephemeral: true); - - // If you are using selection dropdowns, you can get the selected label and values using these - var selectedLabel = ((SelectMenu) interaction.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == interaction.Data.Values.FirstOrDefault())?.Label; - var selectedValue = interaction.Data.Values.First(); -} -``` - -> Note: The example above assumes that the selection dropdown is expecting only 1 returned value, if you configured your dropdown for multiple values, you'll need to modify the code slightly. - -### Sending messages with buttons -Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: -```cs -var builder = new ComponentBuilder().WithButton("Hello!", customId: "id_1", ButtonStyle.Primary, row: 0); -await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); -``` - -### Sending messages with selection dropdowns -Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: -```cs -var builder = new ComponentBuilder() - .WithSelectMenu(new SelectMenuBuilder() - .WithCustomId("id_2") - .WithPlaceholder("This is a placeholder") - .AddOption( - label: "Option", - value: "value1", - description: "Evan pog champ", - emote: Emote.Parse("<:evanpog:810017136814194698>") - ) - .AddOption("Option B", "value2", "Option B is poggers") - ); - -await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); -``` - -> Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. - -## Slash Commands & Context Menu Commands -Slash command & Context command examples and how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions/application-commands). - -## Message Components -Message components (buttons, menus, etc) examples and how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions/message-components) +# Discord.Net + +[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net) +[![MyGet](https://img.shields.io/myget/discord-net/vpre/Discord.Net.svg)](https://www.myget.org/feed/Packages/discord-net) +[![Build Status](https://dev.azure.com/discord-net/Discord.Net/_apis/build/status/discord-net.Discord.Net?branchName=dev)](https://dev.azure.com/discord-net/Discord.Net/_build/latest?definitionId=1&branchName=dev) +[![Discord](https://discord.com/api/guilds/81384788765712384/widget.png)](https://discord.gg/jkrBmQR) + +An unofficial .NET API Wrapper for the Discord client (https://discord.com). + +## Documentation + +- [Nightly](https://docs.stillu.cc/) + - [Latest CI repo](https://github.com/discord-net/docs-static) + +## Installation + +### Stable (NuGet) + +Our stable builds available from NuGet through the Discord.Net metapackage: + +- [Discord.Net](https://www.nuget.org/packages/Discord.Net/) + +The individual components may also be installed from NuGet: + +- [Discord.Net.Commands](https://www.nuget.org/packages/Discord.Net.Commands/) +- [Discord.Net.Rest](https://www.nuget.org/packages/Discord.Net.Rest/) +- [Discord.Net.WebSocket](https://www.nuget.org/packages/Discord.Net.WebSocket/) +- [Discord.Net.Webhook](https://www.nuget.org/packages/Discord.Net.Webhook/) + +### Unstable (MyGet) + +Nightly builds are available through our MyGet feed (`https://www.myget.org/F/discord-net/api/v3/index.json`). + +## Compiling + +In order to compile Discord.Net, you require the following: + +### Using Visual Studio + +- [Visual Studio 2017](https://www.microsoft.com/net/core#windowsvs2017) +- [.NET Core SDK](https://www.microsoft.com/net/download/core) + +The .NET Core workload must be selected during Visual Studio installation. + +### Using Command Line + +- [.NET Core SDK](https://www.microsoft.com/net/download/core) + +## Known Issues + +### WebSockets (Win7 and earlier) + +.NET Core 1.1 does not support WebSockets on Win7 and earlier. This issue has been fixed since the release of .NET Core 2.1. It is recommended to target .NET Core 2.1 or above for your project if you wish to run your bot on legacy platforms; alternatively, you may choose to install the [Discord.Net.Providers.WS4Net](https://www.nuget.org/packages/Discord.Net.Providers.WS4Net/) package. + +## Versioning Guarantees + +This library generally abides by [Semantic Versioning](https://semver.org). Packages are published in MAJOR.MINOR.PATCH version format. + +An increment of the PATCH component always indicates that an internal-only change was made, generally a bugfix. These changes will not affect the public-facing API in any way, and are always guaranteed to be forward- and backwards-compatible with your codebase, any pre-compiled dependencies of your codebase. + +An increment of the MINOR component indicates that some addition was made to the library, and this addition is not backwards-compatible with prior versions. However, Discord.Net **does not guarantee forward-compatibility** on minor additions. In other words, we permit a limited set of breaking changes on a minor version bump. + +Due to the nature of the Discord API, we will oftentimes need to add a property to an entity to support the latest API changes. Discord.Net provides interfaces as a method of consuming entities; and as such, introducing a new field to an entity is technically a breaking change. Major version bumps generally indicate some major change to the library, and as such we are hesitant to bump the major version for every minor addition to the library. To compromise, we have decided that interfaces should be treated as **consumable only**, and your applications should typically not be implementing interfaces. (For applications where interfaces are implemented, such as in test mocks, we apologize for this inconsistency with SemVer). + +Furthermore, while we will never break the API (outside of interface changes) on minor builds, we will occasionally need to break the ABI, by introducing parameters to a method to match changes upstream with Discord. As such, a minor version increment may require you to recompile your code, and dependencies, such as addons, may also need to be recompiled and republished on the newer version. When a binary breaking change is made, the change will be noted in the release notes. + +An increment of the MAJOR component indicates that breaking changes have been made to the library; consumers should check the release notes to determine what changes need to be made. From 6ab38537febaf82c38f850fdcf65809a9199c2bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Tue, 21 Sep 2021 10:59:31 +0200 Subject: [PATCH 249/494] Move and disconnect (#165) * Changed comments to regions * More regions * regions * Added DisconnectAsync and MoveAsync --- .../Entities/Guilds/IGuild.cs | 15 ++++++ .../Entities/Guilds/RestGuild.cs | 24 +++++++-- .../Entities/Guilds/SocketGuild.cs | 54 ++++++++++++++----- 3 files changed, 76 insertions(+), 17 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 76ff9eb4fb..87c3137003 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -771,6 +771,12 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// A guild user associated with the specified ; if the user is already in the guild. Task AddGuildUserAsync(ulong userId, string accessToken, Action func = null, RequestOptions options = null); /// + /// Disconnects the user from its current voice channel + /// + /// The user to disconnect. + /// A task that represents the asynchronous operation for disconnecting a user. + Task DisconnectAsync(IGuildUser user); + /// /// Gets a collection of all users in this guild. /// /// @@ -951,6 +957,15 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// emote. /// Task ModifyEmoteAsync(GuildEmote emote, Action func, RequestOptions options = null); + + /// + /// Moves the user to the voice channel. + /// + /// The user to move. + /// the channel where the user gets moved to. + /// A task that represents the asynchronous operation for moving a user. + Task MoveAsync(IGuildUser user, IVoiceChannel targetChannel); + /// /// Deletes an existing from this guild. /// diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 3608c2d8ba..d566afc814 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -962,7 +962,7 @@ public async Task> BulkOverwriteApplicatio public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id})"; - //Emotes + #region Emotes /// public Task> GetEmotesAsync(RequestOptions options = null) => GuildHelper.GetEmotesAsync(this, Discord, options); @@ -976,11 +976,20 @@ public Task GetEmoteAsync(ulong id, RequestOptions options = null) /// is . public Task ModifyEmoteAsync(GuildEmote emote, Action func, RequestOptions options = null) => GuildHelper.ModifyEmoteAsync(this, Discord, emote.Id, func, options); + /// + /// Moves the user to the voice channel. + /// + /// The user to move. + /// the channel where the user gets moved to. + /// A task that represents the asynchronous operation for moving a user. + public Task MoveAsync(IGuildUser user, IVoiceChannel targetChannel) + => user.ModifyAsync(x => x.Channel = new Optional(targetChannel)); /// public Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null) => GuildHelper.DeleteEmoteAsync(this, Discord, emote.Id, options); + #endregion - //Stickers + #region Stickers /// /// Creates a new sticker in this guild. /// @@ -1087,8 +1096,9 @@ public async Task> GetStickersAsync(RequestOp /// public Task DeleteStickerAsync(CustomSticker sticker, RequestOptions options = null) => sticker.DeleteAsync(options); + #endregion - //IGuild + #region IGuild /// bool IGuild.Available => Available; /// @@ -1291,6 +1301,13 @@ async Task IGuild.CreateRoleAsync(string name, GuildPermissions? permissi async Task IGuild.AddGuildUserAsync(ulong userId, string accessToken, Action func, RequestOptions options) => await AddGuildUserAsync(userId, accessToken, func, options); + /// + /// Disconnects the user from its current voice channel + /// + /// The user to disconnect. + /// A task that represents the asynchronous operation for disconnecting a user. + async Task IGuild.DisconnectAsync(IGuildUser user) => await user.ModifyAsync(x => x.Channel = new Optional()); + /// async Task IGuild.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -1399,5 +1416,6 @@ async Task IGuild.GetApplicationCommandAsync(ulong id, Cach else return null; } + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 0c211f394c..1cdefcdb77 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -572,7 +572,7 @@ internal void Update(ClientState state, EmojiUpdateModel model) _emotes = emotes.ToImmutable(); } - //General + #region General /// public Task DeleteAsync(RequestOptions options = null) => GuildHelper.DeleteAsync(this, Discord, options); @@ -596,8 +596,9 @@ public Task ReorderRolesAsync(IEnumerable args, RequestOp /// public Task LeaveAsync(RequestOptions options = null) => GuildHelper.LeaveAsync(this, Discord, options); + #endregion - //Bans + #region Bans /// /// Gets a collection of all users banned in this guild. /// @@ -645,8 +646,9 @@ public Task RemoveBanAsync(IUser user, RequestOptions options = null) /// public Task RemoveBanAsync(ulong userId, RequestOptions options = null) => GuildHelper.RemoveBanAsync(this, Discord, userId, options); + #endregion - //Channels + #region Channels /// /// Gets a channel in this guild. /// @@ -807,8 +809,9 @@ internal void PurgeChannelCache(ClientState state) _channels.Clear(); } + #endregion - //Voice Regions + #region Voice Regions /// /// Gets a collection of all the voice regions this guild can access. /// @@ -819,14 +822,16 @@ internal void PurgeChannelCache(ClientState state) /// public Task> GetVoiceRegionsAsync(RequestOptions options = null) => GuildHelper.GetVoiceRegionsAsync(this, Discord, options); + #endregion - //Integrations + #region Integrations public Task> GetIntegrationsAsync(RequestOptions options = null) => GuildHelper.GetIntegrationsAsync(this, Discord, options); public Task CreateIntegrationAsync(ulong id, string type, RequestOptions options = null) => GuildHelper.CreateIntegrationAsync(this, Discord, id, type, options); + #endregion - //Interactions + #region Interactions /// /// Deletes all application commands in the current guild. /// @@ -932,8 +937,9 @@ public async Task> BulkOverwriteAp return entities.ToImmutableArray(); } + #endregion - //Invites + #region Invites /// /// Gets a collection of all invites in this guild. /// @@ -1040,8 +1046,9 @@ internal SocketCustomSticker RemoveSticker(ulong id) return sticker; return null; } + #endregion - //Users + #region Users /// public Task AddGuildUserAsync(ulong id, string accessToken, Action func = null, RequestOptions options = null) => GuildHelper.AddGuildUserAsync(this, Discord, id, accessToken, func, options); @@ -1240,7 +1247,24 @@ public Task ModifyEmoteAsync(GuildEmote emote, Action GuildHelper.DeleteEmoteAsync(this, Discord, emote.Id, options); - //Stickers + /// + /// Moves the user to the voice channel. + /// + /// The user to move. + /// the channel where the user gets moved to. + /// A task that represents the asynchronous operation for moving a user. + public Task MoveAsync(IGuildUser user, IVoiceChannel targetChannel) + => user.ModifyAsync(x => x.Channel = new Optional(targetChannel)); + + /// + /// Disconnects the user from its current voice channel + /// + /// The user to disconnect. + /// A task that represents the asynchronous operation for disconnecting a user. + async Task IGuild.DisconnectAsync(IGuildUser user) => await user.ModifyAsync(x => x.Channel = new Optional()); + #endregion + + #region Stickers /// /// Gets a specific sticker within this guild. /// @@ -1368,8 +1392,9 @@ public async Task CreateStickerAsync(string name, string de /// public Task DeleteStickerAsync(SocketCustomSticker sticker, RequestOptions options = null) => sticker.DeleteAsync(options); + #endregion - //Voice States + #region Voice States internal async Task AddOrUpdateVoiceStateAsync(ClientState state, VoiceStateModel model) { var voiceChannel = state.GetChannel(model.ChannelId.Value) as SocketVoiceChannel; @@ -1413,8 +1438,9 @@ internal async Task AddOrUpdateVoiceStateAsync(ClientState sta } return null; } + #endregion - //Audio + #region Audio internal AudioInStream GetAudioStream(ulong userId) { return _audioClient?.GetInputStream(userId); @@ -1568,8 +1594,9 @@ internal async Task RepopulateAudioStreamsAsync() public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id})"; internal SocketGuild Clone() => MemberwiseClone() as SocketGuild; + #endregion - //IGuild + #region IGuild /// ulong? IGuild.AFKChannelId => AFKChannelId; /// @@ -1781,7 +1808,6 @@ void IDisposable.Dispose() _audioLock?.Dispose(); _audioClient?.Dispose(); } - - + #endregion } } From 75179e2b267361ebaa4f05213a1f8db13bb0e693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Tue, 21 Sep 2021 10:59:44 +0200 Subject: [PATCH 250/494] Fixed Placement of Obsolete (#164) Missing XML comment for publicly visible type or member 'InteractionResponseType.Acknowledge' --- .../Entities/Interactions/InteractionResponseType.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index 1b103f491b..d34c282ef2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -22,16 +22,16 @@ public enum InteractionResponseType : byte /// Pong = 1, - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] /// /// ACK a command without sending a message, eating the user's input. /// + [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] Acknowledge = 2, - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] /// /// Respond with a message, showing the user's input. /// + [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] ChannelMessage = 3, /// From 0d811601b73f10e88b119622555d5812bd8ec383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Tue, 21 Sep 2021 11:00:04 +0200 Subject: [PATCH 251/494] Added warning for Select Menu duplicates values (#163) Added a warning if it happens that the Select Menu if there is duplicates values --- .../Interactions/Message Components/ComponentBuilder.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 07cc0b6abd..a174dcd54c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -124,6 +124,8 @@ public ComponentBuilder WithSelectMenu(string label, string customId, List Date: Tue, 21 Sep 2021 13:43:05 +0200 Subject: [PATCH 252/494] More argument corrections (#166) * Changed and corrected the MaxCustomIdLength to MaxSelectValueLength * Added more error messages for users. * added too * corrected MaxLabelLength to MaxButtonLabelLength * Added more detailed error messages --- .../Message Components/ComponentBuilder.cs | 101 +++++++++++++----- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index a174dcd54c..5dcf8f22c0 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -10,11 +10,6 @@ namespace Discord /// public class ComponentBuilder { - /// - /// The max length of a . - /// - public const int MaxButtonLabelLength = 80; - /// /// The max length of a . /// @@ -353,19 +348,27 @@ public class ButtonBuilder /// /// The max length of a . /// - public const int MaxLabelLength = 80; + public const int MaxButtonLabelLength = 80; /// /// Gets or sets the label of the current button. /// - /// length exceeds . + /// length exceeds . + /// length exceeds . public string Label { get => _label; set { - if (value != null && value.Length > ComponentBuilder.MaxButtonLabelLength) - throw new ArgumentException(message: $"Button label must be {ComponentBuilder.MaxButtonLabelLength} characters or less!", paramName: nameof(Label)); + if (value != null) + { + if (value.Length > MaxButtonLabelLength) + throw new ArgumentException($"Button label must be {MaxButtonLabelLength} characters or less!", paramName: nameof(Label)); + if (value.Length < 1) + throw new ArgumentException("Button label must be 1 character or more!", paramName: nameof(Label)); + } + else + throw new ArgumentException("Button label must not be null or empty!", paramName: nameof(Label)); _label = value; } @@ -375,13 +378,21 @@ public string Label /// Gets or sets the custom id of the current button. /// /// length exceeds + /// length subceeds 1. public string CustomId { get => _customId; set { - if (value != null && value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + if (value != null) + { + if (value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + if (value.Length < 1) + throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); + } + else + throw new ArgumentException("Custom Id must not be null or empty!", paramName: nameof(CustomId)); _customId = value; } } @@ -619,14 +630,22 @@ public class SelectMenuBuilder /// /// Gets or sets the custom id of the current select menu. /// - /// length exceeds . + /// length exceeds + /// length subceeds 1. public string CustomId { get => _customId; set { - if (value != null && value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException(message: $"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + if (value != null) + { + if (value.Length > ComponentBuilder.MaxCustomIdLength) + throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); + if (value.Length < 1) + throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); + } + else + throw new ArgumentException("Custom Id must not be null or empty!", paramName: nameof(CustomId)); _customId = value; } } @@ -635,13 +654,21 @@ public string CustomId /// Gets or sets the placeholder text of the current select menu. /// /// length exceeds . + /// length subceeds 1. public string Placeholder { get => _placeholder; set { - if (value?.Length > MaxPlaceholderLength) - throw new ArgumentException(message: $"Placeholder must be {MaxPlaceholderLength} characters or less!", paramName: nameof(Placeholder)); + if (value != null) + { + if (value.Length > MaxPlaceholderLength) + throw new ArgumentException($"The placeholder must be {MaxPlaceholderLength} characters or less!", paramName: nameof(Placeholder)); + if (value.Length < 1) + throw new ArgumentException("The placeholder must be 1 character or more!", paramName: nameof(Placeholder)); + } + else + throw new ArgumentException("The placeholder must not be null or empty!", paramName: nameof(Placeholder)); _placeholder = value; } @@ -882,7 +909,7 @@ public class SelectMenuOptionBuilder /// /// The maximum length of a . /// - public const int MaxLabelLength = 100; + public const int MaxSelectLabelLength = 100; /// /// The maximum length of a . @@ -890,22 +917,29 @@ public class SelectMenuOptionBuilder public const int MaxDescriptionLength = 100; /// - /// The maximum length of a . + /// The maximum length of a . /// - public const int MaxSelectLabelLength = 100; + public const int MaxSelectValueLength = 100; /// /// Gets or sets the label of the current select menu. /// /// length exceeds + /// length subceeds 1. public string Label { get => _label; set { if (value != null) + { if (value.Length > MaxSelectLabelLength) - throw new ArgumentException(message: $"Button label must be {MaxSelectLabelLength} characters or less!", paramName: nameof(Label)); + throw new ArgumentException($"Select option label must be {MaxSelectLabelLength} characters or less!", paramName: nameof(Label)); + if (value.Length < 1) + throw new ArgumentException("Select option label must be 1 character or more!", paramName: nameof(Label)); + } + else + throw new ArgumentException("Select option label must not be null or empty!", paramName: nameof(Label)); _label = value; } @@ -914,14 +948,23 @@ public string Label /// /// Gets or sets the custom id of the current select menu. /// - /// length exceeds . + /// length exceeds . + /// length subceeds 1. public string Value { get => _value; set { - if (value != null && value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException(message: $"Value must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(Value)); + if (value != null) + { + if (value.Length > MaxSelectValueLength) + throw new ArgumentException($"Select option value must be {MaxSelectValueLength} characters or less!", paramName: nameof(Label)); + if (value.Length < 1) + throw new ArgumentException("Select option value must be 1 character or more!", paramName: nameof(Label)); + } + else + throw new ArgumentException("Select option value must not be null or empty!", paramName: nameof(Label)); + _value = value; } } @@ -930,13 +973,21 @@ public string Value /// Gets or sets this menu options description. /// /// length exceeds . + /// length subceeds 1. public string Description { get => _description; set { - if (value != null && value.Length > MaxDescriptionLength) - throw new ArgumentException($"Description must be {MaxDescriptionLength} characters or less!", nameof(Description)); + if (value != null) + { + if (value.Length > MaxDescriptionLength) + throw new ArgumentException($"The description must be {MaxDescriptionLength} characters or less!", paramName: nameof(Label)); + if (value.Length < 1) + throw new ArgumentException("The description must be 1 character or more!", paramName: nameof(Label)); + } + else + throw new ArgumentException("The description must not be null or empty!", paramName: nameof(Label)); _description = value; } From 97e9a4fc81410ec0c46f86f97f935932a9659ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Tue, 21 Sep 2021 14:41:48 +0200 Subject: [PATCH 253/494] Regions discord.net.commands (#167) * RestGuildChannel regions * RestChannel * RestTextChannel * RestCategoryChannel * RestVoiceChannel * RestTextChannel * CommandService * ModuleBase * CommandBuilder * ModuleBuilder * ParameterBuilder --- .../Builders/CommandBuilder.cs | 11 +++++++--- .../Builders/ModuleBuilder.cs | 9 +++++++-- .../Builders/ParameterBuilder.cs | 9 +++++++-- src/Discord.Net.Commands/CommandService.cs | 13 +++++++++--- src/Discord.Net.Commands/ModuleBase.cs | 5 ++++- .../Entities/Channels/RestCategoryChannel.cs | 5 ++++- .../Entities/Channels/RestChannel.cs | 5 ++++- .../Entities/Channels/RestGuildChannel.cs | 8 ++++++-- .../Entities/Channels/RestTextChannel.cs | 20 +++++++++++++------ .../Entities/Channels/RestVoiceChannel.cs | 14 +++++++++---- 10 files changed, 74 insertions(+), 25 deletions(-) diff --git a/src/Discord.Net.Commands/Builders/CommandBuilder.cs b/src/Discord.Net.Commands/Builders/CommandBuilder.cs index 3f1ca883a9..1d946a33d4 100644 --- a/src/Discord.Net.Commands/Builders/CommandBuilder.cs +++ b/src/Discord.Net.Commands/Builders/CommandBuilder.cs @@ -7,6 +7,7 @@ namespace Discord.Commands.Builders { public class CommandBuilder { + #region CommandBuilder private readonly List _preconditions; private readonly List _parameters; private readonly List _attributes; @@ -27,8 +28,9 @@ public class CommandBuilder public IReadOnlyList Parameters => _parameters; public IReadOnlyList Attributes => _attributes; public IReadOnlyList Aliases => _aliases; + #endregion - //Automatic + #region Automatic internal CommandBuilder(ModuleBuilder module) { Module = module; @@ -38,7 +40,9 @@ internal CommandBuilder(ModuleBuilder module) _attributes = new List(); _aliases = new List(); } - //User-defined + #endregion + + #region User-defined internal CommandBuilder(ModuleBuilder module, string primaryAlias, Func callback) : this(module) { @@ -132,7 +136,7 @@ internal CommandInfo Build(ModuleInfo info, CommandService service) var firstMultipleParam = _parameters.FirstOrDefault(x => x.IsMultiple); if ((firstMultipleParam != null) && (firstMultipleParam != lastParam)) throw new InvalidOperationException($"Only the last parameter in a command may have the Multiple flag. Parameter: {firstMultipleParam.Name} in {PrimaryAlias}"); - + var firstRemainderParam = _parameters.FirstOrDefault(x => x.IsRemainder); if ((firstRemainderParam != null) && (firstRemainderParam != lastParam)) throw new InvalidOperationException($"Only the last parameter in a command may have the Remainder flag. Parameter: {firstRemainderParam.Name} in {PrimaryAlias}"); @@ -140,5 +144,6 @@ internal CommandInfo Build(ModuleInfo info, CommandService service) return new CommandInfo(this, info, service); } + #endregion } } diff --git a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs index 6dc50db317..ddb62e797f 100644 --- a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs @@ -7,6 +7,7 @@ namespace Discord.Commands.Builders { public class ModuleBuilder { + #region ModuleBuilder private readonly List _commands; private readonly List _submodules; private readonly List _preconditions; @@ -27,8 +28,9 @@ public class ModuleBuilder public IReadOnlyList Aliases => _aliases; internal TypeInfo TypeInfo { get; set; } + #endregion - //Automatic + #region Automatic internal ModuleBuilder(CommandService service, ModuleBuilder parent) { Service = service; @@ -40,7 +42,9 @@ internal ModuleBuilder(CommandService service, ModuleBuilder parent) _attributes = new List(); _aliases = new List(); } - //User-defined + #endregion + + #region User-defined internal ModuleBuilder(CommandService service, ModuleBuilder parent, string primaryAlias) : this(service, parent) { @@ -132,5 +136,6 @@ private ModuleInfo BuildImpl(CommandService service, IServiceProvider services, public ModuleInfo Build(CommandService service, IServiceProvider services) => BuildImpl(service, services); internal ModuleInfo Build(CommandService service, IServiceProvider services, ModuleInfo parent) => BuildImpl(service, services, parent); + #endregion } } diff --git a/src/Discord.Net.Commands/Builders/ParameterBuilder.cs b/src/Discord.Net.Commands/Builders/ParameterBuilder.cs index 4ad5bfac08..7f827a27e6 100644 --- a/src/Discord.Net.Commands/Builders/ParameterBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ParameterBuilder.cs @@ -8,6 +8,7 @@ namespace Discord.Commands.Builders { public class ParameterBuilder { + #region ParameterBuilder private readonly List _preconditions; private readonly List _attributes; @@ -24,8 +25,9 @@ public class ParameterBuilder public IReadOnlyList Preconditions => _preconditions; public IReadOnlyList Attributes => _attributes; +#endregion - //Automatic + #region Automatic internal ParameterBuilder(CommandBuilder command) { _preconditions = new List(); @@ -33,7 +35,9 @@ internal ParameterBuilder(CommandBuilder command) Command = command; } - //User-defined + #endregion + + #region User-defined internal ParameterBuilder(CommandBuilder command, string name, Type type) : this(command) { @@ -132,5 +136,6 @@ internal ParameterInfo Build(CommandInfo info) return new ParameterInfo(this, info, Command.Module.Service); } + #endregion } } diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 8659b01307..f897f822a0 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -29,6 +29,7 @@ namespace Discord.Commands /// public class CommandService : IDisposable { + #region CommandService /// /// Occurs when a command-related information is received. /// @@ -131,8 +132,9 @@ public CommandService(CommandServiceConfig config) entityTypeReaders.Add((typeof(IUser), typeof(UserTypeReader<>))); _entityTypeReaders = entityTypeReaders.ToImmutable(); } + #endregion - //Modules + #region Modules public async Task CreateModuleAsync(string primaryAlias, Action buildFunc) { await _moduleLock.WaitAsync().ConfigureAwait(false); @@ -322,8 +324,9 @@ private bool RemoveModuleInternal(ModuleInfo module) return true; } + #endregion - //Type Readers + #region Type Readers /// /// Adds a custom to this for the supplied object /// type. @@ -448,8 +451,9 @@ internal TypeReader GetDefaultTypeReader(Type type) } return null; } + #endregion - //Execution + #region Execution /// /// Searches for the command. /// @@ -602,7 +606,9 @@ float CalculateScore(CommandMatch match, ParseResult parseResult) await _commandExecutedEvent.InvokeAsync(chosenOverload.Key.Command, context, result); return result; } + #endregion + #region Dispose protected virtual void Dispose(bool disposing) { if (!_isDisposed) @@ -620,5 +626,6 @@ void IDisposable.Dispose() { Dispose(true); } + #endregion } } diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index 159b44fb81..5f470b7b6d 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -16,6 +16,7 @@ public abstract class ModuleBase : ModuleBase { } public abstract class ModuleBase : IModuleBase where T : class, ICommandContext { + #region ModuleBase /// /// The underlying context of the command. /// @@ -65,8 +66,9 @@ protected virtual void AfterExecute(CommandInfo command) protected virtual void OnModuleBuilding(CommandService commandService, ModuleBuilder builder) { } + #endregion - //IModuleBase + #region IModuleBase void IModuleBase.SetContext(ICommandContext context) { var newValue = context as T; @@ -75,5 +77,6 @@ void IModuleBase.SetContext(ICommandContext context) void IModuleBase.BeforeExecute(CommandInfo command) => BeforeExecute(command); void IModuleBase.AfterExecute(CommandInfo command) => AfterExecute(command); void IModuleBase.OnModuleBuilding(CommandService commandService, ModuleBuilder builder) => OnModuleBuilding(commandService, builder); + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs index 177bde21d7..9f944501b0 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs @@ -12,6 +12,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestCategoryChannel : RestGuildChannel, ICategoryChannel { + #region RestCategoryChannel internal RestCategoryChannel(BaseDiscordClient discord, IGuild guild, ulong id) : base(discord, guild, id) { @@ -24,8 +25,9 @@ internal RestCategoryChannel(BaseDiscordClient discord, IGuild guild, ulong id) } private string DebuggerDisplay => $"{Name} ({Id}, Category)"; + #endregion - //IChannel + #region IChannel /// /// This method is not supported with category channels. IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) @@ -34,5 +36,6 @@ IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mo /// This method is not supported with category channels. Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => throw new NotSupportedException(); + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs index 6f6a1f0d3b..b653a2db43 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs @@ -11,6 +11,7 @@ namespace Discord.Rest /// public class RestChannel : RestEntity, IChannel, IUpdateable { + #region RestChannel /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -53,8 +54,9 @@ internal virtual void Update(Model model) { } /// public virtual Task UpdateAsync(RequestOptions options = null) => Task.Delay(0); + #endregion - //IChannel + #region IChannel /// string IChannel.Name => null; @@ -64,5 +66,6 @@ Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions optio /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => AsyncEnumerable.Empty>(); //Overridden + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs index f0150aeb23..549a4ba31a 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs @@ -12,6 +12,7 @@ namespace Discord.Rest /// public class RestGuildChannel : RestChannel, IGuildChannel { + #region RestGuildChannel private ImmutableArray _overwrites; /// @@ -191,8 +192,9 @@ public virtual async Task RemovePermissionOverwriteAsync(IRole role, RequestOpti /// A string that is the name of this channel. /// public override string ToString() => Name; + #endregion - //IGuildChannel + #region IGuildChannel /// IGuild IGuildChannel.Guild { @@ -229,13 +231,15 @@ IAsyncEnumerable> IGuildChannel.GetUsersAsync(Ca /// Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(null); //Overridden in Text/Voice + #endregion - //IChannel + #region IChannel /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => AsyncEnumerable.Empty>(); //Overridden in Text/Voice /// Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(null); //Overridden in Text/Voice + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index ffe989dbfe..ffd21afa5a 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -14,6 +14,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestTextChannel : RestGuildChannel, IRestMessageChannel, ITextChannel { + #region RestTextChannel /// public string Topic { get; private set; } /// @@ -210,8 +211,9 @@ public virtual Task GetCategoryAsync(RequestOptions options = /// public Task SyncPermissionsAsync(RequestOptions options = null) => ChannelHelper.SyncPermissionsAsync(this, Discord, options); + #endregion - //Invites + #region Invites /// public virtual async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); @@ -261,8 +263,9 @@ public async Task CreateThreadAsync(string name, ThreadType t var model = await ThreadHelper.CreateThreadAsync(Discord, this, name, type, autoArchiveDuration, message, options); return RestThreadChannel.Create(Discord, this.Guild, model); } + #endregion - //ITextChannel + #region ITextChannel /// async Task ITextChannel.CreateWebhookAsync(string name, Stream avatar, RequestOptions options) => await CreateWebhookAsync(name, avatar, options).ConfigureAwait(false); @@ -275,8 +278,9 @@ async Task> ITextChannel.GetWebhooksAsync(RequestO async Task ITextChannel.CreateThreadAsync(string name, ThreadType type, ThreadArchiveDuration autoArchiveDuration, IMessage message, RequestOptions options) => await CreateThreadAsync(name, type, autoArchiveDuration, message, options); + #endregion - //IMessageChannel + #region IMessageChannel /// async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -324,8 +328,9 @@ async Task IMessageChannel.SendFileAsync(Stream stream, string fil /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + #endregion - //IGuildChannel + #region IGuildChannel /// async Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -342,8 +347,9 @@ IAsyncEnumerable> IGuildChannel.GetUsersAsync(Ca else return AsyncEnumerable.Empty>(); } + #endregion - //IChannel + #region IChannel /// async Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -360,8 +366,9 @@ IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mo else return AsyncEnumerable.Empty>(); } + #endregion - // INestedChannel + #region ITextChannel /// async Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) { @@ -369,5 +376,6 @@ async Task INestedChannel.GetCategoryAsync(CacheMode mode, Req return (await Guild.GetChannelAsync(CategoryId.Value, mode, options).ConfigureAwait(false)) as ICategoryChannel; return null; } + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs index b551c7f8f3..d1d567e272 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs @@ -14,6 +14,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestVoiceChannel : RestGuildChannel, IVoiceChannel, IRestAudioChannel { + #region RestVoiceChannel /// public int Bitrate { get; private set; } /// @@ -60,8 +61,9 @@ public Task GetCategoryAsync(RequestOptions options = null) /// public Task SyncPermissionsAsync(RequestOptions options = null) => ChannelHelper.SyncPermissionsAsync(this, Discord, options); + #endregion - //Invites + #region Invites /// public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); @@ -76,22 +78,25 @@ public async Task> GetInvitesAsync(RequestO => await ChannelHelper.GetInvitesAsync(this, Discord, options).ConfigureAwait(false); private string DebuggerDisplay => $"{Name} ({Id}, Voice)"; + #endregion - //IAudioChannel + #region IAudioChannel /// /// Connecting to a REST-based channel is not supported. Task IAudioChannel.ConnectAsync(bool selfDeaf, bool selfMute, bool external) { throw new NotSupportedException(); } Task IAudioChannel.DisconnectAsync() { throw new NotSupportedException(); } + #endregion - //IGuildChannel + #region IGuildChannel /// Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(null); /// IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => AsyncEnumerable.Empty>(); + #endregion - // INestedChannel + #region INestedChannel /// async Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) { @@ -99,5 +104,6 @@ async Task INestedChannel.GetCategoryAsync(CacheMode mode, Req return (await Guild.GetChannelAsync(CategoryId.Value, mode, options).ConfigureAwait(false)) as ICategoryChannel; return null; } + #endregion } } From 867380439b738a07b27ab7f836fbeb9893f8a696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Tue, 21 Sep 2021 15:57:07 +0200 Subject: [PATCH 254/494] Regions discord.net.rest (#168) * BaseDiscordClient * ClientHelper * DiscordRestApiClient * DiscordRestClient * DiscordContractResolver * RestGuildUser * RestUser * RestWebhookUser * RestWebhook * RestRole * RoleHelper * RestApplicationCommandOption * InteractionHelper * GuildHelper * RestGuild --- src/Discord.Net.Rest/BaseDiscordClient.cs | 5 +- src/Discord.Net.Rest/ClientHelper.cs | 3 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 91 +++++++++++++------ src/Discord.Net.Rest/DiscordRestClient.cs | 6 +- .../Entities/Guilds/GuildHelper.cs | 36 +++++--- .../Entities/Guilds/RestGuild.cs | 35 ++++--- .../Interactions/InteractionHelper.cs | 14 ++- .../RestApplicationCommandOption.cs | 5 +- .../Entities/Roles/RestRole.cs | 6 +- .../Entities/Roles/RoleHelper.cs | 3 +- .../Entities/Users/RestGuildUser.cs | 8 +- .../Entities/Users/RestUser.cs | 5 +- .../Entities/Users/RestWebhookUser.cs | 8 +- .../Entities/Webhooks/RestWebhook.cs | 5 +- .../Net/Converters/DiscordContractResolver.cs | 5 +- 15 files changed, 164 insertions(+), 71 deletions(-) diff --git a/src/Discord.Net.Rest/BaseDiscordClient.cs b/src/Discord.Net.Rest/BaseDiscordClient.cs index 93b82c929b..431859a103 100644 --- a/src/Discord.Net.Rest/BaseDiscordClient.cs +++ b/src/Discord.Net.Rest/BaseDiscordClient.cs @@ -10,6 +10,7 @@ namespace Discord.Rest { public abstract class BaseDiscordClient : IDiscordClient { + #region BaseDiscordClient public event Func Log { add { _logEvent.Add(value); } remove { _logEvent.Remove(value); } } internal readonly AsyncEvent> _logEvent = new AsyncEvent>(); @@ -155,8 +156,9 @@ public Task GetRecommendedShardCountAsync(RequestOptions options = null) /// public Task GetBotGatewayAsync(RequestOptions options = null) => ClientHelper.GetBotGatewayAsync(this, options); + #endregion - //IDiscordClient + #region IDiscordClient /// ConnectionState IDiscordClient.ConnectionState => ConnectionState.Disconnected; /// @@ -235,5 +237,6 @@ Task IDiscordClient.StartAsync() /// Task IDiscordClient.StopAsync() => Task.Delay(0); + #endregion } } diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 2fc382900a..4581219bbb 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -10,7 +10,7 @@ namespace Discord.Rest { internal static class ClientHelper { - //Applications + #region Applications public static async Task GetApplicationInfoAsync(BaseDiscordClient client, RequestOptions options) { var model = await client.ApiClient.GetMyApplicationAsync(options).ConfigureAwait(false); @@ -263,5 +263,6 @@ public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong u public static Task RemoveRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) => client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options); + #endregion } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index ead0c0e8ae..0db6985b0d 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -24,6 +24,7 @@ namespace Discord.API { internal class DiscordRestApiClient : IDisposable { + #region DiscordRestApiClient private static readonly ConcurrentDictionary> _bucketIdGenerators = new ConcurrentDictionary>(); public event Func SentRequest { add { _sentRequestEvent.Add(value); } remove { _sentRequestEvent.Remove(value); } } @@ -167,8 +168,9 @@ private async Task LogoutInternalAsync() internal virtual Task ConnectInternalAsync() => Task.Delay(0); internal virtual Task DisconnectInternalAsync(Exception ex = null) => Task.Delay(0); + #endregion - //Core + #region Core internal Task SendAsync(string method, Expression> endpointExpr, BucketIds ids, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null, [CallerMemberName] string funcName = null) => SendAsync(method, GetEndpoint(endpointExpr), GetBucketId(method, ids, endpointExpr, funcName), clientBucket, options); @@ -271,15 +273,17 @@ private async Task SendInternalAsync(string method, string endpoint, Res return responseStream; } + #endregion - //Auth + #region Auth public async Task ValidateTokenAsync(RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); await SendAsync("GET", () => "auth/login", new BucketIds(), options: options).ConfigureAwait(false); } + #endregion - //Gateway + #region Gateway public async Task GetGatewayAsync(RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); @@ -290,8 +294,9 @@ public async Task GetBotGatewayAsync(RequestOptions optio options = RequestOptions.CreateOrClone(options); return await SendAsync("GET", () => "gateway/bot", new BucketIds(), options: options).ConfigureAwait(false); } + #endregion - //Channels + #region Channels public async Task GetChannelAsync(ulong channelId, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -414,8 +419,9 @@ public async Task ModifyGuildChannelsAsync(ulong guildId, IEnumerable ModifyThreadAsync(ulong channelId, ModifyThreadParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -582,8 +588,9 @@ public async Task GetJoinedPrivateArchivedThreadsAsync(ulong cha return await SendAsync("GET", () => $"channels/{channelId}/users/@me/threads/archived/private{query}", bucket, options: options); } + #endregion - // stage + #region Stage public async Task CreateStageInstanceAsync(CreateStageInstanceParams args, RequestOptions options = null) { @@ -658,8 +665,9 @@ public async Task ModifyUserVoiceState(ulong guildId, ulong userId, ModifyVoiceS await SendJsonAsync("PATCH", () => $"guilds/{guildId}/voice-states/{userId}", args, bucket, options: options).ConfigureAwait(false); } + #endregion - // roles + #region Roles public async Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -682,8 +690,9 @@ public async Task RemoveRoleAsync(ulong guildId, ulong userId, ulong roleId, Req var ids = new BucketIds(guildId: guildId); await SendAsync("DELETE", () => $"guilds/{guildId}/members/{userId}/roles/{roleId}", ids, options: options).ConfigureAwait(false); } + #endregion - //Channel Messages + #region Channel Messages public async Task GetChannelMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -886,8 +895,9 @@ public async Task ModifyMessageAsync(ulong channelId, ulong messageId, var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}/messages/{messageId}", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); } + #endregion - // Stickers + #region Stickers public async Task GetStickerAsync(ulong id, RequestOptions options = null) { Preconditions.NotEqual(id, 0, nameof(id)); @@ -1044,8 +1054,9 @@ public async Task CrosspostAsync(ulong channelId, ulong messageId, RequestOption var ids = new BucketIds(channelId: channelId); await SendAsync("POST", () => $"channels/{channelId}/messages/{messageId}/crosspost", ids, options: options).ConfigureAwait(false); } + #endregion - //Channel Permissions + #region Channel Permissions public async Task ModifyChannelPermissionsAsync(ulong channelId, ulong targetId, ModifyChannelPermissionsParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -1065,8 +1076,9 @@ public async Task DeleteChannelPermissionAsync(ulong channelId, ulong targetId, var ids = new BucketIds(channelId: channelId); await SendAsync("DELETE", () => $"channels/{channelId}/permissions/{targetId}", ids, options: options).ConfigureAwait(false); } + #endregion - //Channel Pins + #region Channel Pins public async Task AddPinAsync(ulong channelId, ulong messageId, RequestOptions options = null) { Preconditions.GreaterThan(channelId, 0, nameof(channelId)); @@ -1094,8 +1106,9 @@ public async Task> GetPinsAsync(ulong channelId, Re var ids = new BucketIds(channelId: channelId); return await SendAsync>("GET", () => $"channels/{channelId}/pins", ids, options: options).ConfigureAwait(false); } + #endregion - //Channel Recipients + #region Channel Recipients public async Task AddGroupRecipientAsync(ulong channelId, ulong userId, RequestOptions options = null) { Preconditions.GreaterThan(channelId, 0, nameof(channelId)); @@ -1115,8 +1128,9 @@ public async Task RemoveGroupRecipientAsync(ulong channelId, ulong userId, Reque var ids = new BucketIds(channelId: channelId); await SendAsync("DELETE", () => $"channels/{channelId}/recipients/{userId}", ids, options: options).ConfigureAwait(false); } + #endregion - //Interactions + #region Interactions public async Task GetGlobalApplicationCommandsAsync(RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); @@ -1252,8 +1266,9 @@ public async Task BulkOverwriteGuildApplicationCommands(ul return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); } + #endregion - //Interaction Responses + #region Interaction Responses public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { if(response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) @@ -1322,8 +1337,9 @@ public async Task DeleteInteractionFollowupMessage(ulong id, string token, Reque await SendAsync("DELETE", () => $"webhooks/{CurrentUserId}/{token}/messages/{id}", new BucketIds(), options: options).ConfigureAwait(false); } + #endregion - // Application Command permissions + #region Application Command permissions public async Task GetGuildApplicationCommandPermissions(ulong guildId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1362,8 +1378,9 @@ public async Task> BatchM return await SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); } + #endregion - //Guilds + #region Guilds public async Task GetGuildAsync(ulong guildId, bool withCounts, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1436,8 +1453,9 @@ public async Task GetGuildPruneCountAsync(ulong guil var ids = new BucketIds(guildId: guildId); return await SendAsync("GET", () => $"guilds/{guildId}/prune?days={args.Days}{endpointRoleIds}", ids, options: options).ConfigureAwait(false); } + #endregion - //Guild Bans + #region Guild Bans public async Task> GetGuildBansAsync(ulong guildId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1488,8 +1506,9 @@ public async Task RemoveGuildBanAsync(ulong guildId, ulong userId, RequestOption var ids = new BucketIds(guildId: guildId); await SendAsync("DELETE", () => $"guilds/{guildId}/bans/{userId}", ids, options: options).ConfigureAwait(false); } + #endregion - //Guild Widget + #region Guild Widget /// must not be equal to zero. public async Task GetGuildWidgetAsync(ulong guildId, RequestOptions options = null) { @@ -1514,8 +1533,9 @@ public async Task ModifyGuildWidgetAsync(ulong guildId, Rest.Modify var ids = new BucketIds(guildId: guildId); return await SendJsonAsync("PATCH", () => $"guilds/{guildId}/widget", args, ids, options: options).ConfigureAwait(false); } + #endregion - //Guild Integrations + #region Guild Integrations /// must not be equal to zero. public async Task> GetGuildIntegrationsAsync(ulong guildId, RequestOptions options = null) { @@ -1567,8 +1587,9 @@ public async Task SyncGuildIntegrationAsync(ulong guildId, ulong in var ids = new BucketIds(guildId: guildId); return await SendAsync("POST", () => $"guilds/{guildId}/integrations/{integrationId}/sync", ids, options: options).ConfigureAwait(false); } + #endregion - //Guild Invites + #region Guild Invites /// cannot be blank. /// must not be . public async Task GetInviteAsync(string inviteId, RequestOptions options = null) @@ -1651,8 +1672,9 @@ public async Task DeleteInviteAsync(string inviteId, RequestOptions opti return await SendAsync("DELETE", () => $"invites/{inviteId}", new BucketIds(), options: options).ConfigureAwait(false); } + #endregion - //Guild Members + #region Guild Members public async Task AddGuildMemberAsync(ulong guildId, ulong userId, AddGuildMemberParams args, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1750,8 +1772,9 @@ public async Task> SearchGuildMembersAsync(ulon Expression> endpoint = () => $"guilds/{guildId}/members/search?limit={limit}&query={query}"; return await SendAsync>("GET", endpoint, ids, options: options).ConfigureAwait(false); } + #endregion - //Guild Roles + #region Guild Roles public async Task> GetGuildRolesAsync(ulong guildId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1798,8 +1821,9 @@ public async Task> ModifyGuildRolesAsync(ulong guildId var ids = new BucketIds(guildId: guildId); return await SendJsonAsync>("PATCH", () => $"guilds/{guildId}/roles", args, ids, options: options).ConfigureAwait(false); } + #endregion - //Guild emoji + #region Guild emoji public async Task> GetGuildEmotesAsync(ulong guildId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1851,8 +1875,9 @@ public async Task DeleteGuildEmoteAsync(ulong guildId, ulong emoteId, RequestOpt var ids = new BucketIds(guildId: guildId); await SendAsync("DELETE", () => $"guilds/{guildId}/emojis/{emoteId}", ids, options: options).ConfigureAwait(false); } + #endregion - //Users + #region Users public async Task GetUserAsync(ulong userId, RequestOptions options = null) { Preconditions.NotEqual(userId, 0, nameof(userId)); @@ -1864,8 +1889,9 @@ public async Task GetUserAsync(ulong userId, RequestOptions options = null } catch (HttpException ex) when (ex.HttpCode == HttpStatusCode.NotFound) { return null; } } + #endregion - //Current User/DMs + #region Current User/DMs public async Task GetMyUserAsync(RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); @@ -1924,8 +1950,9 @@ public async Task CreateDMChannelAsync(CreateDMChannelParams args, Requ return await SendJsonAsync("POST", () => "users/@me/channels", args, new BucketIds(), options: options).ConfigureAwait(false); } + #endregion - //Voice Regions + #region Voice Regions public async Task> GetVoiceRegionsAsync(RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); @@ -1939,8 +1966,9 @@ public async Task> GetGuildVoiceRegionsAsync(ul var ids = new BucketIds(guildId: guildId); return await SendAsync>("GET", () => $"guilds/{guildId}/regions", ids, options: options).ConfigureAwait(false); } + #endregion - //Audit logs + #region Audit logs public async Task GetAuditLogsAsync(ulong guildId, GetAuditLogsParams args, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1969,12 +1997,13 @@ public async Task GetAuditLogsAsync(ulong guildId, GetAuditLogsParams .Append(args.ActionType.Value); } - // still use string interp for the query w/o params, as this is necessary for CreateBucketId + // Still use string interp for the query w/o params, as this is necessary for CreateBucketId endpoint = () => $"guilds/{guildId}/audit-logs?limit={limit}{queryArgs.ToString()}"; return await SendAsync("GET", endpoint, ids, options: options).ConfigureAwait(false); } + #endregion - //Webhooks + #region Webhooks public async Task CreateWebhookAsync(ulong channelId, CreateWebhookParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -2037,8 +2066,9 @@ public async Task> GetChannelWebhooksAsync(ulong ch var ids = new BucketIds(channelId: channelId); return await SendAsync>("GET", () => $"channels/{channelId}/webhooks", ids, options: options).ConfigureAwait(false); } + #endregion - //Helpers + #region Helpers /// Client is not logged in. protected void CheckState() { @@ -2248,5 +2278,6 @@ private static string GetFieldName(Expression expr) return (expr as MemberExpression).Member.Name; } + #endregion } } diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 10a4c40a9c..8254eabe99 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -12,6 +12,7 @@ namespace Discord.Rest /// public class DiscordRestClient : BaseDiscordClient, IDiscordClient { + #region DiscordRestClient private RestApplication _applicationInfo; /// @@ -138,7 +139,9 @@ public Task RemoveAllReactionsAsync(ulong channelId, ulong messageId, RequestOpt => MessageHelper.RemoveAllReactionsAsync(channelId, messageId, this, options); public Task RemoveAllReactionsForEmoteAsync(ulong channelId, ulong messageId, IEmote emote, RequestOptions options = null) => MessageHelper.RemoveAllReactionsForEmoteAsync(channelId, messageId, emote, this, options); - //IDiscordClient +#endregion + + #region IDiscordClient /// async Task IDiscordClient.GetApplicationInfoAsync(RequestOptions options) => await GetApplicationInfoAsync(options).ConfigureAwait(false); @@ -229,5 +232,6 @@ async Task> IDiscordClient.GetGlobalApp /// async Task IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) => await ClientHelper.GetGlobalApplicationCommand(this, id, options).ConfigureAwait(false); + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 73f59b5666..1fb4b774ae 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -14,7 +14,7 @@ namespace Discord.Rest { internal static class GuildHelper { - //General + #region General /// is null. public static async Task ModifyAsync(IGuild guild, BaseDiscordClient client, Action func, RequestOptions options) @@ -123,8 +123,9 @@ public static async Task DeleteAsync(IGuild guild, BaseDiscordClient client, { await client.ApiClient.DeleteGuildAsync(guild.Id, options).ConfigureAwait(false); } + #endregion - //Bans + #region Bans public static async Task> GetBansAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) { @@ -148,8 +149,9 @@ public static async Task RemoveBanAsync(IGuild guild, BaseDiscordClient client, { await client.ApiClient.RemoveGuildBanAsync(guild.Id, userId, options).ConfigureAwait(false); } + #endregion - //Channels + #region Channels public static async Task GetChannelAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) { @@ -275,16 +277,18 @@ public static async Task CreateCategoryChannelAsync(IGuild var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); return RestCategoryChannel.Create(client, guild, model); } + #endregion - //Voice Regions + #region Voice Regions public static async Task> GetVoiceRegionsAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) { var models = await client.ApiClient.GetGuildVoiceRegionsAsync(guild.Id, options).ConfigureAwait(false); return models.Select(x => RestVoiceRegion.Create(client, x)).ToImmutableArray(); } + #endregion - //Integrations + #region Integrations public static async Task> GetIntegrationsAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) { @@ -298,8 +302,9 @@ public static async Task CreateIntegrationAsync(IGuild gui var model = await client.ApiClient.CreateGuildIntegrationAsync(guild.Id, args, options).ConfigureAwait(false); return RestGuildIntegration.Create(client, guild, model); } + #endregion - //Interactions + #region Interactions public static async Task> GetSlashCommandsAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) { @@ -312,8 +317,9 @@ public static async Task GetSlashCommandAsync(IGuild guild, ul var model = await client.ApiClient.GetGuildApplicationCommandAsync(guild.Id, id, options); return RestGuildCommand.Create(client, model, guild.Id); } + #endregion - //Invites + #region Invites public static async Task> GetInvitesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) { @@ -329,8 +335,9 @@ public static async Task GetVanityInviteAsync(IGuild guild, inviteModel.Uses = vanityModel.Uses; return RestInviteMetadata.Create(client, guild, null, inviteModel); } + #endregion - //Roles + #region Roles /// is null. public static async Task CreateRoleAsync(IGuild guild, BaseDiscordClient client, string name, GuildPermissions? permissions, Color? color, bool isHoisted, bool isMentionable, RequestOptions options) @@ -350,8 +357,9 @@ public static async Task CreateRoleAsync(IGuild guild, BaseDiscordClie return RestRole.Create(client, guild, model); } + #endregion - //Users + #region Users public static async Task AddGuildUserAsync(IGuild guild, BaseDiscordClient client, ulong userId, string accessToken, Action func, RequestOptions options) { @@ -470,8 +478,9 @@ public static async Task> SearchUsersAsync(IG var models = await client.ApiClient.SearchGuildMembersAsync(guild.Id, apiArgs, options).ConfigureAwait(false); return models.Select(x => RestGuildUser.Create(client, guild, x)).ToImmutableArray(); } + #endregion - // Audit logs + #region Audit logs public static IAsyncEnumerable> GetAuditLogsAsync(IGuild guild, BaseDiscordClient client, ulong? from, int? limit, RequestOptions options, ulong? userId = null, ActionType? actionType = null) { @@ -503,8 +512,9 @@ public static IAsyncEnumerable> GetAuditL count: limit ); } + #endregion - //Webhooks + #region Webhooks public static async Task GetWebhookAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) { var model = await client.ApiClient.GetWebhookAsync(id, options: options).ConfigureAwait(false); @@ -517,8 +527,9 @@ public static async Task> GetWebhooksAsync(IGui var models = await client.ApiClient.GetGuildWebhooksAsync(guild.Id, options).ConfigureAwait(false); return models.Select(x => RestWebhook.Create(client, guild, x)).ToImmutableArray(); } + #endregion - //Emotes + #region Emotes public static async Task> GetEmotesAsync(IGuild guild, BaseDiscordClient client, RequestOptions options) { var models = await client.ApiClient.GetGuildEmotesAsync(guild.Id, options).ConfigureAwait(false); @@ -637,5 +648,6 @@ public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulon public static async Task DeleteStickerAsync(BaseDiscordClient client, ulong guildId, ISticker sticker, RequestOptions options = null) => await client.ApiClient.DeleteStickerAsync(guildId, sticker.Id, options).ConfigureAwait(false); + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index d566afc814..a313de8107 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -18,6 +18,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestGuild : RestEntity, IGuild, IUpdateable { + #region RestGuild private ImmutableDictionary _roles; private ImmutableArray _emotes; private ImmutableArray _stickers; @@ -217,8 +218,9 @@ internal void Update(WidgetModel model) WidgetChannelId = model.ChannelId; IsWidgetEnabled = model.Enabled; } + #endregion - //General + #region General /// public async Task UpdateAsync(RequestOptions options = null) => Update(await Discord.ApiClient.GetGuildAsync(Id, false, options).ConfigureAwait(false)); @@ -277,8 +279,9 @@ public async Task ReorderRolesAsync(IEnumerable args, Req /// public Task LeaveAsync(RequestOptions options = null) => GuildHelper.LeaveAsync(this, Discord, options); + #endregion - //Interactions + #region Interactions /// /// Deletes all slash commands in the current guild. /// @@ -311,8 +314,9 @@ public Task> GetSlashCommandsAsync(Request /// public Task GetSlashCommandAsync(ulong id, RequestOptions options = null) => GuildHelper.GetSlashCommandAsync(this, id, Discord, options); + #endregion - //Bans + #region Bans /// /// Gets a collection of all users banned in this guild. /// @@ -360,8 +364,9 @@ public Task RemoveBanAsync(IUser user, RequestOptions options = null) /// public Task RemoveBanAsync(ulong userId, RequestOptions options = null) => GuildHelper.RemoveBanAsync(this, Discord, userId, options); + #endregion - //Channels + #region Channels /// /// Gets a collection of all channels in this guild. /// @@ -697,14 +702,16 @@ public Task CreateCategoryChannelAsync(string name, Action< /// public Task> GetVoiceRegionsAsync(RequestOptions options = null) => GuildHelper.GetVoiceRegionsAsync(this, Discord, options); + #endregion - //Integrations + #region Integrations public Task> GetIntegrationsAsync(RequestOptions options = null) => GuildHelper.GetIntegrationsAsync(this, Discord, options); public Task CreateIntegrationAsync(ulong id, string type, RequestOptions options = null) => GuildHelper.CreateIntegrationAsync(this, Discord, id, type, options); + #endregion - //Invites + #region Invites /// /// Gets a collection of all invites in this guild. /// @@ -724,8 +731,9 @@ public Task> GetInvitesAsync(RequestOpti /// public Task GetVanityInviteAsync(RequestOptions options = null) => GuildHelper.GetVanityInviteAsync(this, Discord, options); + #endregion - //Roles + #region Roles /// /// Gets a role in this guild. /// @@ -765,8 +773,9 @@ public RestRole GetRole(ulong id) _roles = _roles.Add(role.Id, role); return role; } + #endregion - //Users + #region Users /// /// Gets a collection of all users in this guild. /// @@ -860,8 +869,9 @@ public Task PruneUsersAsync(int days = 30, bool simulate = false, RequestOp /// public Task> SearchUsersAsync(string query, int limit = DiscordConfig.MaxUsersPerBatch, RequestOptions options = null) => GuildHelper.SearchUsersAsync(this, Discord, query, limit, options); + #endregion - //Audit logs + #region Audit logs /// /// Gets the specified number of audit log entries for this guild. /// @@ -876,8 +886,9 @@ public Task> SearchUsersAsync(string query, i /// public IAsyncEnumerable> GetAuditLogsAsync(int limit, RequestOptions options = null, ulong? beforeId = null, ulong? userId = null, ActionType? actionType = null) => GuildHelper.GetAuditLogsAsync(this, Discord, beforeId, limit, options, userId: userId, actionType: actionType); + #endregion - //Webhooks + #region Webhooks /// /// Gets a webhook found within this guild. /// @@ -900,8 +911,9 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null /// public Task> GetWebhooksAsync(RequestOptions options = null) => GuildHelper.GetWebhooksAsync(this, Discord, options); + #endregion - //Interactions + #region Interactions /// /// Gets this guilds slash commands commands /// @@ -961,6 +973,7 @@ public async Task> BulkOverwriteApplicatio /// public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id})"; + #endregion #region Emotes /// diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 8bc87339eb..7a4b49166d 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -11,6 +11,7 @@ namespace Discord.Rest { internal static class InteractionHelper { + #region InteractionHelper public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) { return client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, new CreateApplicationCommandParams[0], options); @@ -42,8 +43,9 @@ public static async Task SendFollowupAsync(BaseDiscordClien RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); return entity; } +#endregion - // Global commands + #region Global commands public static async Task GetGlobalCommandAsync(BaseDiscordClient client, ulong id, RequestOptions options = null) { @@ -236,8 +238,9 @@ public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicat await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); } + #endregion - // Guild Commands + #region Guild Commands public static Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options) where TArg : ApplicationCommandProperties { @@ -324,8 +327,9 @@ public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulo return DeleteGlobalCommand(client, command, options); } } + #endregion - // Responses + #region Responses public static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, RequestOptions options = null) { @@ -412,8 +416,9 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); + #endregion - // Guild permissions + #region Guild permissions public static async Task> GetGuildCommandPermissionsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options) { @@ -506,5 +511,6 @@ public static async Task> x => new GuildApplicationCommandPermission(x.Id, x.ApplicationId, x.GuildId, x.Permissions.Select( y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)).ToArray())).ToArray(); } + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index b135ae578d..78f9c0e302 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -13,6 +13,7 @@ namespace Discord.Rest /// public class RestApplicationCommandOption : IApplicationCommandOption { + #region RestApplicationCommandOption /// public ApplicationCommandOptionType Type { get; private set; } @@ -67,11 +68,13 @@ internal void Update(Model model) ? model.Choices.Value.Select(x => new RestApplicationCommandChoice(x)).ToImmutableArray() : null; } + #endregion - //IApplicationCommandOption + #region IApplicationCommandOption IReadOnlyCollection IApplicationCommandOption.Options => Options; IReadOnlyCollection IApplicationCommandOption.Choices => Choices; + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index aa33ae7e54..03e954f470 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -11,6 +11,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestRole : RestEntity, IRole { + #region RestRole internal IGuild Guild { get; } /// public Color Color { get; private set; } @@ -64,7 +65,7 @@ internal void Update(Model model) /// public async Task ModifyAsync(Action func, RequestOptions options = null) - { + { var model = await RoleHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false); Update(model); } @@ -83,8 +84,9 @@ public Task DeleteAsync(RequestOptions options = null) /// public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id})"; + #endregion - //IRole + #region IRole /// IGuild IRole.Guild { diff --git a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs index 73ab7ca31c..8d525d4c3f 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs @@ -7,7 +7,7 @@ namespace Discord.Rest { internal static class RoleHelper { - //General + #region General public static async Task DeleteAsync(IRole role, BaseDiscordClient client, RequestOptions options) { @@ -36,5 +36,6 @@ public static async Task ModifyAsync(IRole role, BaseDiscordClient client } return model; } + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index 9ad36a0740..556e5e1249 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -14,6 +14,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestGuildUser : RestUser, IGuildUser { + #region RestGuildUser private long? _premiumSinceTicks; private long? _joinedAtTicks; private ImmutableArray _roleIds; @@ -155,8 +156,9 @@ public ChannelPermissions GetPermissions(IGuildChannel channel) var guildPerms = GuildPermissions; return new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, guildPerms.RawValue)); } +#endregion - //IGuildUser + #region IGuildUser /// IGuild IGuildUser.Guild { @@ -167,8 +169,9 @@ IGuild IGuildUser.Guild throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); } } + #endregion - //IVoiceState + #region IVoiceState /// bool IVoiceState.IsSelfDeafened => false; /// @@ -183,5 +186,6 @@ IGuild IGuildUser.Guild bool IVoiceState.IsStreaming => false; /// DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs index 618804fefc..7304f5f394 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs @@ -13,6 +13,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestUser : RestEntity, IUser, IUpdateable { + #region RestUser /// public bool IsBot { get; private set; } /// @@ -116,10 +117,12 @@ public string GetDefaultAvatarUrl() /// public override string ToString() => $"{Username}#{Discriminator}"; private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")})"; + #endregion - //IUser + #region IUser /// async Task IUser.CreateDMChannelAsync(RequestOptions options) => await CreateDMChannelAsync(options).ConfigureAwait(false); + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs index 40a173976c..561cd92eea 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs @@ -10,6 +10,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestWebhookUser : RestUser, IWebhookUser { + #region RestWebhookUser /// public ulong WebhookId { get; } internal IGuild Guild { get; } @@ -33,8 +34,9 @@ internal static RestWebhookUser Create(BaseDiscordClient discord, IGuild guild, entity.Update(model); return entity; } +#endregion - //IGuildUser + #region IGuildUser /// IGuild IGuildUser.Guild { @@ -91,8 +93,9 @@ Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions option /// Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); + #endregion - //IVoiceState + #region IVoiceState /// bool IVoiceState.IsDeafened => false; /// @@ -111,5 +114,6 @@ Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions option bool IVoiceState.IsStreaming => false; /// DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs index 5ae09fde0b..f40b786cda 100644 --- a/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs +++ b/src/Discord.Net.Rest/Entities/Webhooks/RestWebhook.cs @@ -8,6 +8,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestWebhook : RestEntity, IWebhook, IUpdateable { + #region RestWebhook internal IGuild Guild { get; private set; } internal ITextChannel Channel { get; private set; } @@ -95,8 +96,9 @@ public Task DeleteAsync(RequestOptions options = null) public override string ToString() => $"Webhook: {Name}:{Id}"; private string DebuggerDisplay => $"Webhook: {Name} ({Id})"; + #endregion - //IWebhook + #region IWebhook /// IGuild IWebhook.Guild => Guild ?? throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); @@ -106,5 +108,6 @@ ITextChannel IWebhook.Channel /// Task IWebhook.ModifyAsync(Action func, RequestOptions options) => ModifyAsync(func, options); + #endregion } } diff --git a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs index 5981a266e0..feea164f9f 100644 --- a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs +++ b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs @@ -10,6 +10,7 @@ namespace Discord.Net.Converters { internal class DiscordContractResolver : DefaultContractResolver { + #region DiscordContractResolver private static readonly TypeInfo _ienumerable = typeof(IEnumerable).GetTypeInfo(); private static readonly MethodInfo _shouldSerialize = typeof(DiscordContractResolver).GetTypeInfo().GetDeclaredMethod("ShouldSerialize"); @@ -57,8 +58,9 @@ private static JsonConverter GetConverter(JsonProperty property, PropertyInfo pr else if (genericType == typeof(EntityOrId<>)) return MakeGenericConverter(property, propInfo, typeof(UInt64EntityOrIdConverter<>), type.GenericTypeArguments[0], depth); } +#endregion - //Primitives + #region Primitives bool hasInt53 = propInfo.GetCustomAttribute() != null; if (!hasInt53) { @@ -107,5 +109,6 @@ private static JsonConverter MakeGenericConverter(JsonProperty property, Propert var innerConverter = GetConverter(property, propInfo, innerType, depth + 1); return genericType.DeclaredConstructors.First().Invoke(new object[] { innerConverter }) as JsonConverter; } + #endregion } } From e1abc1bca12ceb0b8f22f50ebbb2ba935d2f8166 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 13:48:25 -0300 Subject: [PATCH 255/494] Update ratelimits.md --- docs/guides/concepts/ratelimits.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/concepts/ratelimits.md b/docs/guides/concepts/ratelimits.md index 3565f13704..afeb5f7956 100644 --- a/docs/guides/concepts/ratelimits.md +++ b/docs/guides/concepts/ratelimits.md @@ -1,6 +1,6 @@ # Ratelimits -Ratelimits are a core concept of the discord api, each verified library must follow the ratelimit guidelines. Labs introduces a ratelimit exposure system to help you follow these ratelimits in your own code. +Ratelimits are a core concept of any API - Discords API is no exception. each verified library must follow the ratelimit guidelines. ### Using the ratelimit callback From dcf9aa0c964f9e5d3266552044327ad6bbfcd226 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 13:50:04 -0300 Subject: [PATCH 256/494] Remove reference to labs --- .../interactions/application-commands/01-getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/interactions/application-commands/01-getting-started.md b/docs/guides/interactions/application-commands/01-getting-started.md index 20201f46c4..70d0bd6f75 100644 --- a/docs/guides/interactions/application-commands/01-getting-started.md +++ b/docs/guides/interactions/application-commands/01-getting-started.md @@ -1,6 +1,6 @@ # Getting started with application commands. -Welcome! This guide will show you how to use application commands. If you have extra questions that aren't covered here you can come to our [Discord](https://discord.com/invite/dvSfUTet3K) server and ask around there. +Welcome! This guide will show you how to use application commands. ## What is an application command? From 9ade7e58336292f0babe0cf3dc9e674181434a1a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 13:57:21 -0300 Subject: [PATCH 257/494] Add missing endregion --- src/Discord.Net.Core/Discord.Net.Core.xml | 55 ++++++++++++++----- src/Discord.Net.Rest/Discord.Net.Rest.xml | 15 +++++ .../Entities/Roles/RestRole.cs | 1 + .../Discord.Net.WebSocket.xml | 15 +++++ 4 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 220f3fae4b..107895dfbd 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3747,6 +3747,13 @@ The options to be used when sending the request. A guild user associated with the specified ; if the user is already in the guild. + + + Disconnects the user from its current voice channel + + The user to disconnect. + A task that represents the asynchronous operation for disconnecting a user. + Gets a collection of all users in this guild. @@ -3936,6 +3943,14 @@ emote. + + + Moves the user to the voice channel. + + The user to move. + the channel where the user gets moved to. + A task that represents the asynchronous operation for moving a user. + Deletes an existing from this guild. @@ -4992,6 +5007,16 @@ ACK a Ping. + + + ACK a command without sending a message, eating the user's input. + + + + + Respond with a message, showing the user's input. + + Respond to an interaction with a message. @@ -5129,11 +5154,6 @@ Represents a builder for creating a . - - - The max length of a . - - The max length of a . @@ -5266,7 +5286,7 @@ Represents a class used to build 's. - + The max length of a . @@ -5275,13 +5295,15 @@ Gets or sets the label of the current button. - length exceeds . + length exceeds . + length exceeds . Gets or sets the custom id of the current button. length exceeds + length subceeds 1. @@ -5448,13 +5470,15 @@ Gets or sets the custom id of the current select menu. - length exceeds . + length exceeds + length subceeds 1. Gets or sets the placeholder text of the current select menu. length exceeds . + length subceeds 1. @@ -5595,7 +5619,7 @@ Represents a class used to build 's. - + The maximum length of a . @@ -5605,9 +5629,9 @@ The maximum length of a . - + - The maximum length of a . + The maximum length of a . @@ -5615,18 +5639,21 @@ Gets or sets the label of the current select menu. length exceeds + length subceeds 1. Gets or sets the custom id of the current select menu. - length exceeds . + length exceeds . + length subceeds 1. Gets or sets this menu options description. length exceeds . + length subceeds 1. @@ -11200,8 +11227,8 @@ - This intent includes all but and - that are privileged must be enabled for the application. + This intent includes all but and + which are privileged and must be enabled in the Developer Portal. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index f7d0a8ab37..ec25845809 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3620,6 +3620,14 @@ is . + + + Moves the user to the voice channel. + + The user to move. + the channel where the user gets moved to. + A task that represents the asynchronous operation for moving a user. + @@ -3805,6 +3813,13 @@ + + + Disconnects the user from its current voice channel + + The user to disconnect. + A task that represents the asynchronous operation for disconnecting a user. + diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index 03e954f470..3b6d8d3f7f 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -97,5 +97,6 @@ IGuild IRole.Guild throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); } } + #endregion } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 3596bdb4b9..61b96e0c97 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3575,6 +3575,21 @@ + + + Moves the user to the voice channel. + + The user to move. + the channel where the user gets moved to. + A task that represents the asynchronous operation for moving a user. + + + + Disconnects the user from its current voice channel + + The user to disconnect. + A task that represents the asynchronous operation for disconnecting a user. + Gets a specific sticker within this guild. From a98417e177c190b89690b3527a2eace38f643bec Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 14:23:23 -0300 Subject: [PATCH 258/494] Update Discord.Net.Commands.xml --- src/Discord.Net.Commands/Discord.Net.Commands.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml index 7da918622b..e44d712293 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ b/src/Discord.Net.Commands/Discord.Net.Commands.xml @@ -1129,7 +1129,7 @@ - + Sends a message to the source channel. @@ -1143,6 +1143,8 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. + The message components to be included with this message. Used for interactions + A collection of stickers to send with the file. From bbf9a7af0fc9464d20efaf77b84184c4b414ea09 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 14:32:57 -0300 Subject: [PATCH 259/494] deprecated always ack, fixed methods naming conventions to use async --- src/Discord.Net.Core/Discord.Net.Core.xml | 51 ++++++++++++++----- src/Discord.Net.Rest/Discord.Net.Rest.xml | 15 ++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 46 ++++++++--------- .../Interactions/InteractionHelper.cs | 30 +++++------ .../Entities/Roles/RestRole.cs | 2 + .../Discord.Net.WebSocket.xml | 40 ++++++--------- .../DiscordSocketClient.cs | 6 --- .../DiscordSocketConfig.cs | 23 --------- .../SocketMessageComponent.cs | 10 +--- .../SocketBaseCommand/SocketCommandBase.cs | 8 +-- 10 files changed, 113 insertions(+), 118 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 220f3fae4b..38b0fa3107 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3747,6 +3747,13 @@ The options to be used when sending the request. A guild user associated with the specified ; if the user is already in the guild. + + + Disconnects the user from its current voice channel + + The user to disconnect. + A task that represents the asynchronous operation for disconnecting a user. + Gets a collection of all users in this guild. @@ -3936,6 +3943,14 @@ emote. + + + Moves the user to the voice channel. + + The user to move. + the channel where the user gets moved to. + A task that represents the asynchronous operation for moving a user. + Deletes an existing from this guild. @@ -4992,6 +5007,16 @@ ACK a Ping. + + + ACK a command without sending a message, eating the user's input. + + + + + Respond with a message, showing the user's input. + + Respond to an interaction with a message. @@ -5129,11 +5154,6 @@ Represents a builder for creating a . - - - The max length of a . - - The max length of a . @@ -5266,7 +5286,7 @@ Represents a class used to build 's. - + The max length of a . @@ -5275,13 +5295,15 @@ Gets or sets the label of the current button. - length exceeds . + length exceeds . + length exceeds . Gets or sets the custom id of the current button. length exceeds + length subceeds 1. @@ -5448,13 +5470,15 @@ Gets or sets the custom id of the current select menu. - length exceeds . + length exceeds + length subceeds 1. Gets or sets the placeholder text of the current select menu. length exceeds . + length subceeds 1. @@ -5595,7 +5619,7 @@ Represents a class used to build 's. - + The maximum length of a . @@ -5605,9 +5629,9 @@ The maximum length of a . - + - The maximum length of a . + The maximum length of a . @@ -5615,18 +5639,21 @@ Gets or sets the label of the current select menu. length exceeds + length subceeds 1. Gets or sets the custom id of the current select menu. - length exceeds . + length exceeds . + length subceeds 1. Gets or sets this menu options description. length exceeds . + length subceeds 1. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 43c2a05bc8..6e6b76d217 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3617,6 +3617,14 @@ is . + + + Moves the user to the voice channel. + + The user to move. + the channel where the user gets moved to. + A task that represents the asynchronous operation for moving a user. + @@ -3802,6 +3810,13 @@ + + + Disconnects the user from its current voice channel + + The user to disconnect. + A task that represents the asynchronous operation for disconnecting a user. + diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 0db6985b0d..f132cb7a41 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -897,7 +897,7 @@ public async Task ModifyMessageAsync(ulong channelId, ulong messageId, } #endregion - #region Stickers + #region Stickers, Reactions, Crosspost, and Acks public async Task GetStickerAsync(ulong id, RequestOptions options = null) { Preconditions.NotEqual(id, 0, nameof(id)); @@ -1166,25 +1166,25 @@ public async Task CreateGlobalApplicationCommandAsync(Create options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) { @@ -1193,11 +1193,11 @@ public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOp await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/commands/{commandId}", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task BulkOverwriteGlobalApplicationCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) + public async Task BulkOverwriteGlobalApplicationCommandsAsync(CreateApplicationCommandParams[] commands, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task GetGuildApplicationCommandsAsync(ulong guildId, RequestOptions options = null) @@ -1239,7 +1239,7 @@ public async Task CreateGuildApplicationCommandAsync(CreateA var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommand(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); } public async Task ModifyGuildApplicationCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1247,7 +1247,7 @@ public async Task ModifyGuildApplicationCommandAsync(ModifyA var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommand(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1258,18 +1258,18 @@ public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong comman await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options).ConfigureAwait(false); } - public async Task BulkOverwriteGuildApplicationCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) + public async Task BulkOverwriteGuildApplicationCommandsAsync(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommand(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); } #endregion #region Interaction Responses - public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) + public async Task CreateInteractionResponseAsync(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { if(response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) Preconditions.AtMost(response.Data.Value.Content.Value?.Length ?? 0, 2000, nameof(response.Data.Value.Content)); @@ -1278,7 +1278,7 @@ public async Task CreateInteractionResponse(InteractionResponse response, ulong await SendJsonAsync("POST", () => $"interactions/{interactionId}/{interactionToken}/callback", response, new BucketIds(), options: options); } - public async Task GetInteractionResponse(string interactionToken, RequestOptions options = null) + public async Task GetInteractionResponseAsync(string interactionToken, RequestOptions options = null) { Preconditions.NotNullOrEmpty(interactionToken, nameof(interactionToken)); @@ -1286,20 +1286,20 @@ public async Task GetInteractionResponse(string interactionToken, Reque return await SendAsync("GET", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyInteractionResponse(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) + public async Task ModifyInteractionResponseAsync(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); return await SendJsonAsync("PATCH", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, new BucketIds(), options: options); } - public async Task DeleteInteractionResponse(string interactionToken, RequestOptions options = null) + public async Task DeleteInteractionResponseAsync(string interactionToken, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); await SendAsync("DELETE", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options); } - public async Task CreateInteractionFollowupMessage(CreateWebhookMessageParams args, string token, RequestOptions options = null) + public async Task CreateInteractionFollowupMessageAsync(CreateWebhookMessageParams args, string token, RequestOptions options = null) { if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) && !args.File.IsSpecified) Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content)); @@ -1315,7 +1315,7 @@ public async Task CreateInteractionFollowupMessage(CreateWebhookMessage return await SendMultipartAsync("POST", () => $"webhooks/{CurrentUserId}/{token}?wait=true", args.ToDictionary(), new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyInteractionFollowupMessage(ModifyInteractionResponseParams args, ulong id, string token, RequestOptions options = null) + public async Task ModifyInteractionFollowupMessageAsync(ModifyInteractionResponseParams args, ulong id, string token, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(id, 0, nameof(id)); @@ -1329,7 +1329,7 @@ public async Task ModifyInteractionFollowupMessage(ModifyInteractionRes return await SendJsonAsync("PATCH", () => $"webhooks/{CurrentUserId}/{token}/messages/{id}", args, new BucketIds(), options: options).ConfigureAwait(false); } - public async Task DeleteInteractionFollowupMessage(ulong id, string token, RequestOptions options = null) + public async Task DeleteInteractionFollowupMessageAsync(ulong id, string token, RequestOptions options = null) { Preconditions.NotEqual(id, 0, nameof(id)); @@ -1340,7 +1340,7 @@ public async Task DeleteInteractionFollowupMessage(ulong id, string token, Reque #endregion #region Application Command permissions - public async Task GetGuildApplicationCommandPermissions(ulong guildId, RequestOptions options = null) + public async Task GetGuildApplicationCommandPermissionsAsync(ulong guildId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -1349,7 +1349,7 @@ public async Task GetGuildApplicationComman return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task GetGuildApplicationCommandPermission(ulong guildId, ulong commandId, RequestOptions options = null) + public async Task GetGuildApplicationCommandPermissionAsync(ulong guildId, ulong commandId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); Preconditions.NotEqual(commandId, 0, nameof(commandId)); @@ -1359,7 +1359,7 @@ public async Task GetGuildApplicationCommandP return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", new BucketIds(), options: options).ConfigureAwait(false); } - public async Task ModifyApplicationCommandPermissions(ModifyGuildApplicationCommandPermissionsParams permissions, ulong guildId, ulong commandId, RequestOptions options = null) + public async Task ModifyApplicationCommandPermissionsAsync(ModifyGuildApplicationCommandPermissionsParams permissions, ulong guildId, ulong commandId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); Preconditions.NotEqual(commandId, 0, nameof(commandId)); @@ -1369,7 +1369,7 @@ public async Task ModifyApplicationCommandPer return await SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); } - public async Task> BatchModifyApplicationCommandPermissions(ModifyGuildApplicationCommandPermissions[] permissions, ulong guildId, RequestOptions options = null) + public async Task> BatchModifyApplicationCommandPermissionsAsync(ModifyGuildApplicationCommandPermissions[] permissions, ulong guildId, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); Preconditions.NotNull(permissions, nameof(permissions)); @@ -2091,7 +2091,7 @@ protected T DeserializeJson(Stream jsonStream) return _serializer.Deserialize(reader); } - protected async Task TrySendApplicationCommand(Task sendTask) + protected async Task TrySendApplicationCommandAsync(Task sendTask) { try { diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 7a4b49166d..e79cb6e2f2 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -14,31 +14,31 @@ internal static class InteractionHelper #region InteractionHelper public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) { - return client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, new CreateApplicationCommandParams[0], options); + return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, new CreateApplicationCommandParams[0], options); } public static Task DeleteAllGlobalCommandsAsync(BaseDiscordClient client, RequestOptions options = null) { - return client.ApiClient.BulkOverwriteGlobalApplicationCommands(new CreateApplicationCommandParams[0], options); + return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(new CreateApplicationCommandParams[0], options); } public static Task SendInteractionResponse(BaseDiscordClient client, InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { - return client.ApiClient.CreateInteractionResponse(response, interactionId, interactionToken, options); + return client.ApiClient.CreateInteractionResponseAsync(response, interactionId, interactionToken, options); } public static async Task GetOriginalResponseAsync(BaseDiscordClient client, IMessageChannel channel, IDiscordInteraction interaction, RequestOptions options = null) { - var model = await client.ApiClient.GetInteractionResponse(interaction.Token, options).ConfigureAwait(false); + var model = await client.ApiClient.GetInteractionResponseAsync(interaction.Token, options).ConfigureAwait(false); return RestInteractionMessage.Create(client, model, interaction.Token, channel); } public static async Task SendFollowupAsync(BaseDiscordClient client, CreateWebhookMessageParams args, string token, IMessageChannel channel, RequestOptions options = null) { - var model = await client.ApiClient.CreateInteractionFollowupMessage(args, token, options).ConfigureAwait(false); + var model = await client.ApiClient.CreateInteractionFollowupMessageAsync(args, token, options).ConfigureAwait(false); RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); return entity; @@ -123,7 +123,7 @@ public static async Task BulkOverwriteGlobalCommands(BaseD models.Add(model); } - return await client.ApiClient.BulkOverwriteGlobalApplicationCommands(models.ToArray(), options).ConfigureAwait(false); + return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false); } public static async Task> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, @@ -160,7 +160,7 @@ public static async Task> BulkOverwriteG models.Add(model); } - return await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options).ConfigureAwait(false); + return await client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, models.ToArray(), options).ConfigureAwait(false); } private static TArg GetApplicationCommandProperties(IApplicationCommand command) @@ -367,11 +367,11 @@ public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulo Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, }; - return await client.ApiClient.ModifyInteractionFollowupMessage(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); + return await client.ApiClient.ModifyInteractionFollowupMessageAsync(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); } public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) - => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); + => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); public static async Task ModifyInteractionResponse(BaseDiscordClient client, string token, Action func, RequestOptions options = null) @@ -411,18 +411,18 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl Flags = args.Flags }; - return await client.ApiClient.ModifyInteractionResponse(apiArgs, token, options).ConfigureAwait(false); + return await client.ApiClient.ModifyInteractionResponseAsync(apiArgs, token, options).ConfigureAwait(false); } public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) - => await client.ApiClient.DeleteInteractionFollowupMessage(message.Id, message.Token, options); + => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); #endregion #region Guild permissions public static async Task> GetGuildCommandPermissionsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options) { - var models = await client.ApiClient.GetGuildApplicationCommandPermissions(guildId, options); + var models = await client.ApiClient.GetGuildApplicationCommandPermissionsAsync(guildId, options); return models.Select(x => new GuildApplicationCommandPermission(x.Id, x.ApplicationId, guildId, x.Permissions.Select( y => new Discord.ApplicationCommandPermission(y.Id, y.Type, y.Permission)) @@ -435,7 +435,7 @@ public static async Task GetGuildCommandPermi { try { - var model = await client.ApiClient.GetGuildApplicationCommandPermission(guildId, commandId, options); + var model = await client.ApiClient.GetGuildApplicationCommandPermissionAsync(guildId, commandId, options); return new GuildApplicationCommandPermission(model.Id, model.ApplicationId, guildId, model.Permissions.Select( y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)).ToArray()); } @@ -473,7 +473,7 @@ public static async Task ModifyGuildCommandPe Permissions = permissionsList.ToArray() }; - var apiModel = await client.ApiClient.ModifyApplicationCommandPermissions(model, guildId, commandId, options); + var apiModel = await client.ApiClient.ModifyApplicationCommandPermissionsAsync(model, guildId, commandId, options); return new GuildApplicationCommandPermission(apiModel.Id, apiModel.ApplicationId, guildId, apiModel.Permissions.Select( x => new ApplicationCommandPermission(x.Id, x.Type, x.Permission)).ToArray()); @@ -505,7 +505,7 @@ public static async Task> models.Add(model); } - var apiModels = await client.ApiClient.BatchModifyApplicationCommandPermissions(models.ToArray(), guildId, options); + var apiModels = await client.ApiClient.BatchModifyApplicationCommandPermissionsAsync(models.ToArray(), guildId, options); return apiModels.Select( x => new GuildApplicationCommandPermission(x.Id, x.ApplicationId, x.GuildId, x.Permissions.Select( diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index 03e954f470..69a2abe20f 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -97,5 +97,7 @@ IGuild IRole.Guild throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); } } + + #endregion } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 610555b61e..dd0866f0cd 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1393,29 +1393,6 @@ - - - Gets or sets whether or not interactions are acknowledge with source. - - - - Discord interactions will not appear in chat until the client responds to them. With this option set to - , the client will automatically acknowledge the interaction with . - See the docs on - responding to interactions for more info. - - - With this option set to , you will have to acknowledge the interaction with - . - Only after the interaction is acknowledged, the original slash command message will be visible. - - - Please note that manually acknowledging the interaction with a message reply will not provide any return data. - Automatically acknowledging the interaction without sending the message will allow for follow up responses to - be used; follow up responses return the message data sent. - - - Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. @@ -3572,6 +3549,21 @@ + + + Moves the user to the voice channel. + + The user to move. + the channel where the user gets moved to. + A task that represents the asynchronous operation for moving a user. + + + + Disconnects the user from its current voice channel + + The user to disconnect. + A task that represents the asynchronous operation for disconnecting a user. + Gets a specific sticker within this guild. @@ -4189,7 +4181,7 @@ Responds to an Interaction with type . - If you have set to , You should use + If you have set to , You should use instead. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 007e9f68a4..2b9ac9ff86 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -72,8 +72,6 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient internal WebSocketProvider WebSocketProvider { get; private set; } internal bool AlwaysDownloadUsers { get; private set; } internal int? HandlerTimeout { get; private set; } - internal bool AlwaysAcknowledgeInteractions { get; private set; } - internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; /// public override IReadOnlyCollection Guilds => State.Guilds; @@ -143,7 +141,6 @@ private DiscordSocketClient(DiscordSocketConfig config, API.DiscordSocketApiClie UdpSocketProvider = config.UdpSocketProvider; WebSocketProvider = config.WebSocketProvider; AlwaysDownloadUsers = config.AlwaysDownloadUsers; - AlwaysAcknowledgeInteractions = config.AlwaysAcknowledgeInteractions; HandlerTimeout = config.HandlerTimeout; State = new ClientState(0, 0); Rest = new DiscordSocketRestClient(config, ApiClient); @@ -2095,9 +2092,6 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty var interaction = SocketInteraction.Create(this, data, channel as ISocketMessageChannel); - if (this.AlwaysAcknowledgeInteractions) - await interaction.DeferAsync().ConfigureAwait(false); - await TimedInvokeAsync(_interactionCreatedEvent, nameof(InteractionCreated), interaction).ConfigureAwait(false); switch (interaction) diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index 6ce9489f60..22a201c679 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -105,29 +105,6 @@ public class DiscordSocketConfig : DiscordRestConfig /// public bool AlwaysDownloadUsers { get; set; } = false; - /// - /// Gets or sets whether or not interactions are acknowledge with source. - /// - /// - /// - /// Discord interactions will not appear in chat until the client responds to them. With this option set to - /// , the client will automatically acknowledge the interaction with . - /// See the docs on - /// responding to interactions for more info. - /// - /// - /// With this option set to , you will have to acknowledge the interaction with - /// . - /// Only after the interaction is acknowledged, the original slash command message will be visible. - /// - /// - /// Please note that manually acknowledging the interaction with a message reply will not provide any return data. - /// Automatically acknowledging the interaction without sending the message will allow for follow up responses to - /// be used; follow up responses return the message data sent. - /// - /// - public bool AlwaysAcknowledgeInteractions { get; set; } = true; - /// /// Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. /// Setting this property to nulldisables this check. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 2a3ee4ba3d..5daffc2cda 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -86,12 +86,6 @@ public override async Task RespondAsync( if (embeds == null && embed != null) embeds = new[] { embed }; - if (Discord.AlwaysAcknowledgeInteractions) - { - await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options); - return; - } - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); @@ -341,7 +335,7 @@ public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = n }; - return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, this.Id, this.Token, options); } /// @@ -354,7 +348,7 @@ public override Task DeferAsync(bool ephemeral = false, RequestOptions options = }; - return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, this.Id, this.Token, options); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 4161a84737..c65048a34f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -70,12 +70,6 @@ public override async Task RespondAsync( if (embeds == null && embed != null) embeds = new[] { embed }; - if (Discord.AlwaysAcknowledgeInteractions) - { - await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component); - return; - } - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); @@ -244,7 +238,7 @@ public override Task DeferAsync(bool ephemeral = false, RequestOptions options = } }; - return Discord.Rest.ApiClient.CreateInteractionResponse(response, this.Id, this.Token, options); + return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, this.Id, this.Token, options); } } } From 4c2d684d845222a45af521b341ac5b4e68e20a44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Tue, 21 Sep 2021 19:38:22 +0200 Subject: [PATCH 260/494] Regions discord.net.websocket (#169) * BaseSocketClient * BaseSocketClient.Events * DiscordShardedClient * DiscordShardedClient.Events * DiscordVoiceAPIClient * SocketGroupUser * DiscordSocketApiClient * DiscordSocketClient * DiscordSocketClient.Events * -||- * SocketGuildUser * SocketWebhookUser * SocketCustomSticker * SocketRole * SocketMessage * SocketSlashCommandDataOption * SocketInteraction * SocketApplicationCommand * DiscordSocketClient * SocketApplicationCommand * SocketCategoryChannel * SocketChannel * SocketDMChannel * SocketGroupChannel * SocketGuildChannel * SocketTextChannel * SocketVoiceChannel * SocketGuild * ShardedCommandContext * SocketCommandContext --- .../BaseSocketClient.Events.cs | 41 ++++++++++++------- src/Discord.Net.WebSocket/BaseSocketClient.cs | 9 ++-- .../Commands/ShardedCommandContext.cs | 5 ++- .../Commands/SocketCommandContext.cs | 5 ++- .../DiscordShardedClient.Events.cs | 3 +- .../DiscordShardedClient.cs | 7 +++- .../DiscordSocketApiClient.cs | 3 +- .../DiscordSocketClient.Events.cs | 3 +- .../DiscordSocketClient.cs | 3 +- .../DiscordVoiceApiClient.cs | 17 +++++--- .../Channels/SocketCategoryChannel.cs | 11 +++-- .../Entities/Channels/SocketChannel.cs | 8 +++- .../Entities/Channels/SocketDMChannel.cs | 26 ++++++++---- .../Entities/Channels/SocketGroupChannel.cs | 29 +++++++++---- .../Entities/Channels/SocketGuildChannel.cs | 15 ++++--- .../Entities/Channels/SocketTextChannel.cs | 26 ++++++++---- .../Entities/Channels/SocketVoiceChannel.cs | 11 +++-- .../Entities/Guilds/SocketGuild.cs | 14 +++++-- .../SocketSlashCommandDataOption.cs | 8 +++- .../SocketApplicationCommand.cs | 5 ++- .../Entities/Interaction/SocketInteraction.cs | 6 ++- .../Entities/Messages/SocketMessage.cs | 5 ++- .../Entities/Roles/SocketRole.cs | 9 ++-- .../Entities/Stickers/SocketCustomSticker.cs | 5 ++- .../Entities/Users/SocketGroupUser.cs | 5 ++- .../Entities/Users/SocketGuildUser.cs | 7 +++- .../Entities/Users/SocketWebhookUser.cs | 9 ++-- 27 files changed, 208 insertions(+), 87 deletions(-) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index fe13d327e8..58de002a01 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -6,7 +6,7 @@ namespace Discord.WebSocket { public partial class BaseSocketClient { - //Channels + #region Channels /// Fired when a channel is created. /// /// @@ -74,8 +74,9 @@ public event Func ChannelUpdated remove { _channelUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _channelUpdatedEvent = new AsyncEvent>(); + #endregion - //Messages + #region Messages /// Fired when a message is received. /// /// @@ -128,7 +129,8 @@ public event Func MessageReceived /// source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" /> /// - public event Func, Cacheable, Task> MessageDeleted { + public event Func, Cacheable, Task> MessageDeleted + { add { _messageDeletedEvent.Add(value); } remove { _messageDeletedEvent.Remove(value); } } @@ -222,19 +224,22 @@ public event Func, SocketMessage, ISocketMessageChann /// /// - public event Func, Cacheable, SocketReaction, Task> ReactionAdded { + public event Func, Cacheable, SocketReaction, Task> ReactionAdded + { add { _reactionAddedEvent.Add(value); } remove { _reactionAddedEvent.Remove(value); } } internal readonly AsyncEvent, Cacheable, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent, Cacheable, SocketReaction, Task>>(); /// Fired when a reaction is removed from a message. - public event Func, Cacheable, SocketReaction, Task> ReactionRemoved { + public event Func, Cacheable, SocketReaction, Task> ReactionRemoved + { add { _reactionRemovedEvent.Add(value); } remove { _reactionRemovedEvent.Remove(value); } } internal readonly AsyncEvent, Cacheable, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent, Cacheable, SocketReaction, Task>>(); /// Fired when all reactions to a message are cleared. - public event Func, Cacheable, Task> ReactionsCleared { + public event Func, Cacheable, Task> ReactionsCleared + { add { _reactionsClearedEvent.Add(value); } remove { _reactionsClearedEvent.Remove(value); } } @@ -261,8 +266,9 @@ public event Func, Cacheable, Cacheable, IEmote, Task>> _reactionsRemovedForEmoteEvent = new AsyncEvent, Cacheable, IEmote, Task>>(); + #endregion - //Roles + #region Roles /// Fired when a role is created. public event Func RoleCreated { @@ -284,8 +290,9 @@ public event Func RoleUpdated remove { _roleUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _roleUpdatedEvent = new AsyncEvent>(); + #endregion - //Guilds + #region Guilds /// Fired when the connected account joins a guild. public event Func JoinedGuild { @@ -328,8 +335,9 @@ public event Func GuildUpdated remove { _guildUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _guildUpdatedEvent = new AsyncEvent>(); + #endregion - //Users + #region Users /// Fired when a user joins a guild. public event Func UserJoined { @@ -366,11 +374,12 @@ public event Func UserUpdated } internal readonly AsyncEvent> _userUpdatedEvent = new AsyncEvent>(); /// Fired when a guild member is updated, or a member presence is updated. - public event Func, SocketGuildUser, Task> GuildMemberUpdated { + public event Func, SocketGuildUser, Task> GuildMemberUpdated + { add { _guildMemberUpdatedEvent.Add(value); } remove { _guildMemberUpdatedEvent.Remove(value); } } - internal readonly AsyncEvent, SocketGuildUser, Task>> _guildMemberUpdatedEvent = new AsyncEvent, SocketGuildUser, Task>>(); + internal readonly AsyncEvent, SocketGuildUser, Task>> _guildMemberUpdatedEvent = new AsyncEvent, SocketGuildUser, Task>>(); /// Fired when a user joins, leaves, or moves voice channels. public event Func UserVoiceStateUpdated { @@ -393,7 +402,8 @@ public event Func CurrentUserUpdated } internal readonly AsyncEvent> _selfUpdatedEvent = new AsyncEvent>(); /// Fired when a user starts typing. - public event Func, Cacheable, Task> UserIsTyping { + public event Func, Cacheable, Task> UserIsTyping + { add { _userIsTypingEvent.Add(value); } remove { _userIsTypingEvent.Remove(value); } } @@ -412,8 +422,9 @@ public event Func RecipientRemoved remove { _recipientRemovedEvent.Remove(value); } } internal readonly AsyncEvent> _recipientRemovedEvent = new AsyncEvent>(); + #endregion - //Invites + #region Invites /// /// Fired when an invite is created. /// @@ -454,8 +465,9 @@ public event Func InviteDeleted remove { _inviteDeletedEvent.Remove(value); } } internal readonly AsyncEvent> _inviteDeletedEvent = new AsyncEvent>(); + #endregion - //Interactions + #region Interactions /// /// Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands. /// @@ -730,5 +742,6 @@ public event Func GuildStickerDeleted remove { _guildStickerDeleted.Remove(value); } } internal readonly AsyncEvent> _guildStickerDeleted = new AsyncEvent>(); + #endregion } } diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.cs b/src/Discord.Net.WebSocket/BaseSocketClient.cs index e8c5ca6caa..9e25ab3829 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.cs @@ -12,6 +12,7 @@ namespace Discord.WebSocket /// public abstract partial class BaseSocketClient : BaseDiscordClient, IDiscordClient { + #region BaseSocketClient protected readonly DiscordSocketConfig BaseConfig; /// @@ -79,7 +80,7 @@ internal BaseSocketClient(DiscordSocketConfig config, DiscordRestApiClient clien : base(config, client) => BaseConfig = config; private static DiscordSocketApiClient CreateApiClient(DiscordSocketConfig config) => new DiscordSocketApiClient(config.RestClientProvider, config.WebSocketProvider, DiscordRestConfig.UserAgent, - useSystemClock: config.UseSystemClock); + useSystemClock: config.UseSystemClock); /// /// Gets a Discord application information for the logged-in user. @@ -282,8 +283,9 @@ public Task GetInviteAsync(string inviteId, RequestOptions o /// A if found, otherwise . /// public abstract Task GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); - - // IDiscordClient +#endregion + + #region IDiscordClient /// async Task IDiscordClient.GetApplicationInfoAsync(RequestOptions options) => await GetApplicationInfoAsync(options).ConfigureAwait(false); @@ -331,5 +333,6 @@ async Task> IDiscordClient.GetVoiceRegionsAsyn { return await GetVoiceRegionsAsync().ConfigureAwait(false); } + #endregion } } diff --git a/src/Discord.Net.WebSocket/Commands/ShardedCommandContext.cs b/src/Discord.Net.WebSocket/Commands/ShardedCommandContext.cs index f970c32fc0..905cd01a1f 100644 --- a/src/Discord.Net.WebSocket/Commands/ShardedCommandContext.cs +++ b/src/Discord.Net.WebSocket/Commands/ShardedCommandContext.cs @@ -5,6 +5,7 @@ namespace Discord.Commands /// The sharded variant of , which may contain the client, user, guild, channel, and message. public class ShardedCommandContext : SocketCommandContext, ICommandContext { + #region ShardedCommandContext /// Gets the that the command is executed with. public new DiscordShardedClient Client { get; } @@ -17,9 +18,11 @@ public ShardedCommandContext(DiscordShardedClient client, SocketUserMessage msg) /// Gets the shard ID of the command context. private static int GetShardId(DiscordShardedClient client, IGuild guild) => guild == null ? 0 : client.GetShardIdFor(guild); +#endregion - //ICommandContext + #region ICommandContext /// IDiscordClient ICommandContext.Client => Client; + #endregion } } diff --git a/src/Discord.Net.WebSocket/Commands/SocketCommandContext.cs b/src/Discord.Net.WebSocket/Commands/SocketCommandContext.cs index f4d5179098..d7180873be 100644 --- a/src/Discord.Net.WebSocket/Commands/SocketCommandContext.cs +++ b/src/Discord.Net.WebSocket/Commands/SocketCommandContext.cs @@ -7,6 +7,7 @@ namespace Discord.Commands /// public class SocketCommandContext : ICommandContext { + #region SocketCommandContext /// /// Gets the that the command is executed with. /// @@ -46,8 +47,9 @@ public SocketCommandContext(DiscordSocketClient client, SocketUserMessage msg) User = msg.Author; Message = msg; } +#endregion - //ICommandContext + #region ICommandContext /// IDiscordClient ICommandContext.Client => Client; /// @@ -58,5 +60,6 @@ public SocketCommandContext(DiscordSocketClient client, SocketUserMessage msg) IUser ICommandContext.User => User; /// IUserMessage ICommandContext.Message => Message; + #endregion } } diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs index a9e6e311d8..50230572c9 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs @@ -5,7 +5,7 @@ namespace Discord.WebSocket { public partial class DiscordShardedClient { - //General + #region General /// Fired when a shard is connected to the Discord gateway. public event Func ShardConnected { @@ -34,5 +34,6 @@ public event Func ShardLatencyUpdated remove { _shardLatencyUpdatedEvent.Remove(value); } } private readonly AsyncEvent> _shardLatencyUpdatedEvent = new AsyncEvent>(); + #endregion } } diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index fbcd320342..106b79968d 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -12,6 +12,7 @@ namespace Discord.WebSocket { public partial class DiscordShardedClient : BaseSocketClient, IDiscordClient { + #region DiscordShardedClient private readonly DiscordSocketConfig _baseConfig; private readonly Dictionary _shardIdsToIndex; private readonly bool _automaticShards; @@ -484,8 +485,9 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.GuildStickerDeleted += (sticker) => _guildStickerDeleted.InvokeAsync(sticker); client.GuildStickerUpdated += (before, after) => _guildStickerUpdated.InvokeAsync(before, after); } +#endregion - //IDiscordClient + #region IDiscordClient /// async Task IDiscordClient.GetApplicationInfoAsync(RequestOptions options) => await GetApplicationInfoAsync().ConfigureAwait(false); @@ -532,7 +534,9 @@ async Task IDiscordClient.GetVoiceRegionAsync(string id, RequestOp { return await GetVoiceRegionAsync(id).ConfigureAwait(false); } + #endregion + #region Dispose internal override void Dispose(bool disposing) { if (!_isDisposed) @@ -551,5 +555,6 @@ internal override void Dispose(bool disposing) base.Dispose(disposing); } + #endregion } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index e19cedb336..a305bb0b4f 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -217,7 +217,7 @@ internal override async Task DisconnectInternalAsync(Exception ex = null) ConnectionState = ConnectionState.Disconnected; } - //Core + #region Core public Task SendGatewayAsync(GatewayOpCode opCode, object payload, RequestOptions options = null) => SendGatewayInternalAsync(opCode, payload, options); private async Task SendGatewayInternalAsync(GatewayOpCode opCode, object payload, RequestOptions options) @@ -327,5 +327,6 @@ public async Task SendGuildSyncAsync(IEnumerable guildIds, RequestOptions options = RequestOptions.CreateOrClone(options); await SendGatewayAsync(GatewayOpCode.GuildSync, guildIds, options: options).ConfigureAwait(false); } + #endregion } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs index 0418727bf9..ab13d93dbe 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs @@ -6,7 +6,7 @@ namespace Discord.WebSocket { public partial class DiscordSocketClient { - //General + #region General /// Fired when connected to the Discord gateway. public event Func Connected { @@ -45,5 +45,6 @@ public event Func LatencyUpdated internal DiscordSocketClient(DiscordSocketConfig config, DiscordRestApiClient client) : base(config, client) { } + #endregion } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 2b9ac9ff86..7e3531d2a4 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2815,7 +2815,7 @@ private async Task UnsyncedGuildAsync(string evnt, ulong guildId) internal int GetAudioId() => _nextAudioId++; - //IDiscordClient + #region IDiscordClient /// async Task IDiscordClient.GetApplicationInfoAsync(RequestOptions options) => await GetApplicationInfoAsync().ConfigureAwait(false); @@ -2878,5 +2878,6 @@ async Task IDiscordClient.StartAsync() /// async Task IDiscordClient.StopAsync() => await StopAsync().ConfigureAwait(false); + #endregion } } diff --git a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs index f78145dbe5..69894e2020 100644 --- a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs @@ -18,6 +18,7 @@ namespace Discord.Audio { internal class DiscordVoiceAPIClient : IDisposable { + #region DiscordVoiceAPIClient public const int MaxBitrate = 128 * 1024; public const string Mode = "xsalsa20_poly1305"; @@ -126,8 +127,9 @@ public async Task SendAsync(byte[] data, int offset, int bytes) await _udp.SendAsync(data, offset, bytes).ConfigureAwait(false); await _sentDataEvent.InvokeAsync(bytes).ConfigureAwait(false); } + #endregion - //WebSocket + #region WebSocket public async Task SendHeartbeatAsync(RequestOptions options = null) { await SendAsync(VoiceOpCode.Heartbeat, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), options: options).ConfigureAwait(false); @@ -208,10 +210,12 @@ public async Task DisconnectAsync() } private async Task DisconnectInternalAsync() { - if (ConnectionState == ConnectionState.Disconnected) return; + if (ConnectionState == ConnectionState.Disconnected) + return; ConnectionState = ConnectionState.Disconnecting; - try { _connectCancelToken?.Cancel(false); } + try + { _connectCancelToken?.Cancel(false); } catch { } //Wait for tasks to complete @@ -220,8 +224,9 @@ private async Task DisconnectInternalAsync() ConnectionState = ConnectionState.Disconnected; } + #endregion - //Udp + #region Udp public async Task SendDiscoveryAsync(uint ssrc) { var packet = new byte[70]; @@ -252,8 +257,9 @@ public void SetUdpEndpoint(string ip, int port) { _udp.SetDestination(ip, port); } + #endregion - //Helpers + #region Helpers private static double ToMilliseconds(Stopwatch stopwatch) => Math.Round((double)stopwatch.ElapsedTicks / (double)Stopwatch.Frequency * 1000.0, 2); private string SerializeJson(object value) { @@ -269,5 +275,6 @@ private T DeserializeJson(Stream jsonStream) using (JsonReader reader = new JsonTextReader(text)) return _serializer.Deserialize(reader); } + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs index b90c1976a1..9c7dd4fbd4 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs @@ -14,6 +14,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketCategoryChannel : SocketGuildChannel, ICategoryChannel { + #region SocketCategoryChannel /// public override IReadOnlyCollection Users => Guild.Users.Where(x => Permissions.GetValue( @@ -41,8 +42,9 @@ internal SocketCategoryChannel(DiscordSocketClient discord, ulong id, SocketGuil entity.Update(state, model); return entity; } + #endregion - //Users + #region Users /// public override SocketGuildUser GetUser(ulong id) { @@ -59,21 +61,24 @@ public override SocketGuildUser GetUser(ulong id) private string DebuggerDisplay => $"{Name} ({Id}, Category)"; internal new SocketCategoryChannel Clone() => MemberwiseClone() as SocketCategoryChannel; + #endregion - // IGuildChannel + #region IGuildChannel /// IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); /// Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); + #endregion - //IChannel + #region IChannel /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); /// Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs index 13c0c9b4f5..80c43a0c32 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs @@ -13,6 +13,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public abstract class SocketChannel : SocketEntity, IChannel { + #region SocketChannel /// /// Gets when the channel is created. /// @@ -41,8 +42,9 @@ internal static ISocketPrivateChannel CreatePrivate(DiscordSocketClient discord, } } internal abstract void Update(ClientState state, Model model); + #endregion - //User + #region User /// /// Gets a generic user from this channel. /// @@ -56,8 +58,9 @@ internal static ISocketPrivateChannel CreatePrivate(DiscordSocketClient discord, private string DebuggerDisplay => $"Unknown ({Id}, Channel)"; internal SocketChannel Clone() => MemberwiseClone() as SocketChannel; + #endregion - //IChannel + #region IChannel /// string IChannel.Name => null; @@ -67,5 +70,6 @@ Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions optio /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => AsyncEnumerable.Empty>(); //Overridden + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs index 27e720669a..3f44ecfc60 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs @@ -16,6 +16,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketDMChannel : SocketChannel, IDMChannel, ISocketPrivateChannel, ISocketMessageChannel { + #region SocketDMChannel /// /// Gets the recipient of the channel. /// @@ -58,8 +59,9 @@ internal void Update(ClientState state, API.User recipient) /// public Task CloseAsync(RequestOptions options = null) => ChannelHelper.DeleteAsync(this, Discord, options); +#endregion - //Messages + #region Messages /// public SocketMessage GetCachedMessage(ulong id) => null; @@ -172,8 +174,9 @@ internal SocketMessage RemoveMessage(ulong id) { return null; } + #endregion - //Users + #region Users /// /// Gets a user in this channel from the provided . /// @@ -197,26 +200,31 @@ internal SocketMessage RemoveMessage(ulong id) public override string ToString() => $"@{Recipient}"; private string DebuggerDisplay => $"@{Recipient} ({Id}, DM)"; internal new SocketDMChannel Clone() => MemberwiseClone() as SocketDMChannel; + #endregion - //SocketChannel + #region SocketChannel /// internal override IReadOnlyCollection GetUsersInternal() => Users; /// internal override SocketUser GetUserInternal(ulong id) => GetUser(id); + #endregion - //IDMChannel + #region IDMChannel /// IUser IDMChannel.Recipient => Recipient; + #endregion - //ISocketPrivateChannel + #region ISocketPrivateChannel /// IReadOnlyCollection ISocketPrivateChannel.Recipients => ImmutableArray.Create(Recipient); + #endregion - //IPrivateChannel + #region IPrivateChannel /// IReadOnlyCollection IPrivateChannel.Recipients => ImmutableArray.Create(Recipient); + #endregion - //IMessageChannel + #region IMessageChannel /// async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -246,8 +254,9 @@ async Task IMessageChannel.SendFileAsync(Stream stream, string fil /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + #endregion - //IChannel + #region IChannel /// string IChannel.Name => $"@{Recipient}"; @@ -257,5 +266,6 @@ Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions optio /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index a97806be87..f1a697e014 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -20,6 +20,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketGroupChannel : SocketChannel, IGroupChannel, ISocketPrivateChannel, ISocketMessageChannel, ISocketAudioChannel { + #region SocketGroupChannel private readonly MessageCache _messages; private readonly ConcurrentDictionary _voiceStates; @@ -84,8 +85,9 @@ public Task ConnectAsync() { throw new NotSupportedException("Voice is not yet supported for group channels."); } +#endregion - //Messages + #region Messages /// public SocketMessage GetCachedMessage(ulong id) => _messages?.Get(id); @@ -204,8 +206,9 @@ internal void AddMessage(SocketMessage msg) => _messages?.Add(msg); internal SocketMessage RemoveMessage(ulong id) => _messages?.Remove(id); + #endregion - //Users + #region Users /// /// Gets a user from this group. /// @@ -240,8 +243,9 @@ internal SocketGroupUser RemoveUser(ulong id) } return null; } + #endregion - //Voice States + #region Voice States internal SocketVoiceState AddOrUpdateVoiceState(ClientState state, VoiceStateModel model) { var voiceChannel = state.GetChannel(model.ChannelId.Value) as SocketVoiceChannel; @@ -268,22 +272,26 @@ internal SocketVoiceState AddOrUpdateVoiceState(ClientState state, VoiceStateMod public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id}, Group)"; internal new SocketGroupChannel Clone() => MemberwiseClone() as SocketGroupChannel; + #endregion - //SocketChannel + #region SocketChannel /// internal override IReadOnlyCollection GetUsersInternal() => Users; /// internal override SocketUser GetUserInternal(ulong id) => GetUser(id); + #endregion - //ISocketPrivateChannel + #region ISocketPrivateChannel /// IReadOnlyCollection ISocketPrivateChannel.Recipients => Recipients; + #endregion - //IPrivateChannel + #region IPrivateChannel /// IReadOnlyCollection IPrivateChannel.Recipients => Recipients; + #endregion - //IMessageChannel + #region IMessageChannel /// async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -314,19 +322,22 @@ async Task IMessageChannel.SendFileAsync(Stream stream, string fil /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + #endregion - //IAudioChannel + #region IAudioChannel /// /// Connecting to a group channel is not supported. Task IAudioChannel.ConnectAsync(bool selfDeaf, bool selfMute, bool external) { throw new NotSupportedException(); } Task IAudioChannel.DisconnectAsync() { throw new NotSupportedException(); } + #endregion - //IChannel + #region IChannel /// Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs index 196f3c558f..a504a2a94b 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs @@ -15,6 +15,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketGuildChannel : SocketChannel, IGuildChannel { + #region SocketGuildChannel private ImmutableArray _overwrites; /// @@ -27,7 +28,7 @@ public class SocketGuildChannel : SocketChannel, IGuildChannel /// public string Name { get; private set; } /// - public int Position { get; private set; } + public int Position { get; private set; } /// public virtual IReadOnlyCollection PermissionOverwrites => _overwrites; @@ -69,7 +70,7 @@ internal override void Update(ClientState state, Model model) { Name = model.Name.Value; Position = model.Position.GetValueOrDefault(0); - + var overwrites = model.PermissionOverwrites.GetValueOrDefault(new API.Overwrite[0]); var newOverwrites = ImmutableArray.CreateBuilder(overwrites.Length); for (int i = 0; i < overwrites.Length; i++) @@ -180,14 +181,16 @@ public virtual async Task RemovePermissionOverwriteAsync(IRole role, RequestOpti public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id}, Guild)"; internal new SocketGuildChannel Clone() => MemberwiseClone() as SocketGuildChannel; +#endregion - //SocketChannel + #region SocketChannel /// internal override IReadOnlyCollection GetUsersInternal() => Users; /// internal override SocketUser GetUserInternal(ulong id) => GetUser(id); + #endregion - //IGuildChannel + #region IGuildChannel /// IGuild IGuildChannel.Guild => Guild; /// @@ -218,13 +221,15 @@ IAsyncEnumerable> IGuildChannel.GetUsersAsync(Ca /// Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); + #endregion - //IChannel + #region IChannel /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); //Overridden in Text/Voice /// Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); //Overridden in Text/Voice + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index 0bc62168f0..14a34cbc62 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -16,6 +16,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketTextChannel : SocketGuildChannel, ITextChannel, ISocketMessageChannel { + #region SocketTextChannel private readonly MessageCache _messages; /// @@ -122,8 +123,9 @@ public async Task CreateThreadAsync(string name, ThreadType return thread; } +#endregion - //Messages + #region Messages /// public SocketMessage GetCachedMessage(ulong id) => _messages?.Get(id); @@ -250,8 +252,9 @@ internal void AddMessage(SocketMessage msg) => _messages?.Add(msg); internal SocketMessage RemoveMessage(ulong id) => _messages?.Remove(id); + #endregion - //Users + #region Users /// public override SocketGuildUser GetUser(ulong id) { @@ -265,8 +268,9 @@ public override SocketGuildUser GetUser(ulong id) } return null; } + #endregion - //Webhooks + #region Webhooks /// /// Creates a webhook in this text channel. /// @@ -300,8 +304,9 @@ public virtual Task GetWebhookAsync(ulong id, RequestOptions option /// public virtual Task> GetWebhooksAsync(RequestOptions options = null) => ChannelHelper.GetWebhooksAsync(this, Discord, options); + #endregion - //Invites + #region Invites /// public virtual async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); @@ -317,8 +322,9 @@ public virtual async Task> GetInvitesAsync( private string DebuggerDisplay => $"{Name} ({Id}, Text)"; internal new SocketTextChannel Clone() => MemberwiseClone() as SocketTextChannel; + #endregion - //ITextChannel + #region ITextChannel /// async Task ITextChannel.CreateWebhookAsync(string name, Stream avatar, RequestOptions options) => await CreateWebhookAsync(name, avatar, options).ConfigureAwait(false); @@ -331,16 +337,18 @@ async Task> ITextChannel.GetWebhooksAsync(RequestO /// async Task ITextChannel.CreateThreadAsync(string name, ThreadType type, ThreadArchiveDuration autoArchiveDuration, IMessage message, RequestOptions options) => await CreateThreadAsync(name, type, autoArchiveDuration, message, options); + #endregion - //IGuildChannel + #region IGuildChannel /// Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); /// IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + #endregion - //IMessageChannel + #region IMessageChannel /// async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -371,10 +379,12 @@ async Task IMessageChannel.SendFileAsync(Stream stream, string fil /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + #endregion - // INestedChannel + #region INestedChannel /// Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) => Task.FromResult(Category); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs index 7dded5fa2c..f1d61b9b3a 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs @@ -16,6 +16,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketVoiceChannel : SocketGuildChannel, IVoiceChannel, ISocketAudioChannel { + #region SocketVoiceChannel /// public int Bitrate { get; private set; } /// @@ -84,8 +85,9 @@ public override SocketGuildUser GetUser(ulong id) return user; return null; } +#endregion - //Invites + #region Invites /// public async Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary, isUnique, options).ConfigureAwait(false); @@ -101,18 +103,21 @@ public async Task> GetInvitesAsync(RequestO private string DebuggerDisplay => $"{Name} ({Id}, Voice)"; internal new SocketVoiceChannel Clone() => MemberwiseClone() as SocketVoiceChannel; + #endregion - //IGuildChannel + #region IGuildChannel /// Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); /// IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + #endregion - // INestedChannel + #region INestedChannel /// Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) => Task.FromResult(Category); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 1cdefcdb77..efc3ab1b41 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -30,6 +30,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketGuild : SocketEntity, IGuild, IDisposable { + #region SocketGuild #pragma warning disable IDISP002, IDISP006 private readonly SemaphoreSlim _audioLock; private TaskCompletionSource _syncPromise, _downloaderPromise; @@ -571,6 +572,7 @@ internal void Update(ClientState state, EmojiUpdateModel model) emotes.Add(model.Emojis[i].ToEntity()); _emotes = emotes.ToImmutable(); } + #endregion #region General /// @@ -960,8 +962,9 @@ public Task> GetInvitesAsync(RequestOpti /// public Task GetVanityInviteAsync(RequestOptions options = null) => GuildHelper.GetVanityInviteAsync(this, Discord, options); + #endregion - //Roles + #region Roles /// /// Gets a role in this guild. /// @@ -1189,8 +1192,9 @@ internal void CompleteDownloadUsers() /// public Task> SearchUsersAsync(string query, int limit = DiscordConfig.MaxUsersPerBatch, RequestOptions options = null) => GuildHelper.SearchUsersAsync(this, Discord, query, limit, options); + #endregion - //Audit logs + #region Audit logs /// /// Gets the specified number of audit log entries for this guild. /// @@ -1205,8 +1209,9 @@ public Task> SearchUsersAsync(string query, i /// public IAsyncEnumerable> GetAuditLogsAsync(int limit, RequestOptions options = null, ulong? beforeId = null, ulong? userId = null, ActionType? actionType = null) => GuildHelper.GetAuditLogsAsync(this, Discord, beforeId, limit, options, userId: userId, actionType: actionType); + #endregion - //Webhooks + #region Webhooks /// /// Gets a webhook found within this guild. /// @@ -1228,8 +1233,9 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null /// public Task> GetWebhooksAsync(RequestOptions options = null) => GuildHelper.GetWebhooksAsync(this, Discord, options); + #endregion - //Emotes + #region Emotes /// public Task> GetEmotesAsync(RequestOptions options = null) => GuildHelper.GetEmotesAsync(this, Discord, options); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index a79a9724c8..ef6a187a4a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -10,6 +10,7 @@ namespace Discord.WebSocket /// public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOption { + #region SocketSlashCommandDataOption /// public string Name { get; private set; } @@ -116,17 +117,20 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() : null; } +#endregion - // Converters + #region Converters public static explicit operator bool(SocketSlashCommandDataOption option) => (bool)option.Value; public static explicit operator int(SocketSlashCommandDataOption option) => (int)option.Value; public static explicit operator string(SocketSlashCommandDataOption option) => option.Value.ToString(); + #endregion - // IApplicationCommandInteractionDataOption + #region IApplicationCommandInteractionDataOption IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options; + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index f0b8929e84..2c142e811c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -15,6 +15,7 @@ namespace Discord.WebSocket /// public class SocketApplicationCommand : SocketEntity, IApplicationCommand { + #region SocketApplicationCommand /// /// if this command is a global command, otherwise . /// @@ -113,8 +114,10 @@ public async Task ModifyAsync(Action func, RequestOptions options = this.Update(command); } + #endregion - // IApplicationCommand + #region IApplicationCommand IReadOnlyCollection IApplicationCommand.Options => Options; + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 4c98be7eea..7baab24963 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -12,6 +12,7 @@ namespace Discord.WebSocket /// public abstract class SocketInteraction : SocketEntity, IDiscordInteraction { + #region SocketInteraction /// /// The this interaction was used in. /// @@ -219,9 +220,9 @@ private bool CheckToken() // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction return (DateTime.UtcNow - this.CreatedAt.UtcDateTime).TotalMinutes <= 15d; } +#endregion - // IDiscordInteraction - + #region IDiscordInteraction /// async Task IDiscordInteraction.FollowupAsync (string text, Embed[] embeds, bool isTTS, bool ephemeral, AllowedMentions allowedMentions, RequestOptions options, MessageComponent component, Embed embed) @@ -234,5 +235,6 @@ async Task IDiscordInteraction.GetOriginalResponseAsync (RequestOp /// async Task IDiscordInteraction.ModifyOriginalResponseAsync (Action func, RequestOptions options) => await ModifyOriginalResponseAsync(func, options).ConfigureAwait(false); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 20df3446e0..acf60f3716 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -14,6 +14,7 @@ namespace Discord.WebSocket /// public abstract class SocketMessage : SocketEntity, IMessage { + #region SocketMessage private long _timestampTicks; private readonly List _reactions = new List(); @@ -240,8 +241,9 @@ public Task DeleteAsync(RequestOptions options = null) /// public override string ToString() => Content; internal SocketMessage Clone() => MemberwiseClone() as SocketMessage; +#endregion - //IMessage + #region IMessage /// IUser IMessage.Author => Author; /// @@ -299,5 +301,6 @@ public Task RemoveAllReactionsForEmoteAsync(IEmote emote, RequestOptions options /// public IAsyncEnumerable> GetReactionUsersAsync(IEmote emote, int limit, RequestOptions options = null) => MessageHelper.GetReactionUsersAsync(this, emote, limit, Discord, options); + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs index 732b7818b1..d9740338f5 100644 --- a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs +++ b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs @@ -1,6 +1,6 @@ using Discord.Rest; using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; @@ -14,6 +14,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketRole : SocketEntity, IRole { + #region SocketRole /// /// Gets the guild that owns this role. /// @@ -54,7 +55,7 @@ public class SocketRole : SocketEntity, IRole /// /// Returns an IEnumerable containing all that have this role. /// - public IEnumerable Members + public IEnumerable Members => Guild.Users.Where(x => x.Roles.Any(r => r.Id == Id)); internal SocketRole(SocketGuild guild, ulong id) @@ -100,9 +101,11 @@ public Task DeleteAsync(RequestOptions options = null) /// public int CompareTo(IRole role) => RoleUtils.Compare(this, role); + #endregion - //IRole + #region IRole /// IGuild IRole.Guild => Guild; + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index e7bff2ff09..586a192dca 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -16,6 +16,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketCustomSticker : SocketSticker, ICustomSticker { + #region SocketCustomSticker /// /// Gets the user that uploaded the guild sticker. /// @@ -71,12 +72,14 @@ public async Task DeleteAsync(RequestOptions options = null) internal SocketCustomSticker Clone() => MemberwiseClone() as SocketCustomSticker; private new string DebuggerDisplay => Guild == null ? base.DebuggerDisplay : $"{Name} in {Guild.Name} ({Id})"; +#endregion - // ICustomSticker + #region ICustomSticker ulong? ICustomSticker.AuthorId => this.AuthorId; IGuild ICustomSticker.Guild => this.Guild; + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs index d993105404..ae72b5d47d 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs @@ -10,6 +10,7 @@ namespace Discord.WebSocket [DebuggerDisplay("{DebuggerDisplay,nq}")] public class SocketGroupUser : SocketUser, IGroupUser { + #region SocketGroupUser /// /// Gets the group channel of the user. /// @@ -53,8 +54,9 @@ internal static SocketGroupUser Create(SocketGroupChannel channel, ClientState s private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Group)"; internal new SocketGroupUser Clone() => MemberwiseClone() as SocketGroupUser; + #endregion - //IVoiceState + #region IVoiceState /// bool IVoiceState.IsDeafened => false; /// @@ -73,5 +75,6 @@ internal static SocketGroupUser Create(SocketGroupChannel channel, ClientState s bool IVoiceState.IsStreaming => false; /// DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index ac8409a322..8dd48891b2 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -18,6 +18,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketGuildUser : SocketUser, IGuildUser { + #region SocketGuildUser private long? _premiumSinceTicks; private long? _joinedAtTicks; private ImmutableArray _roleIds; @@ -65,7 +66,7 @@ public class SocketGuildUser : SocketUser, IGuildUser public DateTimeOffset? RequestToSpeakTimestamp => VoiceState?.RequestToSpeakTimestamp ?? null; /// public bool? IsPending { get; private set; } - + /// public DateTimeOffset? JoinedAt => DateTimeUtils.FromTicks(_joinedAtTicks); @@ -220,8 +221,9 @@ public ChannelPermissions GetPermissions(IGuildChannel channel) private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Guild)"; internal new SocketGuildUser Clone() => MemberwiseClone() as SocketGuildUser; + #endregion - //IGuildUser + #region IGuildUser /// IGuild IGuildUser.Guild => Guild; /// @@ -232,5 +234,6 @@ public ChannelPermissions GetPermissions(IGuildChannel channel) //IVoiceState /// IVoiceChannel IVoiceState.VoiceChannel => VoiceChannel; + #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index 0c37fcd03f..d68414ebb1 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -13,6 +13,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketWebhookUser : SocketUser, IWebhookUser { + #region SocketWebhookUser /// Gets the guild of this webhook. public SocketGuild Guild { get; } /// @@ -66,9 +67,9 @@ internal static SocketWebhookUser Create(SocketGuild guild, ClientState state, M private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Webhook)"; internal new SocketWebhookUser Clone() => MemberwiseClone() as SocketWebhookUser; +#endregion - - //IGuildUser + #region IGuildUser /// IGuild IGuildUser.Guild => Guild; /// @@ -139,8 +140,9 @@ Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions option /// Roles are not supported on webhook users. Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions options) => throw new NotSupportedException("Roles are not supported on webhook users."); + #endregion - //IVoiceState + #region IVoiceState /// bool IVoiceState.IsDeafened => false; /// @@ -159,5 +161,6 @@ Task IGuildUser.RemoveRolesAsync(IEnumerable roles, RequestOptions option bool IVoiceState.IsStreaming => false; /// DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; + #endregion } } From 683d3027ec74b11fbb1d119c5489984e8f2b819f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 14:43:35 -0300 Subject: [PATCH 261/494] meta: bump version --- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 +++--- src/Discord.Net.Core/Discord.Net.Core.xml | 4 ++-- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +++--- .../Discord.Net.WebSocket.csproj | 6 +++--- src/Discord.Net/Discord.Net.nuspec | 20 +++++++++---------- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index dd6dcb60aa..a5fdbf230d 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.0.2 + 3.1.0 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 3.0.2 - 3.0.2 + 3.1.0 + 3.1.0 false diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 38b0fa3107..107895dfbd 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -11227,8 +11227,8 @@ - This intent includes all but and - that are privileged must be enabled for the application. + This intent includes all but and + which are privileged and must be enabled in the Developer Portal. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 34635f8301..2159f5117b 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.2 + 3.1.0 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.0.2 - 3.0.2 + 3.1.0 + 3.1.0 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index d4e860c392..f166cab117 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.0.3 + 3.1.0 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,8 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.0.3 - 3.0.3 + 3.1.0 + 3.1.0 TRACE diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 5a342c024d..5f15cf79a3 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.0.3$suffix$ + 3.1.0$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,23 +14,23 @@ https://avatars.githubusercontent.com/u/84047264 - - - + + + - - - + + + - - - + + + From b88525aa98e0eb0dd78d54cbdfb81be267d45eea Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 15:26:11 -0300 Subject: [PATCH 262/494] Add components and stickers to ReplyAsync extension --- src/Discord.Net.Core/Extensions/MessageExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Extensions/MessageExtensions.cs b/src/Discord.Net.Core/Extensions/MessageExtensions.cs index b043d7b77d..6d068d160c 100644 --- a/src/Discord.Net.Core/Extensions/MessageExtensions.cs +++ b/src/Discord.Net.Core/Extensions/MessageExtensions.cs @@ -87,9 +87,9 @@ public static async Task RemoveReactionsAsync(this IUserMessage msg, IUser user, /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - public static async Task ReplyAsync(this IUserMessage msg, string text = null, bool isTTS = false, Embed embed = null, AllowedMentions allowedMentions = null, RequestOptions options = null) + public static async Task ReplyAsync(this IUserMessage msg, string text = null, bool isTTS = false, Embed embed = null, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent components = null, ISticker[] stickers = null) { - return await msg.Channel.SendMessageAsync(text, isTTS, embed, options, allowedMentions, new MessageReference(messageId: msg.Id)).ConfigureAwait(false); + return await msg.Channel.SendMessageAsync(text, isTTS, embed, options, allowedMentions, new MessageReference(messageId: msg.Id), components, stickers).ConfigureAwait(false); } } } From 0dc74f999de9e535d5acaebbb054491d5b5e3d34 Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Tue, 21 Sep 2021 14:18:18 -0500 Subject: [PATCH 263/494] Fix methods that modifies messages to allow modifying only the components (#170) --- .../Entities/Interactions/InteractionHelper.cs | 10 ++++++---- .../Entities/Messages/MessageHelper.cs | 7 ++++--- .../Message Components/SocketMessageComponent.cs | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index e79cb6e2f2..ce7953e1eb 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -340,9 +340,10 @@ public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulo var embeds = args.Embeds; bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(message.Content); - bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || message.Embeds.Any(); + bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0 || message.Embeds.Any(); + bool hasComponents = args.Components.IsSpecified && args.Components.Value != null; - if (!hasText && !hasEmbeds) + if (!hasComponents && !hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; @@ -383,9 +384,10 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl var embeds = args.Embeds; bool hasText = !string.IsNullOrEmpty(args.Content.GetValueOrDefault()); - bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0); + bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0; + bool hasComponents = args.Components.IsSpecified && args.Components.Value != null; - if (!hasText && !hasEmbeds) + if (!hasComponents && !hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 0faca002da..d50f453d7a 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -38,7 +38,7 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie var embeds = args.Embeds; bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(msg.Content); - bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || msg.Embeds.Any(); + bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0 || msg.Embeds.Any(); if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); @@ -101,9 +101,10 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi var embeds = args.Embeds; bool hasText = args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value); - bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0); + bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0; + bool hasComponents = args.Components.IsSpecified && args.Components.Value != null; - if (!hasText && !hasEmbeds) + if (!hasComponents && !hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); if (args.AllowedMentions.IsSpecified) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 5daffc2cda..2b834d78b9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -150,7 +150,7 @@ public async Task UpdateAsync(Action func, RequestOptions opt var embeds = args.Embeds; bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(Message.Content); - bool hasEmbeds = (embed.IsSpecified && embed.Value != null) || (embeds.IsSpecified && embeds.Value?.Length > 0) || Message.Embeds.Any(); + bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0 || Message.Embeds.Any(); if (!hasText && !hasEmbeds) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); From d85c5e395fa745fb8fe2f2b07f0161d406df413d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 21 Sep 2021 17:16:55 -0300 Subject: [PATCH 264/494] meta: bump version --- src/Discord.Net.Commands/Discord.Net.Commands.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index d38ea4dd04..84bc5b84bb 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -7,7 +7,7 @@ A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 3.0.0 + 3.0.1 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs From 96af3cc9377a05f3f49884acfffa9fe962b70a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Wed, 22 Sep 2021 10:09:01 +0200 Subject: [PATCH 265/494] 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 --- .../Message Components/ComponentBuilder.cs | 14 +------------- .../Extensions/MessageExtensions.cs | 4 ++-- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 5dcf8f22c0..be7f783048 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -367,8 +367,6 @@ public string Label if (value.Length < 1) throw new ArgumentException("Button label must be 1 character or more!", paramName: nameof(Label)); } - else - throw new ArgumentException("Button label must not be null or empty!", paramName: nameof(Label)); _label = value; } @@ -391,8 +389,6 @@ public string CustomId if (value.Length < 1) throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); } - else - throw new ArgumentException("Custom Id must not be null or empty!", paramName: nameof(CustomId)); _customId = value; } } @@ -644,8 +640,6 @@ public string CustomId if (value.Length < 1) throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); } - else - throw new ArgumentException("Custom Id must not be null or empty!", paramName: nameof(CustomId)); _customId = value; } } @@ -667,8 +661,6 @@ public string Placeholder if (value.Length < 1) throw new ArgumentException("The placeholder must be 1 character or more!", paramName: nameof(Placeholder)); } - else - throw new ArgumentException("The placeholder must not be null or empty!", paramName: nameof(Placeholder)); _placeholder = value; } @@ -938,8 +930,6 @@ public string Label if (value.Length < 1) throw new ArgumentException("Select option label must be 1 character or more!", paramName: nameof(Label)); } - else - throw new ArgumentException("Select option label must not be null or empty!", paramName: nameof(Label)); _label = value; } @@ -973,7 +963,7 @@ public string Value /// Gets or sets this menu options description. /// /// length exceeds . - /// length subceeds 1. + /// length subceeds 1. public string Description { get => _description; @@ -986,8 +976,6 @@ public string Description if (value.Length < 1) throw new ArgumentException("The description must be 1 character or more!", paramName: nameof(Label)); } - else - throw new ArgumentException("The description must not be null or empty!", paramName: nameof(Label)); _description = value; } diff --git a/src/Discord.Net.Core/Extensions/MessageExtensions.cs b/src/Discord.Net.Core/Extensions/MessageExtensions.cs index b043d7b77d..6d068d160c 100644 --- a/src/Discord.Net.Core/Extensions/MessageExtensions.cs +++ b/src/Discord.Net.Core/Extensions/MessageExtensions.cs @@ -87,9 +87,9 @@ public static async Task RemoveReactionsAsync(this IUserMessage msg, IUser user, /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - public static async Task ReplyAsync(this IUserMessage msg, string text = null, bool isTTS = false, Embed embed = null, AllowedMentions allowedMentions = null, RequestOptions options = null) + public static async Task ReplyAsync(this IUserMessage msg, string text = null, bool isTTS = false, Embed embed = null, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent components = null, ISticker[] stickers = null) { - return await msg.Channel.SendMessageAsync(text, isTTS, embed, options, allowedMentions, new MessageReference(messageId: msg.Id)).ConfigureAwait(false); + return await msg.Channel.SendMessageAsync(text, isTTS, embed, options, allowedMentions, new MessageReference(messageId: msg.Id), components, stickers).ConfigureAwait(false); } } } From 77b8e78de491f7ac61a554937c440effe262b8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Wed, 22 Sep 2021 13:33:41 +0200 Subject: [PATCH 266/494] More regions (#177) * Preconditions * ChannelHelper * RestDMChannel * RestGroupChannel * RestBan * RestGroupUser * EntityExtensions * DiscordSocketClient * DiscordSocketClient --- src/Discord.Net.Core/Utils/Preconditions.cs | 12 ++-- .../Entities/Channels/ChannelHelper.cs | 32 ++++++---- .../Entities/Channels/RestDMChannel.cs | 17 ++++-- .../Entities/Channels/RestGroupChannel.cs | 17 ++++-- .../Entities/Guilds/RestBan.cs | 5 +- .../Entities/Users/RestGroupUser.cs | 5 +- .../DiscordSocketClient.cs | 61 ++++++++++++------- .../Extensions/EntityExtensions.cs | 21 ++++--- 8 files changed, 115 insertions(+), 55 deletions(-) diff --git a/src/Discord.Net.Core/Utils/Preconditions.cs b/src/Discord.Net.Core/Utils/Preconditions.cs index 60415852c1..ff8eb7c0dd 100644 --- a/src/Discord.Net.Core/Utils/Preconditions.cs +++ b/src/Discord.Net.Core/Utils/Preconditions.cs @@ -4,7 +4,7 @@ namespace Discord { internal static class Preconditions { - //Objects + #region Objects /// must not be . public static void NotNull(T obj, string name, string msg = null) where T : class { if (obj == null) throw CreateNotNullException(name, msg); } /// must not be . @@ -15,8 +15,9 @@ private static ArgumentNullException CreateNotNullException(string name, string if (msg == null) return new ArgumentNullException(paramName: name); else return new ArgumentNullException(paramName: name, message: msg); } + #endregion - //Strings + #region Strings /// cannot be blank. public static void NotEmpty(string obj, string name, string msg = null) { if (obj.Length == 0) throw CreateNotEmptyException(name, msg); } /// cannot be blank. @@ -58,8 +59,9 @@ public static void NotNullOrWhitespace(Optional obj, string name, string private static ArgumentException CreateNotEmptyException(string name, string msg) => new ArgumentException(message: msg ?? "Argument cannot be blank.", paramName: name); + #endregion - //Numerics + #region Numerics /// Value may not be equal to . public static void NotEqual(sbyte obj, sbyte value, string name, string msg = null) { if (obj == value) throw CreateNotEqualException(name, msg, value); } /// Value may not be equal to . @@ -271,8 +273,9 @@ private static ArgumentException CreateAtMostException(string name, string ms private static ArgumentException CreateLessThanException(string name, string msg, T value) => new ArgumentException(message: msg ?? $"Value must be less than {value}.", paramName: name); + #endregion - // Bulk Delete + #region Bulk Delete /// Messages are younger than 2 weeks. public static void YoungerThanTwoWeeks(ulong[] collection, string name) { @@ -293,5 +296,6 @@ public static void NotEveryoneRole(ulong[] roles, ulong guildId, string name) throw new ArgumentException(message: "The everyone role cannot be assigned to a user.", paramName: name); } } + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index bf95cfa6d5..696ffa5afd 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -12,7 +12,7 @@ namespace Discord.Rest { internal static class ChannelHelper { - //General + #region General public static async Task DeleteAsync(IChannel channel, BaseDiscordClient client, RequestOptions options) { @@ -107,8 +107,9 @@ public static async Task ModifyAsync(IStageChannel channel, BaseD return await client.ApiClient.ModifyStageInstanceAsync(channel.Id, apiArgs, options); } + #endregion - //Invites + #region Invites public static async Task> GetInvitesAsync(IGuildChannel channel, BaseDiscordClient client, RequestOptions options) { @@ -183,8 +184,9 @@ public static async Task CreateInviteToApplicationAsync(IGui var model = await client.ApiClient.CreateChannelInviteAsync(channel.Id, args, options).ConfigureAwait(false); return RestInviteMetadata.Create(client, null, channel, model); } + #endregion - //Messages + #region Messages public static async Task GetMessageAsync(IMessageChannel channel, BaseDiscordClient client, ulong id, RequestOptions options) { @@ -285,12 +287,12 @@ public static async Task SendMessageAsync(IMessageChannel chann } } - if(stickers != null) + if (stickers != null) { Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed."); } - var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified}; + var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified }; var model = await client.ApiClient.CreateMessageAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } @@ -397,8 +399,9 @@ public static async Task DeleteMessagesAsync(ITextChannel channel, BaseDiscordCl await client.ApiClient.DeleteMessagesAsync(channel.Id, args, options).ConfigureAwait(false); } } + #endregion - //Permission Overwrites + #region Permission Overwrites public static async Task AddPermissionOverwriteAsync(IGuildChannel channel, BaseDiscordClient client, IUser user, OverwritePermissions perms, RequestOptions options) { @@ -421,8 +424,9 @@ public static async Task RemovePermissionOverwriteAsync(IGuildChannel channel, B { await client.ApiClient.DeleteChannelPermissionAsync(channel.Id, role.Id, options).ConfigureAwait(false); } + #endregion - //Users + #region Users /// Resolving permissions requires the parent guild to be downloaded. public static async Task GetUserAsync(IGuildChannel channel, IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) @@ -467,8 +471,9 @@ public static IAsyncEnumerable> GetUsersAsync count: limit ); } + #endregion - //Typing + #region Typing public static async Task TriggerTypingAsync(IMessageChannel channel, BaseDiscordClient client, RequestOptions options = null) { @@ -477,8 +482,9 @@ public static async Task TriggerTypingAsync(IMessageChannel channel, BaseDiscord public static IDisposable EnterTypingState(IMessageChannel channel, BaseDiscordClient client, RequestOptions options) => new TypingNotifier(channel, options); + #endregion - //Webhooks + #region Webhooks public static async Task CreateWebhookAsync(ITextChannel channel, BaseDiscordClient client, string name, Stream avatar, RequestOptions options) { var args = new CreateWebhookParams { Name = name }; @@ -501,7 +507,9 @@ public static async Task> GetWebhooksAsync(ITex return models.Select(x => RestWebhook.Create(client, channel, x)) .ToImmutableArray(); } - // Categories + #endregion + + #region Categories public static async Task GetCategoryAsync(INestedChannel channel, BaseDiscordClient client, RequestOptions options) { // if no category id specified, return null @@ -515,7 +523,8 @@ public static async Task GetCategoryAsync(INestedChannel chann public static async Task SyncPermissionsAsync(INestedChannel channel, BaseDiscordClient client, RequestOptions options) { var category = await GetCategoryAsync(channel, client, options).ConfigureAwait(false); - if (category == null) throw new InvalidOperationException("This channel does not have a parent channel."); + if (category == null) + throw new InvalidOperationException("This channel does not have a parent channel."); var apiArgs = new ModifyGuildChannelParams { @@ -530,5 +539,6 @@ public static async Task SyncPermissionsAsync(INestedChannel channel, BaseDiscor }; await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); } + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index 6fe2c862c7..57869ea581 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -15,6 +15,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestDMChannel : RestChannel, IDMChannel, IRestPrivateChannel, IRestMessageChannel { + #region RestDMChannel /// /// Gets the current logged-in user. /// @@ -154,20 +155,24 @@ public IDisposable EnterTypingState(RequestOptions options = null) /// public override string ToString() => $"@{Recipient}"; private string DebuggerDisplay => $"@{Recipient} ({Id}, DM)"; + #endregion - //IDMChannel + #region IDMChannel /// IUser IDMChannel.Recipient => Recipient; + #endregion - //IRestPrivateChannel + #region IRestPrivateChannel /// IReadOnlyCollection IRestPrivateChannel.Recipients => ImmutableArray.Create(Recipient); + #endregion - //IPrivateChannel + #region IPrivateChannel /// IReadOnlyCollection IPrivateChannel.Recipients => ImmutableArray.Create(Recipient); + #endregion - //IMessageChannel + #region IMessageChannel /// async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) { @@ -212,8 +217,9 @@ async Task IMessageChannel.SendFileAsync(Stream stream, string fil /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + #endregion - //IChannel + #region IChannel /// string IChannel.Name => $"@{Recipient}"; @@ -223,5 +229,6 @@ Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions optio /// IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index 25d34cd0b5..1b5df0d870 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -16,6 +16,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestGroupChannel : RestChannel, IGroupChannel, IRestPrivateChannel, IRestMessageChannel, IRestAudioChannel { + #region RestGroupChannel private string _iconId; private ImmutableDictionary _users; @@ -143,14 +144,17 @@ public IDisposable EnterTypingState(RequestOptions options = null) public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id}, Group)"; + #endregion - //ISocketPrivateChannel + #region ISocketPrivateChannel IReadOnlyCollection IRestPrivateChannel.Recipients => Recipients; + #endregion - //IPrivateChannel + #region IPrivateChannel IReadOnlyCollection IPrivateChannel.Recipients => Recipients; + #endregion - //IMessageChannel + #region IMessageChannel async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) @@ -190,17 +194,20 @@ async Task IMessageChannel.SendFileAsync(Stream stream, string fil async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + #endregion - //IAudioChannel + #region IAudioChannel /// /// Connecting to a group channel is not supported. Task IAudioChannel.ConnectAsync(bool selfDeaf, bool selfMute, bool external) { throw new NotSupportedException(); } Task IAudioChannel.DisconnectAsync() { throw new NotSupportedException(); } + #endregion - //IChannel + #region IChannel Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetUser(id)); IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => ImmutableArray.Create>(Users).ToAsyncEnumerable(); + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs b/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs index ec8f60ae52..d77d3b6261 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs @@ -9,6 +9,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestBan : IBan { + #region RestBan /// /// Gets the banned user. /// @@ -37,9 +38,11 @@ internal static RestBan Create(BaseDiscordClient client, Model model) /// public override string ToString() => User.ToString(); private string DebuggerDisplay => $"{User}: {Reason}"; +#endregion - //IBan + #region IBan /// IUser IBan.User => User; + #endregion } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs index 63b89035b3..40e45b1354 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGroupUser.cs @@ -10,6 +10,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestGroupUser : RestUser, IGroupUser { + #region RestGroupUser internal RestGroupUser(BaseDiscordClient discord, ulong id) : base(discord, id) { @@ -20,8 +21,9 @@ internal RestGroupUser(BaseDiscordClient discord, ulong id) entity.Update(model); return entity; } +#endregion - //IVoiceState + #region IVoiceState /// bool IVoiceState.IsDeafened => false; /// @@ -40,5 +42,6 @@ internal RestGroupUser(BaseDiscordClient discord, ulong id) bool IVoiceState.IsStreaming => false; /// DateTimeOffset? IVoiceState.RequestToSpeakTimestamp => null; + #endregion } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 7e3531d2a4..f465571d61 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -24,6 +24,7 @@ namespace Discord.WebSocket /// public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient { + #region DiscordSocketClient private readonly ConcurrentQueue _largeGuilds; internal readonly JsonSerializer _serializer; private readonly DiscordShardedClient _shardedClient; @@ -62,6 +63,7 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient /// public override IActivity Activity { get => _activity.GetValueOrDefault(); protected set => _activity = Optional.Create(value); } private Optional _activity; + #endregion //From DiscordSocketConfig internal int TotalShards { get; private set; } @@ -436,7 +438,7 @@ public async Task CreateGlobalApplicationCommandAsync( var entity = State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(this, model)); - // update it incase it was cached + //Update it incase it was cached entity.Update(model); return entity; @@ -448,7 +450,7 @@ public async Task> BulkOverwriteGl var entities = models.Select(x => SocketApplicationCommand.Create(this, x)); - // purge our previous commands + //Purge our previous commands State.PurgeCommands(x => x.IsGlobalCommand); foreach(var entity in entities) @@ -513,7 +515,7 @@ public override async Task GetStickerAsync(ulong id, CacheMode mo { var guild = State.GetGuild(model.GuildId.Value); - // since the sticker can be from another guild, check if we are in the guild or its in the cache + //Since the sticker can be from another guild, check if we are in the guild or its in the cache if (guild != null) sticker = guild.AddOrUpdateSticker(model); else @@ -678,7 +680,7 @@ await ApiClient.SendPresenceUpdateAsync( return null; GameModel game = null; - // Discord only accepts rich presence over RPC, don't even bother building a payload + //Discord only accepts rich presence over RPC, don't even bother building a payload if (activity.GetValueOrDefault() != null) { @@ -700,6 +702,7 @@ await ApiClient.SendPresenceUpdateAsync( game); } + #region ProcessMessageAsync private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string type, object payload) { if (seq != null) @@ -772,7 +775,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty case GatewayOpCode.Dispatch: switch (type) { - //Connection + #region Connection case "READY": { try @@ -849,8 +852,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty await _gatewayLogger.InfoAsync("Resumed previous session").ConfigureAwait(false); } break; + #endregion - //Guilds + #region Guilds case "GUILD_CREATE": { var data = (payload as JToken).ToObject(_serializer); @@ -1000,8 +1004,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - //Channels + #region Channels case "CHANNEL_CREATE": { await _gatewayLogger.DebugAsync("Received Dispatch (CHANNEL_CREATE)").ConfigureAwait(false); @@ -1103,8 +1108,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - //Members + #region Members case "GUILD_MEMBER_ADD": { await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_MEMBER_ADD)").ConfigureAwait(false); @@ -1275,8 +1281,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - //Roles + #region Roles case "GUILD_ROLE_CREATE": { await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_ROLE_CREATE)").ConfigureAwait(false); @@ -1368,8 +1375,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - //Bans + #region Bans case "GUILD_BAN_ADD": { await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_BAN_ADD)").ConfigureAwait(false); @@ -1422,8 +1430,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - //Messages + #region Messages case "MESSAGE_CREATE": { await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_CREATE)").ConfigureAwait(false); @@ -1754,8 +1763,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty await TimedInvokeAsync(_messagesBulkDeletedEvent, nameof(MessagesBulkDeleted), cacheableList, cacheableChannel).ConfigureAwait(false); } break; + #endregion - //Statuses + #region Statuses case "PRESENCE_UPDATE": { await _gatewayLogger.DebugAsync("Received Dispatch (PRESENCE_UPDATE)").ConfigureAwait(false); @@ -1843,8 +1853,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty await TimedInvokeAsync(_userIsTypingEvent, nameof(UserIsTyping), cacheableUser, cacheableChannel).ConfigureAwait(false); } break; + #endregion - //Users + #region Users case "USER_UPDATE": { await _gatewayLogger.DebugAsync("Received Dispatch (USER_UPDATE)").ConfigureAwait(false); @@ -1863,8 +1874,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - //Voice + #region Voice case "VOICE_STATE_UPDATE": { await _gatewayLogger.DebugAsync("Received Dispatch (VOICE_STATE_UPDATE)").ConfigureAwait(false); @@ -1901,7 +1913,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty after = SocketVoiceState.Create(null, data); } - // per g250k, this should always be sent, but apparently not always + //Per g250k, this should always be sent, but apparently not always user = guild.GetUser(data.UserId) ?? (data.Member.IsSpecified ? guild.AddOrUpdateUser(data.Member.Value) : null); if (user == null) @@ -1993,8 +2005,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } break; + #endregion - //Invites + #region Invites case "INVITE_CREATE": { await _gatewayLogger.DebugAsync("Received Dispatch (INVITE_CREATE)").ConfigureAwait(false); @@ -2051,8 +2064,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - // Interactions + #region Interactions case "INTERACTION_CREATE": { await _gatewayLogger.DebugAsync("Received Dispatch (INTERACTION_CREATE)").ConfigureAwait(false); @@ -2189,8 +2203,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty await TimedInvokeAsync(_applicationCommandDeleted, nameof(ApplicationCommandDeleted), applicationCommand).ConfigureAwait(false); } break; + #endregion - // Threads + #region Threads case "THREAD_CREATE": { await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_CREATE)").ConfigureAwait(false); @@ -2251,7 +2266,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } else { - // Thread is updated but was not cached, likely meaning the thread was unarchived. + //Thread is updated but was not cached, likely meaning the thread was unarchived. threadChannel = (SocketThreadChannel)guild.AddChannel(State, data); if (data.ThreadMember.IsSpecified) threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); @@ -2507,8 +2522,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion - //Ignored (User only) + #region Ignored (User only) case "CHANNEL_PINS_ACK": await _gatewayLogger.DebugAsync("Ignored Dispatch (CHANNEL_PINS_ACK)").ConfigureAwait(false); break; @@ -2530,11 +2546,13 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty case "WEBHOOKS_UPDATE": await _gatewayLogger.DebugAsync("Ignored Dispatch (WEBHOOKS_UPDATE)").ConfigureAwait(false); break; + #endregion - //Others + #region Others default: await _gatewayLogger.WarningAsync($"Unknown Dispatch ({type})").ConfigureAwait(false); break; + #endregion } break; default: @@ -2548,6 +2566,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty Console.WriteLine(ex); } } + #endregion private async Task RunHeartbeatAsync(int intervalMillis, CancellationToken cancelToken) { diff --git a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs index cbe575075b..46f5c1a268 100644 --- a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs @@ -9,7 +9,7 @@ internal static class EntityExtensions { public static IActivity ToEntity(this API.Game model) { - // Custom Status Game + #region Custom Status Game if (model.Id.IsSpecified && model.Id.Value == "custom") { return new CustomStatusGame() @@ -21,13 +21,14 @@ public static IActivity ToEntity(this API.Game model) CreatedAt = DateTimeOffset.FromUnixTimeMilliseconds(model.CreatedAt.Value), }; } + #endregion - // Spotify Game + #region Spotify Game if (model.SyncId.IsSpecified) { var assets = model.Assets.GetValueOrDefault()?.ToEntity(); string albumText = assets?[1]?.Text; - string albumArtId = assets?[1]?.ImageId?.Replace("spotify:",""); + string albumArtId = assets?[1]?.ImageId?.Replace("spotify:", ""); var timestamps = model.Timestamps.IsSpecified ? model.Timestamps.Value.ToEntity() : null; return new SpotifyGame { @@ -37,7 +38,7 @@ public static IActivity ToEntity(this API.Game model) TrackUrl = CDN.GetSpotifyDirectUrl(model.SyncId.Value), AlbumTitle = albumText, TrackTitle = model.Details.GetValueOrDefault(), - Artists = model.State.GetValueOrDefault()?.Split(';').Select(x=>x?.Trim()).ToImmutableArray(), + Artists = model.State.GetValueOrDefault()?.Split(';').Select(x => x?.Trim()).ToImmutableArray(), StartedAt = timestamps?.Start, EndsAt = timestamps?.End, Duration = timestamps?.End - timestamps?.Start, @@ -46,8 +47,9 @@ public static IActivity ToEntity(this API.Game model) Flags = model.Flags.GetValueOrDefault(), }; } + #endregion - // Rich Game + #region Rich Game if (model.ApplicationId.IsSpecified) { ulong appId = model.ApplicationId.Value; @@ -66,7 +68,9 @@ public static IActivity ToEntity(this API.Game model) Flags = model.Flags.GetValueOrDefault() }; } - // Stream Game + #endregion + + #region Stream Game if (model.StreamUrl.IsSpecified) { return new StreamingGame( @@ -77,10 +81,13 @@ public static IActivity ToEntity(this API.Game model) Details = model.Details.GetValueOrDefault() }; } - // Normal Game + #endregion + + #region Normal Game return new Game(model.Name, model.Type.GetValueOrDefault() ?? ActivityType.Playing, model.Flags.IsSpecified ? model.Flags.Value : ActivityProperties.None, model.Details.GetValueOrDefault()); + #endregion } // (Small, Large) From 3b99ce5191d0ff66ad96f8149ccc7a4811e85ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Wed, 22 Sep 2021 13:44:31 +0200 Subject: [PATCH 267/494] Discord.net.core.xml fix (#178) * Changed Label to Description * Added Discord- .MessageComponent .ISticker[] ,Discord.MessageComponent,Discord.ISticker[] to ReplyAsync --- src/Discord.Net.Core/Discord.Net.Core.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 107895dfbd..9ca871377b 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -5653,7 +5653,7 @@ Gets or sets this menu options description. length exceeds . - length subceeds 1. + length subceeds 1. @@ -10979,7 +10979,7 @@ - + Sends an inline reply that references a message. From 0bff21ffc13528d951a9323f19692269d757ffea Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 22 Sep 2021 09:57:43 -0300 Subject: [PATCH 268/494] Remove references to labs --- Discord.Net.sln | 20 ++------ .../Discord.Net.Commands.csproj | 25 ++-------- src/Discord.Net.Core/Discord.Net.Core.csproj | 28 ++--------- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 27 ++--------- .../Discord - Backup.Net.WebSocket.csproj | 27 ----------- .../Discord.Net.WebSocket.csproj | 31 ++----------- .../Discord.Net.Webhook.csproj | 25 ++-------- src/Discord.Net/Discord.Net.nuspec | 46 +++++++++---------- 8 files changed, 42 insertions(+), 187 deletions(-) delete mode 100644 src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj diff --git a/Discord.Net.sln b/Discord.Net.sln index 9f888cd124..61f8ba506f 100644 --- a/Discord.Net.sln +++ b/Discord.Net.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31521.260 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28407.52 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Core", "src\Discord.Net.Core\Discord.Net.Core.csproj", "{91E9E7BD-75C9-4E98-84AA-2C271922E5C2}" EndProject @@ -40,7 +40,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -232,18 +232,6 @@ Global {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.Build.0 = Release|Any CPU {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.ActiveCfg = Release|Any CPU {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.Build.0 = Release|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x64.ActiveCfg = Debug|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x64.Build.0 = Debug|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x86.ActiveCfg = Debug|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x86.Build.0 = Debug|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|Any CPU.Build.0 = Release|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x64.ActiveCfg = Release|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x64.Build.0 = Release|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x86.ActiveCfg = Release|Any CPU - {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -270,4 +258,4 @@ Global GlobalSection(CodealikeProperties) = postSolution SolutionGuid = a45217b4-a401-4dbf-8654-34d2ec034cd9 EndGlobalSection -EndGlobal +EndGlobal \ No newline at end of file diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index d38ea4dd04..ec2795de26 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -1,34 +1,15 @@ - + Discord.Net.Commands Discord.Commands - A Discord.Net Labs extension adding support for bot commands. + A Discord.Net extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 3.0.0 - Discord.Net.Labs.Commands - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png - - - ..\Discord.Net.Commands\Discord.Net.Commands.xml - - - True - - - - - - Always - - - + \ No newline at end of file diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index a5fdbf230d..0eb111bab1 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,23 +1,12 @@ - + Discord.Net.Core Discord - The core components for the Discord.Net Labs library. + The core components for the Discord.Net library. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - Discord.Net.Labs.Core - 3.1.0 - Discord.Net.Labs.Core - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png - 3.1.0 - 3.1.0 - false - - - ..\Discord.Net.Core\Discord.Net.Core.xml @@ -27,15 +16,4 @@ all - - - True - - - - - - Always - - - + \ No newline at end of file diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 2159f5117b..3ed886616a 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -1,22 +1,12 @@  - + Discord.Net.Rest Discord.Rest - A core Discord.Net Labs library containing the REST client and models. + A core Discord.Net library containing the REST client and models. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - Temporary.png - https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.1.0 - Discord.Net.Labs.Rest - https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.1.0 - 3.1.0 - - - ..\Discord.Net.Rest\Discord.Net.Rest.xml @@ -24,15 +14,4 @@ - - - True - - - - - - Always - - - + \ No newline at end of file diff --git a/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj deleted file mode 100644 index e3a5104e7c..0000000000 --- a/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Discord.Net.WebSocket - Discord.WebSocket - A core Discord.Net Labs library containing the WebSocket client and models. - net461;netstandard2.0;netstandard2.1 - netstandard2.0;netstandard2.1 - true - 2.3.1 - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png - Discord.Net.Labs.WebSocket - - - - - - - - True - - - - diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index f166cab117..4121e7d001 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,41 +1,16 @@  - + Discord.Net.WebSocket Discord.WebSocket - A core Discord.Net Labs library containing the WebSocket client and models. + A core Discord.Net library containing the WebSocket client and models. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.1.0 - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png - Discord.Net.Labs.WebSocket - - ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.1.0 - 3.1.0 - - - TRACE - - - - - True - - - - - - Always - - - + \ No newline at end of file diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index cf9d10de1f..036d8c9a8b 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -1,33 +1,14 @@  - + Discord.Net.Webhook Discord.Webhook - A core Discord.Net Labs library containing the Webhook client and models. + A core Discord.Net library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 3.0.0 - Discord.Net.Labs.Webhook - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png - - - ..\Discord.Net.Webhook\Discord.Net.Webhook.xml - - - True - - - - - - Always - - - + \ No newline at end of file diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 5f15cf79a3..cb773a379a 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -1,39 +1,39 @@ - Discord.Net.Labs - 3.1.0$suffix$ - Discord.Net Labs + Discord.Net + 3.0.0-dev$suffix$ + Discord.Net Discord.Net Contributors - quinchs - An experimental fork of Discord.NET that adds all the new discord features to play around with! This metapackage includes all of the optional Discord.Net Labs components. + foxbot + An asynchronous API wrapper for Discord. This metapackage includes all of the optional Discord.Net components. discord;discordapp - https://github.com/Discord-Net-Labs/Discord.Net-Labs + https://github.com/RogueException/Discord.Net http://opensource.org/licenses/MIT false - https://avatars.githubusercontent.com/u/84047264 + https://github.com/RogueException/Discord.Net/raw/dev/docs/marketing/logo/PackageLogo.png - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + \ No newline at end of file From a92c6eab869ea46fcbe70880f84042fe34f4f351 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 22 Sep 2021 10:00:19 -0300 Subject: [PATCH 269/494] Update Discord.Net.sln --- Discord.Net.sln | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Discord.Net.sln b/Discord.Net.sln index 61f8ba506f..084d8a8343 100644 --- a/Discord.Net.sln +++ b/Discord.Net.sln @@ -40,7 +40,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -258,4 +258,4 @@ Global GlobalSection(CodealikeProperties) = postSolution SolutionGuid = a45217b4-a401-4dbf-8654-34d2ec034cd9 EndGlobalSection -EndGlobal \ No newline at end of file +EndGlobal From 5987af766adbd02ca1ddbc973ba7dd0e9e10388c Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Wed, 22 Sep 2021 10:02:13 -0400 Subject: [PATCH 270/494] 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 --- .../Entities/Permissions/GuildPermission.cs | 28 ++++++++-- .../Entities/Permissions/GuildPermissions.cs | 51 ++++++++++++------- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs index 89ee20b9fb..53b666b1a6 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs @@ -192,17 +192,35 @@ public enum GuildPermission : ulong /// ManageThreads = 0x04_00_00_00_00, /// - /// Allows for creating and participating in threads. + /// Allows for creating public threads. /// - UsePublicThreads = 0x08_00_00_00_00, + CreatePublicThreads = 0x08_00_00_00_00, /// - /// Allows for creating and participating in private threads. + /// Allows for creating private threads. /// - UsePrivateThreads = 0x10_00_00_00_00, + CreatePrivateThreads = 0x10_00_00_00_00, + /// + /// Allows for creating public threads. + /// + [Obsolete("UsePublicThreads has been replaced by CreatePublicThreads and SendMessagesInThreads")] + UsePublicThreads = 0x08_00_00_00_00, + /// + /// Allows for creating private threads. + /// + [Obsolete("UsePrivateThreads has been replaced by CreatePrivateThreads and SendMessagesInThreads")] + UsePrivateThreads = 0x10_00_00_00_00, /// /// Allows the usage of custom stickers from other servers. /// - UseExternalStickers = 0x20_00_00_00_00 + UseExternalStickers = 0x20_00_00_00_00, + /// + /// Allows for sending messages in threads. + /// + SendMessagesInThreads = 0x40_00_00_00_00, + /// + /// Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. + /// + StartEmbeddedActivities = 0x80_00_00_00_00 } } diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 6c03ed0adb..05a2a76800 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -12,7 +12,7 @@ public struct GuildPermissions /// Gets a that grants all guild permissions for webhook users. public static readonly GuildPermissions Webhook = new GuildPermissions(0b00000_0000000_0001101100000_000000); /// Gets a that grants all guild permissions. - public static readonly GuildPermissions All = new GuildPermissions(0b11111111_11111_1111111_1111111111111_11111); + public static readonly GuildPermissions All = new GuildPermissions(0b1111111111_11111_1111111_1111111111111_11111); /// Gets a packed value representing all the permissions in this . public ulong RawValue { get; } @@ -90,11 +90,15 @@ public struct GuildPermissions /// If true, a user may manage threads in this guild. public bool ManageThreads => Permissions.GetValue(RawValue, GuildPermission.ManageThreads); /// If true, a user may create public threads in this guild. - public bool UsePublicThreads => Permissions.GetValue(RawValue, GuildPermission.UsePublicThreads); + public bool CreatePublicThreads => Permissions.GetValue(RawValue, GuildPermission.CreatePublicThreads); /// If true, a user may create private threads in this guild. - public bool UsePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.UsePrivateThreads); + public bool CreatePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.CreatePrivateThreads); /// If true, a user may use external stickers in this guild. public bool UseExternalStickers => Permissions.GetValue(RawValue, GuildPermission.UseExternalStickers); + /// If true, a user may send messages in threads in this guild. + public bool SendMessagesInThreads => Permissions.GetValue(RawValue, GuildPermission.SendMessagesInThreads); + /// If true, a user launch application activites in voice channels in this guild. + public bool StartEmbeddedActivities => Permissions.GetValue(RawValue, GuildPermission.StartEmbeddedActivities); /// Creates a new with the provided packed value. public GuildPermissions(ulong rawValue) { RawValue = rawValue; } @@ -137,9 +141,11 @@ private GuildPermissions(ulong initialValue, bool? useSlashCommands = null, bool? requestToSpeak = null, bool? manageThreads = null, - bool? usePublicThreads = null, - bool? usePrivateThreads = null, - bool? useExternalStickers = null) + bool? createPublicThreads = null, + bool? createPrivateThreads = null, + bool? useExternalStickers = null, + bool? sendMessagesInThreads = null, + bool? startEmbeddedActivities = null) { ulong value = initialValue; @@ -177,9 +183,11 @@ private GuildPermissions(ulong initialValue, Permissions.SetValue(ref value, useSlashCommands, GuildPermission.UseSlashCommands); Permissions.SetValue(ref value, requestToSpeak, GuildPermission.RequestToSpeak); Permissions.SetValue(ref value, manageThreads, GuildPermission.ManageThreads); - Permissions.SetValue(ref value, usePublicThreads, GuildPermission.UsePublicThreads); - Permissions.SetValue(ref value, usePrivateThreads, GuildPermission.UseExternalStickers); + Permissions.SetValue(ref value, createPublicThreads, GuildPermission.CreatePublicThreads); + Permissions.SetValue(ref value, createPrivateThreads, GuildPermission.CreatePrivateThreads); Permissions.SetValue(ref value, useExternalStickers, GuildPermission.UseExternalStickers); + Permissions.SetValue(ref value, sendMessagesInThreads, GuildPermission.SendMessagesInThreads); + Permissions.SetValue(ref value, startEmbeddedActivities, GuildPermission.StartEmbeddedActivities); RawValue = value; } @@ -220,9 +228,11 @@ public GuildPermissions( bool useSlashCommands = false, bool requestToSpeak = false, bool manageThreads = false, - bool usePublicThreads = false, - bool usePrivateThreads = false, - bool useExternalStickers = false) + bool createPublicThreads = false, + bool createPrivateThreads = false, + bool useExternalStickers = false, + bool sendMessagesInThreads = false, + bool startEmbeddedActivities = false) : this(0, createInstantInvite: createInstantInvite, manageRoles: manageRoles, @@ -258,9 +268,11 @@ public GuildPermissions( useSlashCommands: useSlashCommands, requestToSpeak: requestToSpeak, manageThreads: manageThreads, - usePublicThreads: usePublicThreads, - usePrivateThreads: usePrivateThreads, - useExternalStickers: useExternalStickers) + createPublicThreads: createPublicThreads, + createPrivateThreads: createPrivateThreads, + useExternalStickers: useExternalStickers, + sendMessagesInThreads: sendMessagesInThreads, + startEmbeddedActivities: startEmbeddedActivities) { } /// Creates a new from this one, changing the provided non-null permissions. @@ -299,14 +311,17 @@ public GuildPermissions Modify( bool? useSlashCommands = null, bool? requestToSpeak = null, bool? manageThreads = null, - bool? usePublicThreads = null, - bool? usePrivateThreads = null, - bool? useExternalStickers = null) + bool? createPublicThreads = null, + bool? createPrivateThreads = null, + bool? useExternalStickers = null, + bool? sendMessagesInThreads = null, + bool? startEmbeddedActivities = null) => new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions, viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers, - useSlashCommands, requestToSpeak, manageThreads, usePublicThreads, usePrivateThreads, useExternalStickers); + useSlashCommands, requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, useExternalStickers, sendMessagesInThreads, + startEmbeddedActivities); /// /// Returns a value that indicates if a specific is enabled From 016c1dc80aabdd49f6ff355ff15dba6fbf30e2d8 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 23 Sep 2021 07:03:14 -0300 Subject: [PATCH 271/494] Squashed commit of the following: commit dca41a348e36a9b4e7006ef3a76377eb32aad276 Author: quin lynch Date: Thu Sep 23 07:02:19 2021 -0300 Autocomplete commands --- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 154 +++++++++++++++--- .../Interactions/ApplicationCommandOption.cs | 18 +- .../Interactions/AutocompleteOption.cs | 42 +++++ .../Interactions/AutocompleteResult.cs | 90 ++++++++++ .../Interactions/InteractionResponseType.cs | 11 +- .../Entities/Interactions/InteractionType.cs | 5 + .../SlashCommandBuilder.cs | 25 ++- .../SlashCommandProperties.cs | 0 .../API/Common/ApplicationCommandOption.cs | 4 + .../API/Common/AutocompleteInteractionData.cs | 27 +++ .../AutocompleteInteractionDataOption.cs | 24 +++ .../API/Common/InteractionCallbackData.cs | 3 + .../Interactions/InteractionHelper.cs | 22 +++ .../Net/Converters/InteractionConverter.cs | 7 + .../Discord.Net.WebSocket.xml | 104 +++++++++++- .../SocketAutocompleteInteraction.cs | 97 +++++++++++ .../SocketAutocompleteInteractionData.cs | 60 +++++++ .../SocketBaseCommand/SocketCommandBase.cs | 14 +- .../Entities/Interaction/SocketInteraction.cs | 29 ++-- 20 files changed, 681 insertions(+), 57 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs create mode 100644 src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs rename src/Discord.Net.Core/Entities/Interactions/{ => Slash Commands}/SlashCommandBuilder.cs (95%) rename src/Discord.Net.Core/Entities/Interactions/{ => Slash Commands}/SlashCommandProperties.cs (100%) create mode 100644 src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs create mode 100644 src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs create mode 100644 src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index a5fdbf230d..7f494db1a2 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,4 +1,4 @@ - + diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 9ca871377b..ece4d69d4a 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4508,37 +4508,42 @@ - The name of this option. + Gets or sets the name of this option. - The description of this option. + Gets or sets the description of this option. - The type of this option. + Gets or sets the type of this option. - The first required option for the user to complete. only one option can be default. + Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - if this option is required for this command, otherwise . + Gets or sets if the option is required. + + + + + Gets or sets whether or not this option supports autocomplete - choices for string and int types for the user to pick from. + Gets or sets the choices for string and int types for the user to pick from. - If the option is a subcommand or subcommand group type, this nested options will be the parameters. + Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. @@ -4649,6 +4654,68 @@ ApplicationCommandType.Message is Context Menu Message command type + + + Represents an autocomplete option. + + + + + Gets the type of this option + + + + + Gets the name of the option. + + + + + Gets the value of the option. + + + + + Gets whether or not this option is focused by the executing user. + + + + + Represents a result to an autocomplete interaction. + + + + + Gets or sets the name of the result. + + + Name cannot be null and has to be between 1-100 characters in length. + + + + + + + Gets or sets the value of the result. + + + Only , , and are allowed for a value. + + + + + + + Creates a new . + + + + + Creates a new with the passed in and . + + + + A class used to build Message commands. @@ -5029,12 +5096,17 @@ - for components: ACK an interaction and edit the original message later; the user does not see a loading state + For components: ACK an interaction and edit the original message later; the user does not see a loading state - for components: edit the message the component was attached to + For components: edit the message the component was attached to + + + + + Respond with a set of choices to a autocomplete interaction @@ -5057,6 +5129,11 @@ A sent from discord. + + + An autocomplete request sent from discord. + + Represents a Row for child components to live in. @@ -5934,7 +6011,7 @@ The default permission value to set. The current builder. - + Adds an option to the current slash command. @@ -5987,37 +6064,42 @@ - The name of this option. + Gets or sets the name of this option. - The description of this option. + Gets or sets the description of this option. - The type of this option. + Gets or sets the type of this option. - The first required option for the user to complete. only one option can be default. + Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - if this option is required for this command, otherwise . + Gets or sets if the option is required. + + + + + Gets or sets whether or not this option supports autocomplete. - choices for string and int types for the user to pick from. + Gets or sets the choices for string and int types for the user to pick from. - If the option is a subcommand or subcommand group type, this nested options will be the parameters. + Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. @@ -8876,14 +8958,24 @@ authentication when used on a guild that has server-wide 2FA enabled. + + + Allows for creating public threads. + + + + + Allows for creating private threads. + + - Allows for creating and participating in threads. + Allows for creating public threads. - Allows for creating and participating in private threads. + Allows for creating private threads. @@ -8891,6 +8983,16 @@ Allows the usage of custom stickers from other servers. + + + Allows for sending messages in threads. + + + + + Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. + + Gets a blank that grants no permissions. @@ -9005,25 +9107,31 @@ If true, a user may manage threads in this guild. - + If true, a user may create public threads in this guild. - + If true, a user may create private threads in this guild. If true, a user may use external stickers in this guild. + + If true, a user may send messages in threads in this guild. + + + If true, a user launch application activites in voice channels in this guild. + Creates a new with the provided packed value. Creates a new with the provided packed value after converting to ulong. - + Creates a new structure with the provided permissions. - + Creates a new from this one, changing the provided non-null permissions. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index 8d6e22ec1d..cca832874e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -16,7 +16,7 @@ public class ApplicationCommandOptionProperties private string _description; /// - /// The name of this option. + /// Gets or sets the name of this option. /// public string Name { @@ -37,7 +37,7 @@ public string Name } /// - /// The description of this option. + /// Gets or sets the description of this option. /// public string Description { @@ -53,27 +53,31 @@ public string Description } /// - /// The type of this option. + /// Gets or sets the type of this option. /// public ApplicationCommandOptionType Type { get; set; } /// - /// The first required option for the user to complete. only one option can be default. + /// Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. /// public bool? Default { get; set; } /// - /// if this option is required for this command, otherwise . + /// Gets or sets if the option is required. /// public bool? Required { get; set; } /// - /// choices for string and int types for the user to pick from. + /// Gets or sets whether or not this option supports autocomplete. + /// + public bool Autocomplete { get; set; } + /// + /// Gets or sets the choices for string and int types for the user to pick from. /// public List Choices { get; set; } /// - /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. /// public List Options { get; set; } diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs new file mode 100644 index 0000000000..9fe461d6f2 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents an autocomplete option. + /// + public class AutocompleteOption + { + /// + /// Gets the type of this option + /// + public ApplicationCommandOptionType Type { get; } + + /// + /// Gets the name of the option. + /// + public string Name { get; } + + /// + /// Gets the value of the option. + /// + public object Value { get; } + + /// + /// Gets whether or not this option is focused by the executing user. + /// + public bool Focused { get; } + + internal AutocompleteOption(ApplicationCommandOptionType type, string name, object value, bool focused) + { + this.Type = type; + this.Name = name; + this.Value = value; + this.Focused = focused; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs new file mode 100644 index 0000000000..881eef80db --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a result to an autocomplete interaction. + /// + public class AutocompleteResult + { + private object _value { get; set; } + private string _name { get; set; } + + /// + /// Gets or sets the name of the result. + /// + /// + /// Name cannot be null and has to be between 1-100 characters in length. + /// + /// + /// + public string Name + { + get => _name; + set + { + if (value == null) + throw new ArgumentException("Name cannot be null!"); + if (value.Length > 100) + throw new ArgumentException("Name length must be less than or equal to 100 characters in length!"); + if (value.Length < 1) + throw new ArgumentException("Name length must at least 1 character in length!"); + _name = value; + } + } + + /// + /// Gets or sets the value of the result. + /// + /// + /// Only , , and are allowed for a value. + /// + /// + /// + public object Value + { + get => _value; + set + { + if (value == null) + throw new ArgumentNullException("Value cannot be null"); + + switch (value) + { + case string str: + _value = str; + break; + case int integer: + _value = integer; + break; + case double number: + _value = number; + break; + + default: + throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"); + } + } + } + + /// + /// Creates a new . + /// + public AutocompleteResult() { } + + /// + /// Creates a new with the passed in and . + /// + /// + /// + public AutocompleteResult(string name, object value) + { + this.Name = name; + this.Value = value; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index d34c282ef2..de30ad8688 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -45,13 +45,18 @@ public enum InteractionResponseType : byte DeferredChannelMessageWithSource = 5, /// - /// for components: ACK an interaction and edit the original message later; the user does not see a loading state + /// For components: ACK an interaction and edit the original message later; the user does not see a loading state /// DeferredUpdateMessage = 6, /// - /// for components: edit the message the component was attached to + /// For components: edit the message the component was attached to /// - UpdateMessage = 7 + UpdateMessage = 7, + + /// + /// Respond with a set of choices to a autocomplete interaction + /// + ApplicationCommandAutocompleteResult = 8 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs index 4da39b58ec..989114505b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs @@ -25,5 +25,10 @@ public enum InteractionType : byte /// A sent from discord. /// MessageComponent = 3, + + /// + /// An autocomplete request sent from discord. + /// + ApplicationCommandAutocomplete = 4, } } diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs similarity index 95% rename from src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs rename to src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 0f3ae1d2d4..1a152feb4e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -165,7 +165,7 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// The choices of this option. /// The current builder. public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool required = true, bool isDefault = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool required = true, bool isDefault = false, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -197,6 +197,7 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t option.Default = isDefault; option.Options = options; option.Type = type; + option.Autocomplete = isAutocomplete; option.Choices = choices != null ? new List(choices) : null; return AddOption(option); @@ -288,7 +289,7 @@ public class SlashCommandOptionBuilder private string _description; /// - /// The name of this option. + /// Gets or sets the name of this option. /// public string Name { @@ -309,7 +310,7 @@ public string Name } /// - /// The description of this option. + /// Gets or sets the description of this option. /// public string Description { @@ -326,27 +327,32 @@ public string Description } /// - /// The type of this option. + /// Gets or sets the type of this option. /// public ApplicationCommandOptionType Type { get; set; } /// - /// The first required option for the user to complete. only one option can be default. + /// Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. /// public bool? Default { get; set; } /// - /// if this option is required for this command, otherwise . + /// Gets or sets if the option is required. /// public bool Required { get; set; } /// - /// choices for string and int types for the user to pick from. + /// Gets or sets whether or not this option supports autocomplete. + /// + public bool Autocomplete { get; set; } + + /// + /// Gets or sets the choices for string and int types for the user to pick from. /// public List Choices { get; set; } /// - /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. /// public List Options { get; set; } @@ -372,7 +378,8 @@ public ApplicationCommandOptionProperties Build() Required = this.Required, Type = this.Type, Options = this.Options?.Count > 0 ? new List(this.Options.Select(x => x.Build())) : null, - Choices = this.Choices + Choices = this.Choices, + Autocomplete = this.Autocomplete }; } diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs similarity index 100% rename from src/Discord.Net.Core/Entities/Interactions/SlashCommandProperties.cs rename to src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 3a94117201..2169e601e6 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -30,6 +30,9 @@ internal class ApplicationCommandOption [JsonProperty("options")] public Optional Options { get; set; } + [JsonProperty("autocomplete")] + public Optional Autocomplete { get; set; } + public ApplicationCommandOption() { } public ApplicationCommandOption(IApplicationCommandOption cmd) @@ -78,6 +81,7 @@ public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties optio this.Name = option.Name; this.Type = option.Type; this.Description = option.Description; + this.Autocomplete = option.Autocomplete; } } } diff --git a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs new file mode 100644 index 0000000000..ea2cd4fd9d --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs @@ -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 +{ + internal class AutocompleteInteractionData : IDiscordInteractionData + { + [JsonProperty("id")] + public ulong Id { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("type")] + public ApplicationCommandType Type { get; set; } + + [JsonProperty("version")] + public ulong Version { get; set; } + + [JsonProperty("options")] + public AutocompleteInteractionDataOption[] Options { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs new file mode 100644 index 0000000000..a9d5b66f0e --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class AutocompleteInteractionDataOption + { + [JsonProperty("type")] + public ApplicationCommandOptionType Type { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("value")] + public object Value { get; set; } + + [JsonProperty("focused")] + public bool Focused { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index 2101f79f4d..38b35c8ecd 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -21,5 +21,8 @@ internal class InteractionCallbackData [JsonProperty("components")] public Optional Components { get; set; } + + [JsonProperty("choices")] + public Optional Choices { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index ce7953e1eb..52449a1217 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -418,6 +418,28 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); + + public static Task SendAutocompleteResult(BaseDiscordClient client, IEnumerable result, ulong interactionId, + string interactionToken, RequestOptions options) + { + if (result == null) + result = new AutocompleteResult[0]; + + Preconditions.AtMost(result.Count(), 20, nameof(result), "A maximum of 20 choices are allowed!"); + + var apiArgs = new InteractionResponse() + { + Type = InteractionResponseType.ApplicationCommandAutocompleteResult, + Data = new InteractionCallbackData() + { + Choices = result.Any() + ? result.Select(x => new API.ApplicationCommandOptionChoice() { Name = x.Name, Value = x.Value }).ToArray() + : new ApplicationCommandOptionChoice[0] + } + }; + + return client.ApiClient.CreateInteractionResponseAsync(apiArgs, interactionId, interactionToken, options); + } #endregion #region Guild permissions diff --git a/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs index cda3b1e24d..8159165c9c 100644 --- a/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs @@ -53,6 +53,13 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist interaction.Data = messageComponent; } break; + case InteractionType.ApplicationCommandAutocomplete: + { + var autocompleteData = new API.AutocompleteInteractionData(); + serializer.Populate(result.CreateReader(), autocompleteData); + interaction.Data = autocompleteData; + } + break; } } else diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index dd0866f0cd..c089062904 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3961,6 +3961,98 @@ The value(s) of a interaction response. + + + Represents a received over the gateway. + + + + + The autocomplete data of this interaction. + + + + + Responds to this interaction with a set of choices. + + + The set of choices for the user to pick from. + + A max of 20 choices are allowed. Passing for this argument will show the executing user that + there is no choices for their autocompleted input. + + + The request options for this response. + + A task that represents the asynchronous operation of responding to this interaction. + + + + + Responds to this interaction with a set of choices. + + The request options for this response. + + The set of choices for the user to pick from. + + A max of 20 choices are allowed. Passing for this argument will show the executing user that + there is no choices for their autocompleted input. + + + + A task that represents the asynchronous operation of responding to this interaction. + + + + + + + + + + + + + + + + + + + + Represents data for a slash commands autocomplete interaction. + + + + + Gets the name of the invoked command. + + + + + Gets the id of the invoked command. + + + + + Gets the type of the invoked command. + + + + + Gets the version of the invoked command. + + + + + Gets the current autocomplete option that is activly being filled out. + + + + + Gets a collection of all the other options the executing users has filled out. + + Represents a Websocket-based slash command received over the gateway. @@ -4088,7 +4180,17 @@ - Base class for User, Message, and Slash command interactions + Base class for User, Message, and Slash command interactions. + + + + + Gets the name of the invoked command. + + + + + Gets the id of the invoked command. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs new file mode 100644 index 0000000000..fe6322392c --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs @@ -0,0 +1,97 @@ +using Discord.Rest; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.Interaction; +using DataModel = Discord.API.AutocompleteInteractionData; + + +namespace Discord.WebSocket +{ + /// + /// Represents a received over the gateway. + /// + public class SocketAutocompleteInteraction : SocketInteraction + { + /// + /// The autocomplete data of this interaction. + /// + public new SocketAutocompleteInteractionData Data { get; } + + internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + : base(client, model.Id, channel) + { + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value + : null; + + if (dataModel != null) + Data = new SocketAutocompleteInteractionData(dataModel); + } + + internal new static SocketAutocompleteInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + { + var entity = new SocketAutocompleteInteraction(client, model, channel); + entity.Update(model); + return entity; + } + + /// + /// Responds to this interaction with a set of choices. + /// + /// + /// The set of choices for the user to pick from. + /// + /// A max of 20 choices are allowed. Passing for this argument will show the executing user that + /// there is no choices for their autocompleted input. + /// + /// + /// The request options for this response. + /// + /// A task that represents the asynchronous operation of responding to this interaction. + /// + public Task RespondAsync(IEnumerable result, RequestOptions options = null) + => InteractionHelper.SendAutocompleteResult(Discord, result, this.Id, this.Token, options); + + /// + /// Responds to this interaction with a set of choices. + /// + /// The request options for this response. + /// + /// The set of choices for the user to pick from. + /// + /// A max of 20 choices are allowed. Passing for this argument will show the executing user that + /// there is no choices for their autocompleted input. + /// + /// + /// + /// A task that represents the asynchronous operation of responding to this interaction. + /// + public Task RespondAsync(RequestOptions options = null, params AutocompleteResult[] result) + => InteractionHelper.SendAutocompleteResult(Discord, result, this.Id, this.Token, options); + + + /// + [Obsolete("Autocomplete interactions cannot be defered!", true)] + public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) => throw new NotSupportedException(); + + /// + [Obsolete("Autocomplete interactions cannot have followups!", true)] + public override Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + + /// + [Obsolete("Autocomplete interactions cannot have followups!", true)] + public override Task FollowupWithFileAsync(string text = null, Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + + /// + [Obsolete("Autocomplete interactions cannot have followups!", true)] + public override Task FollowupWithFileAsync(string text = null, string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + + /// + [Obsolete("Autocomplete interactions cannot have normal responses!", true)] + public override Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs new file mode 100644 index 0000000000..34087116d1 --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataModel = Discord.API.AutocompleteInteractionData; + + +namespace Discord.WebSocket +{ + /// + /// Represents data for a slash commands autocomplete interaction. + /// + public class SocketAutocompleteInteractionData + { + /// + /// Gets the name of the invoked command. + /// + public string CommandName { get; } + + /// + /// Gets the id of the invoked command. + /// + public ulong CommandId { get; } + + /// + /// Gets the type of the invoked command. + /// + public ApplicationCommandType Type { get; } + + /// + /// Gets the version of the invoked command. + /// + public ulong Version { get; } + + /// + /// Gets the current autocomplete option that is activly being filled out. + /// + public AutocompleteOption Current { get; } + + /// + /// Gets a collection of all the other options the executing users has filled out. + /// + public IReadOnlyCollection Options { get; } + + internal SocketAutocompleteInteractionData(DataModel model) + { + var options = model.Options.Select(x => new AutocompleteOption(x.Type, x.Name, x.Value, x.Focused)); + + this.Current = options.FirstOrDefault(x => x.Focused); + this.Options = options.ToImmutableArray(); + + this.CommandName = model.Name; + this.CommandId = model.Id; + this.Type = model.Type; + this.Version = model.Version; + } + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index c65048a34f..d32abb610e 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -12,10 +12,22 @@ namespace Discord.WebSocket { /// - /// Base class for User, Message, and Slash command interactions + /// Base class for User, Message, and Slash command interactions. /// public class SocketCommandBase : SocketInteraction { + /// + /// Gets the name of the invoked command. + /// + public string CommandName + => Data.Name; + + /// + /// Gets the id of the invoked command. + /// + public ulong CommandId + => Data.Id; + /// /// The data associated with this interaction. /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 7baab24963..d88a7f0049 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -65,23 +65,28 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model { if (model.Type == InteractionType.ApplicationCommand) { - if (model.ApplicationId != null) - { - var dataModel = model.Data.IsSpecified ? + var dataModel = model.Data.IsSpecified ? (DataModel)model.Data.Value : null; - if (dataModel != null) - { - if (dataModel.Type.Equals(ApplicationCommandType.User)) - return SocketUserCommand.Create(client, model, channel); - if (dataModel.Type.Equals(ApplicationCommandType.Message)) - return SocketMessageCommand.Create(client, model, channel); - } + + if (dataModel == null) + return null; + + switch (dataModel.Type) + { + case ApplicationCommandType.Slash: + return SocketSlashCommand.Create(client, model, channel); + case ApplicationCommandType.Message: + return SocketMessageCommand.Create(client, model, channel); + case ApplicationCommandType.User: + return SocketUserCommand.Create(client, model, channel); + default: return null; } - return SocketSlashCommand.Create(client, model, channel); } - if (model.Type == InteractionType.MessageComponent) + else if (model.Type == InteractionType.MessageComponent) return SocketMessageComponent.Create(client, model, channel); + else if (model.Type == InteractionType.ApplicationCommandAutocomplete) + return SocketAutocompleteInteraction.Create(client, model, channel); else return null; } From 884c15c5247c784be011f2881d002415510d4ae4 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 23 Sep 2021 07:19:57 -0300 Subject: [PATCH 272/494] meta: xml. closes #171 --- src/Discord.Net.Core/Discord.Net.Core.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index ece4d69d4a..d8d2d7d165 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4533,7 +4533,7 @@ - Gets or sets whether or not this option supports autocomplete + Gets or sets whether or not this option supports autocomplete. From 959df2d3c1f6091e09be1856c93d165c643fee3f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 23 Sep 2021 08:34:15 -0300 Subject: [PATCH 273/494] Revert user agent and $device to dnet --- src/Discord.Net.Core/DiscordConfig.cs | 2 +- src/Discord.Net.WebSocket/DiscordSocketApiClient.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/DiscordConfig.cs b/src/Discord.Net.Core/DiscordConfig.cs index 621c8184c1..da85256449 100644 --- a/src/Discord.Net.Core/DiscordConfig.cs +++ b/src/Discord.Net.Core/DiscordConfig.cs @@ -43,7 +43,7 @@ public class DiscordConfig /// /// The user agent used in each Discord.Net request. /// - public static string UserAgent { get; } = $"DiscordBot (https://github.com/Discord-Net-Labs/Discord.Net-Labs, v{Version})"; + public static string UserAgent { get; } = $"DiscordBot (https://github.com/discord-net/Discord.Net, v{Version})"; /// /// Returns the base Discord API URL. /// diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index a305bb0b4f..e7b92d9aee 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -246,9 +246,9 @@ public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, i options = RequestOptions.CreateOrClone(options); var props = new Dictionary { - ["$device"] = "Discord.Net Labs", + ["$device"] = "Discord.Net", ["$os"] = Environment.OSVersion.Platform.ToString(), - [$"browser"] = "Discord.Net Labs" + [$"browser"] = "Discord.Net" }; var msg = new IdentifyParams() { From 9c9b7fb2c007a926d44717d5b2285303bee966c2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 23 Sep 2021 08:53:55 -0300 Subject: [PATCH 274/494] meta: bump version --- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 +++--- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +++--- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 7f494db1a2..b52aba2147 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,12 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.1.0 + 3.1.1 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 3.1.0 - 3.1.0 + 3.1.1 + 3.1.1 false diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 2159f5117b..fcc0054021 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,11 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.1.0 + 3.1.1 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.1.0 - 3.1.0 + 3.1.1 + 3.1.1 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index f166cab117..4947db946d 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,7 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.1.0 + 3.1.1 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,8 +16,8 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.1.0 - 3.1.0 + 3.1.1 + 3.1.1 TRACE From 091e7e2479b865f5ac697017e20093805d81c547 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 23 Sep 2021 10:57:05 -0300 Subject: [PATCH 275/494] meta: bump vers --- src/Discord.Net/Discord.Net.nuspec | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 5f15cf79a3..c41d0ff51b 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.0$suffix$ + 3.1.1$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,24 +14,24 @@ https://avatars.githubusercontent.com/u/84047264 - - - - + + + + - - - - + + + + - - - - + + + + From fa851fb6e6b3a10e581c567f14932c939419bb34 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 23 Sep 2021 11:44:45 -0300 Subject: [PATCH 276/494] Fix sticker args --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index f132cb7a41..76cef7ef89 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -745,7 +745,7 @@ public async Task CreateMessageAsync(ulong channelId, CreateMessagePara { Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(channelId, 0, nameof(channelId)); - if (!args.Embed.IsSpecified || args.Embed.Value == null) + if ((!args.Embed.IsSpecified || args.Embed.Value == null) && (!args.Stickers.IsSpecified || args.Stickers.Value == null || args.Stickers.Value.Length == 0)) Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content)); if (args.Content?.Length > DiscordConfig.MaxMessageSize) From 7e53fe55ddffb7d8346fc2f3d8471c87a53c5cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Thu, 23 Sep 2021 17:54:56 +0200 Subject: [PATCH 277/494] Grammer fix (#179) --- .../08-bulk-overwrite-of-global-slash-commands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md index 71bc296539..0a1aab461b 100644 --- a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md @@ -1,4 +1,4 @@ -If you have too many global commands then you might want to consider doing a bulk overwrite. +If you have too many global commands then you might want to consider using the bulk overwrite function. ```cs public async Task Client_Ready() { List applicationCommandProperties = new(); From d0738d67a1c78ed7f291ae9845043067376604be Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 24 Sep 2021 04:39:15 -0300 Subject: [PATCH 278/494] Made IVoiceChannel mentionable --- src/Discord.Net.Core/Discord.Net.Core.xml | 4 ++-- src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs | 2 +- .../Interactions/Slash Commands/SlashCommandBuilder.cs | 8 ++++---- src/Discord.Net.Rest/Discord.Net.Rest.xml | 3 +++ .../Entities/Channels/RestVoiceChannel.cs | 3 ++- src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml | 3 +++ .../Entities/Channels/SocketVoiceChannel.cs | 2 ++ .../MockedEntities/MockedVoiceChannel.cs | 2 +- 8 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index d8d2d7d165..dc10024a43 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -6011,7 +6011,7 @@ The default permission value to set. The current builder. - + Adds an option to the current slash command. @@ -6108,7 +6108,7 @@ The built version of this option. - + Adds an option to the current slash command. diff --git a/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs b/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs index 9c2d008eea..1d36a41b91 100644 --- a/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs @@ -6,7 +6,7 @@ namespace Discord /// /// Represents a generic voice channel in a guild. /// - public interface IVoiceChannel : INestedChannel, IAudioChannel + public interface IVoiceChannel : INestedChannel, IAudioChannel, IMentionable { /// /// Gets the bit-rate that the clients in this voice channel are requested to use. diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 1a152feb4e..9581015d0c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -165,7 +165,7 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// The choices of this option. /// The current builder. public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool required = true, bool isDefault = false, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? required = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -183,7 +183,7 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t Preconditions.AtMost(description.Length, MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true - if (isDefault) + if (isDefault.HasValue && isDefault.Value) { if (this.Options != null) if (this.Options.Any(x => x.Default.HasValue && x.Default.Value)) @@ -339,7 +339,7 @@ public string Description /// /// Gets or sets if the option is required. /// - public bool Required { get; set; } + public bool? Required { get; set; } = null; /// /// Gets or sets whether or not this option supports autocomplete. @@ -395,7 +395,7 @@ public ApplicationCommandOptionProperties Build() /// The choices of this option. /// The current builder. public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool required = true, bool isDefault = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? required = null, bool isDefault = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 6e6b76d217..ec25845809 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2803,6 +2803,9 @@ + + + diff --git a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs index d1d567e272..b8ee8fc93d 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs @@ -21,7 +21,8 @@ public class RestVoiceChannel : RestGuildChannel, IVoiceChannel, IRestAudioChann public int? UserLimit { get; private set; } /// public ulong? CategoryId { get; private set; } - + /// + public string Mention => MentionUtils.MentionChannel(Id); internal RestVoiceChannel(BaseDiscordClient discord, IGuild guild, ulong id) : base(discord, guild, id) { diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index c089062904..10c5d5e8da 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2802,6 +2802,9 @@ A category channel representing the parent of this channel; null if none is set. + + + diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs index f1d61b9b3a..9798272b37 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs @@ -32,6 +32,8 @@ public class SocketVoiceChannel : SocketGuildChannel, IVoiceChannel, ISocketAudi public ICategoryChannel Category => CategoryId.HasValue ? Guild.GetChannel(CategoryId.Value) as ICategoryChannel : null; /// + public string Mention => MentionUtils.MentionChannel(Id); + /// public Task SyncPermissionsAsync(RequestOptions options = null) => ChannelHelper.SyncPermissionsAsync(this, Discord, options); diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs index 7c3d00fdd1..159bfb034a 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs @@ -25,7 +25,7 @@ internal sealed class MockedVoiceChannel : IVoiceChannel public string Name => throw new NotImplementedException(); public DateTimeOffset CreatedAt => throw new NotImplementedException(); - + public string Mention => throw new NotImplementedException(); public ulong Id => throw new NotImplementedException(); public Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) From cfac5d53d9cdda35d52efada71df4d149baa79d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 11:10:51 +0200 Subject: [PATCH 279/494] 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 { 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 --- .../Discord.Net.Commands.xml | 4 +- src/Discord.Net.Commands/ModuleBase.cs | 6 ++- src/Discord.Net.Core/Discord.Net.Core.xml | 10 ++-- .../Entities/Channels/IMessageChannel.cs | 3 +- .../Extensions/MessageExtensions.cs | 5 +- .../Extensions/UserExtensions.cs | 5 +- .../API/Rest/CreateMessageParams.cs | 4 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 17 +++--- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- .../Entities/Channels/ChannelHelper.cs | 24 ++++++++- .../Entities/Channels/IRestMessageChannel.cs | 3 +- .../Entities/Channels/RestDMChannel.cs | 8 +-- .../Entities/Channels/RestGroupChannel.cs | 10 ++-- .../Entities/Channels/RestTextChannel.cs | 8 +-- .../Discord.Net.WebSocket.xml | 17 +++--- .../Channels/ISocketMessageChannel.cs | 3 +- .../Entities/Channels/SocketDMChannel.cs | 10 ++-- .../Entities/Channels/SocketGroupChannel.cs | 8 +-- .../Entities/Channels/SocketTextChannel.cs | 8 +-- .../SocketMessageComponent.cs | 54 +++++++++++++++---- .../SocketBaseCommand/SocketCommandBase.cs | 51 +++++++++++++++--- .../MockedEntities/MockedDMChannel.cs | 2 +- .../MockedEntities/MockedGroupChannel.cs | 2 +- .../MockedEntities/MockedTextChannel.cs | 2 +- 24 files changed, 186 insertions(+), 80 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml index e44d712293..cf68f8786a 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ b/src/Discord.Net.Commands/Discord.Net.Commands.xml @@ -1129,7 +1129,7 @@ - + Sends a message to the source channel. @@ -1138,7 +1138,7 @@ Specifies if Discord should read this aloud using text-to-speech. An embed to be displayed alongside the . - + A array of s to send with this response. Max 10 /// Specifies if notifications are sent for mentioned users and roles in the . If null, all mentioned roles and users will be notified. diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index 5f470b7b6d..a44fb26c0b 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -36,12 +36,14 @@ public abstract class ModuleBase : IModuleBase /// Specifies if notifications are sent for mentioned users and roles in the . /// If null, all mentioned roles and users will be notified. /// + /// The request options for this async request. /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions /// A collection of stickers to send with the file. - protected virtual async Task ReplyAsync(string message = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + /// A array of s to send with this response. Max 10 + protected virtual async Task ReplyAsync(string message = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { - return await Context.Channel.SendMessageAsync(message, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + return await Context.Channel.SendMessageAsync(message, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); } /// /// The method to execute before executing the command. diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index dc10024a43..9ee2ef4583 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1507,7 +1507,7 @@ Represents a generic channel that can send and receive messages. - + Sends a message to this message channel. @@ -1528,6 +1528,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions A collection of stickers to send with the message. + A array of s to send with this response. Max 10 A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -11087,13 +11088,14 @@ - + Sends an inline reply that references a message. The message to be sent. Determines whether the message should be read aloud by Discord or not. The to be sent. + A array of s to send with this response. Max 10 Specifies if notifications are sent for mentioned users and roles in the message . If null, all mentioned roles and users will be notified. @@ -11107,7 +11109,7 @@ An extension class for various Discord user objects. - + Sends a message via DM. @@ -11128,11 +11130,13 @@ The message to be sent. Whether the message should be read aloud by Discord or not. The to be sent. + A array of s to send with this response. Max 10 The options to be used when sending the request. Specifies if notifications are sent for mentioned users and roles in the message . If null, all mentioned roles and users will be notified. + The message components to be included with this message. Used for interactions A task that represents the asynchronous send operation. The task result contains the sent message. diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index 1fffea6e9f..49fc5f433c 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -30,11 +30,12 @@ public interface IMessageChannel : IChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions /// A collection of stickers to send with the message. + /// A array of s to send with this response. Max 10 /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Sends a file to this message channel with an optional caption. /// diff --git a/src/Discord.Net.Core/Extensions/MessageExtensions.cs b/src/Discord.Net.Core/Extensions/MessageExtensions.cs index 6d068d160c..be47c0587c 100644 --- a/src/Discord.Net.Core/Extensions/MessageExtensions.cs +++ b/src/Discord.Net.Core/Extensions/MessageExtensions.cs @@ -78,6 +78,7 @@ public static async Task RemoveReactionsAsync(this IUserMessage msg, IUser user, /// The message to be sent. /// Determines whether the message should be read aloud by Discord or not. /// The to be sent. + /// A array of s to send with this response. Max 10 /// /// Specifies if notifications are sent for mentioned users and roles in the message . /// If null, all mentioned roles and users will be notified. @@ -87,9 +88,9 @@ public static async Task RemoveReactionsAsync(this IUserMessage msg, IUser user, /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - public static async Task ReplyAsync(this IUserMessage msg, string text = null, bool isTTS = false, Embed embed = null, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent components = null, ISticker[] stickers = null) + public static async Task ReplyAsync(this IUserMessage msg, string text = null, bool isTTS = false, Embed embed = null, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent components = null, ISticker[] stickers = null, Embed[] embeds = null) { - return await msg.Channel.SendMessageAsync(text, isTTS, embed, options, allowedMentions, new MessageReference(messageId: msg.Id), components, stickers).ConfigureAwait(false); + return await msg.Channel.SendMessageAsync(text, isTTS, embed, options, allowedMentions, new MessageReference(messageId: msg.Id), components, stickers, embeds).ConfigureAwait(false); } } } diff --git a/src/Discord.Net.Core/Extensions/UserExtensions.cs b/src/Discord.Net.Core/Extensions/UserExtensions.cs index 01d9f4ddee..3f05b63617 100644 --- a/src/Discord.Net.Core/Extensions/UserExtensions.cs +++ b/src/Discord.Net.Core/Extensions/UserExtensions.cs @@ -27,11 +27,13 @@ public static class UserExtensions /// The message to be sent. /// Whether the message should be read aloud by Discord or not. /// The to be sent. + /// A array of s to send with this response. Max 10 /// The options to be used when sending the request. /// /// Specifies if notifications are sent for mentioned users and roles in the message . /// If null, all mentioned roles and users will be notified. /// + /// The message components to be included with this message. Used for interactions /// /// A task that represents the asynchronous send operation. The task result contains the sent message. /// @@ -39,11 +41,12 @@ public static async Task SendMessageAsync(this IUser user, string text = null, bool isTTS = false, Embed embed = null, + Embed[] embeds = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageComponent component = null) { - return await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(text, isTTS, embed, options, allowedMentions, component: component).ConfigureAwait(false); + return await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(text, isTTS, embed, options, allowedMentions, component: component, embeds: embeds).ConfigureAwait(false); } /// diff --git a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs index b8ee153c9e..49321652f5 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs @@ -15,8 +15,8 @@ internal class CreateMessageParams [JsonProperty("tts")] public Optional IsTTS { get; set; } - [JsonProperty("embed")] - public Optional Embed { get; set; } + [JsonProperty("embeds")] + public Optional Embeds { get; set; } [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index ec25845809..28f8ab534b 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -1718,7 +1718,7 @@ must be lesser than 86400. - + Message content is too long, length must be less or equal to . @@ -1764,12 +1764,12 @@ Represents a REST-based channel that can send and receive messages. - + Sends a message to this message channel. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The message to be sent. @@ -1783,6 +1783,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions A collection of stickers to send with the message. + A array of s to send with this response. Max 10 A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -2016,7 +2017,7 @@ - + Message content is too long, length must be less or equal to . @@ -2104,7 +2105,7 @@ - + @@ -2154,7 +2155,7 @@ - + Message content is too long, length must be less or equal to . @@ -2444,7 +2445,7 @@ - + Message content is too long, length must be less or equal to . @@ -2614,7 +2615,7 @@ - + diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 76cef7ef89..8328db4e7e 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -745,7 +745,7 @@ public async Task CreateMessageAsync(ulong channelId, CreateMessagePara { Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(channelId, 0, nameof(channelId)); - if ((!args.Embed.IsSpecified || args.Embed.Value == null) && (!args.Stickers.IsSpecified || args.Stickers.Value == null || args.Stickers.Value.Length == 0)) + if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) && (!args.Stickers.IsSpecified || args.Stickers.Value == null || args.Stickers.Value.Length == 0)) Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content)); if (args.Content?.Length > DiscordConfig.MaxMessageSize) diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 696ffa5afd..273ffab930 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -266,10 +266,22 @@ public static async Task> GetPinnedMessagesAsyn /// Message content is too long, length must be less or equal to . public static async Task SendMessageAsync(IMessageChannel channel, BaseDiscordClient client, - string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options) + string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, Embed[] embeds) { + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -292,7 +304,15 @@ public static async Task SendMessageAsync(IMessageChannel chann Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed."); } - var args = new CreateMessageParams(text) { IsTTS = isTTS, Embed = embed?.ToModel(), AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified }; + var args = new CreateMessageParams(text) + { + IsTTS = isTTS, + Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + AllowedMentions = allowedMentions?.ToModel(), + MessageReference = messageReference?.ToModel(), + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified + }; var model = await client.ApiClient.CreateMessageAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } diff --git a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs index b7f4940557..2b39e97d6f 100644 --- a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs @@ -27,11 +27,12 @@ public interface IRestMessageChannel : IMessageChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions /// A collection of stickers to send with the message. + /// A array of s to send with this response. Max 10 /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Sends a file to this message channel with an optional caption. /// diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index 57869ea581..3f296f4414 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -94,8 +94,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// /// @@ -215,8 +215,8 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion #region IChannel diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index 1b5df0d870..c575a09978 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -100,8 +100,8 @@ public async Task ModifyMessageAsync(ulong messageId, Action /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// /// @@ -133,7 +133,7 @@ public Task SendFileAsync(string filePath, string text, bool is /// /// Message content is too long, length must be less or equal to . public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers,options, isSpoiler); + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); /// public Task TriggerTypingAsync(RequestOptions options = null) @@ -192,8 +192,8 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion #region IAudioChannel diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index ffd21afa5a..6502c9d1fd 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -103,8 +103,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// /// @@ -326,8 +326,8 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion #region IGuildChannel diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 10c5d5e8da..ae283b4d17 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1457,12 +1457,12 @@ A read-only collection of WebSocket-based messages. - + Sends a message to this message channel. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The message to be sent. @@ -1476,6 +1476,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions A collection of stickers to send with the message. + A array of s to send with this response. Max 10 A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -1811,7 +1812,7 @@ - + Message content is too long, length must be less or equal to . @@ -1887,7 +1888,7 @@ - + @@ -2002,7 +2003,7 @@ - + Message content is too long, length must be less or equal to . @@ -2075,7 +2076,7 @@ - + @@ -2459,7 +2460,7 @@ - + Message content is too long, length must be less or equal to . @@ -2578,7 +2579,7 @@ - + diff --git a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs index 7a82b2c3f8..8b60b18a16 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs @@ -36,11 +36,12 @@ public interface ISocketMessageChannel : IMessageChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions /// A collection of stickers to send with the message. + /// A array of s to send with this response. Max 10 /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Sends a file to this message channel with an optional caption. /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs index 3f44ecfc60..a6f487cca8 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs @@ -59,7 +59,7 @@ internal void Update(ClientState state, API.User recipient) /// public Task CloseAsync(RequestOptions options = null) => ChannelHelper.DeleteAsync(this, Discord, options); -#endregion + #endregion #region Messages /// @@ -139,8 +139,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) @@ -252,8 +252,8 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion #region IChannel diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index f1a697e014..3f758a93ec 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -173,8 +173,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) @@ -320,8 +320,8 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion #region IAudioChannel diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index 14a34cbc62..3e91eba064 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -211,8 +211,8 @@ public Task> GetPinnedMessagesAsync(RequestOpti /// /// Message content is too long, length must be less or equal to . - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) @@ -377,8 +377,8 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); /// - async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion #region INestedChannel diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 2b834d78b9..7b2cc20627 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -83,8 +83,17 @@ public override async Task RespondAsync( { if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -108,7 +117,7 @@ public override async Task RespondAsync( var response = new API.InteractionResponse { - Type = InteractionResponseType.ChannelMessageWithSource, + Type = InteractionResponseType.ChannelMessageWithSource, Data = new API.InteractionCallbackData { Content = text ?? Optional.Unspecified, @@ -218,8 +227,17 @@ public override async Task FollowupAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); @@ -255,8 +273,17 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); @@ -295,8 +322,17 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index d32abb610e..d4b5f952d6 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -79,8 +79,16 @@ public override async Task RespondAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -133,8 +141,17 @@ public override async Task FollowupAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); @@ -170,8 +187,17 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); @@ -210,8 +236,17 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); - if (embeds == null && embed != null) - embeds = new[] { embed }; + if (embed != null) + { + if (embeds == null) + embeds = new[] { embed }; + else + { + List listEmbeds = embeds.ToList(); + listEmbeds.Insert(0, embed); + } + } + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs index 52eed6bc9f..a7451ddd2d 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs @@ -83,7 +83,7 @@ public Task TriggerTypingAsync(RequestOptions options = null) throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs index bc4f66ed42..fc9a163387 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs @@ -96,7 +96,7 @@ public Task SendFileAsync(Stream stream, string filename, string t throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { throw new NotImplementedException(); } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs index fc39a2b077..06d0d98117 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs @@ -186,7 +186,7 @@ public Task SendFileAsync(Stream stream, string filename, string t throw new NotImplementedException(); } - public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { throw new NotImplementedException(); } From ad78542f97f8a782cabc39392368c64aeda3e509 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Fri, 24 Sep 2021 05:22:05 -0400 Subject: [PATCH 280/494] Fix thread permissions (#183) * Update GuildPermissionsTests.cs * Update GuildPermissions.cs --- .../Entities/Permissions/GuildPermissions.cs | 16 +++++++++++++++- .../GuildPermissionsTests.cs | 8 ++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 05a2a76800..f909b63818 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -93,6 +93,10 @@ public struct GuildPermissions public bool CreatePublicThreads => Permissions.GetValue(RawValue, GuildPermission.CreatePublicThreads); /// If true, a user may create private threads in this guild. public bool CreatePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.CreatePrivateThreads); + /// If true, a user may use public threads in this guild. + public bool UsePublicThreads => Permissions.GetValue(RawValue, GuildPermission.UsePublicThreads); + /// If true, a user may use private threads in this guild. + public bool UsePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.UsePrivateThreads); /// If true, a user may use external stickers in this guild. public bool UseExternalStickers => Permissions.GetValue(RawValue, GuildPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. @@ -143,6 +147,8 @@ private GuildPermissions(ulong initialValue, bool? manageThreads = null, bool? createPublicThreads = null, bool? createPrivateThreads = null, + bool? usePublicThreads = null, + bool? usePrivateThreads = null, bool? useExternalStickers = null, bool? sendMessagesInThreads = null, bool? startEmbeddedActivities = null) @@ -185,6 +191,8 @@ private GuildPermissions(ulong initialValue, Permissions.SetValue(ref value, manageThreads, GuildPermission.ManageThreads); Permissions.SetValue(ref value, createPublicThreads, GuildPermission.CreatePublicThreads); Permissions.SetValue(ref value, createPrivateThreads, GuildPermission.CreatePrivateThreads); + Permissions.SetValue(ref value, usePublicThreads, GuildPermission.UsePublicThreads); + Permissions.SetValue(ref value, usePrivateThreads, GuildPermission.UsePrivateThreads); Permissions.SetValue(ref value, useExternalStickers, GuildPermission.UseExternalStickers); Permissions.SetValue(ref value, sendMessagesInThreads, GuildPermission.SendMessagesInThreads); Permissions.SetValue(ref value, startEmbeddedActivities, GuildPermission.StartEmbeddedActivities); @@ -230,6 +238,8 @@ public GuildPermissions( bool manageThreads = false, bool createPublicThreads = false, bool createPrivateThreads = false, + bool usePublicThreads = false, + bool usePrivateThreads = false, bool useExternalStickers = false, bool sendMessagesInThreads = false, bool startEmbeddedActivities = false) @@ -270,6 +280,8 @@ public GuildPermissions( manageThreads: manageThreads, createPublicThreads: createPublicThreads, createPrivateThreads: createPrivateThreads, + usePublicThreads: usePublicThreads, + usePrivateThreads: usePrivateThreads, useExternalStickers: useExternalStickers, sendMessagesInThreads: sendMessagesInThreads, startEmbeddedActivities: startEmbeddedActivities) @@ -313,6 +325,8 @@ public GuildPermissions Modify( bool? manageThreads = null, bool? createPublicThreads = null, bool? createPrivateThreads = null, + bool? usePublicThreads = null, + bool? usePrivateThreads = null, bool? useExternalStickers = null, bool? sendMessagesInThreads = null, bool? startEmbeddedActivities = null) @@ -320,7 +334,7 @@ public GuildPermissions Modify( viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers, - useSlashCommands, requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, useExternalStickers, sendMessagesInThreads, + useSlashCommands, requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, usePublicThreads, usePrivateThreads, useExternalStickers, sendMessagesInThreads, startEmbeddedActivities); /// diff --git a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs index 9be109c6e5..68a685fdb1 100644 --- a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs @@ -95,8 +95,8 @@ void AssertFlag(Func cstr, GuildPermission flag) AssertFlag(() => new GuildPermissions(useSlashCommands: true), GuildPermission.UseSlashCommands); AssertFlag(() => new GuildPermissions(requestToSpeak: true), GuildPermission.RequestToSpeak); AssertFlag(() => new GuildPermissions(manageThreads: true), GuildPermission.ManageThreads); - AssertFlag(() => new GuildPermissions(usePublicThreads: true), GuildPermission.UsePublicThreads); - AssertFlag(() => new GuildPermissions(usePrivateThreads: true), GuildPermission.UsePrivateThreads); + AssertFlag(() => new GuildPermissions(createPublicThreads: true), GuildPermission.CreatePublicThreads); + AssertFlag(() => new GuildPermissions(createPrivateThreads: true), GuildPermission.CreatePrivateThreads); AssertFlag(() => new GuildPermissions(useExternalStickers: true), GuildPermission.UseExternalStickers); } @@ -171,8 +171,8 @@ void AssertUtil(GuildPermission permission, AssertUtil(GuildPermission.UseSlashCommands, x => x.UseSlashCommands, (p, enable) => p.Modify(useSlashCommands: enable)); AssertUtil(GuildPermission.RequestToSpeak, x => x.RequestToSpeak, (p, enable) => p.Modify(requestToSpeak: enable)); AssertUtil(GuildPermission.ManageThreads, x => x.ManageThreads, (p, enable) => p.Modify(manageThreads: enable)); - AssertUtil(GuildPermission.UsePublicThreads, x => x.UsePublicThreads, (p, enable) => p.Modify(usePublicThreads: enable)); - AssertUtil(GuildPermission.UsePrivateThreads, x => x.UsePrivateThreads, (p, enable) => p.Modify(usePrivateThreads: enable)); + AssertUtil(GuildPermission.CreatePublicThreads, x => x.CreatePublicThreads, (p, enable) => p.Modify(createPublicThreads: enable)); + AssertUtil(GuildPermission.CreatePrivateThreads, x => x.CreatePrivateThreads, (p, enable) => p.Modify(createPrivateThreads: enable)); AssertUtil(GuildPermission.UseExternalStickers, x => x.UseExternalStickers, (p, enable) => p.Modify(useExternalStickers: enable)); } } From ab8e56634bd54fec398f4995f706eca705ad95a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 13:55:07 +0200 Subject: [PATCH 281/494] Use compound assignment (#186) * Used compound assignment * -||- * -||- --- .../02_commands_framework/Modules/PublicModule.cs | 2 +- .../Builders/ModuleClassBuilder.cs | 4 ++-- .../Builders/ParameterBuilder.cs | 2 +- src/Discord.Net.Commands/CommandService.cs | 6 +++--- src/Discord.Net.Commands/Info/CommandInfo.cs | 6 +++--- src/Discord.Net.Commands/Info/ParameterInfo.cs | 4 ++-- src/Discord.Net.Rest/DiscordRestApiClient.cs | 12 ++++++------ src/Discord.Net.Rest/DiscordRestClient.cs | 2 +- .../Entities/Messages/MessageHelper.cs | 2 +- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 2 +- .../Helpers/DiagnosticVerifier.Helper.cs | 2 +- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/samples/02_commands_framework/Modules/PublicModule.cs b/samples/02_commands_framework/Modules/PublicModule.cs index b9263649f8..18423f609c 100644 --- a/samples/02_commands_framework/Modules/PublicModule.cs +++ b/samples/02_commands_framework/Modules/PublicModule.cs @@ -31,7 +31,7 @@ public async Task CatAsync() [Command("userinfo")] public async Task UserInfoAsync(IUser user = null) { - user = user ?? Context.User; + user ??= Context.User; await ReplyAsync(user.ToString()); } diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 7a752090e5..59500439ac 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -116,7 +116,7 @@ private static void BuildModule(ModuleBuilder builder, TypeInfo typeInfo, Comman builder.AddAliases(alias.Aliases); break; case GroupAttribute group: - builder.Name = builder.Name ?? group.Prefix; + builder.Name ??= group.Prefix; builder.Group = group.Prefix; builder.AddAliases(group.Prefix); break; @@ -158,7 +158,7 @@ private static void BuildCommand(CommandBuilder builder, TypeInfo typeInfo, Meth case CommandAttribute command: builder.AddAliases(command.Text); builder.RunMode = command.RunMode; - builder.Name = builder.Name ?? command.Text; + builder.Name ??= command.Text; builder.IgnoreExtraArgs = command.IgnoreExtraArgs ?? service._ignoreExtraArgs; break; case NameAttribute name: diff --git a/src/Discord.Net.Commands/Builders/ParameterBuilder.cs b/src/Discord.Net.Commands/Builders/ParameterBuilder.cs index 7f827a27e6..9ee1a748cf 100644 --- a/src/Discord.Net.Commands/Builders/ParameterBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ParameterBuilder.cs @@ -131,7 +131,7 @@ public ParameterBuilder AddPrecondition(ParameterPreconditionAttribute precondit internal ParameterInfo Build(CommandInfo info) { - if ((TypeReader ?? (TypeReader = GetReader(ParameterType))) == null) + if ((TypeReader ??= GetReader(ParameterType)) == null) throw new InvalidOperationException($"No type reader found for type {ParameterType.Name}, one must be specified"); return new ParameterInfo(this, info, Command.Module.Service); diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index f897f822a0..468f7739f5 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -189,7 +189,7 @@ public async Task CreateModuleAsync(string primaryAlias, Action public async Task AddModuleAsync(Type type, IServiceProvider services) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; await _moduleLock.WaitAsync().ConfigureAwait(false); try @@ -224,7 +224,7 @@ public async Task AddModuleAsync(Type type, IServiceProvider service /// public async Task> AddModulesAsync(Assembly assembly, IServiceProvider services) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; await _moduleLock.WaitAsync().ConfigureAwait(false); try @@ -507,7 +507,7 @@ public Task ExecuteAsync(ICommandContext context, int argPos, IServiceP /// public async Task ExecuteAsync(ICommandContext context, string input, IServiceProvider services, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; var searchResult = Search(input); if (!searchResult.IsSuccess) diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index 3bcef98311..773c7c7730 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -123,7 +123,7 @@ internal CommandInfo(CommandBuilder builder, ModuleInfo module, CommandService s public async Task CheckPreconditionsAsync(ICommandContext context, IServiceProvider services = null) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; async Task CheckGroups(IEnumerable preconditions, string type) { @@ -164,7 +164,7 @@ async Task CheckGroups(IEnumerable pr public async Task ParseAsync(ICommandContext context, int startIndex, SearchResult searchResult, PreconditionResult preconditionResult = null, IServiceProvider services = null) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; if (!searchResult.IsSuccess) return ParseResult.FromError(searchResult); @@ -201,7 +201,7 @@ public Task ExecuteAsync(ICommandContext context, ParseResult parseResu } public async Task ExecuteAsync(ICommandContext context, IEnumerable argList, IEnumerable paramList, IServiceProvider services) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; try { diff --git a/src/Discord.Net.Commands/Info/ParameterInfo.cs b/src/Discord.Net.Commands/Info/ParameterInfo.cs index b435b301ad..a6ba9dfde4 100644 --- a/src/Discord.Net.Commands/Info/ParameterInfo.cs +++ b/src/Discord.Net.Commands/Info/ParameterInfo.cs @@ -75,7 +75,7 @@ internal ParameterInfo(ParameterBuilder builder, CommandInfo command, CommandSer public async Task CheckPreconditionsAsync(ICommandContext context, object arg, IServiceProvider services = null) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; foreach (var precondition in Preconditions) { @@ -89,7 +89,7 @@ public async Task CheckPreconditionsAsync(ICommandContext co public async Task ParseAsync(ICommandContext context, string input, IServiceProvider services = null) { - services = services ?? EmptyServiceProvider.Instance; + services ??= EmptyServiceProvider.Instance; return await _reader.ReadAsync(context, input, services).ConfigureAwait(false); } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 8328db4e7e..7d883fac66 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -177,7 +177,7 @@ internal Task SendAsync(string method, Expression> endpointExpr, Bu public async Task SendAsync(string method, string endpoint, BucketId bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) { - options = options ?? new RequestOptions(); + options ??= new RequestOptions(); options.HeaderOnly = true; options.BucketId = bucketId; @@ -191,7 +191,7 @@ internal Task SendJsonAsync(string method, Expression> endpointExpr public async Task SendJsonAsync(string method, string endpoint, object payload, BucketId bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) { - options = options ?? new RequestOptions(); + options ??= new RequestOptions(); options.HeaderOnly = true; options.BucketId = bucketId; @@ -206,7 +206,7 @@ internal Task SendMultipartAsync(string method, Expression> endpoin public async Task SendMultipartAsync(string method, string endpoint, IReadOnlyDictionary multipartArgs, BucketId bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) { - options = options ?? new RequestOptions(); + options ??= new RequestOptions(); options.HeaderOnly = true; options.BucketId = bucketId; @@ -220,7 +220,7 @@ internal Task SendAsync(string method, Expression SendAsync(string method, string endpoint, BucketId bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) where TResponse : class { - options = options ?? new RequestOptions(); + options ??= new RequestOptions(); options.BucketId = bucketId; var request = new RestRequest(RestClient, method, endpoint, options); @@ -233,7 +233,7 @@ internal Task SendJsonAsync(string method, Expression SendJsonAsync(string method, string endpoint, object payload, BucketId bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) where TResponse : class { - options = options ?? new RequestOptions(); + options ??= new RequestOptions(); options.BucketId = bucketId; string json = payload != null ? SerializeJson(payload) : null; @@ -248,7 +248,7 @@ internal Task SendMultipartAsync(string method, Expression public async Task SendMultipartAsync(string method, string endpoint, IReadOnlyDictionary multipartArgs, BucketId bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) { - options = options ?? new RequestOptions(); + options ??= new RequestOptions(); options.BucketId = bucketId; var request = new MultipartRestRequest(RestClient, method, endpoint, multipartArgs, options); diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index 8254eabe99..c8f16a1f07 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -62,7 +62,7 @@ internal override Task OnLogoutAsync() public async Task GetApplicationInfoAsync(RequestOptions options = null) { - return _applicationInfo ?? (_applicationInfo = await ClientHelper.GetApplicationInfoAsync(this, options).ConfigureAwait(false)); + return _applicationInfo ??= await ClientHelper.GetApplicationInfoAsync(this, options).ConfigureAwait(false); } public Task GetChannelAsync(ulong id, RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index d50f453d7a..e10be2c0a0 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -344,7 +344,7 @@ bool EnclosedInBlock(Match m) tags.Add(new Tag(TagType.Emoji, index, content.Length, emoji.Id, emoji)); else //Bad Tag { - index = index + 1; + index++; continue; } index = endIndex + 1; diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f465571d61..3e5a6d5436 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -322,7 +322,7 @@ private async Task OnDisconnectingAsync(Exception ex) /// public override async Task GetApplicationInfoAsync(RequestOptions options = null) - => _applicationInfo ?? (_applicationInfo = await ClientHelper.GetApplicationInfoAsync(this, options ?? RequestOptions.Default).ConfigureAwait(false)); + => _applicationInfo ??= await ClientHelper.GetApplicationInfoAsync(this, options ?? RequestOptions.Default).ConfigureAwait(false); /// public override SocketGuild GetGuild(ulong id) diff --git a/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs b/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs index 99654f12c3..43748aa931 100644 --- a/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs +++ b/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs @@ -187,7 +187,7 @@ private static IEnumerable Transitive(Assembly assembly) private static HashSet RecursiveReferencedAssemblies(Assembly a, HashSet assemblies = null) { - assemblies = assemblies ?? new HashSet(); + assemblies ??= new HashSet(); if (assemblies.Add(a)) { foreach (var referencedAssemblyName in a.GetReferencedAssemblies()) From d897ba1839c670d1a9c463c248c71931d4bdbde1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 13:57:39 +0200 Subject: [PATCH 282/494] Remove unnecessary suppression (#188) --- src/Discord.Net.Rest/API/Common/Application.cs | 1 - src/Discord.Net.Rest/API/Common/Attachment.cs | 1 - src/Discord.Net.Rest/API/Common/Ban.cs | 1 - src/Discord.Net.Rest/API/Common/Channel.cs | 1 - src/Discord.Net.Rest/API/Common/Connection.cs | 1 - src/Discord.Net.Rest/API/Common/Embed.cs | 1 - src/Discord.Net.Rest/API/Common/EmbedImage.cs | 1 - src/Discord.Net.Rest/API/Common/EmbedProvider.cs | 1 - src/Discord.Net.Rest/API/Common/EmbedThumbnail.cs | 1 - src/Discord.Net.Rest/API/Common/EmbedVideo.cs | 1 - src/Discord.Net.Rest/API/Common/Emoji.cs | 1 - src/Discord.Net.Rest/API/Common/Game.cs | 1 - src/Discord.Net.Rest/API/Common/Guild.cs | 1 - src/Discord.Net.Rest/API/Common/GuildMember.cs | 1 - src/Discord.Net.Rest/API/Common/GuildWidget.cs | 1 - src/Discord.Net.Rest/API/Common/Integration.cs | 1 - src/Discord.Net.Rest/API/Common/IntegrationAccount.cs | 1 - src/Discord.Net.Rest/API/Common/Invite.cs | 1 - src/Discord.Net.Rest/API/Common/InviteChannel.cs | 1 - src/Discord.Net.Rest/API/Common/InviteGuild.cs | 1 - src/Discord.Net.Rest/API/Common/InviteMetadata.cs | 1 - src/Discord.Net.Rest/API/Common/Message.cs | 1 - src/Discord.Net.Rest/API/Common/Overwrite.cs | 1 - src/Discord.Net.Rest/API/Common/Presence.cs | 1 - src/Discord.Net.Rest/API/Common/ReadState.cs | 1 - src/Discord.Net.Rest/API/Common/Relationship.cs | 1 - src/Discord.Net.Rest/API/Common/RelationshipType.cs | 1 - src/Discord.Net.Rest/API/Common/Role.cs | 1 - src/Discord.Net.Rest/API/Common/RoleTags.cs | 1 - src/Discord.Net.Rest/API/Common/Sticker.cs | 1 - src/Discord.Net.Rest/API/Common/Team.cs | 1 - src/Discord.Net.Rest/API/Common/TeamMember.cs | 1 - src/Discord.Net.Rest/API/Common/User.cs | 1 - src/Discord.Net.Rest/API/Common/UserGuild.cs | 1 - src/Discord.Net.Rest/API/Common/VoiceRegion.cs | 1 - src/Discord.Net.Rest/API/Common/VoiceState.cs | 1 - src/Discord.Net.Rest/API/Common/Webhook.cs | 1 - src/Discord.Net.Rest/API/Int53Attribute.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateDMChannelParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateGuildBanParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateGuildEmoteParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateGuildIntegrationParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateGuildParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs | 1 - src/Discord.Net.Rest/API/Rest/CreateWebhookParams.cs | 1 - src/Discord.Net.Rest/API/Rest/DeleteMessagesParams.cs | 1 - src/Discord.Net.Rest/API/Rest/GetBotGatewayResponse.cs | 1 - src/Discord.Net.Rest/API/Rest/GetChannelMessagesParams.cs | 1 - src/Discord.Net.Rest/API/Rest/GetGatewayResponse.cs | 1 - src/Discord.Net.Rest/API/Rest/GetGuildMembersParams.cs | 1 - src/Discord.Net.Rest/API/Rest/GetGuildPruneCountResponse.cs | 1 - src/Discord.Net.Rest/API/Rest/GetGuildSummariesParams.cs | 1 - src/Discord.Net.Rest/API/Rest/GuildPruneParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyChannelPermissionsParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyCurrentUserNickParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyCurrentUserParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildChannelsParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildEmbedParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildEmoteParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildIntegrationParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildRolesParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyGuildWidgetParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyTextChannelParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyVoiceChannelParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs | 1 - src/Discord.Net.Rest/API/Rest/ModifyWebhookParams.cs | 1 - src/Discord.Net.Rest/API/Rest/SearchGuildMembersParams.cs | 1 - src/Discord.Net.Rest/API/Rest/UploadFileParams.cs | 1 - src/Discord.Net.Rest/API/Rest/UploadWebhookFileParams.cs | 1 - src/Discord.Net.Rest/DiscordRestApiClient.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildBanEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildEmojiUpdateEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildMemberAddEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildMemberRemoveEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildMembersChunkEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildRoleCreateEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildRoleDeleteEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildRoleUpdateEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/GuildSyncEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/HelloEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/MessageDeleteBulkEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/ReadyEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/RecipientEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/RequestMembersParams.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/ResumeParams.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/ResumedEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/TypingStartEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/VoiceServerUpdateEvent.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/VoiceStateUpdateParams.cs | 1 - src/Discord.Net.WebSocket/API/Gateway/WebhookUpdateEvent.cs | 1 - src/Discord.Net.WebSocket/API/SocketFrame.cs | 1 - src/Discord.Net.WebSocket/API/Voice/IdentifyParams.cs | 1 - src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs | 1 - src/Discord.Net.WebSocket/API/Voice/SelectProtocolParams.cs | 1 - src/Discord.Net.WebSocket/API/Voice/SessionDescriptionEvent.cs | 1 - src/Discord.Net.WebSocket/API/Voice/SpeakingEvent.cs | 1 - src/Discord.Net.WebSocket/API/Voice/SpeakingParams.cs | 1 - src/Discord.Net.WebSocket/API/Voice/UdpProtocolInfo.cs | 1 - src/Discord.Net.WebSocket/API/Voice/VoiceOpCode.cs | 1 - src/Discord.Net.WebSocket/DiscordSocketApiClient.cs | 1 - src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs | 1 - 114 files changed, 114 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/Application.cs b/src/Discord.Net.Rest/API/Common/Application.cs index aba3e524b4..e828f99103 100644 --- a/src/Discord.Net.Rest/API/Common/Application.cs +++ b/src/Discord.Net.Rest/API/Common/Application.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Attachment.cs b/src/Discord.Net.Rest/API/Common/Attachment.cs index 4a651d9fab..3ac445f8ca 100644 --- a/src/Discord.Net.Rest/API/Common/Attachment.cs +++ b/src/Discord.Net.Rest/API/Common/Attachment.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Ban.cs b/src/Discord.Net.Rest/API/Common/Ban.cs index 202004f533..ff47c7904d 100644 --- a/src/Discord.Net.Rest/API/Common/Ban.cs +++ b/src/Discord.Net.Rest/API/Common/Ban.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Channel.cs b/src/Discord.Net.Rest/API/Common/Channel.cs index 2dd0040210..afd219b639 100644 --- a/src/Discord.Net.Rest/API/Common/Channel.cs +++ b/src/Discord.Net.Rest/API/Common/Channel.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.Rest/API/Common/Connection.cs b/src/Discord.Net.Rest/API/Common/Connection.cs index ad0a76ac1d..bd8de3902a 100644 --- a/src/Discord.Net.Rest/API/Common/Connection.cs +++ b/src/Discord.Net.Rest/API/Common/Connection.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System.Collections.Generic; diff --git a/src/Discord.Net.Rest/API/Common/Embed.cs b/src/Discord.Net.Rest/API/Common/Embed.cs index fbf20d9873..77efa12aa5 100644 --- a/src/Discord.Net.Rest/API/Common/Embed.cs +++ b/src/Discord.Net.Rest/API/Common/Embed.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using System; using Newtonsoft.Json; using Discord.Net.Converters; diff --git a/src/Discord.Net.Rest/API/Common/EmbedImage.cs b/src/Discord.Net.Rest/API/Common/EmbedImage.cs index e650d99f45..6b5db0681c 100644 --- a/src/Discord.Net.Rest/API/Common/EmbedImage.cs +++ b/src/Discord.Net.Rest/API/Common/EmbedImage.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/EmbedProvider.cs b/src/Discord.Net.Rest/API/Common/EmbedProvider.cs index e012614835..ed0f7c3c89 100644 --- a/src/Discord.Net.Rest/API/Common/EmbedProvider.cs +++ b/src/Discord.Net.Rest/API/Common/EmbedProvider.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/EmbedThumbnail.cs b/src/Discord.Net.Rest/API/Common/EmbedThumbnail.cs index 9c87ca46b1..dd25a1a260 100644 --- a/src/Discord.Net.Rest/API/Common/EmbedThumbnail.cs +++ b/src/Discord.Net.Rest/API/Common/EmbedThumbnail.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/EmbedVideo.cs b/src/Discord.Net.Rest/API/Common/EmbedVideo.cs index 3a034d2441..f668217f0a 100644 --- a/src/Discord.Net.Rest/API/Common/EmbedVideo.cs +++ b/src/Discord.Net.Rest/API/Common/EmbedVideo.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Emoji.cs b/src/Discord.Net.Rest/API/Common/Emoji.cs index 945cc6d7ec..ff0baa73e9 100644 --- a/src/Discord.Net.Rest/API/Common/Emoji.cs +++ b/src/Discord.Net.Rest/API/Common/Emoji.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Game.cs b/src/Discord.Net.Rest/API/Common/Game.cs index 775b6aabcd..105ce0d736 100644 --- a/src/Discord.Net.Rest/API/Common/Game.cs +++ b/src/Discord.Net.Rest/API/Common/Game.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Runtime.Serialization; diff --git a/src/Discord.Net.Rest/API/Common/Guild.cs b/src/Discord.Net.Rest/API/Common/Guild.cs index c5ec00117e..fd8a0bdb57 100644 --- a/src/Discord.Net.Rest/API/Common/Guild.cs +++ b/src/Discord.Net.Rest/API/Common/Guild.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/GuildMember.cs b/src/Discord.Net.Rest/API/Common/GuildMember.cs index fc2092d6ca..53f4908bff 100644 --- a/src/Discord.Net.Rest/API/Common/GuildMember.cs +++ b/src/Discord.Net.Rest/API/Common/GuildMember.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.Rest/API/Common/GuildWidget.cs b/src/Discord.Net.Rest/API/Common/GuildWidget.cs index c15ad8aac3..6b1d29cce9 100644 --- a/src/Discord.Net.Rest/API/Common/GuildWidget.cs +++ b/src/Discord.Net.Rest/API/Common/GuildWidget.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Integration.cs b/src/Discord.Net.Rest/API/Common/Integration.cs index 8213599752..47d67e1492 100644 --- a/src/Discord.Net.Rest/API/Common/Integration.cs +++ b/src/Discord.Net.Rest/API/Common/Integration.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.Rest/API/Common/IntegrationAccount.cs b/src/Discord.Net.Rest/API/Common/IntegrationAccount.cs index 22831e795e..a8d33931c6 100644 --- a/src/Discord.Net.Rest/API/Common/IntegrationAccount.cs +++ b/src/Discord.Net.Rest/API/Common/IntegrationAccount.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Invite.cs b/src/Discord.Net.Rest/API/Common/Invite.cs index aba267f34a..f9d53bad6f 100644 --- a/src/Discord.Net.Rest/API/Common/Invite.cs +++ b/src/Discord.Net.Rest/API/Common/Invite.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/InviteChannel.cs b/src/Discord.Net.Rest/API/Common/InviteChannel.cs index f8f2a34f2b..d601e65fe3 100644 --- a/src/Discord.Net.Rest/API/Common/InviteChannel.cs +++ b/src/Discord.Net.Rest/API/Common/InviteChannel.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/InviteGuild.cs b/src/Discord.Net.Rest/API/Common/InviteGuild.cs index 3d6d7cd74c..f5c634e4ec 100644 --- a/src/Discord.Net.Rest/API/Common/InviteGuild.cs +++ b/src/Discord.Net.Rest/API/Common/InviteGuild.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/InviteMetadata.cs b/src/Discord.Net.Rest/API/Common/InviteMetadata.cs index f818de699a..a06d069695 100644 --- a/src/Discord.Net.Rest/API/Common/InviteMetadata.cs +++ b/src/Discord.Net.Rest/API/Common/InviteMetadata.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index e88a94af8c..3b9e5379a4 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.Rest/API/Common/Overwrite.cs b/src/Discord.Net.Rest/API/Common/Overwrite.cs index 3d94b0640e..a1fb534d8e 100644 --- a/src/Discord.Net.Rest/API/Common/Overwrite.cs +++ b/src/Discord.Net.Rest/API/Common/Overwrite.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Presence.cs b/src/Discord.Net.Rest/API/Common/Presence.cs index b44e9185d1..23f871ae60 100644 --- a/src/Discord.Net.Rest/API/Common/Presence.cs +++ b/src/Discord.Net.Rest/API/Common/Presence.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; using System.Collections.Generic; diff --git a/src/Discord.Net.Rest/API/Common/ReadState.cs b/src/Discord.Net.Rest/API/Common/ReadState.cs index 6ea6e4bd0b..9a66880c6f 100644 --- a/src/Discord.Net.Rest/API/Common/ReadState.cs +++ b/src/Discord.Net.Rest/API/Common/ReadState.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Relationship.cs b/src/Discord.Net.Rest/API/Common/Relationship.cs index ecbb96f808..d17f766af4 100644 --- a/src/Discord.Net.Rest/API/Common/Relationship.cs +++ b/src/Discord.Net.Rest/API/Common/Relationship.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/RelationshipType.cs b/src/Discord.Net.Rest/API/Common/RelationshipType.cs index 0ed99f396e..776ba156bd 100644 --- a/src/Discord.Net.Rest/API/Common/RelationshipType.cs +++ b/src/Discord.Net.Rest/API/Common/RelationshipType.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API { internal enum RelationshipType diff --git a/src/Discord.Net.Rest/API/Common/Role.cs b/src/Discord.Net.Rest/API/Common/Role.cs index c655175dae..4c33956afe 100644 --- a/src/Discord.Net.Rest/API/Common/Role.cs +++ b/src/Discord.Net.Rest/API/Common/Role.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/RoleTags.cs b/src/Discord.Net.Rest/API/Common/RoleTags.cs index 6446f2037f..9ddd39a64b 100644 --- a/src/Discord.Net.Rest/API/Common/RoleTags.cs +++ b/src/Discord.Net.Rest/API/Common/RoleTags.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Sticker.cs b/src/Discord.Net.Rest/API/Common/Sticker.cs index 490c16dbe5..45e6d18b37 100644 --- a/src/Discord.Net.Rest/API/Common/Sticker.cs +++ b/src/Discord.Net.Rest/API/Common/Sticker.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/Team.cs b/src/Discord.Net.Rest/API/Common/Team.cs index 852368522e..b421dc18c0 100644 --- a/src/Discord.Net.Rest/API/Common/Team.cs +++ b/src/Discord.Net.Rest/API/Common/Team.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/TeamMember.cs b/src/Discord.Net.Rest/API/Common/TeamMember.cs index 788f73b61e..f3cba608e1 100644 --- a/src/Discord.Net.Rest/API/Common/TeamMember.cs +++ b/src/Discord.Net.Rest/API/Common/TeamMember.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/User.cs b/src/Discord.Net.Rest/API/Common/User.cs index 4d1b5b2b7e..08fe88cb05 100644 --- a/src/Discord.Net.Rest/API/Common/User.cs +++ b/src/Discord.Net.Rest/API/Common/User.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/UserGuild.cs b/src/Discord.Net.Rest/API/Common/UserGuild.cs index 825e9a09a7..fc1fe833df 100644 --- a/src/Discord.Net.Rest/API/Common/UserGuild.cs +++ b/src/Discord.Net.Rest/API/Common/UserGuild.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/VoiceRegion.cs b/src/Discord.Net.Rest/API/Common/VoiceRegion.cs index 606af07bd4..3cc66a0ef5 100644 --- a/src/Discord.Net.Rest/API/Common/VoiceRegion.cs +++ b/src/Discord.Net.Rest/API/Common/VoiceRegion.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Common/VoiceState.cs b/src/Discord.Net.Rest/API/Common/VoiceState.cs index 27aacb6a42..f7cd54a72e 100644 --- a/src/Discord.Net.Rest/API/Common/VoiceState.cs +++ b/src/Discord.Net.Rest/API/Common/VoiceState.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.Rest/API/Common/Webhook.cs b/src/Discord.Net.Rest/API/Common/Webhook.cs index eb504a27c2..23b682bd3e 100644 --- a/src/Discord.Net.Rest/API/Common/Webhook.cs +++ b/src/Discord.Net.Rest/API/Common/Webhook.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Int53Attribute.cs b/src/Discord.Net.Rest/API/Int53Attribute.cs index 70ef2f1855..3a21b583dd 100644 --- a/src/Discord.Net.Rest/API/Int53Attribute.cs +++ b/src/Discord.Net.Rest/API/Int53Attribute.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using System; namespace Discord.API diff --git a/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs b/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs index 06a47f1a88..852abe3016 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateChannelInviteParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/CreateDMChannelParams.cs b/src/Discord.Net.Rest/API/Rest/CreateDMChannelParams.cs index f32796e026..0a710dd1bf 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateDMChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateDMChannelParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildBanParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildBanParams.cs index f0432e517c..fce9df11f1 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateGuildBanParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateGuildBanParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API.Rest { internal class CreateGuildBanParams diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs index aec43dbef3..57816e4481 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildEmoteParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildEmoteParams.cs index 3081998207..c81f62f4cb 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateGuildEmoteParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateGuildEmoteParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildIntegrationParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildIntegrationParams.cs index 1053a0ed3f..7358e5201f 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateGuildIntegrationParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateGuildIntegrationParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildParams.cs index cda6caedf7..e89c2b1198 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateGuildParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateGuildParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs index 49321652f5..5996c7e837 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateMessageParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index 47f5bb2a9c..e21cae845c 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Discord.Net.Converters; using Discord.Net.Rest; using Newtonsoft.Json; diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookParams.cs index 0d1059fabb..242f451cb4 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/DeleteMessagesParams.cs b/src/Discord.Net.Rest/API/Rest/DeleteMessagesParams.cs index ca9d8c26e4..ca6b784060 100644 --- a/src/Discord.Net.Rest/API/Rest/DeleteMessagesParams.cs +++ b/src/Discord.Net.Rest/API/Rest/DeleteMessagesParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/GetBotGatewayResponse.cs b/src/Discord.Net.Rest/API/Rest/GetBotGatewayResponse.cs index d3285051bb..3f8318cd1b 100644 --- a/src/Discord.Net.Rest/API/Rest/GetBotGatewayResponse.cs +++ b/src/Discord.Net.Rest/API/Rest/GetBotGatewayResponse.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/GetChannelMessagesParams.cs b/src/Discord.Net.Rest/API/Rest/GetChannelMessagesParams.cs index ea5327667e..52dd848368 100644 --- a/src/Discord.Net.Rest/API/Rest/GetChannelMessagesParams.cs +++ b/src/Discord.Net.Rest/API/Rest/GetChannelMessagesParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API.Rest { internal class GetChannelMessagesParams diff --git a/src/Discord.Net.Rest/API/Rest/GetGatewayResponse.cs b/src/Discord.Net.Rest/API/Rest/GetGatewayResponse.cs index ce36301708..11207633d1 100644 --- a/src/Discord.Net.Rest/API/Rest/GetGatewayResponse.cs +++ b/src/Discord.Net.Rest/API/Rest/GetGatewayResponse.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/GetGuildMembersParams.cs b/src/Discord.Net.Rest/API/Rest/GetGuildMembersParams.cs index 66023cb432..67d3800358 100644 --- a/src/Discord.Net.Rest/API/Rest/GetGuildMembersParams.cs +++ b/src/Discord.Net.Rest/API/Rest/GetGuildMembersParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API.Rest { internal class GetGuildMembersParams diff --git a/src/Discord.Net.Rest/API/Rest/GetGuildPruneCountResponse.cs b/src/Discord.Net.Rest/API/Rest/GetGuildPruneCountResponse.cs index 4af85acfad..1e7fc8c7b6 100644 --- a/src/Discord.Net.Rest/API/Rest/GetGuildPruneCountResponse.cs +++ b/src/Discord.Net.Rest/API/Rest/GetGuildPruneCountResponse.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/GetGuildSummariesParams.cs b/src/Discord.Net.Rest/API/Rest/GetGuildSummariesParams.cs index f770ef398d..1d3f70f07d 100644 --- a/src/Discord.Net.Rest/API/Rest/GetGuildSummariesParams.cs +++ b/src/Discord.Net.Rest/API/Rest/GetGuildSummariesParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API.Rest { internal class GetGuildSummariesParams diff --git a/src/Discord.Net.Rest/API/Rest/GuildPruneParams.cs b/src/Discord.Net.Rest/API/Rest/GuildPruneParams.cs index e4c9192ad8..c6caa1eb1f 100644 --- a/src/Discord.Net.Rest/API/Rest/GuildPruneParams.cs +++ b/src/Discord.Net.Rest/API/Rest/GuildPruneParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyChannelPermissionsParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyChannelPermissionsParams.cs index 269111a617..acb81034ac 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyChannelPermissionsParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyChannelPermissionsParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserNickParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserNickParams.cs index ba44e34cf8..c10f2e4ec1 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserNickParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserNickParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserParams.cs index 7ba27c3a5d..e28deb32b8 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyCurrentUserParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs index e5e8a46320..dfe9cd9809 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelsParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelsParams.cs index f97fbda0b5..91567be3d3 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelsParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelsParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildEmbedParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildEmbedParams.cs index 487744c65a..420bdbeafc 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildEmbedParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildEmbedParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildEmoteParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildEmoteParams.cs index a2295dd5d8..08b196daa5 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildEmoteParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildEmoteParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildIntegrationParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildIntegrationParams.cs index 0a1b4f9faf..cf869c838f 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildIntegrationParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildIntegrationParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs index a381d6f8ff..37625de093 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs index cfb107bcda..feda243028 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs index 8605411c59..ce8c86fbf5 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildRolesParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildRolesParams.cs index 0e816a2603..eeb7245230 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildRolesParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildRolesParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildWidgetParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildWidgetParams.cs index 506f1dfbb8..2e5658d513 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildWidgetParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildWidgetParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs index 21ed1a4189..3dba45a5b7 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyMessageParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyTextChannelParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyTextChannelParams.cs index 94f149fc1c..409d90c3fb 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyTextChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyTextChannelParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyVoiceChannelParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyVoiceChannelParams.cs index ce36eb11f3..d55cdb6371 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyVoiceChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyVoiceChannelParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs index 8298ff19c8..e73efaf36a 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyWebhookMessageParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/ModifyWebhookParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyWebhookParams.cs index 0f2d6e33bb..2e4e6a4c42 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyWebhookParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyWebhookParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParams.cs b/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParams.cs index 7c933ff828..56b3595fac 100644 --- a/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParams.cs +++ b/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API.Rest { internal class SearchGuildMembersParams diff --git a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs index 1ee918ae70..f18da65c19 100644 --- a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs +++ b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Discord.Net.Converters; using Discord.Net.Rest; using Newtonsoft.Json; diff --git a/src/Discord.Net.Rest/API/Rest/UploadWebhookFileParams.cs b/src/Discord.Net.Rest/API/Rest/UploadWebhookFileParams.cs index 8da7681ae2..d925e0108b 100644 --- a/src/Discord.Net.Rest/API/Rest/UploadWebhookFileParams.cs +++ b/src/Discord.Net.Rest/API/Rest/UploadWebhookFileParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using System.Collections.Generic; using System.IO; using System.Text; diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 7d883fac66..f42d338715 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1,5 +1,4 @@ -#pragma warning disable CS1591 using Discord.API.Rest; using Discord.Net; using Discord.Net.Converters; diff --git a/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs b/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs index da02b737a4..203f2fd5b0 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs b/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs index 062aec2244..6f8bf48d49 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GatewayOpCode.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API.Gateway { internal enum GatewayOpCode : byte diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildBanEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildBanEvent.cs index 59a3304dd8..a8a72e791c 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildBanEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildBanEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildEmojiUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildEmojiUpdateEvent.cs index 715341dc53..33c10e6482 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildEmojiUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildEmojiUpdateEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberAddEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberAddEvent.cs index 350652faf2..dd42978fc0 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberAddEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberAddEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberRemoveEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberRemoveEvent.cs index 501408a7f6..ec7df8fd34 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberRemoveEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberRemoveEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs index 744d2d502a..0f6fa6f378 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildMemberUpdateEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildMembersChunkEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildMembersChunkEvent.cs index e401d7fa19..26114bf541 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildMembersChunkEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildMembersChunkEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildRoleCreateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildRoleCreateEvent.cs index 3409b1c911..3b02164d5b 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildRoleCreateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildRoleCreateEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildRoleDeleteEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildRoleDeleteEvent.cs index dbdaeff672..d9bdb9892d 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildRoleDeleteEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildRoleDeleteEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildRoleUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildRoleUpdateEvent.cs index b04ecb182c..bb6a396201 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildRoleUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildRoleUpdateEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildSyncEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildSyncEvent.cs index 6b2e6c02f8..ba4c1ca609 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildSyncEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildSyncEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/HelloEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/HelloEvent.cs index e1ed9463cb..a53a96fd85 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/HelloEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/HelloEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs b/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs index 3b7ef35d64..96c7cb32f1 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System.Collections.Generic; diff --git a/src/Discord.Net.WebSocket/API/Gateway/MessageDeleteBulkEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/MessageDeleteBulkEvent.cs index a4cf7d7eb4..c503e636d0 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/MessageDeleteBulkEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/MessageDeleteBulkEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System.Collections.Generic; diff --git a/src/Discord.Net.WebSocket/API/Gateway/ReadyEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ReadyEvent.cs index ab92d8c364..5cd75dbee0 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ReadyEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ReadyEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/RecipientEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/RecipientEvent.cs index 336ffd029a..778b5708c8 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/RecipientEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/RecipientEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/RequestMembersParams.cs b/src/Discord.Net.WebSocket/API/Gateway/RequestMembersParams.cs index 6a8d283ed7..f7a63e330c 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/RequestMembersParams.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/RequestMembersParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System.Collections.Generic; diff --git a/src/Discord.Net.WebSocket/API/Gateway/ResumeParams.cs b/src/Discord.Net.WebSocket/API/Gateway/ResumeParams.cs index ffb46327b0..826e8fadd5 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ResumeParams.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ResumeParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/ResumedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ResumedEvent.cs index d1347beae3..870ae7366d 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ResumedEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ResumedEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs b/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs index 96897024c6..cbde225d2b 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/StatusUpdateParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/TypingStartEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/TypingStartEvent.cs index 5ceae4b7aa..729ea176fb 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/TypingStartEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/TypingStartEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/VoiceServerUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/VoiceServerUpdateEvent.cs index 29167c1cc5..8df3f01085 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/VoiceServerUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/VoiceServerUpdateEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/VoiceStateUpdateParams.cs b/src/Discord.Net.WebSocket/API/Gateway/VoiceStateUpdateParams.cs index 5211601265..ad21b14f18 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/VoiceStateUpdateParams.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/VoiceStateUpdateParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/Gateway/WebhookUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/WebhookUpdateEvent.cs index e5c7afe418..c1e6d5385a 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/WebhookUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/WebhookUpdateEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Gateway diff --git a/src/Discord.Net.WebSocket/API/SocketFrame.cs b/src/Discord.Net.WebSocket/API/SocketFrame.cs index fae7414322..11c82ec44d 100644 --- a/src/Discord.Net.WebSocket/API/SocketFrame.cs +++ b/src/Discord.Net.WebSocket/API/SocketFrame.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API diff --git a/src/Discord.Net.WebSocket/API/Voice/IdentifyParams.cs b/src/Discord.Net.WebSocket/API/Voice/IdentifyParams.cs index d446867e17..508b70d70c 100644 --- a/src/Discord.Net.WebSocket/API/Voice/IdentifyParams.cs +++ b/src/Discord.Net.WebSocket/API/Voice/IdentifyParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Voice diff --git a/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs b/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs index 7188cd8f7c..10479cdb29 100644 --- a/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs +++ b/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; using System; diff --git a/src/Discord.Net.WebSocket/API/Voice/SelectProtocolParams.cs b/src/Discord.Net.WebSocket/API/Voice/SelectProtocolParams.cs index 8c577e5b58..2e9bd157aa 100644 --- a/src/Discord.Net.WebSocket/API/Voice/SelectProtocolParams.cs +++ b/src/Discord.Net.WebSocket/API/Voice/SelectProtocolParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Voice diff --git a/src/Discord.Net.WebSocket/API/Voice/SessionDescriptionEvent.cs b/src/Discord.Net.WebSocket/API/Voice/SessionDescriptionEvent.cs index 45befadcf6..043b9fe862 100644 --- a/src/Discord.Net.WebSocket/API/Voice/SessionDescriptionEvent.cs +++ b/src/Discord.Net.WebSocket/API/Voice/SessionDescriptionEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Voice diff --git a/src/Discord.Net.WebSocket/API/Voice/SpeakingEvent.cs b/src/Discord.Net.WebSocket/API/Voice/SpeakingEvent.cs index 0272a8f53e..c1746e9cef 100644 --- a/src/Discord.Net.WebSocket/API/Voice/SpeakingEvent.cs +++ b/src/Discord.Net.WebSocket/API/Voice/SpeakingEvent.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Voice diff --git a/src/Discord.Net.WebSocket/API/Voice/SpeakingParams.cs b/src/Discord.Net.WebSocket/API/Voice/SpeakingParams.cs index abdf906670..e03bfc751c 100644 --- a/src/Discord.Net.WebSocket/API/Voice/SpeakingParams.cs +++ b/src/Discord.Net.WebSocket/API/Voice/SpeakingParams.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Voice diff --git a/src/Discord.Net.WebSocket/API/Voice/UdpProtocolInfo.cs b/src/Discord.Net.WebSocket/API/Voice/UdpProtocolInfo.cs index 6f4719e7e2..5e69a03704 100644 --- a/src/Discord.Net.WebSocket/API/Voice/UdpProtocolInfo.cs +++ b/src/Discord.Net.WebSocket/API/Voice/UdpProtocolInfo.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API.Voice diff --git a/src/Discord.Net.WebSocket/API/Voice/VoiceOpCode.cs b/src/Discord.Net.WebSocket/API/Voice/VoiceOpCode.cs index 67afe6173b..94006505ad 100644 --- a/src/Discord.Net.WebSocket/API/Voice/VoiceOpCode.cs +++ b/src/Discord.Net.WebSocket/API/Voice/VoiceOpCode.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 namespace Discord.API.Voice { internal enum VoiceOpCode : byte diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index a305bb0b4f..1d1b54895d 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Discord.API.Gateway; using Discord.Net.Queue; using Discord.Net.Rest; diff --git a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs index 69894e2020..62d95402ae 100644 --- a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs @@ -1,4 +1,3 @@ -#pragma warning disable CS1591 using Discord.API; using Discord.API.Voice; using Discord.Net.Converters; From dba39621cd52049bab938d05d20e1d8ac017029f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 13:58:44 +0200 Subject: [PATCH 283/494] Inlined variable declarations (#185) --- .../Extensions/MessageExtensions.cs | 3 +-- src/Discord.Net.Webhook/DiscordWebhookClient.cs | 3 +-- test/Discord.Net.Tests.Unit/MentionUtilsTests.cs | 12 +++--------- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/Discord.Net.Commands/Extensions/MessageExtensions.cs b/src/Discord.Net.Commands/Extensions/MessageExtensions.cs index f880e1d98c..9aa83d418c 100644 --- a/src/Discord.Net.Commands/Extensions/MessageExtensions.cs +++ b/src/Discord.Net.Commands/Extensions/MessageExtensions.cs @@ -51,8 +51,7 @@ public static bool HasMentionPrefix(this IUserMessage msg, IUser user, ref int a if (endPos == -1) return false; if (text.Length < endPos + 2 || text[endPos + 1] != ' ') return false; //Must end in "> " - ulong userId; - if (!MentionUtils.TryParseUser(text.Substring(0, endPos + 1), out userId)) return false; + if (!MentionUtils.TryParseUser(text.Substring(0, endPos + 1), out ulong userId)) return false; if (userId == user.Id) { argPos = endPos + 2; diff --git a/src/Discord.Net.Webhook/DiscordWebhookClient.cs b/src/Discord.Net.Webhook/DiscordWebhookClient.cs index d4affb08ba..a4fdf91796 100644 --- a/src/Discord.Net.Webhook/DiscordWebhookClient.cs +++ b/src/Discord.Net.Webhook/DiscordWebhookClient.cs @@ -60,8 +60,7 @@ public DiscordWebhookClient(IWebhook webhook, DiscordRestConfig config) /// Thrown if the is null or whitespace. public DiscordWebhookClient(string webhookUrl, DiscordRestConfig config) : this(config) { - string token; - ParseWebhookUrl(webhookUrl, out _webhookId, out token); + ParseWebhookUrl(webhookUrl, out _webhookId, out string token); ApiClient.LoginAsync(TokenType.Webhook, token).GetAwaiter().GetResult(); Webhook = WebhookClientHelper.GetWebhookAsync(this, _webhookId).GetAwaiter().GetResult(); } diff --git a/test/Discord.Net.Tests.Unit/MentionUtilsTests.cs b/test/Discord.Net.Tests.Unit/MentionUtilsTests.cs index 52f35fd9c2..abd1191c82 100644 --- a/test/Discord.Net.Tests.Unit/MentionUtilsTests.cs +++ b/test/Discord.Net.Tests.Unit/MentionUtilsTests.cs @@ -47,9 +47,7 @@ public void ParseUser_Pass(string user, ulong id) var parsed = MentionUtils.ParseUser(user); Assert.Equal(id, parsed); - // also check tryparse - ulong result; - Assert.True(MentionUtils.TryParseUser(user, out result)); + Assert.True(MentionUtils.TryParseUser(user, out ulong result)); Assert.Equal(id, result); } [Theory] @@ -75,9 +73,7 @@ public void ParseChannel_Pass(string channel, ulong id) var parsed = MentionUtils.ParseChannel(channel); Assert.Equal(id, parsed); - // also check tryparse - ulong result; - Assert.True(MentionUtils.TryParseChannel(channel, out result)); + Assert.True(MentionUtils.TryParseChannel(channel, out ulong result)); Assert.Equal(id, result); } [Theory] @@ -103,9 +99,7 @@ public void ParseRole_Pass(string role, ulong id) var parsed = MentionUtils.ParseRole(role); Assert.Equal(id, parsed); - // also check tryparse - ulong result; - Assert.True(MentionUtils.TryParseRole(role, out result)); + Assert.True(MentionUtils.TryParseRole(role, out ulong result)); Assert.Equal(id, result); } [Theory] From c997ac2779491ae8c634276b6558b735cd9f95e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 14:15:12 +0200 Subject: [PATCH 284/494] 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> --- .../Discord.Net.Commands.xml | 6 +- src/Discord.Net.Commands/ModuleBase.cs | 4 +- src/Discord.Net.Core/CDN.cs | 2 +- src/Discord.Net.Core/Discord.Net.Core.xml | 70 ++++++++++--------- .../Entities/Channels/IMessageChannel.cs | 8 +-- .../Entities/Channels/INestedChannel.cs | 4 +- .../Entities/Channels/IStageChannel.cs | 2 +- .../Entities/Guilds/IGuild.cs | 2 +- .../Interactions/IApplicationCommandOption.cs | 2 +- .../Interactions/IDiscordInteraction.cs | 10 +-- .../Message Components/ComponentBuilder.cs | 22 +++--- .../Slash Commands/SlashCommandBuilder.cs | 1 + .../Entities/Users/IGuildUser.cs | 2 +- .../Extensions/MessageExtensions.cs | 10 ++- .../Extensions/UserExtensions.cs | 6 +- .../Net/ApplicationCommandException.cs | 4 -- src/Discord.Net.Core/Utils/UrlValidation.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 10 +-- .../Entities/Channels/IRestMessageChannel.cs | 8 +-- .../Entities/Guilds/RestGuild.cs | 3 +- .../API/Gateway/ExtendedGuild.cs | 2 +- .../Discord.Net.WebSocket.xml | 40 +++++------ .../Channels/ISocketMessageChannel.cs | 8 +-- .../Entities/Guilds/SocketGuild.cs | 6 +- .../Entities/Interaction/SocketInteraction.cs | 34 ++++----- .../Helpers/CodeFixVerifier.Helper.cs | 10 +-- .../Helpers/DiagnosticVerifier.Helper.cs | 24 +++---- .../Verifiers/CodeFixVerifier.cs | 34 ++++----- .../Verifiers/DiagnosticVerifier.cs | 42 +++++------ 29 files changed, 192 insertions(+), 186 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml index cf68f8786a..4ef47930e0 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ b/src/Discord.Net.Commands/Discord.Net.Commands.xml @@ -1138,13 +1138,15 @@ Specifies if Discord should read this aloud using text-to-speech. An embed to be displayed alongside the . - A array of s to send with this response. Max 10 /// + Specifies if notifications are sent for mentioned users and roles in the . If null, all mentioned roles and users will be notified. + The request options for this async request. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. + A array of s to send with this response. Max 10. diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index a44fb26c0b..eb517e65d4 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -38,9 +38,9 @@ public abstract class ModuleBase : IModuleBase /// /// The request options for this async request. /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. - /// A array of s to send with this response. Max 10 + /// A array of s to send with this response. Max 10. protected virtual async Task ReplyAsync(string message = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { return await Context.Channel.SendMessageAsync(message, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index a744c93fe3..b48bef3798 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -181,7 +181,7 @@ public static string GetSpotifyDirectUrl(string trackId) /// Gets a stickers url based off the id and format. /// /// The id of the sticker. - /// The format of the sticker + /// The format of the sticker. /// /// A URL to the sticker. /// diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 9ee2ef4583..695c144613 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -217,7 +217,7 @@ Gets a stickers url based off the id and format. The id of the sticker. - The format of the sticker + The format of the sticker. A URL to the sticker. @@ -1526,9 +1526,9 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the message. - A array of s to send with this response. Max 10 + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -1567,7 +1567,7 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result @@ -1604,7 +1604,7 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result @@ -1870,7 +1870,7 @@ await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - The id of the embedded application to open for this invite + The id of the embedded application to open for this invite. The time (in seconds) until the invite expires. Set to null to never expire. The max amount of times this invite may be used. Set to null to have unlimited uses. If true, the user accepting this invite will be kicked from the guild after closing their client. @@ -1892,7 +1892,7 @@ await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - The id of the user whose stream to display for this invite + The id of the user whose stream to display for this invite. The time (in seconds) until the invite expires. Set to null to never expire. The max amount of times this invite may be used. Set to null to have unlimited uses. If true, the user accepting this invite will be kicked from the guild after closing their client. @@ -1979,7 +1979,7 @@ Starts the stage, creating a stage instance. The topic for the stage/ - The privacy level of the stage + The privacy level of the stage. The options to be used when sending the request. A task that represents the asynchronous start operation. @@ -3996,7 +3996,7 @@ The description of the sticker. The tags of the sticker. The stream containing the file data. - The name of the file with the extension, ex: image.png + The name of the file with the extension, ex: image.png. The options to be used when sending the request. A task that represents the asynchronous creation operation. The task result contains the created sticker. @@ -5007,25 +5007,25 @@ Responds to an Interaction with type . The text of the message to be sent. - A array of embeds to send with this response. Max 10 + A array of embeds to send with this response. Max 10. if the message should be read out by a text-to-speech reader, otherwise . if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. - A to be sent with this response + A to be sent with this response. A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. Sends a followup message for this interaction. - The text of the message to be sent - A array of embeds to send with this response. Max 10 + The text of the message to be sent. + A array of embeds to send with this response. Max 10. if the message should be read out by a text-to-speech reader, otherwise . if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. - A to be sent with this response + A to be sent with this response. A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. The sent message. @@ -5414,10 +5414,10 @@ The label to use on the newly created link button. The url of this button. - The custom ID of this button - The custom ID of this button - The emote of this button - Disabled this button or not + The custom ID of this button. + The custom ID of this button. + The emote of this button. + Disabled this button or not. @@ -5430,7 +5430,7 @@ The label for this link button. The url for this link button to go to. - The emote for this link button + The emote for this link button. A builder with the newly created button. @@ -5439,7 +5439,7 @@ The label for this danger button. The custom id for this danger button. - The emote for this danger button + The emote for this danger button. A builder with the newly created button. @@ -5448,7 +5448,7 @@ The label for this primary button. The custom id for this primary button. - The emote for this primary button + The emote for this primary button. A builder with the newly created button. @@ -5457,7 +5457,7 @@ The label for this secondary button. The custom id for this secondary button. - The emote for this secondary button + The emote for this secondary button. A builder with the newly created button. @@ -5466,14 +5466,14 @@ The label for this success button. The custom id for this success button. - The emote for this success button + The emote for this success button. A builder with the newly created button. Sets the current buttons label to the specified text. - The text for the label + The text for the label. The current builder. @@ -9114,6 +9114,12 @@ If true, a user may create private threads in this guild. + + If true, a user may use public threads in this guild. + + + If true, a user may use private threads in this guild. + If true, a user may use external stickers in this guild. @@ -9129,10 +9135,10 @@ Creates a new with the provided packed value after converting to ulong. - + Creates a new structure with the provided permissions. - + Creates a new from this one, changing the provided non-null permissions. @@ -11058,7 +11064,7 @@ The message to add reactions to. - An array of reactions to add to the message + An array of reactions to add to the message. The options to be used when sending the request. A task that represents the asynchronous operation for adding a reaction to this message. @@ -11080,7 +11086,7 @@ The message to remove reactions from. - An array of reactions to remove from the message + An array of reactions to remove from the message. The options to be used when sending the request. A task that represents the asynchronous operation for removing a reaction to this message. @@ -11095,7 +11101,7 @@ The message to be sent. Determines whether the message should be read aloud by Discord or not. The to be sent. - A array of s to send with this response. Max 10 + A array of s to send with this response. Max 10. Specifies if notifications are sent for mentioned users and roles in the message . If null, all mentioned roles and users will be notified. @@ -11130,13 +11136,13 @@ The message to be sent. Whether the message should be read aloud by Discord or not. The to be sent. - A array of s to send with this response. Max 10 + A array of s to send with this response. Max 10. The options to be used when sending the request. Specifies if notifications are sent for mentioned users and roles in the message . If null, all mentioned roles and users will be notified. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A task that represents the asynchronous send operation. The task result contains the sent message. @@ -12782,7 +12788,7 @@ Not full URL validation right now. Just ensures protocol is present and that it's either http or https - url to validate before sending to Discord + url to validate before sending to Discord. A URL must include a protocol (http or https). true if url is valid by our standard, false if null, throws an error upon invalid diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index 49fc5f433c..9e145a6301 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -28,9 +28,9 @@ public interface IMessageChannel : IChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the message. - /// A array of s to send with this response. Max 10 + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. @@ -68,7 +68,7 @@ public interface IMessageChannel : IChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result @@ -104,7 +104,7 @@ public interface IMessageChannel : IChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result diff --git a/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs b/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs index d8072f94fd..563acd4f87 100644 --- a/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs @@ -67,7 +67,7 @@ public interface INestedChannel : IGuildChannel /// await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); /// /// - /// The id of the embedded application to open for this invite + /// The id of the embedded application to open for this invite. /// The time (in seconds) until the invite expires. Set to null to never expire. /// The max amount of times this invite may be used. Set to null to have unlimited uses. /// If true, the user accepting this invite will be kicked from the guild after closing their client. @@ -89,7 +89,7 @@ public interface INestedChannel : IGuildChannel /// await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); /// /// - /// The id of the user whose stream to display for this invite + /// The id of the user whose stream to display for this invite. /// The time (in seconds) until the invite expires. Set to null to never expire. /// The max amount of times this invite may be used. Set to null to have unlimited uses. /// If true, the user accepting this invite will be kicked from the guild after closing their client. diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index 1461d8e509..9e417a4f12 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -44,7 +44,7 @@ public interface IStageChannel : IVoiceChannel /// Starts the stage, creating a stage instance. /// /// The topic for the stage/ - /// The privacy level of the stage + /// The privacy level of the stage. /// The options to be used when sending the request. /// /// A task that represents the asynchronous start operation. diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 87c3137003..9b5d6b23af 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -1009,7 +1009,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// The description of the sticker. /// The tags of the sticker. /// The stream containing the file data. - /// The name of the file with the extension, ex: image.png + /// The name of the file with the extension, ex: image.png. /// The options to be used when sending the request. /// /// A task that represents the asynchronous creation operation. The task result contains the created sticker. diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 25e3c7dfcd..0fc7fb4a3b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -7,7 +7,7 @@ namespace Discord { /// - /// Options for the , see The docs. + /// Options for the , see The docs. /// public interface IApplicationCommandOption { diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index ae015c2a68..0dea203eff 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -44,12 +44,12 @@ public interface IDiscordInteraction : ISnowflakeEntity /// Responds to an Interaction with type . /// /// The text of the message to be sent. - /// A array of embeds to send with this response. Max 10 + /// A array of embeds to send with this response. Max 10. /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. - /// A to be sent with this response + /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); @@ -57,13 +57,13 @@ Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false /// /// Sends a followup message for this interaction. /// - /// The text of the message to be sent - /// A array of embeds to send with this response. Max 10 + /// The text of the message to be sent. + /// A array of embeds to send with this response. Max 10. /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. - /// A to be sent with this response + /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. /// /// The sent message. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index be7f783048..8dbcb4319e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -240,7 +240,7 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) /// /// Builds this builder into a used to send your components. /// - /// A that can be sent with . + /// A that can be sent with . public MessageComponent Build() { if (this._actionRows != null) @@ -427,10 +427,10 @@ public ButtonBuilder() { } /// /// The label to use on the newly created link button. /// The url of this button. - /// The custom ID of this button - /// The custom ID of this button - /// The emote of this button - /// Disabled this button or not + /// The custom ID of this button. + /// The custom ID of this button. + /// The emote of this button. + /// Disabled this button or not. public ButtonBuilder(string label = null, string customId = null, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool disabled = false) { this.CustomId = customId; @@ -459,7 +459,7 @@ public ButtonBuilder(ButtonComponent button) /// /// The label for this link button. /// The url for this link button to go to. - /// The emote for this link button + /// The emote for this link button. /// A builder with the newly created button. public static ButtonBuilder CreateLinkButton(string label, string url, IEmote emote = null) => new ButtonBuilder(label, null, ButtonStyle.Link, url, emote: emote); @@ -469,7 +469,7 @@ public static ButtonBuilder CreateLinkButton(string label, string url, IEmote em /// /// The label for this danger button. /// The custom id for this danger button. - /// The emote for this danger button + /// The emote for this danger button. /// A builder with the newly created button. public static ButtonBuilder CreateDangerButton(string label, string customId, IEmote emote = null) => new ButtonBuilder(label, customId, ButtonStyle.Danger, emote: emote); @@ -479,7 +479,7 @@ public static ButtonBuilder CreateDangerButton(string label, string customId, IE /// /// The label for this primary button. /// The custom id for this primary button. - /// The emote for this primary button + /// The emote for this primary button. /// A builder with the newly created button. public static ButtonBuilder CreatePrimaryButton(string label, string customId, IEmote emote = null) => new ButtonBuilder(label, customId, emote: emote); @@ -489,7 +489,7 @@ public static ButtonBuilder CreatePrimaryButton(string label, string customId, I /// /// The label for this secondary button. /// The custom id for this secondary button. - /// The emote for this secondary button + /// The emote for this secondary button. /// A builder with the newly created button. public static ButtonBuilder CreateSecondaryButton(string label, string customId, IEmote emote = null) => new ButtonBuilder(label, customId, ButtonStyle.Secondary, emote: emote); @@ -499,7 +499,7 @@ public static ButtonBuilder CreateSecondaryButton(string label, string customId, /// /// The label for this success button. /// The custom id for this success button. - /// The emote for this success button + /// The emote for this success button. /// A builder with the newly created button. public static ButtonBuilder CreateSuccessButton(string label, string customId, IEmote emote = null) => new ButtonBuilder(label, customId, ButtonStyle.Success, emote: emote); @@ -507,7 +507,7 @@ public static ButtonBuilder CreateSuccessButton(string label, string customId, I /// /// Sets the current buttons label to the specified text. /// - /// The text for the label + /// The text for the label. /// /// The current builder. public ButtonBuilder WithLabel(string label) diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 9581015d0c..79afa410d7 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -161,6 +161,7 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// The description of this option. /// If this option is required for this command. /// If this option is the default option. + /// If this option is set to autocompleate. /// The options of the option to add. /// The choices of this option. /// The current builder. diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs index e131a6a612..58a797c5fc 100644 --- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs @@ -84,7 +84,7 @@ public interface IGuildUser : IUser, IVoiceState /// /// The following example checks if the current user has the ability to send a message with attachment in /// this channel; if so, uploads a file via . - /// + /// /// if (currentUser?.GetPermissions(targetChannel)?.AttachFiles) /// await targetChannel.SendFileAsync("fortnite.png"); /// diff --git a/src/Discord.Net.Core/Extensions/MessageExtensions.cs b/src/Discord.Net.Core/Extensions/MessageExtensions.cs index be47c0587c..3b21c128ac 100644 --- a/src/Discord.Net.Core/Extensions/MessageExtensions.cs +++ b/src/Discord.Net.Core/Extensions/MessageExtensions.cs @@ -34,7 +34,7 @@ public static string GetJumpUrl(this IMessage msg) /// /// /// The message to add reactions to. - /// An array of reactions to add to the message + /// An array of reactions to add to the message. /// The options to be used when sending the request. /// /// A task that represents the asynchronous operation for adding a reaction to this message. @@ -59,7 +59,8 @@ public static async Task AddReactionsAsync(this IUserMessage msg, IEmote[] react /// /// /// The message to remove reactions from. - /// An array of reactions to remove from the message + /// The user who removed the reaction. + /// An array of reactions to remove from the message. /// The options to be used when sending the request. /// /// A task that represents the asynchronous operation for removing a reaction to this message. @@ -75,15 +76,18 @@ public static async Task RemoveReactionsAsync(this IUserMessage msg, IUser user, /// /// Sends an inline reply that references a message. /// + /// The message that is being replyed on. /// The message to be sent. /// Determines whether the message should be read aloud by Discord or not. /// The to be sent. - /// A array of s to send with this response. Max 10 + /// A array of s to send with this response. Max 10. /// /// Specifies if notifications are sent for mentioned users and roles in the message . /// If null, all mentioned roles and users will be notified. /// /// The options to be used when sending the request. + /// The message components to be included with this message. Used for interactions. + /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. diff --git a/src/Discord.Net.Core/Extensions/UserExtensions.cs b/src/Discord.Net.Core/Extensions/UserExtensions.cs index 3f05b63617..aa807c073b 100644 --- a/src/Discord.Net.Core/Extensions/UserExtensions.cs +++ b/src/Discord.Net.Core/Extensions/UserExtensions.cs @@ -27,13 +27,13 @@ public static class UserExtensions /// The message to be sent. /// Whether the message should be read aloud by Discord or not. /// The to be sent. - /// A array of s to send with this response. Max 10 + /// A array of s to send with this response. Max 10. /// The options to be used when sending the request. /// /// Specifies if notifications are sent for mentioned users and roles in the message . /// If null, all mentioned roles and users will be notified. /// - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// /// A task that represents the asynchronous send operation. The task result contains the sent message. /// @@ -85,6 +85,7 @@ public static async Task SendMessageAsync(this IUser user, /// Whether the message should be read aloud by Discord or not. /// The to be sent. /// The options to be used when sending the request. + /// The message component to be included with this message. Used for interactions. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. @@ -142,6 +143,7 @@ public static async Task SendFileAsync(this IUser user, /// Whether the message should be read aloud by Discord or not. /// The to be sent. /// The options to be used when sending the request. + /// The message component to be included with this message. Used for interactions. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. diff --git a/src/Discord.Net.Core/Net/ApplicationCommandException.cs b/src/Discord.Net.Core/Net/ApplicationCommandException.cs index 7e94293f4a..acf19afe46 100644 --- a/src/Discord.Net.Core/Net/ApplicationCommandException.cs +++ b/src/Discord.Net.Core/Net/ApplicationCommandException.cs @@ -48,12 +48,8 @@ public class ApplicationCommandException : Exception /// /// Initializes a new instance of the class. /// - /// The request that was sent prior to the exception. /// /// - /// The Discord status code returned. - /// The reason behind the exception. - /// public ApplicationCommandException(string requestJson, HttpException httpError) : base("The application command failed to be created!", httpError) { diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs index 7cc9bd8bd4..f5d7d4ce76 100644 --- a/src/Discord.Net.Core/Utils/UrlValidation.cs +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -7,7 +7,7 @@ static class UrlValidation /// /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https /// - /// url to validate before sending to Discord + /// url to validate before sending to Discord. /// A URL must include a protocol (http or https). /// true if url is valid by our standard, false if null, throws an error upon invalid public static bool Validate(string url) diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 28f8ab534b..af46d06ad2 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -1781,9 +1781,9 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the message. - A array of s to send with this response. Max 10 + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -1809,7 +1809,7 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result @@ -1836,7 +1836,7 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result @@ -3666,7 +3666,7 @@ The description of the sticker. The tags of the sticker. The stream containing the file data. - The name of the file with the extension, ex: image.png + The name of the file with the extension, ex: image.png. The options to be used when sending the request. A task that represents the asynchronous creation operation. The task result contains the created sticker. diff --git a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs index 2b39e97d6f..0198fea87e 100644 --- a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs @@ -25,9 +25,9 @@ public interface IRestMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the message. - /// A array of s to send with this response. Max 10 + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. @@ -52,7 +52,7 @@ public interface IRestMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result @@ -78,7 +78,7 @@ public interface IRestMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the message. /// /// A task that represents an asynchronous send operation for delivering the message. The task result diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index a313de8107..d78ff07cc7 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -494,7 +494,6 @@ public async Task GetStageChannelAsync(ulong id, RequestOption /// /// Gets a collection of all stage channels in this guild. /// - /// The that determines whether the object should be fetched from cache. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of @@ -1044,7 +1043,7 @@ public Task CreateStickerAsync(string name, string description, I /// The description of the sticker. /// The tags of the sticker. /// The stream containing the file data. - /// The name of the file with the extension, ex: image.png + /// The name of the file with the extension, ex: image.png. /// The options to be used when sending the request. /// /// A task that represents the asynchronous creation operation. The task result contains the created sticker. diff --git a/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs b/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs index 203f2fd5b0..8470c6d8f7 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ExtendedGuild.cs @@ -27,6 +27,6 @@ internal class ExtendedGuild : Guild public DateTimeOffset JoinedAt { get; set; } [JsonProperty("threads")] - public Channel[] Threads { get; set; } + public new Channel[] Threads { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index ae283b4d17..c194d00efb 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1474,9 +1474,9 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the message. - A array of s to send with this response. Max 10 + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -1501,7 +1501,7 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result @@ -1528,7 +1528,7 @@ If null, all mentioned roles and users will be notified. The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions + The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. A task that represents an asynchronous send operation for delivering the message. The task result @@ -3632,7 +3632,7 @@ The description of the sticker. The tags of the sticker. The stream containing the file data. - The name of the file with the extension, ex: image.png + The name of the file with the extension, ex: image.png. The options to be used when sending the request. A task that represents the asynchronous creation operation. The task result contains the created sticker. @@ -4292,12 +4292,12 @@ The text of the message to be sent. - A array of embeds to send with this response. Max 10 + A array of embeds to send with this response. Max 10. if the message should be read out by a text-to-speech reader, otherwise . if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. - A to be sent with this response + A to be sent with this response. A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. Message content is too long, length must be less or equal to . The parameters provided were invalid or the token was invalid. @@ -4306,13 +4306,13 @@ Sends a followup message for this interaction. - The text of the message to be sent - A array of embeds to send with this response. Max 10 + The text of the message to be sent. + A array of embeds to send with this response. Max 10. if the message should be read out by a text-to-speech reader, otherwise . if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. - A to be sent with this response + A to be sent with this response. A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. The sent message. @@ -4322,15 +4322,15 @@ Sends a followup message for this interaction. - The text of the message to be sent - The file to upload - The file name of the attachment - A array of embeds to send with this response. Max 10 + The text of the message to be sent. + The file to upload. + The file name of the attachment. + A array of embeds to send with this response. Max 10. if the message should be read out by a text-to-speech reader, otherwise . if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. - A to be sent with this response + A to be sent with this response. A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. The sent message. @@ -4340,15 +4340,15 @@ Sends a followup message for this interaction. - The text of the message to be sent - The file to upload - The file name of the attachment - A array of embeds to send with this response. Max 10 + The text of the message to be sent. + The file to upload. + The file name of the attachment. + A array of embeds to send with this response. Max 10. if the message should be read out by a text-to-speech reader, otherwise . if the response should be hidden to everyone besides the invoker of the command, otherwise . The allowed mentions for this response. The request options for this response. - A to be sent with this response + A to be sent with this response. A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. The sent message. diff --git a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs index 8b60b18a16..5ced136288 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs @@ -34,9 +34,9 @@ public interface ISocketMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the message. - /// A array of s to send with this response. Max 10 + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. @@ -60,7 +60,7 @@ public interface ISocketMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result @@ -86,7 +86,7 @@ public interface ISocketMessageChannel : IMessageChannel /// If null, all mentioned roles and users will be notified. /// /// The message references to be included. Used to reply to specific messages. - /// The message components to be included with this message. Used for interactions + /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. /// /// A task that represents an asynchronous send operation for delivering the message. The task result diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index efc3ab1b41..e4a03f8186 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1376,7 +1376,7 @@ public Task CreateStickerAsync(string name, string descript /// The description of the sticker. /// The tags of the sticker. /// The stream containing the file data. - /// The name of the file with the extension, ex: image.png + /// The name of the file with the extension, ex: image.png. /// The options to be used when sending the request. /// /// A task that represents the asynchronous creation operation. The task result contains the created sticker. @@ -1666,10 +1666,10 @@ Task> IGuild.GetCategoriesAsync(CacheMode Task IGuild.GetVoiceChannelAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetVoiceChannel(id)); /// - Task IGuild.GetStageChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + Task IGuild.GetStageChannelAsync(ulong id, CacheMode mode, RequestOptions options) => Task.FromResult(GetStageChannel(id)); /// - Task> IGuild.GetStageChannelsAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) + Task> IGuild.GetStageChannelsAsync(CacheMode mode, RequestOptions options) => Task.FromResult>(StageChannels); /// Task IGuild.GetAFKChannelAsync(CacheMode mode, RequestOptions options) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index d88a7f0049..e98999d115 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -117,18 +117,14 @@ internal virtual void Update(Model model) /// /// Responds to an Interaction with type . - /// - /// If you have set to , You should use - /// instead. - /// /// /// The text of the message to be sent. - /// A array of embeds to send with this response. Max 10 + /// A array of embeds to send with this response. Max 10. /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. - /// A to be sent with this response + /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. /// Message content is too long, length must be less or equal to . /// The parameters provided were invalid or the token was invalid. @@ -138,13 +134,13 @@ public abstract Task RespondAsync(string text = null, Embed[] embeds = null, boo /// /// Sends a followup message for this interaction. /// - /// The text of the message to be sent - /// A array of embeds to send with this response. Max 10 + /// The text of the message to be sent. + /// A array of embeds to send with this response. Max 10. /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. - /// A to be sent with this response + /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. /// /// The sent message. @@ -155,15 +151,15 @@ public abstract Task FollowupAsync(string text = null, Embe /// /// Sends a followup message for this interaction. /// - /// The text of the message to be sent - /// The file to upload - /// The file name of the attachment - /// A array of embeds to send with this response. Max 10 + /// The text of the message to be sent. + /// The file to upload. + /// The file name of the attachment. + /// A array of embeds to send with this response. Max 10. /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. - /// A to be sent with this response + /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. /// /// The sent message. @@ -174,15 +170,15 @@ public abstract Task FollowupWithFileAsync(string text = nu /// /// Sends a followup message for this interaction. /// - /// The text of the message to be sent - /// The file to upload - /// The file name of the attachment - /// A array of embeds to send with this response. Max 10 + /// The text of the message to be sent. + /// The file to upload. + /// The file name of the attachment. + /// A array of embeds to send with this response. Max 10. /// if the message should be read out by a text-to-speech reader, otherwise . /// if the response should be hidden to everyone besides the invoker of the command, otherwise . /// The allowed mentions for this response. /// The request options for this response. - /// A to be sent with this response + /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. /// /// The sent message. diff --git a/test/Discord.Net.Analyzers.Tests/Helpers/CodeFixVerifier.Helper.cs b/test/Discord.Net.Analyzers.Tests/Helpers/CodeFixVerifier.Helper.cs index 0f73d06437..42f7b08c1b 100644 --- a/test/Discord.Net.Analyzers.Tests/Helpers/CodeFixVerifier.Helper.cs +++ b/test/Discord.Net.Analyzers.Tests/Helpers/CodeFixVerifier.Helper.cs @@ -18,7 +18,7 @@ public abstract partial class CodeFixVerifier : DiagnosticVerifier /// Apply the inputted CodeAction to the inputted document. /// Meant to be used to apply codefixes. /// - /// The Document to apply the fix on + /// The Document to apply the fix on. /// A CodeAction that will be applied to the Document. /// A Document with the changes from the CodeAction private static Document ApplyFix(Document document, CodeAction codeAction) @@ -33,8 +33,8 @@ private static Document ApplyFix(Document document, CodeAction codeAction) /// Note: Considers Diagnostics to be the same if they have the same Ids. In the case of multiple diagnostics with the same Id in a row, /// this method may not necessarily return the new one. /// - /// The Diagnostics that existed in the code before the CodeFix was applied - /// The Diagnostics that exist in the code after the CodeFix was applied + /// The Diagnostics that existed in the code before the CodeFix was applied. + /// The Diagnostics that exist in the code after the CodeFix was applied. /// A list of Diagnostics that only surfaced in the code after the CodeFix was applied private static IEnumerable GetNewDiagnostics(IEnumerable diagnostics, IEnumerable newDiagnostics) { @@ -61,7 +61,7 @@ private static IEnumerable GetNewDiagnostics(IEnumerable /// /// Get the existing compiler diagnostics on the inputted document. /// - /// The Document to run the compiler diagnostic analyzers on + /// The Document to run the compiler diagnostic analyzers on. /// The compiler diagnostics that were found in the code private static IEnumerable GetCompilerDiagnostics(Document document) { @@ -71,7 +71,7 @@ private static IEnumerable GetCompilerDiagnostics(Document document) /// /// Given a document, turn it into a string based on the syntax root /// - /// The Document to be converted to a string + /// The Document to be converted to a string. /// A string containing the syntax of the Document after formatting private static string GetStringFromDocument(Document document) { diff --git a/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs b/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs index 43748aa931..23bb319a68 100644 --- a/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs +++ b/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticVerifier.Helper.cs @@ -35,9 +35,9 @@ public abstract partial class DiagnosticVerifier /// /// Given classes in the form of strings, their language, and an IDiagnosticAnlayzer to apply to it, return the diagnostics found in the string after converting it to a document. /// - /// Classes in the form of strings - /// The language the source classes are in - /// The analyzer to be run on the sources + /// Classes in the form of strings. + /// The language the source classes are in. + /// The analyzer to be run on the sources. /// An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location private static Diagnostic[] GetSortedDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer) { @@ -48,8 +48,8 @@ private static Diagnostic[] GetSortedDiagnostics(string[] sources, string langua /// Given an analyzer and a document to apply it to, run the analyzer and gather an array of diagnostics found in it. /// The returned diagnostics are then ordered by location in the source document. /// - /// The analyzer to run on the documents - /// The Documents that the analyzer will be run on + /// The analyzer to run on the documents. + /// The Documents that the analyzer will be run on. /// An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location protected static Diagnostic[] GetSortedDiagnosticsFromDocuments(DiagnosticAnalyzer analyzer, Document[] documents) { @@ -93,7 +93,7 @@ protected static Diagnostic[] GetSortedDiagnosticsFromDocuments(DiagnosticAnalyz /// /// Sort diagnostics by location in source document /// - /// The list of Diagnostics to be sorted + /// The list of Diagnostics to be sorted. /// An IEnumerable containing the Diagnostics in order of Location private static Diagnostic[] SortDiagnostics(IEnumerable diagnostics) { @@ -106,8 +106,8 @@ private static Diagnostic[] SortDiagnostics(IEnumerable diagnostics) /// /// Given an array of strings as sources and a language, turn them into a project and return the documents and spans of it. /// - /// Classes in the form of strings - /// The language the source code is in + /// Classes in the form of strings. + /// The language the source code is in. /// A Tuple containing the Documents produced from the sources and their TextSpans if relevant private static Document[] GetDocuments(string[] sources, string language) { @@ -130,8 +130,8 @@ private static Document[] GetDocuments(string[] sources, string language) /// /// Create a Document from a string through creating a project that contains it. /// - /// Classes in the form of a string - /// The language the source code is in + /// Classes in the form of a string. + /// The language the source code is in. /// A Document created from the source string protected static Document CreateDocument(string source, string language = LanguageNames.CSharp) { @@ -141,8 +141,8 @@ protected static Document CreateDocument(string source, string language = Langua /// /// Create a project using the inputted strings as sources. /// - /// Classes in the form of strings - /// The language the source code is in + /// Classes in the form of strings. + /// The language the source code is in. /// A Project created out of the Documents created from the source strings private static Project CreateProject(string[] sources, string language = LanguageNames.CSharp) { diff --git a/test/Discord.Net.Analyzers.Tests/Verifiers/CodeFixVerifier.cs b/test/Discord.Net.Analyzers.Tests/Verifiers/CodeFixVerifier.cs index 5d057b610c..d1cb6cd1b7 100644 --- a/test/Discord.Net.Analyzers.Tests/Verifiers/CodeFixVerifier.cs +++ b/test/Discord.Net.Analyzers.Tests/Verifiers/CodeFixVerifier.cs @@ -1,4 +1,4 @@ -using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.Diagnostics; @@ -38,10 +38,10 @@ protected virtual CodeFixProvider GetBasicCodeFixProvider() /// /// Called to test a C# codefix when applied on the inputted string as a source /// - /// A class in the form of a string before the CodeFix was applied to it - /// A class in the form of a string after the CodeFix was applied to it - /// Index determining which codefix to apply if there are multiple - /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied + /// A class in the form of a string before the CodeFix was applied to it. + /// A class in the form of a string after the CodeFix was applied to it. + /// Index determining which codefix to apply if there are multiple. + /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied. protected void VerifyCSharpFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false) { VerifyFix(LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), GetCSharpCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics); @@ -50,10 +50,10 @@ protected void VerifyCSharpFix(string oldSource, string newSource, int? codeFixI /// /// Called to test a VB codefix when applied on the inputted string as a source /// - /// A class in the form of a string before the CodeFix was applied to it - /// A class in the form of a string after the CodeFix was applied to it - /// Index determining which codefix to apply if there are multiple - /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied + /// A class in the form of a string before the CodeFix was applied to it. + /// A class in the form of a string after the CodeFix was applied to it. + /// Index determining which codefix to apply if there are multiple. + /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied. protected void VerifyBasicFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false) { VerifyFix(LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), GetBasicCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics); @@ -65,13 +65,13 @@ protected void VerifyBasicFix(string oldSource, string newSource, int? codeFixIn /// Then gets the string after the codefix is applied and compares it with the expected result. /// Note: If any codefix causes new diagnostics to show up, the test fails unless allowNewCompilerDiagnostics is set to true. /// - /// The language the source code is in - /// The analyzer to be applied to the source code - /// The codefix to be applied to the code wherever the relevant Diagnostic is found - /// A class in the form of a string before the CodeFix was applied to it - /// A class in the form of a string after the CodeFix was applied to it - /// Index determining which codefix to apply if there are multiple - /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied + /// The language the source code is in. + /// The analyzer to be applied to the source code. + /// The codefix to be applied to the code wherever the relevant Diagnostic is found. + /// A class in the form of a string before the CodeFix was applied to it. + /// A class in the form of a string after the CodeFix was applied to it. + /// Index determining which codefix to apply if there are multiple. + /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied. private void VerifyFix(string language, DiagnosticAnalyzer analyzer, CodeFixProvider codeFixProvider, string oldSource, string newSource, int? codeFixIndex, bool allowNewCompilerDiagnostics) { var document = CreateDocument(oldSource, language); @@ -126,4 +126,4 @@ private void VerifyFix(string language, DiagnosticAnalyzer analyzer, CodeFixProv Assert.Equal(newSource, actual); } } -} \ No newline at end of file +} diff --git a/test/Discord.Net.Analyzers.Tests/Verifiers/DiagnosticVerifier.cs b/test/Discord.Net.Analyzers.Tests/Verifiers/DiagnosticVerifier.cs index 3564093f8d..9b0219a63e 100644 --- a/test/Discord.Net.Analyzers.Tests/Verifiers/DiagnosticVerifier.cs +++ b/test/Discord.Net.Analyzers.Tests/Verifiers/DiagnosticVerifier.cs @@ -37,8 +37,8 @@ protected virtual DiagnosticAnalyzer GetBasicDiagnosticAnalyzer() /// Called to test a C# DiagnosticAnalyzer when applied on the single inputted string as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// - /// A class in the form of a string to run the analyzer on - /// DiagnosticResults that should appear after the analyzer is run on the source + /// A class in the form of a string to run the analyzer on. + /// DiagnosticResults that should appear after the analyzer is run on the source. protected void VerifyCSharpDiagnostic(string source, params DiagnosticResult[] expected) { VerifyDiagnostics(new[] { source }, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected); @@ -48,8 +48,8 @@ protected void VerifyCSharpDiagnostic(string source, params DiagnosticResult[] e /// Called to test a VB DiagnosticAnalyzer when applied on the single inputted string as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// - /// A class in the form of a string to run the analyzer on - /// DiagnosticResults that should appear after the analyzer is run on the source + /// A class in the form of a string to run the analyzer on. + /// DiagnosticResults that should appear after the analyzer is run on the source. protected void VerifyBasicDiagnostic(string source, params DiagnosticResult[] expected) { VerifyDiagnostics(new[] { source }, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected); @@ -59,8 +59,8 @@ protected void VerifyBasicDiagnostic(string source, params DiagnosticResult[] ex /// Called to test a C# DiagnosticAnalyzer when applied on the inputted strings as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// - /// An array of strings to create source documents from to run the analyzers on - /// DiagnosticResults that should appear after the analyzer is run on the sources + /// An array of strings to create source documents from to run the analyzers on. + /// DiagnosticResults that should appear after the analyzer is run on the sources. protected void VerifyCSharpDiagnostic(string[] sources, params DiagnosticResult[] expected) { VerifyDiagnostics(sources, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected); @@ -70,8 +70,8 @@ protected void VerifyCSharpDiagnostic(string[] sources, params DiagnosticResult[ /// Called to test a VB DiagnosticAnalyzer when applied on the inputted strings as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// - /// An array of strings to create source documents from to run the analyzers on - /// DiagnosticResults that should appear after the analyzer is run on the sources + /// An array of strings to create source documents from to run the analyzers on. + /// DiagnosticResults that should appear after the analyzer is run on the sources. protected void VerifyBasicDiagnostic(string[] sources, params DiagnosticResult[] expected) { VerifyDiagnostics(sources, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected); @@ -81,10 +81,10 @@ protected void VerifyBasicDiagnostic(string[] sources, params DiagnosticResult[] /// General method that gets a collection of actual diagnostics found in the source after the analyzer is run, /// then verifies each of them. /// - /// An array of strings to create source documents from to run the analyzers on - /// The language of the classes represented by the source strings - /// The analyzer to be run on the source code - /// DiagnosticResults that should appear after the analyzer is run on the sources + /// An array of strings to create source documents from to run the analyzers on. + /// The language of the classes represented by the source strings. + /// The analyzer to be run on the source code. + /// DiagnosticResults that should appear after the analyzer is run on the sources. private void VerifyDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expected) { var diagnostics = GetSortedDiagnostics(sources, language, analyzer); @@ -98,9 +98,9 @@ private void VerifyDiagnostics(string[] sources, string language, DiagnosticAnal /// Checks each of the actual Diagnostics found and compares them with the corresponding DiagnosticResult in the array of expected results. /// Diagnostics are considered equal only if the DiagnosticResultLocation, Id, Severity, and Message of the DiagnosticResult match the actual diagnostic. /// - /// The Diagnostics found by the compiler after running the analyzer on the source code - /// The analyzer that was being run on the sources - /// Diagnostic Results that should have appeared in the code + /// The Diagnostics found by the compiler after running the analyzer on the source code. + /// The analyzer that was being run on the sources. + /// Diagnostic Results that should have appeared in the code. private static void VerifyDiagnosticResults(IEnumerable actualResults, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expectedResults) { int expectedCount = expectedResults.Length; @@ -173,10 +173,10 @@ private static void VerifyDiagnosticResults(IEnumerable actualResult /// /// Helper method to VerifyDiagnosticResult that checks the location of a diagnostic and compares it with the location in the expected DiagnosticResult. /// - /// The analyzer that was being run on the sources - /// The diagnostic that was found in the code - /// The Location of the Diagnostic found in the code - /// The DiagnosticResultLocation that should have been found + /// The analyzer that was being run on the sources. + /// The diagnostic that was found in the code. + /// The Location of the Diagnostic found in the code. + /// The DiagnosticResultLocation that should have been found. private static void VerifyDiagnosticLocation(DiagnosticAnalyzer analyzer, Diagnostic diagnostic, Location actual, DiagnosticResultLocation expected) { var actualSpan = actual.GetLineSpan(); @@ -215,8 +215,8 @@ private static void VerifyDiagnosticLocation(DiagnosticAnalyzer analyzer, Diagno /// /// Helper method to format a Diagnostic into an easily readable string /// - /// The analyzer that this verifier tests - /// The Diagnostics to be formatted + /// The analyzer that this verifier tests. + /// The Diagnostics to be formatted. /// The Diagnostics formatted as a string private static string FormatDiagnostics(DiagnosticAnalyzer analyzer, params Diagnostic[] diagnostics) { From 0b47c71815ef219ab2f4d614523bb34778f3a37c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 14:33:59 +0200 Subject: [PATCH 285/494] Object initialization can be simplified fixed (#189) --- .../Slash Commands/SlashCommandBuilder.cs | 38 +++++++------- .../EmbedBuilderTests.cs | 50 ++++++++++++------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 79afa410d7..b41be71fae 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -191,15 +191,17 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); } - SlashCommandOptionBuilder option = new SlashCommandOptionBuilder(); - option.Name = name; - option.Description = description; - option.Required = required; - option.Default = isDefault; - option.Options = options; - option.Type = type; - option.Autocomplete = isAutocomplete; - option.Choices = choices != null ? new List(choices) : null; + SlashCommandOptionBuilder option = new SlashCommandOptionBuilder + { + Name = name, + Description = description, + Required = required, + Default = isDefault, + Options = options, + Type = type, + Autocomplete = isAutocomplete, + Choices = choices != null ? new List(choices) : null + }; return AddOption(option); } @@ -421,14 +423,16 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); } - SlashCommandOptionBuilder option = new SlashCommandOptionBuilder(); - option.Name = name; - option.Description = description; - option.Required = required; - option.Default = isDefault; - option.Options = options; - option.Type = type; - option.Choices = choices != null ? new List(choices) : null; + SlashCommandOptionBuilder option = new SlashCommandOptionBuilder + { + Name = name, + Description = description, + Required = required, + Default = isDefault, + Options = options, + Type = type, + Choices = choices != null ? new List(choices) : null + }; return AddOption(option); } diff --git a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs index da21afee14..bfe4f9a8fe 100644 --- a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs +++ b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs @@ -95,8 +95,10 @@ public void Title_Invalid(string title) { Assert.Throws(() => { - var builder = new EmbedBuilder(); - builder.Title = title; + var builder = new EmbedBuilder + { + Title = title + }; }); Assert.Throws(() => { @@ -113,8 +115,10 @@ public void Title_Invalid(string title) [InlineData("jVyLChmA7aBZozXQuZ3VDEcwW6zOq0nteOVYBZi31ny73rpXfSSBXR4Jw6FiplDKQseKskwRMuBZkUewrewqAbkBZpslHirvC5nEzRySoDIdTRnkVvTXZUXg75l3bQCjuuHxDd6DfrY8ihd6yZX1Y0XFeg239YBcYV4TpL9uQ8H3HFYxrWhLlG2PRVjUmiglP5iXkawszNwMVm1SZ5LZT4jkMZHxFegVi7170d16iaPWOovu50aDDHy087XBtLKV")] public void Tile_Valid(string title) { - var builder = new EmbedBuilder(); - builder.Title = title; + var builder = new EmbedBuilder + { + Title = title + }; new EmbedBuilder().WithTitle(title); } @@ -133,8 +137,10 @@ IEnumerable GetInvalid() Assert.Throws(() => new EmbedBuilder().WithDescription(description)); Assert.Throws(() => { - var b = new EmbedBuilder(); - b.Description = description; + var b = new EmbedBuilder + { + Description = description + }; }); } } @@ -156,8 +162,10 @@ IEnumerable GetValid() var b = new EmbedBuilder().WithDescription(description); Assert.Equal(description, b.Description); - b = new EmbedBuilder(); - b.Description = description; + b = new EmbedBuilder + { + Description = description + }; Assert.Equal(description, b.Description); } } @@ -181,10 +189,12 @@ public void Url_Valid(string url) Assert.Equal(result.ImageUrl, url); Assert.Equal(result.ThumbnailUrl, url); - result = new EmbedBuilder(); - result.Url = url; - result.ImageUrl = url; - result.ThumbnailUrl = url; + result = new EmbedBuilder + { + Url = url, + ImageUrl = url, + ThumbnailUrl = url + }; Assert.Equal(result.Url, url); Assert.Equal(result.ImageUrl, url); Assert.Equal(result.ThumbnailUrl, url); @@ -276,8 +286,10 @@ public void WithFooter_FooterBuilder() Assert.Equal(url, e.Footer.IconUrl); Assert.Equal(name, e.Footer.Text); // use the property - e = new EmbedBuilder(); - e.Footer = footer; + e = new EmbedBuilder + { + Footer = footer + }; Assert.Equal(url, e.Footer.IconUrl); Assert.Equal(name, e.Footer.Text); } @@ -375,10 +387,12 @@ public void EmbedFieldBuilder() Assert.Equal("value", e.Value); Assert.True(e.IsInline); // use the properties - e = new EmbedFieldBuilder(); - e.IsInline = true; - e.Name = "name"; - e.Value = "value"; + e = new EmbedFieldBuilder + { + IsInline = true, + Name = "name", + Value = "value" + }; Assert.Equal("name", e.Name); Assert.Equal("value", e.Value); Assert.True(e.IsInline); From a8ffa5d02c713d739447c1775e50b47ca091ac65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 14:49:30 +0200 Subject: [PATCH 286/494] Conditional-expression-simplification (#193) --- .../Message Components/ComponentBuilder.cs | 6 ++++-- src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs | 11 ++++++----- .../API/Rest/CreateWebhookMessageParams.cs | 7 ++++--- src/Discord.Net.Rest/Extensions/EntityExtensions.cs | 2 +- src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs | 2 +- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 2 +- .../Entities/Stickers/SocketSticker.cs | 4 +--- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 8dbcb4319e..7725688b86 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -207,8 +207,10 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) if (_actionRows == null) { - _actionRows = new List(); - _actionRows.Add(new ActionRowBuilder().AddComponent(builtButton)); + _actionRows = new List + { + new ActionRowBuilder().AddComponent(builtButton) + }; } else { diff --git a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs index 405d3e04e6..225caaaae3 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs @@ -19,11 +19,12 @@ internal class CreateStickerParams public IReadOnlyDictionary ToDictionary() { - var d = new Dictionary(); - - d["name"] = $"{Name}"; - d["description"] = Description; - d["tags"] = Tags; + var d = new Dictionary + { + ["name"] = $"{Name}", + ["description"] = Description, + ["tags"] = Tags + }; string contentType = "image/png"; diff --git a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs index e21cae845c..aea4b95381 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateWebhookMessageParams.cs @@ -51,9 +51,10 @@ public IReadOnlyDictionary ToDictionary() d["file"] = File.Value; } - var payload = new Dictionary(); - - payload["content"] = Content; + var payload = new Dictionary + { + ["content"] = Content + }; if (IsTTS.IsSpecified) payload["tts"] = IsTTS.Value.ToString(); diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs index 0c2e0f8c25..ca36bc6d64 100644 --- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs @@ -39,7 +39,7 @@ public static RoleTags ToEntity(this API.RoleTags model) return new RoleTags( model.BotId.IsSpecified ? model.BotId.Value : null, model.IntegrationId.IsSpecified ? model.IntegrationId.Value : null, - model.IsPremiumSubscriber.IsSpecified ? true : false); + model.IsPremiumSubscriber.IsSpecified); } public static API.Embed ToModel(this Embed entity) { diff --git a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs index d2a7cabee8..52fea021b3 100644 --- a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs +++ b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs @@ -377,7 +377,7 @@ private void UpdateRateLimit(int id, IRequest request, RateLimitInfo info, bool Debug.WriteLine($"[{id}] Retry-After: {info.RetryAfter.Value} ({info.RetryAfter.Value} ms)"); #endif } - else if (info.ResetAfter.HasValue && (request.Options.UseSystemClock.HasValue ? !request.Options.UseSystemClock.Value : false)) + else if (info.ResetAfter.HasValue && (request.Options.UseSystemClock.HasValue && !request.Options.UseSystemClock.Value)) { resetTick = DateTimeOffset.UtcNow.Add(info.ResetAfter.Value); #if DEBUG_LIMITS diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 3e5a6d5436..72f22c9a53 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2453,7 +2453,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty SocketStageChannel before = type == "STAGE_INSTANCE_UPDATE" ? stageChannel.Clone() : null; - stageChannel.Update(data, type == "STAGE_INSTANCE_CREATE" ? true : type == "STAGE_INSTANCE_DELETE" ? false : false); + stageChannel.Update(data, type == "STAGE_INSTANCE_CREATE"); switch (type) { diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index eaf80f9c20..5e4e09aa8b 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -95,9 +95,7 @@ public override bool Equals(object obj) stickerModel.Type == this.Type && stickerModel.SortValue == this.SortOrder && stickerModel.Available == this.Available && - (stickerModel.Tags.IsSpecified ? - stickerModel.Tags.Value == string.Join(", ", this.Tags) : - true); + (!stickerModel.Tags.IsSpecified || stickerModel.Tags.Value == string.Join(", ", this.Tags)); } else return base.Equals(obj); From ad34d8b7b16fea5aae6456ec5978a9264d9b99da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 14:49:59 +0200 Subject: [PATCH 287/494] Capitlazation fixes (#192) --- samples/idn/Inspector.cs | 2 +- samples/idn/Program.cs | 2 +- .../API/Gateway/InviteCreatedEvent.cs | 2 +- .../EmbedBuilderTests.cs | 90 +++++++++---------- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/samples/idn/Inspector.cs b/samples/idn/Inspector.cs index 3806e0e797..1544c8d07c 100644 --- a/samples/idn/Inspector.cs +++ b/samples/idn/Inspector.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Text; -namespace idn +namespace Idn { public static class Inspector { diff --git a/samples/idn/Program.cs b/samples/idn/Program.cs index ffd8fd1afb..abc315a2d5 100644 --- a/samples/idn/Program.cs +++ b/samples/idn/Program.cs @@ -13,7 +13,7 @@ using System.Text; using System.Diagnostics; -namespace idn +namespace Idn { public class Program { diff --git a/src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs index 8f8002029f..1613cdfa66 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/InviteCreatedEvent.cs @@ -19,7 +19,7 @@ internal class InviteCreatedEvent [JsonProperty("guild_id")] public ulong? GuildID { get; set; } [JsonProperty("inviter")] - public Optional inviter { get; set; } + public Optional Inviter { get; set; } [JsonProperty("max_age")] public int RawAge { get; set; } [JsonProperty("max_uses")] diff --git a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs index bfe4f9a8fe..319d3fb110 100644 --- a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs +++ b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs @@ -9,9 +9,9 @@ namespace Discord /// public class EmbedBuilderTests { - private const string name = "chrisj"; - private const string icon = "https://meowpuffygottem.fun/blob.png"; - private const string url = "https://meowpuffygottem.fun/"; + private const string Name = "chrisj"; + private const string Icon = "https://meowpuffygottem.fun/blob.png"; + private const string Url = "https://meowpuffygottem.fun/"; /// /// Tests the behavior of . @@ -24,12 +24,12 @@ public void WithAuthor_Strings() Assert.Null(builder.Author); builder = new EmbedBuilder() - .WithAuthor(name, icon, url); + .WithAuthor(Name, Icon, Url); Assert.NotNull(builder.Author); - Assert.Equal(name, builder.Author.Name); - Assert.Equal(icon, builder.Author.IconUrl); - Assert.Equal(url, builder.Author.Url); + Assert.Equal(Name, builder.Author.Name); + Assert.Equal(Icon, builder.Author.IconUrl); + Assert.Equal(Url, builder.Author.Url); } /// @@ -39,15 +39,15 @@ public void WithAuthor_Strings() public void WithAuthor_AuthorBuilder() { var author = new EmbedAuthorBuilder() - .WithIconUrl(icon) - .WithName(name) - .WithUrl(url); + .WithIconUrl(Icon) + .WithName(Name) + .WithUrl(Url); var builder = new EmbedBuilder() .WithAuthor(author); Assert.NotNull(builder.Author); - Assert.Equal(name, builder.Author.Name); - Assert.Equal(icon, builder.Author.IconUrl); - Assert.Equal(url, builder.Author.Url); + Assert.Equal(Name, builder.Author.Name); + Assert.Equal(Icon, builder.Author.IconUrl); + Assert.Equal(Url, builder.Author.Url); } /// @@ -58,13 +58,13 @@ public void WithAuthor_ActionAuthorBuilder() { var builder = new EmbedBuilder() .WithAuthor((author) => - author.WithIconUrl(icon) - .WithName(name) - .WithUrl(url)); + author.WithIconUrl(Icon) + .WithName(Name) + .WithUrl(Url)); Assert.NotNull(builder.Author); - Assert.Equal(name, builder.Author.Name); - Assert.Equal(icon, builder.Author.IconUrl); - Assert.Equal(url, builder.Author.Url); + Assert.Equal(Name, builder.Author.Name); + Assert.Equal(Icon, builder.Author.IconUrl); + Assert.Equal(Url, builder.Author.Url); } /// @@ -74,12 +74,12 @@ public void WithAuthor_ActionAuthorBuilder() public void EmbedAuthorBuilder() { var builder = new EmbedAuthorBuilder() - .WithIconUrl(icon) - .WithName(name) - .WithUrl(url); - Assert.Equal(icon, builder.IconUrl); - Assert.Equal(name, builder.Name); - Assert.Equal(url, builder.Url); + .WithIconUrl(Icon) + .WithName(Name) + .WithUrl(Url); + Assert.Equal(Icon, builder.IconUrl); + Assert.Equal(Name, builder.Name); + Assert.Equal(Url, builder.Url); } /// @@ -217,15 +217,15 @@ public void Length_Empty() public void Length() { var e = new EmbedBuilder() - .WithAuthor(name, icon, url) + .WithAuthor(Name, Icon, Url) .WithColor(Color.Blue) .WithDescription("This is the test description.") - .WithFooter("This is the footer", url) - .WithImageUrl(url) - .WithThumbnailUrl(url) + .WithFooter("This is the footer", Url) + .WithImageUrl(Url) + .WithThumbnailUrl(Url) .WithTimestamp(DateTimeOffset.MinValue) .WithTitle("This is the title") - .WithUrl(url) + .WithUrl(Url) .AddField("Field 1", "Inline", true) .AddField("Field 2", "Not Inline", false); Assert.Equal(100, e.Length); @@ -263,11 +263,11 @@ public void WithFooter_ActionFooterBuilder() var e = new EmbedBuilder() .WithFooter(x => { - x.IconUrl = url; - x.Text = name; + x.IconUrl = Url; + x.Text = Name; }); - Assert.Equal(url, e.Footer.IconUrl); - Assert.Equal(name, e.Footer.Text); + Assert.Equal(Url, e.Footer.IconUrl); + Assert.Equal(Name, e.Footer.Text); } /// @@ -278,13 +278,13 @@ public void WithFooter_FooterBuilder() { var footer = new EmbedFooterBuilder() { - IconUrl = url, - Text = name + IconUrl = Url, + Text = Name }; var e = new EmbedBuilder() .WithFooter(footer); - Assert.Equal(url, e.Footer.IconUrl); - Assert.Equal(name, e.Footer.Text); + Assert.Equal(Url, e.Footer.IconUrl); + Assert.Equal(Name, e.Footer.Text); // use the property e = new EmbedBuilder { @@ -301,9 +301,9 @@ public void WithFooter_FooterBuilder() public void WithFooter_Strings() { var e = new EmbedBuilder() - .WithFooter(name, url); - Assert.Equal(url, e.Footer.IconUrl); - Assert.Equal(name, e.Footer.Text); + .WithFooter(Name, Url); + Assert.Equal(Url, e.Footer.IconUrl); + Assert.Equal(Name, e.Footer.Text); } /// @@ -313,10 +313,10 @@ public void WithFooter_Strings() public void EmbedFooterBuilder() { var footer = new EmbedFooterBuilder() - .WithIconUrl(url) - .WithText(name); - Assert.Equal(url, footer.IconUrl); - Assert.Equal(name, footer.Text); + .WithIconUrl(Url) + .WithText(Name); + Assert.Equal(Url, footer.IconUrl); + Assert.Equal(Name, footer.Text); } /// /// Tests that invalid text throws an . From 0136decceb287182d4b229e6a2e833c17d4a5b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 14:51:17 +0200 Subject: [PATCH 288/494] Removed-this. (#191) --- src/Discord.Net.Core/Discord.Net.Core.xml | 23 ++- .../Interactions/AutocompleteOption.cs | 8 +- .../Interactions/AutocompleteResult.cs | 4 +- .../Context Menus/MessageCommandBuilder.cs | 8 +- .../Context Menus/UserCommandBuilder.cs | 8 +- .../Message Components/ActionRowComponent.cs | 2 +- .../Message Components/ButtonComponent.cs | 14 +- .../Message Components/ComponentBuilder.cs | 150 +++++++++--------- .../Message Components/MessageComponent.cs | 2 +- .../Message Components/SelectMenuComponent.cs | 24 +-- .../Message Components/SelectMenuOption.cs | 10 +- .../Slash Commands/SlashCommandBuilder.cs | 74 ++++----- .../ApplicationCommandPermissions.cs | 18 +-- .../GuildApplicationCommandPermissions.cs | 8 +- .../Entities/Stickers/StickerPack.cs | 16 +- .../API/Common/ActionRowComponent.cs | 4 +- .../API/Common/ApplicationCommandOption.cs | 30 ++-- .../API/Common/ButtonComponent.cs | 18 +-- .../API/Common/SelectMenuComponent.cs | 14 +- .../API/Common/SelectMenuOption.cs | 12 +- src/Discord.Net.Rest/API/Net/MultipartFile.cs | 2 +- .../Rest/CreateApplicationCommandParams.cs | 8 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 42 ++--- .../Entities/Channels/RestStageChannel.cs | 40 ++--- .../Entities/Channels/RestTextChannel.cs | 2 +- .../Entities/Channels/RestThreadChannel.cs | 26 +-- .../Entities/Guilds/RestGuild.cs | 16 +- .../Interactions/RestApplicationCommand.cs | 14 +- .../RestApplicationCommandChoice.cs | 4 +- .../RestApplicationCommandOption.cs | 14 +- .../Interactions/RestGlobalCommand.cs | 2 +- .../Entities/Interactions/RestGuildCommand.cs | 10 +- .../Entities/Messages/CustomSticker.cs | 10 +- .../Entities/Messages/RestFollowupMessage.cs | 4 +- .../Messages/RestInteractionMessage.cs | 6 +- .../Entities/Messages/Sticker.cs | 2 +- .../Entities/Messages/StickerItem.cs | 6 +- .../Entities/Users/RestThreadUser.cs | 8 +- .../DiscordShardedClient.cs | 2 +- .../DiscordSocketClient.cs | 20 +-- .../DiscordSocketConfig.cs | 6 +- .../Entities/Channels/SocketStageChannel.cs | 44 ++--- .../Entities/Channels/SocketTextChannel.cs | 2 +- .../Entities/Channels/SocketThreadChannel.cs | 46 +++--- .../Entities/Guilds/SocketGuild.cs | 22 +-- .../Message Commands/SocketMessageCommand.cs | 2 +- .../User Commands/SocketUserCommand.cs | 2 +- .../SocketMessageComponent.cs | 20 +-- .../SocketMessageComponentData.cs | 6 +- .../SocketAutocompleteInteraction.cs | 4 +- .../SocketAutocompleteInteractionData.cs | 12 +- .../Slash Commands/SocketSlashCommand.cs | 2 +- .../Slash Commands/SocketSlashCommandData.cs | 2 +- .../SocketSlashCommandDataOption.cs | 40 ++--- .../SocketApplicationCommand.cs | 24 +-- .../SocketApplicationCommandChoice.cs | 4 +- .../SocketApplicationCommandOption.cs | 14 +- .../SocketBaseCommand/SocketCommandBase.cs | 8 +- .../SocketCommandBaseData.cs | 4 +- .../SocketBaseCommand/SocketResolvableData.cs | 10 +- .../Entities/Interaction/SocketInteraction.cs | 28 ++-- .../Entities/Stickers/SocketCustomSticker.cs | 18 +-- .../Entities/Stickers/SocketSticker.cs | 38 ++--- .../Entities/Stickers/SocketUnknownSticker.cs | 6 +- .../Entities/Users/SocketThreadUser.cs | 20 +-- .../Helpers/DiagnosticResult.cs | 20 +-- .../ChannelsTests.cs | 2 +- .../GuildTests.cs | 2 +- 68 files changed, 550 insertions(+), 543 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 695c144613..d72a1cac24 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4917,7 +4917,11 @@ Present if this option is a group or subcommand. - + + + Options for the , see The docs. + + The type of this . @@ -5318,7 +5322,7 @@ Builds this builder into a used to send your components. - A that can be sent with . + A that can be sent with . @@ -6021,6 +6025,7 @@ The description of this option. If this option is required for this command. If this option is the default option. + If this option is set to autocompleate. The options of the option to add. The choices of this option. The current builder. @@ -8262,7 +8267,7 @@ - Gets a value that indicates whether the current user has reacted to this. + Gets a value that indicates whether the current user has reacted to true if the user has reacted to the message; otherwise false. @@ -10266,7 +10271,7 @@ The following example checks if the current user has the ability to send a message with attachment in this channel; if so, uploads a file via . - + if (currentUser?.GetPermissions(targetChannel)?.AttachFiles) await targetChannel.SendFileAsync("fortnite.png"); @@ -11086,6 +11091,7 @@ The message to remove reactions from. + The user who removed the reaction. An array of reactions to remove from the message. The options to be used when sending the request. @@ -11098,6 +11104,7 @@ Sends an inline reply that references a message. + The message that is being replyed on. The message to be sent. Determines whether the message should be read aloud by Discord or not. The to be sent. @@ -11107,6 +11114,8 @@ If null, all mentioned roles and users will be notified. The options to be used when sending the request. + The message components to be included with this message. Used for interactions. + A collection of stickers to send with the message. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -11184,6 +11193,7 @@ Whether the message should be read aloud by Discord or not. The to be sent. The options to be used when sending the request. + The message component to be included with this message. Used for interactions. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -11231,6 +11241,7 @@ Whether the message should be read aloud by Discord or not. The to be sent. The options to be used when sending the request. + The message component to be included with this message. Used for interactions. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -11825,12 +11836,8 @@ Initializes a new instance of the class. - The request that was sent prior to the exception. - The Discord status code returned. - The reason behind the exception. - diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs index 9fe461d6f2..2a97a72951 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs @@ -33,10 +33,10 @@ public class AutocompleteOption internal AutocompleteOption(ApplicationCommandOptionType type, string name, object value, bool focused) { - this.Type = type; - this.Name = name; - this.Value = value; - this.Focused = focused; + Type = type; + Name = name; + Value = value; + Focused = focused; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs index 881eef80db..2536c3c519 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs @@ -83,8 +83,8 @@ public AutocompleteResult() { } /// public AutocompleteResult(string name, object value) { - this.Name = name; - this.Value = value; + Name = name; + Value = value; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index ce9c75452a..495301d006 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -53,8 +53,8 @@ public MessageCommandProperties Build() { MessageCommandProperties props = new MessageCommandProperties() { - Name = this.Name, - DefaultPermission = this.DefaultPermission + Name = Name, + DefaultPermission = DefaultPermission }; return props; @@ -70,7 +70,7 @@ public MessageCommandProperties Build() /// public MessageCommandBuilder WithName(string name) { - this.Name = name; + Name = name; return this; } @@ -81,7 +81,7 @@ public MessageCommandBuilder WithName(string name) /// The current builder. public MessageCommandBuilder WithDefaultPermission (bool value) { - this.DefaultPermission = value; + DefaultPermission = value; return this; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index a49250d088..0758437563 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -51,8 +51,8 @@ public UserCommandProperties Build() { UserCommandProperties props = new UserCommandProperties() { - Name = this.Name, - DefaultPermission = this.DefaultPermission + Name = Name, + DefaultPermission = DefaultPermission }; return props; @@ -68,7 +68,7 @@ public UserCommandProperties Build() /// public UserCommandBuilder WithName(string name) { - this.Name = name; + Name = name; return this; } @@ -79,7 +79,7 @@ public UserCommandBuilder WithName(string name) /// The current builder. public UserCommandBuilder WithDefaultPermission (bool value) { - this.DefaultPermission = value; + DefaultPermission = value; return this; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index d4ae023836..a9dd27beae 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -25,7 +25,7 @@ public class ActionRowComponent : IMessageComponent internal ActionRowComponent() { } internal ActionRowComponent(List components) { - this.Components = components; + Components = components; } string IMessageComponent.CustomId => null; diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index 6347e9d2d9..bad9f8aa38 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -55,16 +55,16 @@ public class ButtonComponent : IMessageComponent /// A newly created button builder with the same properties as this button. /// public ButtonBuilder ToBuilder() - => new ButtonBuilder(this.Label, this.CustomId, this.Style, this.Url, this.Emote, this.Disabled); + => new ButtonBuilder(Label, CustomId, Style, Url, Emote, Disabled); internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) { - this.Style = style; - this.Label = label; - this.Emote = emote; - this.CustomId = customId; - this.Url = url; - this.Disabled = disabled; + Style = style; + Label = label; + Emote = emote; + CustomId = customId; + Url = url; + Disabled = disabled; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 7725688b86..b0050ee366 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -69,14 +69,14 @@ internal void AddComponent(IMessageComponent component, int row) switch (component) { case ButtonComponent button: - this.WithButton(button.Label, button.CustomId, button.Style, button.Emote, button.Url, button.Disabled, row); + WithButton(button.Label, button.CustomId, button.Style, button.Emote, button.Url, button.Disabled, row); break; case ActionRowComponent actionRow: foreach (var cmp in actionRow.Components) AddComponent(cmp, row); break; case SelectMenuComponent menu: - this.WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); + WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); break; } } @@ -187,7 +187,7 @@ public ComponentBuilder WithButton( .WithUrl(url) .WithDisabled(disabled); - return this.WithButton(button, row); + return WithButton(button, row); } /// @@ -245,8 +245,8 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) /// A that can be sent with . public MessageComponent Build() { - if (this._actionRows != null) - return new MessageComponent(this._actionRows.Select(x => x.Build()).ToList()); + if (_actionRows != null) + return new MessageComponent(_actionRows.Select(x => x.Build()).ToList()); else return MessageComponent.Empty; } @@ -295,7 +295,7 @@ public List Components /// The current builder. public ActionRowBuilder WithComponents(List components) { - this.Components = components; + Components = components; return this; } @@ -307,10 +307,10 @@ public ActionRowBuilder WithComponents(List components) /// The current builder. public ActionRowBuilder AddComponent(IMessageComponent component) { - if (this.Components.Count >= MaxChildCount) + if (Components.Count >= MaxChildCount) throw new InvalidOperationException($"Components count reached {MaxChildCount}"); - this.Components.Add(component); + Components.Add(component); return this; } @@ -320,7 +320,7 @@ public ActionRowBuilder AddComponent(IMessageComponent component) /// A that can be used within a public ActionRowComponent Build() { - return new ActionRowComponent(this._components); + return new ActionRowComponent(_components); } internal bool CanTakeComponent(IMessageComponent component) @@ -330,12 +330,12 @@ internal bool CanTakeComponent(IMessageComponent component) case ComponentType.ActionRow: return false; case ComponentType.Button: - if (this.Components.Any(x => x.Type == ComponentType.SelectMenu)) + if (Components.Any(x => x.Type == ComponentType.SelectMenu)) return false; else - return this.Components.Count < 5; + return Components.Count < 5; case ComponentType.SelectMenu: - return this.Components.Count == 0; + return Components.Count == 0; default: return false; } @@ -435,12 +435,12 @@ public ButtonBuilder() { } /// Disabled this button or not. public ButtonBuilder(string label = null, string customId = null, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool disabled = false) { - this.CustomId = customId; - this.Style = style; - this.Url = url; - this.Label = label; - this.Disabled = disabled; - this.Emote = emote; + CustomId = customId; + Style = style; + Url = url; + Label = label; + Disabled = disabled; + Emote = emote; } /// @@ -448,12 +448,12 @@ public ButtonBuilder(string label = null, string customId = null, ButtonStyle st /// public ButtonBuilder(ButtonComponent button) { - this.CustomId = button.CustomId; - this.Style = button.Style; - this.Url = button.Url; - this.Label = button.Label; - this.Disabled = button.Disabled; - this.Emote = button.Emote; + CustomId = button.CustomId; + Style = button.Style; + Url = button.Url; + Label = button.Label; + Disabled = button.Disabled; + Emote = button.Emote; } /// @@ -514,7 +514,7 @@ public static ButtonBuilder CreateSuccessButton(string label, string customId, I /// The current builder. public ButtonBuilder WithLabel(string label) { - this.Label = label; + Label = label; return this; } @@ -525,7 +525,7 @@ public ButtonBuilder WithLabel(string label) /// The current builder. public ButtonBuilder WithStyle(ButtonStyle style) { - this.Style = style; + Style = style; return this; } @@ -536,7 +536,7 @@ public ButtonBuilder WithStyle(ButtonStyle style) /// The current builder. public ButtonBuilder WithEmote(IEmote emote) { - this.Emote = emote; + Emote = emote; return this; } @@ -547,7 +547,7 @@ public ButtonBuilder WithEmote(IEmote emote) /// The current builder. public ButtonBuilder WithUrl(string url) { - this.Url = url; + Url = url; return this; } @@ -559,7 +559,7 @@ public ButtonBuilder WithUrl(string url) /// The current builder. public ButtonBuilder WithCustomId(string id) { - this.CustomId = id; + CustomId = id; return this; } @@ -570,7 +570,7 @@ public ButtonBuilder WithCustomId(string id) /// The current builder. public ButtonBuilder WithDisabled(bool disabled) { - this.Disabled = disabled; + Disabled = disabled; return this; } @@ -585,23 +585,23 @@ public ButtonBuilder WithDisabled(bool disabled) /// A non-link button must contain a custom id public ButtonComponent Build() { - if (string.IsNullOrEmpty(this.Label) && this.Emote == null) + if (string.IsNullOrEmpty(Label) && Emote == null) throw new InvalidOperationException("A button must have an Emote or a label!"); - if (!(string.IsNullOrEmpty(this.Url) ^ string.IsNullOrEmpty(this.CustomId))) + if (!(string.IsNullOrEmpty(Url) ^ string.IsNullOrEmpty(CustomId))) throw new InvalidOperationException("A button must contain either a URL or a CustomId, but not both!"); - if (this.Style == ButtonStyle.Link) + if (Style == ButtonStyle.Link) { - if (string.IsNullOrEmpty(this.Url)) + if (string.IsNullOrEmpty(Url)) throw new InvalidOperationException("Link buttons must have a link associated with them"); else - UrlValidation.Validate(this.Url); + UrlValidation.Validate(Url); } - else if (string.IsNullOrEmpty(this.CustomId)) + else if (string.IsNullOrEmpty(CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); - return new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); + return new ButtonComponent(Style, Label, Emote, CustomId, Url, Disabled); } } @@ -736,12 +736,12 @@ public SelectMenuBuilder() { } /// public SelectMenuBuilder(SelectMenuComponent selectMenu) { - this.Placeholder = selectMenu.Placeholder; - this.CustomId = selectMenu.Placeholder; - this.MaxValues = selectMenu.MaxValues; - this.MinValues = selectMenu.MinValues; - this.Disabled = selectMenu.Disabled; - this.Options = selectMenu.Options? + Placeholder = selectMenu.Placeholder; + CustomId = selectMenu.Placeholder; + MaxValues = selectMenu.MaxValues; + MinValues = selectMenu.MinValues; + Disabled = selectMenu.Disabled; + Options = selectMenu.Options? .Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)) .ToList(); } @@ -757,12 +757,12 @@ public SelectMenuBuilder(SelectMenuComponent selectMenu) /// Disabled this select menu or not. public SelectMenuBuilder(string customId, List options, string placeholder = null, int maxValues = 1, int minValues = 1, bool disabled = false) { - this.CustomId = customId; - this.Options = options; - this.Placeholder = placeholder; - this.Disabled = disabled; - this.MaxValues = maxValues; - this.MinValues = minValues; + CustomId = customId; + Options = options; + Placeholder = placeholder; + Disabled = disabled; + MaxValues = maxValues; + MinValues = minValues; } /// @@ -775,7 +775,7 @@ public SelectMenuBuilder(string customId, List options, /// public SelectMenuBuilder WithCustomId(string customId) { - this.CustomId = customId; + CustomId = customId; return this; } @@ -789,7 +789,7 @@ public SelectMenuBuilder WithCustomId(string customId) /// public SelectMenuBuilder WithPlaceholder(string placeholder) { - this.Placeholder = placeholder; + Placeholder = placeholder; return this; } @@ -803,7 +803,7 @@ public SelectMenuBuilder WithPlaceholder(string placeholder) /// public SelectMenuBuilder WithMinValues(int minValues) { - this.MinValues = minValues; + MinValues = minValues; return this; } @@ -817,7 +817,7 @@ public SelectMenuBuilder WithMinValues(int minValues) /// public SelectMenuBuilder WithMaxValues(int maxValues) { - this.MaxValues = maxValues; + MaxValues = maxValues; return this; } @@ -831,7 +831,7 @@ public SelectMenuBuilder WithMaxValues(int maxValues) /// public SelectMenuBuilder WithOptions(List options) { - this.Options = options; + Options = options; return this; } @@ -845,10 +845,10 @@ public SelectMenuBuilder WithOptions(List options) /// public SelectMenuBuilder AddOption(SelectMenuOptionBuilder option) { - if (this.Options.Count >= MaxOptionCount) + if (Options.Count >= MaxOptionCount) throw new InvalidOperationException($"Options count reached {MaxOptionCount}."); - this.Options.Add(option); + Options.Add(option); return this; } @@ -879,7 +879,7 @@ public SelectMenuBuilder AddOption(string label, string value, string descriptio /// public SelectMenuBuilder WithDisabled(bool disabled) { - this.Disabled = disabled; + Disabled = disabled; return this; } @@ -889,9 +889,9 @@ public SelectMenuBuilder WithDisabled(bool disabled) /// The newly built public SelectMenuComponent Build() { - var options = this.Options?.Select(x => x.Build()).ToList(); + var options = Options?.Select(x => x.Build()).ToList(); - return new SelectMenuComponent(this.CustomId, options, this.Placeholder, this.MinValues, this.MaxValues, this.Disabled); + return new SelectMenuComponent(CustomId, options, Placeholder, MinValues, MaxValues, Disabled); } } @@ -1012,11 +1012,11 @@ public SelectMenuOptionBuilder() { } /// Render this option as selected by default or not. public SelectMenuOptionBuilder(string label, string value, string description = null, IEmote emote = null, bool? @default = null) { - this.Label = label; - this.Value = value; - this.Description = description; - this.Emote = emote; - this.Default = @default; + Label = label; + Value = value; + Description = description; + Emote = emote; + Default = @default; } /// @@ -1024,11 +1024,11 @@ public SelectMenuOptionBuilder(string label, string value, string description = /// public SelectMenuOptionBuilder(SelectMenuOption option) { - this.Label = option.Label; - this.Value = option.Value; - this.Description = option.Description; - this.Emote = option.Emote; - this.Default = option.Default; + Label = option.Label; + Value = option.Value; + Description = option.Description; + Emote = option.Emote; + Default = option.Default; } /// @@ -1041,7 +1041,7 @@ public SelectMenuOptionBuilder(SelectMenuOption option) /// public SelectMenuOptionBuilder WithLabel(string label) { - this.Label = label; + Label = label; return this; } @@ -1055,7 +1055,7 @@ public SelectMenuOptionBuilder WithLabel(string label) /// public SelectMenuOptionBuilder WithValue(string value) { - this.Value = value; + Value = value; return this; } @@ -1069,7 +1069,7 @@ public SelectMenuOptionBuilder WithValue(string value) /// public SelectMenuOptionBuilder WithDescription(string description) { - this.Description = description; + Description = description; return this; } @@ -1082,7 +1082,7 @@ public SelectMenuOptionBuilder WithDescription(string description) /// public SelectMenuOptionBuilder WithEmote(IEmote emote) { - this.Emote = emote; + Emote = emote; return this; } @@ -1095,7 +1095,7 @@ public SelectMenuOptionBuilder WithEmote(IEmote emote) /// public SelectMenuOptionBuilder WithDefault(bool defaultValue) { - this.Default = defaultValue; + Default = defaultValue; return this; } @@ -1105,7 +1105,7 @@ public SelectMenuOptionBuilder WithDefault(bool defaultValue) /// The newly built . public SelectMenuOption Build() { - return new SelectMenuOption(this.Label, this.Value, this.Description, this.Emote, this.Default); + return new SelectMenuOption(Label, Value, Description, Emote, Default); } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs index 82df2550e3..c1c8b2817e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -18,7 +18,7 @@ public class MessageComponent internal MessageComponent(List components) { - this.Components = components; + Components = components; } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs index 6ea4c07fe5..4fa3e43934 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs @@ -52,21 +52,21 @@ public class SelectMenuComponent : IMessageComponent /// public SelectMenuBuilder ToBuilder() => new SelectMenuBuilder( - this.CustomId, - this.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), - this.Placeholder, - this.MaxValues, - this.MinValues, - this.Disabled); + CustomId, + Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), + Placeholder, + MaxValues, + MinValues, + Disabled); internal SelectMenuComponent(string customId, List options, string placeholder, int minValues, int maxValues, bool disabled) { - this.CustomId = customId; - this.Options = options; - this.Placeholder = placeholder; - this.MinValues = minValues; - this.MaxValues = maxValues; - this.Disabled = disabled; + CustomId = customId; + Options = options; + Placeholder = placeholder; + MinValues = minValues; + MaxValues = maxValues; + Disabled = disabled; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs index e5425971af..624b652be1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs @@ -38,11 +38,11 @@ public class SelectMenuOption internal SelectMenuOption(string label, string value, string description, IEmote emote, bool? defaultValue) { - this.Label = label; - this.Value = value; - this.Description = description; - this.Emote = emote; - this.Default = defaultValue; + Label = label; + Value = value; + Description = description; + Emote = emote; + Default = defaultValue; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index b41be71fae..4abf84eb3d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -100,16 +100,16 @@ public SlashCommandProperties Build() { SlashCommandProperties props = new SlashCommandProperties() { - Name = this.Name, - Description = this.Description, - DefaultPermission = this.DefaultPermission, + Name = Name, + Description = Description, + DefaultPermission = DefaultPermission, }; - if (this.Options != null && this.Options.Any()) + if (Options != null && Options.Any()) { var options = new List(); - this.Options.ForEach(x => options.Add(x.Build())); + Options.ForEach(x => options.Add(x.Build())); props.Options = options; } @@ -127,7 +127,7 @@ public SlashCommandProperties Build() /// public SlashCommandBuilder WithName(string name) { - this.Name = name; + Name = name; return this; } @@ -138,7 +138,7 @@ public SlashCommandBuilder WithName(string name) /// The current builder. public SlashCommandBuilder WithDescription(string description) { - this.Description = description; + Description = description; return this; } @@ -149,7 +149,7 @@ public SlashCommandBuilder WithDescription(string description) /// The current builder. public SlashCommandBuilder WithDefaultPermission(bool value) { - this.DefaultPermission = value; + DefaultPermission = value; return this; } @@ -186,8 +186,8 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t // make sure theres only one option with default set to true if (isDefault.HasValue && isDefault.Value) { - if (this.Options != null) - if (this.Options.Any(x => x.Default.HasValue && x.Default.Value)) + if (Options != null) + if (Options.Any(x => x.Default.HasValue && x.Default.Value)) throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); } @@ -237,16 +237,16 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t /// The current builder. public SlashCommandBuilder AddOption(SlashCommandOptionBuilder option) { - if (this.Options == null) - this.Options = new List(); + if (Options == null) + Options = new List(); - if (this.Options.Count >= MaxOptionsCount) + if (Options.Count >= MaxOptionsCount) throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); if (option == null) throw new ArgumentNullException(nameof(option), "Option cannot be null"); - this.Options.Add(option); + Options.Add(option); return this; } /// @@ -262,13 +262,13 @@ public SlashCommandBuilder AddOptions(params SlashCommandOptionBuilder[] options if (options.Length == 0) throw new ArgumentException(nameof(options), "Options cannot be empty!"); - if (this.Options == null) - this.Options = new List(); + if (Options == null) + Options = new List(); - if (this.Options.Count + options.Length > MaxOptionsCount) + if (Options.Count + options.Length > MaxOptionsCount) throw new ArgumentOutOfRangeException(nameof(options), $"Cannot have more than {MaxOptionsCount} options!"); - this.Options.AddRange(options); + Options.AddRange(options); return this; } } @@ -365,7 +365,7 @@ public string Description /// The built version of this option. public ApplicationCommandOptionProperties Build() { - bool isSubType = this.Type == ApplicationCommandOptionType.SubCommandGroup; + bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; if (isSubType && (Options == null || !Options.Any())) throw new ArgumentException(nameof(Options), "SubCommands/SubCommandGroups must have at least one option"); @@ -375,14 +375,14 @@ public ApplicationCommandOptionProperties Build() return new ApplicationCommandOptionProperties() { - Name = this.Name, - Description = this.Description, - Default = this.Default, - Required = this.Required, - Type = this.Type, - Options = this.Options?.Count > 0 ? new List(this.Options.Select(x => x.Build())) : null, - Choices = this.Choices, - Autocomplete = this.Autocomplete + Name = Name, + Description = Description, + Default = Default, + Required = Required, + Type = Type, + Options = Options?.Count > 0 ? new List(Options.Select(x => x.Build())) : null, + Choices = Choices, + Autocomplete = Autocomplete }; } @@ -418,8 +418,8 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption // make sure theres only one option with default set to true if (isDefault) { - if (this.Options != null) - if (this.Options.Any(x => x.Default.HasValue && x.Default.Value)) + if (Options != null) + if (Options.Any(x => x.Default.HasValue && x.Default.Value)) throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); } @@ -443,10 +443,10 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption /// The current builder. public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) { - if (this.Options == null) - this.Options = new List(); + if (Options == null) + Options = new List(); - if (this.Options.Count >= SlashCommandBuilder.MaxOptionsCount) + if (Options.Count >= SlashCommandBuilder.MaxOptionsCount) throw new ArgumentOutOfRangeException(nameof(Choices), $"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); if (option == null) @@ -527,7 +527,7 @@ public SlashCommandOptionBuilder AddChoice(string name, string value) /// The current builder. public SlashCommandOptionBuilder WithName(string name) { - this.Name = name; + Name = name; return this; } @@ -539,7 +539,7 @@ public SlashCommandOptionBuilder WithName(string name) /// The current builder. public SlashCommandOptionBuilder WithDescription(string description) { - this.Description = description; + Description = description; return this; } @@ -550,7 +550,7 @@ public SlashCommandOptionBuilder WithDescription(string description) /// The current builder. public SlashCommandOptionBuilder WithRequired(bool value) { - this.Required = value; + Required = value; return this; } @@ -561,7 +561,7 @@ public SlashCommandOptionBuilder WithRequired(bool value) /// The current builder. public SlashCommandOptionBuilder WithDefault(bool value) { - this.Default = value; + Default = value; return this; } @@ -572,7 +572,7 @@ public SlashCommandOptionBuilder WithDefault(bool value) /// The current builder. public SlashCommandOptionBuilder WithType(ApplicationCommandOptionType type) { - this.Type = type; + Type = type; return this; } } diff --git a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs index 476960522b..28a6455e20 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissions.cs @@ -30,9 +30,9 @@ internal ApplicationCommandPermission() { } /// The value of this permission. public ApplicationCommandPermission(ulong targetId, ApplicationCommandPermissionTarget targetType, bool allow) { - this.TargetId = targetId; - this.TargetType = targetType; - this.Permission = allow; + TargetId = targetId; + TargetType = targetType; + Permission = allow; } /// @@ -42,9 +42,9 @@ public ApplicationCommandPermission(ulong targetId, ApplicationCommandPermission /// The value of this permission. public ApplicationCommandPermission(IUser target, bool allow) { - this.TargetId = target.Id; - this.Permission = allow; - this.TargetType = ApplicationCommandPermissionTarget.User; + TargetId = target.Id; + Permission = allow; + TargetType = ApplicationCommandPermissionTarget.User; } /// @@ -54,9 +54,9 @@ public ApplicationCommandPermission(IUser target, bool allow) /// The value of this permission. public ApplicationCommandPermission(IRole target, bool allow) { - this.TargetId = target.Id; - this.Permission = allow; - this.TargetType = ApplicationCommandPermissionTarget.Role; + TargetId = target.Id; + Permission = allow; + TargetType = ApplicationCommandPermissionTarget.Role; } } } diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs index 5145f5dc62..4be7244537 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs @@ -34,10 +34,10 @@ public class GuildApplicationCommandPermission internal GuildApplicationCommandPermission(ulong commandId, ulong appId, ulong guildId, ApplicationCommandPermission[] permissions) { - this.CommandId = commandId; - this.ApplicationId = appId; - this.GuildId = guildId; - this.Permissions = permissions; + CommandId = commandId; + ApplicationId = appId; + GuildId = guildId; + Permissions = permissions; } } } diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs index b0750efc16..76d424a470 100644 --- a/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs +++ b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs @@ -50,14 +50,14 @@ public class StickerPack where TSticker : ISticker internal StickerPack(string name, ulong id, ulong skuid, ulong? coverStickerId, string description, ulong bannerAssetId, IEnumerable stickers) { - this.Name = name; - this.Id = id; - this.SkuId = skuid; - this.CoverStickerId = coverStickerId; - this.Description = description; - this.BannerAssetId = bannerAssetId; - - this.Stickers = stickers.ToImmutableArray(); + Name = name; + Id = id; + SkuId = skuid; + CoverStickerId = coverStickerId; + Description = description; + BannerAssetId = bannerAssetId; + + Stickers = stickers.ToImmutableArray(); } } } diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs index 270532a18d..417fb1b984 100644 --- a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -19,8 +19,8 @@ internal class ActionRowComponent : IMessageComponent internal ActionRowComponent() { } internal ActionRowComponent(Discord.ActionRowComponent c) { - this.Type = c.Type; - this.Components = c.Components?.Select(x => + Type = c.Type; + Components = c.Components?.Select(x => { switch (x.Type) { diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 2169e601e6..93ee2e9b53 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -37,28 +37,28 @@ public ApplicationCommandOption() { } public ApplicationCommandOption(IApplicationCommandOption cmd) { - this.Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice() + Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice() { Name = x.Name, Value = x.Value }).ToArray(); - this.Options = cmd.Options.Select(x => new ApplicationCommandOption(x)).ToArray(); + Options = cmd.Options.Select(x => new ApplicationCommandOption(x)).ToArray(); - this.Required = cmd.Required.HasValue + Required = cmd.Required.HasValue ? cmd.Required.Value : Optional.Unspecified; - this.Default = cmd.Default.HasValue + Default = cmd.Default.HasValue ? cmd.Default.Value : Optional.Unspecified; - this.Name = cmd.Name; - this.Type = cmd.Type; - this.Description = cmd.Description; + Name = cmd.Name; + Type = cmd.Type; + Description = cmd.Description; } public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties option) { - this.Choices = option.Choices != null + Choices = option.Choices != null ? option.Choices.Select(x => new ApplicationCommandOptionChoice() { Name = x.Name, @@ -66,22 +66,22 @@ public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties optio }).ToArray() : Optional.Unspecified; - this.Options = option.Options != null + Options = option.Options != null ? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - this.Required = option.Required.HasValue + Required = option.Required.HasValue ? option.Required.Value : Optional.Unspecified; - this.Default = option.Default.HasValue + Default = option.Default.HasValue ? option.Default.Value : Optional.Unspecified; - this.Name = option.Name; - this.Type = option.Type; - this.Description = option.Description; - this.Autocomplete = option.Autocomplete; + Name = option.Name; + Type = option.Type; + Description = option.Description; + Autocomplete = option.Autocomplete; } } } diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index afd50701b3..b941bf593a 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -34,18 +34,18 @@ public ButtonComponent() { } public ButtonComponent(Discord.ButtonComponent c) { - this.Type = c.Type; - this.Style = c.Style; - this.Label = c.Label; - this.CustomId = c.CustomId; - this.Url = c.Url; - this.Disabled = c.Disabled; + Type = c.Type; + Style = c.Style; + Label = c.Label; + CustomId = c.CustomId; + Url = c.Url; + Disabled = c.Disabled; if (c.Emote != null) { if (c.Emote is Emote e) { - this.Emote = new Emoji() + Emote = new Emoji() { Name = e.Name, Animated = e.Animated, @@ -54,7 +54,7 @@ public ButtonComponent(Discord.ButtonComponent c) } else { - this.Emote = new Emoji() + Emote = new Emoji() { Name = c.Emote.Name }; @@ -63,6 +63,6 @@ public ButtonComponent(Discord.ButtonComponent c) } [JsonIgnore] - string IMessageComponent.CustomId => this.CustomId.GetValueOrDefault(); + string IMessageComponent.CustomId => CustomId.GetValueOrDefault(); } } diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs index f99b8aa7dd..5476565dc8 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -34,13 +34,13 @@ public SelectMenuComponent() { } public SelectMenuComponent(Discord.SelectMenuComponent component) { - this.Type = component.Type; - this.CustomId = component.CustomId; - this.Options = component.Options.Select(x => new SelectMenuOption(x)).ToArray(); - this.Placeholder = component.Placeholder; - this.MinValues = component.MinValues; - this.MaxValues = component.MaxValues; - this.Disabled = component.Disabled; + Type = component.Type; + CustomId = component.CustomId; + Options = component.Options.Select(x => new SelectMenuOption(x)).ToArray(); + Placeholder = component.Placeholder; + MinValues = component.MinValues; + MaxValues = component.MaxValues; + Disabled = component.Disabled; } } } diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs index 5c6f2816b8..cb0e63035a 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs @@ -28,15 +28,15 @@ public SelectMenuOption() { } public SelectMenuOption(Discord.SelectMenuOption option) { - this.Label = option.Label; - this.Value = option.Value; - this.Description = option.Description; + Label = option.Label; + Value = option.Value; + Description = option.Description; if (option.Emote != null) { if (option.Emote is Emote e) { - this.Emoji = new Emoji() + Emoji = new Emoji() { Name = e.Name, Animated = e.Animated, @@ -45,14 +45,14 @@ public SelectMenuOption(Discord.SelectMenuOption option) } else { - this.Emoji = new Emoji() + Emoji = new Emoji() { Name = option.Emote.Name }; } } - this.Default = option.Default.HasValue ? option.Default.Value : Optional.Unspecified; + Default = option.Default.HasValue ? option.Default.Value : Optional.Unspecified; } } } diff --git a/src/Discord.Net.Rest/API/Net/MultipartFile.cs b/src/Discord.Net.Rest/API/Net/MultipartFile.cs index ab28c0dbc6..d6bc4c7aba 100644 --- a/src/Discord.Net.Rest/API/Net/MultipartFile.cs +++ b/src/Discord.Net.Rest/API/Net/MultipartFile.cs @@ -12,7 +12,7 @@ public MultipartFile(Stream stream, string filename, string contentType = null) { Stream = stream; Filename = filename; - this.ContentType = contentType; + ContentType = contentType; } } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs index ff72429a37..7fe8b10ad7 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs @@ -28,10 +28,10 @@ internal class CreateApplicationCommandParams public CreateApplicationCommandParams() { } public CreateApplicationCommandParams(string name, string description, ApplicationCommandType type, ApplicationCommandOption[] options = null) { - this.Name = name; - this.Description = description; - this.Options = Optional.Create(options); - this.Type = type; + Name = name; + Description = description; + Options = Optional.Create(options); + Type = type; } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index f42d338715..dfe003f531 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1134,7 +1134,7 @@ public async Task GetGlobalApplicationCommandsAsync(Reques { options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/commands", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"applications/{CurrentUserId}/commands", new BucketIds(), options: options).ConfigureAwait(false); } public async Task GetGlobalApplicationCommandAsync(ulong id, RequestOptions options = null) @@ -1145,7 +1145,7 @@ public async Task GetGlobalApplicationCommandAsync(ulong id, try { - return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/commands/{id}", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"applications/{CurrentUserId}/commands/{id}", new BucketIds(), options: options).ConfigureAwait(false); } catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } } @@ -1165,38 +1165,38 @@ public async Task CreateGlobalApplicationCommandAsync(Create options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommandAsync(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("POST", () => $"applications/{CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task ModifyGlobalApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/commands/{commandId}", new BucketIds(), options: options).ConfigureAwait(false); + await SendAsync("DELETE", () => $"applications/{CurrentUserId}/commands/{commandId}", new BucketIds(), options: options).ConfigureAwait(false); } public async Task BulkOverwriteGlobalApplicationCommandsAsync(CreateApplicationCommandParams[] commands, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await TrySendApplicationCommandAsync(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PUT", () => $"applications/{CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); } public async Task GetGuildApplicationCommandsAsync(ulong guildId, RequestOptions options = null) @@ -1205,7 +1205,7 @@ public async Task GetGuildApplicationCommandsAsync(ulong g var bucket = new BucketIds(guildId: guildId); - return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", bucket, options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands", bucket, options: options).ConfigureAwait(false); } public async Task GetGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) @@ -1216,7 +1216,7 @@ public async Task GetGuildApplicationCommandAsync(ulong guil try { - return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options); + return await SendAsync("GET", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options); } catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } } @@ -1238,7 +1238,7 @@ public async Task CreateGuildApplicationCommandAsync(CreateA var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommandAsync(SendJsonAsync("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("POST", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); } public async Task ModifyGuildApplicationCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1246,7 +1246,7 @@ public async Task ModifyGuildApplicationCommandAsync(ModifyA var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1254,7 +1254,7 @@ public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong comman var bucket = new BucketIds(guildId: guildId); - await SendAsync("DELETE", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options).ConfigureAwait(false); + await SendAsync("DELETE", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options).ConfigureAwait(false); } public async Task BulkOverwriteGuildApplicationCommandsAsync(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) @@ -1263,7 +1263,7 @@ public async Task BulkOverwriteGuildApplicationCommandsAsy var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommandAsync(SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PUT", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); } #endregion @@ -1283,19 +1283,19 @@ public async Task GetInteractionResponseAsync(string interactionToken, options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"webhooks/{CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options).ConfigureAwait(false); } public async Task ModifyInteractionResponseAsync(ModifyInteractionResponseParams args, string interactionToken, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("PATCH", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", args, new BucketIds(), options: options); + return await SendJsonAsync("PATCH", () => $"webhooks/{CurrentUserId}/{interactionToken}/messages/@original", args, new BucketIds(), options: options); } public async Task DeleteInteractionResponseAsync(string interactionToken, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - await SendAsync("DELETE", () => $"webhooks/{this.CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options); + await SendAsync("DELETE", () => $"webhooks/{CurrentUserId}/{interactionToken}/messages/@original", new BucketIds(), options: options); } public async Task CreateInteractionFollowupMessageAsync(CreateWebhookMessageParams args, string token, RequestOptions options = null) @@ -1345,7 +1345,7 @@ public async Task GetGuildApplicationComman options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/permissions", new BucketIds(), options: options).ConfigureAwait(false); } public async Task GetGuildApplicationCommandPermissionAsync(ulong guildId, ulong commandId, RequestOptions options = null) @@ -1355,7 +1355,7 @@ public async Task GetGuildApplicationCommandP options = RequestOptions.CreateOrClone(options); - return await SendAsync("GET", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", new BucketIds(), options: options).ConfigureAwait(false); + return await SendAsync("GET", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", new BucketIds(), options: options).ConfigureAwait(false); } public async Task ModifyApplicationCommandPermissionsAsync(ModifyGuildApplicationCommandPermissionsParams permissions, ulong guildId, ulong commandId, RequestOptions options = null) @@ -1365,7 +1365,7 @@ public async Task ModifyApplicationCommandPer options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); + return await SendJsonAsync("PUT", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); } public async Task> BatchModifyApplicationCommandPermissionsAsync(ModifyGuildApplicationCommandPermissions[] permissions, ulong guildId, RequestOptions options = null) @@ -1375,7 +1375,7 @@ public async Task> BatchM options = RequestOptions.CreateOrClone(options); - return await SendJsonAsync("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); + return await SendJsonAsync("PUT", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/permissions", permissions, new BucketIds(), options: options).ConfigureAwait(false); } #endregion diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs index dd5d2bfa91..41877befce 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -39,18 +39,18 @@ internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) internal void Update(StageInstance model, bool isLive = false) { - this.Live = isLive; + Live = isLive; if(isLive) { - this.Topic = model.Topic; - this.PrivacyLevel = model.PrivacyLevel; - this.DiscoverableDisabled = model.DiscoverableDisabled; + Topic = model.Topic; + PrivacyLevel = model.PrivacyLevel; + DiscoverableDisabled = model.DiscoverableDisabled; } else { - this.Topic = null; - this.PrivacyLevel = null; - this.DiscoverableDisabled = null; + Topic = null; + PrivacyLevel = null; + DiscoverableDisabled = null; } } @@ -67,7 +67,7 @@ public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = { var args = new API.Rest.CreateStageInstanceParams() { - ChannelId = this.Id, + ChannelId = Id, PrivacyLevel = privacyLevel, Topic = topic }; @@ -80,7 +80,7 @@ public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = /// public async Task StopStageAsync(RequestOptions options = null) { - await Discord.ApiClient.DeleteStageInstanceAsync(this.Id, options); + await Discord.ApiClient.DeleteStageInstanceAsync(Id, options); Update(null, false); } @@ -90,7 +90,7 @@ public override async Task UpdateAsync(RequestOptions options = null) { await base.UpdateAsync(options); - var model = await Discord.ApiClient.GetStageInstanceAsync(this.Id, options); + var model = await Discord.ApiClient.GetStageInstanceAsync(Id, options); Update(model, model != null); } @@ -100,10 +100,10 @@ public Task RequestToSpeakAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, RequestToSpeakTimestamp = DateTimeOffset.UtcNow }; - return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + return Discord.ApiClient.ModifyMyVoiceState(Guild.Id, args, options); } /// @@ -111,10 +111,10 @@ public Task BecomeSpeakerAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = false }; - return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + return Discord.ApiClient.ModifyMyVoiceState(Guild.Id, args, options); } /// @@ -122,10 +122,10 @@ public Task StopSpeakingAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = true }; - return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + return Discord.ApiClient.ModifyMyVoiceState(Guild.Id, args, options); } /// @@ -133,11 +133,11 @@ public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = false }; - return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + return Discord.ApiClient.ModifyUserVoiceState(Guild.Id, user.Id, args); } /// @@ -145,11 +145,11 @@ public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = nul { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = true }; - return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + return Discord.ApiClient.ModifyUserVoiceState(Guild.Id, user.Id, args); } } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index 6502c9d1fd..05980ac7a8 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -261,7 +261,7 @@ public async Task CreateThreadAsync(string name, ThreadType t ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) { var model = await ThreadHelper.CreateThreadAsync(Discord, this, name, type, autoArchiveDuration, message, options); - return RestThreadChannel.Create(Discord, this.Guild, model); + return RestThreadChannel.Create(Discord, Guild, model); } #endregion diff --git a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs index 640b7443b3..d9b223f180 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs @@ -58,21 +58,21 @@ internal override void Update(Model model) { base.Update(model); - this.Joined = model.ThreadMember.IsSpecified; + Joined = model.ThreadMember.IsSpecified; if (model.ThreadMetadata.IsSpecified) { - this.Archived = model.ThreadMetadata.Value.Archived; - this.AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; - this.ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; - this.Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + Archived = model.ThreadMetadata.Value.Archived; + AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; + ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; + Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } - this.MemberCount = model.MemberCount.GetValueOrDefault(0); - this.MessageCount = model.MessageCount.GetValueOrDefault(0); - this.Type = (ThreadType)model.Type; - this.ParentChannelId = model.CategoryId.Value; + MemberCount = model.MemberCount.GetValueOrDefault(0); + MessageCount = model.MessageCount.GetValueOrDefault(0); + Type = (ThreadType)model.Type; + ParentChannelId = model.CategoryId.Value; } /// @@ -213,18 +213,18 @@ public override IReadOnlyCollection PermissionOverwrites /// public Task JoinAsync(RequestOptions options = null) - => Discord.ApiClient.JoinThreadAsync(this.Id, options); + => Discord.ApiClient.JoinThreadAsync(Id, options); /// public Task LeaveAsync(RequestOptions options = null) - => Discord.ApiClient.LeaveThreadAsync(this.Id, options); + => Discord.ApiClient.LeaveThreadAsync(Id, options); /// public Task AddUserAsync(IGuildUser user, RequestOptions options = null) - => Discord.ApiClient.AddThreadMemberAsync(this.Id, user.Id, options); + => Discord.ApiClient.AddThreadMemberAsync(Id, user.Id, options); /// public Task RemoveUserAsync(IGuildUser user, RequestOptions options = null) - => Discord.ApiClient.RemoveThreadMemberAsync(this.Id, user.Id, options); + => Discord.ApiClient.RemoveThreadMemberAsync(Id, user.Id, options); } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index d78ff07cc7..5e56fd56ec 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -290,7 +290,7 @@ public Task LeaveAsync(RequestOptions options = null) /// A task that represents the asynchronous delete operation. /// public Task DeleteSlashCommandsAsync(RequestOptions options = null) - => InteractionHelper.DeleteAllGuildCommandsAsync(Discord, this.Id, options); + => InteractionHelper.DeleteAllGuildCommandsAsync(Discord, Id, options); /// /// Gets a collection of slash commands created by the current user in this guild. @@ -933,7 +933,7 @@ public async Task> GetApplicationCommandsA /// if found, otherwise . /// public async Task GetApplicationCommandAsync(ulong id, RequestOptions options = null) - => await ClientHelper.GetGuildApplicationCommand(Discord, id, this.Id, options); + => await ClientHelper.GetGuildApplicationCommand(Discord, id, Id, options); /// /// Creates an application command within this guild. /// @@ -944,9 +944,9 @@ public async Task GetApplicationCommandAsync(ulong id, Request /// public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(Discord, this.Id, properties, options); + var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options); - return RestGuildCommand.Create(Discord, model, this.Id); + return RestGuildCommand.Create(Discord, model, Id); } /// /// Overwrites the application commands within this guild. @@ -959,9 +959,9 @@ public async Task CreateApplicationCommandAsync(ApplicationCom public async Task> BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, this.Id, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options); - return models.Select(x => RestGuildCommand.Create(Discord, x, this.Id)).ToImmutableArray(); + return models.Select(x => RestGuildCommand.Create(Discord, x, Id)).ToImmutableArray(); } /// @@ -1066,7 +1066,7 @@ public async Task CreateStickerAsync(string name, string descript /// public async Task GetStickerAsync(ulong id, RequestOptions options = null) { - var model = await Discord.ApiClient.GetGuildStickerAsync(this.Id, id, options).ConfigureAwait(false); + var model = await Discord.ApiClient.GetGuildStickerAsync(Id, id, options).ConfigureAwait(false); if (model == null) return null; @@ -1083,7 +1083,7 @@ public async Task GetStickerAsync(ulong id, RequestOptions option /// public async Task> GetStickersAsync(RequestOptions options = null) { - var models = await Discord.ApiClient.ListGuildStickersAsync(this.Id, options).ConfigureAwait(false); + var models = await Discord.ApiClient.ListGuildStickersAsync(Id, options).ConfigureAwait(false); if (models.Length == 0) return null; diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 439790f262..80ba284961 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -35,7 +35,7 @@ public abstract class RestApplicationCommand : RestEntity, IApplicationCo /// public DateTimeOffset CreatedAt - => SnowflakeUtils.FromSnowflake(this.Id); + => SnowflakeUtils.FromSnowflake(Id); internal RestApplicationCommand(BaseDiscordClient client, ulong id) : base(client, id) @@ -57,13 +57,13 @@ internal static RestApplicationCommand Create(BaseDiscordClient client, Model mo internal virtual void Update(Model model) { - this.Type = model.Type; - this.ApplicationId = model.ApplicationId; - this.Name = model.Name; - this.Description = model.Description; - this.DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + Type = model.Type; + ApplicationId = model.ApplicationId; + Name = model.Name; + Description = model.Description; + DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); - this.Options = model.Options.IsSpecified + Options = model.Options.IsSpecified ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() : null; } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs index 902afdd44e..cd1f737684 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs @@ -20,8 +20,8 @@ public class RestApplicationCommandChoice : IApplicationCommandOptionChoice internal RestApplicationCommandChoice(Model model) { - this.Name = model.Name; - this.Value = model.Value; + Name = model.Name; + Value = model.Value; } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 78f9c0e302..511712d97a 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -50,21 +50,21 @@ internal static RestApplicationCommandOption Create(Model model) internal void Update(Model model) { - this.Type = model.Type; - this.Name = model.Name; - this.Description = model.Description; + Type = model.Type; + Name = model.Name; + Description = model.Description; if (model.Default.IsSpecified) - this.Default = model.Default.Value; + Default = model.Default.Value; if (model.Required.IsSpecified) - this.Required = model.Required.Value; + Required = model.Required.Value; - this.Options = model.Options.IsSpecified + Options = model.Options.IsSpecified ? model.Options.Value.Select(x => Create(x)).ToImmutableArray() : null; - this.Choices = model.Choices.IsSpecified + Choices = model.Choices.IsSpecified ? model.Choices.Value.Select(x => new RestApplicationCommandChoice(x)).ToImmutableArray() : null; } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs index 8d8ae5983a..bee1f39cd1 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -40,7 +40,7 @@ public override async Task DeleteAsync(RequestOptions options = null) public override async Task ModifyAsync(Action func, RequestOptions options = null) { var cmd = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); - this.Update(cmd); + Update(cmd); } } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index 48f4022973..fb41c18127 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -20,7 +20,7 @@ public class RestGuildCommand : RestApplicationCommand internal RestGuildCommand(BaseDiscordClient client, ulong id, ulong guildId) : base(client, id) { - this.GuildId = guildId; + GuildId = guildId; } internal static RestGuildCommand Create(BaseDiscordClient client, Model model, ulong guildId) @@ -45,7 +45,7 @@ public override async Task DeleteAsync(RequestOptions options = null) public override async Task ModifyAsync(Action func, RequestOptions options = null) { var model = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId, func, options).ConfigureAwait(false); - this.Update(model); + Update(model); } /// @@ -57,7 +57,7 @@ public override async Task ModifyAsync(Action func, RequestOptions o /// object defining the permissions of the current slash command. /// public Task GetCommandPermission(RequestOptions options = null) - => InteractionHelper.GetGuildCommandPermissionAsync(Discord, this.GuildId, this.Id, options); + => InteractionHelper.GetGuildCommandPermissionAsync(Discord, GuildId, Id, options); /// /// Modifies the current command permissions for this guild command. @@ -69,7 +69,7 @@ public Task GetCommandPermission(RequestOptio /// object containing the modified permissions. /// public Task ModifyCommandPermissions(ApplicationCommandPermission[] permissions, RequestOptions options = null) - => InteractionHelper.ModifyGuildCommandPermissionsAsync(Discord, this.GuildId, this.Id, permissions, options); + => InteractionHelper.ModifyGuildCommandPermissionsAsync(Discord, GuildId, Id, permissions, options); /// /// Gets the guild that this slash command resides in. @@ -81,6 +81,6 @@ public Task ModifyCommandPermissions(Applicat /// . /// public Task GetGuild(bool withCounts = false, RequestOptions options = null) - => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); + => ClientHelper.GetGuildAsync(Discord, GuildId, withCounts, options); } } diff --git a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs index 5307c49200..94caf0f3fb 100644 --- a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs @@ -35,14 +35,14 @@ public class CustomSticker : Sticker, ICustomSticker internal CustomSticker(BaseDiscordClient client, ulong id, RestGuild guild, ulong? authorId = null) : base(client, id) { - this.AuthorId = authorId; - this.Guild = guild; + AuthorId = authorId; + Guild = guild; } internal CustomSticker(BaseDiscordClient client, ulong id, ulong guildId, ulong? authorId = null) : base(client, id) { - this.AuthorId = authorId; - this.GuildId = guildId; + AuthorId = authorId; + GuildId = guildId; } internal static CustomSticker Create(BaseDiscordClient client, Model model, RestGuild guild, ulong? authorId = null) @@ -70,7 +70,7 @@ public async Task ModifyAsync(Action func, RequestOptions opt Update(model); } - private string DebuggerDisplay => this.Guild != null ? $"{Name} in {Guild.Name} ({Id})" : $"{Name} ({Id})"; + private string DebuggerDisplay => Guild != null ? $"{Name} in {Guild.Name} ({Id})" : $"{Name} ({Id})"; IGuild ICustomSticker.Guild => Guild; } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs index a7c65b3a13..103c856be4 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs @@ -19,7 +19,7 @@ public class RestFollowupMessage : RestUserMessage internal RestFollowupMessage(BaseDiscordClient discord, ulong id, IUser author, string token, IMessageChannel channel) : base(discord, id, channel, author, MessageSource.Bot) { - this.Token = token; + Token = token; } internal static RestFollowupMessage Create(BaseDiscordClient discord, Model model, string token, IMessageChannel channel) @@ -66,7 +66,7 @@ public Task DeleteAsync() try { var model = await InteractionHelper.ModifyFollowupMessage(Discord, this, func, options).ConfigureAwait(false); - this.Update(model); + Update(model); } catch (Discord.Net.HttpException x) { diff --git a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs index 3574143fcb..ae1b5f2fb2 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs @@ -15,7 +15,7 @@ public class RestInteractionMessage : RestUserMessage internal RestInteractionMessage(BaseDiscordClient discord, ulong id, IUser author, string token, IMessageChannel channel) : base(discord, id, channel, author, MessageSource.Bot) { - this.Token = token; + Token = token; } internal static RestInteractionMessage Create(BaseDiscordClient discord, Model model, string token, IMessageChannel channel) @@ -61,8 +61,8 @@ public Task DeleteAsync() { try { - var model = await InteractionHelper.ModifyInteractionResponse(Discord, this.Token, func, options).ConfigureAwait(false); - this.Update(model); + var model = await InteractionHelper.ModifyInteractionResponse(Discord, Token, func, options).ConfigureAwait(false); + Update(model); } catch (Discord.Net.HttpException x) { diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index 46dbc3418d..6490978e76 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -28,7 +28,7 @@ public class Sticker : RestEntity, ISticker /// public string GetStickerUrl() - => CDN.GetStickerUrl(this.Id, this.Format); + => CDN.GetStickerUrl(Id, Format); internal Sticker(BaseDiscordClient client, ulong id) : base(client, id) { } diff --git a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs index dade33bb97..f1bcb99513 100644 --- a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs +++ b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs @@ -21,8 +21,8 @@ public class StickerItem : RestEntity, IStickerItem internal StickerItem(BaseDiscordClient client, Model model) : base(client, model.Id) { - this.Name = model.Name; - this.Format = model.FormatType; + Name = model.Name; + Format = model.FormatType; } /// @@ -34,7 +34,7 @@ internal StickerItem(BaseDiscordClient client, Model model) public async Task ResolveStickerAsync() { - var model = await Discord.ApiClient.GetStickerAsync(this.Id); + var model = await Discord.ApiClient.GetStickerAsync(Id); if (model.GuildId.IsSpecified) return CustomSticker.Create(Discord, model, model.GuildId.Value, model.User.IsSpecified ? model.User.Value.Id : null); diff --git a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs index bb981bfdb1..4dd7f7aafc 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs @@ -31,8 +31,8 @@ public class RestThreadUser : RestEntity internal RestThreadUser(BaseDiscordClient discord, IGuild guild, IThreadChannel channel, ulong id) : base(discord, id) { - this.Guild = guild; - this.Thread = channel; + Guild = guild; + Thread = channel; } internal static RestThreadUser Create(BaseDiscordClient client, IGuild guild, Model model, IThreadChannel channel) @@ -44,7 +44,7 @@ internal static RestThreadUser Create(BaseDiscordClient client, IGuild guild, Mo internal void Update(Model model) { - this.JoinedAt = model.JoinTimestamp; + JoinedAt = model.JoinTimestamp; } /// @@ -55,6 +55,6 @@ internal void Update(Model model) /// that represents the current thread user. /// public Task GetGuildUser() - => Guild.GetUserAsync(this.Id); + => Guild.GetUserAsync(Id); } } diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 106b79968d..faafa918f4 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -164,7 +164,7 @@ internal override async Task OnLoginAsync(TokenType tokenType, string token) for (int i = 0; i < _shards.Length; i++) await _shards[i].LoginAsync(tokenType, token); - if(this._defaultStickers.Length == 0) + if(_defaultStickers.Length == 0) await DownloadDefaultStickersAsync().ConfigureAwait(false); } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 72f22c9a53..1cd3debf49 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -82,8 +82,8 @@ public override IReadOnlyCollection> DefaultStickerPa { get { - if (this._shardedClient != null) - return this._shardedClient.DefaultStickerPacks; + if (_shardedClient != null) + return _shardedClient.DefaultStickerPacks; else return _defaultStickers.ToReadOnlyCollection(); } @@ -209,7 +209,7 @@ internal override void Dispose(bool disposing) internal override async Task OnLoginAsync(TokenType tokenType, string token) { - if(this._shardedClient == null && this._defaultStickers.Length == 0) + if(_shardedClient == null && _defaultStickers.Length == 0) { var models = await ApiClient.ListNitroStickerPacksAsync().ConfigureAwait(false); @@ -2085,14 +2085,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty if (channel == null) { - var channelModel = await this.Rest.ApiClient.GetChannelAsync(data.ChannelId.Value); + var channelModel = await Rest.ApiClient.GetChannelAsync(data.ChannelId.Value); if (data.GuildId.IsSpecified) - channel = SocketTextChannel.Create(State.GetGuild(data.GuildId.Value), this.State, channelModel); + channel = SocketTextChannel.Create(State.GetGuild(data.GuildId.Value), State, channelModel); else channel = (SocketChannel)SocketChannel.CreatePrivate(this, State, channelModel); - this.State.AddChannel(channel); + State.AddChannel(channel); } if (channel is ISocketMessageChannel textChannel) @@ -2224,14 +2224,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty if ((threadChannel = guild.ThreadChannels.FirstOrDefault(x => x.Id == data.Id)) != null) { - threadChannel.Update(this.State, data); + threadChannel.Update(State, data); if(data.ThreadMember.IsSpecified) threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); } else { - threadChannel = (SocketThreadChannel)guild.AddChannel(this.State, data); + threadChannel = (SocketThreadChannel)guild.AddChannel(State, data); if (data.ThreadMember.IsSpecified) threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); } @@ -2322,11 +2322,11 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty if(entity == null) { - entity = (SocketThreadChannel)guild.AddChannel(this.State, thread); + entity = (SocketThreadChannel)guild.AddChannel(State, thread); } else { - entity.Update(this.State, thread); + entity.Update(State, thread); } foreach(var member in data.Members.Where(x => x.Id.Value == entity.Id)) diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index 22a201c679..e2e4f98976 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -137,13 +137,13 @@ public int MaxWaitBetweenGuildAvailablesBeforeReady { get { - return this.maxWaitForGuildAvailable; + return maxWaitForGuildAvailable; } set { - Preconditions.AtLeast(value, 0, nameof(this.MaxWaitBetweenGuildAvailablesBeforeReady)); - this.maxWaitForGuildAvailable = value; + Preconditions.AtLeast(value, 0, nameof(MaxWaitBetweenGuildAvailablesBeforeReady)); + maxWaitForGuildAvailable = value; } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index 0aa89ac8f8..1956a9b86f 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -37,7 +37,7 @@ public bool IsSpeaker /// Gets a collection of users who are speakers within the stage. /// public IReadOnlyCollection Speakers - => this.Users.Where(x => !x.IsSuppressed).ToImmutableArray(); + => Users.Where(x => !x.IsSuppressed).ToImmutableArray(); internal new SocketStageChannel Clone() => MemberwiseClone() as SocketStageChannel; @@ -62,18 +62,18 @@ internal override void Update(ClientState state, Model model) internal void Update(StageInstance model, bool isLive = false) { - this.Live = isLive; + Live = isLive; if (isLive) { - this.Topic = model.Topic; - this.PrivacyLevel = model.PrivacyLevel; - this.DiscoverableDisabled = model.DiscoverableDisabled; + Topic = model.Topic; + PrivacyLevel = model.PrivacyLevel; + DiscoverableDisabled = model.DiscoverableDisabled; } else { - this.Topic = null; - this.PrivacyLevel = null; - this.DiscoverableDisabled = null; + Topic = null; + PrivacyLevel = null; + DiscoverableDisabled = null; } } @@ -82,14 +82,14 @@ public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = { var args = new API.Rest.CreateStageInstanceParams() { - ChannelId = this.Id, + ChannelId = Id, Topic = topic, PrivacyLevel = privacyLevel, }; var model = await Discord.ApiClient.CreateStageInstanceAsync(args, options).ConfigureAwait(false); - this.Update(model, true); + Update(model, true); } /// @@ -97,13 +97,13 @@ public async Task ModifyInstanceAsync(Action func, Requ { var model = await ChannelHelper.ModifyAsync(this, Discord, func, options); - this.Update(model, true); + Update(model, true); } /// public async Task StopStageAsync(RequestOptions options = null) { - await Discord.ApiClient.DeleteStageInstanceAsync(this.Id, options); + await Discord.ApiClient.DeleteStageInstanceAsync(Id, options); Update(null, false); } @@ -113,10 +113,10 @@ public Task RequestToSpeakAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, RequestToSpeakTimestamp = DateTimeOffset.UtcNow }; - return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + return Discord.ApiClient.ModifyMyVoiceState(Guild.Id, args, options); } /// @@ -124,10 +124,10 @@ public Task BecomeSpeakerAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = false }; - return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + return Discord.ApiClient.ModifyMyVoiceState(Guild.Id, args, options); } /// @@ -135,10 +135,10 @@ public Task StopSpeakingAsync(RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = true }; - return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); + return Discord.ApiClient.ModifyMyVoiceState(Guild.Id, args, options); } /// @@ -146,11 +146,11 @@ public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = false }; - return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + return Discord.ApiClient.ModifyUserVoiceState(Guild.Id, user.Id, args); } /// @@ -158,11 +158,11 @@ public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = nul { var args = new API.Rest.ModifyVoiceStateParams() { - ChannelId = this.Id, + ChannelId = Id, Suppressed = true }; - return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); + return Discord.ApiClient.ModifyUserVoiceState(Guild.Id, user.Id, args); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index 3e91eba064..63ada8592e 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -55,7 +55,7 @@ public override IReadOnlyCollection Users /// Gets a collection of threads within this text channel. /// public IReadOnlyCollection Threads - => Guild.ThreadChannels.Where(x => x.ParentChannel.Id == this.Id).ToImmutableArray(); + => Guild.ThreadChannels.Where(x => x.ParentChannel.Id == Id).ToImmutableArray(); internal SocketTextChannel(DiscordSocketClient discord, ulong id, SocketGuild guild) : base(discord, id, guild) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 33832096bc..9a8f4b1393 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -41,7 +41,7 @@ public SocketThreadUser CurrentUser /// if this thread is private, otherwise /// public bool IsPrivateThread - => this.Type == ThreadType.PrivateThread; + => Type == ThreadType.PrivateThread; /// /// Gets the parent channel this thread resides in. @@ -84,8 +84,8 @@ public bool IsPrivateThread internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) : base(discord, id, guild) { - this.ParentChannel = parent; - this._members = new ConcurrentDictionary(); + ParentChannel = parent; + _members = new ConcurrentDictionary(); } internal new static SocketThreadChannel Create(SocketGuild guild, ClientState state, Model model) @@ -100,24 +100,24 @@ internal override void Update(ClientState state, Model model) { base.Update(state, model); - this.Type = (ThreadType)model.Type; - this.MessageCount = model.MessageCount.GetValueOrDefault(-1); - this.MemberCount = model.MemberCount.GetValueOrDefault(-1); + Type = (ThreadType)model.Type; + MessageCount = model.MessageCount.GetValueOrDefault(-1); + MemberCount = model.MemberCount.GetValueOrDefault(-1); if (model.ThreadMetadata.IsSpecified) { - this.Archived = model.ThreadMetadata.Value.Archived; - this.ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; - this.AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; - this.Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + Archived = model.ThreadMetadata.Value.Archived; + ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; + AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; + Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } if (model.OwnerId.IsSpecified) { - this.Owner = GetUser(model.OwnerId.Value); + Owner = GetUser(model.OwnerId.Value); } - this.Joined = model.ThreadMember.IsSpecified; + Joined = model.ThreadMember.IsSpecified; } internal IReadOnlyCollection RemoveUsers(ulong[] users) @@ -139,7 +139,7 @@ internal SocketThreadUser AddOrUpdateThreadMember(ThreadMember model, SocketGuil member.Update(model); else { - member = SocketThreadUser.Create(this.Guild, this, model, guildMember); + member = SocketThreadUser.Create(Guild, this, model, guildMember); member.GlobalUser.AddRef(); _members[member.Id] = member; } @@ -167,10 +167,10 @@ public async Task> GetUsersAsync(RequestOp if (!_usersDownloaded) { await DownloadUsersAsync(options); - this._usersDownloaded = true; + _usersDownloaded = true; } - return this.Users; + return Users; } @@ -181,15 +181,15 @@ public async Task> GetUsersAsync(RequestOp /// A task representing the asyncronous download operation. public async Task DownloadUsersAsync(RequestOptions options = null) { - var users = await Discord.ApiClient.ListThreadMembersAsync(this.Id, options); + var users = await Discord.ApiClient.ListThreadMembersAsync(Id, options); lock (_downloadLock) { foreach (var threadMember in users) { - var guildUser = this.Guild.GetUser(threadMember.UserId.Value); + var guildUser = Guild.GetUser(threadMember.UserId.Value); - this.AddOrUpdateThreadMember(threadMember, guildUser); + AddOrUpdateThreadMember(threadMember, guildUser); } } } @@ -198,11 +198,11 @@ public async Task DownloadUsersAsync(RequestOptions options = null) /// public Task JoinAsync(RequestOptions options = null) - => Discord.ApiClient.JoinThreadAsync(this.Id, options); + => Discord.ApiClient.JoinThreadAsync(Id, options); /// public Task LeaveAsync(RequestOptions options = null) - => Discord.ApiClient.LeaveThreadAsync(this.Id, options); + => Discord.ApiClient.LeaveThreadAsync(Id, options); /// /// Adds a user to this thread. @@ -213,7 +213,7 @@ public Task LeaveAsync(RequestOptions options = null) /// A task that represents the asynchronous operation of adding a member to a thread. /// public Task AddUserAsync(IGuildUser user, RequestOptions options = null) - => Discord.ApiClient.AddThreadMemberAsync(this.Id, user.Id, options); + => Discord.ApiClient.AddThreadMemberAsync(Id, user.Id, options); /// /// Removes a user from this thread. @@ -224,7 +224,7 @@ public Task AddUserAsync(IGuildUser user, RequestOptions options = null) /// A task that represents the asynchronous operation of removing a user from this thread. /// public Task RemoveUserAsync(IGuildUser user, RequestOptions options = null) - => Discord.ApiClient.RemoveThreadMemberAsync(this.Id, user.Id, options); + => Discord.ApiClient.RemoveThreadMemberAsync(Id, user.Id, options); /// @@ -339,6 +339,6 @@ public override IReadOnlyCollection PermissionOverwrites public override Task SyncPermissionsAsync(RequestOptions options = null) => throw new NotImplementedException(); - string IChannel.Name => this.Name; + string IChannel.Name => Name; } } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index e4a03f8186..ccda12644a 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -842,7 +842,7 @@ public Task CreateIntegrationAsync(ulong id, string type, /// A task that represents the asynchronous delete operation. /// public Task DeleteApplicationCommandsAsync(RequestOptions options = null) - => InteractionHelper.DeleteAllGuildCommandsAsync(Discord, this.Id, options); + => InteractionHelper.DeleteAllGuildCommandsAsync(Discord, Id, options); /// /// Gets a collection of slash commands created by the current user in this guild. @@ -854,7 +854,7 @@ public Task DeleteApplicationCommandsAsync(RequestOptions options = null) /// public async Task> GetApplicationCommandsAsync(RequestOptions options = null) { - var commands = (await Discord.ApiClient.GetGuildApplicationCommandsAsync(this.Id, options)).Select(x => SocketApplicationCommand.Create(Discord, x, this.Id)); + var commands = (await Discord.ApiClient.GetGuildApplicationCommandsAsync(Id, options)).Select(x => SocketApplicationCommand.Create(Discord, x, Id)); foreach (var command in commands) { @@ -889,7 +889,7 @@ public async ValueTask GetApplicationCommandAsync(ulon if (model == null) return null; - command = SocketApplicationCommand.Create(Discord, model, this.Id); + command = SocketApplicationCommand.Create(Discord, model, Id); Discord.State.AddCommand(command); @@ -906,7 +906,7 @@ public async ValueTask GetApplicationCommandAsync(ulon /// public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(Discord, this.Id, properties, options); + var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options); var entity = Discord.State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(Discord, model)); @@ -926,11 +926,11 @@ public async Task CreateApplicationCommandAsync(Applic public async Task> BulkOverwriteApplicationCommandAsync(ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, this.Id, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options); var entities = models.Select(x => SocketApplicationCommand.Create(Discord, x)); - Discord.State.PurgeCommands(x => !x.IsGlobalCommand && x.Guild.Id == this.Id); + Discord.State.PurgeCommands(x => !x.IsGlobalCommand && x.Guild.Id == Id); foreach(var entity in entities) { @@ -1016,7 +1016,7 @@ internal SocketRole RemoveRole(ulong id) internal SocketRole AddOrUpdateRole(RoleModel model) { if (_roles.TryGetValue(model.Id, out SocketRole role)) - _roles[model.Id].Update(this.Discord.State, model); + _roles[model.Id].Update(Discord.State, model); else role = AddRole(model); @@ -1291,7 +1291,7 @@ public async ValueTask GetStickerAsync(ulong id, CacheMode if (mode == CacheMode.CacheOnly) return null; - var model = await Discord.ApiClient.GetGuildStickerAsync(this.Id, id, options).ConfigureAwait(false); + var model = await Discord.ApiClient.GetGuildStickerAsync(Id, id, options).ConfigureAwait(false); if (model == null) return null; @@ -1317,13 +1317,13 @@ public SocketCustomSticker GetSticker(ulong id) public async ValueTask> GetStickersAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) { - if (this.Stickers.Count > 0) - return this.Stickers; + if (Stickers.Count > 0) + return Stickers; if (mode == CacheMode.CacheOnly) return ImmutableArray.Create(); - var models = await Discord.ApiClient.ListGuildStickersAsync(this.Id, options).ConfigureAwait(false); + var models = await Discord.ApiClient.ListGuildStickersAsync(Id, options).ConfigureAwait(false); List stickers = new(); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs index 72f040cc61..efd99c2c44 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs @@ -25,7 +25,7 @@ internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMe : null; ulong? guildId = null; - if (this.Channel is SocketGuildChannel guildChannel) + if (Channel is SocketGuildChannel guildChannel) guildId = guildChannel.Guild.Id; Data = SocketMessageCommandData.Create(client, dataModel, model.Id, guildId); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs index 5345c08f7a..a61279db97 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs @@ -25,7 +25,7 @@ internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessa : null; ulong? guildId = null; - if (this.Channel is SocketGuildChannel guildChannel) + if (Channel is SocketGuildChannel guildChannel) guildId = guildChannel.Guild.Id; Data = SocketUserCommandData.Create(client, dataModel, model.Id, guildId); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 7b2cc20627..aa3a915aef 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -32,7 +32,7 @@ internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocket (DataModel)model.Data.Value : null; - this.Data = new SocketMessageComponentData(dataModel); + Data = new SocketMessageComponentData(dataModel); } new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) @@ -48,10 +48,10 @@ internal override void Update(Model model) if (model.Message.IsSpecified) { - if (this.Message == null) + if (Message == null) { SocketUser author = null; - if (this.Channel is SocketGuildChannel channel) + if (Channel is SocketGuildChannel channel) { if (model.Message.Value.WebhookId.IsSpecified) author = SocketWebhookUser.Create(channel.Guild, Discord.State, model.Message.Value.Author.Value, model.Message.Value.WebhookId.Value); @@ -59,13 +59,13 @@ internal override void Update(Model model) author = channel.Guild.GetUser(model.Message.Value.Author.Value.Id); } else if (model.Message.Value.Author.IsSpecified) - author = (this.Channel as SocketChannel).GetUser(model.Message.Value.Author.Value.Id); + author = (Channel as SocketChannel).GetUser(model.Message.Value.Author.Value.Id); - this.Message = SocketUserMessage.Create(this.Discord, this.Discord.State, author, this.Channel, model.Message.Value); + Message = SocketUserMessage.Create(Discord, Discord.State, author, Channel, model.Message.Value); } else { - this.Message.Update(this.Discord.State, model.Message.Value); + Message.Update(Discord.State, model.Message.Value); } } } @@ -131,7 +131,7 @@ public override async Task RespondAsync( if (ephemeral) response.Data.Value.Flags = MessageFlags.Ephemeral; - await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); + await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); } /// @@ -210,7 +210,7 @@ public async Task UpdateAsync(Action func, RequestOptions opt } }; - await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, this.Token, options); + await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); } /// @@ -371,7 +371,7 @@ public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = n }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, this.Id, this.Token, options); + return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); } /// @@ -384,7 +384,7 @@ public override Task DeferAsync(bool ephemeral = false, RequestOptions options = }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, this.Id, this.Token, options); + return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs index a24fd59ac9..098478612d 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs @@ -29,9 +29,9 @@ public class SocketMessageComponentData internal SocketMessageComponentData(Model model) { - this.CustomId = model.CustomId; - this.Type = model.ComponentType; - this.Values = model.Values.GetValueOrDefault(); + CustomId = model.CustomId; + Type = model.ComponentType; + Values = model.Values.GetValueOrDefault(); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs index fe6322392c..0eb22f29d2 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs @@ -54,7 +54,7 @@ internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, /// A task that represents the asynchronous operation of responding to this interaction. /// public Task RespondAsync(IEnumerable result, RequestOptions options = null) - => InteractionHelper.SendAutocompleteResult(Discord, result, this.Id, this.Token, options); + => InteractionHelper.SendAutocompleteResult(Discord, result, Id, Token, options); /// /// Responds to this interaction with a set of choices. @@ -71,7 +71,7 @@ public Task RespondAsync(IEnumerable result, RequestOptions /// A task that represents the asynchronous operation of responding to this interaction. /// public Task RespondAsync(RequestOptions options = null, params AutocompleteResult[] result) - => InteractionHelper.SendAutocompleteResult(Discord, result, this.Id, this.Token, options); + => InteractionHelper.SendAutocompleteResult(Discord, result, Id, Token, options); /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index 34087116d1..06e313b44d 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -48,13 +48,13 @@ internal SocketAutocompleteInteractionData(DataModel model) { var options = model.Options.Select(x => new AutocompleteOption(x.Type, x.Name, x.Value, x.Focused)); - this.Current = options.FirstOrDefault(x => x.Focused); - this.Options = options.ToImmutableArray(); + Current = options.FirstOrDefault(x => x.Focused); + Options = options.ToImmutableArray(); - this.CommandName = model.Name; - this.CommandId = model.Id; - this.Type = model.Type; - this.Version = model.Version; + CommandName = model.Name; + CommandId = model.Id; + Type = model.Type; + Version = model.Version; } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 05c051f12f..db53f5d081 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -25,7 +25,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess : null; ulong? guildId = null; - if (this.Channel is SocketGuildChannel guildChannel) + if (Channel is SocketGuildChannel guildChannel) guildId = guildChannel.Guild.Id; Data = SocketSlashCommandData.Create(client, dataModel, guildId); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 4b6764bf71..7b504f1190 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -23,7 +23,7 @@ internal override void Update(Model model) { base.Update(model); - this.Options = model.Options.IsSpecified + Options = model.Options.IsSpecified ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(this, x)).ToImmutableArray() : null; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index ef6a187a4a..b2ea828561 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -28,8 +28,8 @@ public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOp internal SocketSlashCommandDataOption() { } internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) { - this.Name = model.Name; - this.Type = model.Type; + Name = model.Name; + Type = model.Type; if (model.Value.IsSpecified) { @@ -41,23 +41,23 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) case ApplicationCommandOptionType.Mentionable: if (ulong.TryParse($"{model.Value.Value}", out var valueId)) { - switch (this.Type) + switch (Type) { case ApplicationCommandOptionType.User: { var guildUser = data.ResolvableData.GuildMembers.FirstOrDefault(x => x.Key == valueId).Value; if (guildUser != null) - this.Value = guildUser; + Value = guildUser; else - this.Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; + Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; } break; case ApplicationCommandOptionType.Channel: - this.Value = data.ResolvableData.Channels.FirstOrDefault(x => x.Key == valueId).Value; + Value = data.ResolvableData.Channels.FirstOrDefault(x => x.Key == valueId).Value; break; case ApplicationCommandOptionType.Role: - this.Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; + Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; break; case ApplicationCommandOptionType.Mentionable: { @@ -66,54 +66,54 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) var guildUser = data.ResolvableData.GuildMembers.FirstOrDefault(x => x.Key == valueId).Value; if (guildUser != null) - this.Value = guildUser; + Value = guildUser; else - this.Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; + Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; } else if(data.ResolvableData.Roles.Any(x => x.Key == valueId)) { - this.Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; + Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; } } break; default: - this.Value = model.Value.Value; + Value = model.Value.Value; break; } } break; case ApplicationCommandOptionType.String: - this.Value = model.Value.ToString(); + Value = model.Value.ToString(); break; case ApplicationCommandOptionType.Integer: { if (model.Value.Value is long val) - this.Value = val; + Value = val; else if (long.TryParse(model.Value.Value.ToString(), out long res)) - this.Value = res; + Value = res; } break; case ApplicationCommandOptionType.Boolean: { if (model.Value.Value is bool val) - this.Value = val; + Value = val; else if (bool.TryParse(model.Value.Value.ToString(), out bool res)) - this.Value = res; + Value = res; } break; case ApplicationCommandOptionType.Number: { if (model.Value.Value is int val) - this.Value = val; + Value = val; else if (double.TryParse(model.Value.Value.ToString(), out double res)) - this.Value = res; + Value = res; } break; } } - this.Options = model.Options.IsSpecified + Options = model.Options.IsSpecified ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() : null; } @@ -130,7 +130,7 @@ public static explicit operator string(SocketSlashCommandDataOption option) #region IApplicationCommandInteractionDataOption IReadOnlyCollection IApplicationCommandInteractionDataOption.Options - => this.Options; + => Options; #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index 2c142e811c..f70f5b8a3e 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -47,20 +47,20 @@ public bool IsGlobalCommand /// public DateTimeOffset CreatedAt - => SnowflakeUtils.FromSnowflake(this.Id); + => SnowflakeUtils.FromSnowflake(Id); /// /// Returns the guild this command resides in, if this command is a global command then it will return /// public SocketGuild Guild - => GuildId.HasValue ? Discord.GetGuild(this.GuildId.Value) : null; + => GuildId.HasValue ? Discord.GetGuild(GuildId.Value) : null; private ulong? GuildId { get; set; } internal SocketApplicationCommand(DiscordSocketClient client, ulong id, ulong? guildId) : base(client, id) { - this.GuildId = guildId; + GuildId = guildId; } internal static SocketApplicationCommand Create(DiscordSocketClient client, GatewayModel model) { @@ -78,19 +78,19 @@ internal static SocketApplicationCommand Create(DiscordSocketClient client, Mode internal void Update(Model model) { - this.ApplicationId = model.ApplicationId; - this.Description = model.Description; - this.Name = model.Name; - this.DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + ApplicationId = model.ApplicationId; + Description = model.Description; + Name = model.Name; + DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); - this.Options = model.Options.IsSpecified + Options = model.Options.IsSpecified ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() : new ImmutableArray(); } /// public Task DeleteAsync(RequestOptions options = null) - => InteractionHelper.DeleteUnknownApplicationCommand(Discord, this.GuildId, this, options); + => InteractionHelper.DeleteUnknownApplicationCommand(Discord, GuildId, this, options); /// public Task ModifyAsync(Action func, RequestOptions options = null) @@ -103,16 +103,16 @@ public async Task ModifyAsync(Action func, RequestOptions options = { Model command = null; - if (this.IsGlobalCommand) + if (IsGlobalCommand) { command = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); } else { - command = await InteractionHelper.ModifyGuildCommand(Discord, this, this.GuildId.Value, func, options); + command = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId.Value, func, options); } - this.Update(command); + Update(command); } #endregion diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs index e9809b7ba2..0f36af0b88 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs @@ -27,8 +27,8 @@ internal static SocketApplicationCommandChoice Create(Model model) } internal void Update(Model model) { - this.Name = model.Name; - this.Value = model.Value; + Name = model.Name; + Value = model.Value; } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs index 0a90a8073b..08b2757cd4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs @@ -48,23 +48,23 @@ internal static SocketApplicationCommandOption Create(Model model) internal void Update(Model model) { - this.Name = model.Name; - this.Type = model.Type; - this.Description = model.Description; + Name = model.Name; + Type = model.Type; + Description = model.Description; - this.Default = model.Default.IsSpecified + Default = model.Default.IsSpecified ? model.Default.Value : null; - this.Required = model.Required.IsSpecified + Required = model.Required.IsSpecified ? model.Required.Value : null; - this.Choices = model.Choices.IsSpecified + Choices = model.Choices.IsSpecified ? model.Choices.Value.Select(x => SocketApplicationCommandChoice.Create(x)).ToImmutableArray() : new ImmutableArray(); - this.Options = model.Options.IsSpecified + Options = model.Options.IsSpecified ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() : new ImmutableArray(); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index d4b5f952d6..d0622196a4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -41,7 +41,7 @@ internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessa : null; ulong? guildId = null; - if (this.Channel is SocketGuildChannel guildChannel) + if (Channel is SocketGuildChannel guildChannel) guildId = guildChannel.Guild.Id; Data = SocketCommandBaseData.Create(client, dataModel, model.Id, guildId); @@ -60,7 +60,7 @@ internal override void Update(Model model) (DataModel)model.Data.Value : null; - this.Data.Update(data); + Data.Update(data); base.Update(model); } @@ -124,7 +124,7 @@ public override async Task RespondAsync( } }; - await InteractionHelper.SendInteractionResponse(this.Discord, response, this.Id, Token, options); + await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); } /// @@ -285,7 +285,7 @@ public override Task DeferAsync(bool ephemeral = false, RequestOptions options = } }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, this.Id, this.Token, options); + return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs index 64aeb5d241..cac1ce2df1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs @@ -25,7 +25,7 @@ public class SocketCommandBaseData : SocketEntity, IApplicationC internal SocketCommandBaseData(DiscordSocketClient client, Model model, ulong? guildId) : base(client, model.Id) { - this.Type = model.Type; + Type = model.Type; if (model.Resolved.IsSpecified) { @@ -42,7 +42,7 @@ internal static SocketCommandBaseData Create(DiscordSocketClient client, Model m internal virtual void Update(Model model) { - this.Name = model.Name; + Name = model.Name; } IReadOnlyCollection IApplicationCommandInteractionData.Options diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs index 17c96724ca..c76bc49c3f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs @@ -32,7 +32,7 @@ internal SocketResolvableData(DiscordSocketClient discord, ulong? guildId, T mod { var socketUser = discord.GetOrCreateUser(discord.State, user.Value); - this.Users.Add(ulong.Parse(user.Key), socketUser); + Users.Add(ulong.Parse(user.Key), socketUser); } } @@ -56,7 +56,7 @@ internal SocketResolvableData(DiscordSocketClient discord, ulong? guildId, T mod } discord.State.AddChannel(socketChannel); - this.Channels.Add(ulong.Parse(channel.Key), socketChannel); + Channels.Add(ulong.Parse(channel.Key), socketChannel); } } @@ -66,7 +66,7 @@ internal SocketResolvableData(DiscordSocketClient discord, ulong? guildId, T mod { member.Value.User = resolved.Users.Value[member.Key]; var user = guild.AddOrUpdateUser(member.Value); - this.GuildMembers.Add(ulong.Parse(member.Key), user); + GuildMembers.Add(ulong.Parse(member.Key), user); } } @@ -75,7 +75,7 @@ internal SocketResolvableData(DiscordSocketClient discord, ulong? guildId, T mod foreach (var role in resolved.Roles.Value) { var socketRole = guild.AddOrUpdateRole(role.Value); - this.Roles.Add(ulong.Parse(role.Key), socketRole); + Roles.Add(ulong.Parse(role.Key), socketRole); } } @@ -105,7 +105,7 @@ internal SocketResolvableData(DiscordSocketClient discord, ulong? guildId, T mod } var message = SocketMessage.Create(discord, discord.State, author, channel, msg.Value); - this.Messages.Add(message.Id, message); + Messages.Add(message.Id, message); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index e98999d115..6a721907ac 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -45,7 +45,7 @@ public abstract class SocketInteraction : SocketEntity, IDiscordInteracti /// public DateTimeOffset CreatedAt - => SnowflakeUtils.FromSnowflake(this.Id); + => SnowflakeUtils.FromSnowflake(Id); /// /// if the token is valid for replying to, otherwise . @@ -58,7 +58,7 @@ public bool IsValidToken internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) { - this.Channel = channel; + Channel = channel; } internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) @@ -93,24 +93,24 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model internal virtual void Update(Model model) { - this.Data = model.Data.IsSpecified + Data = model.Data.IsSpecified ? model.Data.Value : null; - this.GuildId = model.GuildId.ToNullable(); - this.Token = model.Token; - this.Version = model.Version; - this.Type = model.Type; + GuildId = model.GuildId.ToNullable(); + Token = model.Token; + Version = model.Version; + Type = model.Type; - if (this.User == null) + if (User == null) { if (model.Member.IsSpecified && model.GuildId.IsSpecified) { - this.User = SocketGuildUser.Create(Discord.State.GetGuild(this.GuildId.Value), Discord.State, model.Member.Value); + User = SocketGuildUser.Create(Discord.State.GetGuild(GuildId.Value), Discord.State, model.Member.Value); } else { - this.User = SocketGlobalUser.Create(this.Discord, this.Discord.State, model.User.Value); + User = SocketGlobalUser.Create(Discord, Discord.State, model.User.Value); } } } @@ -192,7 +192,7 @@ public abstract Task FollowupWithFileAsync(string text = nu /// The request options for this async request. /// A that represents the initial response. public Task GetOriginalResponseAsync(RequestOptions options = null) - => InteractionHelper.GetOriginalResponseAsync(this.Discord, this.Channel, this, options); + => InteractionHelper.GetOriginalResponseAsync(Discord, Channel, this, options); /// /// Edits original response for this interaction. @@ -202,8 +202,8 @@ public Task GetOriginalResponseAsync(RequestOptions opti /// A that represents the initial response. public async Task ModifyOriginalResponseAsync(Action func, RequestOptions options = null) { - var model = await InteractionHelper.ModifyInteractionResponse(this.Discord, this.Token, func, options); - return RestInteractionMessage.Create(this.Discord, model, this.Token, this.Channel); + var model = await InteractionHelper.ModifyInteractionResponse(Discord, Token, func, options); + return RestInteractionMessage.Create(Discord, model, Token, Channel); } /// @@ -219,7 +219,7 @@ public async Task ModifyOriginalResponseAsync(Action /// public SocketGuildUser Author - => this.AuthorId.HasValue ? Guild.GetUser(this.AuthorId.Value) : null; + => AuthorId.HasValue ? Guild.GetUser(AuthorId.Value) : null; /// /// Gets the guild the sticker was created in. @@ -40,8 +40,8 @@ public SocketGuildUser Author internal SocketCustomSticker(DiscordSocketClient client, ulong id, SocketGuild guild, ulong? authorId = null) : base(client, id) { - this.Guild = guild; - this.AuthorId = authorId; + Guild = guild; + AuthorId = authorId; } internal static SocketCustomSticker Create(DiscordSocketClient client, Model model, SocketGuild guild, ulong? authorId = null) @@ -57,16 +57,16 @@ public async Task ModifyAsync(Action func, RequestOptions opt if(!Guild.CurrentUser.GuildPermissions.Has(GuildPermission.ManageEmojisAndStickers)) throw new InvalidOperationException($"Missing permission {nameof(GuildPermission.ManageEmojisAndStickers)}"); - var model = await GuildHelper.ModifyStickerAsync(this.Discord, this.Guild.Id, this, func, options); + var model = await GuildHelper.ModifyStickerAsync(Discord, Guild.Id, this, func, options); - this.Update(model); + Update(model); } /// public async Task DeleteAsync(RequestOptions options = null) { - await GuildHelper.DeleteStickerAsync(Discord, this.Guild.Id, this, options); - Guild.RemoveSticker(this.Id); + await GuildHelper.DeleteStickerAsync(Discord, Guild.Id, this, options); + Guild.RemoveSticker(Id); } internal SocketCustomSticker Clone() => MemberwiseClone() as SocketCustomSticker; @@ -76,10 +76,10 @@ public async Task DeleteAsync(RequestOptions options = null) #region ICustomSticker ulong? ICustomSticker.AuthorId - => this.AuthorId; + => AuthorId; IGuild ICustomSticker.Guild - => this.Guild; + => Guild; #endregion } } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index 5e4e09aa8b..a1c2f10027 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -42,7 +42,7 @@ public class SocketSticker : SocketEntity, ISticker /// public string GetStickerUrl() - => CDN.GetStickerUrl(this.Id, this.Format); + => CDN.GetStickerUrl(Id, Format); internal SocketSticker(DiscordSocketClient client, ulong id) : base(client, id) { } @@ -62,21 +62,21 @@ internal static SocketSticker Create(DiscordSocketClient client, Model model) internal virtual void Update(Model model) { - this.Name = model.Name; - this.Description = model.Desription; - this.PackId = model.PackId; - this.Available = model.Available; - this.Format = model.FormatType; - this.Type = model.Type; - this.SortOrder = model.SortValue; + Name = model.Name; + Description = model.Desription; + PackId = model.PackId; + Available = model.Available; + Format = model.FormatType; + Type = model.Type; + SortOrder = model.SortValue; if (model.Tags.IsSpecified) { - this.Tags = model.Tags.Value.Split(',').Select(x => x.Trim()).ToImmutableArray(); + Tags = model.Tags.Value.Split(',').Select(x => x.Trim()).ToImmutableArray(); } else { - this.Tags = ImmutableArray.Empty; + Tags = ImmutableArray.Empty; } } @@ -87,15 +87,15 @@ public override bool Equals(object obj) { if (obj is API.Sticker stickerModel) { - return stickerModel.Name == this.Name && - stickerModel.Desription == this.Description && - stickerModel.FormatType == this.Format && - stickerModel.Id == this.Id && - stickerModel.PackId == this.PackId && - stickerModel.Type == this.Type && - stickerModel.SortValue == this.SortOrder && - stickerModel.Available == this.Available && - (!stickerModel.Tags.IsSpecified || stickerModel.Tags.Value == string.Join(", ", this.Tags)); + return stickerModel.Name == Name && + stickerModel.Desription == Description && + stickerModel.FormatType == Format && + stickerModel.Id == Id && + stickerModel.PackId == PackId && + stickerModel.Type == Type && + stickerModel.SortValue == SortOrder && + stickerModel.Available == Available && + (!stickerModel.Tags.IsSpecified || stickerModel.Tags.Value == string.Join(", ", Tags)); } else return base.Equals(obj); diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs index da8199c4ca..db1124a321 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -49,8 +49,8 @@ internal static SocketUnknownSticker Create(DiscordSocketClient client, Model mo internal void Update(Model model) { - this.Name = model.Name; - this.Format = model.FormatType; + Name = model.Name; + Format = model.FormatType; } /// @@ -60,7 +60,7 @@ internal void Update(Model model) /// The sticker representing this unknown stickers Id, if none is found then . /// public Task ResolveAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) - => Discord.GetStickerAsync(this.Id, mode, options); + => Discord.GetStickerAsync(Id, mode, options); private new string DebuggerDisplay => $"{Name} ({Id})"; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index f892216d9e..2cec3d6123 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -136,9 +136,9 @@ public DateTimeOffset? RequestToSpeakTimestamp internal SocketThreadUser(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser member) : base(guild.Discord, member.Id) { - this.Thread = thread; - this.Guild = guild; - this.GuildUser = member; + Thread = thread; + Guild = guild; + GuildUser = member; } internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, Model model, SocketGuildUser member) @@ -150,16 +150,16 @@ internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel t internal void Update(Model model) { - this.ThreadJoinedAt = model.JoinTimestamp; + ThreadJoinedAt = model.JoinTimestamp; if (model.Presence.IsSpecified) { - this.GuildUser.Update(Discord.State, model.Presence.Value, true); + GuildUser.Update(Discord.State, model.Presence.Value, true); } if (model.Member.IsSpecified) { - this.GuildUser.Update(Discord.State, model.Member.Value); + GuildUser.Update(Discord.State, model.Member.Value); } } @@ -198,16 +198,16 @@ internal void Update(Model model) public Task RemoveRolesAsync(IEnumerable roles, RequestOptions options = null) => GuildUser.RemoveRolesAsync(roles, options); /// - GuildPermissions IGuildUser.GuildPermissions => this.GuildUser.GuildPermissions; + GuildPermissions IGuildUser.GuildPermissions => GuildUser.GuildPermissions; /// - IGuild IGuildUser.Guild => this.Guild; + IGuild IGuildUser.Guild => Guild; /// - ulong IGuildUser.GuildId => this.Guild.Id; + ulong IGuildUser.GuildId => Guild.Id; /// - IReadOnlyCollection IGuildUser.RoleIds => this.GuildUser.Roles.Select(x => x.Id).ToImmutableArray(); + IReadOnlyCollection IGuildUser.RoleIds => GuildUser.Roles.Select(x => x.Id).ToImmutableArray(); internal override SocketGlobalUser GlobalUser => GuildUser.GlobalUser; diff --git a/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticResult.cs b/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticResult.cs index 5ae6f528e8..87d9154946 100644 --- a/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticResult.cs +++ b/test/Discord.Net.Analyzers.Tests/Helpers/DiagnosticResult.cs @@ -20,9 +20,9 @@ public DiagnosticResultLocation(string path, int line, int column) throw new ArgumentOutOfRangeException(nameof(column), "column must be >= -1"); } - this.Path = path; - this.Line = line; - this.Column = column; + Path = path; + Line = line; + Column = column; } public string Path { get; } @@ -41,16 +41,16 @@ public DiagnosticResultLocation[] Locations { get { - if (this.locations == null) + if (locations == null) { - this.locations = new DiagnosticResultLocation[] { }; + locations = new DiagnosticResultLocation[] { }; } - return this.locations; + return locations; } set { - this.locations = value; + locations = value; } } @@ -64,7 +64,7 @@ public string Path { get { - return this.Locations.Length > 0 ? this.Locations[0].Path : ""; + return Locations.Length > 0 ? Locations[0].Path : ""; } } @@ -72,7 +72,7 @@ public int Line { get { - return this.Locations.Length > 0 ? this.Locations[0].Line : -1; + return Locations.Length > 0 ? Locations[0].Line : -1; } } @@ -80,7 +80,7 @@ public int Column { get { - return this.Locations.Length > 0 ? this.Locations[0].Column : -1; + return Locations.Length > 0 ? Locations[0].Column : -1; } } } diff --git a/test/Discord.Net.Tests.Integration/ChannelsTests.cs b/test/Discord.Net.Tests.Integration/ChannelsTests.cs index 3bf60772f9..9bb30c4efc 100644 --- a/test/Discord.Net.Tests.Integration/ChannelsTests.cs +++ b/test/Discord.Net.Tests.Integration/ChannelsTests.cs @@ -19,7 +19,7 @@ public class ChannelsTests : IClassFixture public ChannelsTests(RestGuildFixture guildFixture, ITestOutputHelper output) { guild = guildFixture.Guild; - this.output = output; + output = output; output.WriteLine($"RestGuildFixture using guild: {guild.Id}"); // capture all console output guildFixture.Client.Log += LogAsync; diff --git a/test/Discord.Net.Tests.Integration/GuildTests.cs b/test/Discord.Net.Tests.Integration/GuildTests.cs index 40394a3a09..c309b0ed14 100644 --- a/test/Discord.Net.Tests.Integration/GuildTests.cs +++ b/test/Discord.Net.Tests.Integration/GuildTests.cs @@ -18,7 +18,7 @@ public GuildTests(RestGuildFixture guildFixture, ITestOutputHelper output) { client = guildFixture.Client; guild = guildFixture.Guild; - this.output = output; + output = output; output.WriteLine($"RestGuildFixture using guild: {guild.Id}"); guildFixture.Client.Log += LogAsync; } From a4c024aa13fd042d45520d1f54fd3563b77e04e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 14:51:33 +0200 Subject: [PATCH 289/494] Use 'switch' expression (#187) * Use 'switch' expression * Reverted it to the old switch case --- src/Discord.Net.Core/CDN.cs | 35 +++++++------------ .../Interactions/AutocompleteResult.cs | 20 ++++------- .../Permissions/ChannelPermissions.cs | 16 ++++----- .../API/Common/ActionRowComponent.cs | 13 +++---- src/Discord.Net.Rest/DiscordRestApiClient.cs | 35 +++++++------------ .../Entities/Channels/RestChannel.cs | 32 ++++++----------- .../Entities/Channels/RestGuildChannel.cs | 25 +++++-------- .../Interactions/InteractionHelper.cs | 2 +- .../Net/Converters/EmbedTypeConverter.cs | 33 +++++++---------- .../Net/Converters/UserStatusConverter.cs | 24 +++++-------- src/Discord.Net.Rest/Net/DefaultRestClient.cs | 16 ++++----- .../Entities/Channels/SocketChannel.cs | 13 +++---- .../Entities/Channels/SocketChannelHelper.cs | 12 +++---- .../Entities/Channels/SocketGuildChannel.cs | 25 +++++-------- .../Entities/Interaction/SocketInteraction.cs | 15 ++++---- .../Entities/Invites/SocketInvite.cs | 18 +++++----- 16 files changed, 128 insertions(+), 206 deletions(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index b48bef3798..78fba574f1 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -190,37 +190,26 @@ public static string GetStickerUrl(ulong stickerId, StickerFormatType format = S private static string FormatToExtension(StickerFormatType format) { - switch (format) + return format switch { - case StickerFormatType.None: - case StickerFormatType.Png: - case StickerFormatType.Apng: // In the case of the Sticker endpoint, the sticker will be available as PNG if its format_type is PNG or APNG, and as Lottie if its format_type is LOTTIE. - return "png"; - case StickerFormatType.Lottie: - return "lottie"; - default: - throw new ArgumentException(nameof(format)); - - } + StickerFormatType.None or StickerFormatType.Png or StickerFormatType.Apng => "png", // In the case of the Sticker endpoint, the sticker will be available as PNG if its format_type is PNG or APNG, and as Lottie if its format_type is LOTTIE. + StickerFormatType.Lottie => "lottie", + _ => throw new ArgumentException(nameof(format)), + }; } private static string FormatToExtension(ImageFormat format, string imageId) { if (format == ImageFormat.Auto) format = imageId.StartsWith("a_") ? ImageFormat.Gif : ImageFormat.Png; - switch (format) + return format switch { - case ImageFormat.Gif: - return "gif"; - case ImageFormat.Jpeg: - return "jpeg"; - case ImageFormat.Png: - return "png"; - case ImageFormat.WebP: - return "webp"; - default: - throw new ArgumentException(nameof(format)); - } + ImageFormat.Gif => "gif", + ImageFormat.Jpeg => "jpeg", + ImageFormat.Png => "png", + ImageFormat.WebP => "webp", + _ => throw new ArgumentException(nameof(format)), + }; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs index 2536c3c519..c152c1f27b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs @@ -53,21 +53,13 @@ public object Value if (value == null) throw new ArgumentNullException("Value cannot be null"); - switch (value) + _value = value switch { - case string str: - _value = str; - break; - case int integer: - _value = integer; - break; - case double number: - _value = number; - break; - - default: - throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"); - } + string str => str, + int integer => integer, + double number => number, + _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"), + }; } } diff --git a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs index d774cc51d8..287e697834 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs @@ -24,15 +24,15 @@ public struct ChannelPermissions /// Unknown channel type. public static ChannelPermissions All(IChannel channel) { - switch (channel) + return channel switch { - case ITextChannel _: return Text; - case IVoiceChannel _: return Voice; - case ICategoryChannel _: return Category; - case IDMChannel _: return DM; - case IGroupChannel _: return Group; - default: throw new ArgumentException(message: "Unknown channel type.", paramName: nameof(channel)); - } + ITextChannel _ => Text, + IVoiceChannel _ => Voice, + ICategoryChannel _ => Category, + IDMChannel _ => DM, + IGroupChannel _ => Group, + _ => throw new ArgumentException(message: "Unknown channel type.", paramName: nameof(channel)), + }; } /// Gets a packed value representing all the permissions in this . diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs index 417fb1b984..92778849cf 100644 --- a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -22,15 +22,12 @@ internal ActionRowComponent(Discord.ActionRowComponent c) Type = c.Type; Components = c.Components?.Select(x => { - switch (x.Type) + return x.Type switch { - case ComponentType.Button: - return new ButtonComponent(x as Discord.ButtonComponent); - case ComponentType.SelectMenu: - return new SelectMenuComponent(x as Discord.SelectMenuComponent); - default: return null; - - } + ComponentType.Button => new ButtonComponent(x as Discord.ButtonComponent), + ComponentType.SelectMenu => new SelectMenuComponent(x as Discord.SelectMenuComponent), + _ => null, + }; }).ToArray(); } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index dfe003f531..461981e28c 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -715,22 +715,12 @@ public async Task> GetChannelMessagesAsync(ulong ch int limit = args.Limit.GetValueOrDefault(DiscordConfig.MaxMessagesPerBatch); ulong? relativeId = args.RelativeMessageId.IsSpecified ? args.RelativeMessageId.Value : (ulong?)null; - string relativeDir; - - switch (args.RelativeDirection.GetValueOrDefault(Direction.Before)) + var relativeDir = args.RelativeDirection.GetValueOrDefault(Direction.Before) switch { - case Direction.Before: - default: - relativeDir = "before"; - break; - case Direction.After: - relativeDir = "after"; - break; - case Direction.Around: - relativeDir = "around"; - break; - } - + Direction.After => "after", + Direction.Around => "around", + _ => "before", + }; var ids = new BucketIds(channelId: channelId); Expression> endpoint; if (relativeId != null) @@ -2181,15 +2171,14 @@ internal Dictionary ToMajorParametersDictionary() internal static int? GetIndex(string name) { - switch (name) + return name switch { - case "httpMethod": return 0; - case "guildId": return 1; - case "channelId": return 2; - case "webhookId": return 3; - default: - return null; - } + "httpMethod" => 0, + "guildId" => 1, + "channelId" => 2, + "webhookId" => 3, + _ => null, + }; } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs index b653a2db43..ea79881554 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs @@ -22,33 +22,23 @@ internal RestChannel(BaseDiscordClient discord, ulong id) /// Unexpected channel type. internal static RestChannel Create(BaseDiscordClient discord, Model model) { - switch (model.Type) + return model.Type switch { - case ChannelType.News: - case ChannelType.Text: - case ChannelType.Voice: - return RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model); - case ChannelType.DM: - case ChannelType.Group: - return CreatePrivate(discord, model) as RestChannel; - case ChannelType.Category: - return RestCategoryChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model); - default: - return new RestChannel(discord, model.Id); - } + ChannelType.News or ChannelType.Text or ChannelType.Voice => RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), + ChannelType.DM or ChannelType.Group => CreatePrivate(discord, model) as RestChannel, + ChannelType.Category => RestCategoryChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), + _ => new RestChannel(discord, model.Id), + }; } /// Unexpected channel type. internal static IRestPrivateChannel CreatePrivate(BaseDiscordClient discord, Model model) { - switch (model.Type) + return model.Type switch { - case ChannelType.DM: - return RestDMChannel.Create(discord, model); - case ChannelType.Group: - return RestGroupChannel.Create(discord, model); - default: - throw new InvalidOperationException($"Unexpected channel type: {model.Type}"); - } + ChannelType.DM => RestDMChannel.Create(discord, model), + ChannelType.Group => RestGroupChannel.Create(discord, model), + _ => throw new InvalidOperationException($"Unexpected channel type: {model.Type}"), + }; } internal virtual void Update(Model model) { } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs index 549a4ba31a..70267bf738 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs @@ -33,23 +33,16 @@ internal RestGuildChannel(BaseDiscordClient discord, IGuild guild, ulong id) } internal static RestGuildChannel Create(BaseDiscordClient discord, IGuild guild, Model model) { - switch (model.Type) + return model.Type switch { - case ChannelType.News: - return RestNewsChannel.Create(discord, guild, model); - case ChannelType.Text: - return RestTextChannel.Create(discord, guild, model); - case ChannelType.Voice: - return RestVoiceChannel.Create(discord, guild, model); - case ChannelType.Stage: - return RestStageChannel.Create(discord, guild, model); - case ChannelType.Category: - return RestCategoryChannel.Create(discord, guild, model); - case ChannelType.PublicThread or ChannelType.PrivateThread or ChannelType.NewsThread: - return RestThreadChannel.Create(discord, guild, model); - default: - return new RestGuildChannel(discord, guild, model.Id); - } + ChannelType.News => RestNewsChannel.Create(discord, guild, model), + ChannelType.Text => RestTextChannel.Create(discord, guild, model), + ChannelType.Voice => RestVoiceChannel.Create(discord, guild, model), + ChannelType.Stage => RestStageChannel.Create(discord, guild, model), + ChannelType.Category => RestCategoryChannel.Create(discord, guild, model), + ChannelType.PublicThread or ChannelType.PrivateThread or ChannelType.NewsThread => RestThreadChannel.Create(discord, guild, model), + _ => new RestGuildChannel(discord, guild, model.Id), + }; } internal override void Update(Model model) { diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 52449a1217..8f9163692c 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -43,7 +43,7 @@ public static async Task SendFollowupAsync(BaseDiscordClien RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); return entity; } -#endregion + #endregion #region Global commands public static async Task GetGlobalCommandAsync(BaseDiscordClient client, ulong id, diff --git a/src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs b/src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs index 1e03fb6983..cacd2e2e13 100644 --- a/src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs @@ -13,28 +13,19 @@ internal class EmbedTypeConverter : JsonConverter public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - switch ((string)reader.Value) + return (string)reader.Value switch { - case "rich": - return EmbedType.Rich; - case "link": - return EmbedType.Link; - case "video": - return EmbedType.Video; - case "image": - return EmbedType.Image; - case "gifv": - return EmbedType.Gifv; - case "article": - return EmbedType.Article; - case "tweet": - return EmbedType.Tweet; - case "html": - return EmbedType.Html; - case "application_news": // TODO 2.2 EmbedType.News - default: - return EmbedType.Unknown; - } + "rich" => EmbedType.Rich, + "link" => EmbedType.Link, + "video" => EmbedType.Video, + "image" => EmbedType.Image, + "gifv" => EmbedType.Gifv, + "article" => EmbedType.Article, + "tweet" => EmbedType.Tweet, + "html" => EmbedType.Html, + // TODO 2.2 EmbedType.News + _ => EmbedType.Unknown, + }; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) diff --git a/src/Discord.Net.Rest/Net/Converters/UserStatusConverter.cs b/src/Discord.Net.Rest/Net/Converters/UserStatusConverter.cs index c0a287c161..8a13e79a51 100644 --- a/src/Discord.Net.Rest/Net/Converters/UserStatusConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/UserStatusConverter.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; using System; namespace Discord.Net.Converters @@ -13,21 +13,15 @@ internal class UserStatusConverter : JsonConverter public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - switch ((string)reader.Value) + return (string)reader.Value switch { - case "online": - return UserStatus.Online; - case "idle": - return UserStatus.Idle; - case "dnd": - return UserStatus.DoNotDisturb; - case "invisible": - return UserStatus.Invisible; //Should never happen - case "offline": - return UserStatus.Offline; - default: - throw new JsonSerializationException("Unknown user status"); - } + "online" => UserStatus.Online, + "idle" => UserStatus.Idle, + "dnd" => UserStatus.DoNotDisturb, + "invisible" => UserStatus.Invisible,//Should never happen + "offline" => UserStatus.Offline, + _ => throw new JsonSerializationException("Unknown user status"), + }; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) diff --git a/src/Discord.Net.Rest/Net/DefaultRestClient.cs b/src/Discord.Net.Rest/Net/DefaultRestClient.cs index 62ebd6d785..1db7436096 100644 --- a/src/Discord.Net.Rest/Net/DefaultRestClient.cs +++ b/src/Discord.Net.Rest/Net/DefaultRestClient.cs @@ -157,15 +157,15 @@ private async Task SendInternalAsync(HttpRequestMessage request, C private static readonly HttpMethod Patch = new HttpMethod("PATCH"); private HttpMethod GetMethod(string method) { - switch (method) + return method switch { - case "DELETE": return HttpMethod.Delete; - case "GET": return HttpMethod.Get; - case "PATCH": return Patch; - case "POST": return HttpMethod.Post; - case "PUT": return HttpMethod.Put; - default: throw new ArgumentOutOfRangeException(nameof(method), $"Unknown HttpMethod: {method}"); - } + "DELETE" => HttpMethod.Delete, + "GET" => HttpMethod.Get, + "PATCH" => Patch, + "POST" => HttpMethod.Post, + "PUT" => HttpMethod.Put, + _ => throw new ArgumentOutOfRangeException(nameof(method), $"Unknown HttpMethod: {method}"), + }; } } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs index 80c43a0c32..758ee9271d 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs @@ -31,15 +31,12 @@ internal SocketChannel(DiscordSocketClient discord, ulong id) /// Unexpected channel type is created. internal static ISocketPrivateChannel CreatePrivate(DiscordSocketClient discord, ClientState state, Model model) { - switch (model.Type) + return model.Type switch { - case ChannelType.DM: - return SocketDMChannel.Create(discord, state, model); - case ChannelType.Group: - return SocketGroupChannel.Create(discord, state, model); - default: - throw new InvalidOperationException($"Unexpected channel type: {model.Type}"); - } + ChannelType.DM => SocketDMChannel.Create(discord, state, model), + ChannelType.Group => SocketGroupChannel.Create(discord, state, model), + _ => throw new InvalidOperationException($"Unexpected channel type: {model.Type}"), + }; } internal abstract void Update(ClientState state, Model model); #endregion diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs index 4a1dc45c71..ccbf9b2b6d 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs @@ -79,13 +79,13 @@ public static void AddMessage(ISocketMessageChannel channel, DiscordSocketClient public static SocketMessage RemoveMessage(ISocketMessageChannel channel, DiscordSocketClient discord, ulong id) { - switch (channel) + return channel switch { - case SocketDMChannel dmChannel: return dmChannel.RemoveMessage(id); - case SocketGroupChannel groupChannel: return groupChannel.RemoveMessage(id); - case SocketTextChannel textChannel: return textChannel.RemoveMessage(id); - default: throw new NotSupportedException($"Unexpected {nameof(ISocketMessageChannel)} type."); - } + SocketDMChannel dmChannel => dmChannel.RemoveMessage(id), + SocketGroupChannel groupChannel => groupChannel.RemoveMessage(id), + SocketTextChannel textChannel => textChannel.RemoveMessage(id), + _ => throw new NotSupportedException($"Unexpected {nameof(ISocketMessageChannel)} type."), + }; } } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs index a504a2a94b..d38a8975bd 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs @@ -47,23 +47,16 @@ internal SocketGuildChannel(DiscordSocketClient discord, ulong id, SocketGuild g } internal static SocketGuildChannel Create(SocketGuild guild, ClientState state, Model model) { - switch (model.Type) + return model.Type switch { - case ChannelType.News: - return SocketNewsChannel.Create(guild, state, model); - case ChannelType.Text: - return SocketTextChannel.Create(guild, state, model); - case ChannelType.Voice: - return SocketVoiceChannel.Create(guild, state, model); - case ChannelType.Category: - return SocketCategoryChannel.Create(guild, state, model); - case ChannelType.PrivateThread or ChannelType.PublicThread or ChannelType.NewsThread: - return SocketThreadChannel.Create(guild, state, model); - case ChannelType.Stage: - return SocketStageChannel.Create(guild, state, model); - default: - return new SocketGuildChannel(guild.Discord, model.Id, guild); - } + ChannelType.News => SocketNewsChannel.Create(guild, state, model), + ChannelType.Text => SocketTextChannel.Create(guild, state, model), + ChannelType.Voice => SocketVoiceChannel.Create(guild, state, model), + ChannelType.Category => SocketCategoryChannel.Create(guild, state, model), + ChannelType.PrivateThread or ChannelType.PublicThread or ChannelType.NewsThread => SocketThreadChannel.Create(guild, state, model), + ChannelType.Stage => SocketStageChannel.Create(guild, state, model), + _ => new SocketGuildChannel(guild.Discord, model.Id, guild), + }; } /// internal override void Update(ClientState state, Model model) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 6a721907ac..c8e07bf97a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -72,16 +72,13 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model if (dataModel == null) return null; - switch (dataModel.Type) + return dataModel.Type switch { - case ApplicationCommandType.Slash: - return SocketSlashCommand.Create(client, model, channel); - case ApplicationCommandType.Message: - return SocketMessageCommand.Create(client, model, channel); - case ApplicationCommandType.User: - return SocketUserCommand.Create(client, model, channel); - default: return null; - } + ApplicationCommandType.Slash => SocketSlashCommand.Create(client, model, channel), + ApplicationCommandType.Message => SocketMessageCommand.Create(client, model, channel), + ApplicationCommandType.User => SocketUserCommand.Create(client, model, channel), + _ => null, + }; } else if (model.Type == InteractionType.MessageComponent) return SocketMessageComponent.Create(client, model, channel); diff --git a/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs index acc9c4978b..abc418d866 100644 --- a/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs +++ b/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs @@ -31,16 +31,16 @@ ChannelType IInvite.ChannelType { get { - switch (Channel) + return Channel switch { - case IVoiceChannel voiceChannel: return ChannelType.Voice; - case ICategoryChannel categoryChannel: return ChannelType.Category; - case IDMChannel dmChannel: return ChannelType.DM; - case IGroupChannel groupChannel: return ChannelType.Group; - case INewsChannel newsChannel: return ChannelType.News; - case ITextChannel textChannel: return ChannelType.Text; - default: throw new InvalidOperationException("Invalid channel type."); - } + IVoiceChannel voiceChannel => ChannelType.Voice, + ICategoryChannel categoryChannel => ChannelType.Category, + IDMChannel dmChannel => ChannelType.DM, + IGroupChannel groupChannel => ChannelType.Group, + INewsChannel newsChannel => ChannelType.News, + ITextChannel textChannel => ChannelType.Text, + _ => throw new InvalidOperationException("Invalid channel type."), + }; } } /// From 788d654215131495579da22919ea883ee1c1e12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Fri, 24 Sep 2021 15:04:26 +0200 Subject: [PATCH 290/494] Fixed-compiler-error (#194) --- test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs index 319d3fb110..4d0cc8a558 100644 --- a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs +++ b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs @@ -290,8 +290,8 @@ public void WithFooter_FooterBuilder() { Footer = footer }; - Assert.Equal(url, e.Footer.IconUrl); - Assert.Equal(name, e.Footer.Text); + Assert.Equal(Url, e.Footer.IconUrl); + Assert.Equal(Name, e.Footer.Text); } /// From 6457add1b176651ed2c00f81700404003f0b14dc Mon Sep 17 00:00:00 2001 From: drobbins329 Date: Sat, 25 Sep 2021 12:26:46 -0400 Subject: [PATCH 291/494] 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 --- src/Discord.Net.Core/Discord.Net.Core.xml | 178 +++++++++++++----- .../Entities/Permissions/ChannelPermission.cs | 32 +++- .../Permissions/ChannelPermissions.cs | 143 ++++++++++---- .../Entities/Permissions/GuildPermission.cs | 9 +- .../Entities/Permissions/GuildPermissions.cs | 32 +--- .../Permissions/OverwritePermissions.cs | 72 ++++++- src/Discord.Net.Rest/Discord.Net.Rest.xml | 1 - .../Discord.Net.WebSocket.xml | 4 - .../ChannelPermissionsTests.cs | 4 + test/Discord.Net.Tests.Unit/ColorTests.cs | 2 +- .../GuildPermissionsTests.cs | 4 +- 11 files changed, 351 insertions(+), 130 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index d72a1cac24..b759c8e133 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -8267,7 +8267,7 @@ - Gets a value that indicates whether the current user has reacted to + Gets a value that indicates whether the current user has reacted to this. true if the user has reacted to the message; otherwise false. @@ -8604,7 +8604,12 @@ Allows members to use slash commands in text channels. - + + + Allows members to use slash commands in text channels. + + + Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.) @@ -8624,106 +8629,158 @@ Allows for creating and participating in private threads + + + Allows for creating public threads. + + + + + Allows for creating private threads. + + + + + Allows the usage of custom stickers from other servers. + + + + + Allows for sending messages in threads. + + + + + Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. + + - Gets a blank that grants no permissions. - A structure that does not contain any set permissions. + Gets a blank that grants no permissions. + A structure that does not contain any set permissions. - Gets a that grants all permissions for text channels. + Gets a that grants all permissions for text channels. - Gets a that grants all permissions for voice channels. + Gets a that grants all permissions for voice channels. + + + Gets a that grants all permissions for stage channels. - Gets a that grants all permissions for category channels. + Gets a that grants all permissions for category channels. - Gets a that grants all permissions for direct message channels. + Gets a that grants all permissions for direct message channels. - Gets a that grants all permissions for group channels. + Gets a that grants all permissions for group channels. - Gets a that grants all permissions for a given channel type. + Gets a that grants all permissions for a given channel type. Unknown channel type. - Gets a packed value representing all the permissions in this . + Gets a packed value representing all the permissions in this . - If true, a user may create invites. + If true, a user may create invites. - If true, a user may create, delete and modify this channel. + If true, a user may create, delete and modify this channel. - If true, a user may add reactions. + If true, a user may add reactions. - If true, a user may view channels. + If true, a user may view channels. - If true, a user may send messages. + If true, a user may send messages. - If true, a user may send text-to-speech messages. + If true, a user may send text-to-speech messages. - If true, a user may delete messages. + If true, a user may delete messages. - If true, Discord will auto-embed links sent by this user. + If true, Discord will auto-embed links sent by this user. - If true, a user may send files. + If true, a user may send files. - If true, a user may read previous messages. + If true, a user may read previous messages. - If true, a user may mention @everyone. + If true, a user may mention @everyone. - If true, a user may use custom emoji from other guilds. + If true, a user may use custom emoji from other guilds. - If true, a user may connect to a voice channel. + If true, a user may connect to a voice channel. - If true, a user may speak in a voice channel. + If true, a user may speak in a voice channel. - If true, a user may mute users. + If true, a user may mute users. - If true, a user may deafen users. + If true, a user may deafen users. - If true, a user may move other users between voice channels. + If true, a user may move other users between voice channels. - If true, a user may use voice-activity-detection rather than push-to-talk. + If true, a user may use voice-activity-detection rather than push-to-talk. - If true, a user may use priority speaker in a voice channel. + If true, a user may use priority speaker in a voice channel. - If true, a user may stream video in a voice channel. + If true, a user may stream video in a voice channel. - If true, a user may adjust role permissions. This also implictly grants all other permissions. + If true, a user may adjust role permissions. This also implictly grants all other permissions. - If true, a user may edit the webhooks for this channel. + If true, a user may edit the webhooks for this channel. + + + If true, a user may use application commands in this guild. + + + If true, a user may request to speak in stage channels. + + + If true, a user may manage threads in this guild. + + + If true, a user may create public threads in this guild. + + + If true, a user may create private threads in this guild. + + + If true, a user may use external stickers in this guild. + + + If true, a user may send messages in threads in this guild. + + + If true, a user launch application activites in voice channels in this guild. - Creates a new with the provided packed value. + Creates a new with the provided packed value. - - Creates a new with the provided permissions. + + Creates a new with the provided permissions. - - Creates a new from this one, changing the provided non-null permissions. + + Creates a new from this one, changing the provided non-null permissions. @@ -8950,6 +9007,11 @@ Allows members to use slash commands in text channels. + + + Allows members to use application commands like slash commands and context menus in text channels. + + Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.). @@ -9104,7 +9166,7 @@ If true, a user may edit the emojis and stickers for this guild. - + If true, a user may use slash commands in this guild. @@ -9119,12 +9181,6 @@ If true, a user may create private threads in this guild. - - If true, a user may use public threads in this guild. - - - If true, a user may use private threads in this guild. - If true, a user may use external stickers in this guild. @@ -9140,10 +9196,10 @@ Creates a new with the provided packed value after converting to ulong. - + Creates a new structure with the provided permissions. - + Creates a new from this one, changing the provided non-null permissions. @@ -9284,18 +9340,42 @@ If True, a user may edit the webhooks for this channel. + + If true, a user may use slash commands in this guild. + + + If true, a user may request to speak in stage channels. + + + If true, a user may manage threads in this guild. + + + If true, a user may create public threads in this guild. + + + If true, a user may create private threads in this guild. + + + If true, a user may use external stickers in this guild. + + + If true, a user may send messages in threads in this guild. + + + If true, a user launch application activites in voice channels in this guild. + Creates a new OverwritePermissions with the provided allow and deny packed values. Creates a new OverwritePermissions with the provided allow and deny packed values after converting to ulong. - + Initializes a new struct with the provided permissions. - + Initializes a new from the current one, changing the provided non-null permissions. diff --git a/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs b/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs index 99e74bd48f..d76a579d9a 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs @@ -113,12 +113,18 @@ public enum ChannelPermission : ulong /// /// Allows members to use slash commands in text channels. /// + [Obsolete("UseSlashCommands has been replaced by UseApplicationCommands", true)] UseSlashCommands = 0x00_80_00_00_00, + /// + /// Allows members to use slash commands in text channels. + /// + UseApplicationCommands = 0x00_80_00_00_00, + /// /// Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.) /// - RequesToSpeak = 0x01_00_00_00_00, + RequestToSpeak = 0x01_00_00_00_00, /// /// Allows for deleting and archiving threads, and viewing all private threads @@ -128,12 +134,34 @@ public enum ChannelPermission : ulong /// /// Allows for creating and participating in threads /// - UsePublicThreads = 0x08_00_00_00_00, + [Obsolete("UsePublicThreads has been replaced by CreatePublicThreads and SendMessagesInThreads", true)] + UsePublicThreads = 0x08_00_00_00_00, /// /// Allows for creating and participating in private threads /// + [Obsolete("UsePrivateThreads has been replaced by CreatePrivateThreads and SendMessagesInThreads", true)] UsePrivateThreads = 0x10_00_00_00_00, + /// + /// Allows for creating public threads. + /// + CreatePublicThreads = 0x08_00_00_00_00, + /// + /// Allows for creating private threads. + /// + CreatePrivateThreads = 0x10_00_00_00_00, + /// + /// Allows the usage of custom stickers from other servers. + /// + UseExternalStickers = 0x20_00_00_00_00, + /// + /// Allows for sending messages in threads. + /// + SendMessagesInThreads = 0x40_00_00_00_00, + /// + /// Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. + /// + StartEmbeddedActivities = 0x80_00_00_00_00 } } diff --git a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs index 287e697834..11130731e7 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs @@ -7,26 +7,29 @@ namespace Discord [DebuggerDisplay("{DebuggerDisplay,nq}")] public struct ChannelPermissions { - /// Gets a blank that grants no permissions. - /// A structure that does not contain any set permissions. + /// Gets a blank that grants no permissions. + /// A structure that does not contain any set permissions. public static readonly ChannelPermissions None = new ChannelPermissions(); - /// Gets a that grants all permissions for text channels. - public static readonly ChannelPermissions Text = new ChannelPermissions(0b01100_0000000_1111111110001_010001); - /// Gets a that grants all permissions for voice channels. - public static readonly ChannelPermissions Voice = new ChannelPermissions(0b00100_1111110_0000000011100_010001); - /// Gets a that grants all permissions for category channels. + /// Gets a that grants all permissions for text channels. + public static readonly ChannelPermissions Text = new ChannelPermissions(0b0_11111_0101100_0000000_1111111110001_010001); + /// Gets a that grants all permissions for voice channels. + public static readonly ChannelPermissions Voice = new ChannelPermissions(0b1_00000_0000100_1111110_0000000011100_010001); + /// Gets a that grants all permissions for stage channels. + public static readonly ChannelPermissions Stage = new ChannelPermissions(0b0_00000_1000100_0111010_0000000010000_010001); + /// Gets a that grants all permissions for category channels. public static readonly ChannelPermissions Category = new ChannelPermissions(0b01100_1111110_1111111110001_010001); - /// Gets a that grants all permissions for direct message channels. + /// Gets a that grants all permissions for direct message channels. public static readonly ChannelPermissions DM = new ChannelPermissions(0b00000_1000110_1011100110001_000000); - /// Gets a that grants all permissions for group channels. + /// Gets a that grants all permissions for group channels. public static readonly ChannelPermissions Group = new ChannelPermissions(0b00000_1000110_0001101100000_000000); - /// Gets a that grants all permissions for a given channel type. + /// Gets a that grants all permissions for a given channel type. /// Unknown channel type. public static ChannelPermissions All(IChannel channel) { return channel switch { ITextChannel _ => Text, + IStageChannel _ => Stage, IVoiceChannel _ => Voice, ICategoryChannel _ => Category, IDMChannel _ => DM, @@ -35,59 +38,75 @@ public static ChannelPermissions All(IChannel channel) }; } - /// Gets a packed value representing all the permissions in this . + /// Gets a packed value representing all the permissions in this . public ulong RawValue { get; } - /// If true, a user may create invites. + /// If true, a user may create invites. public bool CreateInstantInvite => Permissions.GetValue(RawValue, ChannelPermission.CreateInstantInvite); - /// If true, a user may create, delete and modify this channel. + /// If true, a user may create, delete and modify this channel. public bool ManageChannel => Permissions.GetValue(RawValue, ChannelPermission.ManageChannels); - /// If true, a user may add reactions. + /// If true, a user may add reactions. public bool AddReactions => Permissions.GetValue(RawValue, ChannelPermission.AddReactions); - /// If true, a user may view channels. + /// If true, a user may view channels. public bool ViewChannel => Permissions.GetValue(RawValue, ChannelPermission.ViewChannel); - /// If true, a user may send messages. + /// If true, a user may send messages. public bool SendMessages => Permissions.GetValue(RawValue, ChannelPermission.SendMessages); - /// If true, a user may send text-to-speech messages. + /// If true, a user may send text-to-speech messages. public bool SendTTSMessages => Permissions.GetValue(RawValue, ChannelPermission.SendTTSMessages); - /// If true, a user may delete messages. + /// If true, a user may delete messages. public bool ManageMessages => Permissions.GetValue(RawValue, ChannelPermission.ManageMessages); - /// If true, Discord will auto-embed links sent by this user. + /// If true, Discord will auto-embed links sent by this user. public bool EmbedLinks => Permissions.GetValue(RawValue, ChannelPermission.EmbedLinks); - /// If true, a user may send files. + /// If true, a user may send files. public bool AttachFiles => Permissions.GetValue(RawValue, ChannelPermission.AttachFiles); - /// If true, a user may read previous messages. + /// If true, a user may read previous messages. public bool ReadMessageHistory => Permissions.GetValue(RawValue, ChannelPermission.ReadMessageHistory); - /// If true, a user may mention @everyone. + /// If true, a user may mention @everyone. public bool MentionEveryone => Permissions.GetValue(RawValue, ChannelPermission.MentionEveryone); - /// If true, a user may use custom emoji from other guilds. + /// If true, a user may use custom emoji from other guilds. public bool UseExternalEmojis => Permissions.GetValue(RawValue, ChannelPermission.UseExternalEmojis); - /// If true, a user may connect to a voice channel. + /// If true, a user may connect to a voice channel. public bool Connect => Permissions.GetValue(RawValue, ChannelPermission.Connect); - /// If true, a user may speak in a voice channel. + /// If true, a user may speak in a voice channel. public bool Speak => Permissions.GetValue(RawValue, ChannelPermission.Speak); - /// If true, a user may mute users. + /// If true, a user may mute users. public bool MuteMembers => Permissions.GetValue(RawValue, ChannelPermission.MuteMembers); - /// If true, a user may deafen users. + /// If true, a user may deafen users. public bool DeafenMembers => Permissions.GetValue(RawValue, ChannelPermission.DeafenMembers); - /// If true, a user may move other users between voice channels. + /// If true, a user may move other users between voice channels. public bool MoveMembers => Permissions.GetValue(RawValue, ChannelPermission.MoveMembers); - /// If true, a user may use voice-activity-detection rather than push-to-talk. + /// If true, a user may use voice-activity-detection rather than push-to-talk. public bool UseVAD => Permissions.GetValue(RawValue, ChannelPermission.UseVAD); - /// If true, a user may use priority speaker in a voice channel. + /// If true, a user may use priority speaker in a voice channel. public bool PrioritySpeaker => Permissions.GetValue(RawValue, ChannelPermission.PrioritySpeaker); - /// If true, a user may stream video in a voice channel. + /// If true, a user may stream video in a voice channel. public bool Stream => Permissions.GetValue(RawValue, ChannelPermission.Stream); - /// If true, a user may adjust role permissions. This also implictly grants all other permissions. + /// If true, a user may adjust role permissions. This also implictly grants all other permissions. public bool ManageRoles => Permissions.GetValue(RawValue, ChannelPermission.ManageRoles); - /// If true, a user may edit the webhooks for this channel. + /// If true, a user may edit the webhooks for this channel. public bool ManageWebhooks => Permissions.GetValue(RawValue, ChannelPermission.ManageWebhooks); + /// If true, a user may use application commands in this guild. + public bool UseApplicationCommands => Permissions.GetValue(RawValue, ChannelPermission.UseApplicationCommands); + /// If true, a user may request to speak in stage channels. + public bool RequestToSpeak => Permissions.GetValue(RawValue, ChannelPermission.RequestToSpeak); + /// If true, a user may manage threads in this guild. + public bool ManageThreads => Permissions.GetValue(RawValue, ChannelPermission.ManageThreads); + /// If true, a user may create public threads in this guild. + public bool CreatePublicThreads => Permissions.GetValue(RawValue, ChannelPermission.CreatePublicThreads); + /// If true, a user may create private threads in this guild. + public bool CreatePrivateThreads => Permissions.GetValue(RawValue, ChannelPermission.CreatePrivateThreads); + /// If true, a user may use external stickers in this guild. + public bool UseExternalStickers => Permissions.GetValue(RawValue, ChannelPermission.UseExternalStickers); + /// If true, a user may send messages in threads in this guild. + public bool SendMessagesInThreads => Permissions.GetValue(RawValue, ChannelPermission.SendMessagesInThreads); + /// If true, a user launch application activites in voice channels in this guild. + public bool StartEmbeddedActivities => Permissions.GetValue(RawValue, ChannelPermission.StartEmbeddedActivities); - /// Creates a new with the provided packed value. + /// Creates a new with the provided packed value. public ChannelPermissions(ulong rawValue) { RawValue = rawValue; } private ChannelPermissions(ulong initialValue, @@ -112,7 +131,15 @@ private ChannelPermissions(ulong initialValue, bool? prioritySpeaker = null, bool? stream = null, bool? manageRoles = null, - bool? manageWebhooks = null) + bool? manageWebhooks = null, + bool? useApplicationCommands = null, + bool? requestToSpeak = null, + bool? manageThreads = null, + bool? createPublicThreads = null, + bool? createPrivateThreads = null, + bool? useExternalStickers = null, + bool? sendMessagesInThreads = null, + bool? startEmbeddedActivities = null) { ulong value = initialValue; @@ -138,11 +165,19 @@ private ChannelPermissions(ulong initialValue, Permissions.SetValue(ref value, stream, ChannelPermission.Stream); Permissions.SetValue(ref value, manageRoles, ChannelPermission.ManageRoles); Permissions.SetValue(ref value, manageWebhooks, ChannelPermission.ManageWebhooks); + Permissions.SetValue(ref value, useApplicationCommands, ChannelPermission.UseApplicationCommands); + Permissions.SetValue(ref value, requestToSpeak, ChannelPermission.RequestToSpeak); + Permissions.SetValue(ref value, manageThreads, ChannelPermission.ManageThreads); + Permissions.SetValue(ref value, createPublicThreads, ChannelPermission.CreatePublicThreads); + Permissions.SetValue(ref value, createPrivateThreads, ChannelPermission.CreatePrivateThreads); + Permissions.SetValue(ref value, useExternalStickers, ChannelPermission.UseExternalStickers); + Permissions.SetValue(ref value, sendMessagesInThreads, ChannelPermission.SendMessagesInThreads); + Permissions.SetValue(ref value, startEmbeddedActivities, ChannelPermission.StartEmbeddedActivities); RawValue = value; } - /// Creates a new with the provided permissions. + /// Creates a new with the provided permissions. public ChannelPermissions( bool createInstantInvite = false, bool manageChannel = false, @@ -165,13 +200,23 @@ public ChannelPermissions( bool prioritySpeaker = false, bool stream = false, bool manageRoles = false, - bool manageWebhooks = false) + bool manageWebhooks = false, + bool useApplicationCommands = false, + bool requestToSpeak = false, + bool manageThreads = false, + bool createPublicThreads = false, + bool createPrivateThreads = false, + bool useExternalStickers = false, + bool sendMessagesInThreads = false, + bool startEmbeddedActivities = false) : this(0, createInstantInvite, manageChannel, addReactions, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, - speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, prioritySpeaker, stream, manageRoles, manageWebhooks) + speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, prioritySpeaker, stream, manageRoles, manageWebhooks, + useApplicationCommands, requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, useExternalStickers, sendMessagesInThreads, + startEmbeddedActivities) { } - /// Creates a new from this one, changing the provided non-null permissions. + /// Creates a new from this one, changing the provided non-null permissions. public ChannelPermissions Modify( bool? createInstantInvite = null, bool? manageChannel = null, @@ -194,7 +239,15 @@ public ChannelPermissions Modify( bool? prioritySpeaker = null, bool? stream = null, bool? manageRoles = null, - bool? manageWebhooks = null) + bool? manageWebhooks = null, + bool? useApplicationCommands = null, + bool? requestToSpeak = null, + bool? manageThreads = null, + bool? createPublicThreads = null, + bool? createPrivateThreads = null, + bool? useExternalStickers = null, + bool? sendMessagesInThreads = null, + bool? startEmbeddedActivities = null) => new ChannelPermissions(RawValue, createInstantInvite, manageChannel, @@ -217,7 +270,15 @@ public ChannelPermissions Modify( prioritySpeaker, stream, manageRoles, - manageWebhooks); + manageWebhooks, + useApplicationCommands, + requestToSpeak, + manageThreads, + createPublicThreads, + createPrivateThreads, + useExternalStickers, + sendMessagesInThreads, + startEmbeddedActivities); public bool Has(ChannelPermission permission) => Permissions.GetValue(RawValue, permission); diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs index 53b666b1a6..746981c6e3 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs @@ -178,8 +178,13 @@ public enum GuildPermission : ulong /// /// Allows members to use slash commands in text channels. /// + [Obsolete("UseSlashCommands has been replaced by UseApplicationCommands", true)] UseSlashCommands = 0x80_00_00_00, /// + /// Allows members to use application commands like slash commands and context menus in text channels. + /// + UseApplicationCommands = 0x80_00_00_00, + /// /// Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.). /// RequestToSpeak = 0x01_00_00_00_00, @@ -202,12 +207,12 @@ public enum GuildPermission : ulong /// /// Allows for creating public threads. /// - [Obsolete("UsePublicThreads has been replaced by CreatePublicThreads and SendMessagesInThreads")] + [Obsolete("UsePublicThreads has been replaced by CreatePublicThreads and SendMessagesInThreads", true)] UsePublicThreads = 0x08_00_00_00_00, /// /// Allows for creating private threads. /// - [Obsolete("UsePrivateThreads has been replaced by CreatePrivateThreads and SendMessagesInThreads")] + [Obsolete("UsePrivateThreads has been replaced by CreatePrivateThreads and SendMessagesInThreads", true)] UsePrivateThreads = 0x10_00_00_00_00, /// /// Allows the usage of custom stickers from other servers. diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index f909b63818..8924936a08 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -10,9 +10,9 @@ public struct GuildPermissions /// Gets a blank that grants no permissions. public static readonly GuildPermissions None = new GuildPermissions(); /// Gets a that grants all guild permissions for webhook users. - public static readonly GuildPermissions Webhook = new GuildPermissions(0b00000_0000000_0001101100000_000000); + public static readonly GuildPermissions Webhook = new GuildPermissions(0b0_00000_0000000_0000000_0001101100000_000000); /// Gets a that grants all guild permissions. - public static readonly GuildPermissions All = new GuildPermissions(0b1111111111_11111_1111111_1111111111111_11111); + public static readonly GuildPermissions All = new GuildPermissions(0b1_11111_1111111_1111111_1111111111111_111111); /// Gets a packed value representing all the permissions in this . public ulong RawValue { get; } @@ -84,7 +84,7 @@ public struct GuildPermissions /// If true, a user may edit the emojis and stickers for this guild. public bool ManageEmojisAndStickers => Permissions.GetValue(RawValue, GuildPermission.ManageEmojisAndStickers); /// If true, a user may use slash commands in this guild. - public bool UseSlashCommands => Permissions.GetValue(RawValue, GuildPermission.UseSlashCommands); + public bool UseApplicationCommands => Permissions.GetValue(RawValue, GuildPermission.UseApplicationCommands); /// If true, a user may request to speak in stage channels. public bool RequestToSpeak => Permissions.GetValue(RawValue, GuildPermission.RequestToSpeak); /// If true, a user may manage threads in this guild. @@ -93,10 +93,6 @@ public struct GuildPermissions public bool CreatePublicThreads => Permissions.GetValue(RawValue, GuildPermission.CreatePublicThreads); /// If true, a user may create private threads in this guild. public bool CreatePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.CreatePrivateThreads); - /// If true, a user may use public threads in this guild. - public bool UsePublicThreads => Permissions.GetValue(RawValue, GuildPermission.UsePublicThreads); - /// If true, a user may use private threads in this guild. - public bool UsePrivateThreads => Permissions.GetValue(RawValue, GuildPermission.UsePrivateThreads); /// If true, a user may use external stickers in this guild. public bool UseExternalStickers => Permissions.GetValue(RawValue, GuildPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. @@ -142,13 +138,11 @@ private GuildPermissions(ulong initialValue, bool? manageRoles = null, bool? manageWebhooks = null, bool? manageEmojisAndStickers = null, - bool? useSlashCommands = null, + bool? useApplicationCommands = null, bool? requestToSpeak = null, bool? manageThreads = null, bool? createPublicThreads = null, bool? createPrivateThreads = null, - bool? usePublicThreads = null, - bool? usePrivateThreads = null, bool? useExternalStickers = null, bool? sendMessagesInThreads = null, bool? startEmbeddedActivities = null) @@ -186,13 +180,11 @@ private GuildPermissions(ulong initialValue, Permissions.SetValue(ref value, manageRoles, GuildPermission.ManageRoles); Permissions.SetValue(ref value, manageWebhooks, GuildPermission.ManageWebhooks); Permissions.SetValue(ref value, manageEmojisAndStickers, GuildPermission.ManageEmojisAndStickers); - Permissions.SetValue(ref value, useSlashCommands, GuildPermission.UseSlashCommands); + Permissions.SetValue(ref value, useApplicationCommands, GuildPermission.UseApplicationCommands); Permissions.SetValue(ref value, requestToSpeak, GuildPermission.RequestToSpeak); Permissions.SetValue(ref value, manageThreads, GuildPermission.ManageThreads); Permissions.SetValue(ref value, createPublicThreads, GuildPermission.CreatePublicThreads); Permissions.SetValue(ref value, createPrivateThreads, GuildPermission.CreatePrivateThreads); - Permissions.SetValue(ref value, usePublicThreads, GuildPermission.UsePublicThreads); - Permissions.SetValue(ref value, usePrivateThreads, GuildPermission.UsePrivateThreads); Permissions.SetValue(ref value, useExternalStickers, GuildPermission.UseExternalStickers); Permissions.SetValue(ref value, sendMessagesInThreads, GuildPermission.SendMessagesInThreads); Permissions.SetValue(ref value, startEmbeddedActivities, GuildPermission.StartEmbeddedActivities); @@ -233,13 +225,11 @@ public GuildPermissions( bool manageRoles = false, bool manageWebhooks = false, bool manageEmojisAndStickers = false, - bool useSlashCommands = false, + bool useApplicationCommands = false, bool requestToSpeak = false, bool manageThreads = false, bool createPublicThreads = false, bool createPrivateThreads = false, - bool usePublicThreads = false, - bool usePrivateThreads = false, bool useExternalStickers = false, bool sendMessagesInThreads = false, bool startEmbeddedActivities = false) @@ -275,13 +265,11 @@ public GuildPermissions( manageNicknames: manageNicknames, manageWebhooks: manageWebhooks, manageEmojisAndStickers: manageEmojisAndStickers, - useSlashCommands: useSlashCommands, + useApplicationCommands: useApplicationCommands, requestToSpeak: requestToSpeak, manageThreads: manageThreads, createPublicThreads: createPublicThreads, createPrivateThreads: createPrivateThreads, - usePublicThreads: usePublicThreads, - usePrivateThreads: usePrivateThreads, useExternalStickers: useExternalStickers, sendMessagesInThreads: sendMessagesInThreads, startEmbeddedActivities: startEmbeddedActivities) @@ -320,13 +308,11 @@ public GuildPermissions Modify( bool? manageRoles = null, bool? manageWebhooks = null, bool? manageEmojisAndStickers = null, - bool? useSlashCommands = null, + bool? useApplicationCommands = null, bool? requestToSpeak = null, bool? manageThreads = null, bool? createPublicThreads = null, bool? createPrivateThreads = null, - bool? usePublicThreads = null, - bool? usePrivateThreads = null, bool? useExternalStickers = null, bool? sendMessagesInThreads = null, bool? startEmbeddedActivities = null) @@ -334,7 +320,7 @@ public GuildPermissions Modify( viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers, - useSlashCommands, requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, usePublicThreads, usePrivateThreads, useExternalStickers, sendMessagesInThreads, + useApplicationCommands, requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, useExternalStickers, sendMessagesInThreads, startEmbeddedActivities); /// diff --git a/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs b/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs index 4f144c74b2..cff938465f 100644 --- a/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; @@ -82,6 +83,22 @@ public static OverwritePermissions DenyAll(IChannel channel) public PermValue ManageRoles => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ManageRoles); /// If True, a user may edit the webhooks for this channel. public PermValue ManageWebhooks => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ManageWebhooks); + /// If true, a user may use slash commands in this guild. + public PermValue UseApplicationCommands => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.UseApplicationCommands); + /// If true, a user may request to speak in stage channels. + public PermValue RequestToSpeak => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.RequestToSpeak); + /// If true, a user may manage threads in this guild. + public PermValue ManageThreads => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ManageThreads); + /// If true, a user may create public threads in this guild. + public PermValue CreatePublicThreads => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.CreatePublicThreads); + /// If true, a user may create private threads in this guild. + public PermValue CreatePrivateThreads => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.CreatePrivateThreads); + /// If true, a user may use external stickers in this guild. + public PermValue UseExternalStickers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.UseExternalStickers); + /// If true, a user may send messages in threads in this guild. + public PermValue SendMessagesInThreads => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SendMessagesInThreads); + /// If true, a user launch application activites in voice channels in this guild. + public PermValue StartEmbeddedActivities => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.StartEmbeddedActivities); /// Creates a new OverwritePermissions with the provided allow and deny packed values. public OverwritePermissions(ulong allowValue, ulong denyValue) @@ -119,7 +136,18 @@ private OverwritePermissions(ulong allowValue, ulong denyValue, PermValue? manageRoles = null, PermValue? manageWebhooks = null, PermValue? prioritySpeaker = null, - PermValue? stream = null) + PermValue? stream = null, + PermValue? useSlashCommands = null, + PermValue? useApplicationCommands = null, + PermValue? requestToSpeak = null, + PermValue? manageThreads = null, + PermValue? createPublicThreads = null, + PermValue? createPrivateThreads = null, + PermValue? usePublicThreads = null, + PermValue? usePrivateThreads = null, + PermValue? useExternalStickers = null, + PermValue? sendMessagesInThreads = null, + PermValue? startEmbeddedActivities = null) { Permissions.SetValue(ref allowValue, ref denyValue, createInstantInvite, ChannelPermission.CreateInstantInvite); Permissions.SetValue(ref allowValue, ref denyValue, manageChannel, ChannelPermission.ManageChannels); @@ -143,6 +171,14 @@ private OverwritePermissions(ulong allowValue, ulong denyValue, Permissions.SetValue(ref allowValue, ref denyValue, stream, ChannelPermission.Stream); Permissions.SetValue(ref allowValue, ref denyValue, manageRoles, ChannelPermission.ManageRoles); Permissions.SetValue(ref allowValue, ref denyValue, manageWebhooks, ChannelPermission.ManageWebhooks); + Permissions.SetValue(ref allowValue, ref denyValue, useApplicationCommands, ChannelPermission.UseApplicationCommands); + Permissions.SetValue(ref allowValue, ref denyValue, requestToSpeak, ChannelPermission.RequestToSpeak); + Permissions.SetValue(ref allowValue, ref denyValue, manageThreads, ChannelPermission.ManageThreads); + Permissions.SetValue(ref allowValue, ref denyValue, createPublicThreads, ChannelPermission.CreatePublicThreads); + Permissions.SetValue(ref allowValue, ref denyValue, createPrivateThreads, ChannelPermission.CreatePrivateThreads); + Permissions.SetValue(ref allowValue, ref denyValue, useExternalStickers, ChannelPermission.UseExternalStickers); + Permissions.SetValue(ref allowValue, ref denyValue, sendMessagesInThreads, ChannelPermission.SendMessagesInThreads); + Permissions.SetValue(ref allowValue, ref denyValue, startEmbeddedActivities, ChannelPermission.StartEmbeddedActivities); AllowValue = allowValue; DenyValue = denyValue; @@ -173,10 +209,23 @@ public OverwritePermissions( PermValue manageRoles = PermValue.Inherit, PermValue manageWebhooks = PermValue.Inherit, PermValue prioritySpeaker = PermValue.Inherit, - PermValue stream = PermValue.Inherit) + PermValue stream = PermValue.Inherit, + PermValue useSlashCommands = PermValue.Inherit, + PermValue useApplicationCommands = PermValue.Inherit, + PermValue requestToSpeak = PermValue.Inherit, + PermValue manageThreads = PermValue.Inherit, + PermValue createPublicThreads = PermValue.Inherit, + PermValue createPrivateThreads = PermValue.Inherit, + PermValue usePublicThreads = PermValue.Inherit, + PermValue usePrivateThreads = PermValue.Inherit, + PermValue useExternalStickers = PermValue.Inherit, + PermValue sendMessagesInThreads = PermValue.Inherit, + PermValue startEmbeddedActivities = PermValue.Inherit) : this(0, 0, createInstantInvite, manageChannel, addReactions, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, - moveMembers, useVoiceActivation, manageRoles, manageWebhooks, prioritySpeaker, stream) { } + moveMembers, useVoiceActivation, manageRoles, manageWebhooks, prioritySpeaker, stream, useSlashCommands, useApplicationCommands, + requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, usePublicThreads, usePrivateThreads, useExternalStickers, + sendMessagesInThreads, startEmbeddedActivities) { } /// /// Initializes a new from the current one, changing the provided @@ -204,10 +253,23 @@ public OverwritePermissions Modify( PermValue? manageRoles = null, PermValue? manageWebhooks = null, PermValue? prioritySpeaker = null, - PermValue? stream = null) + PermValue? stream = null, + PermValue? useSlashCommands = null, + PermValue? useApplicationCommands = null, + PermValue? requestToSpeak = null, + PermValue? manageThreads = null, + PermValue? createPublicThreads = null, + PermValue? createPrivateThreads = null, + PermValue? usePublicThreads = null, + PermValue? usePrivateThreads = null, + PermValue? useExternalStickers = null, + PermValue? sendMessagesInThreads = null, + PermValue? startEmbeddedActivities = null) => new OverwritePermissions(AllowValue, DenyValue, createInstantInvite, manageChannel, addReactions, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, - moveMembers, useVoiceActivation, manageRoles, manageWebhooks, prioritySpeaker, stream); + moveMembers, useVoiceActivation, manageRoles, manageWebhooks, prioritySpeaker, stream, useSlashCommands, useApplicationCommands, + requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, usePublicThreads, usePrivateThreads, useExternalStickers, + sendMessagesInThreads, startEmbeddedActivities); /// /// Creates a of all the values that are allowed. diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index af46d06ad2..f6ce59739b 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -3243,7 +3243,6 @@ Gets a collection of all stage channels in this guild. - The that determines whether the object should be fetched from cache. The options to be used when sending the request. A task that represents the asynchronous get operation. The task result contains a read-only collection of diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index c194d00efb..b2b80b2eb4 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -4286,10 +4286,6 @@ Responds to an Interaction with type . - - If you have set to , You should use - instead. - The text of the message to be sent. A array of embeds to send with this response. Max 10. diff --git a/test/Discord.Net.Tests.Unit/ChannelPermissionsTests.cs b/test/Discord.Net.Tests.Unit/ChannelPermissionsTests.cs index a3566590a2..2cab8fa21c 100644 --- a/test/Discord.Net.Tests.Unit/ChannelPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/ChannelPermissionsTests.cs @@ -85,6 +85,10 @@ void AssertFlag(Func cstr, ChannelPermission flag) AssertFlag(() => new ChannelPermissions(stream: true), ChannelPermission.Stream); AssertFlag(() => new ChannelPermissions(manageRoles: true), ChannelPermission.ManageRoles); AssertFlag(() => new ChannelPermissions(manageWebhooks: true), ChannelPermission.ManageWebhooks); + AssertFlag(() => new ChannelPermissions(useApplicationCommands: true), ChannelPermission.UseApplicationCommands); + AssertFlag(() => new ChannelPermissions(createPrivateThreads: true), ChannelPermission.CreatePrivateThreads); + AssertFlag(() => new ChannelPermissions(createPublicThreads: true), ChannelPermission.CreatePublicThreads); + AssertFlag(() => new ChannelPermissions(sendMessagesInThreads: true), ChannelPermission.SendMessagesInThreads); } /// diff --git a/test/Discord.Net.Tests.Unit/ColorTests.cs b/test/Discord.Net.Tests.Unit/ColorTests.cs index 87c76e4e26..48a6041e5b 100644 --- a/test/Discord.Net.Tests.Unit/ColorTests.cs +++ b/test/Discord.Net.Tests.Unit/ColorTests.cs @@ -15,7 +15,7 @@ public void Color_New() { Assert.Equal(0u, new Color().RawValue); Assert.Equal(uint.MinValue, new Color(uint.MinValue).RawValue); - Assert.Equal(uint.MaxValue, new Color(uint.MaxValue).RawValue); + Assert.Throws(() => new Color(uint.MaxValue)); } [Fact] public void Color_Default() diff --git a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs index 68a685fdb1..00ca05504f 100644 --- a/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs +++ b/test/Discord.Net.Tests.Unit/GuildPermissionsTests.cs @@ -92,7 +92,7 @@ void AssertFlag(Func cstr, GuildPermission flag) AssertFlag(() => new GuildPermissions(manageRoles: true), GuildPermission.ManageRoles); AssertFlag(() => new GuildPermissions(manageWebhooks: true), GuildPermission.ManageWebhooks); AssertFlag(() => new GuildPermissions(manageEmojisAndStickers: true), GuildPermission.ManageEmojisAndStickers); - AssertFlag(() => new GuildPermissions(useSlashCommands: true), GuildPermission.UseSlashCommands); + AssertFlag(() => new GuildPermissions(useApplicationCommands: true), GuildPermission.UseApplicationCommands); AssertFlag(() => new GuildPermissions(requestToSpeak: true), GuildPermission.RequestToSpeak); AssertFlag(() => new GuildPermissions(manageThreads: true), GuildPermission.ManageThreads); AssertFlag(() => new GuildPermissions(createPublicThreads: true), GuildPermission.CreatePublicThreads); @@ -168,7 +168,7 @@ void AssertUtil(GuildPermission permission, AssertUtil(GuildPermission.ManageRoles, x => x.ManageRoles, (p, enable) => p.Modify(manageRoles: enable)); AssertUtil(GuildPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable)); AssertUtil(GuildPermission.ManageEmojisAndStickers, x => x.ManageEmojisAndStickers, (p, enable) => p.Modify(manageEmojisAndStickers: enable)); - AssertUtil(GuildPermission.UseSlashCommands, x => x.UseSlashCommands, (p, enable) => p.Modify(useSlashCommands: enable)); + AssertUtil(GuildPermission.UseApplicationCommands, x => x.UseApplicationCommands, (p, enable) => p.Modify(useApplicationCommands: enable)); AssertUtil(GuildPermission.RequestToSpeak, x => x.RequestToSpeak, (p, enable) => p.Modify(requestToSpeak: enable)); AssertUtil(GuildPermission.ManageThreads, x => x.ManageThreads, (p, enable) => p.Modify(manageThreads: enable)); AssertUtil(GuildPermission.CreatePublicThreads, x => x.CreatePublicThreads, (p, enable) => p.Modify(createPublicThreads: enable)); From bdcc508c3b5bd018324c0a0d28d8087744ac2492 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 25 Sep 2021 14:58:04 -0300 Subject: [PATCH 292/494] Update azure-pipelines.yml --- azure-pipelines.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9aa0e57880..4f68b05ac9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -13,8 +13,7 @@ trigger: jobs: - job: Linux - pool: - vmImage: 'ubuntu-latest' + pool: default steps: - template: azure/build.yml From b1e9c73d88f55d390129dc6261689f3e8fb74391 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 25 Sep 2021 15:14:30 -0300 Subject: [PATCH 293/494] Update azure-pipelines.yml --- azure-pipelines.yml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4f68b05ac9..68a0b84218 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -16,22 +16,15 @@ jobs: pool: default steps: - template: azure/build.yml + - template: azure/deploy.yml -- job: Windows_build - pool: - vmImage: 'windows-latest' - condition: ne(variables['Build.SourceBranch'], 'refs/heads/dev') - steps: - - template: azure/build.yml - -- job: Windows_deploy - pool: - vmImage: 'windows-latest' +- job: Linux_deploy + pool: default condition: | and ( succeeded(), or ( - eq(variables['Build.SourceBranch'], 'refs/heads/dev'), + eq(variables['Build.SourceBranch'], 'refs/heads/release/3.x'), eq(variables['buildTag'], True) ) ) From 3ba69169e37e080bfe328f7a01c3571ba1870698 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sat, 25 Sep 2021 15:18:54 -0300 Subject: [PATCH 294/494] Update azure-pipelines.yml --- azure-pipelines.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 68a0b84218..e8d30a365c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -16,7 +16,6 @@ jobs: pool: default steps: - template: azure/build.yml - - template: azure/deploy.yml - job: Linux_deploy pool: default From 98845b96fa213e1d63509b95d2e70105e18003ed Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 25 Sep 2021 16:53:25 -0300 Subject: [PATCH 295/494] Add support for long in autocomplete option --- src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs index c152c1f27b..a0992fd00c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs @@ -57,6 +57,7 @@ public object Value { string str => str, int integer => integer, + long lng => lng, double number => number, _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"), }; From bc8c960e5a64c6ad96d1b7355449c4effbf42d43 Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Sat, 25 Sep 2021 15:23:22 -0500 Subject: [PATCH 296/494] Add support for sending files with multiple embeds (#196) * Add support for sending files with multiple embeds * Simplify prepending single embed to embed array --- src/Discord.Net.Core/Discord.Net.Core.xml | 16 +++++---- .../Entities/Channels/IMessageChannel.cs | 6 ++-- .../Extensions/UserExtensions.cs | 18 ++++++---- .../API/Rest/UploadFileParams.cs | 6 ++-- src/Discord.Net.Rest/Discord.Net.Rest.xml | 36 ++++++++++--------- .../Entities/Channels/ChannelHelper.cs | 28 +++++++-------- .../Entities/Channels/IRestMessageChannel.cs | 12 ++++--- .../Entities/Channels/RestDMChannel.cs | 16 ++++----- .../Entities/Channels/RestGroupChannel.cs | 16 ++++----- .../Entities/Channels/RestTextChannel.cs | 16 ++++----- .../Discord.Net.WebSocket.xml | 34 +++++++++--------- .../Channels/ISocketMessageChannel.cs | 10 +++--- .../Entities/Channels/SocketDMChannel.cs | 16 ++++----- .../Entities/Channels/SocketGroupChannel.cs | 16 ++++----- .../Entities/Channels/SocketTextChannel.cs | 16 ++++----- .../MockedEntities/MockedDMChannel.cs | 4 +-- .../MockedEntities/MockedGroupChannel.cs | 4 +-- .../MockedEntities/MockedTextChannel.cs | 4 +-- 18 files changed, 145 insertions(+), 129 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index b759c8e133..a046da6fba 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1534,7 +1534,7 @@ contains the sent message. - + Sends a file to this message channel with an optional caption. @@ -1569,12 +1569,13 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. @@ -1606,6 +1607,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -11204,7 +11206,7 @@ An extension class for various Discord user objects. - + Sends a message via DM. @@ -11225,18 +11227,18 @@ The message to be sent. Whether the message should be read aloud by Discord or not. The to be sent. - A array of s to send with this response. Max 10. The options to be used when sending the request. Specifies if notifications are sent for mentioned users and roles in the message . If null, all mentioned roles and users will be notified. The message components to be included with this message. Used for interactions. + A array of s to send with this response. Max 10. A task that represents the asynchronous send operation. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. @@ -11274,12 +11276,13 @@ The to be sent. The options to be used when sending the request. The message component to be included with this message. Used for interactions. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file via DM with an optional caption. @@ -11322,6 +11325,7 @@ The to be sent. The options to be used when sending the request. The message component to be included with this message. Used for interactions. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index 9e145a6301..95507d2976 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -70,11 +70,12 @@ public interface IMessageChannel : IChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Sends a file to this message channel with an optional caption. /// @@ -106,11 +107,12 @@ public interface IMessageChannel : IChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Core/Extensions/UserExtensions.cs b/src/Discord.Net.Core/Extensions/UserExtensions.cs index aa807c073b..e268eae843 100644 --- a/src/Discord.Net.Core/Extensions/UserExtensions.cs +++ b/src/Discord.Net.Core/Extensions/UserExtensions.cs @@ -27,13 +27,13 @@ public static class UserExtensions /// The message to be sent. /// Whether the message should be read aloud by Discord or not. /// The to be sent. - /// A array of s to send with this response. Max 10. /// The options to be used when sending the request. /// /// Specifies if notifications are sent for mentioned users and roles in the message . /// If null, all mentioned roles and users will be notified. /// /// The message components to be included with this message. Used for interactions. + /// A array of s to send with this response. Max 10. /// /// A task that represents the asynchronous send operation. The task result contains the sent message. /// @@ -41,10 +41,10 @@ public static async Task SendMessageAsync(this IUser user, string text = null, bool isTTS = false, Embed embed = null, - Embed[] embeds = null, RequestOptions options = null, AllowedMentions allowedMentions = null, - MessageComponent component = null) + MessageComponent component = null, + Embed[] embeds = null) { return await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendMessageAsync(text, isTTS, embed, options, allowedMentions, component: component, embeds: embeds).ConfigureAwait(false); } @@ -86,6 +86,7 @@ public static async Task SendMessageAsync(this IUser user, /// The to be sent. /// The options to be used when sending the request. /// The message component to be included with this message. Used for interactions. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. @@ -97,9 +98,10 @@ public static async Task SendFileAsync(this IUser user, bool isTTS = false, Embed embed = null, RequestOptions options = null, - MessageComponent component = null) + MessageComponent component = null, + Embed[] embeds = null) { - return await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(stream, filename, text, isTTS, embed, options, component: component).ConfigureAwait(false); + return await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(stream, filename, text, isTTS, embed, options, component: component, embeds: embeds).ConfigureAwait(false); } /// @@ -144,6 +146,7 @@ public static async Task SendFileAsync(this IUser user, /// The to be sent. /// The options to be used when sending the request. /// The message component to be included with this message. Used for interactions. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. @@ -154,9 +157,10 @@ public static async Task SendFileAsync(this IUser user, bool isTTS = false, Embed embed = null, RequestOptions options = null, - MessageComponent component = null) + MessageComponent component = null, + Embed[] embeds = null) { - return await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(filePath, text, isTTS, embed, options, component: component).ConfigureAwait(false); + return await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(filePath, text, isTTS, embed, options, component: component, embeds: embeds).ConfigureAwait(false); } /// diff --git a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs index f18da65c19..98fb0e7ca3 100644 --- a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs +++ b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs @@ -17,7 +17,7 @@ internal class UploadFileParams public Optional Content { get; set; } public Optional Nonce { get; set; } public Optional IsTTS { get; set; } - public Optional Embed { get; set; } + public Optional Embeds { get; set; } public Optional AllowedMentions { get; set; } public Optional MessageReference { get; set; } public Optional MessageComponent { get; set; } @@ -44,8 +44,8 @@ public IReadOnlyDictionary ToDictionary() payload["tts"] = IsTTS.Value.ToString(); if (Nonce.IsSpecified) payload["nonce"] = Nonce.Value; - if (Embed.IsSpecified) - payload["embed"] = Embed.Value; + if (Embeds.IsSpecified) + payload["embeds"] = Embeds.Value; if (AllowedMentions.IsSpecified) payload["allowed_mentions"] = AllowedMentions.Value; if (MessageComponent.IsSpecified) diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index f6ce59739b..91727936d7 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -1721,7 +1721,7 @@ Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more invalid characters as defined by . @@ -1747,7 +1747,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -1789,13 +1789,13 @@ contains the sent message. - + Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in - . Please visit + This method follows the same behavior as described in + . Please visit its documentation for more details on this method. The file path of the file. @@ -1811,17 +1811,18 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions. A collection of stickers to send with the message. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The of the file to be sent. @@ -1838,6 +1839,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions. A collection of stickers to send with the message. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -2021,7 +2023,7 @@ Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more @@ -2048,7 +2050,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -2099,10 +2101,10 @@ - + - + @@ -2159,7 +2161,7 @@ Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more @@ -2186,7 +2188,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -2449,7 +2451,7 @@ Message content is too long, length must be less or equal to . - + is a zero-length string, contains only white space, or contains one or more @@ -2476,7 +2478,7 @@ An I/O error occurred while opening the file. Message content is too long, length must be less or equal to . - + Message content is too long, length must be less or equal to . @@ -2609,10 +2611,10 @@ - + - + diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 273ffab930..c5d264ade0 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -268,20 +268,13 @@ public static async Task> GetPinnedMessagesAsyn public static async Task SendMessageAsync(IMessageChannel channel, BaseDiscordClient client, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, Embed[] embeds) { + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -307,7 +300,7 @@ public static async Task SendMessageAsync(IMessageChannel chann var args = new CreateMessageParams(text) { IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Any() ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel(), MessageReference = messageReference?.ToModel(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, @@ -342,19 +335,24 @@ public static async Task SendMessageAsync(IMessageChannel chann /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, - string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler) + string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler, Embed[] embeds) { string filename = Path.GetFileName(filePath); using (var file = File.OpenRead(filePath)) - return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler).ConfigureAwait(false); + return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds).ConfigureAwait(false); } /// Message content is too long, length must be less or equal to . public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, - Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler) + Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler, Embed[] embeds) { + embeds ??= Array.Empty(); + if (embed != null) + embeds = new[] { embed }.Concat(embeds).ToArray(); + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -377,7 +375,7 @@ public static async Task SendFileAsync(IMessageChannel channel, Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed."); } - var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embed = embed?.ToModel() ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, IsSpoiler = isSpoiler, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified }; + var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embeds = embeds.Any() ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, IsSpoiler = isSpoiler, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified }; var model = await client.ApiClient.UploadFileAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } diff --git a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs index 0198fea87e..1597357989 100644 --- a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs @@ -37,8 +37,8 @@ public interface IRestMessageChannel : IMessageChannel /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in - /// . Please visit + /// This method follows the same behavior as described in + /// . Please visit /// its documentation for more details on this method. /// /// The file path of the file. @@ -54,16 +54,17 @@ public interface IRestMessageChannel : IMessageChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the message. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The of the file to be sent. @@ -80,11 +81,12 @@ public interface IRestMessageChannel : IMessageChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the message. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index 3f296f4414..922f128b91 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -122,12 +122,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -209,11 +209,11 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index c575a09978..aa7291ca65 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -128,12 +128,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// public Task TriggerTypingAsync(RequestOptions options = null) @@ -186,11 +186,11 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index 05980ac7a8..6fb7de9843 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -131,13 +131,13 @@ public Task SendMessageAsync(string text = null, bool isTTS = f /// is in an invalid format. /// An I/O error occurred while opening the file. /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -319,12 +319,12 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index b2b80b2eb4..abf0c1bb21 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -1482,12 +1482,12 @@ contains the sent message. - + Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The file path of the file. @@ -1503,17 +1503,18 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. - + Sends a file to this message channel with an optional caption. - This method follows the same behavior as described in . + This method follows the same behavior as described in . Please visit its documentation for more details on this method. The of the file to be sent. @@ -1530,6 +1531,7 @@ The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. + A array of s to send with this response. Max 10. A task that represents an asynchronous send operation for delivering the message. The task result contains the sent message. @@ -1816,10 +1818,10 @@ Message content is too long, length must be less or equal to . - + - + Message content is too long, length must be less or equal to . @@ -1882,10 +1884,10 @@ - + - + @@ -2007,10 +2009,10 @@ Message content is too long, length must be less or equal to . - + - + Message content is too long, length must be less or equal to . @@ -2070,10 +2072,10 @@ - + - + @@ -2464,10 +2466,10 @@ Message content is too long, length must be less or equal to . - + - + Message content is too long, length must be less or equal to . @@ -2573,10 +2575,10 @@ - + - + diff --git a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs index 5ced136288..1103f8febb 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs @@ -46,7 +46,7 @@ public interface ISocketMessageChannel : IMessageChannel /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The file path of the file. @@ -62,16 +62,17 @@ public interface ISocketMessageChannel : IMessageChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Sends a file to this message channel with an optional caption. /// /// - /// This method follows the same behavior as described in . + /// This method follows the same behavior as described in . /// Please visit its documentation for more details on this method. /// /// The of the file to be sent. @@ -88,11 +89,12 @@ public interface ISocketMessageChannel : IMessageChannel /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. + /// A array of s to send with this response. Max 10. /// /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null); + new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Gets a cached message from this channel. diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs index a6f487cca8..a298d352a8 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs @@ -143,12 +143,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); @@ -246,11 +246,11 @@ IAsyncEnumerable> IMessageChannel.GetMessagesAsync async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index 3f758a93ec..2fd748faa6 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -177,12 +177,12 @@ public Task SendMessageAsync(string text = null, bool isTTS = f => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -314,11 +314,11 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index 63ada8592e..dd94e7788d 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -215,13 +215,13 @@ public Task SendMessageAsync(string text = null, bool isTTS = f => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// - public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// /// Message content is too long, length must be less or equal to . - public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) - => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler); + public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions options = null) @@ -371,11 +371,11 @@ async Task> IMessageChannel.GetPinnedMessagesAsync => await GetPinnedMessagesAsync(options).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(filePath, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// - async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers) - => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers).ConfigureAwait(false); + async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs index a7451ddd2d..c581867a3c 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs @@ -84,7 +84,7 @@ public Task TriggerTypingAsync(RequestOptions options = null) } public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) => throw new NotImplementedException(); + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); } } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs index fc9a163387..1c7c5544cd 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs @@ -86,12 +86,12 @@ public Task LeaveAsync(RequestOptions options = null) throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { throw new NotImplementedException(); } - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { throw new NotImplementedException(); } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs index 06d0d98117..459b5a69e3 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs @@ -176,12 +176,12 @@ public Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = throw new NotImplementedException(); } - public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { throw new NotImplementedException(); } - public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null) + public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) { throw new NotImplementedException(); } From afcd179d693035a8224f7026126414c34c85c7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Sat, 25 Sep 2021 22:47:14 +0200 Subject: [PATCH 297/494] Consistency for embeds endpoints (#197) * Changed the way of handling prepending of embeds. For consistency. * reformatted the summary --- .../SocketMessageComponent.cs | 56 +++++-------------- .../SocketBaseCommand/SocketCommandBase.cs | 44 +++------------ 2 files changed, 22 insertions(+), 78 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index aa3a915aef..849ce4df8a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -10,9 +10,9 @@ namespace Discord.WebSocket { -/// -/// Represents a Websocket-based interaction type for Message Components. -/// + /// + /// Represents a Websocket-based interaction type for Message Components. + /// public class SocketMessageComponent : SocketInteraction { /// @@ -84,16 +84,9 @@ public override async Task RespondAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -150,9 +143,9 @@ public async Task UpdateAsync(Action func, RequestOptions opt if (args.AllowedMentions.IsSpecified) { - var allowedMentions = args.AllowedMentions.Value; - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); + var allowedMentions = args.AllowedMentions.Value; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); } var embed = args.Embed; @@ -227,16 +220,9 @@ public override async Task FollowupAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -273,16 +259,9 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -322,16 +301,9 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index d0622196a4..c2a7d5409b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -79,16 +79,9 @@ public override async Task RespondAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -141,16 +134,9 @@ public override async Task FollowupAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -187,16 +173,9 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); @@ -236,16 +215,9 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); From d838de94f5667a1421889eb33c5ba527c456d399 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 25 Sep 2021 17:51:51 -0300 Subject: [PATCH 298/494] Revert pipeline --- azure-pipelines.yml | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e8d30a365c..f576f89d42 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -6,27 +6,36 @@ variables: trigger: tags: include: - - '*' + - "*" branches: include: - - '*' + - "*" jobs: -- job: Linux - pool: default - steps: - - template: azure/build.yml + - job: Linux + pool: + vmImage: "ubuntu-latest" + steps: + - template: azure/build.yml -- job: Linux_deploy - pool: default - condition: | + - job: Windows_build + pool: + vmImage: "windows-latest" + condition: ne(variables['Build.SourceBranch'], 'refs/heads/dev') + steps: + - template: azure/build.yml + + - job: Windows_deploy + pool: + vmImage: "windows-latest" + condition: | and ( succeeded(), or ( - eq(variables['Build.SourceBranch'], 'refs/heads/release/3.x'), + eq(variables['Build.SourceBranch'], 'refs/heads/dev'), eq(variables['buildTag'], True) ) ) - steps: - - template: azure/build.yml - - template: azure/deploy.yml + steps: + - template: azure/build.yml + - template: azure/deploy.yml From 4fedeee20b225804c27b18d90f7279cea9995711 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 25 Sep 2021 17:56:21 -0300 Subject: [PATCH 299/494] Fix duplicate merge conflicts --- .../Entities/Channels/SocketVoiceChannel.cs | 2 -- .../Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs | 1 - 2 files changed, 3 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs index cd3fa41d32..e57051e806 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs @@ -36,8 +36,6 @@ public ICategoryChannel Category /// public string Mention => MentionUtils.MentionChannel(Id); - /// - public string Mention => MentionUtils.MentionChannel(Id); /// public Task SyncPermissionsAsync(RequestOptions options = null) => ChannelHelper.SyncPermissionsAsync(this, Discord, options); diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs index 736fd916ef..61a32e3914 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedVoiceChannel.cs @@ -27,7 +27,6 @@ internal sealed class MockedVoiceChannel : IVoiceChannel public string Name => throw new NotImplementedException(); public DateTimeOffset CreatedAt => throw new NotImplementedException(); - public string Mention => throw new NotImplementedException(); public ulong Id => throw new NotImplementedException(); public Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) From 7cabcc787acf8a579ede86ef80f349d5dd01e228 Mon Sep 17 00:00:00 2001 From: Will Date: Sun, 26 Sep 2021 05:38:49 -0400 Subject: [PATCH 300/494] Changed minimum slash command name length to 1 per Discord API docs (#198) --- src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 8f9163692c..5dbf78f583 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -195,7 +195,7 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie if (args.Name.IsSpecified) { Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 1, nameof(args.Name)); } var model = new Discord.API.Rest.ModifyApplicationCommandParams() From d21d83b772297e95dc9ea81373fd3f5851b0c45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Sun, 26 Sep 2021 16:51:34 +0200 Subject: [PATCH 301/494] 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 --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 37 +++++++++++++------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 461981e28c..19fc82fcea 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -320,6 +320,7 @@ public async Task GetChannelAsync(ulong guildId, ulong channelId, Reque var model = await SendAsync("GET", () => $"channels/{channelId}", ids, options: options).ConfigureAwait(false); if (!model.GuildId.IsSpecified || model.GuildId.Value != guildId) return null; + return model; } catch (HttpException ex) when (ex.HttpCode == HttpStatusCode.NotFound) { return null; } @@ -338,11 +339,16 @@ public async Task CreateGuildChannelAsync(ulong guildId, CreateGuildCha Preconditions.NotNull(args, nameof(args)); Preconditions.GreaterThan(args.Bitrate, 0, nameof(args.Bitrate)); Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); + Preconditions.LessThan(args.Name.Length, 100, nameof(args.Name)); + if (args.Topic.IsSpecified) + Preconditions.LessThan(args.Topic.Value.Length, 1024, nameof(args.Name)); + options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(guildId: guildId); return await SendJsonAsync("POST", () => $"guilds/{guildId}/channels", args, ids, options: options).ConfigureAwait(false); } + public async Task DeleteChannelAsync(ulong channelId, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -366,18 +372,23 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyG Preconditions.NotEqual(channelId, 0, nameof(channelId)); Preconditions.NotNull(args, nameof(args)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); - Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); + Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); + Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); + options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}", args, ids, options: options).ConfigureAwait(false); } + public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyTextChannelParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); Preconditions.NotNull(args, nameof(args)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); - Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); + Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); + Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); + Preconditions.LessThan(args.Topic.Value.Length, 1024, nameof(args.Name)); Preconditions.AtLeast(args.SlowModeInterval, 0, nameof(args.SlowModeInterval)); Preconditions.AtMost(args.SlowModeInterval, 21600, nameof(args.SlowModeInterval)); options = RequestOptions.CreateOrClone(options); @@ -385,6 +396,7 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyT var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}", args, ids, options: options).ConfigureAwait(false); } + public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyVoiceChannelParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -392,12 +404,13 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyV Preconditions.AtLeast(args.Bitrate, 8000, nameof(args.Bitrate)); Preconditions.AtLeast(args.UserLimit, 0, nameof(args.UserLimit)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); - Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); + Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}", args, ids, options: options).ConfigureAwait(false); } + public async Task ModifyGuildChannelsAsync(ulong guildId, IEnumerable args, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -441,7 +454,7 @@ public async Task StartThreadAsync(ulong channelId, ulong messageId, St return await SendJsonAsync("POST", () => $"channels/{channelId}/messages/{messageId}/threads", args, bucket, options: options).ConfigureAwait(false); } - + public async Task StartThreadAsync(ulong channelId, StartThreadParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -592,7 +605,7 @@ public async Task GetJoinedPrivateArchivedThreadsAsync(ulong cha #region Stage public async Task CreateStageInstanceAsync(CreateStageInstanceParams args, RequestOptions options = null) { - + options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(); @@ -636,7 +649,7 @@ public async Task GetStageInstanceAsync(ulong channelId, RequestO { return await SendAsync("POST", () => $"stage-instances/{channelId}", bucket, options: options).ConfigureAwait(false); } - catch(HttpException httpEx) when (httpEx.HttpCode == HttpStatusCode.NotFound) + catch (HttpException httpEx) when (httpEx.HttpCode == HttpStatusCode.NotFound) { return null; } @@ -1137,7 +1150,7 @@ public async Task GetGlobalApplicationCommandAsync(ulong id, { return await SendAsync("GET", () => $"applications/{CurrentUserId}/commands/{id}", new BucketIds(), options: options).ConfigureAwait(false); } - catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } + catch (HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } } public async Task CreateGlobalApplicationCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) @@ -1208,7 +1221,7 @@ public async Task GetGuildApplicationCommandAsync(ulong guil { return await SendAsync("GET", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options); } - catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } + catch (HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } } public async Task CreateGuildApplicationCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) @@ -1236,7 +1249,7 @@ public async Task ModifyGuildApplicationCommandAsync(ModifyA var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1260,7 +1273,7 @@ public async Task BulkOverwriteGuildApplicationCommandsAsy #region Interaction Responses public async Task CreateInteractionResponseAsync(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { - if(response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) + if (response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) Preconditions.AtMost(response.Data.Value.Content.Value?.Length ?? 0, 2000, nameof(response.Data.Value.Content)); options = RequestOptions.CreateOrClone(options); @@ -1309,7 +1322,7 @@ public async Task ModifyInteractionFollowupMessageAsync(ModifyInteracti Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(id, 0, nameof(id)); - if(args.Content.IsSpecified) + if (args.Content.IsSpecified) if (args.Content.Value.Length > DiscordConfig.MaxMessageSize) throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content)); @@ -2102,7 +2115,7 @@ protected async Task TrySendApplicationCommandAsync(Task sendTask) else return result; } - catch(HttpException x) + catch (HttpException x) { if (x.HttpCode == HttpStatusCode.BadRequest) { From 94ff2e69edc8b3ac311be9fc02ccf17470f2db9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Sun, 26 Sep 2021 17:16:43 +0200 Subject: [PATCH 302/494] Added restriction for description not being null (#200) --- .../Interactions/Slash Commands/SlashCommandBuilder.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 4abf84eb3d..16855b8189 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -50,7 +50,8 @@ public string Name } /// - /// A 1-100 length description of this slash command + /// A 1-100 length description of this slash command. + /// The description is not allowed to be null. /// public string Description { @@ -60,6 +61,7 @@ public string Description } set { + Preconditions.NotNullOrEmpty(value, nameof(Description)); Preconditions.AtLeast(value.Length, 1, nameof(Description)); Preconditions.AtMost(value.Length, MaxDescriptionLength, nameof(Description)); From a4550c82c7722899d43d769a6215b334e0570b24 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:17:41 -0300 Subject: [PATCH 303/494] Update azure-pipelines.yml --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e8d30a365c..177f91d33b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -2,6 +2,7 @@ variables: buildConfiguration: Release buildTag: $[ startsWith(variables['Build.SourceBranch'], 'refs/tags') ] buildNumber: $[ variables['Build.BuildNumber'] ] + suffix: $(Date:yyyyMMdd) trigger: tags: From e452a88b67c7e14c1d9188171188a0f883e3b7b4 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:20:09 -0300 Subject: [PATCH 304/494] Update deploy.yml --- azure/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure/deploy.yml b/azure/deploy.yml index 61994299ea..cab5b35635 100644 --- a/azure/deploy.yml +++ b/azure/deploy.yml @@ -1,6 +1,6 @@ steps: - script: | - dotnet pack "src\Discord.Net.Core\Discord.Net.Core.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) + dotnet pack "src\Discord.Net.Core\Discord.Net.Core.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" --version-suffix=$(buildNumber) /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) dotnet pack "src\Discord.Net.Rest\Discord.Net.Rest.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) dotnet pack "src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) dotnet pack "src\Discord.Net.Commands\Discord.Net.Commands.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) From 3babf8f31eea2f434f95e37d0611c490444d204f Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:29:19 -0300 Subject: [PATCH 305/494] Remove version tag from proj --- src/Discord.Net.Core/Discord.Net.Core.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index b52aba2147..036717e8dc 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -8,12 +8,9 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 Discord.Net.Labs.Core - 3.1.1 Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png - 3.1.1 - 3.1.1 false From c28ceeb986c05e821bd49065484c2819c1d39326 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:32:43 -0300 Subject: [PATCH 306/494] Update deploy.yml --- azure/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure/deploy.yml b/azure/deploy.yml index cab5b35635..61994299ea 100644 --- a/azure/deploy.yml +++ b/azure/deploy.yml @@ -1,6 +1,6 @@ steps: - script: | - dotnet pack "src\Discord.Net.Core\Discord.Net.Core.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" --version-suffix=$(buildNumber) /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) + dotnet pack "src\Discord.Net.Core\Discord.Net.Core.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) dotnet pack "src\Discord.Net.Rest\Discord.Net.Rest.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) dotnet pack "src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) dotnet pack "src\Discord.Net.Commands\Discord.Net.Commands.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) From 9c914419ab59e6e77fa94800f2395f158eb15ed7 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:35:17 -0300 Subject: [PATCH 307/494] Removed versions from project files --- .../Discord.Net.Commands.csproj | 1 - src/Discord.Net.Rest/Discord.Net.Rest.csproj | 3 --- .../Discord - Backup.Net.WebSocket.csproj | 27 ------------------- .../Discord.Net.WebSocket.csproj | 3 --- .../Discord.Net.Webhook.csproj | 1 - 5 files changed, 35 deletions(-) delete mode 100644 src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 84bc5b84bb..4f6a47c156 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -7,7 +7,6 @@ A Discord.Net Labs extension adding support for bot commands. net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 - 3.0.1 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index fcc0054021..725feb766b 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -9,11 +9,8 @@ netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.1.1 Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs - 3.1.1 - 3.1.1 ..\Discord.Net.Rest\Discord.Net.Rest.xml diff --git a/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj deleted file mode 100644 index e3a5104e7c..0000000000 --- a/src/Discord.Net.WebSocket/Discord - Backup.Net.WebSocket.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Discord.Net.WebSocket - Discord.WebSocket - A core Discord.Net Labs library containing the WebSocket client and models. - net461;netstandard2.0;netstandard2.1 - netstandard2.0;netstandard2.1 - true - 2.3.1 - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png - Discord.Net.Labs.WebSocket - - - - - - - - True - - - - diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 4947db946d..992c789c55 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,7 +8,6 @@ net461;netstandard2.0;netstandard2.1 netstandard2.0;netstandard2.1 true - 3.1.1 https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png @@ -16,8 +15,6 @@ ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - 3.1.1 - 3.1.1 TRACE diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index cf9d10de1f..ac654d4a60 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -6,7 +6,6 @@ Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. netstandard2.0;netstandard2.1 - 3.0.0 Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs From d5805a09a34b0d02299ad9498447a798c758a76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Sun, 26 Sep 2021 22:20:50 +0200 Subject: [PATCH 308/494] 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 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8e4d28393..4074c1c170 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Discord.Net Labs -[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs) +[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000&logo=nuget)](https://www.nuget.org/packages/Discord.Net.Labs) [![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dvSfUTet3K) This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs From f63e2dda5416c6d36e4c12b6ba6e2ddbc4289dfa Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 27 Sep 2021 18:05:17 -0300 Subject: [PATCH 309/494] Fix Type not being set in SocketApplicationCommand --- .../Interaction/SocketBaseCommand/SocketApplicationCommand.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index f70f5b8a3e..93518ffb3b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -82,6 +82,7 @@ internal void Update(Model model) Description = model.Description; Name = model.Name; DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + Type = model.Type; Options = model.Options.IsSpecified ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() From 78879da5c1cf6a1a80bfb5de52826bfa32d45a20 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 27 Sep 2021 20:07:16 -0300 Subject: [PATCH 310/494] Remove useless GuildId property --- .../Entities/Interaction/SocketInteraction.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index c8e07bf97a..bd8962540b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -53,8 +53,6 @@ public DateTimeOffset CreatedAt public bool IsValidToken => CheckToken(); - private ulong? GuildId { get; set; } - internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) { @@ -93,8 +91,6 @@ internal virtual void Update(Model model) Data = model.Data.IsSpecified ? model.Data.Value : null; - - GuildId = model.GuildId.ToNullable(); Token = model.Token; Version = model.Version; Type = model.Type; @@ -103,7 +99,7 @@ internal virtual void Update(Model model) { if (model.Member.IsSpecified && model.GuildId.IsSpecified) { - User = SocketGuildUser.Create(Discord.State.GetGuild(GuildId.Value), Discord.State, model.Member.Value); + User = SocketGuildUser.Create(Discord.State.GetGuild(model.GuildId.Value), Discord.State, model.Member.Value); } else { From 7079749ae9c192dadfff7c0c4af06c5f95c9f8ae Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 27 Sep 2021 20:07:35 -0300 Subject: [PATCH 311/494] meta: update XML --- src/Discord.Net.Core/Discord.Net.Core.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index a046da6fba..c9ad2b1344 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -5976,7 +5976,8 @@ - A 1-100 length description of this slash command + A 1-100 length description of this slash command. + The description is not allowed to be null. From cd87664d71f6eb4628b57fc3178e048f132b4d62 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 30 Sep 2021 14:09:19 -0300 Subject: [PATCH 312/494] Add Autocomplete to SlashCommandOptionBuilder --- .../Slash Commands/SlashCommandBuilder.cs | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 16855b8189..ec0883981c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -208,20 +208,6 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t return AddOption(option); } - ///// - ///// Adds an option to the current slash command. - ///// - ///// The name of the option to add. - ///// The type of this option. - ///// The description of this option. - ///// If this option is required for this command. - ///// If this option is the default option. - ///// The choices of this option. - ///// The current builder. - //public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - // string description, bool required = true, bool isDefault = false, params ApplicationCommandOptionChoiceProperties[] choices) - // => AddOption(name, type, description, required, isDefault, null, choices); - /// /// Adds an option to the current slash command. /// @@ -400,7 +386,7 @@ public ApplicationCommandOptionProperties Build() /// The choices of this option. /// The current builder. public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? required = null, bool isDefault = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? required = null, bool isDefault = false, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -433,7 +419,8 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Default = isDefault, Options = options, Type = type, - Choices = choices != null ? new List(choices) : null + Choices = choices != null ? new List(choices) : null, + Autocomplete = isAutocomplete, }; return AddOption(option); @@ -567,6 +554,17 @@ public SlashCommandOptionBuilder WithDefault(bool value) return this; } + /// + /// Sets the current builders autocomplete field. + /// + /// The value to set. + /// The current builder. + public SlashCommandOptionBuilder WithAutocomplete(bool value) + { + Autocomplete = value; + return this; + } + /// /// Sets the current type of this builder. /// From e7cec9588a6c511d81ed5fe629de3cbe208300c2 Mon Sep 17 00:00:00 2001 From: Eugene Garbuzov Date: Thu, 30 Sep 2021 20:29:04 +0300 Subject: [PATCH 313/494] Added autocomplete in SlashCommandOptionBuilder. (#206) Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com> --- .../Interactions/Slash Commands/SlashCommandBuilder.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index ec0883981c..6d0f8d260e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -12,15 +12,15 @@ namespace Discord /// public class SlashCommandBuilder { - /// + /// /// Returns the maximun length a commands name allowed by Discord /// public const int MaxNameLength = 32; - /// - /// Returns the maximum length of a commands description allowed by Discord. + /// + /// Returns the maximum length of a commands description allowed by Discord. /// public const int MaxDescriptionLength = 100; - /// + /// /// Returns the maximum count of command options allowed by Discord /// public const int MaxOptionsCount = 25; @@ -382,6 +382,7 @@ public ApplicationCommandOptionProperties Build() /// The description of this option. /// If this option is required for this command. /// If this option is the default option. + /// If this option supports autocomplete. /// The options of the option to add. /// The choices of this option. /// The current builder. @@ -417,6 +418,7 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Description = description, Required = required, Default = isDefault, + Autocomplete = isAutocomplete, Options = options, Type = type, Choices = choices != null ? new List(choices) : null, From 3fda00312035d85062807a3096d7af038d1f17c0 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 30 Sep 2021 14:39:24 -0300 Subject: [PATCH 314/494] Fix duplicate autocomplete --- src/Discord.Net.Core/Discord.Net.Core.xml | 18 +++++++++++++----- .../Slash Commands/SlashCommandBuilder.cs | 1 - 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index c9ad2b1344..d748671c03 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -5955,17 +5955,17 @@ - + Returns the maximun length a commands name allowed by Discord - - Returns the maximum length of a commands description allowed by Discord. + + Returns the maximum length of a commands description allowed by Discord. - + Returns the maximum count of command options allowed by Discord @@ -6117,7 +6117,7 @@ The built version of this option. - + Adds an option to the current slash command. @@ -6126,6 +6126,7 @@ The description of this option. If this option is required for this command. If this option is the default option. + If this option supports autocomplete. The options of the option to add. The choices of this option. The current builder. @@ -6181,6 +6182,13 @@ The value to set. The current builder. + + + Sets the current builders autocomplete field. + + The value to set. + The current builder. + Sets the current type of this builder. diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 6d0f8d260e..624a7399b0 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -422,7 +422,6 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Options = options, Type = type, Choices = choices != null ? new List(choices) : null, - Autocomplete = isAutocomplete, }; return AddOption(option); From efc4cb44593779942bc01804f53300584e04062a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 30 Sep 2021 16:56:03 -0300 Subject: [PATCH 315/494] Fix #208 --- .../Slash Commands/SocketAutocompleteInteractionData.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index 06e313b44d..0da0332db1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -51,6 +51,9 @@ internal SocketAutocompleteInteractionData(DataModel model) Current = options.FirstOrDefault(x => x.Focused); Options = options.ToImmutableArray(); + if (Options?.Count == 1 && Current == null) + Current = Options.FirstOrDefault(); + CommandName = model.Name; CommandId = model.Id; Type = model.Type; From 4b1f875f43a97fc1417390db1b70ce0462c603bc Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 30 Sep 2021 17:32:31 -0300 Subject: [PATCH 316/494] Fix sub commands being interpreted as a parameter for autocomplete --- .../AutocompleteInteractionDataOption.cs | 7 +++++-- .../SocketAutocompleteInteractionData.cs | 20 +++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs index a9d5b66f0e..1ea3ad54a9 100644 --- a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs @@ -15,10 +15,13 @@ internal class AutocompleteInteractionDataOption [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("options")] + public Optional Options { get; set; } + [JsonProperty("value")] - public object Value { get; set; } + public Optional Value { get; set; } [JsonProperty("focused")] - public bool Focused { get; set; } + public Optional Focused { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index 0da0332db1..3777257f17 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -46,12 +46,12 @@ public class SocketAutocompleteInteractionData internal SocketAutocompleteInteractionData(DataModel model) { - var options = model.Options.Select(x => new AutocompleteOption(x.Type, x.Name, x.Value, x.Focused)); + var options = model.Options.SelectMany(x => GetOptions(x)); Current = options.FirstOrDefault(x => x.Focused); Options = options.ToImmutableArray(); - if (Options?.Count == 1 && Current == null) + if (options != null && options.Count() == 1 && Current == null) Current = Options.FirstOrDefault(); CommandName = model.Name; @@ -59,5 +59,21 @@ internal SocketAutocompleteInteractionData(DataModel model) Type = model.Type; Version = model.Version; } + + private List GetOptions(API.AutocompleteInteractionDataOption model) + { + List options = new List(); + + if (model.Options.IsSpecified) + { + options.AddRange(model.Options.Value.SelectMany(x => GetOptions(x))); + } + else if(model.Focused.IsSpecified) + { + options.Add(new AutocompleteOption(model.Type, model.Name, model.Value, model.Focused.Value)); + } + + return options; + } } } From cdbebb444794bd434c77808916865bf67379ce3c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 30 Sep 2021 17:40:04 -0300 Subject: [PATCH 317/494] Fix exposed optional --- .../Slash Commands/SocketAutocompleteInteractionData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index 3777257f17..04550fd439 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -70,7 +70,7 @@ private List GetOptions(API.AutocompleteInteractionDataOptio } else if(model.Focused.IsSpecified) { - options.Add(new AutocompleteOption(model.Type, model.Name, model.Value, model.Focused.Value)); + options.Add(new AutocompleteOption(model.Type, model.Name, model.Value.GetValueOrDefault(null), model.Focused.Value)); } return options; From 7de13bb272068932d795184a61b9f3f41ab78342 Mon Sep 17 00:00:00 2001 From: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com> Date: Fri, 1 Oct 2021 12:44:23 -0500 Subject: [PATCH 318/494] Support the discord:// protocol in buttons (#207) * Update UrlValidation.cs * Update ComponentBuilder.cs * Add docs and better error messages. * Fix wonky intentation --- .../Message Components/ComponentBuilder.cs | 2 +- src/Discord.Net.Core/Utils/UrlValidation.cs | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index b0050ee366..975363f586 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -596,7 +596,7 @@ public ButtonComponent Build() if (string.IsNullOrEmpty(Url)) throw new InvalidOperationException("Link buttons must have a link associated with them"); else - UrlValidation.Validate(Url); + UrlValidation.ValidateButton(Url); } else if (string.IsNullOrEmpty(CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs index f5d7d4ce76..fd1642f5ce 100644 --- a/src/Discord.Net.Core/Utils/UrlValidation.cs +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -6,6 +6,7 @@ static class UrlValidation { /// /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https + /// should be used for url buttons /// /// url to validate before sending to Discord. /// A URL must include a protocol (http or https). @@ -15,7 +16,25 @@ public static bool Validate(string url) if (string.IsNullOrEmpty(url)) return false; if(!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)))) - throw new InvalidOperationException($"Url {url} must be include its protocol (either HTTP or HTTPS)"); + throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP or HTTPS)"); + return true; + } + + /// + /// Not full URL validation right now. Just Ensures the protocol is either http, https, or discord + /// should be used everything other than url buttons + /// + /// the url to validate before sending to discord + /// A URL must include a protocol (either http, https, or discord). + /// true if the url is valid by our standard, false if null, throws an error upon invalid + public static bool ValidateButton(string url) + { + if (string.IsNullOrEmpty(url)) + return false; + if(!((url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) || + (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) || + (url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase)))) + throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP, HTTPS, or DISCORD)"); return true; } } From 9b7e3da745076f0ce88d049af2c419b3e5dc6f19 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Fri, 1 Oct 2021 13:44:55 -0400 Subject: [PATCH 319/494] Add competing activity status type (#205) * Update GuildPermissionsTests.cs * Update GuildPermissions.cs * Add competing status type --- src/Discord.Net.Core/Entities/Activities/ActivityType.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityType.cs b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs index 8c44f49e37..1f67886ebe 100644 --- a/src/Discord.Net.Core/Entities/Activities/ActivityType.cs +++ b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs @@ -25,5 +25,9 @@ public enum ActivityType /// The user has set a custom status. /// CustomStatus = 4, + /// + /// The user is competing in a game. + /// + Competing = 5, } } From 42b693c8ebe8a5e8f4e65f77293b82f9dfae1aeb Mon Sep 17 00:00:00 2001 From: Will Date: Fri, 1 Oct 2021 13:46:20 -0400 Subject: [PATCH 320/494] Add Icons to IRole (#204) * Added icon field to IRole * Added GetGuildRoleIconUrl() --- src/Discord.Net.Core/CDN.cs | 10 +++++++ src/Discord.Net.Core/Discord.Net.Core.xml | 26 +++++++++++++++++++ src/Discord.Net.Core/Entities/Roles/IRole.cs | 15 +++++++++++ src/Discord.Net.Rest/API/Common/Role.cs | 2 ++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 6 +++++ .../Entities/Roles/RestRole.cs | 7 +++++ .../Discord.Net.WebSocket.xml | 6 +++++ .../Entities/Roles/SocketRole.cs | 7 +++++ 8 files changed, 79 insertions(+) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index 78fba574f1..b170336dc1 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -86,6 +86,16 @@ public static string GetDefaultUserAvatarUrl(ushort discriminator) public static string GetGuildIconUrl(ulong guildId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}icons/{guildId}/{iconId}.jpg" : null; /// + /// Returns a guild role's icon URL. + /// + /// The role identifier. + /// The icon hash. + /// + /// A URL pointing to the guild role's icon. + /// + public static string GetGuildRoleIconUrl(ulong roleId, string roleHash) + => roleHash != null ? $"{DiscordConfig.CDNUrl}role-icons/{roleId}/{roleHash}.png" : null; + /// /// Returns a guild splash URL. /// /// The guild snowflake identifier. diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index d748671c03..30e0a417f9 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -131,6 +131,16 @@ A URL pointing to the guild's icon. + + + Returns a guild role's icon URL. + + The role identifier. + The icon hash. + + A URL pointing to the guild role's icon. + + Returns a guild splash URL. @@ -9646,6 +9656,14 @@ A string containing the name of this role. + + + Gets the icon of this role. + + + A string containing the hash of this role's icon. + + Gets the permissions granted to members of this role. @@ -9684,6 +9702,14 @@ A task that represents the asynchronous modification operation. + + + Gets the image url of the icon role. + + + An image url of the icon role. + + Properties that are used to reorder an . diff --git a/src/Discord.Net.Core/Entities/Roles/IRole.cs b/src/Discord.Net.Core/Entities/Roles/IRole.cs index c02322be94..c9e7ffef73 100644 --- a/src/Discord.Net.Core/Entities/Roles/IRole.cs +++ b/src/Discord.Net.Core/Entities/Roles/IRole.cs @@ -52,6 +52,13 @@ public interface IRole : ISnowflakeEntity, IDeletable, IMentionable, IComparable /// string Name { get; } /// + /// Gets the icon of this role. + /// + /// + /// A string containing the hash of this role's icon. + /// + string Icon { get; } + /// /// Gets the permissions granted to members of this role. /// /// @@ -86,5 +93,13 @@ public interface IRole : ISnowflakeEntity, IDeletable, IMentionable, IComparable /// A task that represents the asynchronous modification operation. /// Task ModifyAsync(Action func, RequestOptions options = null); + + /// + /// Gets the image url of the icon role. + /// + /// + /// An image url of the icon role. + /// + string GetIconUrl(); } } diff --git a/src/Discord.Net.Rest/API/Common/Role.cs b/src/Discord.Net.Rest/API/Common/Role.cs index 4c33956afe..09fb998856 100644 --- a/src/Discord.Net.Rest/API/Common/Role.cs +++ b/src/Discord.Net.Rest/API/Common/Role.cs @@ -8,6 +8,8 @@ internal class Role public ulong Id { get; set; } [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("icon")] + public string Icon { get; set; } [JsonProperty("color")] public uint Color { get; set; } [JsonProperty("hoist")] diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 91727936d7..78789b51ee 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4613,6 +4613,9 @@ + + + @@ -4639,6 +4642,9 @@ + + + diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index 69a2abe20f..8866fd282d 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -24,6 +24,8 @@ public class RestRole : RestEntity, IRole /// public string Name { get; private set; } /// + public string Icon { get; private set; } + /// public GuildPermissions Permissions { get; private set; } /// public int Position { get; private set; } @@ -53,6 +55,7 @@ internal static RestRole Create(BaseDiscordClient discord, IGuild guild, Model m internal void Update(Model model) { Name = model.Name; + Icon = model.Icon; IsHoisted = model.Hoist; IsManaged = model.Managed; IsMentionable = model.Mentionable; @@ -73,6 +76,10 @@ public async Task ModifyAsync(Action func, RequestOptions option public Task DeleteAsync(RequestOptions options = null) => RoleHelper.DeleteAsync(this, Discord, options); + /// + public string GetIconUrl() + => CDN.GetGuildRoleIconUrl(Id, Icon); + /// public int CompareTo(IRole role) => RoleUtils.Compare(this, role); diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index abf0c1bb21..ea9937cd14 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -4843,6 +4843,9 @@ + + + @@ -4877,6 +4880,9 @@ + + + Gets the name of the role. diff --git a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs index d9740338f5..40dc057cda 100644 --- a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs +++ b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs @@ -34,6 +34,8 @@ public class SocketRole : SocketEntity, IRole /// public string Name { get; private set; } /// + public string Icon { get; private set; } + /// public GuildPermissions Permissions { get; private set; } /// public int Position { get; private set; } @@ -72,6 +74,7 @@ internal static SocketRole Create(SocketGuild guild, ClientState state, Model mo internal void Update(ClientState state, Model model) { Name = model.Name; + Icon = model.Icon; IsHoisted = model.Hoist; IsManaged = model.Managed; IsMentionable = model.Mentionable; @@ -89,6 +92,10 @@ public Task ModifyAsync(Action func, RequestOptions options = nu public Task DeleteAsync(RequestOptions options = null) => RoleHelper.DeleteAsync(this, Discord, options); + /// + public string GetIconUrl() + => CDN.GetGuildRoleIconUrl(Id, Icon); + /// /// Gets the name of the role. /// From 2cf9896f7892abea405b02f200b6c9e97e3d5631 Mon Sep 17 00:00:00 2001 From: Emily <89871431+emillly-b@users.noreply.github.com> Date: Fri, 1 Oct 2021 12:48:33 -0500 Subject: [PATCH 321/494] Added Clean Content Function (#174) * Added Clean Content Function * Fixed Spelling problems and bad var handling * Add StripMarkDown Method --- src/Discord.Net.Core/Discord.Net.Core.xml | 7 +++++++ src/Discord.Net.Core/Format.cs | 13 +++++++++++++ .../Discord.Net.WebSocket.xml | 3 +++ .../Entities/Messages/SocketMessage.cs | 14 ++++++++++++++ test/Discord.Net.Tests.Unit/FormatTests.cs | 15 +++++++++++++++ 5 files changed, 52 insertions(+) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 30e0a417f9..64fbd9e239 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -11423,6 +11423,13 @@ The text to format. Gets the formatted block quote text. + + + Remove discord supported markdown from text. + + The to remove markdown from. + Gets the unformatted text. + This intent includes no events diff --git a/src/Discord.Net.Core/Format.cs b/src/Discord.Net.Core/Format.cs index 0ab70f89ca..320c3a5fbb 100644 --- a/src/Discord.Net.Core/Format.cs +++ b/src/Discord.Net.Core/Format.cs @@ -1,4 +1,5 @@ using System.Text; +using System.Text.RegularExpressions; namespace Discord { @@ -91,5 +92,17 @@ public static string BlockQuote(string text) return $">>> {text}"; } + + /// + /// Remove discord supported markdown from text. + /// + /// The to remove markdown from. + /// Gets the unformatted text. + public static string StripMarkDown(string text) + { + //Remove discord supported markdown + var newText = Regex.Replace(text, @"(\*|_|`|~|>|\\)", ""); + return newText; + } } } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index ea9937cd14..a1374578a3 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -4531,6 +4531,9 @@ + + + diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index acf60f3716..b86a2bbfad 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -38,6 +38,9 @@ public abstract class SocketMessage : SocketEntity, IMessage /// public string Content { get; private set; } + /// + public string CleanContent => SanitizeMessage(); + /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); /// @@ -139,7 +142,11 @@ internal virtual void Update(ClientState state, Model model) _timestampTicks = model.Timestamp.Value.UtcTicks; if (model.Content.IsSpecified) + { Content = model.Content.Value; + //Update CleanContent Property + SanitizeMessage(); + } if (model.Application.IsSpecified) { @@ -265,6 +272,13 @@ public Task DeleteAsync(RequestOptions options = null) /// IReadOnlyCollection IMessage.Stickers => Stickers; + internal string SanitizeMessage() + { + var newContent = MentionUtils.Resolve(this, 0, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize); + newContent = Format.StripMarkDown(newContent); + return newContent; + } + internal void AddReaction(SocketReaction reaction) { _reactions.Add(reaction); diff --git a/test/Discord.Net.Tests.Unit/FormatTests.cs b/test/Discord.Net.Tests.Unit/FormatTests.cs index 2a5adbaae7..8cb632b7ed 100644 --- a/test/Discord.Net.Tests.Unit/FormatTests.cs +++ b/test/Discord.Net.Tests.Unit/FormatTests.cs @@ -59,5 +59,20 @@ public void BlockQuote(string input, string expected) { Assert.Equal(expected, Format.BlockQuote(input)); } + + [Theory] + [InlineData("", "")] + [InlineData("\n", "\n")] + [InlineData("**hi**", "hi")] + [InlineData("__uwu__", "uwu")] + [InlineData(">>__uwu__", "uwu")] + [InlineData("```uwu```", "uwu")] + [InlineData("~uwu~", "uwu")] + [InlineData("berries __and__ *Cream**, i'm a little lad who loves berries and cream", "berries and Cream, i'm a little lad who loves berries and cream")] + public void StripMarkdown(string input, string expected) + { + var test = Format.StripMarkDown(input); + Assert.Equal(expected, test); + } } } From c073db1cec5630a1cd43a88dd702d6ee4eda2843 Mon Sep 17 00:00:00 2001 From: Emily <89871431+emillly-b@users.noreply.github.com> Date: Fri, 1 Oct 2021 22:54:17 -0500 Subject: [PATCH 322/494] Clean Content Expanded (#212) * Implement CleanContent In IMessage & RestMessage * Update Spelling and Documentation * Add SanatizeMessage to MessageHelper and Refactor Rest and Socket Message --- src/Discord.Net.Core/Discord.Net.Core.xml | 23 +++++++++++++++++++ .../Entities/Messages/IMessage.cs | 7 ++++++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 3 +++ .../Entities/Messages/MessageHelper.cs | 6 +++++ .../Entities/Messages/RestMessage.cs | 4 +++- .../Entities/Messages/SocketMessage.cs | 10 +------- 6 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 64fbd9e239..eb93d48c9c 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -508,6 +508,11 @@ The user has set a custom status. + + + The user is competing in a game. + + A user's activity for their custom status. @@ -7594,6 +7599,14 @@ A string that contains the body of the message; note that this field may be empty if there is an embed. + + + Gets the clean content for this message. + + + A string that contains the body of the message stripped of mentions, markdown, emojiis and pings; note that this field may be empty if there is an embed. + + Gets the time this message was sent. @@ -12920,10 +12933,20 @@ Not full URL validation right now. Just ensures protocol is present and that it's either http or https + should be used for url buttons url to validate before sending to Discord. A URL must include a protocol (http or https). true if url is valid by our standard, false if null, throws an error upon invalid + + + Not full URL validation right now. Just Ensures the protocol is either http, https, or discord + should be used everything other than url buttons + + the url to validate before sending to discord + A URL must include a protocol (either http, https, or discord). + true if the url is valid by our standard, false if null, throws an error upon invalid + diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index 39419f0683..c9bcb5f596 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -53,6 +53,13 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// string Content { get; } /// + /// Gets the clean content for this message. + /// + /// + /// A string that contains the body of the message stripped of mentions, markdown, emojiis and pings; note that this field may be empty if there is an embed. + /// + string CleanContent { get; } + /// /// Gets the time this message was sent. /// /// diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 78789b51ee..2f396dd1ba 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4299,6 +4299,9 @@ + + + diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index e10be2c0a0..8de9ccf32e 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -246,6 +246,12 @@ private static string UrlEncode(string text) return System.Web.HttpUtility.UrlEncode(text); #endif } + public static string SanitizeMessage(IMessage message) + { + var newContent = MentionUtils.Resolve(message, 0, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize); + newContent = Format.StripMarkDown(newContent); + return newContent; + } public static async Task PinAsync(IMessage msg, BaseDiscordClient client, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 09e262f006..d9bcc938e4 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -28,6 +28,9 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable /// public string Content { get; private set; } + /// + public string CleanContent => MessageHelper.SanitizeMessage(this); + /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); /// @@ -208,7 +211,6 @@ internal virtual void Update(Model model) else _reactions = ImmutableArray.Create(); } - /// public async Task UpdateAsync(RequestOptions options = null) { diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index b86a2bbfad..fe2c98db9f 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -39,7 +39,7 @@ public abstract class SocketMessage : SocketEntity, IMessage public string Content { get; private set; } /// - public string CleanContent => SanitizeMessage(); + public string CleanContent => MessageHelper.SanitizeMessage(this); /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -144,8 +144,6 @@ internal virtual void Update(ClientState state, Model model) if (model.Content.IsSpecified) { Content = model.Content.Value; - //Update CleanContent Property - SanitizeMessage(); } if (model.Application.IsSpecified) @@ -272,12 +270,6 @@ public Task DeleteAsync(RequestOptions options = null) /// IReadOnlyCollection IMessage.Stickers => Stickers; - internal string SanitizeMessage() - { - var newContent = MentionUtils.Resolve(this, 0, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize); - newContent = Format.StripMarkDown(newContent); - return newContent; - } internal void AddReaction(SocketReaction reaction) { From 34748c86c54f60629e8e31087e1ae4d4edb11c6f Mon Sep 17 00:00:00 2001 From: marens101 Date: Sat, 2 Oct 2021 15:53:27 +1000 Subject: [PATCH 323/494] Add event for autocomplete interaction (#214) --- src/Discord.Net.WebSocket/BaseSocketClient.Events.cs | 11 ++++++++++- src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml | 5 +++++ src/Discord.Net.WebSocket/DiscordShardedClient.cs | 1 + src/Discord.Net.WebSocket/DiscordSocketClient.cs | 3 +++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 58de002a01..b7bcfdf2e4 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -469,7 +469,7 @@ public event Func InviteDeleted #region Interactions /// - /// Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands. + /// Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands, autocompletes. /// /// /// @@ -535,6 +535,15 @@ public event Func MessageCommandExecuted remove => _messageCommandExecuted.Remove(value); } internal readonly AsyncEvent> _messageCommandExecuted = new AsyncEvent>(); + /// + /// Fired when an autocomplete is used and its interaction is received. + /// + public event Func AutocompleteExecuted + { + add => _autocompleteExecuted.Add(value); + remove => _autocompleteExecuted.Remove(value); + } + internal readonly AsyncEvent> _autocompleteExecuted = new AsyncEvent>(); /// /// Fired when a guild application command is created. diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index a1374578a3..5d2b36b917 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -746,6 +746,11 @@ Fired when a message command is used and its interaction is received. + + + Fired when an autocomplete is used and its interaction is received. + + Fired when a guild application command is created. diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index faafa918f4..613864fdc8 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -466,6 +466,7 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.SlashCommandExecuted += (arg) => _slashCommandExecuted.InvokeAsync(arg); client.UserCommandExecuted += (arg) => _userCommandExecuted.InvokeAsync(arg); client.MessageCommandExecuted += (arg) => _messageCommandExecuted.InvokeAsync(arg); + client.AutocompleteExecuted += (arg) => _autocompleteExecuted.InvokeAsync(arg); client.ThreadUpdated += (thread1, thread2) => _threadUpdated.InvokeAsync(thread1, thread2); client.ThreadCreated += (thread) => _threadCreated.InvokeAsync(thread); diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 1cd3debf49..596611b1ae 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2125,6 +2125,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty case SocketMessageCommand messageCommand: await TimedInvokeAsync(_messageCommandExecuted, nameof(MessageCommandExecuted), messageCommand).ConfigureAwait(false); break; + case SocketAutocompleteInteraction autocomplete: + await TimedInvokeAsync(_autocompleteExecuted, nameof(AutocompleteExecuted), autocomplete).ConfigureAwait(false); + break; } } else From 90986e991d07544178b2d5390e62edead9471612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Sun, 3 Oct 2021 15:39:22 +0200 Subject: [PATCH 324/494] Spelling corrections (#215) --- samples/02_commands_framework/Program.cs | 2 +- .../Services/CommandHandlingService.cs | 2 +- src/Discord.Net.Commands/Attributes/AliasAttribute.cs | 2 +- .../Builders/ModuleClassBuilder.cs | 2 +- src/Discord.Net.Commands/CommandService.cs | 2 +- src/Discord.Net.Commands/ModuleBase.cs | 2 +- src/Discord.Net.Commands/RunMode.cs | 2 +- src/Discord.Net.Core/Entities/Guilds/IGuild.cs | 8 ++++---- .../Context Menus/MessageCommandBuilder.cs | 2 +- .../Interactions/Context Menus/UserCommandBuilder.cs | 2 +- .../Entities/Interactions/IApplicationCommandOption.cs | 2 +- .../Entities/Interactions/IDiscordInteraction.cs | 4 ++-- .../Entities/Interactions/IDiscordInteractionData.cs | 2 +- .../Entities/Interactions/InteractionResponseType.cs | 4 ++-- .../Interactions/Slash Commands/SlashCommandBuilder.cs | 10 +++++----- .../Slash Commands/SlashCommandProperties.cs | 2 +- src/Discord.Net.Core/Entities/Messages/IMessage.cs | 2 +- src/Discord.Net.Core/Entities/Messages/TimestampTag.cs | 2 +- .../Entities/Permissions/ChannelPermissions.cs | 4 ++-- .../Entities/Permissions/GuildPermissions.cs | 2 +- .../Entities/Permissions/OverwritePermissions.cs | 2 +- .../Entities/Stickers/ICustomSticker.cs | 2 +- src/Discord.Net.Core/Extensions/MessageExtensions.cs | 4 ++-- src/Discord.Net.Core/Format.cs | 2 +- src/Discord.Net.Core/RequestOptions.cs | 4 ++-- .../Core/Entities/Channels/IMessageChannel.Examples.cs | 1 - src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- .../Entities/Channels/RestThreadChannel.cs | 6 +++--- src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs | 8 ++++---- .../Entities/Interactions/InteractionHelper.cs | 1 - .../Entities/Messages/CustomSticker.cs | 2 +- .../Entities/Messages/RestFollowupMessage.cs | 4 ++-- .../Entities/Messages/RestInteractionMessage.cs | 4 ++-- .../Entities/Webhooks/WebhookHelper.cs | 1 - src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs | 4 ++-- src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs | 2 +- .../Audio/Streams/BufferedWriteStream.cs | 2 +- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 6 +++--- src/Discord.Net.WebSocket/DiscordSocketConfig.cs | 2 +- .../Entities/Channels/SocketStageChannel.cs | 2 +- .../Entities/Guilds/SocketGuild.cs | 2 +- .../Message Commands/SocketMessageCommandData.cs | 2 +- .../Message Components/SocketMessageComponent.cs | 4 ++-- .../Slash Commands/SocketAutocompleteInteraction.cs | 2 +- .../SocketAutocompleteInteractionData.cs | 2 +- .../Slash Commands/SocketSlashCommandDataOption.cs | 2 +- .../Entities/Interaction/SocketInteraction.cs | 2 +- .../Entities/Stickers/SocketCustomSticker.cs | 2 +- test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs | 2 +- test/Discord.Net.Tests.Unit/FormatTests.cs | 2 +- 50 files changed, 70 insertions(+), 73 deletions(-) diff --git a/samples/02_commands_framework/Program.cs b/samples/02_commands_framework/Program.cs index 67cb877642..8a2f37dce2 100644 --- a/samples/02_commands_framework/Program.cs +++ b/samples/02_commands_framework/Program.cs @@ -39,7 +39,7 @@ public async Task MainAsync() services.GetRequiredService().Log += LogAsync; // Tokens should be considered secret data and never hard-coded. - // We can read from the environment variable to avoid hardcoding. + // We can read from the environment variable to avoid hard coding. await client.LoginAsync(TokenType.Bot, Environment.GetEnvironmentVariable("token")); await client.StartAsync(); diff --git a/samples/03_sharded_client/Services/CommandHandlingService.cs b/samples/03_sharded_client/Services/CommandHandlingService.cs index 1230cbcff3..adc91b12c0 100644 --- a/samples/03_sharded_client/Services/CommandHandlingService.cs +++ b/samples/03_sharded_client/Services/CommandHandlingService.cs @@ -54,7 +54,7 @@ public async Task CommandExecutedAsync(Optional command, ICommandCo if (!command.IsSpecified) return; - // the command was succesful, we don't care about this result, unless we want to log that a command succeeded. + // the command was successful, we don't care about this result, unless we want to log that a command succeeded. if (result.IsSuccess) return; diff --git a/src/Discord.Net.Commands/Attributes/AliasAttribute.cs b/src/Discord.Net.Commands/Attributes/AliasAttribute.cs index 16eb3ba738..c4b78f5341 100644 --- a/src/Discord.Net.Commands/Attributes/AliasAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/AliasAttribute.cs @@ -16,7 +16,7 @@ namespace Discord.Commands /// /// [Command("stats")] /// [Alias("stat", "info")] - /// public async Task GetStatsAsync(IUser user) + /// public Task GetStatsAsync(IUser user) /// { /// // ...pull stats /// } diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 59500439ac..8c10ae8065 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -291,7 +291,7 @@ internal static TypeReader GetTypeReader(CommandService service, Type paramType, return reader; } - //We dont have a cached type reader, create one + //We don't have a cached type reader, create one reader = ReflectionUtils.CreateObject(typeReaderType.GetTypeInfo(), service, services); service.AddTypeReader(paramType, reader, false); diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 468f7739f5..db08d0d79c 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -602,7 +602,7 @@ float CalculateScore(CommandMatch match, ParseResult parseResult) //If we get this far, at least one parse was successful. Execute the most likely overload. var chosenOverload = successfulParses[0]; var result = await chosenOverload.Key.ExecuteAsync(context, chosenOverload.Value, services).ConfigureAwait(false); - if (!result.IsSuccess && !(result is RuntimeResult || result is ExecuteResult)) // succesful results raise the event in CommandInfo#ExecuteInternalAsync (have to raise it there b/c deffered execution) + if (!result.IsSuccess && !(result is RuntimeResult || result is ExecuteResult)) // successful results raise the event in CommandInfo#ExecuteInternalAsync (have to raise it there b/c deferred execution) await _commandExecutedEvent.InvokeAsync(chosenOverload.Key.Command, context, result); return result; } diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index eb517e65d4..3eddc11d27 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -36,7 +36,7 @@ public abstract class ModuleBase : IModuleBase /// Specifies if notifications are sent for mentioned users and roles in the . /// If null, all mentioned roles and users will be notified. /// - /// The request options for this async request. + /// The request options for this request. /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. diff --git a/src/Discord.Net.Commands/RunMode.cs b/src/Discord.Net.Commands/RunMode.cs index 8e230b500d..d6b49065bd 100644 --- a/src/Discord.Net.Commands/RunMode.cs +++ b/src/Discord.Net.Commands/RunMode.cs @@ -8,7 +8,7 @@ namespace Discord.Commands public enum RunMode { /// - /// The default behaviour set in . + /// The default behavior set in . /// Default, /// diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 9b5d6b23af..275879a2c3 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -609,12 +609,12 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Task GetRulesChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); /// - /// Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + /// Gets the text channel where admins and moderators of Community guilds receive notices from Discord. /// /// The that determines whether the object should be fetched from cache. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous get operation. The task result contains the text channel channel where + /// A task that represents the asynchronous get operation. The task result contains the text channel where /// admins and moderators of Community guilds receive notices from Discord; if none is set. /// Task GetPublicUpdatesChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); @@ -834,7 +834,7 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Downloads all users for this guild if the current list is incomplete. /// /// - /// This method downloads all users found within this guild throught the Gateway and caches them. + /// This method downloads all users found within this guild through the Gateway and caches them. /// /// /// A task that represents the asynchronous download operation. @@ -1057,7 +1057,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// A task that represents the asynchronous get operation. The task result contains a read-only collection /// of application commands found within the guild. /// - Task> GetApplicationCommandsAsync (RequestOptions options = null); + Task> GetApplicationCommandsAsync(RequestOptions options = null); /// /// Gets an application command within this guild with the specified id. diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index 495301d006..c6433e969f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -13,7 +13,7 @@ namespace Discord public class MessageCommandBuilder { /// - /// Returns the maximun length a commands name allowed by Discord + /// Returns the maximum length a commands name allowed by Discord /// public const int MaxNameLength = 32; diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index 0758437563..7974374761 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -13,7 +13,7 @@ namespace Discord public class UserCommandBuilder { /// - /// Returns the maximun length a commands name allowed by Discord + /// Returns the maximum length a commands name allowed by Discord /// public const int MaxNameLength = 32; diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 0fc7fb4a3b..fe2a1d5972 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -22,7 +22,7 @@ public interface IApplicationCommandOption string Name { get; } /// - /// The discription of this command option, 1-100 character description. + /// The description of this command option, 1-100 character description. /// string Description { get; } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 0dea203eff..572e52a7ef 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -74,7 +74,7 @@ Task FollowupAsync (string text = null, Embed[] embeds = null, boo /// /// Gets the original response for this interaction. /// - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. Task GetOriginalResponseAsync (RequestOptions options = null); @@ -82,7 +82,7 @@ Task FollowupAsync (string text = null, Embed[] embeds = null, boo /// Edits original response for this interaction. /// /// A delegate containing the properties to modify the message with. - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. Task ModifyOriginalResponseAsync (Action func, RequestOptions options = null); diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs index 7083810b75..f55b46869d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs @@ -7,7 +7,7 @@ namespace Discord { /// - /// Represents an interface used to specify classes that they are a vaild dataype of a class. + /// Represents an interface used to specify classes that they are a vaild data type of a class. /// public interface IDiscordInteractionData { } } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index de30ad8688..20f052f8a2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -25,13 +25,13 @@ public enum InteractionResponseType : byte /// /// ACK a command without sending a message, eating the user's input. /// - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] + [Obsolete("This response type has been deprecated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] Acknowledge = 2, /// /// Respond with a message, showing the user's input. /// - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] + [Obsolete("This response type has been deprecated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] ChannelMessage = 3, /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 624a7399b0..3dca6a8d6f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -13,7 +13,7 @@ namespace Discord public class SlashCommandBuilder { /// - /// Returns the maximun length a commands name allowed by Discord + /// Returns the maximum length a commands name allowed by Discord /// public const int MaxNameLength = 32; /// @@ -178,7 +178,7 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); // same with description Preconditions.NotNullOrEmpty(description, nameof(description)); @@ -213,7 +213,7 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t /// /// The name of the option to add. /// The type of this option. - /// The sescription of this option. + /// The description of this option. /// The current builder. public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, string description) => AddOption(name, type, description, options: null, choices: null); @@ -294,7 +294,7 @@ public string Name if (value != null) if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) - throw new ArgumentException("Option name cannot contian any special characters or whitespaces!"); + throw new ArgumentException("Option name cannot contain any special characters or whitespaces!"); _name = value; } @@ -397,7 +397,7 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); // same with description Preconditions.NotNullOrEmpty(description, nameof(description)); diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs index e9b7222d4a..542170b94d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs @@ -13,7 +13,7 @@ public class SlashCommandProperties : ApplicationCommandProperties { internal override ApplicationCommandType Type => ApplicationCommandType.Slash; /// - /// The discription of this command. + /// The description of this command. /// public Optional Description { get; set; } diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index c9bcb5f596..af88554e71 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -56,7 +56,7 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// Gets the clean content for this message. /// /// - /// A string that contains the body of the message stripped of mentions, markdown, emojiis and pings; note that this field may be empty if there is an embed. + /// A string that contains the body of the message stripped of mentions, markdown, emojis and pings; note that this field may be empty if there is an embed. /// string CleanContent { get; } /// diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs index 829b35098a..21d30456f0 100644 --- a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs @@ -27,7 +27,7 @@ public class TimestampTag /// If the is null then the default 0 will be used. /// /// - /// A string thats compatable in a discord message, ex: <t:1625944201:f> + /// A string thats compatible in a discord message, ex: <t:1625944201:f> public override string ToString() { if (Time == null) diff --git a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs index 11130731e7..ee5c9984ad 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs @@ -85,7 +85,7 @@ public static ChannelPermissions All(IChannel channel) /// If true, a user may stream video in a voice channel. public bool Stream => Permissions.GetValue(RawValue, ChannelPermission.Stream); - /// If true, a user may adjust role permissions. This also implictly grants all other permissions. + /// If true, a user may adjust role permissions. This also implicitly grants all other permissions. public bool ManageRoles => Permissions.GetValue(RawValue, ChannelPermission.ManageRoles); /// If true, a user may edit the webhooks for this channel. public bool ManageWebhooks => Permissions.GetValue(RawValue, ChannelPermission.ManageWebhooks); @@ -103,7 +103,7 @@ public static ChannelPermissions All(IChannel channel) public bool UseExternalStickers => Permissions.GetValue(RawValue, ChannelPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. public bool SendMessagesInThreads => Permissions.GetValue(RawValue, ChannelPermission.SendMessagesInThreads); - /// If true, a user launch application activites in voice channels in this guild. + /// If true, a user launch application activities in voice channels in this guild. public bool StartEmbeddedActivities => Permissions.GetValue(RawValue, ChannelPermission.StartEmbeddedActivities); /// Creates a new with the provided packed value. diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 8924936a08..31f74ea224 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -97,7 +97,7 @@ public struct GuildPermissions public bool UseExternalStickers => Permissions.GetValue(RawValue, GuildPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. public bool SendMessagesInThreads => Permissions.GetValue(RawValue, GuildPermission.SendMessagesInThreads); - /// If true, a user launch application activites in voice channels in this guild. + /// If true, a user launch application activities in voice channels in this guild. public bool StartEmbeddedActivities => Permissions.GetValue(RawValue, GuildPermission.StartEmbeddedActivities); /// Creates a new with the provided packed value. diff --git a/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs b/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs index cff938465f..0e634ad1aa 100644 --- a/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs @@ -97,7 +97,7 @@ public static OverwritePermissions DenyAll(IChannel channel) public PermValue UseExternalStickers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. public PermValue SendMessagesInThreads => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SendMessagesInThreads); - /// If true, a user launch application activites in voice channels in this guild. + /// If true, a user launch application activities in voice channels in this guild. public PermValue StartEmbeddedActivities => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.StartEmbeddedActivities); /// Creates a new OverwritePermissions with the provided allow and deny packed values. diff --git a/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs index 03f4ac2eb3..ff06a43427 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs @@ -51,7 +51,7 @@ public interface ICustomSticker : ISticker /// Deletes the current sticker. /// /// - /// The bot neeeds the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. + /// The bot needs the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. /// /// The options to be used when sending the request. /// diff --git a/src/Discord.Net.Core/Extensions/MessageExtensions.cs b/src/Discord.Net.Core/Extensions/MessageExtensions.cs index 3b21c128ac..c187ecd5b1 100644 --- a/src/Discord.Net.Core/Extensions/MessageExtensions.cs +++ b/src/Discord.Net.Core/Extensions/MessageExtensions.cs @@ -24,7 +24,7 @@ public static string GetJumpUrl(this IMessage msg) /// Add multiple reactions to a message. /// /// - /// This method does not bulk add reactions! It will send a request for each reaction inculded. + /// This method does not bulk add reactions! It will send a request for each reaction included. /// /// /// @@ -76,7 +76,7 @@ public static async Task RemoveReactionsAsync(this IUserMessage msg, IUser user, /// /// Sends an inline reply that references a message. /// - /// The message that is being replyed on. + /// The message that is being replied on. /// The message to be sent. /// Determines whether the message should be read aloud by Discord or not. /// The to be sent. diff --git a/src/Discord.Net.Core/Format.cs b/src/Discord.Net.Core/Format.cs index 320c3a5fbb..63f9d15a6d 100644 --- a/src/Discord.Net.Core/Format.cs +++ b/src/Discord.Net.Core/Format.cs @@ -15,7 +15,7 @@ public static class Format public static string Italics(string text) => $"*{text}*"; /// Returns a markdown-formatted string with underline formatting. public static string Underline(string text) => $"__{text}__"; - /// Returns a markdown-formatted string with strikethrough formatting. + /// Returns a markdown-formatted string with strike-through formatting. public static string Strikethrough(string text) => $"~~{text}~~"; /// Returns a string with spoiler formatting. public static string Spoiler(string text) => $"||{text}||"; diff --git a/src/Discord.Net.Core/RequestOptions.cs b/src/Discord.Net.Core/RequestOptions.cs index 101925ab2d..46aa2681fd 100644 --- a/src/Discord.Net.Core/RequestOptions.cs +++ b/src/Discord.Net.Core/RequestOptions.cs @@ -16,10 +16,10 @@ public class RequestOptions public static RequestOptions Default => new RequestOptions(); /// - /// Gets or sets the maximum time to wait for for this request to complete. + /// Gets or sets the maximum time to wait for this request to complete. /// /// - /// Gets or set the max time, in milliseconds, to wait for for this request to complete. If + /// Gets or set the max time, in milliseconds, to wait for this request to complete. If /// null, a request will not time out. If a rate limit has been triggered for this request's bucket /// and will not be unpaused in time, this request will fail immediately. /// diff --git a/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs b/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs index 5f9d4b5d61..d920e97103 100644 --- a/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs +++ b/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs @@ -108,7 +108,6 @@ await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", using (channel.EnterTypingState()) await LongRunningAsync(); #endregion - } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 19fc82fcea..7afad65627 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -2227,7 +2227,7 @@ private static Func CreateBucketId(Expression> Array.Copy(elements, 0, methodArgs, 1, elements.Length); } - int endIndex = format.IndexOf('?'); //Dont include params + int endIndex = format.IndexOf('?'); //Don't include params if (endIndex == -1) endIndex = format.Length; diff --git a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs index d9b223f180..799d150b54 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs @@ -10,7 +10,7 @@ namespace Discord.Rest { /// - /// Represents a thread channel recieved over REST. + /// Represents a thread channel received over REST. /// public class RestThreadChannel : RestTextChannel, IThreadChannel { @@ -81,7 +81,7 @@ internal override void Update(Model model) /// The id of the user to fetch. /// The options to be used when sending the request. /// - /// A task representing the asyncronous get operation. The task returns a + /// A task representing the asynchronous get operation. The task returns a /// if found, otherwise . /// public new Task GetUserAsync(ulong userId, RequestOptions options = null) @@ -92,7 +92,7 @@ internal override void Update(Model model) /// /// The options to be used when sending the request. /// - /// A task representing the asyncronous get operation. The task returns a + /// A task representing the asynchronous get operation. The task returns a /// of 's. /// public new async Task> GetUsersAsync(RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 5e56fd56ec..7a14fa9df9 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -578,7 +578,7 @@ public async Task GetWidgetChannelAsync(RequestOptions options /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the text channel - /// where guild notices such as welcome messages and boost events are poste; if none is found. + /// where guild notices such as welcome messages and boost events are post; if none is found. /// public async Task GetSystemChannelAsync(RequestOptions options = null) { @@ -611,11 +611,11 @@ public async Task GetRulesChannelAsync(RequestOptions options = } /// - /// Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + /// Gets the text channel where admins and moderators of Community guilds receive notices from Discord. /// /// The options to be used when sending the request. /// - /// A task that represents the asynchronous get operation. The task result contains the text channel channel where + /// A task that represents the asynchronous get operation. The task result contains the text channel where /// admins and moderators of Community guilds receive notices from Discord; if none is set. /// public async Task GetPublicUpdatesChannelAsync(RequestOptions options = null) @@ -914,7 +914,7 @@ public Task> GetWebhooksAsync(RequestOptions op #region Interactions /// - /// Gets this guilds slash commands commands + /// Gets this guilds slash commands /// /// The options to be used when sending the request. /// diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 5dbf78f583..760fc8300d 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -1,7 +1,6 @@ using Discord.API; using Discord.API.Rest; using Discord.Net; -//using Discord.Rest.Entities.Interactions; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs index 94caf0f3fb..e0d3900fa9 100644 --- a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs @@ -26,7 +26,7 @@ public class CustomSticker : Sticker, ICustomSticker /// Gets the guild that this custom sticker is in. /// /// - /// Note: This property can be if the sticker wasnt fetched from a guild. + /// Note: This property can be if the sticker wasn't fetched from a guild. /// public RestGuild Guild { get; private set; } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs index 103c856be4..f1a03a3847 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs @@ -35,7 +35,7 @@ internal static RestFollowupMessage Create(BaseDiscordClient discord, Model mode } /// - /// Deletes this object and all of it's childern. + /// Deletes this object and all of it's children. /// /// A task that represents the asynchronous delete operation. public Task DeleteAsync() @@ -60,7 +60,7 @@ public Task DeleteAsync() /// A task that represents the asynchronous modification operation. /// /// The token used to modify/delete this message expired. - /// /// Somthing went wrong during the request. + /// /// Something went wrong during the request. public new async Task ModifyAsync(Action func, RequestOptions options = null) { try diff --git a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs index ae1b5f2fb2..51fc194834 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs @@ -31,7 +31,7 @@ internal static RestInteractionMessage Create(BaseDiscordClient discord, Model m } /// - /// Deletes this object and all of it's childern. + /// Deletes this object and all of it's children. /// /// A task that represents the asynchronous delete operation. public Task DeleteAsync() @@ -56,7 +56,7 @@ public Task DeleteAsync() /// A task that represents the asynchronous modification operation. /// /// The token used to modify/delete this message expired. - /// /// Somthing went wrong during the request. + /// /// Something went wrong during the request. public new async Task ModifyAsync(Action func, RequestOptions options = null) { try diff --git a/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs b/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs index 50e9cab78a..0b61b6c225 100644 --- a/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs +++ b/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs @@ -33,6 +33,5 @@ public static async Task DeleteAsync(IWebhook webhook, BaseDiscordClient client, { await client.ApiClient.DeleteWebhookAsync(webhook.Id, options).ConfigureAwait(false); } - } } diff --git a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs index 52fea021b3..88226914e1 100644 --- a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs +++ b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs @@ -435,7 +435,7 @@ private void UpdateRateLimit(int id, IRequest request, RateLimitInfo info, bool if (!hasQueuedReset || resetTick > _resetTick) { _resetTick = resetTick; - LastAttemptAt = resetTick.Value; //Make sure we dont destroy this until after its been reset + LastAttemptAt = resetTick.Value; //Make sure we don't destroy this until after its been reset #if DEBUG_LIMITS Debug.WriteLine($"[{id}] Reset in {(int)Math.Ceiling((resetTick - DateTimeOffset.UtcNow).Value.TotalMilliseconds)} ms"); #endif @@ -456,7 +456,7 @@ private async Task QueueReset(int id, int millis, IRequest request) lock (_lock) { millis = (int)Math.Ceiling((_resetTick.Value - DateTimeOffset.UtcNow).TotalMilliseconds); - if (millis <= 0) //Make sure we havent gotten a more accurate reset time + if (millis <= 0) //Make sure we haven't gotten a more accurate reset time { #if DEBUG_LIMITS Debug.WriteLine($"[{id}] * Reset *"); diff --git a/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs b/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs index 10479cdb29..fb910573ac 100644 --- a/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs +++ b/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs @@ -14,7 +14,7 @@ internal class ReadyEvent [JsonProperty("modes")] public string[] Modes { get; set; } [JsonProperty("heartbeat_interval")] - [Obsolete("This field is errorneous and should not be used", true)] + [Obsolete("This field is erroneous and should not be used", true)] public int HeartbeatInterval { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs index a2de252a2b..25afde7845 100644 --- a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs +++ b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs @@ -125,7 +125,7 @@ private Task Run() timestamp += OpusEncoder.FrameSamplesPerChannel; } #if DEBUG - var _ = _logger?.DebugAsync("Buffer underrun"); + var _ = _logger?.DebugAsync("Buffer under run"); #endif } } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 596611b1ae..ba788093db 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -51,7 +51,7 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient /// Provides access to a REST-only client with a shared state from this client. /// public override DiscordSocketRestClient Rest { get; } - /// Gets the shard of of this client. + /// Gets the shard of this client. public int ShardId { get; } /// Gets the current connection state of this client. public ConnectionState ConnectionState => _connection.State; @@ -438,7 +438,7 @@ public async Task CreateGlobalApplicationCommandAsync( var entity = State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(this, model)); - //Update it incase it was cached + //Update it in case it was cached entity.Update(model); return entity; @@ -1522,7 +1522,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } else { - //Edited message isnt in cache, create a detached one + //Edited message isn't in cache, create a detached one SocketUser author; if (data.Author.IsSpecified) { diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index e2e4f98976..6946a02b54 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -79,7 +79,7 @@ public class DiscordSocketConfig : DiscordRestConfig /// /// /// By default, the Discord gateway will only send offline members if a guild has less than a certain number - /// of members (determined by in this library). This behaviour is why + /// of members (determined by in this library). This behavior is why /// sometimes a user may be missing from the WebSocket cache for collections such as /// . /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index 1956a9b86f..ce529ca89f 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -11,7 +11,7 @@ namespace Discord.WebSocket { /// - /// Represents a stage channel recieved over the gateway. + /// Represents a stage channel received over the gateway. /// public class SocketStageChannel : SocketVoiceChannel, IStageChannel { diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index ccda12644a..4f595539e8 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1551,7 +1551,7 @@ private async Task DisconnectAudioInternalAsync() } internal async Task FinishConnectAudio(string url, string token) { - //TODO: Mem Leak: Disconnected/Connected handlers arent cleaned up + //TODO: Mem Leak: Disconnected/Connected handlers aren't cleaned up var voiceState = GetVoiceState(Discord.CurrentUser.Id).Value; await _audioLock.WaitAsync().ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs index e78da223d9..fc3be82b75 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs @@ -10,7 +10,7 @@ namespace Discord.WebSocket public class SocketMessageCommandData : SocketCommandBaseData { /// - /// Gets the messagte associated with this message command. + /// Gets the message associated with this message command. /// public SocketMessage Message => ResolvableData?.Messages.FirstOrDefault().Value; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 849ce4df8a..051a290e6f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -131,7 +131,7 @@ public override async Task RespondAsync( /// Updates the message which this component resides in with the type /// /// A delegate containing the properties to modify the message with. - /// The request options for this async request. + /// The request options for this request. /// A task that represents the asynchronous operation of updating the message. public async Task UpdateAsync(Action func, RequestOptions options = null) { @@ -330,7 +330,7 @@ public override async Task FollowupWithFileAsync( /// Defers an interaction and responds with type 5 () /// /// to send this message ephemerally, otherwise . - /// The request options for this async request. + /// The request options for this request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs index 0eb22f29d2..9164bfdd6f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs @@ -75,7 +75,7 @@ public Task RespondAsync(RequestOptions options = null, params AutocompleteResul /// - [Obsolete("Autocomplete interactions cannot be defered!", true)] + [Obsolete("Autocomplete interactions cannot be deferred!", true)] public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) => throw new NotSupportedException(); /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index 04550fd439..1f70cfa4bb 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -35,7 +35,7 @@ public class SocketAutocompleteInteractionData public ulong Version { get; } /// - /// Gets the current autocomplete option that is activly being filled out. + /// Gets the current autocomplete option that is actively being filled out. /// public AutocompleteOption Current { get; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index b2ea828561..6bd1c69e02 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -6,7 +6,7 @@ namespace Discord.WebSocket { /// - /// Represents a Websocket-based recieved by the gateway + /// Represents a Websocket-based received by the gateway /// public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOption { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index bd8962540b..b4297b4bdb 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -8,7 +8,7 @@ namespace Discord.WebSocket { /// - /// Represents an Interaction recieved over the gateway. + /// Represents an Interaction received over the gateway. /// public abstract class SocketInteraction : SocketEntity, IDiscordInteraction { diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index 9acc20a142..cfe12ebef5 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -23,7 +23,7 @@ public class SocketCustomSticker : SocketSticker, ICustomSticker /// /// /// This may return in the WebSocket implementation due to incomplete user collection in - /// large guilds, or the bot doesnt have the MANAGE_EMOJIS_AND_STICKERS permission. + /// large guilds, or the bot doesn't have the MANAGE_EMOJIS_AND_STICKERS permission. /// /// public SocketGuildUser Author diff --git a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs index 4d0cc8a558..83c6ede19e 100644 --- a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs +++ b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs @@ -171,7 +171,7 @@ IEnumerable GetValid() } /// - /// Tests that valid urls do not throw any exceptions. + /// Tests that valid url's do not throw any exceptions. /// /// The url to set. [Theory] diff --git a/test/Discord.Net.Tests.Unit/FormatTests.cs b/test/Discord.Net.Tests.Unit/FormatTests.cs index 8cb632b7ed..c015c7e155 100644 --- a/test/Discord.Net.Tests.Unit/FormatTests.cs +++ b/test/Discord.Net.Tests.Unit/FormatTests.cs @@ -68,7 +68,7 @@ public void BlockQuote(string input, string expected) [InlineData(">>__uwu__", "uwu")] [InlineData("```uwu```", "uwu")] [InlineData("~uwu~", "uwu")] - [InlineData("berries __and__ *Cream**, i'm a little lad who loves berries and cream", "berries and Cream, i'm a little lad who loves berries and cream")] + [InlineData("berries __and__ *Cream**, I'm a little lad who loves berries and cream", "berries and Cream, I'm a little lad who loves berries and cream")] public void StripMarkdown(string input, string expected) { var test = Format.StripMarkDown(input); From 5b9203f4e00b5412ecef64c10a5a788d2e087dac Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 4 Oct 2021 10:23:14 -0300 Subject: [PATCH 325/494] Remove null collections --- .../Entities/Interactions/RestApplicationCommand.cs | 2 +- .../Entities/Interactions/RestApplicationCommandOption.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 80ba284961..9dce4de137 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -65,7 +65,7 @@ internal virtual void Update(Model model) Options = model.Options.IsSpecified ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); } /// diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 511712d97a..362413c2cd 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -62,11 +62,11 @@ internal void Update(Model model) Options = model.Options.IsSpecified ? model.Options.Value.Select(x => Create(x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); Choices = model.Choices.IsSpecified ? model.Choices.Value.Select(x => new RestApplicationCommandChoice(x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); } #endregion From dc7e02fe1d51ad68cb6fa47bcd95bfad8330b676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hjorth=C3=B8j?= Date: Mon, 4 Oct 2021 16:56:06 +0200 Subject: [PATCH 326/494] 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 && --- .../Entities/Channels/ChannelHelper.cs | 6 ++++++ .../Message Components/SocketMessageComponent.cs | 6 +++--- .../Slash Commands/SocketAutocompleteInteraction.cs | 6 +++--- .../SocketBaseCommand/SocketCommandBase.cs | 13 +++++++++---- .../Entities/Interaction/SocketInteraction.cs | 10 +++++----- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index c5d264ade0..66f0b2539c 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -338,6 +338,9 @@ public static async Task SendFileAsync(IMessageChannel channel, string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler, Embed[] embeds) { string filename = Path.GetFileName(filePath); + if (filename == null || !filename.Contains('.')) + throw new ArgumentException("Make sure that the file path has a file name and a valid file extension."); + using (var file = File.OpenRead(filePath)) return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds).ConfigureAwait(false); } @@ -346,6 +349,9 @@ public static async Task SendFileAsync(IMessageChannel channel, public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler, Embed[] embeds) { + if (filename == null || !filename.Contains('.')) + throw new ArgumentException("Make sure that the file path has a file name and a valid file extension."); + embeds ??= Array.Empty(); if (embed != null) embeds = new[] { embed }.Concat(embeds).ToArray(); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 051a290e6f..2e48b6dd9c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -245,9 +245,9 @@ public override async Task FollowupAsync( /// public override async Task FollowupWithFileAsync( + Stream fileStream, + string fileName, string text = null, - Stream fileStream = null, - string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, @@ -287,8 +287,8 @@ public override async Task FollowupWithFileAsync( /// public override async Task FollowupWithFileAsync( + string filePath, string text = null, - string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs index 9164bfdd6f..fb6aa2a769 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs @@ -34,7 +34,7 @@ internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, internal new static SocketAutocompleteInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { - var entity = new SocketAutocompleteInteraction(client, model, channel); + var entity = new SocketAutocompleteInteraction(client, model, channel); entity.Update(model); return entity; } @@ -84,11 +84,11 @@ public Task RespondAsync(RequestOptions options = null, params AutocompleteResul /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupWithFileAsync(string text = null, Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupWithFileAsync(Stream fileStream, string fileName, string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupWithFileAsync(string text = null, string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupWithFileAsync(string filePath, string text = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); /// [Obsolete("Autocomplete interactions cannot have normal responses!", true)] diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index c2a7d5409b..189a51e41e 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -159,8 +159,8 @@ public override async Task FollowupAsync( /// public override async Task FollowupWithFileAsync( + Stream fileStream, string text = null, - Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, @@ -181,7 +181,7 @@ public override async Task FollowupWithFileAsync( Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNull(fileStream, nameof(fileStream), "File Stream must have data"); - Preconditions.NotNullOrWhitespace(fileName, nameof(fileName), "File Name must not be empty or null"); + Preconditions.NotNullOrEmpty(fileName, nameof(fileName), "File Name must not be empty or null"); var args = new API.Rest.CreateWebhookMessageParams { @@ -201,8 +201,8 @@ public override async Task FollowupWithFileAsync( /// public override async Task FollowupWithFileAsync( + string filePath, string text = null, - string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, @@ -222,7 +222,12 @@ public override async Task FollowupWithFileAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - Preconditions.NotNullOrWhitespace(filePath, nameof(filePath), "Path must exist"); + Preconditions.NotNullOrEmpty(filePath, nameof(filePath), "Path must exist"); + + fileName ??= Path.GetFileName(filePath); + + if (fileName == null || !fileName.Contains('.')) + throw new ArgumentException("Make sure that the file path has a file name and a valid file extension."); var args = new API.Rest.CreateWebhookMessageParams { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index b4297b4bdb..47b0ebcb6a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -157,7 +157,7 @@ public abstract Task FollowupAsync(string text = null, Embe /// /// The sent message. /// - public abstract Task FollowupWithFileAsync(string text = null, Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + public abstract Task FollowupWithFileAsync(Stream fileStream, string fileName, string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// @@ -176,13 +176,13 @@ public abstract Task FollowupWithFileAsync(string text = nu /// /// The sent message. /// - public abstract Task FollowupWithFileAsync(string text = null, string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + public abstract Task FollowupWithFileAsync(string filePath, string text = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// /// Gets the original response for this interaction. /// - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. public Task GetOriginalResponseAsync(RequestOptions options = null) => InteractionHelper.GetOriginalResponseAsync(Discord, Channel, this, options); @@ -191,7 +191,7 @@ public Task GetOriginalResponseAsync(RequestOptions opti /// Edits original response for this interaction. /// /// A delegate containing the properties to modify the message with. - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. public async Task ModifyOriginalResponseAsync(Action func, RequestOptions options = null) { @@ -203,7 +203,7 @@ public async Task ModifyOriginalResponseAsync(Action /// to send this message ephemerally, otherwise . - /// The request options for this async request. + /// The request options for this request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// From 3559c277fe33ead44468f8b6bd243dc6fc27e2e9 Mon Sep 17 00:00:00 2001 From: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com> Date: Mon, 4 Oct 2021 09:56:43 -0500 Subject: [PATCH 327/494] Add channel types in application command options. (#217) * add channel types in application command options * Indent Docs --- .../Discord.Net.Commands.xml | 6 +- src/Discord.Net.Core/Discord.Net.Core.xml | 76 ++++++++++++------- .../Interactions/ApplicationCommandOption.cs | 5 +- .../Interactions/IApplicationCommandOption.cs | 5 ++ .../Slash Commands/SlashCommandBuilder.cs | 35 ++++++++- .../API/Common/ApplicationCommandOption.cs | 9 +++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 29 ++++--- .../RestApplicationCommandOption.cs | 9 +++ .../Discord.Net.WebSocket.xml | 37 +++++---- .../SocketApplicationCommandOption.cs | 9 +++ 10 files changed, 158 insertions(+), 62 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml index 4ef47930e0..b24a8fdd00 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ b/src/Discord.Net.Commands/Discord.Net.Commands.xml @@ -19,7 +19,7 @@ [Command("stats")] [Alias("stat", "info")] - public async Task GetStatsAsync(IUser user) + public Task GetStatsAsync(IUser user) { // ...pull stats } @@ -1142,7 +1142,7 @@ Specifies if notifications are sent for mentioned users and roles in the . If null, all mentioned roles and users will be notified. - The request options for this async request. + The request options for this request. The message references to be included. Used to reply to specific messages. The message components to be included with this message. Used for interactions. A collection of stickers to send with the file. @@ -1468,7 +1468,7 @@ - The default behaviour set in . + The default behavior set in . diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index eb93d48c9c..a282147125 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -3600,12 +3600,12 @@ - Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + Gets the text channel where admins and moderators of Community guilds receive notices from Discord. The that determines whether the object should be fetched from cache. The options to be used when sending the request. - A task that represents the asynchronous get operation. The task result contains the text channel channel where + A task that represents the asynchronous get operation. The task result contains the text channel where admins and moderators of Community guilds receive notices from Discord; if none is set. @@ -3835,7 +3835,7 @@ Downloads all users for this guild if the current list is incomplete. - This method downloads all users found within this guild throught the Gateway and caches them. + This method downloads all users found within this guild through the Gateway and caches them. A task that represents the asynchronous download operation. @@ -4564,6 +4564,11 @@ Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. + + + Gets or sets the allowed channel types for this option. + + Represents a choice for a . This class is used when making new commands. @@ -4741,7 +4746,7 @@ - Returns the maximun length a commands name allowed by Discord + Returns the maximum length a commands name allowed by Discord @@ -4790,7 +4795,7 @@ - Returns the maximun length a commands name allowed by Discord + Returns the maximum length a commands name allowed by Discord @@ -4951,7 +4956,7 @@ - The discription of this command option, 1-100 character description. + The description of this command option, 1-100 character description. @@ -4974,6 +4979,11 @@ If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + The allowed channel types for this option. + + Specifies choices for command group. @@ -5056,7 +5066,7 @@ Gets the original response for this interaction. - The request options for this async request. + The request options for this request. A that represents the initial response. @@ -5064,7 +5074,7 @@ Edits original response for this interaction. A delegate containing the properties to modify the message with. - The request options for this async request. + The request options for this request. A that represents the initial response. @@ -5077,7 +5087,7 @@ - Represents an interface used to specify classes that they are a vaild dataype of a class. + Represents an interface used to specify classes that they are a vaild data type of a class. @@ -5971,7 +5981,7 @@ - Returns the maximun length a commands name allowed by Discord + Returns the maximum length a commands name allowed by Discord @@ -6034,7 +6044,7 @@ The default permission value to set. The current builder. - + Adds an option to the current slash command. @@ -6045,6 +6055,7 @@ If this option is the default option. If this option is set to autocompleate. The options of the option to add. + The allowed channel types for this option. The choices of this option. The current builder. @@ -6054,7 +6065,7 @@ The name of the option to add. The type of this option. - The sescription of this option. + The description of this option. The current builder. @@ -6126,13 +6137,18 @@ Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. + + + Gets or sets the allowed channel types for this option. + + Builds the current option. The built version of this option. - + Adds an option to the current slash command. @@ -6143,6 +6159,7 @@ If this option is the default option. If this option supports autocomplete. The options of the option to add. + The allowed channel types for this option. The choices of this option. The current builder. @@ -6169,6 +6186,13 @@ The value of the choice. The current builder. + + + Adds a channnel type to the current option. + + The to add. + The current builder. + Sets the current builders name. @@ -6218,7 +6242,7 @@ - The discription of this command. + The description of this command. @@ -7604,7 +7628,7 @@ Gets the clean content for this message. - A string that contains the body of the message stripped of mentions, markdown, emojiis and pings; note that this field may be empty if there is an embed. + A string that contains the body of the message stripped of mentions, markdown, emojis and pings; note that this field may be empty if there is an embed. @@ -8407,7 +8431,7 @@ If the is null then the default 0 will be used. - A string thats compatable in a discord message, ex: <t:1625944201:f> + A string thats compatible in a discord message, ex: <t:1625944201:f> @@ -8778,7 +8802,7 @@ If true, a user may stream video in a voice channel. - If true, a user may adjust role permissions. This also implictly grants all other permissions. + If true, a user may adjust role permissions. This also implicitly grants all other permissions. If true, a user may edit the webhooks for this channel. @@ -8805,7 +8829,7 @@ If true, a user may send messages in threads in this guild. - If true, a user launch application activites in voice channels in this guild. + If true, a user launch application activities in voice channels in this guild. Creates a new with the provided packed value. @@ -9222,7 +9246,7 @@ If true, a user may send messages in threads in this guild. - If true, a user launch application activites in voice channels in this guild. + If true, a user launch application activities in voice channels in this guild. Creates a new with the provided packed value. @@ -9396,7 +9420,7 @@ If true, a user may send messages in threads in this guild. - If true, a user launch application activites in voice channels in this guild. + If true, a user launch application activities in voice channels in this guild. Creates a new OverwritePermissions with the provided allow and deny packed values. @@ -9892,7 +9916,7 @@ Deletes the current sticker. - The bot neeeds the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. + The bot needs the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. The options to be used when sending the request. @@ -11189,7 +11213,7 @@ Add multiple reactions to a message. - This method does not bulk add reactions! It will send a request for each reaction inculded. + This method does not bulk add reactions! It will send a request for each reaction included. @@ -11234,7 +11258,7 @@ Sends an inline reply that references a message. - The message that is being replyed on. + The message that is being replied on. The message to be sent. Determines whether the message should be read aloud by Discord or not. The to be sent. @@ -11405,7 +11429,7 @@ Returns a markdown-formatted string with underline formatting. - Returns a markdown-formatted string with strikethrough formatting. + Returns a markdown-formatted string with strike-through formatting. Returns a string with spoiler formatting. @@ -12242,10 +12266,10 @@ - Gets or sets the maximum time to wait for for this request to complete. + Gets or sets the maximum time to wait for this request to complete. - Gets or set the max time, in milliseconds, to wait for for this request to complete. If + Gets or set the max time, in milliseconds, to wait for this request to complete. If null, a request will not time out. If a rate limit has been triggered for this request's bucket and will not be unpaused in time, this request will fail immediately. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index cca832874e..5b5353999c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -81,6 +81,9 @@ public string Description /// public List Options { get; set; } - + /// + /// Gets or sets the allowed channel types for this option. + /// + public List ChannelTypes { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index fe2a1d5972..79bc5bd626 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -45,5 +45,10 @@ public interface IApplicationCommandOption /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// IReadOnlyCollection? Options { get; } + + /// + /// The allowed channel types for this option. + /// + IReadOnlyCollection? ChannelTypes { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 3dca6a8d6f..7402a6e66a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -165,10 +165,12 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// If this option is the default option. /// If this option is set to autocompleate. /// The options of the option to add. + /// The allowed channel types for this option. /// The choices of this option. /// The current builder. public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? required = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? required = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, + List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -202,7 +204,8 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t Options = options, Type = type, Autocomplete = isAutocomplete, - Choices = choices != null ? new List(choices) : null + Choices = choices != null ? new List(choices) : null, + ChannelTypes = channelTypes, }; return AddOption(option); @@ -347,6 +350,11 @@ public string Description /// public List Options { get; set; } + /// + /// Gets or sets the allowed channel types for this option. + /// + public List ChannelTypes { get; set; } + /// /// Builds the current option. /// @@ -370,7 +378,8 @@ public ApplicationCommandOptionProperties Build() Type = Type, Options = Options?.Count > 0 ? new List(Options.Select(x => x.Build())) : null, Choices = Choices, - Autocomplete = Autocomplete + Autocomplete = Autocomplete, + ChannelTypes = ChannelTypes }; } @@ -384,10 +393,12 @@ public ApplicationCommandOptionProperties Build() /// If this option is the default option. /// If this option supports autocomplete. /// The options of the option to add. + /// The allowed channel types for this option. /// The choices of this option. /// The current builder. public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? required = null, bool isDefault = false, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? required = null, bool isDefault = false, bool isAutocomplete = false, List options = null, + List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -422,6 +433,7 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Options = options, Type = type, Choices = choices != null ? new List(choices) : null, + ChannelTypes = channelTypes, }; return AddOption(option); @@ -510,6 +522,21 @@ public SlashCommandOptionBuilder AddChoice(string name, string value) return this; } + /// + /// Adds a channnel type to the current option. + /// + /// The to add. + /// The current builder. + public SlashCommandOptionBuilder AddChannelType(ChannelType channelType) + { + if (ChannelTypes == null) + ChannelTypes = new List(); + + ChannelTypes.Add(channelType); + + return this; + } + /// /// Sets the current builders name. /// diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 93ee2e9b53..8c617582b7 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -33,6 +33,9 @@ internal class ApplicationCommandOption [JsonProperty("autocomplete")] public Optional Autocomplete { get; set; } + [JsonProperty("channel_types")] + public Optional ChannelTypes { get; set; } + public ApplicationCommandOption() { } public ApplicationCommandOption(IApplicationCommandOption cmd) @@ -45,6 +48,8 @@ public ApplicationCommandOption(IApplicationCommandOption cmd) Options = cmd.Options.Select(x => new ApplicationCommandOption(x)).ToArray(); + ChannelTypes = cmd.ChannelTypes.ToArray(); + Required = cmd.Required.HasValue ? cmd.Required.Value : Optional.Unspecified; @@ -78,6 +83,10 @@ public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties optio ? option.Default.Value : Optional.Unspecified; + ChannelTypes = option.ChannelTypes != null + ? option.ChannelTypes.ToArray() + : Optional.Unspecified; + Name = option.Name; Type = option.Type; Description = option.Description; diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 2f396dd1ba..4352d4f1f6 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2637,7 +2637,7 @@ - Represents a thread channel recieved over REST. + Represents a thread channel received over REST. @@ -2673,7 +2673,7 @@ The id of the user to fetch. The options to be used when sending the request. - A task representing the asyncronous get operation. The task returns a + A task representing the asynchronous get operation. The task returns a if found, otherwise . @@ -2683,7 +2683,7 @@ The options to be used when sending the request. - A task representing the asyncronous get operation. The task returns a + A task representing the asynchronous get operation. The task returns a of 's. @@ -3298,7 +3298,7 @@ The options to be used when sending the request. A task that represents the asynchronous get operation. The task result contains the text channel - where guild notices such as welcome messages and boost events are poste; if none is found. + where guild notices such as welcome messages and boost events are post; if none is found. @@ -3313,11 +3313,11 @@ - Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + Gets the text channel where admins and moderators of Community guilds receive notices from Discord. The options to be used when sending the request. - A task that represents the asynchronous get operation. The task result contains the text channel channel where + A task that represents the asynchronous get operation. The task result contains the text channel where admins and moderators of Community guilds receive notices from Discord; if none is set. @@ -3562,7 +3562,7 @@ - Gets this guilds slash commands commands + Gets this guilds slash commands The options to be used when sending the request. @@ -4029,6 +4029,11 @@ A collection of 's for this command. + + + The allowed channel types for this option. + + Represents a Rest-based global application command. @@ -4191,7 +4196,7 @@ Gets the guild that this custom sticker is in. - Note: This property can be if the sticker wasnt fetched from a guild. + Note: This property can be if the sticker wasn't fetched from a guild. @@ -4221,7 +4226,7 @@ - Deletes this object and all of it's childern. + Deletes this object and all of it's children. A task that represents the asynchronous delete operation. @@ -4245,7 +4250,7 @@ A task that represents the asynchronous modification operation. The token used to modify/delete this message expired. - /// Somthing went wrong during the request. + /// Something went wrong during the request. @@ -4254,7 +4259,7 @@ - Deletes this object and all of it's childern. + Deletes this object and all of it's children. A task that represents the asynchronous delete operation. @@ -4278,7 +4283,7 @@ A task that represents the asynchronous modification operation. The token used to modify/delete this message expired. - /// Somthing went wrong during the request. + /// Something went wrong during the request. diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 362413c2cd..60241c3723 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -39,6 +39,11 @@ public class RestApplicationCommandOption : IApplicationCommandOption /// public IReadOnlyCollection Options { get; private set; } + /// + /// The allowed channel types for this option. + /// + public IReadOnlyCollection ChannelTypes { get; private set; } + internal RestApplicationCommandOption() { } internal static RestApplicationCommandOption Create(Model model) @@ -67,6 +72,10 @@ internal void Update(Model model) Choices = model.Choices.IsSpecified ? model.Choices.Value.Select(x => new RestApplicationCommandChoice(x)).ToImmutableArray() : ImmutableArray.Create(); + + ChannelTypes = model.ChannelTypes.IsSpecified + ? model.ChannelTypes.Value.ToImmutableArray() + : ImmutableArray.Create(); } #endregion diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 5d2b36b917..5086cff498 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -709,7 +709,7 @@ - Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands. + Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands, autocompletes. @@ -746,11 +746,11 @@ Fired when a message command is used and its interaction is received. - - - Fired when an autocomplete is used and its interaction is received. - - + + + Fired when an autocomplete is used and its interaction is received. + + Fired when a guild application command is created. @@ -1009,7 +1009,7 @@ - Gets the shard of of this client. + Gets the shard of this client. Gets the current connection state of this client. @@ -1373,7 +1373,7 @@ By default, the Discord gateway will only send offline members if a guild has less than a certain number - of members (determined by in this library). This behaviour is why + of members (determined by in this library). This behavior is why sometimes a user may be missing from the WebSocket cache for collections such as . @@ -2265,7 +2265,7 @@ - Represents a stage channel recieved over the gateway. + Represents a stage channel received over the gateway. @@ -3869,7 +3869,7 @@ - Gets the messagte associated with this message command. + Gets the message associated with this message command. @@ -3927,7 +3927,7 @@ Updates the message which this component resides in with the type A delegate containing the properties to modify the message with. - The request options for this async request. + The request options for this request. A task that represents the asynchronous operation of updating the message. @@ -3944,7 +3944,7 @@ Defers an interaction and responds with type 5 () to send this message ephemerally, otherwise . - The request options for this async request. + The request options for this request. A task that represents the asynchronous operation of acknowledging the interaction. @@ -4056,7 +4056,7 @@ - Gets the current autocomplete option that is activly being filled out. + Gets the current autocomplete option that is actively being filled out. @@ -4081,7 +4081,7 @@ - Represents a Websocket-based recieved by the gateway + Represents a Websocket-based received by the gateway @@ -4189,6 +4189,11 @@ If the option is a subcommand or subcommand group type, this nested options will be the parameters. + + + The allowed channel types for this option. + + Base class for User, Message, and Slash command interactions. @@ -4249,7 +4254,7 @@ - Represents an Interaction recieved over the gateway. + Represents an Interaction received over the gateway. @@ -4920,7 +4925,7 @@ This may return in the WebSocket implementation due to incomplete user collection in - large guilds, or the bot doesnt have the MANAGE_EMOJIS_AND_STICKERS permission. + large guilds, or the bot doesn't have the MANAGE_EMOJIS_AND_STICKERS permission. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs index 08b2757cd4..836088638a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs @@ -38,6 +38,11 @@ public class SocketApplicationCommandOption : IApplicationCommandOption /// public IReadOnlyCollection Options { get; private set; } + /// + /// The allowed channel types for this option. + /// + public IReadOnlyCollection ChannelTypes { get; private set; } + internal SocketApplicationCommandOption() { } internal static SocketApplicationCommandOption Create(Model model) { @@ -67,6 +72,10 @@ internal void Update(Model model) Options = model.Options.IsSpecified ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() : new ImmutableArray(); + + ChannelTypes = model.ChannelTypes.IsSpecified + ? model.ChannelTypes.Value.ToImmutableArray() + : new ImmutableArray(); } IReadOnlyCollection IApplicationCommandOption.Choices => Choices; From a20b2b6ee7515b646e80174f277d343462c95e13 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 4 Oct 2021 12:02:53 -0300 Subject: [PATCH 328/494] Stage instance audit logs as well as thread audit log type --- .../Entities/AuditLogs/ActionType.cs | 12 ++++ src/Discord.Net.Rest/API/Common/AuditLog.cs | 8 ++- .../API/Common/AuditLogEntry.cs | 2 +- .../Entities/AuditLogs/AuditLogHelper.cs | 3 +- .../Entities/AuditLogs/DataTypes/StageInfo.cs | 36 ++++++++++++ .../StageInstanceCreateAuditLogData.cs | 55 +++++++++++++++++++ .../StageInstanceDeleteAuditLogData.cs | 55 +++++++++++++++++++ .../StageInstanceUpdatedAuditLogData.cs | 55 +++++++++++++++++++ 8 files changed, 223 insertions(+), 3 deletions(-) create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs diff --git a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs index b016a4c50b..5092b4e7fb 100644 --- a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs +++ b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs @@ -180,5 +180,17 @@ public enum ActionType /// A sticker was deleted. /// StickerDeleted = 92, + /// + /// A thread was created. + /// + ThreadCreate = 110, + /// + /// A thread was updated. + /// + ThreadUpdate = 111, + /// + /// A thread was deleted. + /// + ThreadDelete = 112 } } diff --git a/src/Discord.Net.Rest/API/Common/AuditLog.cs b/src/Discord.Net.Rest/API/Common/AuditLog.cs index cd8ad147d9..c8bd6d3e2e 100644 --- a/src/Discord.Net.Rest/API/Common/AuditLog.cs +++ b/src/Discord.Net.Rest/API/Common/AuditLog.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; namespace Discord.API { @@ -7,6 +7,12 @@ internal class AuditLog [JsonProperty("webhooks")] public Webhook[] Webhooks { get; set; } + [JsonProperty("threads")] + public Channel[] Threads { get; set; } + + [JsonProperty("integrations")] + public Integration[] Integrations { get; set; } + [JsonProperty("users")] public User[] Users { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs index 7458a19cbf..9626ad67ec 100644 --- a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs +++ b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; namespace Discord.API { diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs index 6969172038..b3aaf582cc 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Model = Discord.API.AuditLog; @@ -51,6 +51,7 @@ private static readonly Dictionary + /// Represents information for a stage. + /// + public class StageInfo + { + /// + /// Gets the topic of the stage channel. + /// + public string Topic { get; } + + /// + /// Gets the privacy level of the stage channel. + /// + public StagePrivacyLevel? PrivacyLevel { get; } + + /// + /// Gets the user who started the stage channel. + /// + public IUser User { get; } + + internal StageInfo(IUser user, StagePrivacyLevel? level, string topic) + { + this.Topic = topic; + this.PrivacyLevel = level; + this.User = user; + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs new file mode 100644 index 0000000000..d2e2ffdc87 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a stage going live. + /// + public class StageInstanceCreateAuditLogData : IAuditLogData + { + /// + /// Gets the topic of the stage channel. + /// + public string Topic { get; } + + /// + /// Gets the privacy level of the stage channel. + /// + public StagePrivacyLevel PrivacyLevel { get; } + + /// + /// Gets the user who started the stage channel. + /// + public IUser User { get; } + + /// + /// Gets the Id of the stage channel. + /// + public ulong StageChannelId { get; } + + internal StageInstanceCreateAuditLogData(string topic, StagePrivacyLevel privacyLevel, IUser user, ulong channelId) + { + Topic = topic; + PrivacyLevel = privacyLevel; + User = user; + StageChannelId = channelId; + } + + internal static StageInstanceCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic").NewValue.ToObject(discord.ApiClient.Serializer); + var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level").NewValue.ToObject(discord.ApiClient.Serializer); + var user = log.Users.FirstOrDefault(x => x.Id == entry.UserId); + var channelId = entry.Options.ChannelId; + + return new StageInstanceCreateAuditLogData(topic, privacyLevel, RestUser.Create(discord, user), channelId ?? 0); + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs new file mode 100644 index 0000000000..0681628b40 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a stage instance deleted. + /// + public class StageInstanceDeleteAuditLogData + { + /// + /// Gets the topic of the stage channel. + /// + public string Topic { get; } + + /// + /// Gets the privacy level of the stage channel. + /// + public StagePrivacyLevel PrivacyLevel { get; } + + /// + /// Gets the user who started the stage channel. + /// + public IUser User { get; } + + /// + /// Gets the Id of the stage channel. + /// + public ulong StageChannelId { get; } + + internal StageInstanceDeleteAuditLogData(string topic, StagePrivacyLevel privacyLevel, IUser user, ulong channelId) + { + Topic = topic; + PrivacyLevel = privacyLevel; + User = user; + StageChannelId = channelId; + } + + internal static StageInstanceDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic").OldValue.ToObject(discord.ApiClient.Serializer); + var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level").OldValue.ToObject(discord.ApiClient.Serializer); + var user = log.Users.FirstOrDefault(x => x.Id == entry.UserId); + var channelId = entry.Options.ChannelId; + + return new StageInstanceDeleteAuditLogData(topic, privacyLevel, RestUser.Create(discord, user), channelId ?? 0); + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs new file mode 100644 index 0000000000..0e26a829f5 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a stage instance update. + /// + public class StageInstanceUpdatedAuditLogData + { + /// + /// Gets the Id of the stage channel. + /// + public ulong StageChannelId { get; } + + /// + /// Gets the stage information before the changes. + /// + public StageInfo Before { get; } + + /// + /// Gets the stage information after the changes. + /// + public StageInfo After { get; } + + internal StageInstanceUpdatedAuditLogData(ulong channelId, StageInfo before, StageInfo after) + { + StageChannelId = channelId; + Before = before; + After = after; + } + + internal static StageInstanceUpdatedAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var channelId = entry.Options.ChannelId.Value; + + var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic"); + var privacy = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy"); + + var user = RestUser.Create(discord, log.Users.FirstOrDefault(x => x.Id == entry.UserId)); + + var oldTopic = topic?.OldValue.ToObject(); + var newTopic = topic?.NewValue.ToObject(); + var oldPrivacy = privacy?.OldValue.ToObject(); + var newPrivacy = privacy?.NewValue.ToObject(); + + return new StageInstanceUpdatedAuditLogData(channelId, new StageInfo(user, oldPrivacy, oldTopic), new StageInfo(user, newPrivacy, newTopic)); + } + } +} From 4f9b1b239066d601fa0dd84a6a642d73058bb695 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Mon, 4 Oct 2021 13:40:51 -0300 Subject: [PATCH 329/494] Update azure-pipelines.yml --- azure-pipelines.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 177f91d33b..89e0c9df36 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,7 +14,8 @@ trigger: jobs: - job: Linux - pool: default + pool: + vmImage: 'ubuntu-latest' steps: - template: azure/build.yml From 4c70cdafd1aa0b90d58f84db0f243c5bb8969c8c Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Mon, 4 Oct 2021 13:53:55 -0300 Subject: [PATCH 330/494] Update azure-pipelines.yml --- azure-pipelines.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 89e0c9df36..07c8372b9c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,8 +19,17 @@ jobs: steps: - template: azure/build.yml -- job: Linux_deploy - pool: default +- job: Windows_build + pool: + vmImage: 'windows-latest' + condition: ne(variables['Build.SourceBranch'], 'refs/heads/release/3.x') + steps: + - template: azure/build.yml + + +- job: Windows_deploy + pool: + vmImage: 'windows-latest' condition: | and ( succeeded(), From b828dd6866f96e4451ff96172c8cc89797cf2d4c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 4 Oct 2021 23:49:18 -0300 Subject: [PATCH 331/494] Fix system messages not including mentioned users. Added ContextMenuCommand message type --- src/Discord.Net.Core/Discord.Net.Core.xml | 32 +++++- .../Entities/Messages/MessageType.cs | 16 ++- src/Discord.Net.Rest/API/Common/Message.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 105 ++++++++++++++++-- .../Entities/Messages/RestMessage.cs | 25 ++++- .../Entities/Messages/RestUserMessage.cs | 21 +--- .../Discord.Net.WebSocket.xml | 35 +++--- .../Entities/Messages/SocketMessage.cs | 37 ++++-- .../Entities/Messages/SocketUserMessage.cs | 27 +---- 9 files changed, 202 insertions(+), 98 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index a282147125..bdcea9de98 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1085,6 +1085,21 @@ A sticker was deleted. + + + A thread was created. + + + + + A thread was updated. + + + + + A thread was deleted. + + Represents data applied to an . @@ -4981,7 +4996,7 @@ - The allowed channel types for this option. + The allowed channel types for this option. @@ -8286,15 +8301,15 @@ The message is an inline reply. - Only available in API v8 + Only available in API v8. - The message is an Application Command + The message is an Application Command. - Only available in API v8 + Only available in API v8. @@ -8302,12 +8317,17 @@ The message that starts a thread. - Only available in API v9 + Only available in API v9. - The message for a invite reminder + The message for a invite reminder. + + + + + The message for a context menu command. diff --git a/src/Discord.Net.Core/Entities/Messages/MessageType.cs b/src/Discord.Net.Core/Entities/Messages/MessageType.cs index de30d80474..b83f884347 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageType.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageType.cs @@ -81,26 +81,30 @@ public enum MessageType /// The message is an inline reply. /// /// - /// Only available in API v8 + /// Only available in API v8. /// Reply = 19, /// - /// The message is an Application Command + /// The message is an Application Command. /// /// - /// Only available in API v8 + /// Only available in API v8. /// ApplicationCommand = 20, /// /// The message that starts a thread. /// /// - /// Only available in API v9 + /// Only available in API v9. /// ThreadStarterMessage = 21, /// - /// The message for a invite reminder + /// The message for a invite reminder. /// - GuildInviteReminder = 22 + GuildInviteReminder = 22, + /// + /// The message for a context menu command. + /// + ContextMenuCommand = 23, } } diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index 3b9e5379a4..c19dc89422 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -32,7 +32,7 @@ internal class Message [JsonProperty("mention_everyone")] public Optional MentionEveryone { get; set; } [JsonProperty("mentions")] - public Optional[]> UserMentions { get; set; } + public Optional UserMentions { get; set; } [JsonProperty("mention_roles")] public Optional RoleMentions { get; set; } [JsonProperty("attachments")] diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 4352d4f1f6..52da1a0bd1 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -1507,6 +1507,96 @@ A role information object containing the role information after the changes were made. + + + Represents information for a stage. + + + + + Gets the topic of the stage channel. + + + + + Gets the privacy level of the stage channel. + + + + + Gets the user who started the stage channel. + + + + + Contains a piece of audit log data related to a stage going live. + + + + + Gets the topic of the stage channel. + + + + + Gets the privacy level of the stage channel. + + + + + Gets the user who started the stage channel. + + + + + Gets the Id of the stage channel. + + + + + Contains a piece of audit log data related to a stage instance deleted. + + + + + Gets the topic of the stage channel. + + + + + Gets the privacy level of the stage channel. + + + + + Gets the user who started the stage channel. + + + + + Gets the Id of the stage channel. + + + + + Contains a piece of audit log data related to a stage instance update. + + + + + Gets the Id of the stage channel. + + + + + Gets the stage information before the changes. + + + + + Gets the stage information after the changes. + + Contains a piece of audit log data related to an unban. @@ -4031,7 +4121,7 @@ - The allowed channel types for this option. + The allowed channel types for this option. @@ -4341,11 +4431,6 @@ - - - Gets a collection of the mentioned users in the message. - - @@ -4373,6 +4458,11 @@ + + + Gets a collection of the mentioned users in the message. + + @@ -4478,9 +4568,6 @@ - - - diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index d9bcc938e4..22b1095499 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -15,6 +15,7 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable { private long _timestampTicks; private ImmutableArray _reactions = ImmutableArray.Create(); + private ImmutableArray _userMentions = ImmutableArray.Create(); /// public IMessageChannel Channel { get; } @@ -56,10 +57,6 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable public virtual IReadOnlyCollection MentionedChannelIds => ImmutableArray.Create(); /// public virtual IReadOnlyCollection MentionedRoleIds => ImmutableArray.Create(); - /// - /// Gets a collection of the mentioned users in the message. - /// - public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); /// @@ -80,6 +77,10 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable /// public IReadOnlyCollection Components { get; private set; } + /// + /// Gets a collection of the mentioned users in the message. + /// + public IReadOnlyCollection MentionedUsers => _userMentions; internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source) : base(discord, id) @@ -210,6 +211,22 @@ internal virtual void Update(Model model) } else _reactions = ImmutableArray.Create(); + + if (model.UserMentions.IsSpecified) + { + var value = model.UserMentions.Value; + if (value.Length > 0) + { + var newMentions = ImmutableArray.CreateBuilder(value.Length); + for (int i = 0; i < value.Length; i++) + { + var val = value[i]; + if (val != null) + newMentions.Add(RestUser.Create(Discord, val)); + } + _userMentions = newMentions.ToImmutable(); + } + } } /// public async Task UpdateAsync(RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs index e6f3ac30d4..083a8e72c3 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs @@ -20,7 +20,6 @@ public class RestUserMessage : RestMessage, IUserMessage private ImmutableArray _embeds = ImmutableArray.Create(); private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentionIds = ImmutableArray.Create(); - private ImmutableArray _userMentions = ImmutableArray.Create(); private ImmutableArray _stickers = ImmutableArray.Create(); /// @@ -42,8 +41,6 @@ public class RestUserMessage : RestMessage, IUserMessage /// public override IReadOnlyCollection MentionedRoleIds => _roleMentionIds; /// - public override IReadOnlyCollection MentionedUsers => _userMentions; - /// public override IReadOnlyCollection Tags => _tags; /// public override IReadOnlyCollection Stickers => _stickers; @@ -104,28 +101,12 @@ internal override void Update(Model model) _embeds = ImmutableArray.Create(); } - if (model.UserMentions.IsSpecified) - { - var value = model.UserMentions.Value; - if (value.Length > 0) - { - var newMentions = ImmutableArray.CreateBuilder(value.Length); - for (int i = 0; i < value.Length; i++) - { - var val = value[i]; - if (val.Object != null) - newMentions.Add(RestUser.Create(Discord, val.Object)); - } - _userMentions = newMentions.ToImmutable(); - } - } - var guildId = (Channel as IGuildChannel)?.GuildId; var guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; if (model.Content.IsSpecified) { var text = model.Content.Value; - _tags = MessageHelper.ParseTags(text, null, guild, _userMentions); + _tags = MessageHelper.ParseTags(text, null, guild, MentionedUsers); model.Content = text; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 5086cff498..79f9cc2cf7 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -3933,7 +3933,7 @@ - + @@ -4020,7 +4020,7 @@ - + @@ -4191,7 +4191,7 @@ - The allowed channel types for this option. + The allowed channel types for this option. @@ -4220,7 +4220,7 @@ - + @@ -4326,7 +4326,7 @@ The sent message. - + Sends a followup message for this interaction. @@ -4366,7 +4366,7 @@ Gets the original response for this interaction. - The request options for this async request. + The request options for this request. A that represents the initial response. @@ -4374,7 +4374,7 @@ Edits original response for this interaction. A delegate containing the properties to modify the message with. - The request options for this async request. + The request options for this request. A that represents the initial response. @@ -4382,7 +4382,7 @@ Acknowledges this interaction. to send this message ephemerally, otherwise . - The request options for this async request. + The request options for this request. A task that represents the asynchronous operation of acknowledging the interaction. @@ -4612,14 +4612,6 @@ Collection of WebSocket-based roles. - - - Returns the users mentioned in this message. - - - Collection of WebSocket-based users. - - @@ -4629,6 +4621,14 @@ + + + Returns the users mentioned in this message. + + + Collection of WebSocket-based users. + + @@ -4801,9 +4801,6 @@ - - - diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index fe2c98db9f..a287610f5c 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -17,6 +17,7 @@ public abstract class SocketMessage : SocketEntity, IMessage #region SocketMessage private long _timestampTicks; private readonly List _reactions = new List(); + private ImmutableArray _userMentions = ImmutableArray.Create(); /// /// Gets the author of this message. @@ -100,19 +101,19 @@ public abstract class SocketMessage : SocketEntity, IMessage /// Collection of WebSocket-based roles. /// public virtual IReadOnlyCollection MentionedRoles => ImmutableArray.Create(); - /// - /// Returns the users mentioned in this message. - /// - /// - /// Collection of WebSocket-based users. - /// - public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); /// public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); /// public IReadOnlyDictionary Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); + /// + /// Returns the users mentioned in this message. + /// + /// + /// Collection of WebSocket-based users. + /// + public IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); /// public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); @@ -230,6 +231,28 @@ internal virtual void Update(ClientState state, Model model) else Components = new List(); + if (model.UserMentions.IsSpecified) + { + var value = model.UserMentions.Value; + if (value.Length > 0) + { + var newMentions = ImmutableArray.CreateBuilder(value.Length); + for (int i = 0; i < value.Length; i++) + { + var val = value[i]; + if (val != null) + { + var user = Channel.GetUserAsync(val.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; + if (user != null) + newMentions.Add(user); + else + newMentions.Add(SocketUnknownUser.Create(Discord, state, val)); + } + } + _userMentions = newMentions.ToImmutable(); + } + } + if (model.Flags.IsSpecified) Flags = model.Flags.Value; } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 7ff55c6138..e8f5604c4c 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -22,7 +22,6 @@ public class SocketUserMessage : SocketMessage, IUserMessage private ImmutableArray _embeds = ImmutableArray.Create(); private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentions = ImmutableArray.Create(); - private ImmutableArray _userMentions = ImmutableArray.Create(); private ImmutableArray _stickers = ImmutableArray.Create(); /// @@ -46,8 +45,6 @@ public class SocketUserMessage : SocketMessage, IUserMessage /// public override IReadOnlyCollection MentionedRoles => _roleMentions; /// - public override IReadOnlyCollection MentionedUsers => _userMentions; - /// public override IReadOnlyCollection Stickers => _stickers; /// public IUserMessage ReferencedMessage => _referencedMessage; @@ -108,32 +105,10 @@ internal override void Update(ClientState state, Model model) _embeds = ImmutableArray.Create(); } - if (model.UserMentions.IsSpecified) - { - var value = model.UserMentions.Value; - if (value.Length > 0) - { - var newMentions = ImmutableArray.CreateBuilder(value.Length); - for (int i = 0; i < value.Length; i++) - { - var val = value[i]; - if (val.Object != null) - { - var user = Channel.GetUserAsync(val.Object.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; - if (user != null) - newMentions.Add(user); - else - newMentions.Add(SocketUnknownUser.Create(Discord, state, val.Object)); - } - } - _userMentions = newMentions.ToImmutable(); - } - } - if (model.Content.IsSpecified) { var text = model.Content.Value; - _tags = MessageHelper.ParseTags(text, Channel, guild, _userMentions); + _tags = MessageHelper.ParseTags(text, Channel, guild, MentionedUsers); model.Content = text; } From 190e9eb02d5cb51880d4cecd61da059b0f0c3abd Mon Sep 17 00:00:00 2001 From: d4n3436 Date: Mon, 4 Oct 2021 21:57:48 -0500 Subject: [PATCH 332/494] Remove file extension check (#218) --- src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs | 7 +------ .../Interaction/SocketBaseCommand/SocketCommandBase.cs | 4 +--- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 66f0b2539c..d02e273de9 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -338,9 +338,6 @@ public static async Task SendFileAsync(IMessageChannel channel, string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler, Embed[] embeds) { string filename = Path.GetFileName(filePath); - if (filename == null || !filename.Contains('.')) - throw new ArgumentException("Make sure that the file path has a file name and a valid file extension."); - using (var file = File.OpenRead(filePath)) return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds).ConfigureAwait(false); } @@ -349,9 +346,6 @@ public static async Task SendFileAsync(IMessageChannel channel, public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler, Embed[] embeds) { - if (filename == null || !filename.Contains('.')) - throw new ArgumentException("Make sure that the file path has a file name and a valid file extension."); - embeds ??= Array.Empty(); if (embed != null) embeds = new[] { embed }.Concat(embeds).ToArray(); @@ -359,6 +353,7 @@ public static async Task SendFileAsync(IMessageChannel channel, Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.NotNullOrEmpty(filename, nameof(filename), "File Name must not be empty or null"); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 189a51e41e..8677a4a32a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -225,9 +225,7 @@ public override async Task FollowupWithFileAsync( Preconditions.NotNullOrEmpty(filePath, nameof(filePath), "Path must exist"); fileName ??= Path.GetFileName(filePath); - - if (fileName == null || !fileName.Contains('.')) - throw new ArgumentException("Make sure that the file path has a file name and a valid file extension."); + Preconditions.NotNullOrEmpty(fileName, nameof(fileName), "File Name must not be empty or null"); var args = new API.Rest.CreateWebhookMessageParams { From 447ab1ee1e443a58aa74ee2af94eeef925434e9b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 5 Oct 2021 00:15:44 -0300 Subject: [PATCH 333/494] Fix NRE in modify guild channel --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 7afad65627..1f23b92242 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -387,8 +387,12 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyT Preconditions.NotNull(args, nameof(args)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); - Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); - Preconditions.LessThan(args.Topic.Value.Length, 1024, nameof(args.Name)); + + if(args.Name.IsSpecified) + Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); + if(args.Topic.IsSpecified) + Preconditions.LessThan(args.Topic.Value.Length, 1024, nameof(args.Name)); + Preconditions.AtLeast(args.SlowModeInterval, 0, nameof(args.SlowModeInterval)); Preconditions.AtMost(args.SlowModeInterval, 21600, nameof(args.SlowModeInterval)); options = RequestOptions.CreateOrClone(options); From 169010e32a2c840948fe03805ca2852e89a9d168 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 5 Oct 2021 00:43:29 -0300 Subject: [PATCH 334/494] Fix 429's not being accounted for in ratelimit updates --- src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs index 88226914e1..52debd87fb 100644 --- a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs +++ b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs @@ -355,7 +355,7 @@ private void UpdateRateLimit(int id, IRequest request, RateLimitInfo info, bool if (info.Limit.HasValue && WindowCount != info.Limit.Value) { WindowCount = info.Limit.Value; - _semaphore = info.Remaining.Value; + _semaphore = is429 ? 0 : info.Remaining.Value; #if DEBUG_LIMITS Debug.WriteLine($"[{id}] Upgraded Semaphore to {info.Remaining.Value}/{WindowCount}"); #endif From 87af1212c410b5f331236da47099aa6ef7fcd596 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 6 Oct 2021 20:22:34 -0300 Subject: [PATCH 335/494] meta: add net5 framework Co-Authored-By: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> --- docs/docfx.json | 65 ++++++++++--------- .../02_commands_framework.csproj | 2 +- .../03_sharded_client.csproj | 2 +- samples/idn/idn.csproj | 2 +- .../Discord.Net.Analyzers.csproj | 4 +- .../Discord.Net.Commands.csproj | 4 +- src/Discord.Net.Core/Discord.Net.Core.csproj | 23 +++++-- .../Discord.Net.Examples.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +- .../Discord.Net.WebSocket.csproj | 8 ++- .../Discord.Net.Webhook.csproj | 5 +- .../Discord.Net.Analyzers.Tests.csproj | 6 +- .../Discord.Net.Tests.Integration.csproj | 4 +- .../Discord.Net.Tests.Unit.csproj | 4 +- 14 files changed, 78 insertions(+), 59 deletions(-) diff --git a/docs/docfx.json b/docs/docfx.json index 759dc174f8..424b951bc8 100644 --- a/docs/docfx.json +++ b/docs/docfx.json @@ -1,19 +1,22 @@ { - "metadata": [{ - "src": [{ - "src": "../src", - "files": [ - "**.csproj" - ] - }], - "dest": "api", - "filter": "filterConfig.yml", - "properties": { - "TargetFramework": "netstandard2.0" + "metadata": [ + { + "src": [ + { + "src": "../src", + "files": ["**.csproj"] + } + ], + "dest": "api", + "filter": "filterConfig.yml", + "properties": { + "TargetFramework": "net5.0" + } } - }], + ], "build": { - "content": [{ + "content": [ + { "files": ["api/**.yml", "api/index.md"] }, { @@ -27,19 +30,21 @@ }, { "src": "../", - "files": [ "CHANGELOG.md" ] + "files": ["CHANGELOG.md"] + } + ], + "resource": [ + { + "files": [ + "**/images/**", + "**/samples/**", + "langwordMapping.yml", + "marketing/logo/**.svg", + "marketing/logo/**.png", + "favicon.ico" + ] } ], - "resource": [{ - "files": [ - "**/images/**", - "**/samples/**", - "langwordMapping.yml", - "marketing/logo/**.svg", - "marketing/logo/**.png", - "favicon.ico" - ] - }], "dest": "_site", "template": [ "default", @@ -47,17 +52,19 @@ "_template/last-modified", "_template/description-generator" ], - "postProcessors": ["ExtractSearchIndex", "LastModifiedPostProcessor", "DescriptionPostProcessor"], + "postProcessors": [ + "ExtractSearchIndex", + "LastModifiedPostProcessor", + "DescriptionPostProcessor" + ], "overwrite": "_overwrites/**/**.md", "globalMetadata": { "_appTitle": "Discord.Net Documentation", "_appFooter": "Discord.Net (c) 2015-2020 2.2.0", "_enableSearch": true, "_appLogoPath": "marketing/logo/SVG/Logomark Purple.svg", - "_appFaviconPath": "favicon.ico" + "_appFaviconPath": "favicon.ico" }, - "xrefService": [ - "https://xref.docs.microsoft.com/query?uid={uid}" - ] + "xrefService": ["https://xref.docs.microsoft.com/query?uid={uid}"] } } diff --git a/samples/02_commands_framework/02_commands_framework.csproj b/samples/02_commands_framework/02_commands_framework.csproj index 151e546a2f..83a62f8d74 100644 --- a/samples/02_commands_framework/02_commands_framework.csproj +++ b/samples/02_commands_framework/02_commands_framework.csproj @@ -6,7 +6,7 @@ - + diff --git a/samples/03_sharded_client/03_sharded_client.csproj b/samples/03_sharded_client/03_sharded_client.csproj index 24f9942f96..91cacef646 100644 --- a/samples/03_sharded_client/03_sharded_client.csproj +++ b/samples/03_sharded_client/03_sharded_client.csproj @@ -7,7 +7,7 @@ - + diff --git a/samples/idn/idn.csproj b/samples/idn/idn.csproj index 984c863839..f982ff86d9 100644 --- a/samples/idn/idn.csproj +++ b/samples/idn/idn.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj index cfaf67d345..ae4f7a78c3 100644 --- a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj +++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj @@ -1,4 +1,4 @@ - + Discord.Net.Analyzers @@ -10,7 +10,7 @@ ..\Discord.Net.Analyzers\Discord.Net.Analyzers.xml - + diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 4f6a47c156..ce4d0dd3df 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -5,8 +5,8 @@ Discord.Net.Commands Discord.Commands A Discord.Net Labs extension adding support for bot commands. - net461;netstandard2.0;netstandard2.1 - netstandard2.0;netstandard2.1 + net5.0;net461;netstandard2.0;netstandard2.1 + net5.0;netstandard2.0;netstandard2.1 Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 036717e8dc..8888332ae5 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,12 +1,12 @@ - + Discord.Net.Core Discord The core components for the Discord.Net Labs library. - net461;netstandard2.0;netstandard2.1 - netstandard2.0;netstandard2.1 + net5.0;net461;netstandard2.0;netstandard2.1 + net5.0;netstandard2.0;netstandard2.1 Discord.Net.Labs.Core Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs @@ -17,12 +17,21 @@ ..\Discord.Net.Core\Discord.Net.Core.xml - - - - + + + all + + + + + + + + + + diff --git a/src/Discord.Net.Examples/Discord.Net.Examples.csproj b/src/Discord.Net.Examples/Discord.Net.Examples.csproj index ec02534280..3371432b83 100644 --- a/src/Discord.Net.Examples/Discord.Net.Examples.csproj +++ b/src/Discord.Net.Examples/Discord.Net.Examples.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 725feb766b..b280cfd4f6 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -1,12 +1,12 @@ - + Discord.Net.Rest Discord.Rest A core Discord.Net Labs library containing the REST client and models. - net461;netstandard2.0;netstandard2.1 - netstandard2.0;netstandard2.1 + net5.0;net461;netstandard2.0;netstandard2.1 + net5.0;netstandard2.0;netstandard2.1 Temporary.png https://github.com/Discord-Net-Labs/Discord.Net-Labs Discord.Net.Labs.Rest diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 992c789c55..f6af62a12e 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -1,17 +1,19 @@ - + Discord.Net.WebSocket Discord.WebSocket A core Discord.Net Labs library containing the WebSocket client and models. - net461;netstandard2.0;netstandard2.1 - netstandard2.0;netstandard2.1 + net5.0;net461;netstandard2.0;netstandard2.1 + net5.0;netstandard2.0;netstandard2.1 true https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs Temporary.png Discord.Net.Labs.WebSocket + PackageReference + true ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index ac654d4a60..7ccc7cfb91 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -1,11 +1,12 @@ - + Discord.Net.Webhook Discord.Webhook A core Discord.Net Labs library containing the Webhook client and models. - netstandard2.0;netstandard2.1 + net5.0;net461;netstandard2.0;netstandard2.1 + net5.0;netstandard2.0;netstandard2.1 Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj b/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj index 8f69672f9e..1257041e4f 100644 --- a/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj +++ b/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj @@ -15,10 +15,10 @@ - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj b/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj index c571059ef3..8b16b29713 100644 --- a/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj +++ b/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj @@ -15,9 +15,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj b/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj index 8660416968..716c3ebc41 100644 --- a/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj +++ b/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj @@ -13,9 +13,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive From b898df99db71074ab07083be0ddfd2c3b7e7c391 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Wed, 6 Oct 2021 20:03:24 -0400 Subject: [PATCH 336/494] Proper doc logos (#221) * Update GuildPermissionsTests.cs * Update GuildPermissions.cs * Add competing activity status type * logo changes * logo text as path * add missing logo --- .../SVG/Combinationmark White Background.svg | 59 +++++++++++++++++- .../logo/SVG/Combinationmark White.svg | 61 ++++++++++++++++++- docs/marketing/logo/SVG/Combinationmark.svg | 59 +++++++++++++++++- .../logo/SVG/Logomark Full Black.svg | 42 ++++++++++++- .../logo/SVG/Logomark Full Purple.svg | 42 ++++++++++++- 5 files changed, 258 insertions(+), 5 deletions(-) diff --git a/docs/marketing/logo/SVG/Combinationmark White Background.svg b/docs/marketing/logo/SVG/Combinationmark White Background.svg index 01c984d3b2..5f59df1a57 100644 --- a/docs/marketing/logo/SVG/Combinationmark White Background.svg +++ b/docs/marketing/logo/SVG/Combinationmark White Background.svg @@ -1 +1,58 @@ -Combinationmark White Background \ No newline at end of file + + + + +Combinationmark White Background + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/marketing/logo/SVG/Combinationmark White.svg b/docs/marketing/logo/SVG/Combinationmark White.svg index 83d4a8eb3e..24f62e725e 100644 --- a/docs/marketing/logo/SVG/Combinationmark White.svg +++ b/docs/marketing/logo/SVG/Combinationmark White.svg @@ -1 +1,60 @@ -Combinationmark White \ No newline at end of file + + + + +Combinationmark White + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/marketing/logo/SVG/Combinationmark.svg b/docs/marketing/logo/SVG/Combinationmark.svg index c2e33c71bb..5165afa4d5 100644 --- a/docs/marketing/logo/SVG/Combinationmark.svg +++ b/docs/marketing/logo/SVG/Combinationmark.svg @@ -1 +1,58 @@ -Combinationmark \ No newline at end of file + + + + +Combinationmark + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/marketing/logo/SVG/Logomark Full Black.svg b/docs/marketing/logo/SVG/Logomark Full Black.svg index c7856ad593..de1453525e 100644 --- a/docs/marketing/logo/SVG/Logomark Full Black.svg +++ b/docs/marketing/logo/SVG/Logomark Full Black.svg @@ -1 +1,41 @@ -Logomark Full Black \ No newline at end of file + + + + +Logomark Full Black + + + + + + + + + + + + + + + + + diff --git a/docs/marketing/logo/SVG/Logomark Full Purple.svg b/docs/marketing/logo/SVG/Logomark Full Purple.svg index 33a442b912..8755b4cab3 100644 --- a/docs/marketing/logo/SVG/Logomark Full Purple.svg +++ b/docs/marketing/logo/SVG/Logomark Full Purple.svg @@ -1 +1,41 @@ -Logomark Full Purple \ No newline at end of file + + + + +Logomark Full Purple + + + + + + + + + + + + + + + + + From 4282d41579eb0869e2847c39eace089cb8348fb3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 6 Oct 2021 21:04:02 -0300 Subject: [PATCH 337/494] Update package logo and favicon --- docs/favicon.ico | Bin 16958 -> 4286 bytes docs/guides/toc.yml | 6 +++++- docs/marketing/logo/PackageLogo.png | Bin 11639 -> 4600 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/favicon.ico b/docs/favicon.ico index 34a2cd1cab42b94e672025c1f35b39420b332524..0bd7593cf02e4731c624bac2aea6af8917264903 100644 GIT binary patch literal 4286 zcmbuC3s6+o8ON_N)oDA^w9PcrbZP_*8a&%#ZW9 z=YIe5oyT|1Rg`J`3kXo;zq0$QigKT#C=U`=DL*7qum1SV_h$->zeIY-QgdL!7l>~Y zzh%?>c*PVMub6}4?=lC*&mi~E#<$2k@(5W%{zMGKN~%d3nPm!mUNO0KSbm>?^pRY0 zFHwwq&h(4!GT(_0Ba6u6MC_)MLLzn#lau6K(n)&BH8M&jiP#q=$Z--(RKJ+MMYQMR z%!{pX_HPZSwe>%NS>uFI-^_xX?T-fL&k_V-p){n3gOmB(=L zgD%*9T>yEPHhj6rx=&*AJL zj!W7OK5NHuoAYM=57N#;BKp51!^ETKn-~4cr?;Txa5F4Hi7*Exs9G)c%_w-pp!(h7 zJdM|_^*CtWh0e2WXxvth^%1K${(kMsxGo{0znEMhI(?Zl-Mj@PplFd9HF0(ne}5f{ z7iXbnc?EVq`xiKVx&`~dHL(S3(ls=vZv$hVsY^ypl-^+;T%RGEc zRDJWDMC8shVB`Eu6outtb3_5G;YB!<^fIn=^kSf=AA>yu80a3rVD}(~KDma$u0dS- zS1(!*w!)e0M1H6RhFL3g{^))4rB(!K-19wPE{16)qNRhdtVk215fT zCnj;L-{@zfI9b_<_2H}3z38&*(bV^;!06KdI@`RhwaW-fqTe|v4$nhj=z8QoXhC*R zI`*a3+?KxdZ(@7`M+;u|nS0%Qy2iSSnv6m5GnqOyeecw@4h#>hKsDF@$M1BY>s+TB z$-C%nzlgDsF|VQd^urz$e$Na`U=lLtrXnkN4Kjj~_5Qy?tr_Gl@{+gijpHS8FDH66 zS%ch|G~`96BR`hwWPush#kqK^^bJgmO?dh+Iy{Q~&+I{IgcY`!GB{$ncEdO5^-oaq zD+bpbY`&E~&jW0jXQqvOSR;y1^=LWl50$C5ZBaJVK2eKnmp=38OJAJHM_`L`wJD3< zijARJdVM)p?kBPajknUb%vp(&$jvB^EyuCd$IyDH6_txBur0b&t*`!Bxwc+mIKzmUfeA zH&Klb{oPkId5lwk$MO=ao%I}yj3pX69l3XW*RB5~)0@U%OK>6%7;A8?Z%EZ>Z~6e4 zVJYe!Gw^)cxX=h+{g<9`(En6qhy0myXF?v4adh`V?gzhc>;HhMl(lDGsT%(oe}}JL zpWlvuv>`vrgxrv|>bkH$x`nans>gqs|N5lE*v9#HEO4Nlal{epU|-T`TiuHigO|DW zBbmyb#Ysg|4xYPH6hF{!5}Z!x~wL zO^m1Of>Jb%3EE#vWc|%1vL3W&Ua6{|K#PM z&vPJmm#OTsey2Hrci4dVFEjtQsoMF|_Y(6{IR9!3GUqei`9FWPJ~dKP{J)zV^rx?m z+w26?rBr*(zaL3YRsVnbQTO{=HTL?msjHJQ7yW6ZQdh6;88y~L7GZ06F^;7lz4`ew zIf>5)hVfy;1=KxNtHwzSV~*aYpM1BBKkJ2j{c|}3w=byRzG0k=v18Bg>Tu@8W}JSp z2~9gr;qB@ZocH5AYhTA3rB2>^cEa(iLS%=nQT>*Cgx=m1`OoDefX{^0`Zk$!SMlu4 zV9YS8W05)c1vS=L0$0M!`;g45+_eRXKe9$7PDojA=T>>0{!+G;J?Vbmb@oc!bj6E1 zvwPi+X3uZhsndUq?~L5$dw1mH6gCG~pQ_W3VEL0N+WtR!GN%6}{iK^*Ag__9$xNNT z+(qPDXsT}!eILfzPHc(~(&vAZGeq|DUScEJB!xUhenK85!Q_74CB9?{NaC8i{;kb= zS%cps6=aZzo}?Y*G&w@5$p(^2eoKB#Vn`slk4PN5+Z4?G9OU}G75{Gby9dh58HzHU XZKmA@9#dJ&-7asktska$DAVyjti{xU literal 16958 zcmd^_U1%It6vrn7?3>Axk7gf>R^6(#;Da5dJ{x=&1ENw;3`IeVw$p}wSSwqq(V)dp zThtIFQtO*#R}h6*t@>c4NH?^$FA9+ewSx3|{*yVw-MjZ=KJIRIw^L5f%$d1&&hMOi z@0^`U5Dd}3FbwGbO0e;fAh<0Ef{i3(3L+BNZQIlxJ4PY4YX5n>AFF+6LTeD=NK%~anH{O^07*Su{%x@Niv={SJal-S+9^S%-c`d>*=1z1(+a{ zB+ON(eMpmpeY9!#pE(YeKBKZsXixn!lbkDzGcZAHEM?BsviR@t0sghk2eMU2m@A@v zNR0&7Ly&_qzWZwH90!TNw)=r4lw(Q9V70aBm2*wmZ{0p|EM{bhxIJBu^`}=DU4B&A zZ=EI%j9phBd>*li=L6|;Iofgi_0XY?n{C99hadhoNs#{ulJ(%pd(Vhjb($EkF6ZqN z*H4nH6l`1Mens23_`^P6D9Vm@*5@FdA9Vh@ZrsbZ0nh)<&c7n(TDMR6?}v4)@EV|F zmTkme@3lFwYtsvbc~usfRkz=5{=Ij-Bq00lnGy##?-7SKPm9|9hhur`ff+Hgbv734 zdx}G-<7ON2*VLF5Ifk#to~*@k;;HuprR zvX61#;&;}7(Wad(IYZubITIzfi(fUxnZ5Ni7W=EaeDGU;2U4!B{71IbQh(&!==MwE zr_EQdu8PlJJSASc^En^<5s!79CVpcLgn6ptG}%%BPdh&>e!H&xh`)(dXZM8N(v620 zEb8*kHp+j+w%%cVKDy;-I^S`O`H%G*;{$60w{LOW^RvbnxYkJ?>n2TO$;H>Uuy`ie1FBc7Nb9dzZGWHY2WhFAIIV|9P&{j;U`-@NbjHh(0)yTXs0t6VrffBM&$O?QrM zF8<4BFU9j8&tA+K+)IA;O02p#OmePun%Yh{+Uxpkv#I>YwtpZ{)APoxtob*@8~5%P zU(Yu9GOfP2bfN8jIedR5W%(U7kd+_vz~)=lb722x z^;(*5b;s6^i+}mM-vr(VsPBw;ErGVwKuwamWSZ7zP) zKNvrl|8fn4Ii&MNV+(n#>oi?ox&~Hx)njIrHO~o*Z`)S#`HvWtdJn3JXItED{^Ojf zZgs8wX#2~TKepX3i%-%ukuL9SLwuxb3*8HT+BW1+71uL^`@?&JlK#2)OV_~cYbW&K zM_(<=KgYS&X^L&NWPCe;9rx*B?jv>`uK_y|0K6AE{@8~;z6JIrKYtH1)pa?>Y?i+T zXxjS2Zw&Zhs>6NeA9=?&Q+`%@;1{}iFWWFjO#EOsz1w0Reei=D?*j4e1pT5u!21!C zUpeigGOxOC<463N)1-^?<6Qy1bKyJB!3U>&%ym<|LX}xQCVpcLh&t26t=hS!L*7uU zV!j}L5XbLyli$AVh50egz`|^59iHP|q%W2t{kZt?cb!H0?Uyz#{?avIkH@bPST^!~ zkomLJKb0QOUzvGk9s4{i29$q-`COX#y?hJrkvP`LkI=;|pQr1MH9(Ir$#bAdK7kQ} zzhi{&c!psetH@kg_o>||3HlZ5D9kiRK7a`_P6DnlD@)Pq=pI#)(%%E94>^XISIoss zoGWlyYxANkMcct262xC-Q1=ldX2P}173YbLt?!(R`qs^M#DF+3PprFn|4!U%F8QHW zOZ0(6?}5HCEbt}%uOJYO-J(JF-`%)9_F`M()#@dAqGJ_|H4J(=u{-ogaz3*r zAF+)X^oGQqTVG%6cY{F>C-%(xzqS5`4SFcCXVqyxHxfS+J(B2cYnqZs=ZBHgC>Vnh I%klr>f8Pc!W&i*H diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index a6c38768f6..62244fc94e 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -35,9 +35,13 @@ topicUid: Guides.Commands.DI - name: Post-execution Handling topicUid: Guides.Commands.PostExecution +- name: Working with Interactions + items: + - name: Introduction + topicUid: Guides.Interactions.Intro - name: Emoji topicUid: Guides.Emoji - name: Voice topicUid: Guides.Voice.SendingVoice - name: Deployment - topicUid: Guides.Deployment \ No newline at end of file + topicUid: Guides.Deployment diff --git a/docs/marketing/logo/PackageLogo.png b/docs/marketing/logo/PackageLogo.png index 047d6ad64f279e7475a6b031d915f52c1143bc6b..2c140a87422223cbbade54f7cd60f513a334b1c4 100644 GIT binary patch literal 4600 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 iEYy*hI``+YjQR_Nao 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 From e8faa0077426284455bbac98a3ad5c6bf1205e57 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 6 Oct 2021 21:47:30 -0300 Subject: [PATCH 338/494] Update docfx references --- .../02-creating-slash-commands.md | 13 +++++++++++-- .../03-responding-to-slash-commands.md | 9 ++++++++- .../slash-commands/04-parameters.md | 5 +++++ .../slash-commands/05-responding-ephemerally.md | 5 +++++ .../slash-commands/06-subcommands.md | 5 +++++ .../slash-commands/07-choice-slash-command.md | 5 +++++ ...8-bulk-overwrite-of-global-slash-commands.md | 12 +++++++++--- docs/guides/interactions/intro.md | 10 ++++++++++ docs/guides/toc.yml | 14 ++++++++++++++ docs/index.md | 17 ++++++++--------- 10 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 docs/guides/interactions/intro.md diff --git a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md index 830c52aa52..1abab1a258 100644 --- a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Creating +title: Creating Slash Commands +--- + # Creating your first slash commands. There are two kinds of Slash Commands: global commands and guild commands. @@ -35,7 +40,10 @@ The slash command builder will help you create slash commands. The builder has t | AddOption | Function | Adds an option to the current slash command. | | Build | Function | Builds the builder into a `SlashCommandCreationProperties` class used to make slash commands | -**Note**: Slash command names must be all lowercase! +> [!NOTE] +> Slash command names must be all lowercase! + +## Creating a Slash Command Let's use the slash command builder to make a global and guild command. @@ -84,4 +92,5 @@ public async Task Client_Ready() ``` -**Note**: Slash 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 slash commands. +> [!NOTE] +> Slash 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 slash commands. diff --git a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md index ad3c7145b7..cd6ad52172 100644 --- a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Receiving +title: Receiving and Responding to Slash Commands +--- + # Responding to interactions. Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. In order to receive a slash command we have to listen to the `InteractionCreated` event. Let's add this to our code. @@ -45,6 +50,8 @@ Let's try this out! Let's go over the response types quickly, as you would only change them for style points :P -> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`. If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) +> [!NOTE] +> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`. +> If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) This seems to be working! Next, we will look at parameters for slash commands. diff --git a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md index ddac72203a..cc61796c8e 100644 --- a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md +++ b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Parameters +title: Slash Command Parameters +--- + # Slash command parameters Slash commands can have a bunch of parameters, each their own type. Let's first go over the types of parameters we can have. diff --git a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md index f925049246..2b654763d5 100644 --- a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md +++ b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Ephemeral +title: Ephemeral Responses +--- + # Responding ephemerally What is an ephemeral response? Basically, only the user who executed the command can see the result of it. In labs this is pretty simple to do. diff --git a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md index 54ff03cdc1..ac8c7313d2 100644 --- a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md +++ b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.SubCommand +title: Sub Commands +--- + # Subcommands Subcommands allow you to have multiple commands available in a single command. They can be useful for representing sub options for a command. For example: A settings command. Let's first look at some limitations with subcommands set by discord. diff --git a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md index 53cccb39ee..79de5ffbca 100644 --- a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md +++ b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Choices +title: Slash Command Choices +--- + # Slash Command Choices. With slash command options you can add choices, making the user select between some set values. Lets create a command that asks how much they like our bot! diff --git a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md index 0a1aab461b..e2511ab983 100644 --- a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md @@ -1,4 +1,10 @@ +--- +uid: Guides.SlashCommands.BulkOverwrite +title: Slash Command Bulk Overwrites +--- + If you have too many global commands then you might want to consider using the bulk overwrite function. + ```cs public async Task Client_Ready() { List applicationCommandProperties = new(); @@ -8,7 +14,7 @@ public async Task Client_Ready() { globalCommandHelp.WithName("help"); globalCommandHelp.WithDescription("Shows information about the bot."); applicationCommandProperties.Add(globalCommandHelp.Build()); - + // Slash command with name as its parameter. SlashCommandOptionBuilder slashCommandOptionBuilder = new(); slashCommandOptionBuilder.WithName("name"); @@ -16,11 +22,11 @@ public async Task Client_Ready() { slashCommandOptionBuilder.WithDescription("Add a family"); slashCommandOptionBuilder.WithRequired(true); // Only add this if you want it to be required - SlashCommandBuilder globalCommandAddFamily = new SlashCommandBuilder(); + SlashCommandBuilder globalCommandAddFamily = new SlashCommandBuilder(); globalCommandAddFamily.WithName("add-family"); globalCommandAddFamily.WithDescription("Add a family"); applicationCommandProperties.Add(globalCommandAddFamily.Build()); - + await _client.BulkOverwriteGlobalApplicationCommandsAsync(applicationCommandProperties.ToArray()); } catch (ApplicationCommandException exception) { var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); diff --git a/docs/guides/interactions/intro.md b/docs/guides/interactions/intro.md new file mode 100644 index 0000000000..62b2dfdb57 --- /dev/null +++ b/docs/guides/interactions/intro.md @@ -0,0 +1,10 @@ +--- +uid: Guides.Interactions.Intro +title: Introduction to Interactions +--- + +# Interactions + +Placeholder text does the brrr. + +Links to different sections of guides: msg comp / slash commands. diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index 62244fc94e..64ed1c8cc1 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -39,6 +39,20 @@ items: - name: Introduction topicUid: Guides.Interactions.Intro + - name: Creating slash commands + topicUid: Guides.SlashCommands.Creating + - name: Receiving and responding to slash commands + topicUid: Guides.SlashCommands.Receiving + - name: Slash command parameters + topicUid: Guides.SlashCommands.Parameters + - name: Ephemeral responses + topicUid: Guides.SlashCommands.Ephemeral + - name: Sub commands + topicUid: Guides.SlashCommands.SubCommand + - name: Slash command choices + topicUid: Guides.SlashCommands.Choices + - name: Slash ommands Bulk Overwrites + topicUid: Guides.SlashCommands.BulkOverwrite - name: Emoji topicUid: Guides.Emoji - name: Voice diff --git a/docs/index.md b/docs/index.md index 1d0f5aaf74..9a617344a8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,20 +3,19 @@ uid: Root.Landing title: Home --- -# Discord.Net Documentation +# Discord.Net Labs Documentation -[![GitHub](https://img.shields.io/github/last-commit/discord-net/discord.net?style=plastic)](https://github.com/discord-net/Discord.Net) -[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net) -[![MyGet](https://img.shields.io/myget/discord-net/vpre/Discord.Net.svg)](https://www.myget.org/feed/Packages/discord-net) -[![Build Status](https://dev.azure.com/discord-net/Discord.Net/_apis/build/status/discord-net.Discord.Net?branchName=dev)](https://dev.azure.com/discord-net/Discord.Net/_build/latest?definitionId=1&branchName=dev) -[![Discord](https://discord.com/api/guilds/81384788765712384/widget.png)](https://discord.gg/jkrBmQR) +[![GitHub](https://img.shields.io/github/last-commit/Discord-Net-Labs/Discord.Net-Labs?style=plastic)](https://github.com/Discord-Net-Labs/Discord.Net-Labs) +[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs/) +[![MyGet](https://img.shields.io/myget/discord-net-labs/vpre/Discord.Net.Labs.svg)](https://www.myget.org/feed/Packages/discord-net-labs) +[![Build Status](https://dev.azure.com/Discord-Net-Labs/Discord-Net-Labs/_apis/build/status/discord-net.Discord.Net?branchName=dev)](https://dev.azure.com/Discord-Net-Labs/Discord-Net-Labs/_build/latest?definitionId=1&branchName=release%2F3.x) +[![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dvSfUTet3K) -## What is Discord.Net? +## What is Discord.Net Labs? -Discord.Net is an asynchronous, multi-platform .NET Library used to -interface with the [Discord API](https://discord.com/). +Discord.Net Labs is an experimental fork of Discord.Net that implements the newest discord features for testing and development to eventually get merged into Discord.Net ## Where to begin? From 135495436c0feeacb4ca8aa19384ba5fc3ec35e5 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 6 Oct 2021 23:54:19 -0300 Subject: [PATCH 339/494] Remove XML files and use original pipeline format --- azure-pipelines.yml | 40 +- .../Discord.Net.Commands.xml | 1498 -- src/Discord.Net.Core/Discord.Net.Core.xml | 12887 ---------------- src/Discord.Net.Rest/Discord.Net.Rest.xml | 5159 ------- .../Discord.Net.WebSocket.xml | 5898 ------- .../Discord.Net.Webhook.xml | 111 - 6 files changed, 20 insertions(+), 25573 deletions(-) delete mode 100644 src/Discord.Net.Commands/Discord.Net.Commands.xml delete mode 100644 src/Discord.Net.Core/Discord.Net.Core.xml delete mode 100644 src/Discord.Net.Rest/Discord.Net.Rest.xml delete mode 100644 src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml delete mode 100644 src/Discord.Net.Webhook/Discord.Net.Webhook.xml diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f576f89d42..9aa0e57880 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -6,29 +6,29 @@ variables: trigger: tags: include: - - "*" + - '*' branches: include: - - "*" + - '*' jobs: - - job: Linux - pool: - vmImage: "ubuntu-latest" - steps: - - template: azure/build.yml +- job: Linux + pool: + vmImage: 'ubuntu-latest' + steps: + - template: azure/build.yml - - job: Windows_build - pool: - vmImage: "windows-latest" - condition: ne(variables['Build.SourceBranch'], 'refs/heads/dev') - steps: - - template: azure/build.yml +- job: Windows_build + pool: + vmImage: 'windows-latest' + condition: ne(variables['Build.SourceBranch'], 'refs/heads/dev') + steps: + - template: azure/build.yml - - job: Windows_deploy - pool: - vmImage: "windows-latest" - condition: | +- job: Windows_deploy + pool: + vmImage: 'windows-latest' + condition: | and ( succeeded(), or ( @@ -36,6 +36,6 @@ jobs: eq(variables['buildTag'], True) ) ) - steps: - - template: azure/build.yml - - template: azure/deploy.yml + steps: + - template: azure/build.yml + - template: azure/deploy.yml diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml deleted file mode 100644 index 4ef47930e0..0000000000 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ /dev/null @@ -1,1498 +0,0 @@ - - - - Discord.Net.Commands - - - - - Marks the aliases for a command. - - - This attribute allows a command to have one or multiple aliases. In other words, the base command can have - multiple aliases when triggering the command itself, giving the end-user more freedom of choices when giving - hot-words to trigger the desired command. See the example for a better illustration. - - - In the following example, the command can be triggered with the base name, "stats", or either "stat" or - "info". - - [Command("stats")] - [Alias("stat", "info")] - public async Task GetStatsAsync(IUser user) - { - // ...pull stats - } - - - - - - Gets the aliases which have been defined for the command. - - - - - Creates a new with the given aliases. - - - - - Marks the execution information for a command. - - - - - Gets the text that has been set to be recognized as a command. - - - - - Specifies the of the command. This affects how the command is executed. - - - - - - - - Initializes a new attribute with the specified name. - - The name of the command. - - - - Prevents the marked module from being loaded automatically. - - - This attribute tells to ignore the marked module from being loaded - automatically (e.g. the method). If a non-public module marked - with this attribute is attempted to be loaded manually, the loading process will also fail. - - - - - Prevents the marked property from being injected into a module. - - - This attribute prevents the marked member from being injected into its parent module. Useful when you have a - public property that you do not wish to invoke the library's dependency injection service. - - - In the following example, DatabaseService will not be automatically injected into the module and will - not throw an error message if the dependency fails to be resolved. - - public class MyModule : ModuleBase - { - [DontInject] - public DatabaseService DatabaseService; - public MyModule() - { - DatabaseService = DatabaseFactory.Generate(); - } - } - - - - - - Marks the module as a command group. - - - - - Gets the prefix set for the module. - - - - - - - - Initializes a new with the provided prefix. - - The prefix of the module group. - - - - Marks the public name of a command, module, or parameter. - - - - - Gets the name of the command. - - - - - Marks the public name of a command, module, or parameter with the provided name. - - The public name of the object. - - - - Instructs the command system to treat command parameters of this type - as a collection of named arguments matching to its properties. - - - - - Marks the to be read by the specified . - - - This attribute will override the to be used when parsing for the - desired type in the command. This is useful when one wishes to use a particular - without affecting other commands that are using the same target - type. - - If the given type reader does not inherit from , an - will be thrown. - - - - In this example, the will be read by a custom - , FriendlyTimeSpanTypeReader, instead of the - shipped by Discord.Net. - - [Command("time")] - public Task GetTimeAsync([OverrideTypeReader(typeof(FriendlyTimeSpanTypeReader))]TimeSpan time) - => ReplyAsync(time); - - - - - - Gets the specified of the parameter. - - - - - The to be used with the parameter. - The given does not inherit from . - - - - Requires the parameter to pass the specified precondition before execution can begin. - - - - - - Checks whether the condition is met before execution of the command. - - The context of the command. - The parameter of the command being checked against. - The raw value of the parameter. - The service collection used for dependency injection. - - - - Requires the module or class to pass the specified precondition before execution can begin. - - - - - - Specifies a group that this precondition belongs to. - - - of the same group require only one of the preconditions to pass in order to - be successful (A || B). Specifying = null or not at all will - require *all* preconditions to pass, just like normal (A && B). - - - - - When overridden in a derived class, uses the supplied string - as the error message if the precondition doesn't pass. - Setting this for a class that doesn't override - this property is a no-op. - - - - - Checks if the has the sufficient permission to be executed. - - The context of the command. - The command being executed. - The service collection used for dependency injection. - - - - Requires the bot to have a specific permission in the channel a command is invoked in. - - - - - Gets the specified of the precondition. - - - - - Gets the specified of the precondition. - - - - - - - - Gets or sets the error message if the precondition - fails due to being run outside of a Guild channel. - - - - - Requires the bot account to have a specific . - - - This precondition will always fail if the command is being invoked in a . - - - The that the bot must have. Multiple permissions can be specified - by ORing the permissions together. - - - - - Requires that the bot account to have a specific . - - - The that the bot must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - - - - Defines the type of command context (i.e. where the command is being executed). - - - - - Specifies the command to be executed within a guild. - - - - - Specifies the command to be executed within a DM. - - - - - Specifies the command to be executed within a group. - - - - - Requires the command to be invoked in a specified context (e.g. in guild, DM). - - - - - Gets the context required to execute the command. - - - - - - - Requires the command to be invoked in the specified context. - The type of context the command can be invoked in. Multiple contexts can be specified by ORing the contexts together. - - - [Command("secret")] - [RequireContext(ContextType.DM | ContextType.Group)] - public Task PrivateOnlyAsync() - { - return ReplyAsync("shh, this command is a secret"); - } - - - - - - - - - Requires the command to be invoked in a channel marked NSFW. - - - The precondition will restrict the access of the command or module to be accessed within a guild channel - that has been marked as mature or NSFW. If the channel is not of type or the - channel is not marked as NSFW, the precondition will fail with an erroneous . - - - The following example restricts the command too-cool to an NSFW-enabled channel only. - - public class DankModule : ModuleBase - { - [Command("cool")] - public Task CoolAsync() - => ReplyAsync("I'm cool for everyone."); - - [RequireNsfw] - [Command("too-cool")] - public Task TooCoolAsync() - => ReplyAsync("You can only see this if you're cool enough."); - } - - - - - - - - - - - - Requires the command to be invoked by the owner of the bot. - - - This precondition will restrict the access of the command or module to the owner of the Discord application. - If the precondition fails to be met, an erroneous will be returned with the - message "Command can only be run by the owner of the bot." - - This precondition will only work if the account has a of - ;otherwise, this precondition will always fail. - - - - The following example restricts the command to a set of sensitive commands that only the owner of the bot - application should be able to access. - - [RequireOwner] - [Group("admin")] - public class AdminModule : ModuleBase - { - [Command("exit")] - public async Task ExitAsync() - { - Environment.Exit(0); - } - } - - - - - - - - - - - - Requires the user invoking the command to have a specified permission. - - - - - Gets the specified of the precondition. - - - - - Gets the specified of the precondition. - - - - - - - - Gets or sets the error message if the precondition - fails due to being run outside of a Guild channel. - - - - - Requires that the user invoking the command to have a specific . - - - This precondition will always fail if the command is being invoked in a . - - - The that the user must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - Requires that the user invoking the command to have a specific . - - - The that the user must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - - - - Sets priority of commands. - - - - - Gets the priority which has been set for the command. - - - - - Initializes a new attribute with the given priority. - - - - - Marks the input to not be parsed by the parser. - - - - - Attaches remarks to your commands. - - - - - Attaches a summary to your command. - - - - Only the last parameter in a command may have the Remainder or Multiple flag. - - - The context of a command which may contain the client, user, guild, channel, and message. - - - - - - - - - - - - - - - - - - Indicates whether the channel that the command is executed in is a private channel. - - - - Initializes a new class with the provided client and message. - - The underlying client. - The underlying message. - - - Defines the type of error a command can throw. - - - - Thrown when the command is unknown. - - - - - Thrown when the command fails to be parsed. - - - - - Thrown when the input text has too few or too many arguments. - - - - - Thrown when the object cannot be found by the . - - - - - Thrown when more than one object is matched by . - - - - - Thrown when the command fails to meet a 's conditions. - - - - - Thrown when an exception occurs mid-command execution. - - - - - Thrown when the command is not successfully executed on runtime. - - - - - The exception that is thrown if another exception occurs during a command execution. - - - - Gets the command that caused the exception. - - - Gets the command context of the exception. - - - - Initializes a new instance of the class using a - information, a context, and the exception that - interrupted the execution. - - The command information. - The context of the command. - The exception that interrupted the command execution. - - - The command that matches the search result. - - - The alias of the command. - - - - Provides a framework for building Discord commands. - - - - The service provides a framework for building Discord commands both dynamically via runtime builders or - statically via compile-time modules. To create a command module at compile-time, see - (most common); otherwise, see . - - - This service also provides several events for monitoring command usages; such as - for any command-related log events, and - for information about commands that have - been successfully executed. - - - - - - Occurs when a command-related information is received. - - - - - Occurs when a command is executed. - - - This event is fired when a command has been executed, successfully or not. When a command fails to - execute during parsing or precondition stage, the CommandInfo may not be returned. - - - - - Represents all modules loaded within . - - - - - Represents all commands loaded within . - - - - - Represents all loaded within . - - - - - Initializes a new class. - - - - - Initializes a new class with the provided configuration. - - The configuration class. - - The cannot be set to . - - - - - Add a command module from a . - - - The following example registers the module MyModule to commandService. - - await commandService.AddModuleAsync<MyModule>(serviceProvider); - - - The type of module. - The for your dependency injection solution if using one; otherwise, pass null. - This module has already been added. - - The fails to be built; an invalid type may have been provided. - - - A task that represents the asynchronous operation for adding the module. The task result contains the - built module. - - - - - Adds a command module from a . - - The type of module. - The for your dependency injection solution if using one; otherwise, pass null . - This module has already been added. - - The fails to be built; an invalid type may have been provided. - - - A task that represents the asynchronous operation for adding the module. The task result contains the - built module. - - - - - Add command modules from an . - - The containing command modules. - The for your dependency injection solution if using one; otherwise, pass null. - - A task that represents the asynchronous operation for adding the command modules. The task result - contains an enumerable collection of modules added. - - - - - Removes the command module. - - The to be removed from the service. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the is successfully removed. - - - - - Removes the command module. - - The of the module. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the module is successfully removed. - - - - - Removes the command module. - - The of the module. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the module is successfully removed. - - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable will - also be added. - If a default exists for , a warning will be logged - and the default will be replaced. - - The object type to be read by the . - An instance of the to be added. - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable for the - value type will also be added. - If a default exists for , a warning will be logged and - the default will be replaced. - - A instance for the type to be read. - An instance of the to be added. - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable will - also be added. - - The object type to be read by the . - An instance of the to be added. - - Defines whether the should replace the default one for - if it exists. - - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable for the - value type will also be added. - - A instance for the type to be read. - An instance of the to be added. - - Defines whether the should replace the default one for if - it exists. - - - - - Searches for the command. - - The context of the command. - The position of which the command starts at. - The result containing the matching commands. - - - - Searches for the command. - - The context of the command. - The command string. - The result containing the matching commands. - - - - Executes the command. - - The context of the command. - The position of which the command starts at. - The service to be used in the command's dependency injection. - The handling mode when multiple command matches are found. - - A task that represents the asynchronous execution operation. The task result contains the result of the - command execution. - - - - - Executes the command. - - The context of the command. - The command string. - The service to be used in the command's dependency injection. - The handling mode when multiple command matches are found. - - A task that represents the asynchronous execution operation. The task result contains the result of the - command execution. - - - - - Represents a configuration class for . - - - - - Gets or sets the default commands should have, if one is not specified on the - Command attribute or builder. - - - - - Gets or sets the that separates an argument with another. - - - - - Gets or sets whether commands should be case-sensitive. - - - - - Gets or sets the minimum log level severity that will be sent to the event. - - - - - Gets or sets whether commands should push exceptions up to the caller. - - - - - Collection of aliases for matching pairs of string delimiters. - The dictionary stores the opening delimiter as a key, and the matching closing delimiter as the value. - If no value is supplied will be used, which contains - many regional equivalents. - Only values that are specified in this map will be used as string delimiters, so if " is removed then - it won't be used. - If this map is set to null or empty, the default delimiter of " will be used. - - - - QuotationMarkAliasMap = new Dictionary<char, char>() - { - {'\"', '\"' }, - {'“', '”' }, - {'「', '」' }, - } - - - - - - Gets or sets a value that indicates whether extra parameters should be ignored. - - - - - Provides extension methods for the class. - - - - - Returns commands that can be executed under the current context. - - The set of commands to be checked against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Returns commands that can be executed under the current context. - - The desired command service class to check against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Returns commands that can be executed under the current context. - - The module to be checked against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Provides extension methods for that relates to commands. - - - - - Gets whether the message starts with the provided character. - - The message to check against. - The char prefix. - References where the command starts. - - true if the message begins with the char ; otherwise false. - - - - - Gets whether the message starts with the provided string. - - - - - Gets whether the message starts with the user's mention string. - - - - - Provides the information of a command. - - - This object contains the information of a command. This can include the module of the command, various - descriptions regarding the command, and its . - - - - - Gets the module that the command belongs in. - - - - - Gets the name of the command. If none is set, the first alias is used. - - - - - Gets the summary of the command. - - - This field returns the summary of the command. and can be - useful in help commands and various implementation that fetches details of the command for the user. - - - - - Gets the remarks of the command. - - - This field returns the summary of the command. and can be - useful in help commands and various implementation that fetches details of the command for the user. - - - - - Gets the priority of the command. This is used when there are multiple overloads of the command. - - - - - Indicates whether the command accepts a [] for its - parameter. - - - - - Indicates whether extra arguments should be ignored for this command. - - - - - Gets the that is being used for the command. - - - - - Gets a list of aliases defined by the of the command. - - - - - Gets a list of information about the parameters of the command. - - - - - Gets a list of preconditions defined by the of the command. - - - - - Gets a list of attributes of the command. - - - - - Provides the information of a module. - - - - - Gets the command service associated with this module. - - - - - Gets the name of this module. - - - - - Gets the summary of this module. - - - - - Gets the remarks of this module. - - - - - Gets the group name (main prefix) of this module. - - - - - Gets a read-only list of aliases associated with this module. - - - - - Gets a read-only list of commands associated with this module. - - - - - Gets a read-only list of preconditions that apply to this module. - - - - - Gets a read-only list of attributes that apply to this module. - - - - - Gets a read-only list of submodules associated with this module. - - - - - Gets the parent module of this submodule if applicable. - - - - - Gets a value that indicates whether this module is a submodule or not. - - - - - Provides the information of a parameter. - - - - - Gets the command that associates with this parameter. - - - - - Gets the name of this parameter. - - - - - Gets the summary of this parameter. - - - - - Gets a value that indicates whether this parameter is optional or not. - - - - - Gets a value that indicates whether this parameter is a remainder parameter or not. - - - - - Gets the type of the parameter. - - - - - Gets the default value for this optional parameter if applicable. - - - - - Gets a read-only list of precondition that apply to this parameter. - - - - - Gets a read-only list of attributes that apply to this parameter. - - - - Cannot add commands to the root node. - - - - Provides a base class for a command module to inherit from. - - - - - Provides a base class for a command module to inherit from. - - A class that implements . - - - - The underlying context of the command. - - - - - - - Sends a message to the source channel. - - - Contents of the message; optional only if is specified. - - Specifies if Discord should read this aloud using text-to-speech. - An embed to be displayed alongside the . - - Specifies if notifications are sent for mentioned users and roles in the . - If null, all mentioned roles and users will be notified. - - The request options for this async request. - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - - - The method to execute before executing the command. - - The of the command to be executed. - - - - The method to execute after executing the command. - - The of the command to be executed. - - - - The method to execute when building the module. - - The used to create the module. - The builder used to build the module. - - - - Specifies the behavior when multiple matches are found during the command parsing stage. - - - - Indicates that when multiple results are found, an exception should be thrown. - - - Indicates that when multiple results are found, the best result should be chosen. - - - - A for parsing objects implementing . - - - This is shipped with Discord.Net and is used by default to parse any - implemented object within a command. The TypeReader will attempt to first parse the - input by mention, then the snowflake identifier, then by name; the highest candidate will be chosen as the - final output; otherwise, an erroneous is returned. - - The type to be checked; must implement . - - - - - - - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - - - must be within the range [0, 1]. - - - must be within the range [0, 1]. - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - - - - Defines a reader class that parses user input into a specified type. - - - - - Attempts to parse the into the desired type. - - The context of the command. - The raw input of the command. - The service collection used for dependency injection. - - A task that represents the asynchronous parsing operation. The task result contains the parsing result. - - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - Contains information of the command's overall execution result. - - - - - Gets the exception that may have occurred during the command execution. - - - - - - - - - - - - - - Initializes a new with no error, indicating a successful execution. - - - A that does not contain any errors. - - - - - Initializes a new with a specified and its - reason, indicating an unsuccessful execution. - - The type of error. - The reason behind the error. - - A that contains a and reason. - - - - - Initializes a new with a specified exception, indicating an unsuccessful - execution. - - The exception that caused the command execution to fail. - - A that contains the exception that caused the unsuccessful execution, along - with a of type Exception as well as the exception message as the - reason. - - - - - Initializes a new with a specified result; this may or may not be an - successful execution depending on the and - specified. - - The result to inherit from. - - A that inherits the error type and reason. - - - - - Gets a string that indicates the execution result. - - - Success if is true; otherwise ": - ". - - - - - Contains information of the result related to a command. - - - - - Describes the error type that may have occurred during the operation. - - - A indicating the type of error that may have occurred during the operation; - null if the operation was successful. - - - - - Describes the reason for the error. - - - A string containing the error reason. - - - - - Indicates whether the operation was successful or not. - - - true if the result is positive; otherwise false. - - - - - Contains information for the parsing result from the command service's parser. - - - - - - - - - - - Provides information about the parameter that caused the parsing error. - - - A indicating the parameter info of the error that may have occurred during parsing; - null if the parsing was successful or the parsing error is not specific to a single parameter. - - - - - - - - Represents a result type for command preconditions. - - - - - - - - - - - - - - Initializes a new class with the command type - and reason. - - The type of failure. - The reason of failure. - - - - Returns a with no errors. - - - - - Returns a with and the - specified reason. - - The reason of failure. - - - - Returns a with the specified type. - - The result of failure. - - - - Returns a string indicating whether the is successful. - - - - - Initializes a new class with the type of error and reason. - - The type of failure, or null if none. - The reason of failure. - - - - - - Describes the execution reason or result. - - - - - - - - - - - - - - - - - - - - - - - - - - - TypeReaderResult was not successful. - - - - Specifies the behavior of the command execution workflow. - - - - - - - The default behaviour set in . - - - - - Executes the command on the same thread as gateway one. - - - - - Executes the command on a different thread from the gateway one. - - - - - Utility class which contains the default matching pairs of quotation marks for CommandServiceConfig - - - - - A default map of open-close pairs of quotation marks. - Contains many regional and Unicode equivalents. - Used in the . - - - - - diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml deleted file mode 100644 index a046da6fba..0000000000 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ /dev/null @@ -1,12887 +0,0 @@ - - - - Discord.Net.Core - - - - - Reading this stream is not supported. - - - - Setting the length to this stream is not supported. - - - - Seeking this stream is not supported.. - - - This stream does not accept headers. - - - - Reading stream length is not supported. - - - - Getting or setting this stream position is not supported. - - - - Reading this stream is not supported. - - - - Setting the length to this stream is not supported. - - - - Seeking this stream is not supported.. - - - Gets the current connection state of this client. - - - Gets the estimated round-trip latency, in milliseconds, to the voice WebSocket server. - - - Gets the estimated round-trip latency, in milliseconds, to the voice UDP server. - - - Gets the current audio streams. - - - Creates a new outgoing stream accepting Opus-encoded data. - - - Creates a new outgoing stream accepting Opus-encoded data. This is a direct stream with no internal timer. - - - Creates a new outgoing stream accepting PCM (raw) data. - - - Creates a new direct outgoing stream accepting PCM (raw) data. This is a direct stream with no internal timer. - - - - Represents a class containing the strings related to various Content Delivery Networks (CDNs). - - - - - Returns a team icon URL. - - The team identifier. - The icon identifier. - - A URL pointing to the team's icon. - - - - - Returns an application icon URL. - - The application identifier. - The icon identifier. - - A URL pointing to the application's icon. - - - - - Returns a user avatar URL. - - The user snowflake identifier. - The avatar identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the user's avatar in the specified size. - - - - - Returns a user banner URL. - - The user snowflake identifier. - The banner identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the user's banner in the specified size. - - - - - Returns the default user avatar URL. - - The discriminator value of a user. - - A URL pointing to the user's default avatar when one isn't set. - - - - - Returns an icon URL. - - The guild snowflake identifier. - The icon identifier. - - A URL pointing to the guild's icon. - - - - - Returns a guild splash URL. - - The guild snowflake identifier. - The splash icon identifier. - - A URL pointing to the guild's splash. - - - - - Returns a guild discovery splash URL. - - The guild snowflake identifier. - The discovery splash icon identifier. - - A URL pointing to the guild's discovery splash. - - - - - Returns a channel icon URL. - - The channel snowflake identifier. - The icon identifier. - - A URL pointing to the channel's icon. - - - - - Returns a guild banner URL. - - The guild snowflake identifier. - The banner image identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048 inclusive. - - A URL pointing to the guild's banner image. - - - - - Returns an emoji URL. - - The emoji snowflake identifier. - Whether this emoji is animated. - - A URL pointing to the custom emote. - - - - - Returns a Rich Presence asset URL. - - The application identifier. - The asset identifier. - The size of the image to return in. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the asset image in the specified size. - - - - - Returns a Spotify album URL. - - The identifier for the album art (e.g. 6be8f4c8614ecf4f1dd3ebba8d8692d8ce4951ac). - - A URL pointing to the Spotify album art. - - - - - Returns a Spotify direct URL for a track. - - The identifier for the track (e.g. 4uLU6hMCjMI75M1A2tKUQC). - - A URL pointing to the Spotify track. - - - - - Gets a stickers url based off the id and format. - - The id of the sticker. - The format of the sticker. - - A URL to the sticker. - - - - - Represents a context of a command. This may include the client, guild, channel, user, and message. - - - - - Gets the that the command is executed with. - - - - - Gets the that the command is executed in. - - - - - Gets the that the command is executed in. - - - - - Gets the who executed the command. - - - - - Gets the that the command is interpreted from. - - - - Specifies the connection state of a client. - - - The client has disconnected from Discord. - - - The client is connecting to Discord. - - - The client has established a connection to Discord. - - - The client is disconnecting from Discord. - - - - Defines various behaviors of Discord.Net. - - - - - Returns the API version Discord.Net uses. - - - An representing the API version that Discord.Net uses to communicate with Discord. - A list of available API version can be seen on the official - Discord API documentation - . - - - - - Returns the Voice API version Discord.Net uses. - - - An representing the API version that Discord.Net uses to communicate with Discord's - voice server. - - - - - Gets the Discord.Net version, including the build number. - - - A string containing the detailed version information, including its build number; Unknown when - the version fails to be fetched. - - - - - Gets the user agent that Discord.Net uses in its clients. - - - The user agent used in each Discord.Net request. - - - - - Returns the base Discord API URL. - - - The Discord API URL using . - - - - - Returns the base Discord CDN URL. - - - The base Discord Content Delivery Network (CDN) URL. - - - - - Returns the base Discord invite URL. - - - The base Discord invite URL. - - - - - Returns the default timeout for requests. - - - The amount of time it takes in milliseconds before a request is timed out. - - - - - Returns the max length for a Discord message. - - - The maximum length of a message allowed by Discord. - - - - - Returns the max messages allowed to be in a request. - - - The maximum number of messages that can be gotten per-batch. - - - - - Returns the max users allowed to be in a request. - - - The maximum number of users that can be gotten per-batch. - - - - - Returns the max guilds allowed to be in a request. - - - The maximum number of guilds that can be gotten per-batch. - - - - - Returns the max user reactions allowed to be in a request. - - - The maximum number of user reactions that can be gotten per-batch. - - - - - Returns the max audit log entries allowed to be in a request. - - - The maximum number of audit log entries that can be gotten per-batch. - - - - - Gets or sets how a request should act in the case of an error, by default. - - - The currently set . - - - - - Gets or sets the minimum log level severity that will be sent to the Log event. - - - The currently set for logging level. - - - - - Gets or sets whether the initial log entry should be printed. - - - If set to true, the library will attempt to print the current version of the library, as well as - the API version it uses on startup. - - - - - Gets or sets whether or not rate-limits should use the system clock. - - - If set to false, we will use the X-RateLimit-Reset-After header - to determine when a rate-limit expires, rather than comparing the - X-RateLimit-Reset timestamp to the system time. - - This should only be changed to false if the system is known to have - a clock that is out of sync. Relying on the Reset-After header will - incur network lag. - - Regardless of this property, we still rely on the system's wall-clock - to determine if a bucket is rate-limited; we do not use any monotonic - clock. Your system will still need a stable clock. - - - - - Flags for the property, that are ORd together. - These describe what the activity payload includes. - - - - - Indicates that no actions on this activity can be taken. - - - - - Indicates that this activity can be joined. - - - - - Indicates that this activity can be spectated. - - - - - Indicates that a user may request to join an activity. - - - - - Indicates that a user can listen along in Spotify. - - - - - Indicates that a user can play this song. - - - - - Specifies a Discord user's activity type. - - - - - The user is playing a game. - - - - - The user is streaming online. - - - - - The user is listening to a song. - - - - - The user is watching some form of media. - - - - - The user has set a custom status. - - - - - A user's activity for their custom status. - - - - - Gets the emote, if it is set. - - - An containing the or set by the user. - - - - - Gets the timestamp of when this status was created. - - - A containing the time when this status was created. - - - - - Gets the state of the status. - - - - - A user's game status. - - - - - - - - - - - - - - - - - Creates a with the provided name and . - - The name of the game. - The type of activity. - - - Returns the name of the . - - - - An asset for a object containing the text and image. - - - - - Gets the description of the asset. - - - A string containing the description of the asset. - - - - - Gets the image ID of the asset. - - - A string containing the unique image identifier of the asset. - - - - - Returns the image URL of the asset. - - The size of the image to return in. This can be any power of two between 16 and 2048. - The format to return. - - A string pointing to the image URL of the asset; null when the application ID does not exist. - - - - - Party information for a object. - - - - - Gets the ID of the party. - - - A string containing the unique identifier of the party. - - - - - Gets the party's current and maximum size. - - - A representing the capacity of the party. - - - - - Party secret for a object. - - - - - Gets the secret for a specific instanced match. - - - - - Gets the secret for joining a party. - - - - - Gets the secret for spectating a game. - - - - - Timestamps for a object. - - - - - Gets when the activity started. - - - - - Gets when the activity ends. - - - - - A user's activity status, typically a . - - - - - Gets the name of the activity. - - - A string containing the name of the activity that the user is doing. - - - - - Gets the type of the activity. - - - The type of activity. - - - - - Gets the flags that are relevant to this activity. - - - This value is determined by bitwise OR-ing values together. - - - The value of flags for this activity. - - - - - Gets the details on what the player is currently doing. - - - A string describing what the player is doing. - - - - - A user's Rich Presence status. - - - - - Gets the user's current party status. - - - - - Gets the application ID for the game. - - - - - Gets the small image for the presence and their hover texts. - - - - - Gets the large image for the presence and their hover texts. - - - - - Gets the information for the current party of the player. - - - - - Gets the secrets for Rich Presence joining and spectating. - - - - - Gets the timestamps for start and/or end of the game. - - - - - Returns the name of the Rich Presence. - - - - - A user's activity for listening to a song on Spotify. - - - - - Gets the song's artist(s). - - - A collection of string containing all artists featured in the track (e.g. Avicii; Rita Ora). - - - - - Gets the Spotify album title of the song. - - - A string containing the name of the album (e.g. AVĪCI (01)). - - - - - Gets the track title of the song. - - - A string containing the name of the song (e.g. Lonely Together (feat. Rita Ora)). - - - - - Gets the date when the track started playing. - - - A containing the start timestamp of the song. - - - - - Gets the date when the track ends. - - - A containing the finish timestamp of the song. - - - - - Gets the duration of the song. - - - A containing the duration of the song. - - - - - Gets the elapsed duration of the song. - - - A containing the elapsed duration of the song. - - - - - Gets the remaining duration of the song. - - - A containing the remaining duration of the song. - - - - - Gets the track ID of the song. - - - A string containing the Spotify ID of the track (e.g. 7DoN0sCGIT9IcLrtBDm4f0). - - - - - Gets the session ID of the song. - - - The purpose of this property is currently unknown. - - - A string containing the session ID. - - - - - Gets the URL of the album art. - - - A URL pointing to the album art of the track (e.g. - https://i.scdn.co/image/ba2fd8823d42802c2f8738db0b33a4597f2f39e7). - - - - - Gets the direct Spotify URL of the track. - - - A URL pointing directly to the track on Spotify. (e.g. - https://open.spotify.com/track/7DoN0sCGIT9IcLrtBDm4f0). - - - - - Gets the full information of the song. - - - A string containing the full information of the song (e.g. - Avicii, Rita Ora - Lonely Together (feat. Rita Ora) (3:08) - - - - - A user's activity for streaming on services such as Twitch. - - - - - Gets the URL of the stream. - - - - - Creates a new based on the on the stream URL. - - The name of the stream. - The URL of the stream. - - - - Gets the name of the stream. - - - - - Representing a type of action within an . - - - - - this guild was updated. - - - - - A channel was created. - - - - - A channel was updated. - - - - - A channel was deleted. - - - - - A permission overwrite was created for a channel. - - - - - A permission overwrite was updated for a channel. - - - - - A permission overwrite was deleted for a channel. - - - - - A user was kicked from this guild. - - - - - A prune took place in this guild. - - - - - A user banned another user from this guild. - - - - - A user unbanned another user from this guild. - - - - - A guild member whose information was updated. - - - - - A guild member's role collection was updated. - - - - - A guild member moved to a voice channel. - - - - - A guild member disconnected from a voice channel. - - - - - A bot was added to this guild. - - - - - A role was created in this guild. - - - - - A role was updated in this guild. - - - - - A role was deleted from this guild. - - - - - An invite was created in this guild. - - - - - An invite was updated in this guild. - - - - - An invite was deleted from this guild. - - - - - A Webhook was created in this guild. - - - - - A Webhook was updated in this guild. - - - - - A Webhook was deleted from this guild. - - - - - An emoji was created in this guild. - - - - - An emoji was updated in this guild. - - - - - An emoji was deleted from this guild. - - - - - A message was deleted from this guild. - - - - - Multiple messages were deleted from this guild. - - - - - A message was pinned from this guild. - - - - - A message was unpinned from this guild. - - - - - A integration was created - - - - - A integration was updated - - - - - An integration was deleted - - - - - A stage instance was created. - - - - - A stage instance was updated. - - - - - A stage instance was deleted. - - - - - A sticker was created. - - - - - A sticker was updated. - - - - - A sticker was deleted. - - - - - Represents data applied to an . - - - - - Represents a generic audit log entry. - - - - - Gets the action which occurred to create this entry. - - - The type of action for this audit log entry. - - - - - Gets the data for this entry. - - - An for this audit log entry; null if no data is available. - - - - - Gets the user responsible for causing the changes. - - - A user object. - - - - - Gets the reason behind the change. - - - A string containing the reason for the change; null if none is provided. - - - - - Specifies the cache mode that should be used. - - - - - Allows the object to be downloaded if it does not exist in the current cache. - - - - - Only allows the object to be pulled from the existing cache. - - - - Defines the types of channels. - - - The channel is a text channel. - - - The channel is a Direct Message channel. - - - The channel is a voice channel. - - - The channel is a group channel. - - - The channel is a category channel. - - - The channel is a news channel. - - - The channel is a store channel. - - - The channel is a temporary thread channel under a news channel. - - - The channel is a temporary thread channel under a text channel. - - - The channel is a private temporary thread channel under a text channel. - - - The channel is a stage voice channel. - - - - Specifies the direction of where message(s) should be retrieved from. - - - This enum is used to specify the direction for retrieving messages. - - At the time of writing, is not yet implemented into - . - Attempting to use the method with will throw - a . - - - - - - The message(s) should be retrieved before a message. - - - - - The message(s) should be retrieved after a message. - - - - - The message(s) should be retrieved around a message. - - - - - Properties that are used to modify an with the specified changes. - - - - - - Gets or sets the channel to this name. - - - This property defines the new name for this channel. - - When modifying an , the must be alphanumeric with - dashes. It must match the RegEx [a-z0-9-_]{2,100}. - - - - - - Moves the channel to the following position. This property is zero-based. - - - - - Gets or sets the category ID for this channel. - - - Setting this value to a category's snowflake identifier will change or set this channel's parent to the - specified channel; setting this value to will detach this channel from its parent if one - is set. - - - - - Gets or sets the permission overwrites for this channel. - - - - - Represents a generic audio channel. - - - - - Connects to this audio channel. - - Determines whether the client should deaf itself upon connection. - Determines whether the client should mute itself upon connection. - Determines whether the audio client is an external one or not. - - A task representing the asynchronous connection operation. The task result contains the - responsible for the connection. - - - - - Disconnects from this audio channel. - - - A task representing the asynchronous operation for disconnecting from the audio channel. - - - - - Represents a generic category channel. - - - - - Represents a generic channel. - - - - - Gets the name of this channel. - - - A string containing the name of this channel. - - - - - Gets a collection of users that are able to view the channel or are currently in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - This method will attempt to fetch all users that is able to view this channel or is currently in this channel. - The library will attempt to split up the requests according to and . - In other words, if there are 3000 users, and the constant - is 1000, the request will be split into 3 individual requests; thus returning 53individual asynchronous - responses, hence the need of flattening. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - Paged collection of users. - - - - - Gets a user in this channel. - - The snowflake identifier of the user (e.g. 168693960628371456). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a user object that - represents the found user; null if none is found. - - - - - Represents a generic direct-message channel. - - - - - Gets the recipient of all messages in this channel. - - - A user object that represents the other user in this channel. - - - - - Closes this private channel, removing it from your channel list. - - The options to be used when sending the request. - - A task that represents the asynchronous close operation. - - - - - Represents a generic private group channel. - - - - - Leaves this group. - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Represents a generic guild channel. - - - - - - - - Gets the position of this channel. - - - An representing the position of this channel in the guild's channel list relative to - others of the same type. - - - - - Gets the guild associated with this channel. - - - A guild object that this channel belongs to. - - - - - Gets the guild ID associated with this channel. - - - An representing the guild snowflake identifier for the guild that this channel - belongs to. - - - - - Gets a collection of permission overwrites for this channel. - - - A collection of overwrites associated with this channel. - - - - - Modifies this guild channel. - - - This method modifies the current guild channel with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The delegate containing the properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Adds or updates the permission overwrite for the given role. - - - The following example fetches a role via and a channel via - . Next, it checks if an overwrite had already been set via - ; if not, it denies the role from sending any - messages to the channel. - - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the - channel. - - - - - Adds or updates the permission overwrite for the given user. - - - The following example fetches a user via and a channel via - . Next, it checks if an overwrite had already been set via - ; if not, it denies the user from sending any - messages to the channel. - - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Gets a collection of users that are able to view the channel or are currently in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - Paged collection of users. - - - - - Gets a user in this channel. - - The snowflake identifier of the user. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task representing the asynchronous get operation. The task result contains a guild user object that - represents the user; null if none is found. - - - - - Represents a generic channel that can send and receive messages. - - - - - Sends a message to this message channel. - - - The following example sends a message with the current system time in RFC 1123 format to the channel and - deletes itself after 5 seconds. - - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a local file called wumpus.txt along with the text - good discord boi to the channel. - - The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the - channel. - - - - This method sends a file as if you are uploading an attachment directly from your Discord client. - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a - rich embed to the channel. - - - - This method sends a file as if you are uploading an attachment directly from your Discord client. - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a message from this message channel. - - The snowflake identifier of the message. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under . The - library will attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example downloads 300 messages and gets messages that belong to the user - 53905483156684800. - - - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under around - the message depending on the . The library will - attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets 5 message prior to the message identifier 442012544660537354. - - The following example attempts to retrieve messageCount number of messages from the - beginning of the channel and prints them to the console. - - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under around - the message depending on the . The library will - attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets 5 message prior to a specific message, oldMessage. - - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of pinned messages in this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a collection of messages found in the pinned messages. - - - - - Deletes a message. - - The snowflake identifier of the message that would be removed. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - Deletes a message based on the provided message in this channel. - The message that would be removed. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Modifies a message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The snowflake identifier of the message that would be changed. - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. - - The options to be used when sending the request. - - A task that represents the asynchronous operation that triggers the broadcast. - - - - - Continuously broadcasts the "user is typing" message to all users in this channel until the returned - object is disposed. - - - The following example keeps the client in the typing state until LongRunningAsync has finished. - - - The options to be used when sending the request. - - A disposable object that, upon its disposal, will stop the client from broadcasting its typing state in - this channel. - - - - - Represents a type of guild channel that can be nested within a category. - - - - - Gets the parent (category) ID of this channel in the guild's channel list. - - - A representing the snowflake identifier of the parent of this channel; - null if none is set. - - - - - Gets the parent (category) channel of this channel. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - Syncs the permissions of this nested channel with its parent's. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for syncing channel permissions with its parent's. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The id of the embedded application to open for this invite. - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The id of the user whose stream to display for this invite. - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Gets a collection of all invites to this channel. - B - - The following example gets all of the invites that have been created in this channel and selects the - most used invite. - - var invites = await channel.GetInvitesAsync(); - if (invites.Count == 0) return; - var invite = invites.OrderByDescending(x => x.Uses).FirstOrDefault(); - - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of invite metadata that are created for this channel. - - - - - Represents a generic news channel in a guild that can send and receive messages. - - - - - Represents a generic channel that is private to select recipients. - - - - - Gets the users that can access this channel. - - - A read-only collection of users that can access this channel. - - - - - Represents a generic Stage Channel. - - - - - Gets the topic of the Stage instance. - - - If the stage isn't live then this property will be set to . - - - - - The of the current stage. - - - If the stage isn't live then this property will be set to . - - - - - if stage discovery is disabled, otherwise . - - - - - when the stage is live, otherwise . - - - If the stage isn't live then this property will be set to . - - - - - Starts the stage, creating a stage instance. - - The topic for the stage/ - The privacy level of the stage. - The options to be used when sending the request. - - A task that represents the asynchronous start operation. - - - - - Modifies the current stage instance. - - The properties to modify the stage instance with. - The options to be used when sending the request. - - A task that represents the asynchronous modify operation. - - - - - Stops the stage, deleting the stage instance. - - The options to be used when sending the request. - - A task that represents the asynchronous stop operation. - - - - - Indicates that the bot would like to speak within a stage channel. - - The options to be used when sending the request. - - A task that represents the asynchronous request to speak operation. - - - - - Makes the current user become a speaker within a stage. - - The options to be used when sending the request. - - A task that represents the asynchronous speaker modify operation. - - - - - Makes the current user a listener. - - The options to be used when sending the request. - - A task that represents the asynchronous stop operation. - - - - - Makes a user a speaker within a stage. - - The user to make the speaker. - The options to be used when sending the request. - - A task that represents the asynchronous move operation. - - - - - Removes a user from speaking. - - The user to remove from speaking. - The options to be used when sending the request. - - A task that represents the asynchronous remove operation. - - - - - Represents a generic channel in a guild that can send and receive messages. - - - - - Gets a value that indicates whether the channel is NSFW. - - - true if the channel has the NSFW flag enabled; otherwise false. - - - - - Gets the current topic for this text channel. - - - A string representing the topic set in the channel; null if none is set. - - - - - Gets the current slow-mode delay for this channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - - - - - Bulk-deletes multiple messages. - - - The following example gets 250 messages from the channel and deletes them. - - var messages = await textChannel.GetMessagesAsync(250).FlattenAsync(); - await textChannel.DeleteMessagesAsync(messages); - - - - This method attempts to remove the messages specified in bulk. - - Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! - - - The messages to be bulk-deleted. - The options to be used when sending the request. - - A task that represents the asynchronous bulk-removal operation. - - - - - Bulk-deletes multiple messages. - - - This method attempts to remove the messages specified in bulk. - - Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! - - - The snowflake identifier of the messages to be bulk-deleted. - The options to be used when sending the request. - - A task that represents the asynchronous bulk-removal operation. - - - - - Modifies this text channel. - - The delegate containing the properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - Represents a thread channel inside of a guild. - - - - - Gets the type of the current thread channel. - - - - - if the current user has joined this thread, otherwise . - - - - - if the current thread is archived, otherwise . - - - - - Duration to automatically archive the thread after recent activity. - - - - - Timestamp when the thread's archive status was last changed, used for calculating recent activity. - - - - - if the current thread is locked, otherwise - - - - - An approximate count of users in a thread, stops counting at 50. - - - - - An approximate count of messages in a thread, stops counting at 50. - - - - - Joins the current thread. - - The options to be used when sending the request. - - A task that represents the asynchronous join operation. - - - - - Leaves the current thread. - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Adds a user to this thread. - - The to add. - The options to be used when sending the request. - - A task that represents the asynchronous operation of adding a member to a thread. - - - - - Removes a user from this thread. - - The to remove from this thread. - The options to be used when sending the request. - - A task that represents the asynchronous operation of removing a user from this thread. - - - - - Represents a generic voice channel in a guild. - - - - - Gets the bit-rate that the clients in this voice channel are requested to use. - - - An representing the bit-rate (bps) that this voice channel defines and requests the - client(s) to use. - - - - - Gets the max number of users allowed to be connected to this channel at once. - - - An representing the maximum number of users that are allowed to be connected to this - channel at once; null if a limit is not set. - - - - - Modifies this voice channel. - - The properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - - Provides properties that are used to reorder an . - - - - - Gets the ID of the channel to apply this position to. - - - A representing the snowflake identifier of this channel. - - - - - Gets the new zero-based position of this channel. - - - An representing the new position of this channel. - - - - Initializes a new instance of the class used to reorder a channel. - Sets the ID of the channel to apply this position to. - Sets the new zero-based position of this channel. - - - - Represents properties to use when modifying a stage instance. - - - - - Gets or sets the topic of the stage. - - - - - Gets or sets the privacy level of the stage. - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the topic of the channel. - - - Setting this value to any string other than null or will set the - channel topic or description to the desired value. - - - - - Gets or sets whether this channel should be flagged as NSFW. - - - Setting this value to true will mark the channel as NSFW (Not Safe For Work) and will prompt the - user about its possibly mature nature before they may view the channel; setting this value to false will - remove the NSFW indicator. - - - - - Gets or sets the slow-mode ratelimit in seconds for this channel. - - - Setting this value to anything above zero will require each user to wait X seconds before - sending another message; setting this value to 0 will disable slow-mode for this channel. - - Users with or - will be exempt from slow-mode. - - - Thrown if the value does not fall within [0, 21600]. - - - - Gets or sets whether or not the thread is archived. - - - - - Gets or sets whether or not the thread is locked. - - - - - Gets or sets the auto archive duration. - - - - - Represents the thread auto archive duration. - - - - - One hour (60 minutes). - - - - - One day (1440 minutes). - - - - - Three days (4320 minutes). - - This option is explicity avaliable to nitro users. - - - - - - One week (10080 minutes). - - This option is explicity avaliable to nitro users. - - - - - - Represents types of threads. - - - - - Represents a temporary sub-channel within a GUILD_NEWS channel. - - - - - Represents a temporary sub-channel within a GUILD_TEXT channel. - - - - - Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission - - - - - Provides properties that are used to modify an with the specified changes. - - - - - Gets or sets the bitrate of the voice connections in this channel. Must be greater than 8000. - - - - - Gets or sets the maximum number of users that can be present in a channel, or null if none. - - - - - A Unicode emoji. - - - - - - - - Gets the Unicode representation of this emoji. - - - A string that resolves to . - - - - - Initializes a new class with the provided Unicode. - - The pure UTF-8 encoding of an emoji. - - - - Determines whether the specified emoji is equal to the current one. - - The object to compare with the current object. - - - Tries to parse an from its raw format. - The raw encoding of an emoji. For example: :heart: or ❤ - An emoji. - - - Parse an from its raw format. - The raw encoding of an emoji. For example: :heart: or ❤ - String is not emoji or unicode! - - - - - - - A custom image-based emote. - - - - - - - - - - - Gets whether this emote is animated. - - - A boolean that determines whether or not this emote is an animated one. - - - - - - - - Gets the image URL of this emote. - - - A string that points to the URL of this emote. - - - - - Determines whether the specified emote is equal to the current emote. - - The object to compare with the current object. - - - - - - Parses an from its raw format. - The raw encoding of an emote (e.g. <:dab:277855270321782784>). - An emote. - Invalid emote format. - - - Tries to parse an from its raw format. - The raw encoding of an emote; for example, <:dab:277855270321782784>. - An emote. - - - - Returns the raw representation of the emote. - - - A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the name of the . - - - - - Gets or sets the roles that can access this . - - - - - An image-based emote that is attached to a guild. - - - - - Gets whether this emoji is managed by an integration. - - - A boolean that determines whether or not this emote is managed by a Twitch integration. - - - - - Gets whether this emoji must be wrapped in colons. - - - A boolean that determines whether or not this emote requires the use of colons in chat to be used. - - - - - Gets the roles that are allowed to use this emoji. - - - A read-only list containing snowflake identifiers for roles that are allowed to use this emoji. - - - - - Gets the user ID associated with the creation of this emoji. - - - An snowflake identifier representing the user who created this emoji; - null if unknown. - - - - - Gets the raw representation of the emote. - - - A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). - - - - - Represents a general container for any type of emote in a message. - - - - - Gets the display name or Unicode representation of this emote. - - - A string representing the display name or the Unicode representation (e.g. 🤔) of this emote. - - - - - Stores the gateway information related to the current bot. - - - - - Gets the WSS URL that can be used for connecting to the gateway. - - - - - Gets the recommended number of shards to use when connecting. - - - - - Gets the that contains the information - about the current session start limit. - - - - - Stores the information related to the gateway identify request. - - - - - Gets the total number of session starts the current user is allowed. - - - The maximum amount of session starts the current user is allowed. - - - - - Gets the remaining number of session starts the current user is allowed. - - - The remaining amount of session starts the current user is allowed. - - - - - Gets the number of milliseconds after which the limit resets. - - - The milliseconds until the limit resets back to the . - - - - - Gets the maximum concurrent identify requests in a time window. - - - The maximum concurrent identify requests in a time window, - limited to the same rate limit key. - - - - - Specifies the default message notification behavior the guild uses. - - - - - By default, all messages will trigger notifications. - - - - - By default, only mentions will trigger notifications. - - - - No messages will be scanned. - - - Scans messages from all guild members that do not have a role. - Recommented option for servers that use roles for trusted membership. - - - Scan messages sent by all guild members. - - - - Provides properties used to modify an with the specified changes. - - - - - Gets or sets the behavior when an integration subscription lapses. - - - - - Gets or sets the period (in seconds) where the integration will ignore lapsed subscriptions. - - - - - Gets or sets whether emoticons should be synced for this integration. - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the name of the guild. Must be within 100 characters. - - - - - Gets or sets the region for the guild's voice connections. - - - - - Gets or sets the ID of the region for the guild's voice connections. - - - - - Gets or sets the verification level new users need to achieve before speaking. - - - - - Gets or sets the default message notification state for the guild. - - - - - Gets or sets how many seconds before a user is sent to AFK. This value MUST be one of: (60, 300, 900, - 1800, 3600). - - - - - Gets or sets the icon of the guild. - - - - - Gets or sets the banner of the guild. - - - - - Gets or sets the guild's splash image. - - - The guild must be partnered for this value to have any effect. - - - - - Gets or sets the where AFK users should be sent. - - - - - Gets or sets the ID of the where AFK users should be sent. - - - - - Gets or sets the where system messages should be sent. - - - - - Gets or sets the ID of the where system messages should be sent. - - - - - Gets or sets the owner of this guild. - - - - - Gets or sets the ID of the owner of this guild. - - - - - Gets or sets the explicit content filter level of this guild. - - - - - Gets or sets the flags that DISABLE types of system channel messages. - - - These flags are inverted. Setting a flag will disable that system channel message from being sent. - A value of will allow all system channel message types to be sent, - given that the has also been set. - A value of will deny guild boost messages from being sent, and allow all - other types of messages. - Refer to the extension methods and - to check if these system channel message types - are enabled, without the need to manipulate the logic of the flag. - - - - - Gets or sets the preferred locale of the guild in IETF BCP 47 language tag format. - - - This property takes precedence over . - When it is set, the value of - will not be used. - - - - - Gets or sets the preferred locale of the guild. - - - The property takes precedence - over this property. When is set, - the value of will be unused. - - - - - Provides properties that are used to modify the widget of an with the specified changes. - - - - - Sets whether the widget should be enabled. - - - - - Sets the channel that the invite should place its users in, if not . - - - - - Sets the channel that the invite should place its users in, if not . - - - - - Represents a generic ban object. - - - - - Gets the banned user. - - - A user that was banned. - - - - - Gets the reason why the user is banned if specified. - - - A string containing the reason behind the ban; null if none is specified. - - - - - Represents a generic guild/server. - - - - - Gets the name of this guild. - - - A string containing the name of this guild. - - - - - Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are - automatically moved to the AFK voice channel. - - - An representing the amount of time in seconds for a user to be marked as inactive - and moved into the AFK voice channel. - - - - - Gets a value that indicates whether this guild has the widget enabled. - - - if this guild has a widget enabled; otherwise . - - - - - Gets the default message notifications for users who haven't explicitly set their notification settings. - - - - - Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to - perform administrative actions in this guild. - - - The level of MFA requirement. - - - - - Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. - - - The level of requirements. - - - - - Gets the level of content filtering applied to user's content in a Guild. - - - The level of explicit content filtering. - - - - - Gets the ID of this guild's icon. - - - An identifier for the splash image; if none is set. - - - - - Gets the URL of this guild's icon. - - - A URL pointing to the guild's icon; if none is set. - - - - - Gets the ID of this guild's splash image. - - - An identifier for the splash image; if none is set. - - - - - Gets the URL of this guild's splash image. - - - A URL pointing to the guild's splash image; if none is set. - - - - - Gets the ID of this guild's discovery splash image. - - - An identifier for the discovery splash image; if none is set. - - - - - Gets the URL of this guild's discovery splash image. - - - A URL pointing to the guild's discovery splash image; if none is set. - - - - - Determines if this guild is currently connected and ready to be used. - - - - This property only applies to a WebSocket-based client. - - This boolean is used to determine if the guild is currently connected to the WebSocket and is ready to be used/accessed. - - - true if this guild is currently connected and ready to be used; otherwise . - - - - - Gets the ID of the AFK voice channel for this guild. - - - A representing the snowflake identifier of the AFK voice channel; if - none is set. - - - - - Gets the ID of the channel assigned to the widget of this guild. - - - A representing the snowflake identifier of the channel assigned to the widget found - within the widget settings of this guild; if none is set. - - - - - Gets the ID of the channel where randomized welcome messages are sent. - - - A representing the snowflake identifier of the system channel where randomized - welcome messages are sent; if none is set. - - - - - Gets the ID of the channel with the rules. - - - A representing the snowflake identifier of the channel that contains the rules; - if none is set. - - - - - Gets the ID of the channel where admins and moderators of Community guilds receive notices from Discord. - - - A representing the snowflake identifier of the channel where admins and moderators - of Community guilds receive notices from Discord; if none is set. - - - - - Gets the ID of the user that owns this guild. - - - A representing the snowflake identifier of the user that owns this guild. - - - - - Gets the application ID of the guild creator if it is bot-created. - - - A representing the snowflake identifier of the application ID that created this guild, or if it was not bot-created. - - - - - Gets the ID of the region hosting this guild's voice channels. - - - A string containing the identifier for the voice region that this guild uses (e.g. eu-central). - - - - - Gets the currently associated with this guild. - - - An currently associated with this guild. - - - - - Gets the built-in role containing all users in this guild. - - - A role object that represents an @everyone role in this guild. - - - - - Gets a collection of all custom emotes for this guild. - - - A read-only collection of all custom emotes for this guild. - - - - - Gets a collection of all custom stickers for this guild. - - - A read-only collection of all custom stickers for this guild. - - - - - Gets a collection of all extra features added to this guild. - - - A read-only collection of enabled features in this guild. - - - - - Gets a collection of all roles in this guild. - - - A read-only collection of roles found within this guild. - - - - - Gets the tier of guild boosting in this guild. - - - The tier of guild boosting in this guild. - - - - - Gets the identifier for this guilds banner image. - - - An identifier for the banner image; if none is set. - - - - - Gets the URL of this guild's banner image. - - - A URL pointing to the guild's banner image; if none is set. - - - - - Gets the code for this guild's vanity invite URL. - - - A string containing the vanity invite code for this guild; if none is set. - - - - - Gets the flags for the types of system channel messages that are disabled. - - - The flags for the types of system channel messages that are disabled. - - - - - Gets the description for the guild. - - - The description for the guild; if none is set. - - - - - Gets the number of premium subscribers of this guild. - - - This is the number of users who have boosted this guild. - - - The number of premium subscribers of this guild; if not available. - - - - - Gets the maximum number of presences for the guild. - - - The maximum number of presences for the guild. - - - - - Gets the maximum number of members for the guild. - - - The maximum number of members for the guild. - - - - - Gets the maximum amount of users in a video channel. - - - The maximum amount of users in a video channel. - - - - - Gets the approximate number of members in this guild. - - - Only available when getting a guild via REST when `with_counts` is true. - - - The approximate number of members in this guild. - - - - - Gets the approximate number of non-offline members in this guild. - - - Only available when getting a guild via REST when `with_counts` is true. - - - The approximate number of non-offline members in this guild. - - - - - Gets the preferred locale of this guild in IETF BCP 47 - language tag format. - - - The preferred locale of the guild in IETF BCP 47 - language tag format. - - - - - Gets the NSFW level of this guild. - - - The NSFW level of this guild. - - - - - Gets the preferred culture of this guild. - - - The preferred culture information of this guild. - - - - - Modifies this guild. - - The delegate containing the properties to modify the guild with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Modifies this guild's widget. - - The delegate containing the properties to modify the guild widget with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Bulk-modifies the order of channels in this guild. - - The properties used to modify the channel positions with. - The options to be used when sending the request. - - A task that represents the asynchronous reorder operation. - - - - - Bulk-modifies the order of roles in this guild. - - The properties used to modify the role positions with. - The options to be used when sending the request. - - A task that represents the asynchronous reorder operation. - - - - - Leaves this guild. - - - This method will make the currently logged-in user leave the guild. - - If the user is the owner of this guild, use instead. - - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Bans the user from this guild and optionally prunes their recent messages. - - The user to ban. - The number of days to remove messages from this user for, and this number must be between [0, 7]. - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous add operation for the ban. - - - - - Bans the user from this guild and optionally prunes their recent messages. - - The snowflake ID of the user to ban. - The number of days to remove messages from this user for, and this number must be between [0, 7]. - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous add operation for the ban. - - - - - Unbans the user if they are currently banned. - - The user to be unbanned. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation for the ban. - - - - - Unbans the user if they are currently banned. - - The snowflake identifier of the user to be unbanned. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation for the ban. - - - - - Gets a collection of all channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - generic channels found within this guild. - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the generic channel - associated with the specified ; if none is found. - - - - - Gets a collection of all text channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - message channels found within this guild. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - associated with the specified ; if none is found. - - - - - Gets a collection of all voice channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - category channels found within this guild. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel associated - with the specified ; if none is found. - - - - - Gets a stage channel in this guild - - The snowflake identifier for the stage channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the stage channel associated - with the specified ; if none is found. - - - - - Gets a collection of all stage channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - stage channels found within this guild. - - - - - Gets the AFK voice channel in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel that the - AFK users will be moved to after they have idled for too long; if none is set. - - - - - Gets the system channel where randomized welcome messages are sent in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel where - randomized welcome messages will be sent to; if none is set. - - - - - Gets the first viewable text channel in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the first viewable text - channel in this guild; if none is found. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the widget channel set - within the server's widget settings; if none is set. - - - - - Gets the text channel where Community guilds can display rules and/or guidelines. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where Community guilds can display rules and/or guidelines; if none is set. - - - - - Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel channel where - admins and moderators of Community guilds receive notices from Discord; if none is set. - - - - - Gets a thread channel within this guild. - - The id of the thread channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the thread channel. - - - - - Gets a collection of all thread channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - thread channels found within this guild. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a new voice channel in this guild. - - The new name for the voice channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a new channel category in this guild. - - The new name for the category. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the partial metadata of - the vanity invite found within this guild; if none is found. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - Whether the role can be mentioned. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Adds a user to this guild. - - - This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. - - The snowflake identifier of the user. - The OAuth2 access token for the user, requested with the guilds.join scope. - The delegate containing the properties to be applied to the user upon being added to the guild. - The options to be used when sending the request. - A guild user associated with the specified ; if the user is already in the guild. - - - - Disconnects the user from its current voice channel - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild. - - This may return an incomplete collection in the WebSocket implementation due to how Discord does not - send a complete user list for large guilds. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds. - - - The snowflake identifier of the user. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild user - associated with the specified ; if none is found. - - - - - Gets the current user for this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the currently logged-in - user within this guild. - - - - - Gets the owner of this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the owner of this guild. - - - - - Downloads all users for this guild if the current list is incomplete. - - - This method downloads all users found within this guild throught the Gateway and caches them. - - - A task that represents the asynchronous download operation. - - - - - Prunes inactive users. - - - - This method removes all users that have not logged on in the provided number of . - - - If is true, this method will only return the number of users that - would be removed without kicking the users. - - - The number of days required for the users to be kicked. - Whether this prune action is a simulation. - The options to be used when sending the request. - An array of role IDs to be included in the prune of users who do not have any additional roles. - - A task that represents the asynchronous prune operation. The task result contains the number of users to - be or has been removed from this guild. - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - The audit log entry ID to get entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - Gets a collection of emotes from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of emotes found within the guild. - - - - - Gets a specific emote from this guild. - - The snowflake identifier for the guild emote. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the emote found with the - specified ; if none is found. - - - - - Creates a new in this guild. - - The name of the guild emote. - The image of the new emote. - The roles to limit the emote usage to. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created emote. - - - - - Modifies an existing in this guild. - - The emote to be modified. - The delegate containing the properties to modify the emote with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. The task result contains the modified - emote. - - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - Deletes an existing from this guild. - - The emote to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a collection of all stickers within this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets this guilds application commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of application commands found within the guild. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Holds information for a guild integration feature. - - - - - Gets the integration ID. - - - An representing the unique identifier value of this integration. - - - - - Gets the integration name. - - - A string containing the name of this integration. - - - - - Gets the integration type (Twitch, YouTube, etc). - - - A string containing the name of the type of integration. - - - - - Gets a value that indicates whether this integration is enabled or not. - - - true if this integration is enabled; otherwise false. - - - - - Gets a value that indicates whether this integration is syncing or not. - - - An integration with syncing enabled will update its "subscribers" on an interval, while one with syncing - disabled will not. A user must manually choose when sync the integration if syncing is disabled. - - - true if this integration is syncing; otherwise false. - - - - - Gets the ID that this integration uses for "subscribers". - - - - - Gets the grace period before expiring "subscribers". - - - - - Gets when this integration was last synced. - - - A containing a date and time of day when the integration was last synced. - - - - - Gets integration account information. - - - - Gets the ID of the account. - A unique identifier of this integration account. - - - Gets the name of the account. - A string containing the name of this integration account. - - - - Gets the name of this guild. - - - - - Gets the icon URL associated with this guild, or null if one is not set. - - - - - Returns true if the current user owns this guild. - - - - - Returns the current user's permissions for this guild. - - - - - Represents a region of which the user connects to when using voice. - - - - - Gets the unique identifier for this voice region. - - - A string that represents the identifier for this voice region (e.g. eu-central). - - - - - Gets the name of this voice region. - - - A string that represents the human-readable name of this voice region (e.g. Central Europe). - - - - - Gets a value that indicates whether or not this voice region is exclusive to partnered servers. - - - true if this voice region is exclusive to VIP accounts; otherwise false. - - - - - Gets a value that indicates whether this voice region is optimal for your client in terms of latency. - - - true if this voice region is the closest to your machine; otherwise false . - - - - - Gets a value that indicates whether this voice region is no longer being maintained. - - - true if this is a deprecated voice region; otherwise false. - - - - - Gets a value that indicates whether this voice region is custom-made for events. - - - true if this is a custom voice region (used for events/etc); otherwise false/ - - - - - Specifies the guild's Multi-Factor Authentication (MFA) level requirement. - - - - - Users have no additional MFA restriction on this guild. - - - - - Users must have MFA enabled on their account to perform administrative actions. - - - - - Default or unset. - - - - - Guild has extremely suggestive or mature content that would only be suitable for users 18 or over. - - - - - Guild has no content that could be deemed NSFW; in other words, SFW. - - - - - Guild has mildly NSFW content that may not be suitable for users under 18. - - - - - Specifies the target of the permission. - - - - - The target of the permission is a role. - - - - - The target of the permission is a user. - - - - - Used for guilds that have no guild boosts. - - - - - Used for guilds that have Tier 1 guild boosts. - - - - - Used for guilds that have Tier 2 guild boosts. - - - - - Used for guilds that have Tier 3 guild boosts. - - - - - Deny none of the system channel messages. - This will enable all of the system channel messages. - - - - - Deny the messages that are sent when a user joins the guild. - - - - - Deny the messages that are sent when a user boosts the guild. - - - - - Specifies the verification level the guild uses. - - - - - Users have no additional restrictions on sending messages to this guild. - - - - - Users must have a verified email on their account. - - - - - Users must fulfill the requirements of Low and be registered on Discord for at least 5 minutes. - - - - - Users must fulfill the requirements of Medium and be a member of this guild for at least 10 minutes. - - - - - Users must fulfill the requirements of High and must have a verified phone on their Discord account. - - - - - Represents a Discord application created via the developer portal. - - - - - Gets the name of the application. - - - - - Gets the description of the application. - - - - - Gets the RPC origins of the application. - - - - - Gets the icon URL of the application. - - - - - Gets if the bot is public. - - - - - Gets if the bot requires code grant. - - - - - Gets the team associated with this application if there is one. - - - - - Gets the partial user object containing info on the owner of the application. - - - - - Determines whether the object is deletable or not. - - - - - Deletes this object and all its children. - - The options to be used when sending the request. - - - - Gets the unique identifier for this object. - - - - - An image that will be uploaded to Discord. - - - - - Gets the stream to be uploaded to Discord. - - - - - Create the image with a . - - - The to create the image with. Note that this must be some type of stream - with the contents of a file in it. - - - - - Create the image from a file path. - - - This file path is NOT validated and is passed directly into a - . - - The path to the file. - - is a zero-length string, contains only white space, or contains one or more invalid - characters as defined by . - - is null. - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - is in an invalid format. - - The specified is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - The file specified in was not found. - - An I/O error occurred while opening the file. - - - - - - - Specifies the type of format the image should return in. - - - - - Use automatically detected format. - - - - - Use Google's WebP image format. - - - - - Use PNG. - - - - - Use JPEG. - - - - - Use GIF. - - - - - Determines whether the object is mentionable or not. - - - - - Returns a special string used to mention this object. - - - A string that is recognized by Discord as a mention (e.g. <@168693960628371456>). - - - - - Represents a for making slash commands. - - - - - Gets or sets the name of this option. - - - - - Gets or sets the description of this option. - - - - - Gets or sets the type of this option. - - - - - Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - - - - - Gets or sets if the option is required. - - - - - Gets or sets whether or not this option supports autocomplete. - - - - - Gets or sets the choices for string and int types for the user to pick from. - - - - - Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. - - - - - Represents a choice for a . This class is used when making new commands. - - - - - The name of this choice. - - - - - The value of this choice. - - Discord only accepts int and string as the input. - - - - - - The option type of the Slash command parameter, See the discord docs. - - - - - A sub command. - - - - - A group of sub commands. - - - - - A of text. - - - - - An . - - - - - A . - - - - - A . - - - - - A . - - - - - A . - - - - - A or . - - - - - A . - - - - - Represents the base class to create/modify application commands. - - - - - Gets or sets the name of this command. - - - - - Whether the command is enabled by default when the app is added to a guild. Default is - - - - - ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message - - - - - ApplicationCommandType.Slash is Slash command type - - - - - ApplicationCommandType.User is Context Menu User command type - - - - - ApplicationCommandType.Message is Context Menu Message command type - - - - - Represents an autocomplete option. - - - - - Gets the type of this option - - - - - Gets the name of the option. - - - - - Gets the value of the option. - - - - - Gets whether or not this option is focused by the executing user. - - - - - Represents a result to an autocomplete interaction. - - - - - Gets or sets the name of the result. - - - Name cannot be null and has to be between 1-100 characters in length. - - - - - - - Gets or sets the value of the result. - - - Only , , and are allowed for a value. - - - - - - - Creates a new . - - - - - Creates a new with the passed in and . - - - - - - - A class used to build Message commands. - - - - - Returns the maximun length a commands name allowed by Discord - - - - - The name of this Message command. - - - - - Whether the command is enabled by default when the app is added to a guild - - - - - Build the current builder into a class. - - - A that can be used to create message commands. - - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - A class used to create message commands. - - - - - A class used to build user commands. - - - - - Returns the maximun length a commands name allowed by Discord - - - - - The name of this User command. - - - - - Whether the command is enabled by default when the app is added to a guild - - - - - Build the current builder into a class. - - A that can be used to create user commands. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - A class used to create User commands. - - - - - The base command model that belongs to an application. - - - - - Gets the unique id of the parent application. - - - - - The type of the command - - - - - The name of the command. - - - - - The description of the command. - - - - - Whether the command is enabled by default when the app is added to a guild. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - Modifies the current application command. - - The new properties to use when modifying the command. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Modifies the current application command. - - The new properties to use when modifying the command. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - Thrown when you pass in an invalid type. - - - - Represents data of an Interaction Command, see . - - - - - The snowflake id of this command. - - - - - The name of this command. - - - - - The params + values from the user. - - - - - Represents a option group for a command, see . - - - - - The name of the parameter. - - - - - The value of the pair. - - This objects type can be any one of the option types in - - - - - - The type of this data's option. - - - - - Present if this option is a group or subcommand. - - - - - Options for the , see The docs. - - - - - The type of this . - - - - - The name of this command option, 1-32 character name. - - - - - The discription of this command option, 1-100 character description. - - - - - The first required option for the user to complete--only one option can be default. - - - - - If the parameter is required or optional, default is . - - - - - Choices for string and int types for the user to pick from. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - Specifies choices for command group. - - - - - 1-100 character choice name. - - - - - value of the choice. - - - - - Represents a discord interaction - - An interaction is the base "thing" that is sent when a user invokes a command, and is the same for Slash Commands - and other future interaction types. see . - - - - - - The id of the interaction. - - - - - The type of this . - - - - - Represents the data sent within this interaction. - - - - - A continuation token for responding to the interaction. - - - - - read-only property, always 1. - - - - - Responds to an Interaction with type . - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Gets the original response for this interaction. - - The request options for this async request. - A that represents the initial response. - - - - Edits original response for this interaction. - - A delegate containing the properties to modify the message with. - The request options for this async request. - A that represents the initial response. - - - - Acknowledges this interaction. - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - Represents an interface used to specify classes that they are a vaild dataype of a class. - - - - - The response type for an . - - - After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using - or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, - and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. - You can read more about Response types Here - - - - - ACK a Ping. - - - - - ACK a command without sending a message, eating the user's input. - - - - - Respond with a message, showing the user's input. - - - - - Respond to an interaction with a message. - - - - - ACK an interaction and edit a response later, the user sees a loading state. - - - - - For components: ACK an interaction and edit the original message later; the user does not see a loading state - - - - - For components: edit the message the component was attached to - - - - - Respond with a set of choices to a autocomplete interaction - - - - - Represents a type of Interaction from discord. - - - - - A ping from discord. - - - - - A sent from discord. - - - - - A sent from discord. - - - - - An autocomplete request sent from discord. - - - - - Represents a Row for child components to live in. - - - - - - - - The child components in this row. - - - - - Represents a Button. - - - - - - - - The of this button, example buttons with each style can be found Here. - - - - - The label of the button, this is the text that is shown. - - - - - A that will be displayed with this button. - - - - - A unique id that will be sent with a . This is how you know what button was pressed. - - - - - A URL for a button. - - - You cannot have a button with a URL and a CustomId. - - - - - Whether this button is disabled or not. - - - - - Turns this button into a button builder. - - - A newly created button builder with the same properties as this button. - - - - - Represents different styles to use with buttons. You can see an example of the different styles at - - - - - A Blurple button - - - - - A Grey (or gray) button - - - - - A Green button - - - - - A Red button - - - - - A button with a little popup box indicating that this button is a link. - - - - - Represents a builder for creating a . - - - - - The max length of a . - - - - - The max amount of rows a message can have. - - - - - Gets or sets the Action Rows for this Component Builder. - - cannot be null. - count exceeds . - - - - Creates a new builder from a message. - - The message to create the builder from. - The newly created builder. - - - - Creates a new builder from the provided list of components. - - The components to create the builder from. - The newly created builder. - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The label of the menu. - The custom id of the menu. - The options of the menu. - The placeholder of the menu. - The min values of the placeholder. - The max values of the placeholder. - Whether or not the menu is disabled. - The row to add the menu to. - - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The menu to add. - The row to attempt to add this component on. - There is no more row to add a menu. - must be less than . - The current builder. - - - - Adds a with specified parameters to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The label text for the newly added button. - The style of this newly added button. - A to be used with this button. - The custom id of the newly added button. - A URL to be used only if the is a Link. - Whether or not the newly created button is disabled. - The row the button should be placed on. - The current builder. - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The button to add. - The row to add the button. - There is no more row to add a menu. - must be less than . - The current builder. - - - - Builds this builder into a used to send your components. - - A that can be sent with . - - - - Represents a class used to build Action rows. - - - - - The max amount of child components this row can hold. - - - - - Gets or sets the components inside this row. - - cannot be null. - count exceeds . - - - - Adds a list of components to the current row. - - The list of components to add. - - The current builder. - - - - Adds a component at the end of the current row. - - The component to add. - Components count reached - The current builder. - - - - Builds the current builder to a that can be used within a - - A that can be used within a - - - - Represents a class used to build 's. - - - - - The max length of a . - - - - - Gets or sets the label of the current button. - - length exceeds . - length exceeds . - - - - Gets or sets the custom id of the current button. - - length exceeds - length subceeds 1. - - - - Gets or sets the of the current button. - - - - - Gets or sets the of the current button. - - - - - Gets or sets the url of the current button. - - - - - Gets or sets whether the current button is disabled. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a . - - The label to use on the newly created link button. - The url of this button. - The custom ID of this button. - The custom ID of this button. - The emote of this button. - Disabled this button or not. - - - - Creates a new instance of a from instance of a . - - - - - Creates a button with the style. - - The label for this link button. - The url for this link button to go to. - The emote for this link button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this danger button. - The custom id for this danger button. - The emote for this danger button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this primary button. - The custom id for this primary button. - The emote for this primary button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this secondary button. - The custom id for this secondary button. - The emote for this secondary button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this success button. - The custom id for this success button. - The emote for this success button. - A builder with the newly created button. - - - - Sets the current buttons label to the specified text. - - The text for the label. - - The current builder. - - - - Sets the current buttons style. - - The style for this builders button. - The current builder. - - - - Sets the current buttons emote. - - The emote to use for the current button. - The current builder. - - - - Sets the current buttons url. - - The url to use for the current button. - The current builder. - - - - Sets the custom id of the current button. - - The id to use for the current button. - - The current builder. - - - - Sets whether the current button is disabled. - - Whether the current button is disabled or not. - The current builder. - - - - Builds this builder into a to be used in a . - - A to be used in a . - A button must contain either a or a , but not both. - A button must have an or a . - A link button must contain a URL. - A URL must include a protocol (http or https). - A non-link button must contain a custom id - - - - Represents a class used to build 's. - - - - - The max length of a . - - - - - The maximum number of values for the and properties. - - - - - The maximum number of options a can have. - - - - - Gets or sets the custom id of the current select menu. - - length exceeds - length subceeds 1. - - - - Gets or sets the placeholder text of the current select menu. - - length exceeds . - length subceeds 1. - - - - Gets or sets the minimum values of the current select menu. - - exceeds . - - - - Gets or sets the maximum values of the current select menu. - - exceeds . - - - - Gets or sets a collection of for this current select menu. - - count exceeds . - is null. - - - - Gets or sets whether the current menu is disabled. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a from instance of . - - - - - Creates a new instance of a . - - The custom id of this select menu. - The options for this select menu. - The placeholder of this select menu. - The max values of this select menu. - The min values of this select menu. - Disabled this select menu or not. - - - - Sets the field CustomId. - - The value to set the field CustomId to. - - - The current builder. - - - - - Sets the field placeholder. - - The value to set the field placeholder to. - - - The current builder. - - - - - Sets the field minValues. - - The value to set the field minValues to. - - - The current builder. - - - - - Sets the field maxValues. - - The value to set the field maxValues to. - - - The current builder. - - - - - Sets the field options. - - The value to set the field options to. - - - The current builder. - - - - - Add one option to menu options. - - The option builder class containing the option properties. - Options count reached . - - The current builder. - - - - - Add one option to menu options. - - The label for this option. - The value of this option. - The description of this option. - The emote of this option. - Render this option as selected by default or not. - Options count reached . - - The current builder. - - - - - Sets whether the current menu is disabled. - - Whether the current menu is disabled or not. - - The current builder. - - - - - Builds a - - The newly built - - - - Represents a class used to build 's. - - - - - The maximum length of a . - - - - - The maximum length of a . - - - - - The maximum length of a . - - - - - Gets or sets the label of the current select menu. - - length exceeds - length subceeds 1. - - - - Gets or sets the custom id of the current select menu. - - length exceeds . - length subceeds 1. - - - - Gets or sets this menu options description. - - length exceeds . - length subceeds 1. - - - - Gets or sets the emote of this option. - - - - - Gets or sets the whether or not this option will render selected by default. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a . - - The label for this option. - The value of this option. - The description of this option. - The emote of this option. - Render this option as selected by default or not. - - - - Creates a new instance of a from instance of a . - - - - - Sets the field label. - - The value to set the field label to. - - - The current builder. - - - - - Sets the field value. - - The value to set the field value to. - - - The current builder. - - - - - Sets the field description. - - The value to set the field description to. - - - The current builder. - - - - - Sets the field emote. - - The value to set the field emote to. - - The current builder. - - - - - Sets the field default. - - The value to set the field default to. - - The current builder. - - - - - Builds a . - - The newly built . - - - - Represents a type of a component - - - - - A container for other components - - - - - A clickable button - - - - - A select menu for picking from choices - - - - - Represents a message component on a message. - - - - - Gets the of this Message Component. - - - - - Gets the custom id of the component if possible; otherwise . - - - - - Represents a component object used to send components with messages. - - - - - The components to be used in a message. - - - - - Returns a empty . - - - - - Represents a select menu component defined at - - - - - - - - The custom id of this Select menu that will be sent with a . - - - - - The menus options to select from. - - - - - A custom placeholder text if nothing is selected, max 100 characters. - - - - - The minimum number of items that must be chosen; default 1, min 0, max 25 - - - - - The maximum number of items that can be chosen; default 1, max 25 - - - - - Whether this menu is disabled or not. - - - - - Turns this select menu into a builder. - - - A newly create builder with the same properties as this select menu. - - - - - Represents a choice for a . - - - - - The user-facing name of the option, max 25 characters. - - - - - The dev-define value of the option, max 100 characters. - - - - - An additional description of the option, max 50 characters. - - - - - A that will be displayed with this menu option. - - - - - Will render this option as selected by default. - - - - - A class used to build slash commands. - - - - - Returns the maximun length a commands name allowed by Discord - - - - - Returns the maximum length of a commands description allowed by Discord. - - - - - Returns the maximum count of command options allowed by Discord - - - - - The name of this slash command. - - - - - A 1-100 length description of this slash command - - - - - Gets or sets the options for this command. - - - - - Whether the command is enabled by default when the app is added to a guild - - - - - Build the current builder into a class. - - A that can be used to create slash commands over rest. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the description of the current command. - - The description of this command. - The current builder. - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - If this option is set to autocompleate. - The options of the option to add. - The choices of this option. - The current builder. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The sescription of this option. - The current builder. - - - - Adds an option to this slash command. - - The option to add. - The current builder. - - - - Adds a collection of options to the current slash command. - - The collection of options to add. - The current builder. - - - - Represents a class used to build options for the . - - - - - The max length of a choice's name allowed by Discord. - - - - - The maximum number of choices allowed by Discord. - - - - - Gets or sets the name of this option. - - - - - Gets or sets the description of this option. - - - - - Gets or sets the type of this option. - - - - - Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - - - - - Gets or sets if the option is required. - - - - - Gets or sets whether or not this option supports autocomplete. - - - - - Gets or sets the choices for string and int types for the user to pick from. - - - - - Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. - - - - - Builds the current option. - - The built version of this option. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - The options of the option to add. - The choices of this option. - The current builder. - - - - Adds a sub option to the current option. - - The sub option to add. - The current builder. - - - - Adds a choice to the current option. - - The name of the choice. - The value of the choice. - The current builder. - - - - Adds a choice to the current option. - - The name of the choice. - The value of the choice. - The current builder. - - - - Sets the current builders name. - - The name to set the current option builder. - The current builder. - - - - Sets the current builders description. - - The description to set. - The current builder. - - - - Sets the current builders required field. - - The value to set. - The current builder. - - - - Sets the current builders default field. - - The value to set. - The current builder. - - - - Sets the current type of this builder. - - The type to set. - The current builder. - - - - A class used to create slash commands. - - - - - The discription of this command. - - - - - Gets or sets the options for this command. - - - - - Represents a generic invite object. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets the URL used to accept this invite using . - - - A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). - - - - - Gets the user that created this invite. - - - A user that created this invite. - - - - - Gets the channel this invite is linked to. - - - A generic channel that the invite points to. - - - - - Gets the type of the channel this invite is linked to. - - - - - Gets the ID of the channel this invite is linked to. - - - An representing the channel snowflake identifier that the invite points to. - - - - - Gets the name of the channel this invite is linked to. - - - A string containing the name of the channel that the invite points to. - - - - - Gets the guild this invite is linked to. - - - A guild object representing the guild that the invite points to. - - - - - Gets the ID of the guild this invite is linked to. - - - An representing the guild snowflake identifier that the invite points to. - - - - - Gets the name of the guild this invite is linked to. - - - A string containing the name of the guild that the invite points to. - - - - - Gets the approximated count of online members in the guild. - - - An representing the approximated online member count of the guild that the - invite points to; null if one cannot be obtained. - - - - - Gets the approximated count of total members in the guild. - - - An representing the approximated total member count of the guild that the - invite points to; null if one cannot be obtained. - - - - - Gets the user this invite is linked to via . - - - A user that is linked to this invite. - - - - - Gets the type of the linked for this invite. - - - The type of the linked user that is linked to this invite. - - - - - Represents additional information regarding the generic invite object. - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires; null if this - invite never expires. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite has been used. - - - - - Gets when this invite was created. - - - A representing the time of which the invite was first created. - - - - - The invite whose target user type is not defined. - - - - - The invite is for a Go Live stream. - - - - - The invite is for embedded application. - - - - Represents a Discord snowflake entity. - - - - Gets when the snowflake was created. - - - A representing when the entity was first created. - - - - - Defines whether the object is updateable or not. - - - - - Updates this object's properties with its current state. - - The options to be used when sending the request. - - - - Defines which mentions and types of mentions that will notify users from the message content. - - - - - Gets a value which indicates that no mentions in the message content should notify users. - - - - - Gets a value which indicates that all mentions in the message content should notify users. - - - - - Gets or sets the type of mentions that will be parsed from the message content. - - - The flag is mutually exclusive with the - property, and the flag is mutually exclusive with the - property. - If null, only the ids specified in and will be mentioned. - - - - - Gets or sets the list of all role ids that will be mentioned. - This property is mutually exclusive with the - flag of the property. If the flag is set, the value of this property - must be null or empty. - - - - - Gets or sets the list of all user ids that will be mentioned. - This property is mutually exclusive with the - flag of the property. If the flag is set, the value of this property - must be null or empty. - - - - - Gets or sets whether to mention the author of the message you are replying to or not. - - - Specifically for inline replies. - - - - - Initializes a new instance of the class. - - - The types of mentions to parse from the message content. - If null, only the ids specified in and will be mentioned. - - - - - Specifies the type of mentions that will be notified from the message content. - - - - - No flag is set. - - - This flag is not used to control mentions. - - It will always be present and does not mean mentions will not be allowed. - - - - - - Controls role mentions. - - - - - Controls user mentions. - - - - - Controls @everyone and @here mentions. - - - - - Represents an embed object seen in an . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the total length of all embed properties. - - - - - Gets the title of the embed. - - - - - A author field of an . - - - - - Gets the name of the author field. - - - - - Gets the URL of the author field. - - - - - Gets the icon URL of the author field. - - - - - Gets the proxified icon URL of the author field. - - - - - Gets the name of the author field. - - - - - - - - Represents a builder class for creating a . - - - - - Returns the maximum number of fields allowed by Discord. - - - - - Returns the maximum length of title allowed by Discord. - - - - - Returns the maximum length of description allowed by Discord. - - - - - Returns the maximum length of total characters allowed by Discord. - - - - Initializes a new class. - - - Gets or sets the title of an . - Title length exceeds . - - The title of the embed. - - - Gets or sets the description of an . - Description length exceeds . - The description of the embed. - - - Gets or sets the URL of an . - Url is not a well-formed . - The URL of the embed. - - - Gets or sets the thumbnail URL of an . - Url is not a well-formed . - The thumbnail URL of the embed. - - - Gets or sets the image URL of an . - Url is not a well-formed . - The image URL of the embed. - - - Gets or sets the list of of an . - An embed builder's fields collection is set to - null. - Fields count exceeds . - - The list of existing . - - - - Gets or sets the timestamp of an . - - - The timestamp of the embed, or null if none is set. - - - - - Gets or sets the sidebar color of an . - - - The color of the embed, or null if none is set. - - - - - Gets or sets the of an . - - - The author field builder of the embed, or null if none is set. - - - - - Gets or sets the of an . - - - The footer field builder of the embed, or null if none is set. - - - - - Gets the total length of all embed properties. - - - The combined length of , , , - , , and . - - - - - Sets the title of an . - - The title to be set. - - The current builder. - - - - - Sets the description of an . - - The description to be set. - - The current builder. - - - - - Sets the URL of an . - - The URL to be set. - - The current builder. - - - - - Sets the thumbnail URL of an . - - The thumbnail URL to be set. - - The current builder. - - - - - Sets the image URL of an . - - The image URL to be set. - - The current builder. - - - - - Sets the timestamp of an to the current time. - - - The current builder. - - - - - Sets the timestamp of an . - - The timestamp to be set. - - The current builder. - - - - - Sets the sidebar color of an . - - The color to be set. - - The current builder. - - - - - Sets the of an . - - The author builder class containing the author field properties. - - The current builder. - - - - - Sets the author field of an with the provided properties. - - The delegate containing the author field properties. - - The current builder. - - - - - Sets the author field of an with the provided name, icon URL, and URL. - - The title of the author field. - The icon URL of the author field. - The URL of the author field. - - The current builder. - - - - - Sets the of an . - - The footer builder class containing the footer field properties. - - The current builder. - - - - - Sets the footer field of an with the provided properties. - - The delegate containing the footer field properties. - - The current builder. - - - - - Sets the footer field of an with the provided name, icon URL. - - The title of the footer field. - The icon URL of the footer field. - - The current builder. - - - - - Adds an field with the provided name and value. - - The title of the field. - The value of the field. - Indicates whether the field is in-line or not. - - The current builder. - - - - - Adds a field with the provided to an - . - - The field builder class containing the field properties. - Field count exceeds . - - The current builder. - - - - - Adds an field with the provided properties. - - The delegate containing the field properties. - - The current builder. - - - - - Builds the into a Rich Embed ready to be sent. - - - The built embed object. - - Total embed length exceeds . - Any Url must include its protocols (i.e http:// or https://). - - - - Represents a builder class for an embed field. - - - - - Gets the maximum field length for name allowed by Discord. - - - - - Gets the maximum field length for value allowed by Discord. - - - - - Gets or sets the field name. - - - Field name is null, empty or entirely whitespace. - - or - - Field name length exceeds . - - - The name of the field. - - - - - Gets or sets the field value. - - - Field value is null, empty or entirely whitespace. - - or - - Field value length exceeds . - - - The value of the field. - - - - - Gets or sets a value that indicates whether the field should be in-line with each other. - - - - - Sets the field name. - - The name to set the field name to. - - The current builder. - - - - - Sets the field value. - - The value to set the field value to. - - The current builder. - - - - - Determines whether the field should be in-line with each other. - - - The current builder. - - - - - Builds the field builder into a class. - - - The current builder. - - - or is null, empty or entirely whitespace. - - or - - or exceeds the maximum length allowed by Discord. - - - - - Represents a builder class for a author field. - - - - - Gets the maximum author name length allowed by Discord. - - - - - Gets or sets the author name. - - - Author name length is longer than . - - - The author name. - - - - - Gets or sets the URL of the author field. - - Url is not a well-formed . - - The URL of the author field. - - - - - Gets or sets the icon URL of the author field. - - Url is not a well-formed . - - The icon URL of the author field. - - - - - Sets the name of the author field. - - The name of the author field. - - The current builder. - - - - - Sets the URL of the author field. - - The URL of the author field. - - The current builder. - - - - - Sets the icon URL of the author field. - - The icon URL of the author field. - - The current builder. - - - - - Builds the author field to be used. - - - Author name length is longer than . - - or - - is not a well-formed . - - or - - is not a well-formed . - - - The built author field. - - - - - Represents a builder class for an embed footer. - - - - - Gets the maximum footer length allowed by Discord. - - - - - Gets or sets the footer text. - - - Author name length is longer than . - - - The footer text. - - - - - Gets or sets the icon URL of the footer field. - - Url is not a well-formed . - - The icon URL of the footer field. - - - - - Sets the name of the footer field. - - The text of the footer field. - - The current builder. - - - - - Sets the icon URL of the footer field. - - The icon URL of the footer field. - - The current builder. - - - - - Builds the footer field to be used. - - - - length is longer than . - - or - - is not a well-formed . - - - A built footer field. - - - - - A field for an . - - - - - Gets the name of the field. - - - - - Gets the value of the field. - - - - - Gets a value that indicates whether the field should be in-line with each other. - - - - - Gets the name of the field. - - - A string that resolves to . - - - - A footer field for an . - - - - Gets the text of the footer field. - - - A string containing the text of the footer field. - - - - - Gets the URL of the footer icon. - - - A string containing the URL of the footer icon. - - - - - Gets the proxied URL of the footer icon link. - - - A string containing the proxied URL of the footer icon. - - - - - Gets the text of the footer field. - - - A string that resolves to . - - - - An image for an . - - - - Gets the URL of the image. - - - A string containing the URL of the image. - - - - - Gets a proxied URL of this image. - - - A string containing the proxied URL of this image. - - - - - Gets the height of this image. - - - A representing the height of this image if it can be retrieved; otherwise - null. - - - - - Gets the width of this image. - - - A representing the width of this image if it can be retrieved; otherwise - null. - - - - - Gets the URL of the thumbnail. - - - A string that resolves to . - - - - A provider field for an . - - - - Gets the name of the provider. - - - A string representing the name of the provider. - - - - - Gets the URL of the provider. - - - A string representing the link to the provider. - - - - - Gets the name of the provider. - - - A string that resolves to . - - - - A thumbnail featured in an . - - - - Gets the URL of the thumbnail. - - - A string containing the URL of the thumbnail. - - - - - Gets a proxied URL of this thumbnail. - - - A string containing the proxied URL of this thumbnail. - - - - - Gets the height of this thumbnail. - - - A representing the height of this thumbnail if it can be retrieved; otherwise - null. - - - - - Gets the width of this thumbnail. - - - A representing the width of this thumbnail if it can be retrieved; otherwise - null. - - - - - Gets the URL of the thumbnail. - - - A string that resolves to . - - - - - Specifies the type of embed. - - - - - An unknown embed type. - - - - - A rich embed type. - - - - - A link embed type. - - - - - A video embed type. - - - - - An image embed type. - - - - - A GIFV embed type. - - - - - An article embed type. - - - - - A tweet embed type. - - - - - A HTML embed type. - - - - - A video featured in an . - - - - - Gets the URL of the video. - - - A string containing the URL of the image. - - - - - Gets the height of the video. - - - A representing the height of this video if it can be retrieved; otherwise - null. - - - - - Gets the weight of the video. - - - A representing the width of this video if it can be retrieved; otherwise - null. - - - - - Gets the URL of the video. - - - A string that resolves to . - - - - - Represents a message attachment found in a . - - - - - Gets the ID of this attachment. - - - A snowflake ID associated with this attachment. - - - - - Gets the filename of this attachment. - - - A string containing the full filename of this attachment (e.g. textFile.txt). - - - - - Gets the URL of this attachment. - - - A string containing the URL of this attachment. - - - - - Gets a proxied URL of this attachment. - - - A string containing the proxied URL of this attachment. - - - - - Gets the file size of this attachment. - - - The size of this attachment in bytes. - - - - - Gets the height of this attachment. - - - The height of this attachment if it is a picture; otherwise null. - - - - - Gets the width of this attachment. - - - The width of this attachment if it is a picture; otherwise null. - - - - - Represents a Discord embed object. - - - - - Gets the title URL of this embed. - - - A string containing the URL set in a title of the embed. - - - - - Gets the title of this embed. - - - The title of the embed. - - - - - Gets the description of this embed. - - - The description field of the embed. - - - - - Gets the type of this embed. - - - The type of the embed. - - - - - Gets the timestamp of this embed. - - - A based on the timestamp present at the bottom left of the embed, or - null if none is set. - - - - - Gets the color of this embed. - - - The color of the embed present on the side of the embed, or null if none is set. - - - - - Gets the image of this embed. - - - The image of the embed, or null if none is set. - - - - - Gets the video of this embed. - - - The video of the embed, or null if none is set. - - - - - Gets the author field of this embed. - - - The author field of the embed, or null if none is set. - - - - - Gets the footer field of this embed. - - - The author field of the embed, or null if none is set. - - - - - Gets the provider of this embed. - - - The source of the embed, or null if none is set. - - - - - Gets the thumbnail featured in this embed. - - - The thumbnail featured in the embed, or null if none is set. - - - - - Gets the fields of the embed. - - - An array of the fields of the embed. - - - - - Represents a message object. - - - - - Gets the type of this message. - - - - - Gets the source type of this message. - - - - - Gets the value that indicates whether this message was meant to be read-aloud by Discord. - - - true if this message was sent as a text-to-speech message; otherwise false. - - - - - Gets the value that indicates whether this message is pinned. - - - true if this message was added to its channel's pinned messages; otherwise false. - - - - - Gets the value that indicates whether or not this message's embeds are suppressed. - - - true if the embeds in this message have been suppressed (made invisible); otherwise false. - - - - - Gets the value that indicates whether this message mentioned everyone. - - - true if this message mentioned everyone; otherwise false. - - - - - Gets the content for this message. - - - A string that contains the body of the message; note that this field may be empty if there is an embed. - - - - - Gets the time this message was sent. - - - Time of when the message was sent. - - - - - Gets the time of this message's last edit. - - - Time of when the message was last edited; null if the message is never edited. - - - - - Gets the source channel of the message. - - - - - Gets the author of this message. - - - - - Gets all attachments included in this message. - - - This property gets a read-only collection of attachments associated with this message. Depending on the - user's end-client, a sent message may contain one or more attachments. For example, mobile users may - attach more than one file in their message, while the desktop client only allows for one. - - - A read-only collection of attachments. - - - - - Gets all embeds included in this message. - - - This property gets a read-only collection of embeds associated with this message. Depending on the - message, a sent message may contain one or more embeds. This is usually true when multiple link previews - are generated; however, only one can be featured. - - - A read-only collection of embed objects. - - - - - Gets all tags included in this message's content. - - - - - Gets the IDs of channels mentioned in this message. - - - A read-only collection of channel IDs. - - - - - Gets the IDs of roles mentioned in this message. - - - A read-only collection of role IDs. - - - - - Gets the IDs of users mentioned in this message. - - - A read-only collection of user IDs. - - - - - Gets the activity associated with a message. - - - Sent with Rich Presence-related chat embeds. This often refers to activity that requires end-user's - interaction, such as a Spotify Invite activity. - - - A message's activity, if any is associated. - - - - - Gets the application associated with a message. - - - Sent with Rich-Presence-related chat embeds. - - - A message's application, if any is associated. - - - - - Gets the reference to the original message if it is a crosspost, channel follow add, pin, or reply message. - - - Sent with cross-posted messages, meaning they were published from news channels - and received by subscriber channels, channel follow adds, pins, and message replies. - - - A message's reference, if any is associated. - - - - - Gets all reactions included in this message. - - - - - The 's attached to this message - - - - - Gets all stickers items included in this message. - - - A read-only collection of sticker item objects. - - - - - Gets the flags related to this message. - - - This value is determined by bitwise OR-ing values together. - - - A message's flags, if any is associated. - - - - - Adds a reaction to this message. - - - The following example adds the reaction, 💕, to the message. - - await msg.AddReactionAsync(new Emoji("\U0001f495")); - - - The emoji used to react to this message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for adding a reaction to this message. - - - - - - Removes a reaction from message. - - - The following example removes the reaction, 💕, added by the message author from the message. - - await msg.RemoveReactionAsync(new Emoji("\U0001f495"), msg.Author); - - - The emoji used to react to this message. - The user that added the emoji. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - Removes a reaction from message. - - - The following example removes the reaction, 💕, added by the user with ID 84291986575613952 from the message. - - await msg.RemoveReactionAsync(new Emoji("\U0001f495"), 84291986575613952); - - - The emoji used to react to this message. - The ID of the user that added the emoji. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - Removes all reactions from this message. - - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Removes all reactions with a specific emoji from this message. - - The emoji used to react to this message. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets all users that reacted to a message with a given emote. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the users as a - collection. - - - Do not fetch too many users at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of reactions specified under . - The library will attempt to split up the requests according to your and - . In other words, should the user request 500 reactions, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets the users that have reacted with the emoji 💕 to the message. - - var emoji = new Emoji("\U0001f495"); - var reactedUsers = await message.GetReactionUsersAsync(emoji, 100).FlattenAsync(); - - - The emoji that represents the reaction that you wish to get. - The number of users to request. - The options to be used when sending the request. - - Paged collection of users. - - - - - Represents a generic reaction object. - - - - - The used in the reaction. - - - - - Represents a generic message sent by the system. - - - - - Represents a generic message sent by a user. - - - - - Gets the referenced message if it is a crosspost, channel follow add, pin, or reply message. - - - The referenced message, if any is associated and still exists. - - - - - Modifies this message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Adds this message to its channel's pinned messages. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for pinning this message. - - - - - Removes this message from its channel's pinned messages. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for unpinning this message. - - - - - Publishes (crossposts) this message. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for publishing this message. - - - - This call will throw an if attempted in a non-news channel. - - This method will publish (crosspost) the message. Please note, publishing (crossposting), is only available in news channels. - - - - - Transforms this message's text into a human-readable form by resolving its tags. - - Determines how the user tag should be handled. - Determines how the channel tag should be handled. - Determines how the role tag should be handled. - Determines how the @everyone tag should be handled. - Determines how the emoji tag should be handled. - - - - An activity object found in a sent message. - - - - This class refers to an activity object, visually similar to an embed within a message. However, a message - activity is interactive as opposed to a standard static embed. - - For example, a Spotify party invitation counts as a message activity. - - - - - Gets the type of activity of this message. - - - - - Gets the party ID of this activity, if any. - - - - - Gets the snowflake ID of the application. - - - - - Gets the ID of the embed's image asset. - - - - - Gets the application's description. - - - - - Gets the ID of the application's icon. - - - - - Gets the Url of the application's icon. - - - - - Gets the name of the application. - - - - - Default value for flags, when none are given to a message. - - - - - Flag given to messages that have been published to subscribed - channels (via Channel Following). - - - - - Flag given to messages that originated from a message in another - channel (via Channel Following). - - - - - Flag given to messages that do not display any embeds. - - - - - Flag given to messages that the source message for this crosspost - has been deleted (via Channel Following). - - - - - Flag given to messages that came from the urgent message system. - - - - - Flag given to messages has an associated thread, with the same id as the message - - - - - Flag given to messages that is only visible to the user who invoked the Interaction. - - - - - Flag given to messages that is an Interaction Response and the bot is "thinking" - - - - - Properties that are used to modify an with the specified changes. - - - The content of a message can be cleared with if and only if an - is present. - - - - - - Gets or sets the content of the message. - - - This must be less than the constant defined by . - - - - - Gets or sets a single embed for this message. - - - This property will be added to the array, in the future please use the array rather than this property. - - - - - Gets or sets the embeds of the message. - - - - - Gets or sets the components for this message. - - - - - Gets or sets the flags of the message. - - - Only can be set/unset and you need to be - the author of the message. - - - - - Gets or sets the allowed mentions of the message. - - - - - Contains the IDs sent from a crossposted message or inline reply. - - - - - Gets the Message ID of the original message. - - - - - Gets the Channel ID of the original message. - - - It only will be the default value (zero) if it was instantiated with a in the constructor. - - - - - Gets the Guild ID of the original message. - - - - - Initializes a new instance of the class. - - - The ID of the message that will be referenced. Used to reply to specific messages and the only parameter required for it. - - - The ID of the channel that will be referenced. It will be validated if sent. - - - The ID of the guild that will be referenced. It will be validated if sent. - - - - - Specifies the source of the Discord message. - - - - - The message is sent by the system. - - - - - The message is sent by a user. - - - - - The message is sent by a bot. - - - - - The message is sent by a webhook. - - - - - Specifies the type of message. - - - - - The default message type. - - - - - The message when a recipient is added. - - - - - The message when a recipient is removed. - - - - - The message when a user is called. - - - - - The message when a channel name is changed. - - - - - The message when a channel icon is changed. - - - - - The message when another message is pinned. - - - - - The message when a new member joined. - - - - - The message for when a user boosts a guild. - - - - - The message for when a guild reaches Tier 1 of Nitro boosts. - - - - - The message for when a guild reaches Tier 2 of Nitro boosts. - - - - - The message for when a guild reaches Tier 3 of Nitro boosts. - - - - - The message for when a news channel subscription is added to a text channel. - - - - - The message for when a guild is disqualified from discovery. - - - - - The message for when a guild is requalified for discovery. - - - - - The message for when the initial warning is sent for the initial grace period discovery. - - - - - The message for when the final warning is sent for the initial grace period discovery. - - - - - The message for when a thread is created. - - - - - The message is an inline reply. - - - Only available in API v8 - - - - - The message is an Application Command - - - Only available in API v8 - - - - - The message that starts a thread. - - - Only available in API v9 - - - - - The message for a invite reminder - - - - - A metadata containing reaction information. - - - - - Gets the number of reactions. - - - An representing the number of this reactions that has been added to this message. - - - - - Gets a value that indicates whether the current user has reacted to this. - - - true if the user has reacted to the message; otherwise false. - - - - Defines the types of formats for stickers. - - - Default value for a sticker format type. - - - The sticker format type is png. - - - The sticker format type is apng. - - - The sticker format type is lottie. - - - - Specifies the handling type the tag should use. - - - - - - - Tag handling is ignored (e.g. <@53905483156684800> -> <@53905483156684800>). - - - - - Removes the tag entirely. - - - - - Resolves to username (e.g. <@53905483156684800> -> @Voltana). - - - - - Resolves to username without mention prefix (e.g. <@53905483156684800> -> Voltana). - - - - - Resolves to username with discriminator value. (e.g. <@53905483156684800> -> @Voltana#8252). - - - - - Resolves to username with discriminator value without mention prefix. (e.g. <@53905483156684800> -> Voltana#8252). - - - - - Sanitizes the tag (e.g. <@53905483156684800> -> <@53905483156684800> (w/ nbsp)). - - - - Specifies the type of Discord tag. - - - The object is an user mention. - - - The object is a channel mention. - - - The object is a role mention. - - - The object is an everyone mention. - - - The object is a here mention. - - - The object is an emoji. - - - - Represents a class used to make timestamps in messages. see . - - - - - Gets or sets the style of the timestamp tag. - - - - - Gets or sets the time for this timestamp tag. - - - - - Converts the current timestamp tag to the string representation supported by discord. - - If the is null then the default 0 will be used. - - - A string thats compatable in a discord message, ex: <t:1625944201:f> - - - - Creates a new timestamp tag with the specified datetime object. - - The time of this timestamp tag. - The style for this timestamp tag. - The newly create timestamp tag. - - - - Represents a set of styles to use with a - - - - - A short time string: 16:20 - - - - - A long time string: 16:20:30 - - - - - A short date string: 20/04/2021 - - - - - A long date string: 20 April 2021 - - - - - A short datetime string: 20 April 2021 16:20 - - - - - A long datetime string: Tuesday, 20 April 2021 16:20 - - - - - The relative time to the user: 2 months ago - - - - - Application command permissions allow you to enable or disable commands for specific users or roles within a guild. - - - - - The id of the role or user. - - - - - The target of this permission. - - - - - to allow, otherwise . - - - - - Creates a new . - - The id you want to target this permission value for. - The type of the targetId parameter. - The value of this permission. - - - - Creates a new targeting . - - The user you want to target this permission value for. - The value of this permission. - - - - Creates a new targeting . - - The role you want to target this permission value for. - The value of this permission. - - - - Specifies the target of the permission. - - - - - The target of the permission is a role. - - - - - The target of the permission is a user. - - - - Defines the available permissions for a channel. - - - - Allows creation of instant invites. - - - - - Allows management and editing of channels. - - - - - Allows for the addition of reactions to messages. - - - - - Allows guild members to view a channel, which includes reading messages in text channels. - - - - - Allows for sending messages in a channel. - - - - - Allows for sending of text-to-speech messages. - - - - - Allows for deletion of other users messages. - - - - - Allows links sent by users with this permission will be auto-embedded. - - - - - Allows for uploading images and files. - - - - - Allows for reading of message history. - - - - - Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all - online users in a channel. - - - - - Allows the usage of custom emojis from other servers. - - - - - Allows for joining of a voice channel. - - - - - Allows for speaking in a voice channel. - - - - - Allows for muting members in a voice channel. - - - - - Allows for deafening of members in a voice channel. - - - - - Allows for moving of members between voice channels. - - - - - Allows for using voice-activity-detection in a voice channel. - - - - - Allows for using priority speaker in a voice channel. - - - - - Allows video streaming in a voice channel. - - - - - Allows management and editing of roles. - - - - - Allows management and editing of webhooks. - - - - - Allows management and editing of emojis. - - - - - Allows members to use slash commands in text channels. - - - - - Allows members to use slash commands in text channels. - - - - - Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.) - - - - - Allows for deleting and archiving threads, and viewing all private threads - - - - - Allows for creating and participating in threads - - - - - Allows for creating and participating in private threads - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows the usage of custom stickers from other servers. - - - - - Allows for sending messages in threads. - - - - - Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. - - - - Gets a blank that grants no permissions. - A structure that does not contain any set permissions. - - - Gets a that grants all permissions for text channels. - - - Gets a that grants all permissions for voice channels. - - - Gets a that grants all permissions for stage channels. - - - Gets a that grants all permissions for category channels. - - - Gets a that grants all permissions for direct message channels. - - - Gets a that grants all permissions for group channels. - - - Gets a that grants all permissions for a given channel type. - Unknown channel type. - - - Gets a packed value representing all the permissions in this . - - - If true, a user may create invites. - - - If true, a user may create, delete and modify this channel. - - - If true, a user may add reactions. - - - If true, a user may view channels. - - - If true, a user may send messages. - - - If true, a user may send text-to-speech messages. - - - If true, a user may delete messages. - - - If true, Discord will auto-embed links sent by this user. - - - If true, a user may send files. - - - If true, a user may read previous messages. - - - If true, a user may mention @everyone. - - - If true, a user may use custom emoji from other guilds. - - - If true, a user may connect to a voice channel. - - - If true, a user may speak in a voice channel. - - - If true, a user may mute users. - - - If true, a user may deafen users. - - - If true, a user may move other users between voice channels. - - - If true, a user may use voice-activity-detection rather than push-to-talk. - - - If true, a user may use priority speaker in a voice channel. - - - If true, a user may stream video in a voice channel. - - - If true, a user may adjust role permissions. This also implictly grants all other permissions. - - - If true, a user may edit the webhooks for this channel. - - - If true, a user may use application commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activites in voice channels in this guild. - - - Creates a new with the provided packed value. - - - Creates a new with the provided permissions. - - - Creates a new from this one, changing the provided non-null permissions. - - - - Returned when fetching the permissions for a command in a guild. - - - - - The id of the command. - - - - - The id of the application the command belongs to. - - - - - The id of the guild. - - - - - The permissions for the command in the guild. - - - - Defines the available permissions for a channel. - - - - Allows creation of instant invites. - - - - - Allows kicking members. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows banning members. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows all permissions and bypasses channel permission overwrites. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of channels. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of the guild. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows for viewing of guild insights - - - - - Allows for the addition of reactions to messages. - - - - - Allows for viewing of audit logs. - - - - - Allows guild members to view a channel, which includes reading messages in text channels. - - - - - Allows for sending messages in a channel - - - - - Allows for sending of text-to-speech messages. - - - - - Allows for deletion of other users messages. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows links sent by users with this permission will be auto-embedded. - - - - - Allows for uploading images and files. - - - - - Allows for reading of message history. - - - - - Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all - online users in a channel. - - - - - Allows the usage of custom emojis from other servers. - - - - - Allows for joining of a voice channel. - - - - - Allows for speaking in a voice channel. - - - - - Allows for muting members in a voice channel. - - - - - Allows for deafening of members in a voice channel. - - - - - Allows for moving of members between voice channels. - - - - - Allows for using voice-activity-detection in a voice channel. - - - - - Allows for using priority speaker in a voice channel. - - - - - Allows video streaming in a voice channel. - - - - - Allows for modification of own nickname. - - - - - Allows for modification of other users nicknames. - - - - - Allows management and editing of roles. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of webhooks. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of emojis and stickers. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows members to use slash commands in text channels. - - - - - Allows members to use application commands like slash commands and context menus in text channels. - - - - - Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.). - - - - - Allows for deleting and archiving threads, and viewing all private threads. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows the usage of custom stickers from other servers. - - - - - Allows for sending messages in threads. - - - - - Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. - - - - Gets a blank that grants no permissions. - - - Gets a that grants all guild permissions for webhook users. - - - Gets a that grants all guild permissions. - - - Gets a packed value representing all the permissions in this . - - - If true, a user may create invites. - - - If true, a user may ban users from the guild. - - - If true, a user may kick users from the guild. - - - If true, a user is granted all permissions, and cannot have them revoked via channel permissions. - - - If true, a user may create, delete and modify channels. - - - If true, a user may adjust guild properties. - - - If true, a user may add reactions. - - - If true, a user may view the audit log. - - - If true, a user may view the guild insights. - - - If True, a user may view channels. - - - If True, a user may send messages. - - - If true, a user may send text-to-speech messages. - - - If true, a user may delete messages. - - - If true, Discord will auto-embed links sent by this user. - - - If true, a user may send files. - - - If true, a user may read previous messages. - - - If true, a user may mention @everyone. - - - If true, a user may use custom emoji from other guilds. - - - If true, a user may connect to a voice channel. - - - If true, a user may speak in a voice channel. - - - If true, a user may mute users. - - - If true, a user may deafen users. - - - If true, a user may move other users between voice channels. - - - If true, a user may use voice-activity-detection rather than push-to-talk. - - - If True, a user may use priority speaker in a voice channel. - - - If True, a user may stream video in a voice channel. - - - If true, a user may change their own nickname. - - - If true, a user may change the nickname of other users. - - - If true, a user may adjust roles. - - - If true, a user may edit the webhooks for this guild. - - - If true, a user may edit the emojis and stickers for this guild. - - - If true, a user may use slash commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activites in voice channels in this guild. - - - Creates a new with the provided packed value. - - - Creates a new with the provided packed value after converting to ulong. - - - Creates a new structure with the provided permissions. - - - Creates a new from this one, changing the provided non-null permissions. - - - - Returns a value that indicates if a specific is enabled - in these permissions. - - The permission value to check for. - true if the permission is enabled, false otherwise. - - - - Returns a containing all of the - flags that are enabled. - - A containing flags. Empty if none are enabled. - - - - Represent a permission object. - - - - - Gets the unique identifier for the object this overwrite is targeting. - - - - - Gets the type of object this overwrite is targeting. - - - - - Gets the permissions associated with this overwrite entry. - - - - - Initializes a new with provided target information and modified permissions. - - - - - Represents a container for a series of overwrite permissions. - - - - - Gets a blank that inherits all permissions. - - - - - Gets a that grants all permissions for the given channel. - - Unknown channel type. - - - - Gets a that denies all permissions for the given channel. - - Unknown channel type. - - - - Gets a packed value representing all the allowed permissions in this . - - - - - Gets a packed value representing all the denied permissions in this . - - - - If Allowed, a user may create invites. - - - If Allowed, a user may create, delete and modify this channel. - - - If Allowed, a user may add reactions. - - - If Allowed, a user may join channels. - - - If Allowed, a user may send messages. - - - If Allowed, a user may send text-to-speech messages. - - - If Allowed, a user may delete messages. - - - If Allowed, Discord will auto-embed links sent by this user. - - - If Allowed, a user may send files. - - - If Allowed, a user may read previous messages. - - - If Allowed, a user may mention @everyone. - - - If Allowed, a user may use custom emoji from other guilds. - - - If Allowed, a user may connect to a voice channel. - - - If Allowed, a user may speak in a voice channel. - - - If Allowed, a user may mute users. - - - If Allowed, a user may deafen users. - - - If Allowed, a user may move other users between voice channels. - - - If Allowed, a user may use voice-activity-detection rather than push-to-talk. - - - If Allowed, a user may use priority speaker in a voice channel. - - - If Allowed, a user may go live in a voice channel. - - - If Allowed, a user may adjust role permissions. This also implicitly grants all other permissions. - - - If True, a user may edit the webhooks for this channel. - - - If true, a user may use slash commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activites in voice channels in this guild. - - - Creates a new OverwritePermissions with the provided allow and deny packed values. - - - Creates a new OverwritePermissions with the provided allow and deny packed values after converting to ulong. - - - - Initializes a new struct with the provided permissions. - - - - - Initializes a new from the current one, changing the provided - non-null permissions. - - - - - Creates a of all the values that are allowed. - - A of all allowed flags. If none, the list will be empty. - - - - Creates a of all the values that are denied. - - A of all denied flags. If none, the list will be empty. - - - Specifies the permission value. - - - Allows this permission. - - - Denies this permission. - - - Inherits the permission settings. - - - - Represents a color used in Discord. - - - - Gets the max decimal value of color. - - - Gets the default user color value. - - - Gets the teal color value. - A color struct with the hex value of 1ABC9C. - - - Gets the dark teal color value. - A color struct with the hex value of 11806A. - - - Gets the green color value. - A color struct with the hex value of 2ECC71. - - - Gets the dark green color value. - A color struct with the hex value of 1F8B4C. - - - Gets the blue color value. - A color struct with the hex value of 3498DB. - - - Gets the dark blue color value. - A color struct with the hex value of 206694. - - - Gets the purple color value. - A color struct with the hex value of 9B59B6. - - - Gets the dark purple color value. - A color struct with the hex value of 71368A. - - - Gets the magenta color value. - A color struct with the hex value of E91E63. - - - Gets the dark magenta color value. - A color struct with the hex value of AD1457. - - - Gets the gold color value. - A color struct with the hex value of F1C40F. - - - Gets the light orange color value. - A color struct with the hex value of C27C0E. - - - Gets the orange color value. - A color struct with the hex value of E67E22. - - - Gets the dark orange color value. - A color struct with the hex value of A84300. - - - Gets the red color value. - A color struct with the hex value of E74C3C. - - - Gets the dark red color value. - A color struct with the hex value of 992D22. - - - Gets the light grey color value. - A color struct with the hex value of 979C9F. - - - Gets the lighter grey color value. - A color struct with the hex value of 95A5A6. - - - Gets the dark grey color value. - A color struct with the hex value of 607D8B. - - - Gets the darker grey color value. - A color struct with the hex value of 546E7A. - - - Gets the encoded value for this color. - - This value is encoded as an unsigned integer value. The most-significant 8 bits contain the red value, - the middle 8 bits contain the green value, and the least-significant 8 bits contain the blue value. - - - - Gets the red component for this color. - - - Gets the green component for this color. - - - Gets the blue component for this color. - - - - Initializes a struct with the given raw value. - - - The following will create a color that has a hex value of - #607D8B. - - Color darkGrey = new Color(0x607D8B); - - - The raw value of the color (e.g. 0x607D8B). - Value exceeds . - - - - Initializes a struct with the given RGB bytes. - - - The following will create a color that has a value of - #607D8B. - - Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); - - - The byte that represents the red color. - The byte that represents the green color. - The byte that represents the blue color. - Value exceeds . - - - - Initializes a struct with the given RGB value. - - - The following will create a color that has a value of - #607D8B. - - Color darkGrey = new Color(96, 125, 139); - - - The value that represents the red color. Must be within 0~255. - The value that represents the green color. Must be within 0~255. - The value that represents the blue color. Must be within 0~255. - The argument value is not between 0 to 255. - - - - Initializes a struct with the given RGB float value. - - - The following will create a color that has a value of - #607c8c. - - Color darkGrey = new Color(0.38f, 0.49f, 0.55f); - - - The value that represents the red color. Must be within 0~1. - The value that represents the green color. Must be within 0~1. - The value that represents the blue color. Must be within 0~1. - The argument value is not between 0 to 1. - - - - Gets the hexadecimal representation of the color (e.g. #000ccc). - - - A hexadecimal string of the color. - - - - - Represents a generic role object to be given to a guild user. - - - - - Gets the guild that owns this role. - - - A guild representing the parent guild of this role. - - - - - Gets the color given to users of this role. - - - A struct representing the color of this role. - - - - - Gets a value that indicates whether the role can be separated in the user list. - - - true if users of this role are separated in the user list; otherwise false. - - - - - Gets a value that indicates whether the role is managed by Discord. - - - true if this role is automatically managed by Discord; otherwise false. - - - - - Gets a value that indicates whether the role is mentionable. - - - true if this role may be mentioned in messages; otherwise false. - - - - - Gets the name of this role. - - - A string containing the name of this role. - - - - - Gets the permissions granted to members of this role. - - - A struct that this role possesses. - - - - - Gets this role's position relative to other roles in the same guild. - - - An representing the position of the role in the role list of the guild. - - - - - Gets the tags related to this role. - - - A object containing all tags related to this role. - - - - - Modifies this role. - - - This method modifies this role with the specified properties. To see an example of this - method and what properties are available, please refer to . - - A delegate containing the properties to modify the role with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Properties that are used to reorder an . - - - - - Gets the identifier of the role to be edited. - - - A representing the snowflake identifier of the role to be modified. - - - - - Gets the new zero-based position of the role. - - - An representing the new zero-based position of the role. - - - - - Initializes a with the given role ID and position. - - The ID of the role to be edited. - The new zero-based position of the role. - - - - Properties that are used to modify an with the specified changes. - - - The following example modifies the role to a mentionable one, renames the role into Sonic, and - changes the color to a light-blue. - - await role.ModifyAsync(x => - { - x.Name = "Sonic"; - x.Color = new Color(0x1A50BC); - x.Mentionable = true; - }); - - - - - - - Gets or sets the name of the role. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets the role's . - - - - - Gets or sets the position of the role. This is 0-based! - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets the color of the role. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets whether or not this role should be displayed independently in the user list. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets whether or not this role can be mentioned. - - - This value may not be set if the role is an @everyone role. - - - - - Provides tags related to a discord role. - - - - - Gets the identifier of the bot that this role belongs to, if it does. - - - A if this role belongs to a bot; otherwise - . - - - - - Gets the identifier of the integration that this role belongs to, if it does. - - - A if this role belongs to an integration; otherwise - . - - - - - Gets if this role is the guild's premium subscriber (booster) role. - - - if this role is the guild's premium subscriber role; - otherwise . - - - - - Represents a custom sticker within a guild. - - - - - Gets the users id who uploaded the sticker. - - - In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - Gets the guild that this custom sticker is in. - - - - - Modifies this sticker. - - - This method modifies this sticker with the specified properties. To see an example of this - method and what properties are available, please refer to . -
-
- The bot needs the MANAGE_EMOJIS_AND_STICKERS permission within the guild in order to modify stickers. -
- - The following example replaces the name of the sticker with kekw. - - await sticker.ModifyAsync(x => x.Name = "kekw"); - - - A delegate containing the properties to modify the sticker with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - -
- - - Deletes the current sticker. - - - The bot neeeds the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. - - The options to be used when sending the request. - - A task that represents the asynchronous deletion operation. - - - - - Represents a discord sticker. - - - - - Gets the ID of this sticker. - - - A snowflake ID associated with this sticker. - - - - - Gets the ID of the pack of this sticker. - - - A snowflake ID associated with the pack of this sticker. - - - - - Gets the name of this sticker. - - - A with the name of this sticker. - - - - - Gets the description of this sticker. - - - A with the description of this sticker. - - - - - Gets the list of tags of this sticker. - - - A read-only list with the tags of this sticker. - - - - - Gets the type of this sticker. - - - - - Gets the format type of this sticker. - - - A with the format type of this sticker. - - - - - Gets whether this guild sticker can be used, may be false due to loss of Server Boosts - - - - - Gets the standard sticker's sort order within its pack - - - - - Gets the image url for this sticker. - - - - - Represents a partial sticker item received with a message. - - - - - The id of the sticker. - - - - - The name of the sticker. - - - - - The format of the sticker. - - - - - Represents a discord sticker pack. - - The type of the stickers within the collection - - - - Gets the id of the sticker pack. - - - - - Gets a collection of the stickers in the pack. - - - - - Gets the name of the sticker pack. - - - - - Gets the id of the pack's SKU. - - - - - Gets the id of a sticker in the pack which is shown as the pack's icon. - - - - - Gets the description of the sticker pack. - - - - - Gets the id of the sticker pack's banner image - - - - - Represents a class used to modify stickers. - - - - - Gets or sets the name of the sticker. - - - - - Gets or sets the description of the sticker. - - - - - Gets or sets the tags of the sticker. - - - - - Represents a type of sticker - - - - - Represents a discord standard sticker, this type of sticker cannot be modified by an application. - - - - - Represents a sticker that was created within a guild. - - - - - Represents a Discord Team. - - - - - Gets the team icon url. - - - - - Gets the team unique identifier. - - - - - Gets the members of this team. - - - - - Gets the name of this team. - - - - - Gets the user identifier that owns this team. - - - - - Represents a Discord Team member. - - - - - Gets the membership state of this team member. - - - - - Gets the permissions of this team member. - - - - - Gets the team unique identifier for this team member. - - - - - Gets the Discord user of this team member. - - - - - Represents the membership state of a team member. - - - - - Properties that are used to add a new to the guild with the following parameters. - - - - - - Gets or sets the user's nickname. - - - To clear the user's nickname, this value can be set to null or - . - - - - - Gets or sets whether the user should be muted in a voice channel. - - - If this value is set to true, no user will be able to hear this user speak in the guild. - - - - - Gets or sets whether the user should be deafened in a voice channel. - - - If this value is set to true, this user will not be able to hear anyone speak in the guild. - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Defines the types of clients a user can be active on. - - - - - The user is active using the mobile application. - - - - - The user is active using the desktop application. - - - - - The user is active using the web application. - - - - - Properties that are used to modify an with the following parameters. - - - - - - Gets or sets whether the user should be muted in a voice channel. - - - If this value is set to true, no user will be able to hear this user speak in the guild. - - - - - Gets or sets whether the user should be deafened in a voice channel. - - - If this value is set to true, this user will not be able to hear anyone speak in the guild. - - - - - Gets or sets the user's nickname. - - - To clear the user's nickname, this value can be set to null or - . - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Moves a user to a voice channel. If null, this user will be disconnected from their current voice channel. - - - This user MUST already be in a for this to work. - When set, this property takes precedence over . - - - - - Moves a user to a voice channel. Set to null to disconnect this user from their current voice channel. - - - This user MUST already be in a for this to work. - - - - Gets the ID of the connection account. - A representing the unique identifier value of this connection. - - - Gets the service of the connection (twitch, youtube). - A string containing the name of this type of connection. - - - Gets the username of the connection account. - A string containing the name of this connection. - - - Gets whether the connection is revoked. - A value which if true indicates that this connection has been revoked, otherwise false. - - - Gets a of integration IDs. - - An containing - representations of unique identifier values of integrations. - - - - - Represents a Discord user that is in a group. - - - - - Represents a generic guild user. - - - - - Gets when this user joined the guild. - - - A representing the time of which the user has joined the guild; - null when it cannot be obtained. - - - - - Gets the nickname for this user. - - - A string representing the nickname of the user; null if none is set. - - - - - Gets the guild-level permissions for this user. - - - A structure for this user, representing what - permissions this user has in the guild. - - - - - Gets the guild for this user. - - - A guild object that this user belongs to. - - - - - Gets the ID of the guild for this user. - - - An representing the snowflake identifier of the guild that this user belongs to. - - - - - Gets the date and time for when this user's guild boost began. - - - A for when the user began boosting this guild; null if they are not boosting the guild. - - - - - Gets a collection of IDs for the roles that this user currently possesses in the guild. - - - This property returns a read-only collection of the identifiers of the roles that this user possesses. - For WebSocket users, a Roles property can be found in place of this property. Due to the REST - implementation, only a collection of identifiers can be retrieved instead of the full role objects. - - - A read-only collection of , each representing a snowflake identifier for a role that - this user possesses. - - - - - Whether the user has passed the guild's Membership Screening requirements. - - - - - Gets the users position within the role hierarchy. - - - - - Gets the level permissions granted to this user to a given channel. - - - The following example checks if the current user has the ability to send a message with attachment in - this channel; if so, uploads a file via . - - if (currentUser?.GetPermissions(targetChannel)?.AttachFiles) - await targetChannel.SendFileAsync("fortnite.png"); - - - The channel to get the permission from. - - A structure representing the permissions that a user has in the - specified channel. - - - - - Kicks this user from this guild. - - The reason for the kick which will be recorded in the audit log. - The options to be used when sending the request. - - A task that represents the asynchronous kick operation. - - - - - Modifies this user's properties in this guild. - - - This method modifies the current guild user with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The delegate containing the properties to modify the user with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Adds the specified role to this user in the guild. - - The role to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified role to this user in the guild. - - The role to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified to this user in the guild. - - The roles to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified to this user in the guild. - - The roles to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Removes the specified from this user in the guild. - - The role to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The role to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The roles to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The roles to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Represents the user's presence status. This may include their online status and their activity. - - - - - Gets the current status of this user. - - - - - Gets the set of clients where this user is currently active. - - - - - Gets the list of activities that this user currently has available. - - - - - Represents the logged-in Discord user. - - - - - Gets the email associated with this user. - - - - - Indicates whether or not this user has their email verified. - - - true if this user's email has been verified; false if not. - - - - - Indicates whether or not this user has MFA enabled on their account. - - - true if this user has enabled multi-factor authentication on their account; false if not. - - - - - Gets the flags that are applied to a user's account. - - - This value is determined by bitwise OR-ing values together. - - - The value of flags for this user. - - - - - Gets the type of Nitro subscription that is active on this user's account. - - - This information may only be available with the identify OAuth scope. - - - The type of Nitro subscription the user subscribes to, if any. - - - - - Gets the user's chosen language option. - - - The IETF language tag of the user's chosen region, if provided. - For example, a locale of "English, US" is "en-US", "Chinese (Taiwan)" is "zh-TW", etc. - - - - - Modifies the user's properties. - - - - - Represents a generic user. - - - - - Gets the identifier of this user's avatar. - - - - - Gets the identifier of this user's banner. - - - - - Gets the user's banner color. - - - A struct representing the accent color of this user's banner. - - - - - Gets the avatar URL for this user. - - - This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar - (i.e. their avatar identifier is not set), this method will return null. If you wish to - retrieve the default avatar for this user, consider using (see - example). - - - 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. - - - The format to return. - The size of the image to return in. This can be any power of two between 16 and 2048. - - - A string representing the user's avatar URL; null if the user does not have an avatar in place. - - - - - Gets the banner URL for this user. - - The format to return. - The size of the image to return in. This can be any power of two between 16 and 2048. - - - A string representing the user's avatar URL; null if the user does not have an banner in place. - - - - - Gets the default avatar URL for this user. - - - This property retrieves a URL for this user's default avatar generated by Discord (Discord logo followed - by a random color as its background). This property will always return a value as it is calculated based - on the user's (discriminator % 5). - - - A string representing the user's avatar URL. - - - - - Gets the per-username unique ID for this user. - - - - - Gets the per-username unique ID for this user. - - - - - Gets a value that indicates whether this user is identified as a bot. - - - This property retrieves a value that indicates whether this user is a registered bot application - (indicated by the blue BOT tag within the official chat client). - - - true if the user is a bot application; otherwise false. - - - - - Gets a value that indicates whether this user is a webhook user. - - - true if the user is a webhook; otherwise false. - - - - - Gets the username for this user. - - - - - Gets the public flags that are applied to this user's account. - - - This value is determined by bitwise OR-ing values together. - - - The value of public flags for this user. - - - - - Creates the direct message channel of this user. - - - This method is used to obtain or create a channel used to send a direct message. - - In event that the current user cannot send a message to the target user, a channel can and will - still be created by Discord. However, attempting to send a message will yield a - with a 403 as its - . There are currently no official workarounds by - Discord. - - - - The following example attempts to send a direct message to the target user and logs the incident should - it fail. - - - The options to be used when sending the request. - - A task that represents the asynchronous operation for getting or creating a DM channel. The task result - contains the DM channel associated with this user. - - - - - Represents a user's voice connection status. - - - - - Gets a value that indicates whether this user is deafened by the guild. - - - true if the user is deafened (i.e. not permitted to listen to or speak to others) by the guild; - otherwise false. - - - - - Gets a value that indicates whether this user is muted (i.e. not permitted to speak via voice) by the - guild. - - - true if this user is muted by the guild; otherwise false. - - - - - Gets a value that indicates whether this user has marked themselves as deafened. - - - true if this user has deafened themselves (i.e. not permitted to listen to or speak to others); otherwise false. - - - - - Gets a value that indicates whether this user has marked themselves as muted (i.e. not permitted to - speak via voice). - - - true if this user has muted themselves; otherwise false. - - - - - Gets a value that indicates whether the user is muted by the current user. - - - true if the guild is temporarily blocking audio to/from this user; otherwise false. - - - - - Gets the voice channel this user is currently in. - - - A generic voice channel object representing the voice channel that the user is currently in; null - if none. - - - - - Gets the unique identifier for this user's voice session. - - - - - Gets a value that indicates if this user is streaming in a voice channel. - - - true if the user is streaming; otherwise false. - - - - - Gets the time on which the user requested to speak. - - - - Represents a Webhook Discord user. - - - Gets the ID of a webhook. - - - - Specifies the type of subscription a user is subscribed to. - - - - - No subscription. - - - - - Nitro Classic subscription. Includes app perks like animated emojis and avatars, but not games. - - - - - Nitro subscription. Includes app perks as well as the games subscription service. - - - - - Properties that are used to modify the with the specified changes. - - - - - - Gets or sets the username. - - - - - Gets or sets the avatar. - - - - - Default value for flags, when none are given to an account. - - - - - Flag given to users who are a Discord employee. - - - - - Flag given to users who are owners of a partnered Discord server. - - - - - Flag given to users in HypeSquad events. - - - - - Flag given to users who have participated in the bug report program and are level 1. - - - - - Flag given to users who are in the HypeSquad House of Bravery. - - - - - Flag given to users who are in the HypeSquad House of Brilliance. - - - - - Flag given to users who are in the HypeSquad House of Balance. - - - - - Flag given to users who subscribed to Nitro before games were added. - - - - - Flag given to users who are part of a team. - - - - - Flag given to users who represent Discord (System). - - - - - Flag given to users who have participated in the bug report program and are level 2. - - - - - Flag given to users who are verified bots. - - - - - Flag given to users that developed bots and early verified their accounts. - - - - - Flag given to users that are discord certified moderators who has give discord's exam. - - - - - Defines the available Discord user status. - - - - - The user is offline. - - - - - The user is online. - - - - - The user is idle. - - - - - The user is AFK. - - - - - The user is busy. - - - - - The user is invisible. - - - - - Represents a webhook object on Discord. - - - - - Gets the token of this webhook. - - - - - Gets the default name of this webhook. - - - - - Gets the ID of this webhook's default avatar. - - - - - Gets the URL to this webhook's default avatar. - - - - - Gets the channel for this webhook. - - - - - Gets the ID of the channel for this webhook. - - - - - Gets the guild owning this webhook. - - - - - Gets the ID of the guild owning this webhook. - - - - - Gets the user that created this webhook. - - - - - Gets the ID of the application owning this webhook. - - - - - Modifies this webhook. - - - - - Properties used to modify an with the specified changes. - - - - - - Gets or sets the default name of the webhook. - - - - - Gets or sets the default avatar of the webhook. - - - - - Gets or sets the channel for this webhook. - - - This field is not used when authenticated with . - - - - - Gets or sets the channel ID for this webhook. - - - This field is not used when authenticated with . - - - - - Represents the type of a webhook. - - - This type is currently unused, and is only returned in audit log responses. - - - - An incoming webhook - - - An extension class for squashing . - - This set of extension methods will squash an into a - single . This is often associated with requests that has a - set limit when requesting. - - - - Flattens the specified pages into one asynchronously. - - - Flattens the specified pages into one . - - - - The prefix applied to files to indicate that it is a spoiler. - - - - - Gets whether the message's attachments are spoilers or not. - - - - An extension class for the Discord client. - - - Gets the private channel with the provided ID. - - - Gets the DM channel with the provided ID. - - - Gets all available DM channels for the client. - - - Gets the group channel with the provided ID. - - - Gets all available group channels for the client. - - - Gets the most optimal voice region for the client. - - - An extension class for building an embed. - - - Adds embed color based on the provided raw value. - - - Adds embed color based on the provided RGB value. - - - Adds embed color based on the provided RGB value. - The argument value is not between 0 to 255. - - - Adds embed color based on the provided RGB value. - The argument value is not between 0 to 1. - - - Fills the embed author field with the provided user's full username and avatar URL. - - - Converts a object to a . - The embed type is not . - - - - Adds the specified fields into this . - - Field count exceeds . - - - - Adds the specified fields into this . - - - - - An extension class for . - - - - - Gets if welcome system messages are enabled. - - The guild to check. - A bool indicating if the welcome messages are enabled in the system channel. - - - - Gets if guild boost system messages are enabled. - - The guild to check. - A bool indicating if the guild boost messages are enabled in the system channel. - - - - Provides extension methods for . - - - - - Gets a URL that jumps to the message. - - The message to jump to. - - A string that contains a URL for jumping to the message in chat. - - - - - Add multiple reactions to a message. - - - This method does not bulk add reactions! It will send a request for each reaction inculded. - - - - IEmote A = new Emoji("🅰"); - IEmote B = new Emoji("🅱"); - await msg.AddReactionsAsync(new[] { A, B }); - - - The message to add reactions to. - An array of reactions to add to the message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for adding a reaction to this message. - - - - - - - Remove multiple reactions from a message. - - - This method does not bulk remove reactions! If you want to clear reactions from a message, - - - - - await msg.RemoveReactionsAsync(currentUser, new[] { A, B }); - - - The message to remove reactions from. - The user who removed the reaction. - An array of reactions to remove from the message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - - Sends an inline reply that references a message. - - The message that is being replyed on. - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - A array of s to send with this response. Max 10. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The options to be used when sending the request. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - An extension class for various Discord user objects. - - - - Sends a message via DM. - - - This method attempts to send a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - The user to send the DM to. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message components to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents the asynchronous send operation. The task result contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a - rich embed to the channel. - - await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); - - - - This method attempts to send an attachment as a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The user to send the DM to. - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - The message component to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file via DM with an optional caption. - - - The following example uploads a local file called wumpus.txt along with the text - good discord boi to the channel. - - await channel.SendFileAsync("wumpus.txt", "good discord boi"); - - - The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the - channel. - - await channel.SendFileAsync("b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); - - - - This method attempts to send an attachment as a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The user to send the DM to. - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - The message component to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Bans the user from the guild and optionally prunes their recent messages. - - The user to ban. - The number of days to remove messages from this for - must be between [0, 7] - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous operation for banning a user. - - - - A helper class for formatting characters. - - - Returns a markdown-formatted string with bold formatting. - - - Returns a markdown-formatted string with italics formatting. - - - Returns a markdown-formatted string with underline formatting. - - - Returns a markdown-formatted string with strikethrough formatting. - - - Returns a string with spoiler formatting. - - - Returns a markdown-formatted URL. Only works in descriptions and fields. - - - Escapes a URL so that a preview is not generated. - - - Returns a markdown-formatted string with codeblock formatting. - - - Sanitizes the string, safely escaping any Markdown sequences. - - - - Formats a string as a quote. - - The text to format. - Gets the formatted quote text. - - - - Formats a string as a block quote. - - The text to format. - Gets the formatted block quote text. - - - This intent includes no events - - - This intent includes GUILD_CREATE, GUILD_UPDATE, GUILD_DELETE, GUILD_ROLE_CREATE, GUILD_ROLE_UPDATE, GUILD_ROLE_DELETE, CHANNEL_CREATE, CHANNEL_UPDATE, CHANNEL_DELETE, CHANNEL_PINS_UPDATE - - - This intent includes GUILD_MEMBER_ADD, GUILD_MEMBER_UPDATE, GUILD_MEMBER_REMOVE - This is a privileged intent and must be enabled in the Developer Portal. - - - This intent includes GUILD_BAN_ADD, GUILD_BAN_REMOVE - - - This intent includes GUILD_EMOJIS_UPDATE - - - This intent includes GUILD_INTEGRATIONS_UPDATE - - - This intent includes WEBHOOKS_UPDATE - - - This intent includes INVITE_CREATE, INVITE_DELETE - - - This intent includes VOICE_STATE_UPDATE - - - This intent includes PRESENCE_UPDATE - This is a privileged intent and must be enabled in the Developer Portal. - - - This intent includes MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, MESSAGE_DELETE_BULK - - - This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI - - - This intent includes TYPING_START - - - This intent includes CHANNEL_CREATE, MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, CHANNEL_PINS_UPDATE - - - This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI - - - This intent includes TYPING_START - - - - This intent includes all but and - which are privileged and must be enabled in the Developer Portal. - - - - - This intent includes all of them, including privileged ones. - - - - - Represents a generic Discord client. - - - - - Gets the current state of connection. - - - - - Gets the currently logged-in user. - - - - - Gets the token type of the logged-in user. - - - - - Starts the connection between Discord and the client.. - - - This method will initialize the connection between the client and Discord. - - This method will immediately return after it is called, as it will initialize the connection on - another thread. - - - - A task that represents the asynchronous start operation. - - - - - Stops the connection between Discord and the client. - - - A task that represents the asynchronous stop operation. - - - - - Gets a Discord application information for the logged-in user. - - - This method reflects your application information you submitted when creating a Discord application via - the Developer Portal. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application - information. - - - - - Gets a generic channel. - - - - var channel = await _client.GetChannelAsync(381889909113225237); - if (channel != null && channel is IMessageChannel msgChannel) - { - await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); - } - - - The snowflake identifier of the channel (e.g. `381889909113225237`). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the channel associated - with the snowflake identifier; null when the channel cannot be found. - - - - - Gets a collection of private channels opened in this session. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - This method will retrieve all private channels (including direct-message, group channel and such) that - are currently opened in this session. - - This method will not return previously opened private channels outside of the current session! If - you have just started the client, this may return an empty collection. - - - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of private channels that the user currently partakes in. - - - - - Gets a collection of direct message channels opened in this session. - - - This method returns a collection of currently opened direct message channels. - - This method will not return previously opened DM channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of direct-message channels that the user currently partakes in. - - - - - Gets a collection of group channels opened in this session. - - - This method returns a collection of currently opened group channels. - - This method will not return previously opened group channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of group channels that the user currently partakes in. - - - - - Gets the connections that the user has set up. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. - - - - - Gets a global application command. - - The id of the command. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application command if found, otherwise - . - - - - - Gets a collection of all global commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of global - application commands. - - - - - Creates a global application command. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created application command. - - - - - Bulk overwrites all global application commands. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of application commands that were created. - - - - - Gets a guild. - - The guild snowflake identifier. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild associated - with the snowflake identifier; null when the guild cannot be found. - - - - - Gets a collection of guilds that the user is currently in. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of guilds that the current user is in. - - - - - Creates a guild for the logged-in user who is in less than 10 active guilds. - - - This method creates a new guild on behalf of the logged-in user. - - Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. - - - The name of the new guild. - The voice region to create the guild with. - The icon of the guild. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created guild. - - - - - Gets an invite. - - The invitation identifier. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the invite information. - - - - - Gets a user. - - - - var user = await _client.GetUserAsync(168693960628371456); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The snowflake identifier of the user (e.g. `168693960628371456`). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the snowflake identifier; null if the user is not found. - - - - - Gets a user. - - - - var user = await _client.GetUserAsync("Still", "2876"); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The name of the user (e.g. `Still`). - The discriminator value of the user (e.g. `2876`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the name and the discriminator; null if the user is not found. - - - - - Gets a collection of the available voice regions. - - - The following example gets the most optimal voice region from the collection. - - var regions = await client.GetVoiceRegionsAsync(); - var optimalRegion = regions.FirstOrDefault(x => x.IsOptimal); - - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - with all of the available voice regions in this session. - - - - - Gets a voice region. - - The identifier of the voice region (e.g. eu-central ). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice region - associated with the identifier; null if the voice region is not found. - - - - - Gets a webhook available. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the recommended shard count as suggested by Discord. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains an - that represents the number of shards that should be used with this account. - - - - - Gets the gateway information related to the bot. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - that represents the gateway information related to the bot. - - - - - Provides a message object used for logging purposes. - - - - - Gets the severity of the log entry. - - - A enum to indicate the severeness of the incident or event. - - - - - Gets the source of the log entry. - - - A string representing the source of the log entry. - - - - - Gets the message of this log entry. - - - A string containing the message of this log entry. - - - - - Gets the exception of this log entry. - - - An object associated with an incident; otherwise null. - - - - - Initializes a new struct with the severity, source, message of the event, and - optionally, an exception. - - The severity of the event. - The source of the event. - The message of the event. - The exception of the event. - - - - Specifies the severity of the log message. - - - - - Logs that contain the most severe level of error. This type of error indicate that immediate attention - may be required. - - - - - Logs that highlight when the flow of execution is stopped due to a failure. - - - - - Logs that highlight an abnormal activity in the flow of execution. - - - - - Logs that track the general flow of the application. - - - - - Logs that are used for interactive investigation during development. - - - - - Logs that contain the most detailed messages. - - - - Specifies the state of the client's login status. - - - The client is currently logged out. - - - The client is currently logging in. - - - The client is currently logged in. - - - The client is currently logging out. - - - - Gets the JSON error code returned by Discord. - - - A - JSON error code - from Discord, or null if none. - - - - - Gets the reason of the exception. - - - - - Gets the request object used to send the request. - - - - - The error object returned from discord. - - - Note: This object can be null if discord didn't provide it. - - - - - The request json used to create the application command. This is useful for checking your commands for any format errors. - - - - - The underlying that caused this exception to be thrown. - - - - - Initializes a new instance of the class. - - - - - - - Represents a ratelimit bucket. - - - - - Gets the http method used to make the request if available. - - - - - Gets the endpoint that is going to be requested if available. - - - - - Gets the major parameters of the route. - - - - - Gets the hash of this bucket. - - - The hash is provided by Discord to group ratelimits. - - - - - Gets if this bucket is a hash type. - - - - - Creates a new based on the - and . - - Http method used to make the request. - Endpoint that is going to receive requests. - Major parameters of the route of this endpoint. - - A based on the - and the with the provided data. - - - - - Creates a new based on a - and a previous . - - Bucket hash provided by Discord. - that is going to be upgraded to a hash type. - - A based on the - and . - - - - - Gets the string that will define this bucket as a hash based one. - - - A that defines this bucket as a hash based one. - - - - - Gets the string that will define this bucket as an endpoint based one. - - - A that defines this bucket as an endpoint based one. - - - - - The exception that is thrown if an error occurs while processing an Discord HTTP request. - - - - - Gets the HTTP status code returned by Discord. - - - An - HTTP status code - from Discord. - - - - - Gets the JSON error code returned by Discord. - - - A - JSON error code - from Discord, or null if none. - - - - - Gets the reason of the exception. - - - - - Gets the request object used to send the request. - - - - - The error object returned from discord. - - - Note: This object can be null if discord didn't provide it. - - - - - Initializes a new instance of the class. - - The HTTP status code returned. - The request that was sent prior to the exception. - The Discord status code returned. - The reason behind the exception. - - - - Represents a generic request to be sent to Discord. - - - - - The exception that is thrown when the user is being rate limited by Discord. - - - - - Gets the request object used to send the request. - - - - - Initializes a new instance of the class using the - sent. - - - - - Represents a generic REST-based client. - - - - - Sets the HTTP header of this client for all requests. - - The field name of the header. - The value of the header. - - - - Sets the cancellation token for this client. - - The cancellation token. - - - - Sends a REST request. - - The method used to send this request (i.e. HTTP verb such as GET, POST). - The endpoint to send this request to. - The cancellation token used to cancel the task. - Indicates whether to send the header only. - The audit log reason. - - - - - The exception that is thrown when the WebSocket session is closed by Discord. - - - - - Gets the close code sent by Discord. - - - A - close code - from Discord. - - - - - Gets the reason of the interruption. - - - - - Initializes a new instance of the using a Discord close code - and an optional reason. - - - - - Represents a generic ratelimit info. - - - - - Gets whether or not this ratelimit info is global. - - - - - Gets the number of requests that can be made. - - - - - Gets the number of remaining requests that can be made. - - - - - Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision. - - - - - Gets the at which the rate limit resets. - - - - - Gets the absolute time when this ratelimit resets. - - - - - Gets a unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path). - - - - - Gets the amount of lag for the request. This is used to denote the precise time of when the ratelimit expires. - - - - - Gets the endpoint that this ratelimit info came from. - - - - - Represents options that should be used when sending a request. - - - - - Creates a new class with its default settings. - - - - - Gets or sets the maximum time to wait for for this request to complete. - - - Gets or set the max time, in milliseconds, to wait for for this request to complete. If - null, a request will not time out. If a rate limit has been triggered for this request's bucket - and will not be unpaused in time, this request will fail immediately. - - - A in milliseconds for when the request times out. - - - - - Gets or sets the cancellation token for this request. - - - A for this request. - - - - - Gets or sets the retry behavior when the request fails. - - - - - Gets or sets the reason for this action in the guild's audit log. - - - Gets or sets the reason that will be written to the guild's audit log if applicable. This may not apply - to all actions. - - - - - Gets or sets whether or not this request should use the system - clock for rate-limiting. Defaults to true. - - - This property can also be set in . - On a per-request basis, the system clock should only be disabled - when millisecond precision is especially important, and the - hosting system is known to have a desynced clock. - - - - - Gets or sets the callback to execute regarding ratelimits for this request. - - - - - Initializes a new class with the default request timeout set in - . - - - - Specifies how a request should act in the case of an error. - - - If a request fails, an exception is thrown immediately. - - - Retry if a request timed out. - - - Retry if a request failed due to a rate-limit. - - - Retry if a request failed due to an HTTP error 502. - - - Continuously retry a request until it times out, its cancel token is triggered, or the server responds with a non-502 error. - - - Specifies the type of token to use with the client. - - - - An OAuth2 token type. - - - - - A bot token type. - - - - - A webhook token type. - - - - - Represents a cached entity. - - The type of entity that is cached. - The type of this entity's ID. - - - - Gets whether this entity is cached. - - - - - Gets the ID of this entity. - - - - - Gets the entity if it could be pulled from cache. - - - This value is not guaranteed to be set; in cases where the entity cannot be pulled from cache, it is - null. - - - - - Downloads this entity to cache. - - Thrown when used from a user account. - Thrown when the message is deleted. - - A task that represents the asynchronous download operation. The task result contains the downloaded - entity. - - - - - Returns the cached entity if it exists; otherwise downloads it. - - Thrown when used from a user account. - Thrown when the message is deleted and is not in cache. - - A task that represents the asynchronous operation that attempts to get the message via cache or to - download the message. The task result contains the downloaded entity. - - - - - Represents a collection of for various Discord objects. - - - - - Gets an to be used to compare users. - - - - - Gets an to be used to compare guilds. - - - - - Gets an to be used to compare channels. - - - - - Gets an to be used to compare roles. - - - - - Gets an to be used to compare messages. - - - - is null - - - - or is null - - - - is null - - - is null - - - is null - - - - - - - Provides a series of helper methods for parsing mentions. - - - - - Returns a mention string based on the user ID. - - - A user mention string (e.g. <@80351110224678912>). - - - - - Returns a mention string based on the channel ID. - - - A channel mention string (e.g. <#103735883630395392>). - - - - - Returns a mention string based on the role ID. - - - A role mention string (e.g. <@&165511591545143296>). - - - - - Parses a provided user mention string. - - The user mention. - Invalid mention format. - - - - Tries to parse a provided user mention string. - - The user mention. - The UserId of the user. - - - - Parses a provided channel mention string. - - Invalid mention format. - - - - Tries to parse a provided channel mention string. - - - - - Parses a provided role mention string. - - Invalid mention format. - - - - Tries to parse a provided role mention string. - - - - Gets the value for this parameter. - This property has no value set. - - - Returns true if this value has been specified. - - - Creates a new Parameter with the provided value. - - - must not be . - - - must not be . - - - cannot be blank. - - - cannot be blank. - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Messages are younger than 2 weeks. - - - The everyone role cannot be assigned to a user. - - - - Provides a series of helper methods for handling snowflake identifiers. - - - - - Resolves the time of which the snowflake is generated. - - The snowflake identifier to resolve. - - A representing the time for when the object is generated. - - - - - Generates a pseudo-snowflake identifier with a . - - The time to be used in the new snowflake. - - A representing the newly generated snowflake identifier. - - - - - Provides a series of helper methods for handling Discord login tokens. - - - - - The minimum length of a Bot token. - - - This value was determined by comparing against the examples in the Discord - documentation, and pre-existing tokens. - - - - - Pads a base64-encoded string with 0, 1, or 2 '=' characters, - if the string is not a valid multiple of 4. - Does not ensure that the provided string contains only valid base64 characters. - Strings that already contain padding will not have any more padding applied. - - - A string that would require 3 padding characters is considered to be already corrupt. - Some older bot tokens may require padding, as the format provided by Discord - does not include this padding in the token. - - The base64 encoded string to pad with characters. - A string containing the base64 padding. - - Thrown if would require an invalid number of padding characters. - - - Thrown if is null, empty, or whitespace. - - - - - Decodes a base 64 encoded string into a ulong value. - - A base 64 encoded string containing a User Id. - A ulong containing the decoded value of the string, or null if the value was invalid. - - - - Checks the validity of a bot token by attempting to decode a ulong userid - from the bot token. - - - The bot token to validate. - - - True if the bot token was valid, false if it was not. - - - - - The set of all characters that are not allowed inside of a token. - - - - - Checks if the given token contains a whitespace or newline character - that would fail to log in. - - The token to validate. - - True if the token contains a whitespace or newline character. - - - - - Checks the validity of the supplied token of a specific type. - - The type of token to validate. - The token value to validate. - Thrown when the supplied token string is null, empty, or contains only whitespace. - Thrown when the supplied or token value is invalid. - - - - Not full URL validation right now. Just ensures protocol is present and that it's either http or https - - url to validate before sending to Discord. - A URL must include a protocol (http or https). - true if url is valid by our standard, false if null, throws an error upon invalid - -
-
diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml deleted file mode 100644 index 91727936d7..0000000000 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ /dev/null @@ -1,5159 +0,0 @@ - - - - Discord.Net.Rest - - - - - Represents a vanity invite. - - - - - The unique code for the invite link. - - - - - The total amount of vanity invite uses. - - - - - Gets the snowflake ID of the application. - - - - - Gets the ID of the embed's image asset. - - - - - Gets the application's description. - - - - - Gets the ID of the application's icon. - - - - - Gets the name of the application. - - - - Unknown OAuth token type. - - - Unknown OAuth token type. - - - Unknown OAuth token type. - - - - must not be equal to zero. - -and- - must be greater than zero. - - - must not be . - -and- - must not be or empty. - - - - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - - - - and must not be equal to zero. - -and- - must be between 0 to 7. - - must not be . - - - and must not be equal to zero. - - - must not be equal to zero. - - - must not be equal to zero. - must not be . - - - must not be equal to zero. - - - and must not be equal to zero. - must not be . - - - cannot be blank. - must not be . - - - may not be equal to zero. - - - may not be equal to zero. - - - may not be equal to zero. - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - must not be . - - - Client is not logged in. - - - Unsupported param type. - - - The default RestClientProvider is not supported on this platform. - - - Cannot read from image. - - - - Represents a REST-Based ratelimit info. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the login state of the client. - - - - - Gets the logged-in user. - - - - - - - Creates a new REST-only Discord client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creating a guild is not supported with the base client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unexpected channel type. - - - - Provides a client to send REST-based requests to Discord. - - - - - Gets the logged-in user. - - - - - - - - Initializes a new with the provided configuration. - - The configuration to be used with the client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a configuration class for . - - - - Gets or sets the provider used to generate new REST connections. - - - - Contains a piece of audit log data related to a ban. - - - - - Gets the user that was banned. - - - A user object representing the banned user. - - - - - Contains a piece of audit log data related to a adding a bot to a guild. - - - - - Gets the bot that was added. - - - A user object representing the bot. - - - - - Contains a piece of audit log data related to a channel creation. - - - - - Gets the snowflake ID of the created channel. - - - A representing the snowflake identifier for the created channel. - - - - - Gets the name of the created channel. - - - A string containing the name of the created channel. - - - - - Gets the type of the created channel. - - - The type of channel that was created. - - - - - Gets the current slow-mode delay of the created channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether the created channel is NSFW. - - - true if the created channel has the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate that the clients in the created voice channel are requested to use. - - - An representing the bit-rate (bps) that the created voice channel defines and requests the - client(s) to use. - null if this is not mentioned in this entry. - - - - - Gets a collection of permission overwrites that was assigned to the created channel. - - - A collection of permission , containing the permission overwrites that were - assigned to the created channel. - - - - - Contains a piece of audit log data related to a channel deletion. - - - - - Gets the snowflake ID of the deleted channel. - - - A representing the snowflake identifier for the deleted channel. - - - - - Gets the name of the deleted channel. - - - A string containing the name of the deleted channel. - - - - - Gets the type of the deleted channel. - - - The type of channel that was deleted. - - - - - Gets the slow-mode delay of the deleted channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether the deleted channel was NSFW. - - - true if this channel had the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate of this channel if applicable. - - - An representing the bit-rate set of the voice channel. - null if this is not mentioned in this entry. - - - - - Gets a collection of permission overwrites that was assigned to the deleted channel. - - - A collection of permission . - - - - - Represents information for a channel. - - - - - Gets the name of this channel. - - - A string containing the name of this channel. - - - - - Gets the topic of this channel. - - - A string containing the topic of this channel, if any. - - - - - Gets the current slow-mode delay of this channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether this channel is NSFW. - - - true if this channel has the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate of this channel if applicable. - - - An representing the bit-rate set for the voice channel; - null if this is not mentioned in this entry. - - - - - Gets the type of this channel. - - - The channel type of this channel; null if not applicable. - - - - - Contains a piece of audit log data related to a channel update. - - - - - Gets the snowflake ID of the updated channel. - - - A representing the snowflake identifier for the updated channel. - - - - - Gets the channel information before the changes. - - - An information object containing the original channel information before the changes were made. - - - - - Gets the channel information after the changes. - - - An information object containing the channel information after the changes were made. - - - - - Contains a piece of audit log data related to an emoji creation. - - - - - Gets the snowflake ID of the created emoji. - - - A representing the snowflake identifier for the created emoji. - - - - - Gets the name of the created emoji. - - - A string containing the name of the created emoji. - - - - - Contains a piece of audit log data related to an emoji deletion. - - - - - Gets the snowflake ID of the deleted emoji. - - - A representing the snowflake identifier for the deleted emoji. - - - - - Gets the name of the deleted emoji. - - - A string containing the name of the deleted emoji. - - - - - Contains a piece of audit log data related to an emoji update. - - - - - Gets the snowflake ID of the updated emoji. - - - A representing the snowflake identifier of the updated emoji. - - - - - Gets the new name of the updated emoji. - - - A string containing the new name of the updated emoji. - - - - - Gets the old name of the updated emoji. - - - A string containing the old name of the updated emoji. - - - - - Represents information for a guild. - - - - - Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are - automatically moved to the AFK voice channel. - - - An representing the amount of time in seconds for a user to be marked as inactive - and moved into the AFK voice channel. - null if this is not mentioned in this entry. - - - - - Gets the default message notifications for users who haven't explicitly set their notification settings. - - - The default message notifications setting of this guild. - null if this is not mentioned in this entry. - - - - - Gets the ID of the AFK voice channel for this guild. - - - A representing the snowflake identifier of the AFK voice channel; null if - none is set. - - - - - Gets the name of this guild. - - - A string containing the name of this guild. - - - - - Gets the ID of the region hosting this guild's voice channels. - - - - - Gets the ID of this guild's icon. - - - A string containing the identifier for the splash image; null if none is set. - - - - - Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. - - - The level of requirements. - null if this is not mentioned in this entry. - - - - - Gets the owner of this guild. - - - A user object representing the owner of this guild. - - - - - Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to - perform administrative actions in this guild. - - - The level of MFA requirement. - null if this is not mentioned in this entry. - - - - - Gets the level of content filtering applied to user's content in a Guild. - - - The level of explicit content filtering. - - - - - Gets the ID of the channel where system messages are sent. - - - A representing the snowflake identifier of the channel where system - messages are sent; null if none is set. - - - - - Gets the ID of the widget embed channel of this guild. - - - A representing the snowflake identifier of the embedded channel found within the - widget settings of this guild; null if none is set. - - - - - Gets a value that indicates whether this guild is embeddable (i.e. can use widget). - - - true if this guild can be embedded via widgets; otherwise false. - null if this is not mentioned in this entry. - - - - - Contains a piece of audit log data related to a guild update. - - - - - Gets the guild information before the changes. - - - An information object containing the original guild information before the changes were made. - - - - - Gets the guild information after the changes. - - - An information object containing the guild information after the changes were made. - - - - - Contains a piece of audit log data related to an invite creation. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that determines whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the user that created this invite if available. - - - A user that created this invite or . - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite was used. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Contains a piece of audit log data related to an invite removal. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the user that created this invite if available. - - - A user that created this invite or . - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite has been used. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Represents information for an invite. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires; null if this - invite never expires or not specified. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off, - false if not; null if not specified. - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to; - null if not specified. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is specified. - - - - - Contains a piece of audit log data relating to an invite update. - - - - - Gets the invite information before the changes. - - - An information object containing the original invite information before the changes were made. - - - - - Gets the invite information after the changes. - - - An information object containing the invite information after the changes were made. - - - - - Contains a piece of audit log data related to a kick. - - - - - Gets the user that was kicked. - - - A user object representing the kicked user. - - - - - Contains a piece of audit log data related to disconnecting members from voice channels. - - - - - Gets the number of members that were disconnected. - - - An representing the number of members that were disconnected from a voice channel. - - - - - Represents information for a member. - - - - - Gets the nickname of the updated member. - - - A string representing the nickname of the updated member; null if none is set. - - - - - Gets a value that indicates whether the updated member is deafened by the guild. - - - true if the updated member is deafened (i.e. not permitted to listen to or speak to others) by the guild; - otherwise false. - null if this is not mentioned in this entry. - - - - - Gets a value that indicates whether the updated member is muted (i.e. not permitted to speak via voice) by the - guild. - - - true if the updated member is muted by the guild; otherwise false. - null if this is not mentioned in this entry. - - - - - Contains a piece of audit log data related to moving members between voice channels. - - - - - Gets the ID of the channel that the members were moved to. - - - A representing the snowflake identifier for the channel that the members were moved to. - - - - - Gets the number of members that were moved. - - - An representing the number of members that were moved to another voice channel. - - - - - Contains a piece of audit log data related to a change in a guild member's roles. - - - - - Gets a collection of role changes that were performed on the member. - - - A read-only collection of , containing the roles that were changed on - the member. - - - - - Gets the user that the roles changes were performed on. - - - A user object representing the user that the role changes were performed on. - - - - - An information object representing a change in one of a guild member's roles. - - - - - Gets the name of the role that was changed. - - - A string containing the name of the role that was changed. - - - - - Gets the ID of the role that was changed. - - - A representing the snowflake identifier of the role that was changed. - - - - - Gets a value that indicates whether the role was added to the user. - - - true if the role was added to the user; otherwise false. - - - - - Contains a piece of audit log data related to a change in a guild member. - - - - - Gets the user that the changes were performed on. - - - A user object representing the user who the changes were performed on. - - - - - Gets the member information before the changes. - - - An information object containing the original member information before the changes were made. - - - - - Gets the member information after the changes. - - - An information object containing the member information after the changes were made. - - - - - Contains a piece of audit log data related to message deletion(s). - - - - - Gets the ID of the channel that the messages were deleted from. - - - A representing the snowflake identifier for the channel that the messages were - deleted from. - - - - - Gets the number of messages that were deleted. - - - An representing the number of messages that were deleted from the channel. - - - - - Contains a piece of audit log data related to message deletion(s). - - - - - Gets the number of messages that were deleted. - - - An representing the number of messages that were deleted from the channel. - - - - - Gets the ID of the channel that the messages were deleted from. - - - A representing the snowflake identifier for the channel that the messages were - deleted from. - - - - - Gets the user of the messages that were deleted. - - - A user object representing the user that created the deleted messages. - - - - - Contains a piece of audit log data related to a pinned message. - - - - - Gets the ID of the messages that was pinned. - - - A representing the snowflake identifier for the messages that was pinned. - - - - - Gets the ID of the channel that the message was pinned from. - - - A representing the snowflake identifier for the channel that the message was pinned from. - - - - - Gets the user of the message that was pinned if available. - - - A user object representing the user that created the pinned message or . - - - - - Contains a piece of audit log data related to an unpinned message. - - - - - Gets the ID of the messages that was unpinned. - - - A representing the snowflake identifier for the messages that was unpinned. - - - - - Gets the ID of the channel that the message was unpinned from. - - - A representing the snowflake identifier for the channel that the message was unpinned from. - - - - - Gets the user of the message that was unpinned if available. - - - A user object representing the user that created the unpinned message or . - - - - - Contains a piece of audit log data for a permissions overwrite creation. - - - - - Gets the ID of the channel that the overwrite was created from. - - - A representing the snowflake identifier for the channel that the overwrite was - created from. - - - - - Gets the permission overwrite object that was created. - - - An object representing the overwrite that was created. - - - - - Contains a piece of audit log data related to the deletion of a permission overwrite. - - - - - Gets the ID of the channel that the overwrite was deleted from. - - - A representing the snowflake identifier for the channel that the overwrite was - deleted from. - - - - - Gets the permission overwrite object that was deleted. - - - An object representing the overwrite that was deleted. - - - - - Contains a piece of audit log data related to the update of a permission overwrite. - - - - - Gets the ID of the channel that the overwrite was updated from. - - - A representing the snowflake identifier for the channel that the overwrite was - updated from. - - - - - Gets the overwrite permissions before the changes. - - - An overwrite permissions object representing the overwrite permissions that the overwrite had before - the changes were made. - - - - - Gets the overwrite permissions after the changes. - - - An overwrite permissions object representing the overwrite permissions that the overwrite had after the - changes. - - - - - Gets the ID of the overwrite that was updated. - - - A representing the snowflake identifier of the overwrite that was updated. - - - - - Gets the target of the updated permission overwrite. - - - The target of the updated permission overwrite. - - - - - Contains a piece of audit log data related to a guild prune. - - - - - Gets the threshold for a guild member to not be kicked. - - - An representing the amount of days that a member must have been seen in the server, - to avoid being kicked. (i.e. If a user has not been seen for more than , they will be - kicked from the server) - - - - - Gets the number of members that were kicked during the purge. - - - An representing the number of members that were removed from this guild for having - not been seen within . - - - - - Contains a piece of audit log data related to a role creation. - - - - - Gets the ID of the role that was created. - - - A representing the snowflake identifier to the role that was created. - - - - - Gets the role information that was created. - - - An information object representing the properties of the role that was created. - - - - - Contains a piece of audit log data relating to a role deletion. - - - - - Gets the ID of the role that was deleted. - - - A representing the snowflake identifier to the role that was deleted. - - - - - Gets the role information that was deleted. - - - An information object representing the properties of the role that was deleted. - - - - - Represents information for a role edit. - - - - - Gets the color of this role. - - - A color object representing the color assigned to this role; null if this role does not have a - color. - - - - - Gets a value that indicates whether this role is mentionable. - - - true if other members can mention this role in a text channel; otherwise false; - null if this is not mentioned in this entry. - - - - - Gets a value that indicates whether this role is hoisted (i.e. its members will appear in a separate - section on the user list). - - - true if this role's members will appear in a separate section in the user list; otherwise - false; null if this is not mentioned in this entry. - - - - - Gets the name of this role. - - - A string containing the name of this role. - - - - - Gets the permissions assigned to this role. - - - A guild permissions object representing the permissions that have been assigned to this role; null - if no permissions have been assigned. - - - - - Contains a piece of audit log data related to a role update. - - - - - Gets the ID of the role that was changed. - - - A representing the snowflake identifier of the role that was changed. - - - - - Gets the role information before the changes. - - - A role information object containing the role information before the changes were made. - - - - - Gets the role information after the changes. - - - A role information object containing the role information after the changes were made. - - - - - Contains a piece of audit log data related to an unban. - - - - - Gets the user that was unbanned. - - - A user object representing the user that was unbanned. - - - - - Contains a piece of audit log data related to a webhook creation. - - - - - Gets the webhook that was created if it still exists. - - - A webhook object representing the webhook that was created if it still exists, otherwise returns null. - - - - - Gets the webhook id. - - - The webhook identifier. - - - - - Gets the type of webhook that was created. - - - The type of webhook that was created. - - - - - Gets the name of the webhook. - - - A string containing the name of the webhook. - - - - - Gets the ID of the channel that the webhook could send to. - - - A representing the snowflake identifier of the channel that the webhook could send - to. - - - - - Contains a piece of audit log data related to a webhook deletion. - - - - - Gets the ID of the webhook that was deleted. - - - A representing the snowflake identifier of the webhook that was deleted. - - - - - Gets the ID of the channel that the webhook could send to. - - - A representing the snowflake identifier of the channel that the webhook could send - to. - - - - - Gets the type of the webhook that was deleted. - - - The type of webhook that was deleted. - - - - - Gets the name of the webhook that was deleted. - - - A string containing the name of the webhook that was deleted. - - - - - Gets the hash value of the webhook's avatar. - - - A string containing the hash of the webhook's avatar. - - - - - Represents information for a webhook. - - - - - Gets the name of this webhook. - - - A string containing the name of this webhook. - - - - - Gets the ID of the channel that this webhook sends to. - - - A representing the snowflake identifier of the channel that this webhook can send - to. - - - - - Gets the hash value of this webhook's avatar. - - - A string containing the hash of this webhook's avatar. - - - - - Contains a piece of audit log data related to a webhook update. - - - - - Gets the webhook that was updated. - - - A webhook object representing the webhook that was updated. - - - - - Gets the webhook information before the changes. - - - A webhook information object representing the webhook before the changes were made. - - - - - Gets the webhook information after the changes. - - - A webhook information object representing the webhook after the changes were made. - - - - - Represents a REST-based audit log entry. - - - - - - - - - - - - - - - - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - Message content is too long, length must be less or equal to . - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - - - Resolving permissions requires the parent guild to be downloaded. - - - Resolving permissions requires the parent guild to be downloaded. - - - This channel does not have a parent channel. - - - - Represents a REST-based channel that can send and receive messages. - - - - - Sends a message to this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in - . Please visit - its documentation for more details on this method. - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of pinned messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a collection of messages found in the pinned messages. - - - - - Represents a REST-based channel that is private to select recipients. - - - - - Users that can access this channel. - - - - - Represents a REST-based category channel. - - - - - This method is not supported with category channels. - - - - This method is not supported with category channels. - - - - Represents a generic REST-based channel. - - - - - - - Unexpected channel type. - - - Unexpected channel type. - - - - - - - - - - - - - - - - Represents a REST-based direct-message channel. - - - - - Gets the current logged-in user. - - - - - Gets the recipient of the channel. - - - - - Gets a collection that is the current logged-in user and the recipient. - - - - - - - - - - - Gets a user in this channel from the provided . - - The snowflake identifier of the user. - - A object that is a recipient of this channel; otherwise null. - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a string that represents the Username#Discriminator of the recipient. - - - A string that resolves to the Recipient of this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based group-message channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - Connecting to a group channel is not supported. - - - - Represents a private REST-based group channel. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Adds or updates the permission overwrite for the given user. - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Adds or updates the permission overwrite for the given role. - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Gets the name of this channel. - - - A string that is the name of this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based news channel in a guild that has the same properties as a . - - - - - Represents a REST-based stage channel in a guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based channel in a guild that can send and receive messages. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets a user in this channel. - - The snowflake identifier of the user. - The options to be used when sending the request. - - Resolving permissions requires the parent guild to be downloaded. - - - A task representing the asynchronous get operation. The task result contains a guild user object that - represents the user; null if none is found. - - - - - Gets a collection of users that are able to view the channel. - - The options to be used when sending the request. - - Resolving permissions requires the parent guild to be downloaded. - - - A paged collection containing a collection of guild users that can access this channel. Flattening the - paginated response into a collection of users with - is required if you wish to access the users. - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - Gets the parent (category) channel of this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread channel recieved over REST. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the parent text channel id. - - - - - Gets a user within this thread. - - The id of the user to fetch. - The options to be used when sending the request. - - A task representing the asyncronous get operation. The task returns a - if found, otherwise . - - - - - Gets a collection of users within this thread. - - The options to be used when sending the request. - - A task representing the asyncronous get operation. The task returns a - of 's. - - - - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - - - - - - - - - - - - Represents a REST-based voice channel in a guild. - - - - - - - - - - - - - - - - - - - - - - - Gets the parent (category) channel of this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - - - - - - - Connecting to a REST-based channel is not supported. - - - - - - - - - - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - - Represents a REST-based ban object. - - - - - Gets the banned user. - - - A generic object that was banned. - - - - - - - - Gets the name of the banned user. - - - A string containing the name of the user that was banned. - - - - - - - - Represents a REST-based guild/server. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the built-in role containing all users in this guild. - - - - - Gets a collection of all roles in this guild. - - - - - - - - - - - - - - Updates this object's properties with its current state. - - - If true, and - will be updated as well. - - The options to be used when sending the request. - - If is true, and - will be updated as well. - - - - - - - - is . - - - - is . - - - - is . - - - - - - - - - - Deletes all slash commands in the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous delete operation. - - - - - Gets a collection of slash commands created by the current user in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - slash commands created by the current user. - - - - - Gets a slash command in the current guild. - - The unique identifier of the slash command. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - slash command created by the current user. - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - - - - - - - - - - - - - Gets a collection of all channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - generic channels found within this guild. - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the generic channel - associated with the specified ; if none is found. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - associated with the specified ; if none is found. - - - - - Gets a collection of all text channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - message channels found within this guild. - - - - - Gets a thread channel in this guild. - - The snowflake identifier for the thread channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the thread channel associated - with the specified ; if none is found. - - - - - Gets a collection of all thread in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - threads found within this guild. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel associated - with the specified ; if none is found. - - - - - Gets a collection of all voice channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice channels found within this guild. - - - - - Gets a stage channel in this guild - - The snowflake identifier for the stage channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the stage channel associated - with the specified ; if none is found. - - - - - Gets a collection of all stage channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - stage channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - category channels found within this guild. - - - - - Gets the AFK voice channel in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel that the - AFK users will be moved to after they have idled for too long; if none is set. - - - - - Gets the first viewable text channel in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the first viewable text - channel in this guild; if none is found. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the widget channel set - within the server's widget settings; if none is set. - - - - - Gets the text channel where guild notices such as welcome messages and boost events are posted. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where guild notices such as welcome messages and boost events are poste; if none is found. - - - - - Gets the text channel where Community guilds can display rules and/or guidelines. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where Community guilds can display rules and/or guidelines; if none is set. - - - - - Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel channel where - admins and moderators of Community guilds receive notices from Discord; if none is set. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - 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}."; - }); - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a voice channel with the provided name. - - The name of the new channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - The created voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a category channel with the provided name. - - The name of the new channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - The created category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A partial metadata of the vanity invite found within this guild. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - The options to be used when sending the request. - Whether the role can be mentioned. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - The snowflake identifier of the user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild user - associated with the specified ; if none is found. - - - - - Gets the current user for this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the currently logged-in - user within this guild. - - - - - Gets the owner of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the owner of this guild. - - - - - - Prunes inactive users. - - - - This method removes all users that have not logged on in the provided number of . - - - If is true, this method will only return the number of users that - would be removed without kicking the users. - - - The number of days required for the users to be kicked. - Whether this prune action is a simulation. - The options to be used when sending the request. - - A task that represents the asynchronous prune operation. The task result contains the number of users to - be or has been removed from this guild. - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The options to be used when sending the request. - The audit log entry ID to get entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - Gets this guilds slash commands commands - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of application commands found within the guild. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Returns the name of the guild. - - - The name of the guild. - - - - - - - - - - - - - - is . - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a collection of all stickers within this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Disconnects the user from its current voice channel - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - - - - - - - - - - - - - Downloading users is not supported for a REST-based guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based voice region. - - - - - - - - - - - - - - - - - - - - Represents a Rest-based implementation of the . - - - - - - - - - - - - - - - - - - - - The options of this command. - - - - - - - - - - - - - - - - - Represents a Rest-based implementation of . - - - - - - - - - - - Represents a Rest-based implementation of . - - - - - - - - - - - - - - - - - - - - A collection of 's for this command. - - - - - A collection of 's for this command. - - - - - Represents a Rest-based global application command. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command. - - - - - Represents a Rest-based guild application command. - - - - - The guild Id where this command originates. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command - - - - - Gets this commands permissions inside of the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - object defining the permissions of the current slash command. - - - - - Modifies the current command permissions for this guild command. - - The permissions to overwrite. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. The task result contains a - object containing the modified permissions. - - - - - Gets the guild that this slash command resides in. - - if you want the approximate member and presence counts for the guild, otherwise . - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the URL of the invite. - - - A string that resolves to the Url of the invite. - - - - - - - - - - Represents additional information regarding the REST-based invite object. - - - - - - - - - - - - - - - - - - - Represents a Rest-based custom sticker within a guild. - - - - - Gets the users id who uploaded the sticker. - - - In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - Gets the guild that this custom sticker is in. - - - Note: This property can be if the sticker wasnt fetched from a guild. - - - - - - - - - - - Regex used to check if some text is formatted as inline code. - - - - - Regex used to check if some text is formatted as a code block. - - - - Only the author of a message may modify the message. - Message content is too long, length must be less or equal to . - - - - Represents a REST-based follow up message sent by a bot responding to a slash command. - - - - - Deletes this object and all of it's childern. - - A task that represents the asynchronous delete operation. - - - - Modifies this interaction followup message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - The token used to modify/delete this message expired. - /// Somthing went wrong during the request. - - - - Represents the initial REST-based response to a slash command. - - - - - Deletes this object and all of it's childern. - - A task that represents the asynchronous delete operation. - - - - Modifies this interaction response - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - The token used to modify/delete this message expired. - /// Somthing went wrong during the request. - - - - Represents a REST-based message. - - - - - - - - Gets the Author of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets a collection of the 's on the message. - - - - - Gets a collection of the 's on the message. - - - - - - - - - - - Gets a collection of the mentioned users in the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the of the message. - - - A string that is the of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST reaction object. - - - - - - - - Gets the number of reactions added. - - - - - Gets whether the reactions is added by the user. - - - - - Represents a REST-based system message. - - - - - Represents a REST-based message sent by a user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This operation may only be called on a channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a partial sticker received in a message. - - - - - - - - - - - Resolves this sticker item by fetching the from the API. - - - A task representing the download operation, the result of the task is a sticker object. - - - - - Represents a REST-based entity that contains information about a Discord application created via the developer portal. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unable to update this object from a different application token. - - - - Gets the name of the application. - - - Name of the application. - - - - - Represents a REST-based role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets if this role is the @everyone role of the guild or not. - - - - - - - - - - - - - - - - - Gets the name of the role. - - - A string that is the name of the role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the name of the connection. - - - Name of the connection. - - - - - Represents a REST-based group user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based guild user. - - - - - - - - - - - - - - - - - - - - - - - - - - Resolving permissions requires the parent guild to be downloaded. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Resolving permissions requires the parent guild to be downloaded. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents the logged-in REST-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - Unable to update this object using a different token. - - - - Unable to modify this object using a different token. - - - - Represents a thread user received over the REST api. - - - - - Gets the this user is in. - - - - - Gets the timestamp for when this user joined this thread. - - - - - Gets the guild this user is in. - - - - - Gets the guild user for this thread user. - - - A task representing the asynchronous get operation. The task returns a - that represents the current thread user. - - - - - Represents a REST-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creates a direct message channel to this user. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a rest DM channel where the user is the recipient. - - - - - - - - - - - - - - Gets the Username#Discriminator of the user. - - - A string that resolves to Username#Discriminator of the user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Adds a user to the specified guild. - - - This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. - - The Discord client object. - The snowflake identifier of the guild. - The snowflake identifier of the user. - The OAuth2 access token for the user, requested with the guilds.join scope. - The delegate containing the properties to be applied to the user upon being added to the guild. - The options to be used when sending the request. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns the filename of this attachment. - - - A string containing the filename of this attachment. - - - - diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml deleted file mode 100644 index abf0c1bb21..0000000000 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ /dev/null @@ -1,5898 +0,0 @@ - - - - Discord.Net.WebSocket - - - - C←S - Used to send most events. - - - C↔S - Used to keep the connection alive and measure latency. - - - C→S - Used to associate a connection with a token and specify configuration. - - - C→S - Used to update client's status and current game id. - - - C→S - Used to join a particular voice channel. - - - C→S - Used to ensure the guild's voice server is alive. - - - C→S - Used to resume a connection after a redirect occurs. - - - C←S - Used to notify a client that they must reconnect to another gateway. - - - C→S - Used to request members that were withheld by large_threshold - - - C←S - Used to notify the client that their session has expired and cannot be resumed. - - - C←S - Used to provide information to the client immediately on connection. - - - C←S - Used to reply to a client's heartbeat. - - - C→S - Used to request presence updates from particular guilds. - - - C→S - Used to associate a connection with a token. - - - C→S - Used to specify configuration. - - - C←S - Used to notify that the voice connection was successful and informs the client of available protocols. - - - C→S - Used to keep the connection alive and measure latency. - - - C←S - Used to provide an encryption key to the client. - - - C↔S - Used to inform that a certain user is speaking. - - - C←S - Used to reply to a client's heartbeat. - - - C→S - Used to resume a connection. - - - C←S - Used to inform the client the heartbeat interval. - - - C←S - Used to acknowledge a resumed connection. - - - C←S - Used to notify that a client has disconnected. - - - The client must be logged in before connecting. - This client is not configured with WebSocket support. - - - This client is not configured with WebSocket support. - - - - Represents the base of a WebSocket-based Discord client. - - - - - Gets the estimated round-trip latency, in milliseconds, to the gateway server. - - - An that represents the round-trip latency to the WebSocket server. Please - note that this value does not represent a "true" latency for operations such as sending a message. - - - - - Gets the status for the logged-in user. - - - A status object that represents the user's online presence status. - - - - - Gets the activity for the logged-in user. - - - An activity object that represents the user's current activity. - - - - - Provides access to a REST-only client with a shared state from this client. - - - - - Gets a collection of default stickers. - - - - - Gets the current logged-in user. - - - - - Gets a collection of guilds that the user is currently in. - - - A read-only collection of guilds that the current user is in. - - - - - Gets a collection of private channels opened in this session. - - - This method will retrieve all private channels (including direct-message, group channel and such) that - are currently opened in this session. - - This method will not return previously opened private channels outside of the current session! If - you have just started the client, this may return an empty collection. - - - - A read-only collection of private channels that the user currently partakes in. - - - - - Gets a Discord application information for the logged-in user. - - - This method reflects your application information you submitted when creating a Discord application via - the Developer Portal. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application - information. - - - - - Gets a generic user. - - The user snowflake ID. - - This method gets the user present in the WebSocket cache with the given condition. - - Sometimes a user may return null 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 . - - - 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 - . - - - - A generic WebSocket-based user; null when the user cannot be found. - - - - - Gets a user. - - - This method gets the user present in the WebSocket cache with the given condition. - - Sometimes a user may return null 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 . - - - 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 - . - - - The name of the user. - The discriminator value of the user. - - A generic WebSocket-based user; null when the user cannot be found. - - - - - Gets a channel. - - The snowflake identifier of the channel (e.g. `381889909113225237`). - - A generic WebSocket-based channel object (voice, text, category, etc.) associated with the identifier; - null when the channel cannot be found. - - - - - Gets a guild. - - The guild snowflake identifier. - - A WebSocket-based guild associated with the snowflake identifier; null when the guild cannot be - found. - - - - - Gets all voice regions. - - The options to be used when sending the request. - - A task that contains a read-only collection of REST-based voice regions. - - - - - Gets a voice region. - - The identifier of the voice region (e.g. eu-central ). - The options to be used when sending the request. - - A task that contains a REST-based voice region associated with the identifier; null if the - voice region is not found. - - - - - - - - - - - Sets the current status of the user (e.g. Online, Do not Disturb). - - The new status to be set. - - A task that represents the asynchronous set operation. - - - - - Sets the game of the user. - - The name of the game. - If streaming, the URL of the stream. Must be a valid Twitch URL. - The type of the game. - - - Bot accounts cannot set as their activity - type and it will have no effect. - - - - A task that represents the asynchronous set operation. - - - - - Sets the of the logged-in user. - - - This method sets the of the user. - - Discord will only accept setting of name and the type of activity. - - - Bot accounts cannot set as their activity - type and it will have no effect. - - - Rich Presence cannot be set via this method or client. Rich Presence is strictly limited to RPC - clients only. - - - The activity to be set. - - A task that represents the asynchronous set operation. - - - - - Attempts to download users into the user cache for the selected guilds. - - The guilds to download the members from. - - A task that represents the asynchronous download operation. - - - - - Creates a guild for the logged-in user who is in less than 10 active guilds. - - - This method creates a new guild on behalf of the logged-in user. - - Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. - - - The name of the new guild. - The voice region to create the guild with. - The icon of the guild. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created guild. - - - - - Gets the connections that the user has set up. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. - - - - - Gets an invite. - - The invitation identifier. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the invite information. - - - - - Gets a sticker. - - Whether or not to allow downloading from the api. - The id of the sticker to get. - The options to be used when sending the request. - - A if found, otherwise . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when a channel is created. - - - This event is fired when a generic channel has been created. The event handler must return a - and accept a as its parameter. - - - The newly created channel is passed into the event handler parameter. The given channel type may - include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); - see the derived classes of for more details. - - - - - - - - Fired when a channel is destroyed. - - - This event is fired when a generic channel has been destroyed. The event handler must return a - and accept a as its parameter. - - - The destroyed channel is passed into the event handler parameter. The given channel type may - include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); - see the derived classes of for more details. - - - - - - - - Fired when a channel is updated. - - - This event is fired when a generic channel has been destroyed. The event handler must return a - and accept 2 as its parameters. - - - The original (prior to update) channel is passed into the first , while - the updated channel is passed into the second. The given channel type may include, but not limited - to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); see the derived classes of - for more details. - - - - - - - - Fired when a message is received. - - - This event is fired when a message is received. The event handler must return a - and accept a as its parameter. - - - The message that is sent to the client is passed into the event handler parameter as - . This message may be a system message (i.e. - ) or a user message (i.e. . See the - derived classes of for more details. - - - - The example below checks if the newly received message contains the target user. - - - - - Fired when a message is deleted. - - - This event is fired when a message is deleted. The event handler must return a - and accept a and - as its parameters. - - - - It is not possible to retrieve the message via - ; the message cannot be retrieved by Discord - after the message has been deleted. - - If caching is enabled via , the - entity will contain the deleted message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the removed message will be passed into the - parameter. - - - - - - - - Fired when multiple messages are bulk deleted. - - - The event will not be fired for individual messages contained in this event. - - - This event is fired when multiple messages are bulk deleted. The event handler must return a - and accept an and - as its parameters. - - - - It is not possible to retrieve the message via - ; the message cannot be retrieved by Discord - after the message has been deleted. - - If caching is enabled via , the - entity will contain the deleted message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the removed message will be passed into the - parameter. - - - - - Fired when a message is updated. - - - This event is fired when a message is updated. The event handler must return a - and accept a , , - and as its parameters. - - - If caching is enabled via , the - entity will contain the original message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The updated message will be passed into the parameter. - - - The source channel of the updated message will be passed into the - parameter. - - - - - Fired when a reaction is added to a message. - - - This event is fired when a reaction is added to a user message. The event handler must return a - and accept a , an - , and a as its parameter. - - - If caching is enabled via , the - entity will contain the original message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the reaction addition will be passed into the - parameter. - - - The reaction that was added will be passed into the parameter. - - - When fetching the reaction from this event, a user may not be provided under - . Please see the documentation of the property for more - information. - - - - - - - - Fired when a reaction is removed from a message. - - - Fired when all reactions to a message are cleared. - - - - Fired when all reactions to a message with a specific emote are removed. - - - - This event is fired when all reactions to a message with a specific emote are removed. - The event handler must return a and accept a and - a as its parameters. - - - The channel where this message was sent will be passed into the parameter. - - - The emoji that all reactions had and were removed will be passed into the parameter. - - - - - Fired when a role is created. - - - Fired when a role is deleted. - - - Fired when a role is updated. - - - Fired when the connected account joins a guild. - - - Fired when the connected account leaves a guild. - - - Fired when a guild becomes available. - - - Fired when a guild becomes unavailable. - - - Fired when offline guild members are downloaded. - - - Fired when a guild is updated. - - - Fired when a user joins a guild. - - - Fired when a user leaves a guild. - - - Fired when a user is banned from a guild. - - - Fired when a user is unbanned from a guild. - - - Fired when a user is updated. - - - Fired when a guild member is updated, or a member presence is updated. - - - Fired when a user joins, leaves, or moves voice channels. - - - Fired when the bot connects to a Discord voice server. - - - Fired when the connected account is updated. - - - Fired when a user starts typing. - - - Fired when a user joins a group channel. - - - Fired when a user is removed from a group channel. - - - - Fired when an invite is created. - - - - This event is fired when an invite is created. The event handler must return a - and accept a as its parameter. - - - The invite created will be passed into the parameter. - - - - - - Fired when an invite is deleted. - - - - This event is fired when an invite is deleted. The event handler must return - a and accept a and - as its parameter. - - - The channel where this invite was created will be passed into the parameter. - - - The code of the deleted invite will be passed into the parameter. - - - - - - Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands. - - - - This event is fired when an interaction is created. The event handler must return a - and accept a as its parameter. - - - The interaction created will be passed into the parameter. - - - - - - Fired when a button is clicked and its interaction is received. - - - - - Fired when a select menu is used and its interaction is received. - - - - - Fired when a slash command is used and its interaction is received. - - - - - Fired when a user command is used and its interaction is received. - - - - - Fired when a message command is used and its interaction is received. - - - - - Fired when a guild application command is created. - - - - This event is fired when an application command is created. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a guild application command is updated. - - - - This event is fired when an application command is updated. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a guild application command is deleted. - - - - This event is fired when an application command is deleted. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a thread is created within a guild, or when the current user is added to a thread. - - - - - Fired when a thread is updated within a guild. - - - - - Fired when a thread is deleted. - - - - - Fired when a user joins a thread - - - - - Fired when a user leaves a thread - - - - - Fired when a stage is started. - - - - - Fired when a stage ends. - - - - - Fired when a stage is updated. - - - - - Fired when a user requests to speak within a stage channel. - - - - - Fired when a speaker is added in a stage channel. - - - - - Fired when a speaker is removed from a stage channel. - - - - - Fired when a sticker in a guild is created. - - - - - Fired when a sticker in a guild is updated. - - - - - Fired when a sticker in a guild is deleted. - - - - - - - - - - - - - - - - - - - - - - - Provides access to a REST-only client with a shared state from this client. - - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - is - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when a shard is connected to the Discord gateway. - - - Fired when a shard is disconnected from the Discord gateway. - - - Fired when a guild data for a shard has finished downloading. - - - Fired when a shard receives a heartbeat from the Discord gateway. - - - - Represents a WebSocket-based Discord client. - - - - - Provides access to a REST-only client with a shared state from this client. - - - - Gets the shard of of this client. - - - Gets the current connection state of this client. - - - - - - - - - - - - - - - - - - - - - - Gets a collection of direct message channels opened in this session. - - - This method returns a collection of currently opened direct message channels. - - This method will not return previously opened DM channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - - A collection of DM channels that have been opened in this session. - - - - - Gets a collection of group channels opened in this session. - - - This method returns a collection of currently opened group channels. - - This method will not return previously opened group channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - - A collection of group channels that have been opened in this session. - - - - - Initializes a new REST/WebSocket-based Discord client. - - - - - Initializes a new REST/WebSocket-based Discord client with the provided configuration. - - The configuration to be used with the client. - - - - - - - - - - - - - - - - - - - - - - - - - Gets a generic channel from the cache or does a rest request if unavailable. - - - - var channel = await _client.GetChannelAsync(381889909113225237); - if (channel != null && channel is IMessageChannel msgChannel) - { - await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); - } - - - The snowflake identifier of the channel (e.g. `381889909113225237`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the channel associated - with the snowflake identifier; null when the channel cannot be found. - - - - - Gets a user from the cache or does a rest request if unavailable. - - - - var user = await _client.GetUserAsync(168693960628371456); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The snowflake identifier of the user (e.g. `168693960628371456`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the snowflake identifier; null if the user is not found. - - - - - Clears all cached channels from the client. - - - - - Clears cached DM channels from the client. - - - - - - - - - - - Gets a global application command. - - The id of the command. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains the application command if found, otherwise - . - - - - - Gets a collection of all global commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of global - application commands. - - - - - Clears cached users from the client. - - - - - - - - Gets a sticker. - - The unique identifier of the sticker. - A sticker if found, otherwise . - - - - - - - - - - - - - - The following example sets the status of the current user to Do Not Disturb. - - await client.SetStatusAsync(UserStatus.DoNotDisturb); - - - - - - - - The following example sets the activity of the current user to the specified game name. - - await client.SetGameAsync("A Strange Game"); - - - - The following example sets the activity of the current user to a streaming status. - - await client.SetGameAsync("Great Stream 10/10", "https://twitch.tv/MyAmazingStream1337", ActivityType.Streaming); - - - - - - - - - Unexpected channel type is created. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when connected to the Discord gateway. - - - Fired when disconnected to the Discord gateway. - - - - Fired when guild data has finished downloading. - - - It is possible that some guilds might be unsynced if - was not long enough to receive all GUILD_AVAILABLEs before READY. - - - - Fired when a heartbeat is received from the Discord gateway. - - - - Represents a configuration class for . - - - This configuration, based on , helps determine several key configurations the - socket client depend on. For instance, shards and connection timeout. - - - The following config enables the message cache and configures the client to always download user upon guild - availability. - - var config = new DiscordSocketConfig - { - AlwaysDownloadUsers = true, - MessageCacheSize = 100 - }; - var client = new DiscordSocketClient(config); - - - - - - Returns the encoding gateway should use. - - - - - Gets or sets the WebSocket host to connect to. If null, the client will use the - /gateway endpoint. - - - - - Gets or sets the time, in milliseconds, to wait for a connection to complete before aborting. - - - - - Gets or sets the ID for this shard. Must be less than . - - - - - Gets or sets the total number of shards for this application. - - - - - Gets or sets the number of messages per channel that should be kept in cache. Setting this to zero - disables the message cache entirely. - - - - - Gets or sets the max number of users a guild may have for offline users to be included in the READY - packet. The maximum value allowed is 250. - - - - - Gets or sets the provider used to generate new WebSocket connections. - - - - - Gets or sets the provider used to generate new UDP sockets. - - - - - Gets or sets whether or not all users should be downloaded as guilds come available. - - - - By default, the Discord gateway will only send offline members if a guild has less than a certain number - of members (determined by in this library). This behaviour is why - sometimes a user may be missing from the WebSocket cache for collections such as - . - - - This property ensures that whenever a guild becomes available (determined by - ), incomplete user chunks will be - downloaded to the WebSocket cache. - - - For more information, please see - Request Guild Members - on the official Discord API documentation. - - - 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 - 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 - - or - as a backup. - - - - - - Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. - Setting this property to nulldisables this check. - - - - - Gets or sets the maximum identify concurrency. - - - This information is provided by Discord. - It is only used when using a and auto-sharding is disabled. - - - - - Gets or sets the maximum wait time in milliseconds between GUILD_AVAILABLE events before firing READY. - If zero, READY will fire as soon as it is received and all guilds will be unavailable. - - - This property is measured in milliseconds; negative values will throw an exception. - If a guild is not received before READY, it will be unavailable. - - - A representing the maximum wait time in milliseconds between GUILD_AVAILABLE events - before firing READY. - - Value must be at least 0. - - - - Gets or sets gateway intents to limit what events are sent from Discord. - The default is . - - - For more information, please see - GatewayIntents - on the official Discord API documentation. - - - - - Initializes a new instance of the class with the default configuration. - - - - - Represents a generic WebSocket-based audio channel. - - - - - Represents a generic WebSocket-based channel that can send and receive messages. - - - - - Gets all messages in this channel's cache. - - - A read-only collection of WebSocket-based messages. - - - - - Sends a message to this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a cached message from this channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return null. Please refer to - for more details. - - - This method retrieves the message from the local WebSocket cache and does not send any additional - request to Discord. This message may be a message that has been deleted. - - - The snowflake identifier of the message. - - A WebSocket-based message object; null if it does not exist in the cache or if caching is not - enabled. - - - - - Gets the last N cached messages from this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets the last N cached messages starting from a certain message in this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The message ID to start the fetching from. - The direction of which the message should be gotten from. - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets the last N cached messages starting from a certain message in this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The message to start the fetching from. - The direction of which the message should be gotten from. - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets a read-only collection of pinned messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a read-only collection of messages found in the pinned messages. - - - - - Represents a generic WebSocket-based channel that is private to select recipients. - - - - - Represents a WebSocket-based category channel. - - - - - - - - Gets the child channels of this category. - - - A read-only collection of whose - matches the snowflake identifier of this category - channel. - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based channel. - - - - - Gets when the channel is created. - - - - - Gets a collection of users from the WebSocket cache. - - - - Unexpected channel type is created. - - - - Gets a generic user from this channel. - - The snowflake identifier of the user. - - A generic WebSocket-based user associated with the snowflake identifier. - - - - - - - - - - - - - Unexpected type. - - - Unexpected type. - - - - Represents a WebSocket-based direct-message channel. - - - - - Gets the recipient of the channel. - - - - - - - - Gets a collection that is the current logged-in user and the recipient. - - - - - - - - - - - Gets the message associated with the given . - - TThe ID of the message. - The options to be used when sending the request. - - The message gotten from either the cache or the download, or null if none is found. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a user in this channel from the provided . - - The snowflake identifier of the user. - - A object that is a recipient of this channel; otherwise null. - - - - - Returns the recipient user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based private group channel. - - - - - - - - - - - Returns a collection representing all of the users in the group. - - - - - Returns a collection representing all users in the group, not including the client. - - - - - - - Voice is not yet supported for group channels. - - - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a user from this group. - - The snowflake identifier of the user. - - A WebSocket-based group user associated with the snowflake identifier. - - - - - Returns the name of the group. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Connecting to a group channel is not supported. - - - - - - - - - - Represents a WebSocket-based guild channel. - - - - - Gets the guild associated with this channel. - - - A guild object that this channel belongs to. - - - - - - - - - - - - - - Gets a collection of users that are able to view the channel. - - - A read-only collection of users that can access the channel (i.e. the users seen in the user list). - - - - - - - - - - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Adds or updates the permission overwrite for the given user. - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Adds or updates the permission overwrite for the given role. - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Gets the name of the channel. - - - A string that resolves to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based news channel in a guild that has the same properties as a . - - - - The property is not supported for news channels. - - - - - - - - This property is not supported by this type. Attempting to use this property will result in a . - - - - - - Represents a stage channel recieved over the gateway. - - - - - - - - - - - - - - - - - Returns if the current user is a speaker within the stage, otherwise . - - - - - Gets a collection of users who are speakers within the stage. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based channel in a guild that can send and receive messages. - - - - - - - - - - - - - - Gets the parent (category) of this channel in the guild's channel list. - - - An representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - - - - - - - Gets a collection of threads within this text channel. - - - - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread channel inside of a guild. - - - - - - - - Gets the owner of the current thread. - - - - - Gets the current users within this thread. - - - - - - - - if this thread is private, otherwise - - - - - Gets the parent channel this thread resides in. - - - - - - - - - - - - - - - - - - - - - - - Gets a collection of cached users within this thread. - - - - - - - - Gets all users inside this thread. - - - If all users are not downloaded then this method will call and return the result. - - The options to be used when sending the request. - A task representing the download operation. - - - - Downloads all users that have access to this thread. - - The options to be used when sending the request. - A task representing the asyncronous download operation. - - - - - - - - - - Adds a user to this thread. - - The to add. - The options to be used when sending the request. - - A task that represents the asynchronous operation of adding a member to a thread. - - - - - Removes a user from this thread. - - The to remove from this thread. - The options to be used when sending the request. - - A task that represents the asynchronous operation of removing a user from this thread. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - Represents a WebSocket-based voice channel in a guild. - - - - - - - - - - - - - - Gets the parent (category) channel of this channel. - - - A category channel representing the parent of this channel; null if none is set. - - - - - - - - - - - Gets a collection of users that are currently connected to this voice channel. - - - A read-only collection of users that are currently connected to this voice channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based guild object. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the number of members. - - - This property retrieves the number of members returned by Discord. - - - Due to how this property is returned by Discord instead of relying on the WebSocket cache, the - number here is the most accurate in terms of counting the number of users within this guild. - - - Use this instead of enumerating the count of the - collection, as you may see discrepancy - between that and this property. - - - - - - Gets the number of members downloaded to the local guild cache. - - - Indicates whether the client is connected to this guild. - - - - - - - - - Gets the user that owns this guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Indicates whether the client has all the members downloaded to the local guild cache. - - - Indicates whether the guild cache is synced to this guild. - - - - Gets the associated with this guild. - - - - - Gets the default channel in this guild. - - - This property retrieves the first viewable text channel for this guild. - - This channel does not guarantee the user can send message to it, as it only looks for the first viewable - text channel. - - - - A representing the first viewable channel that the user has access to. - - - - - Gets the AFK voice channel in this guild. - - - A that the AFK users will be moved to after they have idled for too - long; if none is set. - - - - - Gets the max bitrate for voice channels in this guild. - - - A representing the maximum bitrate value allowed by Discord in this guild. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - - A channel set within the server's widget settings; if none is set. - - - - - Gets the system channel where randomized welcome messages are sent in this guild. - - - A text channel where randomized welcome messages will be sent to; if none is set. - - - - - Gets the channel with the guild rules. - - - A text channel with the guild rules; if none is set. - - - - - Gets the channel where admins and moderators of Community guilds receive - notices from Discord. - - - A text channel where admins and moderators of Community guilds receive - notices from Discord; if none is set. - - - - - Gets a collection of all text channels in this guild. - - - A read-only collection of message channels found within this guild. - - - - - Gets a collection of all voice channels in this guild. - - - A read-only collection of voice channels found within this guild. - - - - - Gets a collection of all stage channels in this guild. - - - A read-only collection of stage channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - - A read-only collection of category channels found within this guild. - - - - - Gets a collection of all thread channels in this guild. - - - A read-only collection of thread channels found within this guild. - - - - - Gets the current logged-in user. - - - - - Gets the built-in role containing all users in this guild. - - - A role object that represents an @everyone role in this guild. - - - - - Gets a collection of all channels in this guild. - - - A read-only collection of generic channels found within this guild. - - - - - - - - Gets a collection of all custom stickers for this guild. - - - - - - - - Gets a collection of users in this guild. - - - This property retrieves all users found within this guild. - - - This property may not always return all the members for large guilds (i.e. guilds containing - 100+ users). If you are simply looking to get the number of users present in this guild, - consider using instead. - - - Otherwise, you may need to enable to fetch - the full user list upon startup, or use to manually download - the users. - - - - - A collection of guild users found within this guild. - - - - - Gets a collection of all roles in this guild. - - - A read-only collection of roles found within this guild. - - - - - - - - is . - - - - is . - - - - - - - - - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - - - - - - - - - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - - A generic channel associated with the specified ; if none is found. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - - A text channel associated with the specified ; if none is found. - - - - - Gets a thread in this guild. - - The snowflake identifier for the thread. - - A thread channel associated with the specified ; if none is found. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - - A voice channel associated with the specified ; if none is found. - - - - - Gets a stage channel in this guild. - - The snowflake identifier for the stage channel. - - A stage channel associated with the specified ; if none is found. - - - - - Gets a category channel in this guild. - - The snowflake identifier for the category channel. - - A category channel associated with the specified ; if none is found. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - 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}."; - }); - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a new voice channel in this guild. - - The new name for the voice channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a new channel category in this guild. - - The new name for the category. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Deletes all application commands in the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous delete operation. - - - - - Gets a collection of slash commands created by the current user in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - slash commands created by the current user. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the partial metadata of - the vanity invite found within this guild; if none is found. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - Whether the role can be mentioned. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds. - - - The snowflake identifier of the user. - - A guild user associated with the specified ; if none is found. - - - - - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild throught REST. - Users returned by this method are not cached. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The options to be used when sending the request. - The audit log entry ID to filter entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - - - - - - - - - - is . - - - - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - Disconnects the user from its current voice channel - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - A sticker, if none is found then . - - - - Gets a collection of all stickers within this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets the name of the guild. - - - A string that resolves to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Gets the messagte associated with this message command. - - - - - - Note Not implemented for - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Gets the user who this command targets. - - - - - - Note Not implemented for - - - - - Represents a Websocket-based interaction type for Message Components. - - - - - The data received with this interaction, contains the button that was clicked. - - - - - The message that contained the trigger for this interaction. - - - - - - - - Updates the message which this component resides in with the type - - A delegate containing the properties to modify the message with. - The request options for this async request. - A task that represents the asynchronous operation of updating the message. - - - - - - - - - - - - - Defers an interaction and responds with type 5 () - - to send this message ephemerally, otherwise . - The request options for this async request. - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - - - - Represents the data sent with a . - - - - - The components Custom Id that was clicked - - - - - The type of the component clicked - - - - - The value(s) of a interaction response. - - - - - Represents a received over the gateway. - - - - - The autocomplete data of this interaction. - - - - - Responds to this interaction with a set of choices. - - - The set of choices for the user to pick from. - - A max of 20 choices are allowed. Passing for this argument will show the executing user that - there is no choices for their autocompleted input. - - - The request options for this response. - - A task that represents the asynchronous operation of responding to this interaction. - - - - - Responds to this interaction with a set of choices. - - The request options for this response. - - The set of choices for the user to pick from. - - A max of 20 choices are allowed. Passing for this argument will show the executing user that - there is no choices for their autocompleted input. - - - - A task that represents the asynchronous operation of responding to this interaction. - - - - - - - - - - - - - - - - - - - - Represents data for a slash commands autocomplete interaction. - - - - - Gets the name of the invoked command. - - - - - Gets the id of the invoked command. - - - - - Gets the type of the invoked command. - - - - - Gets the version of the invoked command. - - - - - Gets the current autocomplete option that is activly being filled out. - - - - - Gets a collection of all the other options the executing users has filled out. - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Represents a Websocket-based recieved by the gateway - - - - - - - - - - - - - - The sub command options received for this sub command group. - - - - - Represends a Websocket-based . - - - - - if this command is a global command, otherwise . - - - - - - - - - - - - - - - - - - - - A collection of 's for this command. - - - If the is not a slash command, this field will be an empty collection. - - - - - - - - Returns the guild this command resides in, if this command is a global command then it will return - - - - - - - - - - - - - - Represents a choice for a . - - - - - - - - - - - Represents an option for a . - - - - - - - - - - - - - - - - - - - - Choices for string and int types for the user to pick from. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - Base class for User, Message, and Slash command interactions. - - - - - Gets the name of the invoked command. - - - - - Gets the id of the invoked command. - - - - - The data associated with this interaction. - - - - - - - - - - - - - - - - - Acknowledges this interaction with the . - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - Represents the base data tied with the interaction. - - - - - - - - The received with this interaction. - - - - - Represents the base data tied with the interaction. - - - - - Represents an Interaction recieved over the gateway. - - - - - The this interaction was used in. - - - - - The who triggered this interaction. - - - - - The type of this interaction. - - - - - The token used to respond to this interaction. - - - - - The data sent with this interaction. - - - - - The version of this interaction. - - - - - - - - if the token is valid for replying to, otherwise . - - - - - Responds to an Interaction with type . - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - Message content is too long, length must be less or equal to . - The parameters provided were invalid or the token was invalid. - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - The file to upload. - The file name of the attachment. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - The file to upload. - The file name of the attachment. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Gets the original response for this interaction. - - The request options for this async request. - A that represents the initial response. - - - - Edits original response for this interaction. - - A delegate containing the properties to modify the message with. - The request options for this async request. - A that represents the initial response. - - - - Acknowledges this interaction. - - to send this message ephemerally, otherwise . - The request options for this async request. - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - - - - - - - - - - Represents a WebSocket-based invite to a guild. - - - - - - - - Gets the channel where this invite was created. - - - - - - - - Gets the guild where this invite was created. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the time (in seconds) until the invite expires. - - - - - Gets the max number of uses this invite may have. - - - - - Gets the number of times this invite has been used. - - - - - Gets the user that created this invite if available. - - - - - - - - Gets when this invite was created. - - - - - Gets the user targeted by this invite if available. - - - - - Gets the type of the user targeted by this invite. - - - - - - - - - - - - - - Gets the URL of the invite. - - - A string that resolves to the Url of the invite. - - - - - - - - - - - - - - - - is less than 0. - - - - Represents a WebSocket-based message. - - - - - Gets the author of this message. - - - A WebSocket-based user object. - - - - - Gets the source channel of the message. - - - A WebSocket-based message channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns all attachments included in this message. - - - Collection of attachments. - - - - - Returns all embeds included in this message. - - - Collection of embed objects. - - - - - Returns the channels mentioned in this message. - - - Collection of WebSocket-based guild channels. - - - - - Returns the roles mentioned in this message. - - - Collection of WebSocket-based roles. - - - - - Returns the users mentioned in this message. - - - Collection of WebSocket-based users. - - - - - - - - - - - - - - - - - - - - Gets the content of the message. - - - Content of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based reaction object. - - - - - Gets the ID of the user who added the reaction. - - - This property retrieves the snowflake identifier of the user responsible for this reaction. This - property will always contain the user identifier in event that - cannot be retrieved. - - - A user snowflake identifier associated with the user. - - - - - Gets the user who added the reaction if possible. - - - - This property attempts to retrieve a WebSocket-cached user that is responsible for this reaction from - the client. In other words, when the user is not in the WebSocket cache, this property may not - contain a value, leaving the only identifiable information to be - . - - - If you wish to obtain an identifiable user object, consider utilizing - which will attempt to retrieve the user from REST. - - - - A user object where possible; a value is not always returned. - - - - - - Gets the ID of the message that has been reacted to. - - - A message snowflake identifier associated with the message. - - - - - Gets the message that has been reacted to if possible. - - - A WebSocket-based message where possible; a value is not always returned. - - - - - - Gets the channel where the reaction takes place in. - - - A WebSocket-based message channel. - - - - - - - - - - - - - - Represents a WebSocket-based message sent by the system. - - - - - Represents a WebSocket-based message sent by a user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Only the author of a message may modify the message. - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - This operation may only be called on a channel. - - - - Represents a WebSocket-based role to be given to a guild user. - - - - - Gets the guild that owns this role. - - - A representing the parent guild of this role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns a value that determines if the role is an @everyone role. - - - true if the role is @everyone; otherwise false. - - - - - - - - Returns an IEnumerable containing all that have this role. - - - - - - - - - - - Gets the name of the role. - - - A string that resolves to . - - - - - - - - - - - - - - Represents a custom sticker within a guild received over the gateway. - - - - - Gets the user that uploaded the guild sticker. - - - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds, or the bot doesnt have the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - - Gets the guild the sticker was created in. - - - - - - - - - - - - - - Represents a general sticker received over the gateway. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents an unknown sticker received over the gateway. - - - - - - - - - - - - - - - - - - - - - - - Attempts to try to find the sticker. - - - The sticker representing this unknown stickers Id, if none is found then . - - - - - Represents a WebSocket-based group user. - - - - - Gets the group channel of the user. - - - A representing the channel of which the user belongs to. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based guild user. - - - - - Gets the guild the user is in. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns a collection of roles that the user possesses. - - - - - Returns the voice channel the user is in, or null if none. - - - - - - - - Gets the voice connection status of the user if any. - - - A representing the user's voice status; null if the user is not - connected to a voice channel. - - - - - - - - Returns the position of the user within the role hierarchy. - - - The returned value equal to the position of the highest role the user has, or - if user is the server owner. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents the WebSocket user's presence status. This may include their online status and their activity. - - - - - - - - - - - - - - Creates a new containing all of the client types - where a user is active from the data supplied in the Presence update frame. - - - A dictionary keyed by the - and where the value is the . - - - A collection of all s that this user is active. - - - - - Creates a new containing all the activities - that a user has from the data supplied in the Presence update frame. - - - A list of . - - - A list of all that this user currently has available. - - - - - Gets the status of the user. - - - A string that resolves to . - - - - - Represents the logged-in WebSocket-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread user received over the gateway. - - - - - Gets the this user is in. - - - - - Gets the timestamp for when this user joined this thread. - - - - - Gets the guild this user is in. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the guild user of this thread user. - - - - - - Represents a WebSocket-based user that is yet to be recognized by the client. - - - A user may not be recognized due to the user missing from the cache or failed to be recognized properly. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This field is not supported for an unknown user. - - - - Represents a WebSocket-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets mutual guilds shared with this user. - - - This property will only include guilds in the same . - - - - - - - - - - - - - - - - - Gets the full name of the user (e.g. Example#0001). - - - The full name of the user. - - - - - Represents a WebSocket user's voice connection status. - - - - - Initializes a default with everything set to null or false. - - - - - Gets the voice channel that the user is currently in; or null if none. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the name of this voice channel. - - - A string that resolves to name of this voice channel; otherwise "Unknown". - - - - - - - - Represents a WebSocket-based webhook user. - - - - Gets the guild of this webhook. - - - - - - - - - - - - - - - - Webhook users does not support banners. - - - - Webhook users does not support accent colors. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Webhook users cannot be kicked. - - - - Webhook users cannot be modified. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based voice server. - - - - - Gets the guild associated with the voice server. - - - A cached entity of the guild. - - - - - Gets the endpoint URL of the voice server host. - - - An URL representing the voice server host. - - - - - Gets the voice connection token. - - - A voice connection token. - - - - - The exception thrown when the gateway client has been requested to reconnect. - - - - - Initializes a new instance of the class with the reconnection - message. - - The reason why the gateway has been requested to reconnect. - - - Creates a new REST/WebSocket discord client. - - - - - - Wraps another stream with a timed buffer. - - - Reads the payload from an RTP frame - - - Converts Opus to PCM - - - Header received with no payload. - - - Received payload without an RTP header. - - - Converts PCM to Opus - - - Wraps an IAudioClient, sending voice data on write. - - - Reads the payload from an RTP frame - - - The token has had cancellation requested. - The associated has been disposed. - - - Wraps data in an RTP frame - - - - Decrypts an RTP frame using libsodium. - - - - - Encrypts an RTP frame using libsodium. - - - - Header received with no payload. - - - Received payload without an RTP header. - The token has had cancellation requested. - The associated has been disposed. - - - The sharded variant of , which may contain the client, user, guild, channel, and message. - - - Gets the that the command is executed with. - - - Gets the shard ID of the command context. - - - - - - - Represents a WebSocket-based context of a command. This may include the client, guild, channel, user, and message. - - - - - Gets the that the command is executed with. - - - - - Gets the that the command is executed in. - - - - - Gets the that the command is executed in. - - - - - Gets the who executed the command. - - - - - Gets the that the command is interpreted from. - - - - - Indicates whether the channel that the command is executed in is a private channel. - - - - - Initializes a new class with the provided client and message. - - The underlying client. - The underlying message. - - - - - - - - - - - - - - - - - - The default WebSocketProvider is not supported on this platform. - - - diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml deleted file mode 100644 index d1bafb9a37..0000000000 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - Discord.Net.Webhook - - - - A client responsible for connecting as a Webhook. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - - Creates a new Webhook Discord client. - - The url of the webhook. - The configuration options to use for this client. - Thrown if the is an invalid format. - Thrown if the is null or whitespace. - - - Sends a message to the channel for this webhook. - Returns the ID of the created message. - - - - Modifies a message posted using this webhook. - - - This method can only modify messages that were sent using the same webhook. - - ID of the modified message. - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Deletes a message posted using this webhook. - - - This method can only delete messages that were sent using the same webhook. - - ID of the deleted message. - The options to be used when sending the request. - - A task that represents the asynchronous deletion operation. - - - - Sends a message to the channel for this webhook with an attachment. - Returns the ID of the created message. - - - Sends a message to the channel for this webhook with an attachment. - Returns the ID of the created message. - - - Modifies the properties of this webhook. - - - Deletes this webhook from Discord and disposes the client. - - - - Properties that are used to modify an Webhook message with the specified changes. - - - - - Gets or sets the content of the message. - - - This must be less than the constant defined by . - - - - - Gets or sets the embed array that the message should display. - - - - - Gets or sets the allowed mentions of the message. - - - - - Gets or sets the components that the message should display. - - - - Could not find a webhook with the supplied credentials. - - - From 3cd842b76b883c995fbdc1628c027b916eb2fbe3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 6 Oct 2021 23:59:54 -0300 Subject: [PATCH 340/494] Remove console writeline --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 1cd3debf49..61ee5f3cff 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2563,7 +2563,6 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty catch (Exception ex) { await _gatewayLogger.ErrorAsync($"Error handling {opCode}{(type != null ? $" ({type})" : "")}", ex).ConfigureAwait(false); - Console.WriteLine(ex); } } #endregion From 0f681ca172443c65e126d8aec7f59d290b43443d Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Thu, 7 Oct 2021 00:00:55 -0300 Subject: [PATCH 341/494] Remove Console.WriteLine --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index ba788093db..def163db6a 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2566,7 +2566,6 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty catch (Exception ex) { await _gatewayLogger.ErrorAsync($"Error handling {opCode}{(type != null ? $" ({type})" : "")}", ex).ConfigureAwait(false); - Console.WriteLine(ex); } } #endregion From baca5f807996f08e3da1f07f5f17f16deeea1fa6 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:03:05 -0300 Subject: [PATCH 342/494] Remove useless log --- src/Discord.Net.WebSocket/ConnectionManager.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Discord.Net.WebSocket/ConnectionManager.cs b/src/Discord.Net.WebSocket/ConnectionManager.cs index 9a19f90f42..e444f359f6 100644 --- a/src/Discord.Net.WebSocket/ConnectionManager.cs +++ b/src/Discord.Net.WebSocket/ConnectionManager.cs @@ -185,11 +185,6 @@ public void Error(Exception ex) _readyPromise.TrySetException(ex); _connectionPromise.TrySetException(ex); _connectionCancelToken?.Cancel(); - - _ = Task.Run(async () => - { - await _logger.ErrorAsync($"Failed to start the connection: {ex}", ex); - }); } public void CriticalError(Exception ex) { From fbf2bb9d8e30162b256239863cf659358ac4df86 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:06:58 -0300 Subject: [PATCH 343/494] Rename Available sticker field to IsAvailable --- src/Discord.Net.Core/Entities/Stickers/ISticker.cs | 2 +- src/Discord.Net.Rest/Entities/Messages/Sticker.cs | 4 ++-- .../Entities/Stickers/SocketSticker.cs | 6 +++--- .../Entities/Stickers/SocketUnknownSticker.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs index 6d0eee1b4e..a3c520b4ac 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs @@ -59,7 +59,7 @@ public interface ISticker : IStickerItem /// /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts /// - bool? Available { get; } + bool? IsAvailable { get; } /// /// Gets the standard sticker's sort order within its pack diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index 6490978e76..75bc9bd384 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -20,7 +20,7 @@ public class Sticker : RestEntity, ISticker /// public StickerType Type { get; protected set; } /// - public bool? Available { get; protected set; } + public bool? IsAvailable { get; protected set; } /// public int? SortOrder { get; protected set; } /// @@ -47,7 +47,7 @@ internal void Update(Model model) Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0]; Type = model.Type; SortOrder = model.SortValue; - Available = model.Available; + IsAvailable = model.Available; Format = model.FormatType; } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index a1c2f10027..758ecebb4d 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -35,7 +35,7 @@ public class SocketSticker : SocketEntity, ISticker public StickerFormatType Format { get; protected set; } /// - public virtual bool? Available { get; protected set; } + public virtual bool? IsAvailable { get; protected set; } /// public virtual int? SortOrder { get; private set; } @@ -65,7 +65,7 @@ internal virtual void Update(Model model) Name = model.Name; Description = model.Desription; PackId = model.PackId; - Available = model.Available; + IsAvailable = model.Available; Format = model.FormatType; Type = model.Type; SortOrder = model.SortValue; @@ -94,7 +94,7 @@ public override bool Equals(object obj) stickerModel.PackId == PackId && stickerModel.Type == Type && stickerModel.SortValue == SortOrder && - stickerModel.Available == Available && + stickerModel.Available == IsAvailable && (!stickerModel.Tags.IsSpecified || stickerModel.Tags.Value == string.Join(", ", Tags)); } else diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs index db1124a321..2e9514595a 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -26,7 +26,7 @@ public override string Description public override ulong PackId => 0; /// - public override bool? Available + public override bool? IsAvailable => null; /// From 96b816e256c16e180d2be3d9930fa8a8dfa28160 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:08:20 -0300 Subject: [PATCH 344/494] Rename Available to IsAvailable in stickers --- src/Discord.Net.Core/Discord.Net.Core.xml | 2 +- src/Discord.Net.Core/Entities/Stickers/ISticker.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 2 +- src/Discord.Net.Rest/Entities/Messages/Sticker.cs | 4 ++-- src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml | 4 ++-- .../Entities/Stickers/SocketSticker.cs | 6 +++--- .../Entities/Stickers/SocketUnknownSticker.cs | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index bdcea9de98..1b55655f80 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -10001,7 +10001,7 @@ A with the format type of this sticker. - + Gets whether this guild sticker can be used, may be false due to loss of Server Boosts diff --git a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs index 6d0eee1b4e..a3c520b4ac 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs @@ -59,7 +59,7 @@ public interface ISticker : IStickerItem /// /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts /// - bool? Available { get; } + bool? IsAvailable { get; } /// /// Gets the standard sticker's sort order within its pack diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 52da1a0bd1..ed31c23817 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4611,7 +4611,7 @@ - + diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index 6490978e76..75bc9bd384 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -20,7 +20,7 @@ public class Sticker : RestEntity, ISticker /// public StickerType Type { get; protected set; } /// - public bool? Available { get; protected set; } + public bool? IsAvailable { get; protected set; } /// public int? SortOrder { get; protected set; } /// @@ -47,7 +47,7 @@ internal void Update(Model model) Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0]; Type = model.Type; SortOrder = model.SortValue; - Available = model.Available; + IsAvailable = model.Available; Format = model.FormatType; } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 79f9cc2cf7..6ea25ad971 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -4963,7 +4963,7 @@ - + @@ -4989,7 +4989,7 @@ - + diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index a1c2f10027..758ecebb4d 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -35,7 +35,7 @@ public class SocketSticker : SocketEntity, ISticker public StickerFormatType Format { get; protected set; } /// - public virtual bool? Available { get; protected set; } + public virtual bool? IsAvailable { get; protected set; } /// public virtual int? SortOrder { get; private set; } @@ -65,7 +65,7 @@ internal virtual void Update(Model model) Name = model.Name; Description = model.Desription; PackId = model.PackId; - Available = model.Available; + IsAvailable = model.Available; Format = model.FormatType; Type = model.Type; SortOrder = model.SortValue; @@ -94,7 +94,7 @@ public override bool Equals(object obj) stickerModel.PackId == PackId && stickerModel.Type == Type && stickerModel.SortValue == SortOrder && - stickerModel.Available == Available && + stickerModel.Available == IsAvailable && (!stickerModel.Tags.IsSpecified || stickerModel.Tags.Value == string.Join(", ", Tags)); } else diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs index db1124a321..2e9514595a 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -26,7 +26,7 @@ public override string Description public override ulong PackId => 0; /// - public override bool? Available + public override bool? IsAvailable => null; /// From 7ae1ba6a31a4e0e14810fba88fc4eea8dd79ad10 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:09:58 -0300 Subject: [PATCH 345/494] Add summary indent for role members --- src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs index d9740338f5..20fa2a391a 100644 --- a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs +++ b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs @@ -53,7 +53,7 @@ public class SocketRole : SocketEntity, IRole public string Mention => IsEveryone ? "@everyone" : MentionUtils.MentionRole(Id); /// - /// Returns an IEnumerable containing all that have this role. + /// Returns an IEnumerable containing all that have this role. /// public IEnumerable Members => Guild.Users.Where(x => x.Roles.Any(r => r.Id == Id)); From a4edfbafc9bd74cd794cb21a829e98821565fa31 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:11:33 -0300 Subject: [PATCH 346/494] Add summary indent to SocketInvite --- src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs b/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs index abc418d866..2b64e170eb 100644 --- a/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs +++ b/src/Discord.Net.WebSocket/Entities/Invites/SocketInvite.cs @@ -7,7 +7,7 @@ namespace Discord.WebSocket { /// - /// Represents a WebSocket-based invite to a guild. + /// Represents a WebSocket-based invite to a guild. /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketInvite : SocketEntity, IInviteMetadata From 4f6b1ca6333331ea1f7fe2bda1523e3b9d812e70 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:16:18 -0300 Subject: [PATCH 347/494] Rename DefaultPermission to IsDefaultPermission --- .../Entities/Interactions/IApplicationCommand.cs | 2 +- .../Entities/Interactions/RestApplicationCommand.cs | 4 ++-- .../Interaction/SocketBaseCommand/SocketApplicationCommand.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index c5f6697556..3fe53b72c1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -34,7 +34,7 @@ public interface IApplicationCommand : ISnowflakeEntity, IDeletable /// /// Whether the command is enabled by default when the app is added to a guild. /// - bool DefaultPermission { get; } + bool IsDefaultPermission { get; } /// /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 80ba284961..eb9cce07f3 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -26,7 +26,7 @@ public abstract class RestApplicationCommand : RestEntity, IApplicationCo public string Description { get; private set; } /// - public bool DefaultPermission { get; private set; } + public bool IsDefaultPermission { get; private set; } /// /// The options of this command. @@ -61,7 +61,7 @@ internal virtual void Update(Model model) ApplicationId = model.ApplicationId; Name = model.Name; Description = model.Description; - DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); Options = model.Options.IsSpecified ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index f70f5b8a3e..c849341b85 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -35,7 +35,7 @@ public bool IsGlobalCommand public string Description { get; private set; } /// - public bool DefaultPermission { get; private set; } + public bool IsDefaultPermission { get; private set; } /// /// A collection of 's for this command. @@ -81,7 +81,7 @@ internal void Update(Model model) ApplicationId = model.ApplicationId; Description = model.Description; Name = model.Name; - DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); Options = model.Options.IsSpecified ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() From c0fb006705e660f44de7d946064210b82b808511 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:17:51 -0300 Subject: [PATCH 348/494] Rename Default to IsDefault and Required to IsRequired in IApplicationCommandOption --- .../Entities/Interactions/IApplicationCommandOption.cs | 4 ++-- .../API/Common/ApplicationCommandOption.cs | 8 ++++---- .../Entities/Interactions/RestApplicationCommandOption.cs | 8 ++++---- .../SocketBaseCommand/SocketApplicationCommandOption.cs | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 0fc7fb4a3b..5c2443c1b8 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -29,12 +29,12 @@ public interface IApplicationCommandOption /// /// The first required option for the user to complete--only one option can be default. /// - bool? Default { get; } + bool? IsDefault { get; } /// /// If the parameter is required or optional, default is . /// - bool? Required { get; } + bool? IsRequired { get; } /// /// Choices for string and int types for the user to pick from. diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 93ee2e9b53..4bf172ebbe 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -45,11 +45,11 @@ public ApplicationCommandOption(IApplicationCommandOption cmd) Options = cmd.Options.Select(x => new ApplicationCommandOption(x)).ToArray(); - Required = cmd.Required.HasValue - ? cmd.Required.Value + Required = cmd.IsRequired.HasValue + ? cmd.IsRequired.Value : Optional.Unspecified; - Default = cmd.Default.HasValue - ? cmd.Default.Value + Default = cmd.IsDefault.HasValue + ? cmd.IsDefault.Value : Optional.Unspecified; Name = cmd.Name; diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 511712d97a..643cdcf3ce 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -24,10 +24,10 @@ public class RestApplicationCommandOption : IApplicationCommandOption public string Description { get; private set; } /// - public bool? Default { get; private set; } + public bool? IsDefault { get; private set; } /// - public bool? Required { get; private set; } + public bool? IsRequired { get; private set; } /// /// A collection of 's for this command. @@ -55,10 +55,10 @@ internal void Update(Model model) Description = model.Description; if (model.Default.IsSpecified) - Default = model.Default.Value; + IsDefault = model.Default.Value; if (model.Required.IsSpecified) - Required = model.Required.Value; + IsRequired = model.Required.Value; Options = model.Options.IsSpecified ? model.Options.Value.Select(x => Create(x)).ToImmutableArray() diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs index 08b2757cd4..ab1ead5316 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs @@ -23,10 +23,10 @@ public class SocketApplicationCommandOption : IApplicationCommandOption public string Description { get; private set; } /// - public bool? Default { get; private set; } + public bool? IsDefault { get; private set; } /// - public bool? Required { get; private set; } + public bool? IsRequired { get; private set; } /// /// Choices for string and int types for the user to pick from. @@ -52,11 +52,11 @@ internal void Update(Model model) Type = model.Type; Description = model.Description; - Default = model.Default.IsSpecified + IsDefault = model.Default.IsSpecified ? model.Default.Value : null; - Required = model.Required.IsSpecified + IsRequired = model.Required.IsSpecified ? model.Required.Value : null; From 596ac746b679d6bdaa5cdff7a5a4022a3747bef8 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:19:46 -0300 Subject: [PATCH 349/494] Rename Default and Required to IsDefault and IsRequired in IApplicationCommandOption. Rename DefaultPermission to IsDefaultPermission in IApplicationCommand --- src/Discord.Net.Core/Discord.Net.Core.xml | 6 +++--- .../Entities/Interactions/IApplicationCommand.cs | 2 +- .../Entities/Interactions/IApplicationCommandOption.cs | 4 ++-- .../API/Common/ApplicationCommandOption.cs | 8 ++++---- src/Discord.Net.Rest/Discord.Net.Rest.xml | 6 +++--- .../Entities/Interactions/RestApplicationCommand.cs | 4 ++-- .../Entities/Interactions/RestApplicationCommandOption.cs | 8 ++++---- src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml | 6 +++--- .../SocketBaseCommand/SocketApplicationCommand.cs | 4 ++-- .../SocketBaseCommand/SocketApplicationCommandOption.cs | 8 ++++---- 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 1b55655f80..ebbf93c398 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4875,7 +4875,7 @@ The description of the command. - + Whether the command is enabled by default when the app is added to a guild. @@ -4974,12 +4974,12 @@ The description of this command option, 1-100 character description. - + The first required option for the user to complete--only one option can be default. - + If the parameter is required or optional, default is . diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index c5f6697556..3fe53b72c1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -34,7 +34,7 @@ public interface IApplicationCommand : ISnowflakeEntity, IDeletable /// /// Whether the command is enabled by default when the app is added to a guild. /// - bool DefaultPermission { get; } + bool IsDefaultPermission { get; } /// /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 79bc5bd626..39bf5418fa 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -29,12 +29,12 @@ public interface IApplicationCommandOption /// /// The first required option for the user to complete--only one option can be default. /// - bool? Default { get; } + bool? IsDefault { get; } /// /// If the parameter is required or optional, default is . /// - bool? Required { get; } + bool? IsRequired { get; } /// /// Choices for string and int types for the user to pick from. diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 8c617582b7..f1c4cce424 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -50,11 +50,11 @@ public ApplicationCommandOption(IApplicationCommandOption cmd) ChannelTypes = cmd.ChannelTypes.ToArray(); - Required = cmd.Required.HasValue - ? cmd.Required.Value + Required = cmd.IsRequired.HasValue + ? cmd.IsRequired.Value : Optional.Unspecified; - Default = cmd.Default.HasValue - ? cmd.Default.Value + Default = cmd.IsDefault.HasValue + ? cmd.IsDefault.Value : Optional.Unspecified; Name = cmd.Name; diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index ed31c23817..0c47d29d2b 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4058,7 +4058,7 @@ - + @@ -4103,10 +4103,10 @@ - + - + diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 9dce4de137..0ef365eb7b 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -26,7 +26,7 @@ public abstract class RestApplicationCommand : RestEntity, IApplicationCo public string Description { get; private set; } /// - public bool DefaultPermission { get; private set; } + public bool IsDefaultPermission { get; private set; } /// /// The options of this command. @@ -61,7 +61,7 @@ internal virtual void Update(Model model) ApplicationId = model.ApplicationId; Name = model.Name; Description = model.Description; - DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); Options = model.Options.IsSpecified ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 60241c3723..f3487ae67e 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -24,10 +24,10 @@ public class RestApplicationCommandOption : IApplicationCommandOption public string Description { get; private set; } /// - public bool? Default { get; private set; } + public bool? IsDefault { get; private set; } /// - public bool? Required { get; private set; } + public bool? IsRequired { get; private set; } /// /// A collection of 's for this command. @@ -60,10 +60,10 @@ internal void Update(Model model) Description = model.Description; if (model.Default.IsSpecified) - Default = model.Default.Value; + IsDefault = model.Default.Value; if (model.Required.IsSpecified) - Required = model.Required.Value; + IsRequired = model.Required.Value; Options = model.Options.IsSpecified ? model.Options.Value.Select(x => Create(x)).ToImmutableArray() diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index 6ea25ad971..a520d182a0 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -4120,7 +4120,7 @@ - + @@ -4173,10 +4173,10 @@ - + - + diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index 93518ffb3b..2eef2e4ce9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -35,7 +35,7 @@ public bool IsGlobalCommand public string Description { get; private set; } /// - public bool DefaultPermission { get; private set; } + public bool IsDefaultPermission { get; private set; } /// /// A collection of 's for this command. @@ -81,7 +81,7 @@ internal void Update(Model model) ApplicationId = model.ApplicationId; Description = model.Description; Name = model.Name; - DefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); Type = model.Type; Options = model.Options.IsSpecified diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs index 836088638a..e4332b02a9 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs @@ -23,10 +23,10 @@ public class SocketApplicationCommandOption : IApplicationCommandOption public string Description { get; private set; } /// - public bool? Default { get; private set; } + public bool? IsDefault { get; private set; } /// - public bool? Required { get; private set; } + public bool? IsRequired { get; private set; } /// /// Choices for string and int types for the user to pick from. @@ -57,11 +57,11 @@ internal void Update(Model model) Type = model.Type; Description = model.Description; - Default = model.Default.IsSpecified + IsDefault = model.Default.IsSpecified ? model.Default.Value : null; - Required = model.Required.IsSpecified + IsRequired = model.Required.IsSpecified ? model.Required.Value : null; From b3c503b3ddd39d710f2ca3559fa742ad1343d041 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:22:43 -0300 Subject: [PATCH 350/494] Remove extra white spaces --- src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index ccda12644a..efc6f3ba5e 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -450,8 +450,6 @@ internal void Update(ClientState state, ExtendedModel model) } _voiceStates = voiceStates; - - _syncPromise = new TaskCompletionSource(); _downloaderPromise = new TaskCompletionSource(); var _ = _syncPromise.TrySetResultAsync(true); From a4bfe6e41183759184ba708d89ca2e95da34162b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:29:27 -0300 Subject: [PATCH 351/494] Renamed Joined, Archived, and Locked to HasJoined, IsArchived, and IsLocked --- .../Entities/Channels/IThreadChannel.cs | 6 +++--- .../Entities/Channels/RestThreadChannel.cs | 12 ++++++------ .../Entities/Channels/SocketThreadChannel.cs | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs index b5d6eea209..72d65a2e89 100644 --- a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -19,12 +19,12 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// /// if the current user has joined this thread, otherwise . /// - bool Joined { get; } + bool HasJoined { get; } /// /// if the current thread is archived, otherwise . /// - bool Archived { get; } + bool IsArchived { get; } /// /// Duration to automatically archive the thread after recent activity. @@ -39,7 +39,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// /// if the current thread is locked, otherwise /// - bool Locked { get; } + bool IsLocked { get; } /// /// An approximate count of users in a thread, stops counting at 50. diff --git a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs index d9b223f180..0fb55e797f 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs @@ -16,10 +16,10 @@ public class RestThreadChannel : RestTextChannel, IThreadChannel { public ThreadType Type { get; private set; } /// - public bool Joined { get; private set; } + public bool HasJoined { get; private set; } /// - public bool Archived { get; private set; } + public bool IsArchived { get; private set; } /// public ThreadArchiveDuration AutoArchiveDuration { get; private set; } @@ -28,7 +28,7 @@ public class RestThreadChannel : RestTextChannel, IThreadChannel public DateTimeOffset ArchiveTimestamp { get; private set; } /// - public bool Locked { get; private set; } + public bool IsLocked { get; private set; } /// public int MemberCount { get; private set; } @@ -58,14 +58,14 @@ internal override void Update(Model model) { base.Update(model); - Joined = model.ThreadMember.IsSpecified; + HasJoined = model.ThreadMember.IsSpecified; if (model.ThreadMetadata.IsSpecified) { - Archived = model.ThreadMetadata.Value.Archived; + IsArchived = model.ThreadMetadata.Value.Archived; AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; - Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 9a8f4b1393..3fd47ec872 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -35,7 +35,7 @@ public SocketThreadUser CurrentUser => Users.FirstOrDefault(x => x.Id == Discord.CurrentUser.Id); /// - public bool Joined { get; private set; } + public bool HasJoined { get; private set; } /// /// if this thread is private, otherwise @@ -55,7 +55,7 @@ public bool IsPrivateThread public int MemberCount { get; private set; } /// - public bool Archived { get; private set; } + public bool IsArchived { get; private set; } /// public DateTimeOffset ArchiveTimestamp { get; private set; } @@ -64,7 +64,7 @@ public bool IsPrivateThread public ThreadArchiveDuration AutoArchiveDuration { get; private set; } /// - public bool Locked { get; private set; } + public bool IsLocked { get; private set; } /// /// Gets a collection of cached users within this thread. @@ -106,10 +106,10 @@ internal override void Update(ClientState state, Model model) if (model.ThreadMetadata.IsSpecified) { - Archived = model.ThreadMetadata.Value.Archived; + IsArchived = model.ThreadMetadata.Value.Archived; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; - Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } if (model.OwnerId.IsSpecified) @@ -117,7 +117,7 @@ internal override void Update(ClientState state, Model model) Owner = GetUser(model.OwnerId.Value); } - Joined = model.ThreadMember.IsSpecified; + HasJoined = model.ThreadMember.IsSpecified; } internal IReadOnlyCollection RemoveUsers(ulong[] users) From 18856a3d8f33d318f2abbf04edd66e89a8b78966 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:33:09 -0300 Subject: [PATCH 352/494] Rename Live and DiscoverableDisabled to IsDiscoverableDisabled and IsLive in IStageChannel --- .../Entities/Channels/IStageChannel.cs | 4 ++-- .../Entities/Channels/RestStageChannel.cs | 10 +++++----- .../Entities/Channels/SocketStageChannel.cs | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index 9e417a4f12..ff84262f0e 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -30,7 +30,7 @@ public interface IStageChannel : IVoiceChannel /// /// if stage discovery is disabled, otherwise . /// - bool? DiscoverableDisabled { get; } + bool? IsDiscoverableDisabled { get; } /// /// when the stage is live, otherwise . @@ -38,7 +38,7 @@ public interface IStageChannel : IVoiceChannel /// /// If the stage isn't live then this property will be set to . /// - bool Live { get; } + bool IsLive { get; } /// /// Starts the stage, creating a stage instance. diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs index 41877befce..721e2d7809 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -20,10 +20,10 @@ public class RestStageChannel : RestVoiceChannel, IStageChannel public StagePrivacyLevel? PrivacyLevel { get; private set; } /// - public bool? DiscoverableDisabled { get; private set; } + public bool? IsDiscoverableDisabled { get; private set; } /// - public bool Live { get; private set; } + public bool IsLive { get; private set; } internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) : base(discord, guild, id) { @@ -39,18 +39,18 @@ internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) internal void Update(StageInstance model, bool isLive = false) { - Live = isLive; + IsLive = isLive; if(isLive) { Topic = model.Topic; PrivacyLevel = model.PrivacyLevel; - DiscoverableDisabled = model.DiscoverableDisabled; + IsDiscoverableDisabled = model.DiscoverableDisabled; } else { Topic = null; PrivacyLevel = null; - DiscoverableDisabled = null; + IsDiscoverableDisabled = null; } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index 1956a9b86f..722589b502 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -22,10 +22,10 @@ public class SocketStageChannel : SocketVoiceChannel, IStageChannel public StagePrivacyLevel? PrivacyLevel { get; private set; } /// - public bool? DiscoverableDisabled { get; private set; } + public bool? IsDiscoverableDisabled { get; private set; } /// - public bool Live { get; private set; } = false; + public bool IsLive { get; private set; } = false; /// /// Returns if the current user is a speaker within the stage, otherwise . @@ -62,18 +62,18 @@ internal override void Update(ClientState state, Model model) internal void Update(StageInstance model, bool isLive = false) { - Live = isLive; + IsLive = isLive; if (isLive) { Topic = model.Topic; PrivacyLevel = model.PrivacyLevel; - DiscoverableDisabled = model.DiscoverableDisabled; + IsDiscoverableDisabled = model.DiscoverableDisabled; } else { Topic = null; PrivacyLevel = null; - DiscoverableDisabled = null; + IsDiscoverableDisabled = null; } } From 08af731509c6353ba12901c144201780378e5037 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:33:28 -0300 Subject: [PATCH 353/494] Remove newline --- .../Entities/Channels/SocketStageChannel.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index 722589b502..890f58ed6c 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -41,7 +41,6 @@ public IReadOnlyCollection Speakers internal new SocketStageChannel Clone() => MemberwiseClone() as SocketStageChannel; - internal SocketStageChannel(DiscordSocketClient discord, ulong id, SocketGuild guild) : base(discord, id, guild) { From 4e75dfbc21b242adaae8f0fdcd69b4d67e43bbc3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:34:26 -0300 Subject: [PATCH 354/494] Add indent to summaries --- .../Entities/Channels/SocketGroupChannel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index 2fd748faa6..129d7efae8 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -34,12 +34,12 @@ public class SocketGroupChannel : SocketChannel, IGroupChannel, ISocketPrivateCh public IReadOnlyCollection CachedMessages => _messages?.Messages ?? ImmutableArray.Create(); /// - /// Returns a collection representing all of the users in the group. + /// Returns a collection representing all of the users in the group. /// public new IReadOnlyCollection Users => _users.ToReadOnlyCollection(); /// - /// Returns a collection representing all users in the group, not including the client. + /// Returns a collection representing all users in the group, not including the client. /// public IReadOnlyCollection Recipients => _users.Select(x => x.Value).Where(x => x.Id != Discord.CurrentUser.Id).ToReadOnlyCollection(() => _users.Count - 1); From 97348298d4dac60c65f594241f13eb9aa2d5407b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:38:46 -0300 Subject: [PATCH 355/494] Remove unnecessary json serializer field --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 461981e28c..f986aecde6 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -55,7 +55,7 @@ public DiscordRestApiClient(RestClientProvider restClientProvider, string userAg _restClientProvider = restClientProvider; UserAgent = userAgent; DefaultRetryMode = defaultRetryMode; - _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver(), NullValueHandling = NullValueHandling.Include }; + _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver() }; UseSystemClock = useSystemClock; RequestQueue = new RequestQueue(); From 67a87255aeae3097a74f1f349eacf2e99f6708c2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:47:17 -0300 Subject: [PATCH 356/494] Fix ToEntity for roletags incorrectly using IsPremiumSubscriber --- src/Discord.Net.Rest/Extensions/EntityExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs index ca36bc6d64..61fe330df2 100644 --- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs @@ -39,7 +39,7 @@ public static RoleTags ToEntity(this API.RoleTags model) return new RoleTags( model.BotId.IsSpecified ? model.BotId.Value : null, model.IntegrationId.IsSpecified ? model.IntegrationId.Value : null, - model.IsPremiumSubscriber.IsSpecified); + model.IsPremiumSubscriber.GetValueOrDefault(false) ?? false); } public static API.Embed ToModel(this Embed entity) { From 622d3523eaa8edd01403ac3341a5d3e83a6a9aa7 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:55:49 -0300 Subject: [PATCH 357/494] Update RestChannel for new channel types --- src/Discord.Net.Rest/Entities/Channels/RestChannel.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs index ea79881554..00b99a1cb6 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs @@ -24,7 +24,14 @@ internal static RestChannel Create(BaseDiscordClient discord, Model model) { return model.Type switch { - ChannelType.News or ChannelType.Text or ChannelType.Voice => RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), + ChannelType.News or + ChannelType.Text or + ChannelType.Voice or + ChannelType.Stage or + ChannelType.NewsThread or + ChannelType.PrivateThread or + ChannelType.PublicThread + => RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), ChannelType.DM or ChannelType.Group => CreatePrivate(discord, model) as RestChannel, ChannelType.Category => RestCategoryChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), _ => new RestChannel(discord, model.Id), From 19d1c41056c3b37845ec0bc71ed37d24992367e9 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 00:56:41 -0300 Subject: [PATCH 358/494] Fix different rest channels not deserializing properly --- src/Discord.Net.Rest/Entities/Channels/RestChannel.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs index ea79881554..00b99a1cb6 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs @@ -24,7 +24,14 @@ internal static RestChannel Create(BaseDiscordClient discord, Model model) { return model.Type switch { - ChannelType.News or ChannelType.Text or ChannelType.Voice => RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), + ChannelType.News or + ChannelType.Text or + ChannelType.Voice or + ChannelType.Stage or + ChannelType.NewsThread or + ChannelType.PrivateThread or + ChannelType.PublicThread + => RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), ChannelType.DM or ChannelType.Group => CreatePrivate(discord, model) as RestChannel, ChannelType.Category => RestCategoryChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), _ => new RestChannel(discord, model.Id), From 6aa1014095e6fce041d3c6e0e4f43fee710e5dd1 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:00:03 -0300 Subject: [PATCH 359/494] fully qualify internal for UrlValidation and add indent to summary --- src/Discord.Net.Core/Utils/UrlValidation.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs index f5d7d4ce76..23234b8996 100644 --- a/src/Discord.Net.Core/Utils/UrlValidation.cs +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -2,10 +2,10 @@ namespace Discord.Utils { - static class UrlValidation + internal static class UrlValidation { /// - /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https + /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https /// /// url to validate before sending to Discord. /// A URL must include a protocol (http or https). From c44d7405c03833fecc087cd423c562b64411223f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:11:11 -0300 Subject: [PATCH 360/494] Add missing periods to InteractionResponseType --- .../Entities/Interactions/InteractionResponseType.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index de30ad8688..43e614b57b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -45,17 +45,17 @@ public enum InteractionResponseType : byte DeferredChannelMessageWithSource = 5, /// - /// For components: ACK an interaction and edit the original message later; the user does not see a loading state + /// For components: ACK an interaction and edit the original message later; the user does not see a loading state. /// DeferredUpdateMessage = 6, /// - /// For components: edit the message the component was attached to + /// For components: edit the message the component was attached to. /// UpdateMessage = 7, /// - /// Respond with a set of choices to a autocomplete interaction + /// Respond with a set of choices to a autocomplete interaction. /// ApplicationCommandAutocompleteResult = 8 } From e8edd2a45087b53e301d3e702693cb64c674cf76 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:13:08 -0300 Subject: [PATCH 361/494] Fix summary in IApplicationCommandOptionChoice --- .../Entities/Interactions/IApplicationCommandOptionChoice.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs index 1f05406561..24fae04c29 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs @@ -12,12 +12,12 @@ namespace Discord public interface IApplicationCommandOptionChoice { /// - /// 1-100 character choice name. + /// Gets the name of this choice. /// string Name { get; } /// - /// value of the choice. + /// Gets the value of the choice. /// object Value { get; } From e4842b839814dd06a2a939062ae9c1374ee7fbf7 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:14:39 -0300 Subject: [PATCH 362/494] Update IApplicationCommandOption summaries --- .../Interactions/IApplicationCommandOption.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 5c2443c1b8..457c046139 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -12,37 +12,37 @@ namespace Discord public interface IApplicationCommandOption { /// - /// The type of this . + /// Gets the type of this . /// ApplicationCommandOptionType Type { get; } /// - /// The name of this command option, 1-32 character name. + /// Gets the name of this command option, 1-32 character name. /// string Name { get; } /// - /// The discription of this command option, 1-100 character description. + /// Gets the discription of this command option, 1-100 character description. /// string Description { get; } /// - /// The first required option for the user to complete--only one option can be default. + /// Gets the first required option for the user to complete--only one option can be default. /// bool? IsDefault { get; } /// - /// If the parameter is required or optional, default is . + /// Gets if the parameter is required or optional, default is . /// bool? IsRequired { get; } /// - /// Choices for string and int types for the user to pick from. + /// Gets a collection of choices for the user to pick from. /// IReadOnlyCollection? Choices { get; } /// - /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// Gets the nested options of this option. /// IReadOnlyCollection? Options { get; } } From 2e9e7bf6d930ac299f1fd544f69af8532fd4f0ad Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:15:37 -0300 Subject: [PATCH 363/494] Update IApplicationCommandInteractionDataOption summaries --- .../IApplicationCommandInteractionDataOption.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index 999309979f..f801ce76cc 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -12,12 +12,12 @@ namespace Discord public interface IApplicationCommandInteractionDataOption { /// - /// The name of the parameter. + /// Gets the name of the parameter. /// string Name { get; } /// - /// The value of the pair. + /// Gets the value of the pair. /// /// This objects type can be any one of the option types in /// @@ -25,12 +25,12 @@ public interface IApplicationCommandInteractionDataOption object Value { get; } /// - /// The type of this data's option. + /// Gets the type of this data's option. /// ApplicationCommandOptionType Type { get; } /// - /// Present if this option is a group or subcommand. + /// Gets the nested options of this option. /// IReadOnlyCollection Options { get; } From 8178188bc314cba761ca09c62225c7cf9be5fb9e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:16:21 -0300 Subject: [PATCH 364/494] Update IApplicationCommandInteractionData summaries --- .../Interactions/IApplicationCommandInteractionData.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs index ec452180aa..3d1a0349a6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs @@ -12,17 +12,17 @@ namespace Discord public interface IApplicationCommandInteractionData { /// - /// The snowflake id of this command. + /// Gets the snowflake id of this command. /// ulong Id { get; } /// - /// The name of this command. + /// Gets the name of this command. /// string Name { get; } /// - /// The params + values from the user. + /// Gets the options that the user has provided. /// IReadOnlyCollection Options { get; } } From 7255fd5bfec23239ee2adefd882eedd906ab76bf Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:17:36 -0300 Subject: [PATCH 365/494] Update IApplicationCommand summaries --- .../Entities/Interactions/IApplicationCommand.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index 3fe53b72c1..dd192958d6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -17,27 +17,27 @@ public interface IApplicationCommand : ISnowflakeEntity, IDeletable ulong ApplicationId { get; } /// - /// The type of the command + /// Gets the type of the command /// ApplicationCommandType Type { get; } /// - /// The name of the command. + /// Gets the name of the command. /// string Name { get; } /// - /// The description of the command. + /// Gets the description of the command. /// string Description { get; } /// - /// Whether the command is enabled by default when the app is added to a guild. + /// Gets whether or not the command is enabled by default when the app is added to a guild. /// bool IsDefaultPermission { get; } /// - /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. + /// Gets the options for this application command. /// IReadOnlyCollection Options { get; } From 35fe57bbfa278720ac55e4455c3adfa4adff294f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:18:42 -0300 Subject: [PATCH 366/494] Update ApplicationCommandType summaries --- .../Entities/Interactions/ApplicationCommandTypes.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs index 3cfa97a5a1..57ba37e188 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs @@ -7,22 +7,22 @@ namespace Discord { /// - /// ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message + /// Represents the types of application commands. /// public enum ApplicationCommandType : byte { /// - /// ApplicationCommandType.Slash is Slash command type + /// A Slash command type /// Slash = 1, /// - /// ApplicationCommandType.User is Context Menu User command type + /// A Context Menu User command type /// User = 2, /// - /// ApplicationCommandType.Message is Context Menu Message command type + /// A Context Menu Message command type /// Message = 3 } From 68126f2c1abe9aac8e080e709915abdd6b05eeef Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:20:42 -0300 Subject: [PATCH 367/494] rename DefaultPermission to IsDefaultPermission in ApplicationCommandProperties --- .../ApplicationCommandProperties.cs | 4 ++-- .../Context Menus/MessageCommandBuilder.cs | 2 +- .../Context Menus/UserCommandBuilder.cs | 2 +- .../Slash Commands/SlashCommandBuilder.cs | 2 +- .../Interactions/InteractionHelper.cs | 24 +++++++++---------- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 55c91bc64e..bde3fcc914 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -19,9 +19,9 @@ public abstract class ApplicationCommandProperties public Optional Name { get; set; } /// - /// Whether the command is enabled by default when the app is added to a guild. Default is + /// Gets or sets whether the command is enabled by default when the app is added to a guild. Default is /// - public Optional DefaultPermission { get; set; } + public Optional IsDefaultPermission { get; set; } internal ApplicationCommandProperties() { } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index 495301d006..30f9a500a0 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -54,7 +54,7 @@ public MessageCommandProperties Build() MessageCommandProperties props = new MessageCommandProperties() { Name = Name, - DefaultPermission = DefaultPermission + IsDefaultPermission = DefaultPermission }; return props; diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index 0758437563..5c647e8687 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -52,7 +52,7 @@ public UserCommandProperties Build() UserCommandProperties props = new UserCommandProperties() { Name = Name, - DefaultPermission = DefaultPermission + IsDefaultPermission = DefaultPermission }; return props; diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 4abf84eb3d..ef25440ad1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -102,7 +102,7 @@ public SlashCommandProperties Build() { Name = Name, Description = Description, - DefaultPermission = DefaultPermission, + IsDefaultPermission = DefaultPermission, }; if (Options != null && Options.Any()) diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 8f9163692c..6ec6819dea 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -70,8 +70,8 @@ public static async Task CreateGlobalCommand(BaseDiscordClie { Name = arg.Name.Value, Type = arg.Type, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value + DefaultPermission = arg.IsDefaultPermission.IsSpecified + ? arg.IsDefaultPermission.Value : Optional.Unspecified }; @@ -104,8 +104,8 @@ public static async Task BulkOverwriteGlobalCommands(BaseD { Name = arg.Name.Value, Type = arg.Type, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value + DefaultPermission = arg.IsDefaultPermission.IsSpecified + ? arg.IsDefaultPermission.Value : Optional.Unspecified }; @@ -141,8 +141,8 @@ public static async Task> BulkOverwriteG { Name = arg.Name.Value, Type = arg.Type, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value + DefaultPermission = arg.IsDefaultPermission.IsSpecified + ? arg.IsDefaultPermission.Value : Optional.Unspecified }; @@ -201,8 +201,8 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie var model = new Discord.API.Rest.ModifyApplicationCommandParams() { Name = args.Name, - DefaultPermission = args.DefaultPermission.IsSpecified - ? args.DefaultPermission.Value + DefaultPermission = args.IsDefaultPermission.IsSpecified + ? args.IsDefaultPermission.Value : Optional.Unspecified }; @@ -256,8 +256,8 @@ public static async Task CreateGuildCommand(BaseDiscordClien { Name = arg.Name.Value, Type = arg.Type, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value + DefaultPermission = arg.IsDefaultPermission.IsSpecified + ? arg.IsDefaultPermission.Value : Optional.Unspecified }; @@ -289,8 +289,8 @@ public static async Task ModifyGuildCommand(BaseDiscordClien var model = new ModifyApplicationCommandParams() { Name = arg.Name, - DefaultPermission = arg.DefaultPermission.IsSpecified - ? arg.DefaultPermission.Value + DefaultPermission = arg.IsDefaultPermission.IsSpecified + ? arg.IsDefaultPermission.Value : Optional.Unspecified }; From d3740423211bb34b68a592907b68a15f89f0a2c9 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:22:06 -0300 Subject: [PATCH 368/494] update ApplicationCommandOptionChoiceProperties summaries --- .../Entities/Interactions/ApplicationCommandOptionChoice.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs index 4a1339dc25..63b6f6df84 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -14,7 +14,7 @@ public class ApplicationCommandOptionChoiceProperties private string _name; private object _value; /// - /// The name of this choice. + /// Gets or sets the name of this choice. /// public string Name { @@ -30,7 +30,7 @@ public string Name } /// - /// The value of this choice. + /// Gets or sets the value of this choice. /// /// Discord only accepts int and string as the input. /// From ebc367446ca28fd6e5faef2357ed3e94e4d263db Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:23:43 -0300 Subject: [PATCH 369/494] Rename Default, Required, and Autocomplete to IsDefault, IsRequired, and IsAutocomplete in ApplicationCommandOptionProperties --- .../Entities/Interactions/ApplicationCommandOption.cs | 6 +++--- .../Interactions/Slash Commands/SlashCommandBuilder.cs | 6 +++--- .../API/Common/ApplicationCommandOption.cs | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index cca832874e..63ec3b9005 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -60,17 +60,17 @@ public string Description /// /// Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. /// - public bool? Default { get; set; } + public bool? IsDefault { get; set; } /// /// Gets or sets if the option is required. /// - public bool? Required { get; set; } + public bool? IsRequired { get; set; } /// /// Gets or sets whether or not this option supports autocomplete. /// - public bool Autocomplete { get; set; } + public bool IsAutocomplete { get; set; } /// /// Gets or sets the choices for string and int types for the user to pick from. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index ef25440ad1..d98fa3091b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -377,12 +377,12 @@ public ApplicationCommandOptionProperties Build() { Name = Name, Description = Description, - Default = Default, - Required = Required, + IsDefault = Default, + IsRequired = Required, Type = Type, Options = Options?.Count > 0 ? new List(Options.Select(x => x.Build())) : null, Choices = Choices, - Autocomplete = Autocomplete + IsAutocomplete = Autocomplete }; } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 4bf172ebbe..c7b304c66f 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -70,18 +70,18 @@ public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties optio ? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray() : Optional.Unspecified; - Required = option.Required.HasValue - ? option.Required.Value + Required = option.IsRequired.HasValue + ? option.IsRequired.Value : Optional.Unspecified; - Default = option.Default.HasValue - ? option.Default.Value + Default = option.IsDefault.HasValue + ? option.IsDefault.Value : Optional.Unspecified; Name = option.Name; Type = option.Type; Description = option.Description; - Autocomplete = option.Autocomplete; + Autocomplete = option.IsAutocomplete; } } } From 7a3da6bbffef5525cc84b57c9952b6d27e813092 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:24:39 -0300 Subject: [PATCH 370/494] Update SlashCommandProperties summaries --- .../Interactions/Slash Commands/SlashCommandProperties.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs index e9b7222d4a..9405b18813 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs @@ -7,13 +7,14 @@ namespace Discord { /// - /// A class used to create slash commands. + /// Represents a class used to create slash commands. /// public class SlashCommandProperties : ApplicationCommandProperties { internal override ApplicationCommandType Type => ApplicationCommandType.Slash; + /// - /// The discription of this command. + /// Gets or sets the discription of this command. /// public Optional Description { get; set; } From 5ae3f09fa2112668516903c6819dc3fde19ae48b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:33:24 -0300 Subject: [PATCH 371/494] update SlashCommandBuilder boolean field names, summaries, and choice parameters --- .../ApplicationCommandOptionChoice.cs | 5 - .../Slash Commands/SlashCommandBuilder.cs | 141 +++++++++--------- 2 files changed, 70 insertions(+), 76 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs index 63b6f6df84..f7979f20dc 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -40,11 +40,6 @@ public object Value get => _value; set { - if(value != null) - { - if(!(value is int) && !(value is string)) - throw new ArgumentException("The value of a choice must be a string or int!"); - } _value = value; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index d98fa3091b..7c337892f6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -8,7 +8,7 @@ namespace Discord { /// - /// A class used to build slash commands. + /// Represents a class used to build slash commands. /// public class SlashCommandBuilder { @@ -26,7 +26,7 @@ public class SlashCommandBuilder public const int MaxOptionsCount = 25; /// - /// The name of this slash command. + /// Gets or sets the name of this slash command. /// public string Name { @@ -50,7 +50,7 @@ public string Name } /// - /// A 1-100 length description of this slash command + /// Gets or sets a 1-100 length description of this slash command /// public string Description { @@ -84,9 +84,9 @@ public List Options } /// - /// Whether the command is enabled by default when the app is added to a guild + /// Gets or sets whether the command is enabled by default when the app is added to a guild /// - public bool DefaultPermission { get; set; } = true; + public bool IsDefaultPermission { get; set; } = true; private string _name { get; set; } private string _description { get; set; } @@ -95,14 +95,14 @@ public List Options /// /// Build the current builder into a class. /// - /// A that can be used to create slash commands over rest. + /// A that can be used to create slash commands. public SlashCommandProperties Build() { SlashCommandProperties props = new SlashCommandProperties() { Name = Name, Description = Description, - IsDefaultPermission = DefaultPermission, + IsDefaultPermission = IsDefaultPermission, }; if (Options != null && Options.Any()) @@ -115,7 +115,6 @@ public SlashCommandProperties Build() } return props; - } /// @@ -149,7 +148,7 @@ public SlashCommandBuilder WithDescription(string description) /// The current builder. public SlashCommandBuilder WithDefaultPermission(bool value) { - DefaultPermission = value; + IsDefaultPermission = value; return this; } @@ -159,14 +158,14 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// The name of the option to add. /// The type of this option. /// The description of this option. - /// If this option is required for this command. + /// If this option is required for this command. /// If this option is the default option. /// If this option is set to autocompleate. /// The options of the option to add. /// The choices of this option. /// The current builder. public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? required = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? isRequired = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -187,7 +186,7 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t if (isDefault.HasValue && isDefault.Value) { if (Options != null) - if (Options.Any(x => x.Default.HasValue && x.Default.Value)) + if (Options.Any(x => x.IsDefault.HasValue && x.IsDefault.Value)) throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); } @@ -195,41 +194,17 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t { Name = name, Description = description, - Required = required, - Default = isDefault, + IsRequired = isRequired, + IsDefault = isDefault, Options = options, Type = type, - Autocomplete = isAutocomplete, + IsAutocomplete = isAutocomplete, Choices = choices != null ? new List(choices) : null }; return AddOption(option); } - ///// - ///// Adds an option to the current slash command. - ///// - ///// The name of the option to add. - ///// The type of this option. - ///// The description of this option. - ///// If this option is required for this command. - ///// If this option is the default option. - ///// The choices of this option. - ///// The current builder. - //public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - // string description, bool required = true, bool isDefault = false, params ApplicationCommandOptionChoiceProperties[] choices) - // => AddOption(name, type, description, required, isDefault, null, choices); - - /// - /// Adds an option to the current slash command. - /// - /// The name of the option to add. - /// The type of this option. - /// The sescription of this option. - /// The current builder. - public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, string description) - => AddOption(name, type, description, options: null, choices: null); - /// /// Adds an option to this slash command. /// @@ -337,17 +312,17 @@ public string Description /// /// Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. /// - public bool? Default { get; set; } + public bool? IsDefault { get; set; } /// /// Gets or sets if the option is required. /// - public bool? Required { get; set; } = null; + public bool? IsRequired { get; set; } = null; /// /// Gets or sets whether or not this option supports autocomplete. /// - public bool Autocomplete { get; set; } + public bool IsAutocomplete { get; set; } /// /// Gets or sets the choices for string and int types for the user to pick from. @@ -377,12 +352,12 @@ public ApplicationCommandOptionProperties Build() { Name = Name, Description = Description, - IsDefault = Default, - IsRequired = Required, + IsDefault = IsDefault, + IsRequired = IsRequired, Type = Type, Options = Options?.Count > 0 ? new List(Options.Select(x => x.Build())) : null, Choices = Choices, - IsAutocomplete = Autocomplete + IsAutocomplete = IsAutocomplete }; } @@ -392,13 +367,13 @@ public ApplicationCommandOptionProperties Build() /// The name of the option to add. /// The type of this option. /// The description of this option. - /// If this option is required for this command. + /// If this option is required for this command. /// If this option is the default option. /// The options of the option to add. /// The choices of this option. /// The current builder. public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? required = null, bool isDefault = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? isRequired = null, bool isDefault = false, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -419,7 +394,7 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption if (isDefault) { if (Options != null) - if (Options.Any(x => x.Default.HasValue && x.Default.Value)) + if (Options.Any(x => x.IsDefault.HasValue && x.IsDefault.Value)) throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); } @@ -427,8 +402,9 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption { Name = name, Description = description, - Required = required, - Default = isDefault, + IsRequired = isRequired, + IsAutocomplete = isAutocomplete, + IsDefault = isDefault, Options = options, Type = type, Choices = choices != null ? new List(choices) : null @@ -464,25 +440,40 @@ public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) /// The current builder. public SlashCommandOptionBuilder AddChoice(string name, int value) { - if (Choices == null) - Choices = new List(); - - if (Choices.Count >= MaxChoiceCount) - throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); - - if (name == null) - throw new ArgumentNullException($"{nameof(name)} cannot be null!"); + return AddChoiceInternal(name, value); + } - Preconditions.AtLeast(name.Length, 1, nameof(name)); - Preconditions.AtMost(name.Length, 100, nameof(name)); + /// + /// Adds a choice to the current option. + /// + /// The name of the choice. + /// The value of the choice. + /// The current builder. + public SlashCommandOptionBuilder AddChoice(string name, string value) + { + return AddChoiceInternal(name, value); + } - Choices.Add(new ApplicationCommandOptionChoiceProperties() - { - Name = name, - Value = value - }); + /// + /// Adds a choice to the current option. + /// + /// The name of the choice. + /// The value of the choice. + /// The current builder. + public SlashCommandOptionBuilder AddChoice(string name, double value) + { + return AddChoiceInternal(name, value); + } - return this; + /// + /// Adds a choice to the current option. + /// + /// The name of the choice. + /// The value of the choice. + /// The current builder. + public SlashCommandOptionBuilder AddChoice(string name, float value) + { + return AddChoiceInternal(name, value); } /// @@ -491,7 +482,12 @@ public SlashCommandOptionBuilder AddChoice(string name, int value) /// The name of the choice. /// The value of the choice. /// The current builder. - public SlashCommandOptionBuilder AddChoice(string name, string value) + public SlashCommandOptionBuilder AddChoice(string name, long value) + { + return AddChoiceInternal(name, value); + } + + private SlashCommandOptionBuilder AddChoiceInternal(string name, object value) { if (Choices == null) Choices = new List(); @@ -508,8 +504,11 @@ public SlashCommandOptionBuilder AddChoice(string name, string value) Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, 100, nameof(name)); - Preconditions.AtLeast(value.Length, 1, nameof(value)); - Preconditions.AtMost(value.Length, 100, nameof(value)); + if(value is string str) + { + Preconditions.AtLeast(str.Length, 1, nameof(value)); + Preconditions.AtMost(str.Length, 100, nameof(value)); + } Choices.Add(new ApplicationCommandOptionChoiceProperties() { @@ -550,7 +549,7 @@ public SlashCommandOptionBuilder WithDescription(string description) /// The current builder. public SlashCommandOptionBuilder WithRequired(bool value) { - Required = value; + IsRequired = value; return this; } @@ -561,7 +560,7 @@ public SlashCommandOptionBuilder WithRequired(bool value) /// The current builder. public SlashCommandOptionBuilder WithDefault(bool value) { - Default = value; + IsDefault = value; return this; } From 6cd473014783639395111ae159447b8bf833a546 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:36:07 -0300 Subject: [PATCH 372/494] Update SelectMenuOption summaries, Rename Default to IsDefault in SelectMenuOption --- .../Message Components/ComponentBuilder.cs | 6 +++--- .../Message Components/SelectMenuComponent.cs | 2 +- .../Message Components/SelectMenuOption.cs | 14 +++++++------- .../API/Common/SelectMenuOption.cs | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index b0050ee366..c12b9ffa3f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -76,7 +76,7 @@ internal void AddComponent(IMessageComponent component, int row) AddComponent(cmp, row); break; case SelectMenuComponent menu: - WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); + WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); break; } } @@ -742,7 +742,7 @@ public SelectMenuBuilder(SelectMenuComponent selectMenu) MinValues = selectMenu.MinValues; Disabled = selectMenu.Disabled; Options = selectMenu.Options? - .Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)) + .Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)) .ToList(); } @@ -1028,7 +1028,7 @@ public SelectMenuOptionBuilder(SelectMenuOption option) Value = option.Value; Description = option.Description; Emote = option.Emote; - Default = option.Default; + Default = option.IsDefault; } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs index 4fa3e43934..a7f1eec390 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs @@ -53,7 +53,7 @@ public class SelectMenuComponent : IMessageComponent public SelectMenuBuilder ToBuilder() => new SelectMenuBuilder( CustomId, - Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), + Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)).ToList(), Placeholder, MaxValues, MinValues, diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs index 624b652be1..3c7fce181b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs @@ -12,29 +12,29 @@ namespace Discord public class SelectMenuOption { /// - /// The user-facing name of the option, max 25 characters. + /// Gets the user-facing name of the option. /// public string Label { get; } /// - /// The dev-define value of the option, max 100 characters. + /// Gets the dev-define value of the option. /// public string Value { get; } /// - /// An additional description of the option, max 50 characters. + /// Gets a description of the option. /// public string Description { get; } /// - /// A that will be displayed with this menu option. + /// Gets the displayed with this menu option. /// public IEmote Emote { get; } /// - /// Will render this option as selected by default. + /// Gets whether or not this option will render as selected by default. /// - public bool? Default { get; } + public bool? IsDefault { get; } internal SelectMenuOption(string label, string value, string description, IEmote emote, bool? defaultValue) { @@ -42,7 +42,7 @@ internal SelectMenuOption(string label, string value, string description, IEmote Value = value; Description = description; Emote = emote; - Default = defaultValue; + IsDefault = defaultValue; } } } diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs index cb0e63035a..06c8f7dc3b 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs @@ -52,7 +52,7 @@ public SelectMenuOption(Discord.SelectMenuOption option) } } - Default = option.Default.HasValue ? option.Default.Value : Optional.Unspecified; + Default = option.IsDefault.HasValue ? option.IsDefault.Value : Optional.Unspecified; } } } From 46c8365a4410ba633e20ca1508cf69b7794bbafc Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:37:44 -0300 Subject: [PATCH 373/494] update SelectMenuComponent summaries. Rename Disabled to IsDisabled in SelectMenuComponent --- .../Message Components/ComponentBuilder.cs | 4 ++-- .../Message Components/MessageComponent.cs | 2 +- .../Message Components/SelectMenuComponent.cs | 18 +++++++++--------- .../API/Common/SelectMenuComponent.cs | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index c12b9ffa3f..b7ef75f92b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -76,7 +76,7 @@ internal void AddComponent(IMessageComponent component, int row) AddComponent(cmp, row); break; case SelectMenuComponent menu: - WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); + WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.IsDisabled, row); break; } } @@ -740,7 +740,7 @@ public SelectMenuBuilder(SelectMenuComponent selectMenu) CustomId = selectMenu.Placeholder; MaxValues = selectMenu.MaxValues; MinValues = selectMenu.MinValues; - Disabled = selectMenu.Disabled; + Disabled = selectMenu.IsDisabled; Options = selectMenu.Options? .Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)) .ToList(); diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs index c1c8b2817e..eb37a57b86 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -12,7 +12,7 @@ namespace Discord public class MessageComponent { /// - /// The components to be used in a message. + /// Gets the components to be used in a message. /// public IReadOnlyCollection Components { get; } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs index a7f1eec390..db79363656 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs @@ -15,34 +15,34 @@ public class SelectMenuComponent : IMessageComponent public ComponentType Type => ComponentType.SelectMenu; /// - /// The custom id of this Select menu that will be sent with a . + /// Gets the custom id of this Select menu that will be sent with a . /// public string CustomId { get; } /// - /// The menus options to select from. + /// Gets the menus options to select from. /// public IReadOnlyCollection Options { get; } /// - /// A custom placeholder text if nothing is selected, max 100 characters. + /// Gets the custom placeholder text if nothing is selected. /// public string Placeholder { get; } /// - /// The minimum number of items that must be chosen; default 1, min 0, max 25 + /// Gets the minimum number of items that must be chosen. /// public int MinValues { get; } /// - /// The maximum number of items that can be chosen; default 1, max 25 + /// Gets the maximum number of items that can be chosen. /// public int MaxValues { get; } /// - /// Whether this menu is disabled or not. + /// Gets whether this menu is disabled or not. /// - public bool Disabled { get; } + public bool IsDisabled { get; } /// /// Turns this select menu into a builder. @@ -57,7 +57,7 @@ public SelectMenuBuilder ToBuilder() Placeholder, MaxValues, MinValues, - Disabled); + IsDisabled); internal SelectMenuComponent(string customId, List options, string placeholder, int minValues, int maxValues, bool disabled) { @@ -66,7 +66,7 @@ internal SelectMenuComponent(string customId, List options, st Placeholder = placeholder; MinValues = minValues; MaxValues = maxValues; - Disabled = disabled; + IsDisabled = disabled; } } } diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs index 5476565dc8..16daa66ab6 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -40,7 +40,7 @@ public SelectMenuComponent(Discord.SelectMenuComponent component) Placeholder = component.Placeholder; MinValues = component.MinValues; MaxValues = component.MaxValues; - Disabled = component.Disabled; + Disabled = component.IsDisabled; } } } From 92da434d93d60959849d2b2e008ab55b764f9b80 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:41:45 -0300 Subject: [PATCH 374/494] update ComponentBuilder summaries and boolean fields. --- .../Message Components/ComponentBuilder.cs | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index b7ef75f92b..1fde8c7d76 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -76,7 +76,7 @@ internal void AddComponent(IMessageComponent component, int row) AddComponent(cmp, row); break; case SelectMenuComponent menu: - WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.IsDisabled, row); + WithSelectMenu(menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.IsDisabled, row); break; } } @@ -85,7 +85,6 @@ internal void AddComponent(IMessageComponent component, int row) /// Adds a to the at the specific row. /// If the row cannot accept the component then it will add it to a row that can. /// - /// The label of the menu. /// The custom id of the menu. /// The options of the menu. /// The placeholder of the menu. @@ -94,7 +93,7 @@ internal void AddComponent(IMessageComponent component, int row) /// Whether or not the menu is disabled. /// The row to add the menu to. /// - public ComponentBuilder WithSelectMenu(string label, string customId, List options, + public ComponentBuilder WithSelectMenu(string customId, List options, string placeholder = null, int minValues = 1, int maxValues = 1, bool disabled = false, int row = 0) { return WithSelectMenu(new SelectMenuBuilder() @@ -413,7 +412,7 @@ public string CustomId /// /// Gets or sets whether the current button is disabled. /// - public bool Disabled { get; set; } + public bool IsDisabled { get; set; } private string _label; @@ -432,14 +431,14 @@ public ButtonBuilder() { } /// The custom ID of this button. /// The custom ID of this button. /// The emote of this button. - /// Disabled this button or not. - public ButtonBuilder(string label = null, string customId = null, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool disabled = false) + /// Disabled this button or not. + public ButtonBuilder(string label = null, string customId = null, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool isDisabled = false) { CustomId = customId; Style = style; Url = url; Label = label; - Disabled = disabled; + IsDisabled = isDisabled; Emote = emote; } @@ -452,7 +451,7 @@ public ButtonBuilder(ButtonComponent button) Style = button.Style; Url = button.Url; Label = button.Label; - Disabled = button.Disabled; + IsDisabled = button.Disabled; Emote = button.Emote; } @@ -566,11 +565,11 @@ public ButtonBuilder WithCustomId(string id) /// /// Sets whether the current button is disabled. /// - /// Whether the current button is disabled or not. + /// Whether the current button is disabled or not. /// The current builder. - public ButtonBuilder WithDisabled(bool disabled) + public ButtonBuilder WithDisabled(bool isDisabled) { - Disabled = disabled; + IsDisabled = isDisabled; return this; } @@ -601,7 +600,7 @@ public ButtonComponent Build() else if (string.IsNullOrEmpty(CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); - return new ButtonComponent(Style, Label, Emote, CustomId, Url, Disabled); + return new ButtonComponent(Style, Label, Emote, CustomId, Url, IsDisabled); } } @@ -718,7 +717,7 @@ public List Options /// /// Gets or sets whether the current menu is disabled. /// - public bool Disabled { get; set; } + public bool IsDisabled { get; set; } private List _options = new List(); private int _minValues = 1; @@ -740,7 +739,7 @@ public SelectMenuBuilder(SelectMenuComponent selectMenu) CustomId = selectMenu.Placeholder; MaxValues = selectMenu.MaxValues; MinValues = selectMenu.MinValues; - Disabled = selectMenu.IsDisabled; + IsDisabled = selectMenu.IsDisabled; Options = selectMenu.Options? .Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.IsDefault)) .ToList(); @@ -754,13 +753,13 @@ public SelectMenuBuilder(SelectMenuComponent selectMenu) /// The placeholder of this select menu. /// The max values of this select menu. /// The min values of this select menu. - /// Disabled this select menu or not. - public SelectMenuBuilder(string customId, List options, string placeholder = null, int maxValues = 1, int minValues = 1, bool disabled = false) + /// Disabled this select menu or not. + public SelectMenuBuilder(string customId, List options, string placeholder = null, int maxValues = 1, int minValues = 1, bool isDisabled = false) { CustomId = customId; Options = options; Placeholder = placeholder; - Disabled = disabled; + IsDisabled = isDisabled; MaxValues = maxValues; MinValues = minValues; } @@ -873,13 +872,13 @@ public SelectMenuBuilder AddOption(string label, string value, string descriptio /// /// Sets whether the current menu is disabled. /// - /// Whether the current menu is disabled or not. + /// Whether the current menu is disabled or not. /// /// The current builder. /// - public SelectMenuBuilder WithDisabled(bool disabled) + public SelectMenuBuilder WithDisabled(bool isDisabled) { - Disabled = disabled; + IsDisabled = isDisabled; return this; } @@ -891,7 +890,7 @@ public SelectMenuComponent Build() { var options = Options?.Select(x => x.Build()).ToList(); - return new SelectMenuComponent(CustomId, options, Placeholder, MinValues, MaxValues, Disabled); + return new SelectMenuComponent(CustomId, options, Placeholder, MinValues, MaxValues, IsDisabled); } } @@ -991,7 +990,7 @@ public string Description /// /// Gets or sets the whether or not this option will render selected by default. /// - public bool? Default { get; set; } + public bool? IsDefault { get; set; } private string _label; private string _value; @@ -1009,14 +1008,14 @@ public SelectMenuOptionBuilder() { } /// The value of this option. /// The description of this option. /// The emote of this option. - /// Render this option as selected by default or not. - public SelectMenuOptionBuilder(string label, string value, string description = null, IEmote emote = null, bool? @default = null) + /// Render this option as selected by default or not. + public SelectMenuOptionBuilder(string label, string value, string description = null, IEmote emote = null, bool? isDefault = null) { Label = label; Value = value; Description = description; Emote = emote; - Default = @default; + IsDefault = isDefault; } /// @@ -1028,7 +1027,7 @@ public SelectMenuOptionBuilder(SelectMenuOption option) Value = option.Value; Description = option.Description; Emote = option.Emote; - Default = option.IsDefault; + IsDefault = option.IsDefault; } /// @@ -1089,13 +1088,13 @@ public SelectMenuOptionBuilder WithEmote(IEmote emote) /// /// Sets the field default. /// - /// The value to set the field default to. + /// The value to set the field default to. /// /// The current builder. /// - public SelectMenuOptionBuilder WithDefault(bool defaultValue) + public SelectMenuOptionBuilder WithDefault(bool isDefault) { - Default = defaultValue; + IsDefault = isDefault; return this; } @@ -1105,7 +1104,7 @@ public SelectMenuOptionBuilder WithDefault(bool defaultValue) /// The newly built . public SelectMenuOption Build() { - return new SelectMenuOption(Label, Value, Description, Emote, Default); + return new SelectMenuOption(Label, Value, Description, Emote, IsDefault); } } } From 28f8ac85ad67a07bd2f1c6f7bceceea340dfcae6 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:43:43 -0300 Subject: [PATCH 375/494] Update ButtonComponent summaries and boolean fields --- .../Message Components/ButtonComponent.cs | 22 +++++++++---------- .../Message Components/ComponentBuilder.cs | 4 ++-- .../API/Common/ButtonComponent.cs | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index bad9f8aa38..64a2ab0e99 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -16,27 +16,25 @@ public class ButtonComponent : IMessageComponent public ComponentType Type { get; } = ComponentType.Button; /// - /// The of this button, example buttons with each style can be found Here. + /// Gets the of this button, example buttons with each style can be found Here. /// public ButtonStyle Style { get; } /// - /// The label of the button, this is the text that is shown. + /// Gets the label of the button, this is the text that is shown. /// public string Label { get; } /// - /// A that will be displayed with this button. + /// Gets the displayed with this button. /// public IEmote Emote { get; } - /// - /// A unique id that will be sent with a . This is how you know what button was pressed. - /// + /// public string CustomId { get; } /// - /// A URL for a button. + /// Gets the URL for a button. /// /// /// You cannot have a button with a URL and a CustomId. @@ -44,9 +42,9 @@ public class ButtonComponent : IMessageComponent public string Url { get; } /// - /// Whether this button is disabled or not. + /// Gets whether this button is disabled or not. /// - public bool Disabled { get; } + public bool IsDisabled { get; } /// /// Turns this button into a button builder. @@ -55,16 +53,16 @@ public class ButtonComponent : IMessageComponent /// A newly created button builder with the same properties as this button. /// public ButtonBuilder ToBuilder() - => new ButtonBuilder(Label, CustomId, Style, Url, Emote, Disabled); + => new ButtonBuilder(Label, CustomId, Style, Url, Emote, IsDisabled); - internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) + internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool isDisabled) { Style = style; Label = label; Emote = emote; CustomId = customId; Url = url; - Disabled = disabled; + IsDisabled = isDisabled; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 1fde8c7d76..91cce1597c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -69,7 +69,7 @@ internal void AddComponent(IMessageComponent component, int row) switch (component) { case ButtonComponent button: - WithButton(button.Label, button.CustomId, button.Style, button.Emote, button.Url, button.Disabled, row); + WithButton(button.Label, button.CustomId, button.Style, button.Emote, button.Url, button.IsDisabled, row); break; case ActionRowComponent actionRow: foreach (var cmp in actionRow.Components) @@ -451,7 +451,7 @@ public ButtonBuilder(ButtonComponent button) Style = button.Style; Url = button.Url; Label = button.Label; - IsDisabled = button.Disabled; + IsDisabled = button.IsDisabled; Emote = button.Emote; } diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index b941bf593a..8870400061 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -39,7 +39,7 @@ public ButtonComponent(Discord.ButtonComponent c) Label = c.Label; CustomId = c.CustomId; Url = c.Url; - Disabled = c.Disabled; + Disabled = c.IsDisabled; if (c.Emote != null) { From c1b076b693d0e10460df0cdf4599955077092d85 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:44:02 -0300 Subject: [PATCH 376/494] update ActionRowComponent summaries --- .../Interactions/Message Components/ActionRowComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index a9dd27beae..df08e5ee30 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -16,7 +16,7 @@ public class ActionRowComponent : IMessageComponent public ComponentType Type { get; } = ComponentType.ActionRow; /// - /// The child components in this row. + /// Gets the child components in this row. /// public IReadOnlyCollection Components { get; internal set; } From d818eddddc3e37467834cbf54f95ac915c2e8604 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:45:03 -0300 Subject: [PATCH 377/494] Update UserCommandBuilder --- .../Context Menus/UserCommandBuilder.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index 5c647e8687..34a9706ad6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -18,7 +18,7 @@ public class UserCommandBuilder public const int MaxNameLength = 32; /// - /// The name of this User command. + /// Gets or sets the name of this User command. /// public string Name { @@ -37,9 +37,9 @@ public string Name } /// - /// Whether the command is enabled by default when the app is added to a guild + /// Gets or sets whether the command is enabled by default when the app is added to a guild /// - public bool DefaultPermission { get; set; } = true; + public bool IsDefaultPermission { get; set; } = true; private string _name { get; set; } @@ -52,7 +52,7 @@ public UserCommandProperties Build() UserCommandProperties props = new UserCommandProperties() { Name = Name, - IsDefaultPermission = DefaultPermission + IsDefaultPermission = IsDefaultPermission }; return props; @@ -75,11 +75,11 @@ public UserCommandBuilder WithName(string name) /// /// Sets the default permission of the current command. /// - /// The default permission value to set. + /// The default permission value to set. /// The current builder. - public UserCommandBuilder WithDefaultPermission (bool value) + public UserCommandBuilder WithDefaultPermission (bool isDefaultPermission) { - DefaultPermission = value; + IsDefaultPermission = isDefaultPermission; return this; } } From a4c47318475a00223035ed17a12e03b4fbe2772f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:45:49 -0300 Subject: [PATCH 378/494] Update MessageCommandBuilder summaries and boolean properties --- .../Context Menus/MessageCommandBuilder.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index 30f9a500a0..e600beba7a 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -18,7 +18,7 @@ public class MessageCommandBuilder public const int MaxNameLength = 32; /// - /// The name of this Message command. + /// Gets or sets the name of this Message command. /// public string Name { @@ -37,9 +37,9 @@ public string Name } /// - /// Whether the command is enabled by default when the app is added to a guild + /// Gets or sets whether the command is enabled by default when the app is added to a guild /// - public bool DefaultPermission { get; set; } = true; + public bool IsDefaultPermission { get; set; } = true; private string _name { get; set; } @@ -54,7 +54,7 @@ public MessageCommandProperties Build() MessageCommandProperties props = new MessageCommandProperties() { Name = Name, - IsDefaultPermission = DefaultPermission + IsDefaultPermission = IsDefaultPermission }; return props; @@ -77,11 +77,11 @@ public MessageCommandBuilder WithName(string name) /// /// Sets the default permission of the current command. /// - /// The default permission value to set. + /// The default permission value to set. /// The current builder. - public MessageCommandBuilder WithDefaultPermission (bool value) + public MessageCommandBuilder WithDefaultPermission (bool isDefaultPermission) { - DefaultPermission = value; + IsDefaultPermission = isDefaultPermission; return this; } } From 08134d8636369a19bf7579fbf1a7b292a0734fdb Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:46:52 -0300 Subject: [PATCH 379/494] Update IGuild summary --- src/Discord.Net.Core/Entities/Guilds/IGuild.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 9b5d6b23af..90cdb3ae96 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -538,7 +538,7 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Task GetVoiceChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); /// - /// Gets a stage channel in this guild + /// Gets a stage channel in this guild. /// /// The snowflake identifier for the stage channel. /// The that determines whether the object should be fetched from cache. From b44ba498cb0a4d999e0e441788b20f93932bc524 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:47:42 -0300 Subject: [PATCH 380/494] Update IGuild summaries --- src/Discord.Net.Core/Entities/Guilds/IGuild.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 90cdb3ae96..62e34cabb8 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -771,7 +771,7 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// A guild user associated with the specified ; if the user is already in the guild. Task AddGuildUserAsync(ulong userId, string accessToken, Action func = null, RequestOptions options = null); /// - /// Disconnects the user from its current voice channel + /// Disconnects the user from its current voice channel. /// /// The user to disconnect. /// A task that represents the asynchronous operation for disconnecting a user. @@ -990,7 +990,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC Task CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options = null); /// - /// Creates a new sticker in this guild + /// Creates a new sticker in this guild. /// /// The name of the sticker. /// The description of the sticker. @@ -1003,7 +1003,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC Task CreateStickerAsync(string name, string description, IEnumerable tags, string path, RequestOptions options = null); /// - /// Creates a new sticker in this guild + /// Creates a new sticker in this guild. /// /// The name of the sticker. /// The description of the sticker. From ae729ef3261aefb326586edeec4cf3f23d484d1b Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:49:29 -0300 Subject: [PATCH 381/494] Update StagePrivacyLevel summary --- .../Entities/Channels/StagePrivacyLevel.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs index 6a51ab4acc..3a91b61aa3 100644 --- a/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs +++ b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs @@ -6,9 +6,19 @@ namespace Discord { + /// + /// Represents the privacy level of a stage. + /// public enum StagePrivacyLevel { + /// + /// The stage is a public stage. + /// Public = 1, + + /// + /// The stage is non public and is only accessable from the guild. + /// GuildOnly = 2, } } From 504cbe4b08ff3c85cd4c7d7fa0f810ee76ada70e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:51:45 -0300 Subject: [PATCH 382/494] update IThreadChannel summaries --- .../Entities/Channels/IThreadChannel.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs index 72d65a2e89..e20d87d576 100644 --- a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -17,37 +17,37 @@ public interface IThreadChannel : ITextChannel, IGuildChannel ThreadType Type { get; } /// - /// if the current user has joined this thread, otherwise . + /// Gets whether or not the current user has joined this thread. /// bool HasJoined { get; } /// - /// if the current thread is archived, otherwise . + /// Gets whether or not the current thread is archived. /// bool IsArchived { get; } /// - /// Duration to automatically archive the thread after recent activity. + /// Gets the duration of time before the thread is automatically archived after no activity. /// ThreadArchiveDuration AutoArchiveDuration { get; } /// - /// Timestamp when the thread's archive status was last changed, used for calculating recent activity. + /// Gets the timestamp when the thread's archive status was last changed, used for calculating recent activity. /// DateTimeOffset ArchiveTimestamp { get; } /// - /// if the current thread is locked, otherwise + /// Gets whether or not the current thread is locked. /// bool IsLocked { get; } /// - /// An approximate count of users in a thread, stops counting at 50. + /// Gets an approximate count of users in a thread, stops counting after 50. /// int MemberCount { get; } /// - /// An approximate count of messages in a thread, stops counting at 50. + /// Gets an approximate count of messages in a thread, stops counting after 50. /// int MessageCount { get; } From 537629ca75a44fa2e95b964d117c93932796c4a4 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 7 Oct 2021 01:52:58 -0300 Subject: [PATCH 383/494] Update IStageChannel summaries --- src/Discord.Net.Core/Entities/Channels/IStageChannel.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index ff84262f0e..0efc9d818d 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -20,7 +20,7 @@ public interface IStageChannel : IVoiceChannel string Topic { get; } /// - /// The of the current stage. + /// Gets the of the current stage. /// /// /// If the stage isn't live then this property will be set to . @@ -28,12 +28,12 @@ public interface IStageChannel : IVoiceChannel StagePrivacyLevel? PrivacyLevel { get; } /// - /// if stage discovery is disabled, otherwise . + /// Gets whether or not stage discovery is disabled. /// bool? IsDiscoverableDisabled { get; } /// - /// when the stage is live, otherwise . + /// Gets whether or not the stage is live. /// /// /// If the stage isn't live then this property will be set to . From 06eefa790c688fc7793ca07aa6f8e483c411cdf4 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 9 Oct 2021 02:36:28 -0300 Subject: [PATCH 384/494] Refactor summaries and boolean property names --- src/Discord.Net.Core/Discord.Net.Core.xml | 115 ++++++++---------- .../Entities/Channels/IStageChannel.cs | 12 +- .../Entities/Channels/IThreadChannel.cs | 18 +-- .../Entities/Guilds/IGuild.cs | 8 +- .../Context Menus/MessageCommandBuilder.cs | 14 +-- .../Context Menus/UserCommandBuilder.cs | 16 +-- .../Message Components/ActionRowComponent.cs | 2 +- .../Message Components/ButtonComponent.cs | 22 ++-- .../Message Components/ComponentBuilder.cs | 67 +++++----- .../Message Components/MessageComponent.cs | 2 +- .../Message Components/SelectMenuComponent.cs | 20 ++- .../API/Common/ButtonComponent.cs | 2 +- .../API/Common/SelectMenuComponent.cs | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.xml | 10 +- .../Entities/Channels/RestStageChannel.cs | 10 +- .../Entities/Channels/RestThreadChannel.cs | 12 +- .../Discord.Net.WebSocket.xml | 10 +- .../Entities/Channels/SocketStageChannel.cs | 10 +- .../Entities/Channels/SocketThreadChannel.cs | 12 +- 19 files changed, 175 insertions(+), 189 deletions(-) diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index ebbf93c398..a12881481c 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -1988,23 +1988,21 @@ The of the current stage. + Gets the of the current stage. If the stage isn't live then this property will be set to . - + - if stage discovery is disabled, otherwise . + Gets whether or not stage discovery is disabled. - + - when the stage is live, otherwise . + Gets whether or not the stage is live. - - If the stage isn't live then this property will be set to . - @@ -2238,39 +2236,39 @@ Gets the type of the current thread channel. - + - if the current user has joined this thread, otherwise . + Gets whether or not the current user has joined this thread. - + if the current thread is archived, otherwise . - Duration to automatically archive the thread after recent activity. + Gets whether or not the current thread is archived. - Timestamp when the thread's archive status was last changed, used for calculating recent activity. + Gets the timestamp when the thread's archive status was last changed, used for calculating recent activity. - + - if the current thread is locked, otherwise + Gets whether or not the current thread is locked. - An approximate count of users in a thread, stops counting at 50. + Gets an approximate count of users in a thread, stops counting after 50. - An approximate count of messages in a thread, stops counting at 50. + Gets an approximate count of messages in a thread, stops counting after 50. @@ -3537,7 +3535,7 @@ - Gets a stage channel in this guild + Gets a stage channel in this guild. The snowflake identifier for the stage channel. The that determines whether the object should be fetched from cache. @@ -3782,7 +3780,7 @@ - Disconnects the user from its current voice channel + Disconnects the user from its current voice channel. The user to disconnect. A task that represents the asynchronous operation for disconnecting a user. @@ -4009,7 +4007,7 @@ - Creates a new sticker in this guild + Creates a new sticker in this guild. The name of the sticker. The description of the sticker. @@ -4022,7 +4020,7 @@ - Creates a new sticker in this guild + Creates a new sticker in this guild. The name of the sticker. The description of the sticker. @@ -4766,12 +4764,12 @@ - The name of this Message command. + Gets or sets the name of this Message command. - + - Whether the command is enabled by default when the app is added to a guild + Gets or sets whether the command is enabled by default when the app is added to a guild @@ -4795,7 +4793,7 @@ Sets the default permission of the current command. - The default permission value to set. + The default permission value to set. The current builder. @@ -4810,17 +4808,17 @@ - Returns the maximum length a commands name allowed by Discord + Returns the maximum length a commands name allowed by Discord. - The name of this User command. + Gets or sets the name of this User command. - + - Whether the command is enabled by default when the app is added to a guild + Gets or sets whether the command is enabled by default when the app is added to a guild. @@ -4842,7 +4840,7 @@ Sets the default permission of the current command. - The default permission value to set. + The default permission value to set. The current builder. @@ -5191,7 +5189,7 @@ - The child components in this row. + Gets the child components in this row. @@ -5204,35 +5202,33 @@ - The of this button, example buttons with each style can be found Here. + Gets the of this button, example buttons with each style can be found Here. - The label of the button, this is the text that is shown. + Gets the label of the button, this is the text that is shown. - A that will be displayed with this button. + Gets the displayed with this button. - - A unique id that will be sent with a . This is how you know what button was pressed. - + - A URL for a button. + Gets the URL for a button. You cannot have a button with a URL and a CustomId. - + - Whether this button is disabled or not. + Gets whether this button is disabled or not. @@ -5309,12 +5305,11 @@ The components to create the builder from. The newly created builder. - + Adds a to the at the specific row. If the row cannot accept the component then it will add it to a row that can. - The label of the menu. The custom id of the menu. The options of the menu. The placeholder of the menu. @@ -5444,7 +5439,7 @@ Gets or sets the url of the current button. - + Gets or sets whether the current button is disabled. @@ -5463,7 +5458,7 @@ The custom ID of this button. The custom ID of this button. The emote of this button. - Disabled this button or not. + Disabled this button or not. @@ -5556,7 +5551,7 @@ Sets whether the current button is disabled. - Whether the current button is disabled or not. + Whether the current button is disabled or not. The current builder. @@ -5623,7 +5618,7 @@ count exceeds . is null. - + Gets or sets whether the current menu is disabled. @@ -5647,7 +5642,7 @@ The placeholder of this select menu. The max values of this select menu. The min values of this select menu. - Disabled this select menu or not. + Disabled this select menu or not. @@ -5717,7 +5712,7 @@ The value of this option. The description of this option. The emote of this option. - Render this option as selected by default or not. + Render this option as selected by default or not. Options count reached . The current builder. @@ -5727,7 +5722,7 @@ Sets whether the current menu is disabled. - Whether the current menu is disabled or not. + Whether the current menu is disabled or not. The current builder. @@ -5784,7 +5779,7 @@ Gets or sets the emote of this option. - + Gets or sets the whether or not this option will render selected by default. @@ -5802,7 +5797,7 @@ The value of this option. The description of this option. The emote of this option. - Render this option as selected by default or not. + Render this option as selected by default or not. @@ -5852,7 +5847,7 @@ Sets the field default. - The value to set the field default to. + The value to set the field default to. The current builder. @@ -5905,7 +5900,7 @@ - The components to be used in a message. + Gets the components to be used in a message. @@ -5922,33 +5917,31 @@ - - The custom id of this Select menu that will be sent with a . - + - The menus options to select from. + Gets the menus options to select from. - A custom placeholder text if nothing is selected, max 100 characters. + Gets the custom placeholder text if nothing is selected. - The minimum number of items that must be chosen; default 1, min 0, max 25 + Gets the minimum number of items that must be chosen. - The maximum number of items that can be chosen; default 1, max 25 + Gets the maximum number of items that can be chosen. - + - Whether this menu is disabled or not. + Gets whether this menu is disabled or not. diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index 9e417a4f12..9c6d9e1879 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -21,6 +21,7 @@ public interface IStageChannel : IVoiceChannel /// /// The of the current stage. + /// Gets the of the current stage. /// /// /// If the stage isn't live then this property will be set to . @@ -28,17 +29,14 @@ public interface IStageChannel : IVoiceChannel StagePrivacyLevel? PrivacyLevel { get; } /// - /// if stage discovery is disabled, otherwise . + /// Gets whether or not stage discovery is disabled. /// - bool? DiscoverableDisabled { get; } + bool? IsDiscoverableDisabled { get; } /// - /// when the stage is live, otherwise . + /// Gets whether or not the stage is live. /// - /// - /// If the stage isn't live then this property will be set to . - /// - bool Live { get; } + bool IsLive { get; } /// /// Starts the stage, creating a stage instance. diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs index b5d6eea209..dfafb313d9 100644 --- a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -17,37 +17,37 @@ public interface IThreadChannel : ITextChannel, IGuildChannel ThreadType Type { get; } /// - /// if the current user has joined this thread, otherwise . + /// Gets whether or not the current user has joined this thread. /// - bool Joined { get; } + bool HasJoined { get; } /// /// if the current thread is archived, otherwise . /// - bool Archived { get; } + bool IsArchived { get; } /// - /// Duration to automatically archive the thread after recent activity. + /// Gets whether or not the current thread is archived. /// ThreadArchiveDuration AutoArchiveDuration { get; } /// - /// Timestamp when the thread's archive status was last changed, used for calculating recent activity. + /// Gets the timestamp when the thread's archive status was last changed, used for calculating recent activity. /// DateTimeOffset ArchiveTimestamp { get; } /// - /// if the current thread is locked, otherwise + /// Gets whether or not the current thread is locked. /// - bool Locked { get; } + bool IsLocked { get; } /// - /// An approximate count of users in a thread, stops counting at 50. + /// Gets an approximate count of users in a thread, stops counting after 50. /// int MemberCount { get; } /// - /// An approximate count of messages in a thread, stops counting at 50. + /// Gets an approximate count of messages in a thread, stops counting after 50. /// int MessageCount { get; } diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 275879a2c3..4a23336457 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -538,7 +538,7 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Task GetVoiceChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); /// - /// Gets a stage channel in this guild + /// Gets a stage channel in this guild. /// /// The snowflake identifier for the stage channel. /// The that determines whether the object should be fetched from cache. @@ -771,7 +771,7 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// A guild user associated with the specified ; if the user is already in the guild. Task AddGuildUserAsync(ulong userId, string accessToken, Action func = null, RequestOptions options = null); /// - /// Disconnects the user from its current voice channel + /// Disconnects the user from its current voice channel. /// /// The user to disconnect. /// A task that represents the asynchronous operation for disconnecting a user. @@ -990,7 +990,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC Task CreateStickerAsync(string name, string description, IEnumerable tags, Image image, RequestOptions options = null); /// - /// Creates a new sticker in this guild + /// Creates a new sticker in this guild. /// /// The name of the sticker. /// The description of the sticker. @@ -1003,7 +1003,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC Task CreateStickerAsync(string name, string description, IEnumerable tags, string path, RequestOptions options = null); /// - /// Creates a new sticker in this guild + /// Creates a new sticker in this guild. /// /// The name of the sticker. /// The description of the sticker. diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index c6433e969f..07d8bcfbf1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -18,7 +18,7 @@ public class MessageCommandBuilder public const int MaxNameLength = 32; /// - /// The name of this Message command. + /// Gets or sets the name of this Message command. /// public string Name { @@ -37,9 +37,9 @@ public string Name } /// - /// Whether the command is enabled by default when the app is added to a guild + /// Gets or sets whether the command is enabled by default when the app is added to a guild /// - public bool DefaultPermission { get; set; } = true; + public bool IsDefaultPermission { get; set; } = true; private string _name { get; set; } @@ -54,7 +54,7 @@ public MessageCommandProperties Build() MessageCommandProperties props = new MessageCommandProperties() { Name = Name, - DefaultPermission = DefaultPermission + DefaultPermission = IsDefaultPermission }; return props; @@ -77,11 +77,11 @@ public MessageCommandBuilder WithName(string name) /// /// Sets the default permission of the current command. /// - /// The default permission value to set. + /// The default permission value to set. /// The current builder. - public MessageCommandBuilder WithDefaultPermission (bool value) + public MessageCommandBuilder WithDefaultPermission (bool isDefaultPermission) { - DefaultPermission = value; + IsDefaultPermission = isDefaultPermission; return this; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index 7974374761..2cc0da4bd0 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -13,12 +13,12 @@ namespace Discord public class UserCommandBuilder { /// - /// Returns the maximum length a commands name allowed by Discord + /// Returns the maximum length a commands name allowed by Discord. /// public const int MaxNameLength = 32; /// - /// The name of this User command. + /// Gets or sets the name of this User command. /// public string Name { @@ -37,9 +37,9 @@ public string Name } /// - /// Whether the command is enabled by default when the app is added to a guild + /// Gets or sets whether the command is enabled by default when the app is added to a guild. /// - public bool DefaultPermission { get; set; } = true; + public bool IsDefaultPermission { get; set; } = true; private string _name { get; set; } @@ -52,7 +52,7 @@ public UserCommandProperties Build() UserCommandProperties props = new UserCommandProperties() { Name = Name, - DefaultPermission = DefaultPermission + DefaultPermission = IsDefaultPermission }; return props; @@ -75,11 +75,11 @@ public UserCommandBuilder WithName(string name) /// /// Sets the default permission of the current command. /// - /// The default permission value to set. + /// The default permission value to set. /// The current builder. - public UserCommandBuilder WithDefaultPermission (bool value) + public UserCommandBuilder WithDefaultPermission (bool isDefaultPermission) { - DefaultPermission = value; + IsDefaultPermission = isDefaultPermission; return this; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index a9dd27beae..df08e5ee30 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -16,7 +16,7 @@ public class ActionRowComponent : IMessageComponent public ComponentType Type { get; } = ComponentType.ActionRow; /// - /// The child components in this row. + /// Gets the child components in this row. /// public IReadOnlyCollection Components { get; internal set; } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index bad9f8aa38..64a2ab0e99 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -16,27 +16,25 @@ public class ButtonComponent : IMessageComponent public ComponentType Type { get; } = ComponentType.Button; /// - /// The of this button, example buttons with each style can be found Here. + /// Gets the of this button, example buttons with each style can be found Here. /// public ButtonStyle Style { get; } /// - /// The label of the button, this is the text that is shown. + /// Gets the label of the button, this is the text that is shown. /// public string Label { get; } /// - /// A that will be displayed with this button. + /// Gets the displayed with this button. /// public IEmote Emote { get; } - /// - /// A unique id that will be sent with a . This is how you know what button was pressed. - /// + /// public string CustomId { get; } /// - /// A URL for a button. + /// Gets the URL for a button. /// /// /// You cannot have a button with a URL and a CustomId. @@ -44,9 +42,9 @@ public class ButtonComponent : IMessageComponent public string Url { get; } /// - /// Whether this button is disabled or not. + /// Gets whether this button is disabled or not. /// - public bool Disabled { get; } + public bool IsDisabled { get; } /// /// Turns this button into a button builder. @@ -55,16 +53,16 @@ public class ButtonComponent : IMessageComponent /// A newly created button builder with the same properties as this button. /// public ButtonBuilder ToBuilder() - => new ButtonBuilder(Label, CustomId, Style, Url, Emote, Disabled); + => new ButtonBuilder(Label, CustomId, Style, Url, Emote, IsDisabled); - internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool disabled) + internal ButtonComponent(ButtonStyle style, string label, IEmote emote, string customId, string url, bool isDisabled) { Style = style; Label = label; Emote = emote; CustomId = customId; Url = url; - Disabled = disabled; + IsDisabled = isDisabled; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 975363f586..4db96d4095 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -69,14 +69,14 @@ internal void AddComponent(IMessageComponent component, int row) switch (component) { case ButtonComponent button: - WithButton(button.Label, button.CustomId, button.Style, button.Emote, button.Url, button.Disabled, row); + WithButton(button.Label, button.CustomId, button.Style, button.Emote, button.Url, button.IsDisabled, row); break; case ActionRowComponent actionRow: foreach (var cmp in actionRow.Components) AddComponent(cmp, row); break; case SelectMenuComponent menu: - WithSelectMenu(menu.Placeholder, menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.Disabled, row); + WithSelectMenu(menu.CustomId, menu.Options.Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)).ToList(), menu.Placeholder, menu.MinValues, menu.MaxValues, menu.IsDisabled, row); break; } } @@ -85,7 +85,6 @@ internal void AddComponent(IMessageComponent component, int row) /// Adds a to the at the specific row. /// If the row cannot accept the component then it will add it to a row that can. /// - /// The label of the menu. /// The custom id of the menu. /// The options of the menu. /// The placeholder of the menu. @@ -94,7 +93,7 @@ internal void AddComponent(IMessageComponent component, int row) /// Whether or not the menu is disabled. /// The row to add the menu to. /// - public ComponentBuilder WithSelectMenu(string label, string customId, List options, + public ComponentBuilder WithSelectMenu(string customId, List options, string placeholder = null, int minValues = 1, int maxValues = 1, bool disabled = false, int row = 0) { return WithSelectMenu(new SelectMenuBuilder() @@ -413,7 +412,7 @@ public string CustomId /// /// Gets or sets whether the current button is disabled. /// - public bool Disabled { get; set; } + public bool IsDisabled { get; set; } private string _label; @@ -432,14 +431,14 @@ public ButtonBuilder() { } /// The custom ID of this button. /// The custom ID of this button. /// The emote of this button. - /// Disabled this button or not. - public ButtonBuilder(string label = null, string customId = null, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool disabled = false) + /// Disabled this button or not. + public ButtonBuilder(string label = null, string customId = null, ButtonStyle style = ButtonStyle.Primary, string url = null, IEmote emote = null, bool isDisabled = false) { CustomId = customId; Style = style; Url = url; Label = label; - Disabled = disabled; + IsDisabled = isDisabled; Emote = emote; } @@ -452,7 +451,7 @@ public ButtonBuilder(ButtonComponent button) Style = button.Style; Url = button.Url; Label = button.Label; - Disabled = button.Disabled; + IsDisabled = button.IsDisabled; Emote = button.Emote; } @@ -566,11 +565,11 @@ public ButtonBuilder WithCustomId(string id) /// /// Sets whether the current button is disabled. /// - /// Whether the current button is disabled or not. + /// Whether the current button is disabled or not. /// The current builder. - public ButtonBuilder WithDisabled(bool disabled) + public ButtonBuilder WithDisabled(bool isDisabled) { - Disabled = disabled; + IsDisabled = isDisabled; return this; } @@ -601,7 +600,7 @@ public ButtonComponent Build() else if (string.IsNullOrEmpty(CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); - return new ButtonComponent(Style, Label, Emote, CustomId, Url, Disabled); + return new ButtonComponent(Style, Label, Emote, CustomId, Url, IsDisabled); } } @@ -718,7 +717,7 @@ public List Options /// /// Gets or sets whether the current menu is disabled. /// - public bool Disabled { get; set; } + public bool IsDisabled { get; set; } private List _options = new List(); private int _minValues = 1; @@ -740,7 +739,7 @@ public SelectMenuBuilder(SelectMenuComponent selectMenu) CustomId = selectMenu.Placeholder; MaxValues = selectMenu.MaxValues; MinValues = selectMenu.MinValues; - Disabled = selectMenu.Disabled; + IsDisabled = selectMenu.IsDisabled; Options = selectMenu.Options? .Select(x => new SelectMenuOptionBuilder(x.Label, x.Value, x.Description, x.Emote, x.Default)) .ToList(); @@ -754,13 +753,13 @@ public SelectMenuBuilder(SelectMenuComponent selectMenu) /// The placeholder of this select menu. /// The max values of this select menu. /// The min values of this select menu. - /// Disabled this select menu or not. - public SelectMenuBuilder(string customId, List options, string placeholder = null, int maxValues = 1, int minValues = 1, bool disabled = false) + /// Disabled this select menu or not. + public SelectMenuBuilder(string customId, List options, string placeholder = null, int maxValues = 1, int minValues = 1, bool isDisabled = false) { CustomId = customId; Options = options; Placeholder = placeholder; - Disabled = disabled; + IsDisabled = isDisabled; MaxValues = maxValues; MinValues = minValues; } @@ -859,27 +858,27 @@ public SelectMenuBuilder AddOption(SelectMenuOptionBuilder option) /// The value of this option. /// The description of this option. /// The emote of this option. - /// Render this option as selected by default or not. + /// Render this option as selected by default or not. /// Options count reached . /// /// The current builder. /// - public SelectMenuBuilder AddOption(string label, string value, string description = null, IEmote emote = null, bool? @default = null) + public SelectMenuBuilder AddOption(string label, string value, string description = null, IEmote emote = null, bool? isDefault = null) { - AddOption(new SelectMenuOptionBuilder(label, value, description, emote, @default)); + AddOption(new SelectMenuOptionBuilder(label, value, description, emote, isDefault)); return this; } /// /// Sets whether the current menu is disabled. /// - /// Whether the current menu is disabled or not. + /// Whether the current menu is disabled or not. /// /// The current builder. /// - public SelectMenuBuilder WithDisabled(bool disabled) + public SelectMenuBuilder WithDisabled(bool isDisabled) { - Disabled = disabled; + IsDisabled = isDisabled; return this; } @@ -891,7 +890,7 @@ public SelectMenuComponent Build() { var options = Options?.Select(x => x.Build()).ToList(); - return new SelectMenuComponent(CustomId, options, Placeholder, MinValues, MaxValues, Disabled); + return new SelectMenuComponent(CustomId, options, Placeholder, MinValues, MaxValues, IsDisabled); } } @@ -991,7 +990,7 @@ public string Description /// /// Gets or sets the whether or not this option will render selected by default. /// - public bool? Default { get; set; } + public bool? IsDefault { get; set; } private string _label; private string _value; @@ -1009,14 +1008,14 @@ public SelectMenuOptionBuilder() { } /// The value of this option. /// The description of this option. /// The emote of this option. - /// Render this option as selected by default or not. - public SelectMenuOptionBuilder(string label, string value, string description = null, IEmote emote = null, bool? @default = null) + /// Render this option as selected by default or not. + public SelectMenuOptionBuilder(string label, string value, string description = null, IEmote emote = null, bool? isDefault = null) { Label = label; Value = value; Description = description; Emote = emote; - Default = @default; + this.IsDefault = isDefault; } /// @@ -1028,7 +1027,7 @@ public SelectMenuOptionBuilder(SelectMenuOption option) Value = option.Value; Description = option.Description; Emote = option.Emote; - Default = option.Default; + IsDefault = option.Default; } /// @@ -1089,13 +1088,13 @@ public SelectMenuOptionBuilder WithEmote(IEmote emote) /// /// Sets the field default. /// - /// The value to set the field default to. + /// The value to set the field default to. /// /// The current builder. /// - public SelectMenuOptionBuilder WithDefault(bool defaultValue) + public SelectMenuOptionBuilder WithDefault(bool isDefault) { - Default = defaultValue; + IsDefault = isDefault; return this; } @@ -1105,7 +1104,7 @@ public SelectMenuOptionBuilder WithDefault(bool defaultValue) /// The newly built . public SelectMenuOption Build() { - return new SelectMenuOption(Label, Value, Description, Emote, Default); + return new SelectMenuOption(Label, Value, Description, Emote, IsDefault); } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs index c1c8b2817e..eb37a57b86 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -12,7 +12,7 @@ namespace Discord public class MessageComponent { /// - /// The components to be used in a message. + /// Gets the components to be used in a message. /// public IReadOnlyCollection Components { get; } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs index 4fa3e43934..a0b980c53e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs @@ -14,35 +14,33 @@ public class SelectMenuComponent : IMessageComponent /// public ComponentType Type => ComponentType.SelectMenu; - /// - /// The custom id of this Select menu that will be sent with a . - /// + /// public string CustomId { get; } /// - /// The menus options to select from. + /// Gets the menus options to select from. /// public IReadOnlyCollection Options { get; } /// - /// A custom placeholder text if nothing is selected, max 100 characters. + /// Gets the custom placeholder text if nothing is selected. /// public string Placeholder { get; } /// - /// The minimum number of items that must be chosen; default 1, min 0, max 25 + /// Gets the minimum number of items that must be chosen. /// public int MinValues { get; } /// - /// The maximum number of items that can be chosen; default 1, max 25 + /// Gets the maximum number of items that can be chosen. /// public int MaxValues { get; } /// - /// Whether this menu is disabled or not. + /// Gets whether this menu is disabled or not. /// - public bool Disabled { get; } + public bool IsDisabled { get; } /// /// Turns this select menu into a builder. @@ -57,7 +55,7 @@ public SelectMenuBuilder ToBuilder() Placeholder, MaxValues, MinValues, - Disabled); + IsDisabled); internal SelectMenuComponent(string customId, List options, string placeholder, int minValues, int maxValues, bool disabled) { @@ -66,7 +64,7 @@ internal SelectMenuComponent(string customId, List options, st Placeholder = placeholder; MinValues = minValues; MaxValues = maxValues; - Disabled = disabled; + IsDisabled = disabled; } } } diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index b941bf593a..8870400061 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -39,7 +39,7 @@ public ButtonComponent(Discord.ButtonComponent c) Label = c.Label; CustomId = c.CustomId; Url = c.Url; - Disabled = c.Disabled; + Disabled = c.IsDisabled; if (c.Emote != null) { diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs index 5476565dc8..16daa66ab6 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -40,7 +40,7 @@ public SelectMenuComponent(Discord.SelectMenuComponent component) Placeholder = component.Placeholder; MinValues = component.MinValues; MaxValues = component.MaxValues; - Disabled = component.Disabled; + Disabled = component.IsDisabled; } } } diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index 0c47d29d2b..cd5187220e 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -2435,10 +2435,10 @@ - + - + @@ -2730,10 +2730,10 @@ Represents a thread channel received over REST. - + - + @@ -2742,7 +2742,7 @@ - + diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs index 41877befce..721e2d7809 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -20,10 +20,10 @@ public class RestStageChannel : RestVoiceChannel, IStageChannel public StagePrivacyLevel? PrivacyLevel { get; private set; } /// - public bool? DiscoverableDisabled { get; private set; } + public bool? IsDiscoverableDisabled { get; private set; } /// - public bool Live { get; private set; } + public bool IsLive { get; private set; } internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) : base(discord, guild, id) { @@ -39,18 +39,18 @@ internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) internal void Update(StageInstance model, bool isLive = false) { - Live = isLive; + IsLive = isLive; if(isLive) { Topic = model.Topic; PrivacyLevel = model.PrivacyLevel; - DiscoverableDisabled = model.DiscoverableDisabled; + IsDiscoverableDisabled = model.DiscoverableDisabled; } else { Topic = null; PrivacyLevel = null; - DiscoverableDisabled = null; + IsDiscoverableDisabled = null; } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs index 799d150b54..05117be06e 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs @@ -16,10 +16,10 @@ public class RestThreadChannel : RestTextChannel, IThreadChannel { public ThreadType Type { get; private set; } /// - public bool Joined { get; private set; } + public bool HasJoined { get; private set; } /// - public bool Archived { get; private set; } + public bool IsArchived { get; private set; } /// public ThreadArchiveDuration AutoArchiveDuration { get; private set; } @@ -28,7 +28,7 @@ public class RestThreadChannel : RestTextChannel, IThreadChannel public DateTimeOffset ArchiveTimestamp { get; private set; } /// - public bool Locked { get; private set; } + public bool IsLocked { get; private set; } /// public int MemberCount { get; private set; } @@ -58,14 +58,14 @@ internal override void Update(Model model) { base.Update(model); - Joined = model.ThreadMember.IsSpecified; + HasJoined = model.ThreadMember.IsSpecified; if (model.ThreadMetadata.IsSpecified) { - Archived = model.ThreadMetadata.Value.Archived; + IsArchived = model.ThreadMetadata.Value.Archived; AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; - Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index a520d182a0..c2f7382f1f 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2274,10 +2274,10 @@ - + - + @@ -2610,7 +2610,7 @@ Gets the current users within this thread. - + @@ -2629,7 +2629,7 @@ - + @@ -2638,7 +2638,7 @@ - + diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index ce529ca89f..a8c0101e77 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -22,10 +22,10 @@ public class SocketStageChannel : SocketVoiceChannel, IStageChannel public StagePrivacyLevel? PrivacyLevel { get; private set; } /// - public bool? DiscoverableDisabled { get; private set; } + public bool? IsDiscoverableDisabled { get; private set; } /// - public bool Live { get; private set; } = false; + public bool IsLive { get; private set; } = false; /// /// Returns if the current user is a speaker within the stage, otherwise . @@ -62,18 +62,18 @@ internal override void Update(ClientState state, Model model) internal void Update(StageInstance model, bool isLive = false) { - Live = isLive; + IsLive = isLive; if (isLive) { Topic = model.Topic; PrivacyLevel = model.PrivacyLevel; - DiscoverableDisabled = model.DiscoverableDisabled; + IsDiscoverableDisabled = model.DiscoverableDisabled; } else { Topic = null; PrivacyLevel = null; - DiscoverableDisabled = null; + IsDiscoverableDisabled = null; } } diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 9a8f4b1393..3fd47ec872 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -35,7 +35,7 @@ public SocketThreadUser CurrentUser => Users.FirstOrDefault(x => x.Id == Discord.CurrentUser.Id); /// - public bool Joined { get; private set; } + public bool HasJoined { get; private set; } /// /// if this thread is private, otherwise @@ -55,7 +55,7 @@ public bool IsPrivateThread public int MemberCount { get; private set; } /// - public bool Archived { get; private set; } + public bool IsArchived { get; private set; } /// public DateTimeOffset ArchiveTimestamp { get; private set; } @@ -64,7 +64,7 @@ public bool IsPrivateThread public ThreadArchiveDuration AutoArchiveDuration { get; private set; } /// - public bool Locked { get; private set; } + public bool IsLocked { get; private set; } /// /// Gets a collection of cached users within this thread. @@ -106,10 +106,10 @@ internal override void Update(ClientState state, Model model) if (model.ThreadMetadata.IsSpecified) { - Archived = model.ThreadMetadata.Value.Archived; + IsArchived = model.ThreadMetadata.Value.Archived; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; - Locked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); + IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } if (model.OwnerId.IsSpecified) @@ -117,7 +117,7 @@ internal override void Update(ClientState state, Model model) Owner = GetUser(model.OwnerId.Value); } - Joined = model.ThreadMember.IsSpecified; + HasJoined = model.ThreadMember.IsSpecified; } internal IReadOnlyCollection RemoveUsers(ulong[] users) From 1cf5c8f57e47afb5e50966db9025a4684c50c087 Mon Sep 17 00:00:00 2001 From: d4n Date: Sat, 9 Oct 2021 01:11:00 -0500 Subject: [PATCH 385/494] General cleanup (#223) * General cleanup * Add Async suffix to SendAutocompleteResult * Fix more formatting * Fix unused RequestOptions in GetActiveThreadsAsync * Add message to ArgumentNullException --- .../Entities/Channels/IStageChannel.cs | 3 - .../Entities/Channels/IThreadChannel.cs | 13 +- .../Channels/StageInstanceProperties.cs | 6 - .../Entities/Channels/StagePrivacyLevel.cs | 17 +- .../Channels/ThreadArchiveDuration.cs | 12 +- .../Entities/Channels/ThreadType.cs | 8 +- .../Interactions/ApplicationCommandOption.cs | 21 +-- .../ApplicationCommandOptionChoice.cs | 23 +-- .../ApplicationCommandOptionType.cs | 10 +- .../ApplicationCommandProperties.cs | 6 - .../Interactions/ApplicationCommandTypes.cs | 6 - .../Interactions/AutocompleteOption.cs | 6 - .../Interactions/AutocompleteResult.cs | 42 ++--- .../Context Menus/MessageCommandBuilder.cs | 21 +-- .../Context Menus/MessageCommandProperties.cs | 6 - .../Context Menus/UserCommandBuilder.cs | 19 +-- .../Context Menus/UserCommandProperties.cs | 6 - .../Interactions/IApplicationCommand.cs | 4 +- .../IApplicationCommandInteractionData.cs | 4 - ...ApplicationCommandInteractionDataOption.cs | 5 - .../Interactions/IApplicationCommandOption.cs | 10 +- .../IApplicationCommandOptionChoice.cs | 7 - .../Interactions/IDiscordInteraction.cs | 13 +- .../Interactions/IDiscordInteractionData.cs | 8 +- .../Interactions/InteractionResponseType.cs | 12 +- .../Entities/Interactions/InteractionType.cs | 8 +- .../Message Components/ActionRowComponent.cs | 12 +- .../Message Components/ButtonComponent.cs | 11 +- .../Message Components/ButtonStyle.cs | 6 - .../Message Components/ComponentBuilder.cs | 158 +++++++----------- .../Message Components/ComponentType.cs | 16 +- .../Message Components/IMessageComponent.cs | 6 - .../Message Components/MessageComponent.cs | 4 - .../Message Components/SelectMenuComponent.cs | 3 - .../Message Components/SelectMenuOption.cs | 6 - .../Slash Commands/SlashCommandBuilder.cs | 148 +++++++--------- .../Slash Commands/SlashCommandProperties.cs | 4 - .../Entities/Messages/StickerFormatType.cs | 22 ++- .../Entities/Messages/TimestampTag.cs | 17 +- .../Entities/Messages/TimestampTagStyle.cs | 6 - .../ApplicationCommandPermissionTarget.cs | 8 +- .../GuildApplicationCommandPermissions.cs | 4 - .../Entities/Stickers/ICustomSticker.cs | 3 - .../Entities/Stickers/ISticker.cs | 6 +- .../Entities/Stickers/IStickerItem.cs | 6 - .../Entities/Stickers/StickerPack.cs | 6 +- .../Entities/Stickers/StickerProperties.cs | 4 - .../Entities/Stickers/StickerType.cs | 10 +- .../Net/ApplicationCommandException.cs | 4 - src/Discord.Net.Core/Utils/UrlValidation.cs | 22 +-- .../API/Common/ActionRowComponent.cs | 7 +- .../API/Common/ApplicationCommand.cs | 5 - .../ApplicationCommandInteractionData.cs | 2 - ...ApplicationCommandInteractionDataOption.cs | 1 - .../API/Common/ApplicationCommandOption.cs | 52 ++---- .../Common/ApplicationCommandOptionChoice.cs | 5 - .../Common/ApplicationCommandPermissions.cs | 5 - .../API/Common/AutocompleteInteractionData.cs | 5 - .../AutocompleteInteractionDataOption.cs | 5 - .../API/Common/ButtonComponent.cs | 11 +- .../API/Common/ChannelThreads.cs | 5 - .../GuildApplicationCommandPermissions.cs | 7 +- .../API/Common/Interaction.cs | 5 - .../API/Common/InteractionCallbackData.cs | 6 +- .../API/Common/InteractionResponse.cs | 5 - .../Common/MessageComponentInteractionData.cs | 5 - .../API/Common/NitroStickerPacks.cs | 4 - .../API/Common/SelectMenuComponent.cs | 4 - .../API/Common/SelectMenuOption.cs | 13 +- .../API/Common/StageInstance.cs | 5 - src/Discord.Net.Rest/API/Common/Sticker.cs | 2 +- .../API/Common/StickerItem.cs | 5 - .../API/Common/StickerPack.cs | 5 - .../API/Common/ThreadMember.cs | 6 +- .../API/Common/ThreadMetadata.cs | 4 - .../Rest/CreateApplicationCommandParams.cs | 8 +- .../API/Rest/CreateStageInstanceParams.cs | 5 - .../API/Rest/CreateStickerParams.cs | 8 +- .../Rest/ModifyApplicationCommandParams.cs | 5 - ...odifyGuildApplicationCommandPermissions.cs | 5 - ...uildApplicationCommandPermissionsParams.cs | 5 - .../Rest/ModifyInteractionResponseParams.cs | 7 +- .../API/Rest/ModifyStageInstanceParams.cs | 6 - .../API/Rest/ModifyStickerParams.cs | 5 - .../API/Rest/ModifyThreadParams.cs | 6 - .../API/Rest/StartThreadParams.cs | 5 - src/Discord.Net.Rest/ClientHelper.cs | 30 ++-- src/Discord.Net.Rest/DiscordRestApiClient.cs | 3 +- src/Discord.Net.Rest/DiscordRestClient.cs | 14 +- .../Entities/AuditLogs/DataTypes/StageInfo.cs | 12 +- .../StageInstanceCreateAuditLogData.cs | 5 - .../StageInstanceDeleteAuditLogData.cs | 5 - .../StageInstanceUpdatedAuditLogData.cs | 4 - .../Entities/Channels/RestStageChannel.cs | 27 ++- .../Entities/Channels/RestThreadChannel.cs | 39 ++--- .../Entities/Channels/ThreadHelper.cs | 18 +- .../Entities/Guilds/RestGuild.cs | 8 +- .../Interactions/InteractionHelper.cs | 143 ++++++++-------- .../Interactions/RestApplicationCommand.cs | 21 +-- .../RestApplicationCommandChoice.cs | 5 - .../RestApplicationCommandOption.cs | 5 +- .../Interactions/RestGlobalCommand.cs | 12 +- .../Entities/Interactions/RestGuildCommand.cs | 7 +- .../Entities/Messages/CustomSticker.cs | 3 - .../Entities/Messages/MessageHelper.cs | 4 +- .../Entities/Messages/RestFollowupMessage.cs | 12 +- .../Messages/RestInteractionMessage.cs | 6 +- .../Entities/Messages/Sticker.cs | 5 +- .../Entities/Messages/StickerItem.cs | 12 +- .../Entities/Users/RestThreadUser.cs | 4 - .../Net/Converters/InteractionConverter.cs | 4 - .../Converters/MessageComponentConverter.cs | 4 - .../ApplicationCommandCreatedUpdatedEvent.cs | 7 +- .../API/Gateway/GuildStickerUpdateEvent.cs | 5 - .../API/Gateway/ThreadListSyncEvent.cs | 5 - .../API/Gateway/ThreadMembersUpdate.cs | 5 - .../DiscordSocketClient.cs | 4 +- .../Entities/Channels/SocketStageChannel.cs | 30 ++-- .../Entities/Channels/SocketThreadChannel.cs | 49 +++--- .../Entities/Guilds/SocketGuild.cs | 4 +- .../Message Commands/SocketMessageCommand.cs | 10 +- .../User Commands/SocketUserCommand.cs | 12 +- .../SocketMessageComponent.cs | 44 +++-- .../SocketMessageComponentData.cs | 4 - .../SocketAutocompleteInteraction.cs | 23 +-- .../SocketAutocompleteInteractionData.cs | 12 +- .../Slash Commands/SocketSlashCommand.cs | 12 +- .../Slash Commands/SocketSlashCommandData.cs | 3 +- .../SocketSlashCommandDataOption.cs | 11 +- .../SocketApplicationCommand.cs | 24 +-- .../SocketApplicationCommandChoice.cs | 5 - .../SocketApplicationCommandOption.cs | 13 +- .../SocketBaseCommand/SocketCommandBase.cs | 34 ++-- .../SocketCommandBaseData.cs | 2 - .../SocketBaseCommand/SocketResolvableData.cs | 4 - .../Entities/Interaction/SocketInteraction.cs | 30 ++-- .../Entities/Stickers/SocketCustomSticker.cs | 8 +- .../Entities/Stickers/SocketSticker.cs | 34 ++-- .../Entities/Stickers/SocketUnknownSticker.cs | 3 - .../Entities/Users/SocketThreadUser.cs | 4 - 140 files changed, 579 insertions(+), 1266 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index 9c6d9e1879..935acaab95 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs index dfafb313d9..570cdaa2fe 100644 --- a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord @@ -9,7 +6,7 @@ namespace Discord /// /// Represents a thread channel inside of a guild. /// - public interface IThreadChannel : ITextChannel, IGuildChannel + public interface IThreadChannel : ITextChannel { /// /// Gets the type of the current thread channel. @@ -56,7 +53,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// /// The options to be used when sending the request. /// - /// A task that represents the asynchronous join operation. + /// A task that represents the asynchronous join operation. /// Task JoinAsync(RequestOptions options = null); @@ -65,7 +62,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// /// The options to be used when sending the request. /// - /// A task that represents the asynchronous leave operation. + /// A task that represents the asynchronous leave operation. /// Task LeaveAsync(RequestOptions options = null); @@ -75,7 +72,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// The to add. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of adding a member to a thread. + /// A task that represents the asynchronous operation of adding a member to a thread. /// Task AddUserAsync(IGuildUser user, RequestOptions options = null); @@ -85,7 +82,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// The to remove from this thread. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of removing a user from this thread. + /// A task that represents the asynchronous operation of removing a user from this thread. /// Task RemoveUserAsync(IGuildUser user, RequestOptions options = null); } diff --git a/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs b/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs index ad539adc39..35201fe0f0 100644 --- a/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs +++ b/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs index 6a51ab4acc..9d55e713da 100644 --- a/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs +++ b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs @@ -1,14 +1,17 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { + /// + /// Specifies the privacy levels of a Stage instance. + /// public enum StagePrivacyLevel { + /// + /// The Stage instance is visible publicly, such as on Stage Discovery. + /// Public = 1, - GuildOnly = 2, + /// + /// The Stage instance is visible to only guild members. + /// + GuildOnly = 2 } } diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs b/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs index 01d1574bfa..2c8a0652c0 100644 --- a/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs +++ b/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -24,7 +18,7 @@ public enum ThreadArchiveDuration /// /// Three days (4320 minutes). /// - /// This option is explicity avaliable to nitro users. + /// This option is explicitly available to nitro users. /// /// ThreeDays = 4320, @@ -32,9 +26,9 @@ public enum ThreadArchiveDuration /// /// One week (10080 minutes). /// - /// This option is explicity avaliable to nitro users. + /// This option is explicitly available to nitro users. /// /// - OneWeek = 10080, + OneWeek = 10080 } } diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadType.cs b/src/Discord.Net.Core/Entities/Channels/ThreadType.cs index 2db09bcb9e..379128d21f 100644 --- a/src/Discord.Net.Core/Entities/Channels/ThreadType.cs +++ b/src/Discord.Net.Core/Entities/Channels/ThreadType.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -24,6 +18,6 @@ public enum ThreadType /// /// Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission /// - PrivateThread = 12, + PrivateThread = 12 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index 5b5353999c..828847791b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -1,9 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; namespace Discord { @@ -24,13 +21,13 @@ public string Name set { if (value == null) - throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); + throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null."); if (value.Length > 32) - throw new ArgumentException($"{nameof(Name)} length must be less than or equal to 32"); + throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 32."); if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) - throw new ArgumentException($"{nameof(Name)} must match the regex ^[\\w-]{{1,32}}$"); + throw new FormatException($"{nameof(value)} must match the regex ^[\\w-]{{1,32}}$"); _name = value; } @@ -42,14 +39,12 @@ public string Name public string Description { get => _description; - set + set => _description = value?.Length switch { - if (value?.Length > 100) - throw new ArgumentException("Description length must be less than or equal to 100"); - if (value?.Length < 1) - throw new ArgumentException("Description length must at least 1 character in length"); - _description = value; - } + > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be less than or equal to 100."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be at least 1."), + _ => value + }; } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs index 4a1339dc25..8b8b5a3aa6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -19,14 +15,12 @@ public class ApplicationCommandOptionChoiceProperties public string Name { get => _name; - set + set => _name = value?.Length switch { - if(value?.Length > 100) - throw new ArgumentException("Name length must be less than or equal to 100"); - if (value?.Length < 1) - throw new ArgumentException("Name length must at least 1 character in length"); - _name = value; - } + > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must at least 1."), + _ => value + }; } /// @@ -40,11 +34,8 @@ public object Value get => _value; set { - if(value != null) - { - if(!(value is int) && !(value is string)) - throw new ArgumentException("The value of a choice must be a string or int!"); - } + if (value != null && value is not int && value is not string) + throw new ArgumentException("The value of a choice must be a string or int!"); _value = value; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs index a1b366e187..0f919f1f69 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -37,7 +31,7 @@ public enum ApplicationCommandOptionType : byte Boolean = 5, /// - /// A . + /// A . /// User = 6, @@ -55,7 +49,7 @@ public enum ApplicationCommandOptionType : byte /// A or . /// Mentionable = 9, - + /// /// A . /// diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 55c91bc64e..25ef212c5d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs index 3cfa97a5a1..b6804deee1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs index 2a97a72951..4f7d3cb5f6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs index a0992fd00c..a4333ceb29 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -11,8 +7,8 @@ namespace Discord /// public class AutocompleteResult { - private object _value { get; set; } - private string _name { get; set; } + private object _value; + private string _name; /// /// Gets or sets the name of the result. @@ -28,12 +24,13 @@ public string Name set { if (value == null) - throw new ArgumentException("Name cannot be null!"); - if (value.Length > 100) - throw new ArgumentException("Name length must be less than or equal to 100 characters in length!"); - if (value.Length < 1) - throw new ArgumentException("Name length must at least 1 character in length!"); - _name = value; + throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null."); + _name = value.Length switch + { + > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be at least 1."), + _ => value + }; } } @@ -48,20 +45,15 @@ public string Name public object Value { get => _value; - set + set => _value = value switch { - if (value == null) - throw new ArgumentNullException("Value cannot be null"); - - _value = value switch - { - string str => str, - int integer => integer, - long lng => lng, - double number => number, - _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"), - }; - } + string str => str, + int integer => integer, + long lng => lng, + double number => number, + null => throw new ArgumentNullException(nameof(value), $"{nameof(Value)} cannot be null."), + _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!") + }; } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index 07d8bcfbf1..61b599fcd5 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -1,10 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - namespace Discord { /// @@ -12,7 +5,7 @@ namespace Discord /// public class MessageCommandBuilder { - /// + /// /// Returns the maximum length a commands name allowed by Discord /// public const int MaxNameLength = 32; @@ -22,10 +15,7 @@ public class MessageCommandBuilder /// public string Name { - get - { - return _name; - } + get => _name; set { Preconditions.NotNullOrEmpty(value, nameof(Name)); @@ -41,7 +31,7 @@ public string Name /// public bool IsDefaultPermission { get; set; } = true; - private string _name { get; set; } + private string _name; /// /// Build the current builder into a class. @@ -51,14 +41,13 @@ public string Name /// public MessageCommandProperties Build() { - MessageCommandProperties props = new MessageCommandProperties() + var props = new MessageCommandProperties { Name = Name, DefaultPermission = IsDefaultPermission }; return props; - } /// @@ -79,7 +68,7 @@ public MessageCommandBuilder WithName(string name) /// /// The default permission value to set. /// The current builder. - public MessageCommandBuilder WithDefaultPermission (bool isDefaultPermission) + public MessageCommandBuilder WithDefaultPermission(bool isDefaultPermission) { IsDefaultPermission = isDefaultPermission; return this; diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs index 3af9b47f36..356ed23d67 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index 2cc0da4bd0..67bd5ad48d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -1,10 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - namespace Discord { /// @@ -22,10 +15,7 @@ public class UserCommandBuilder /// public string Name { - get - { - return _name; - } + get => _name; set { Preconditions.NotNullOrEmpty(value, nameof(Name)); @@ -41,7 +31,7 @@ public string Name /// public bool IsDefaultPermission { get; set; } = true; - private string _name { get; set; } + private string _name; /// /// Build the current builder into a class. @@ -49,14 +39,13 @@ public string Name /// A that can be used to create user commands. public UserCommandProperties Build() { - UserCommandProperties props = new UserCommandProperties() + var props = new UserCommandProperties { Name = Name, DefaultPermission = IsDefaultPermission }; return props; - } /// @@ -77,7 +66,7 @@ public UserCommandBuilder WithName(string name) /// /// The default permission value to set. /// The current builder. - public UserCommandBuilder WithDefaultPermission (bool isDefaultPermission) + public UserCommandBuilder WithDefaultPermission(bool isDefaultPermission) { IsDefaultPermission = isDefaultPermission; return this; diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs index 091166a175..c42e916d93 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index 3fe53b72c1..faf724cd2e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord @@ -17,7 +15,7 @@ public interface IApplicationCommand : ISnowflakeEntity, IDeletable ulong ApplicationId { get; } /// - /// The type of the command + /// The type of the command. /// ApplicationCommandType Type { get; } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs index ec452180aa..c74eba8bb3 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index 999309979f..28e37fbb60 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -33,6 +29,5 @@ public interface IApplicationCommandInteractionDataOption /// Present if this option is a group or subcommand. /// IReadOnlyCollection Options { get; } - } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 39bf5418fa..a76abc68e9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -39,16 +35,16 @@ public interface IApplicationCommandOption /// /// Choices for string and int types for the user to pick from. /// - IReadOnlyCollection? Choices { get; } + IReadOnlyCollection Choices { get; } /// /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. /// - IReadOnlyCollection? Options { get; } + IReadOnlyCollection Options { get; } /// /// The allowed channel types for this option. /// - IReadOnlyCollection? ChannelTypes { get; } + IReadOnlyCollection ChannelTypes { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs index 1f05406561..ac03eb37c5 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -20,6 +14,5 @@ public interface IApplicationCommandOptionChoice /// value of the choice. /// object Value { get; } - } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 572e52a7ef..925ae08fcf 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord @@ -51,7 +48,7 @@ public interface IDiscordInteraction : ISnowflakeEntity /// The request options for this response. /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false, + Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// @@ -68,7 +65,7 @@ Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false /// /// The sent message. /// - Task FollowupAsync (string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// @@ -76,7 +73,7 @@ Task FollowupAsync (string text = null, Embed[] embeds = null, boo /// /// The request options for this request. /// A that represents the initial response. - Task GetOriginalResponseAsync (RequestOptions options = null); + Task GetOriginalResponseAsync(RequestOptions options = null); /// /// Edits original response for this interaction. @@ -84,7 +81,7 @@ Task FollowupAsync (string text = null, Embed[] embeds = null, boo /// A delegate containing the properties to modify the message with. /// The request options for this request. /// A that represents the initial response. - Task ModifyOriginalResponseAsync (Action func, RequestOptions options = null); + Task ModifyOriginalResponseAsync(Action func, RequestOptions options = null); /// /// Acknowledges this interaction. @@ -92,6 +89,6 @@ Task FollowupAsync (string text = null, Embed[] embeds = null, boo /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - Task DeferAsync (bool ephemeral = false, RequestOptions options = null); + Task DeferAsync(bool ephemeral = false, RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs index f55b46869d..42b95738eb 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs @@ -1,13 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// - /// Represents an interface used to specify classes that they are a vaild data type of a class. + /// Represents an interface used to specify classes that they are a valid data type of a class. /// public interface IDiscordInteractionData { } } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index 20f052f8a2..ad65406982 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -13,7 +9,7 @@ namespace Discord /// After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using /// or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, /// and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. - /// You can read more about Response types Here + /// You can read more about Response types Here. /// public enum InteractionResponseType : byte { @@ -45,17 +41,17 @@ public enum InteractionResponseType : byte DeferredChannelMessageWithSource = 5, /// - /// For components: ACK an interaction and edit the original message later; the user does not see a loading state + /// For components: ACK an interaction and edit the original message later; the user does not see a loading state. /// DeferredUpdateMessage = 6, /// - /// For components: edit the message the component was attached to + /// For components: edit the message the component was attached to. /// UpdateMessage = 7, /// - /// Respond with a set of choices to a autocomplete interaction + /// Respond with a set of choices to a autocomplete interaction. /// ApplicationCommandAutocompleteResult = 8 } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs index 989114505b..e09c906b59 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -29,6 +23,6 @@ public enum InteractionType : byte /// /// An autocomplete request sent from discord. /// - ApplicationCommandAutocomplete = 4, + ApplicationCommandAutocomplete = 4 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index df08e5ee30..202a5687ff 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -1,28 +1,22 @@ -using Newtonsoft.Json; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { /// - /// Represents a Row for child components to live in. + /// Represents a Row for child components to live in. /// public class ActionRowComponent : IMessageComponent { /// - public ComponentType Type { get; } = ComponentType.ActionRow; + public ComponentType Type => ComponentType.ActionRow; /// /// Gets the child components in this row. /// public IReadOnlyCollection Components { get; internal set; } - - internal ActionRowComponent() { } + internal ActionRowComponent(List components) { Components = components; diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index 64a2ab0e99..4b9fa27538 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -1,10 +1,3 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -13,7 +6,7 @@ namespace Discord public class ButtonComponent : IMessageComponent { /// - public ComponentType Type { get; } = ComponentType.Button; + public ComponentType Type => ComponentType.Button; /// /// Gets the of this button, example buttons with each style can be found Here. @@ -34,7 +27,7 @@ public class ButtonComponent : IMessageComponent public string CustomId { get; } /// - /// Gets the URL for a button. + /// Gets the URL for a button. /// /// /// You cannot have a button with a URL and a CustomId. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs index c72767cbd0..92d48ab4fb 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 4db96d4095..48e18f29a2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -31,14 +31,14 @@ public List ActionRows set { if (value == null) - throw new ArgumentNullException(paramName: nameof(ActionRows), message: "Cannot set an component builder's components collection to null."); + throw new ArgumentNullException(nameof(value), $"{nameof(ActionRows)} cannot be null."); if (value.Count > MaxActionRowCount) - throw new ArgumentException(message: $"Action row count must be less than or equal to {MaxActionRowCount}.", paramName: nameof(ActionRows)); + throw new ArgumentOutOfRangeException(nameof(value), $"Action row count must be less than or equal to {MaxActionRowCount}."); _actionRows = value; } } - private List _actionRows { get; set; } + private List _actionRows; /// /// Creates a new builder from a message. @@ -56,7 +56,7 @@ public static ComponentBuilder FromMessage(IMessage message) public static ComponentBuilder FromComponents(IReadOnlyCollection components) { var builder = new ComponentBuilder(); - for(int i = 0; i != components.Count; i++) + for (int i = 0; i != components.Count; i++) { var component = components.ElementAt(i); builder.AddComponent(component, i); @@ -118,7 +118,7 @@ public ComponentBuilder WithSelectMenu(string customId, List row) + if (_actionRows.Count > row) actionRow = _actionRows.ElementAt(row); else { @@ -244,10 +244,9 @@ public ComponentBuilder WithButton(ButtonBuilder button, int row = 0) /// A that can be sent with . public MessageComponent Build() { - if (_actionRows != null) - return new MessageComponent(_actionRows.Select(x => x.Build()).ToList()); - else - return MessageComponent.Empty; + return _actionRows != null + ? new MessageComponent(_actionRows.Select(x => x.Build()).ToList()) + : MessageComponent.Empty; } } @@ -272,19 +271,18 @@ public List Components set { if (value == null) - throw new ArgumentNullException(message: "Action row components cannot be null!", paramName: nameof(Components)); - - if (value.Count <= 0) - throw new ArgumentException(message: "There must be at least 1 component in a row", paramName: nameof(Components)); - - if (value.Count > MaxChildCount) - throw new ArgumentException(message: $"Action row can only contain {MaxChildCount} child components!", paramName: nameof(Components)); + throw new ArgumentNullException(nameof(value), $"{nameof(Components)} cannot be null."); - _components = value; + _components = value.Count switch + { + 0 => throw new ArgumentOutOfRangeException(nameof(value), "There must be at least 1 component in a row."), + > MaxChildCount => throw new ArgumentOutOfRangeException(nameof(value), $"Action row can only contain {MaxChildCount} child components!"), + _ => value + }; } } - private List _components { get; set; } = new List(); + private List _components = new List(); /// /// Adds a list of components to the current row. @@ -359,18 +357,12 @@ public class ButtonBuilder public string Label { get => _label; - set + set => _label = value?.Length switch { - if (value != null) - { - if (value.Length > MaxButtonLabelLength) - throw new ArgumentException($"Button label must be {MaxButtonLabelLength} characters or less!", paramName: nameof(Label)); - if (value.Length < 1) - throw new ArgumentException("Button label must be 1 character or more!", paramName: nameof(Label)); - } - - _label = value; - } + > MaxButtonLabelLength => throw new ArgumentOutOfRangeException(nameof(value), $"Label length must be less or equal to {MaxButtonLabelLength}."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Label length must be at least 1."), + _ => value + }; } /// @@ -381,17 +373,12 @@ public string Label public string CustomId { get => _customId; - set + set => _customId = value?.Length switch { - if (value != null) - { - if (value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); - if (value.Length < 1) - throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); - } - _customId = value; - } + > ComponentBuilder.MaxCustomIdLength => throw new ArgumentOutOfRangeException(nameof(value), $"Custom Id length must be less or equal to {ComponentBuilder.MaxCustomIdLength}."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Custom Id length must be at least 1."), + _ => value + }; } /// @@ -414,7 +401,6 @@ public string CustomId /// public bool IsDisabled { get; set; } - private string _label; private string _customId; @@ -594,8 +580,7 @@ public ButtonComponent Build() { if (string.IsNullOrEmpty(Url)) throw new InvalidOperationException("Link buttons must have a link associated with them"); - else - UrlValidation.ValidateButton(Url); + UrlValidation.ValidateButton(Url); } else if (string.IsNullOrEmpty(CustomId)) throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); @@ -632,17 +617,12 @@ public class SelectMenuBuilder public string CustomId { get => _customId; - set + set => _customId = value?.Length switch { - if (value != null) - { - if (value.Length > ComponentBuilder.MaxCustomIdLength) - throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); - if (value.Length < 1) - throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); - } - _customId = value; - } + > ComponentBuilder.MaxCustomIdLength => throw new ArgumentOutOfRangeException(nameof(value), $"Custom Id length must be less or equal to {ComponentBuilder.MaxCustomIdLength}."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Custom Id length must be at least 1."), + _ => value + }; } /// @@ -653,18 +633,12 @@ public string CustomId public string Placeholder { get => _placeholder; - set + set => _placeholder = value?.Length switch { - if (value != null) - { - if (value.Length > MaxPlaceholderLength) - throw new ArgumentException($"The placeholder must be {MaxPlaceholderLength} characters or less!", paramName: nameof(Placeholder)); - if (value.Length < 1) - throw new ArgumentException("The placeholder must be 1 character or more!", paramName: nameof(Placeholder)); - } - - _placeholder = value; - } + > MaxPlaceholderLength => throw new ArgumentOutOfRangeException(nameof(value), $"Placeholder length must be less or equal to {MaxPlaceholderLength}."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Placeholder length must be at least 1."), + _ => value + }; } /// @@ -708,7 +682,7 @@ public List Options if (value != null) Preconditions.LessThan(value.Count, MaxOptionCount, nameof(Options)); else - throw new ArgumentNullException(nameof(value)); + throw new ArgumentNullException(nameof(value), $"{nameof(Options)} cannot be null."); _options = value; } @@ -908,7 +882,7 @@ public class SelectMenuOptionBuilder /// The maximum length of a . /// public const int MaxDescriptionLength = 100; - + /// /// The maximum length of a . /// @@ -922,42 +896,28 @@ public class SelectMenuOptionBuilder public string Label { get => _label; - set + set => _label = value?.Length switch { - if (value != null) - { - if (value.Length > MaxSelectLabelLength) - throw new ArgumentException($"Select option label must be {MaxSelectLabelLength} characters or less!", paramName: nameof(Label)); - if (value.Length < 1) - throw new ArgumentException("Select option label must be 1 character or more!", paramName: nameof(Label)); - } - - _label = value; - } + > MaxSelectLabelLength => throw new ArgumentOutOfRangeException(nameof(value), $"Label length must be less or equal to {MaxSelectLabelLength}."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Label length must be at least 1."), + _ => value + }; } /// - /// Gets or sets the custom id of the current select menu. + /// Gets or sets the value of the current select menu. /// /// length exceeds . /// length subceeds 1. public string Value { get => _value; - set + set => _value = value?.Length switch { - if (value != null) - { - if (value.Length > MaxSelectValueLength) - throw new ArgumentException($"Select option value must be {MaxSelectValueLength} characters or less!", paramName: nameof(Label)); - if (value.Length < 1) - throw new ArgumentException("Select option value must be 1 character or more!", paramName: nameof(Label)); - } - else - throw new ArgumentException("Select option value must not be null or empty!", paramName: nameof(Label)); - - _value = value; - } + > MaxSelectValueLength => throw new ArgumentOutOfRangeException(nameof(value), $"Value length must be less or equal to {MaxSelectValueLength}."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Value length must be at least 1."), + _ => value + }; } /// @@ -968,18 +928,12 @@ public string Value public string Description { get => _description; - set + set => _description = value?.Length switch { - if (value != null) - { - if (value.Length > MaxDescriptionLength) - throw new ArgumentException($"The description must be {MaxDescriptionLength} characters or less!", paramName: nameof(Label)); - if (value.Length < 1) - throw new ArgumentException("The description must be 1 character or more!", paramName: nameof(Label)); - } - - _description = value; - } + > MaxDescriptionLength => throw new ArgumentOutOfRangeException(nameof(value), $"Description length must be less or equal to {MaxDescriptionLength}."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be at least 1."), + _ => value + }; } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs index 5fb4fc092a..70bc1f301c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs @@ -1,29 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// - /// Represents a type of a component + /// Represents a type of a component. /// public enum ComponentType { /// - /// A container for other components + /// A container for other components. /// ActionRow = 1, /// - /// A clickable button + /// A clickable button. /// Button = 2, /// - /// A select menu for picking from choices + /// A select menu for picking from choices. /// - SelectMenu = 3, + SelectMenu = 3 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs index 7614fbfd53..9366a44d69 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs index eb37a57b86..7205886816 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs index a0b980c53e..dfea847103 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs @@ -1,8 +1,5 @@ -using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs index 624b652be1..755068b2d6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 7402a6e66a..c42934bcf2 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; namespace Discord { @@ -30,20 +28,17 @@ public class SlashCommandBuilder /// public string Name { - get - { - return _name; - } + get => _name; set { - Preconditions.NotNullOrEmpty(value, nameof(Name)); - Preconditions.AtLeast(value.Length, 1, nameof(Name)); - Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); + Preconditions.NotNullOrEmpty(value, nameof(value)); + Preconditions.AtLeast(value.Length, 1, nameof(value)); + Preconditions.AtMost(value.Length, MaxNameLength, nameof(value)); // Discord updated the docs, this regex prevents special characters like @!$%(... etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(value)); _name = value; } @@ -55,10 +50,7 @@ public string Name /// public string Description { - get - { - return _description; - } + get => _description; set { Preconditions.NotNullOrEmpty(value, nameof(Description)); @@ -77,10 +69,7 @@ public List Options get => _options; set { - if (value != null) - if (value.Count > MaxOptionsCount) - throw new ArgumentException(message: $"Option count must be less than or equal to {MaxOptionsCount}.", paramName: nameof(Options)); - + Preconditions.AtMost(value?.Count ?? 0, MaxOptionsCount, nameof(value)); _options = value; } } @@ -90,9 +79,9 @@ public List Options /// public bool DefaultPermission { get; set; } = true; - private string _name { get; set; } - private string _description { get; set; } - private List _options { get; set; } + private string _name; + private string _description; + private List _options; /// /// Build the current builder into a class. @@ -100,11 +89,11 @@ public List Options /// A that can be used to create slash commands over rest. public SlashCommandProperties Build() { - SlashCommandProperties props = new SlashCommandProperties() + var props = new SlashCommandProperties { Name = Name, Description = Description, - DefaultPermission = DefaultPermission, + DefaultPermission = DefaultPermission }; if (Options != null && Options.Any()) @@ -117,7 +106,6 @@ public SlashCommandProperties Build() } return props; - } /// @@ -163,7 +151,7 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// The description of this option. /// If this option is required for this command. /// If this option is the default option. - /// If this option is set to autocompleate. + /// If this option is set to autocomplete. /// The options of the option to add. /// The allowed channel types for this option. /// The choices of this option. @@ -188,14 +176,10 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t Preconditions.AtMost(description.Length, MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true - if (isDefault.HasValue && isDefault.Value) - { - if (Options != null) - if (Options.Any(x => x.Default.HasValue && x.Default.Value)) - throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - } + if (isDefault == true && Options?.Any(x => x.Default == true) == true) + throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - SlashCommandOptionBuilder option = new SlashCommandOptionBuilder + var option = new SlashCommandOptionBuilder { Name = name, Description = description, @@ -204,8 +188,8 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t Options = options, Type = type, Autocomplete = isAutocomplete, - Choices = choices != null ? new List(choices) : null, - ChannelTypes = channelTypes, + Choices = (choices ?? Array.Empty()).ToList(), + ChannelTypes = channelTypes }; return AddOption(option); @@ -228,14 +212,12 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t /// The current builder. public SlashCommandBuilder AddOption(SlashCommandOptionBuilder option) { - if (Options == null) - Options = new List(); + Options ??= new List(); if (Options.Count >= MaxOptionsCount) - throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); + throw new InvalidOperationException($"Cannot have more than {MaxOptionsCount} options!"); - if (option == null) - throw new ArgumentNullException(nameof(option), "Option cannot be null"); + Preconditions.NotNull(option, nameof(option)); Options.Add(option); return this; @@ -251,10 +233,9 @@ public SlashCommandBuilder AddOptions(params SlashCommandOptionBuilder[] options throw new ArgumentNullException(nameof(options), "Options cannot be null!"); if (options.Length == 0) - throw new ArgumentException(nameof(options), "Options cannot be empty!"); + throw new ArgumentException("Options cannot be empty!", nameof(options)); - if (Options == null) - Options = new List(); + Options ??= new List(); if (Options.Count + options.Length > MaxOptionsCount) throw new ArgumentOutOfRangeException(nameof(options), $"Cannot have more than {MaxOptionsCount} options!"); @@ -290,14 +271,13 @@ public string Name get => _name; set { - if (value?.Length > SlashCommandBuilder.MaxNameLength) - throw new ArgumentException($"Name length must be less than or equal to {SlashCommandBuilder.MaxNameLength}"); - if (value?.Length < 1) - throw new ArgumentException("Name length must at least 1 characters in length"); - if (value != null) + { + Preconditions.AtLeast(value.Length, 1, nameof(value)); + Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxNameLength, nameof(value)); if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) - throw new ArgumentException("Option name cannot contain any special characters or whitespaces!"); + throw new ArgumentException("Option name cannot contain any special characters or whitespaces!", nameof(value)); + } _name = value; } @@ -311,10 +291,11 @@ public string Description get => _description; set { - if (value?.Length > SlashCommandBuilder.MaxDescriptionLength) - throw new ArgumentException($"Description length must be less than or equal to {SlashCommandBuilder.MaxDescriptionLength}"); - if (value?.Length < 1) - throw new ArgumentException("Description length must at least 1 character in length"); + if (value != null) + { + Preconditions.AtLeast(value.Length, 1, nameof(value)); + Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(value)); + } _description = value; } @@ -333,7 +314,7 @@ public string Description /// /// Gets or sets if the option is required. /// - public bool? Required { get; set; } = null; + public bool? Required { get; set; } /// /// Gets or sets whether or not this option supports autocomplete. @@ -364,19 +345,19 @@ public ApplicationCommandOptionProperties Build() bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; if (isSubType && (Options == null || !Options.Any())) - throw new ArgumentException(nameof(Options), "SubCommands/SubCommandGroups must have at least one option"); + throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option"); - if (!isSubType && (Options != null && Options.Any()) && Type != ApplicationCommandOptionType.SubCommand) - throw new ArgumentException(nameof(Options), $"Cannot have options on {Type} type"); + if (!isSubType && Options != null && Options.Any() && Type != ApplicationCommandOptionType.SubCommand) + throw new InvalidOperationException($"Cannot have options on {Type} type"); - return new ApplicationCommandOptionProperties() + return new ApplicationCommandOptionProperties { Name = Name, Description = Description, Default = Default, Required = Required, Type = Type, - Options = Options?.Count > 0 ? new List(Options.Select(x => x.Build())) : null, + Options = Options?.Count > 0 ? Options.Select(x => x.Build()).ToList() : new List(), Choices = Choices, Autocomplete = Autocomplete, ChannelTypes = ChannelTypes @@ -416,14 +397,10 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Preconditions.AtMost(description.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true - if (isDefault) - { - if (Options != null) - if (Options.Any(x => x.Default.HasValue && x.Default.Value)) - throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - } + if (isDefault && Options?.Any(x => x.Default == true) == true) + throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - SlashCommandOptionBuilder option = new SlashCommandOptionBuilder + var option = new SlashCommandOptionBuilder { Name = name, Description = description, @@ -432,8 +409,8 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Autocomplete = isAutocomplete, Options = options, Type = type, - Choices = choices != null ? new List(choices) : null, - ChannelTypes = channelTypes, + Choices = (choices ?? Array.Empty()).ToList(), + ChannelTypes = channelTypes }; return AddOption(option); @@ -445,14 +422,12 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption /// The current builder. public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) { - if (Options == null) - Options = new List(); + Options ??= new List(); if (Options.Count >= SlashCommandBuilder.MaxOptionsCount) - throw new ArgumentOutOfRangeException(nameof(Choices), $"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); + throw new InvalidOperationException($"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); - if (option == null) - throw new ArgumentNullException(nameof(option), "Option cannot be null"); + Preconditions.NotNull(option, nameof(option)); Options.Add(option); return this; @@ -466,19 +441,17 @@ public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) /// The current builder. public SlashCommandOptionBuilder AddChoice(string name, int value) { - if (Choices == null) - Choices = new List(); + Choices ??= new List(); if (Choices.Count >= MaxChoiceCount) - throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); + throw new InvalidOperationException($"Cannot add more than {MaxChoiceCount} choices!"); - if (name == null) - throw new ArgumentNullException($"{nameof(name)} cannot be null!"); + Preconditions.NotNull(name, nameof(name)); Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, 100, nameof(name)); - Choices.Add(new ApplicationCommandOptionChoiceProperties() + Choices.Add(new ApplicationCommandOptionChoiceProperties { Name = name, Value = value @@ -495,17 +468,13 @@ public SlashCommandOptionBuilder AddChoice(string name, int value) /// The current builder. public SlashCommandOptionBuilder AddChoice(string name, string value) { - if (Choices == null) - Choices = new List(); + Choices ??= new List(); if (Choices.Count >= MaxChoiceCount) - throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); - - if (name == null) - throw new ArgumentNullException($"{nameof(name)} cannot be null!"); + throw new InvalidOperationException($"Cannot add more than {MaxChoiceCount} choices!"); - if (value == null) - throw new ArgumentNullException($"{nameof(value)} cannot be null!"); + Preconditions.NotNull(name, nameof(name)); + Preconditions.NotNull(value, nameof(value)); Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, 100, nameof(name)); @@ -513,7 +482,7 @@ public SlashCommandOptionBuilder AddChoice(string name, string value) Preconditions.AtLeast(value.Length, 1, nameof(value)); Preconditions.AtMost(value.Length, 100, nameof(value)); - Choices.Add(new ApplicationCommandOptionChoiceProperties() + Choices.Add(new ApplicationCommandOptionChoiceProperties { Name = name, Value = value @@ -523,14 +492,13 @@ public SlashCommandOptionBuilder AddChoice(string name, string value) } /// - /// Adds a channnel type to the current option. + /// Adds a channel type to the current option. /// /// The to add. /// The current builder. public SlashCommandOptionBuilder AddChannelType(ChannelType channelType) { - if (ChannelTypes == null) - ChannelTypes = new List(); + ChannelTypes ??= new List(); ChannelTypes.Add(channelType); diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs index 542170b94d..6f320ffebe 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs b/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs index d24a38534c..82e6b15a49 100644 --- a/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs +++ b/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs @@ -1,15 +1,25 @@ namespace Discord { - /// Defines the types of formats for stickers. + /// + /// Defines the types of formats for stickers. + /// public enum StickerFormatType { - /// Default value for a sticker format type. + /// + /// Default value for a sticker format type. + /// None = 0, - /// The sticker format type is png. + /// + /// The sticker format type is png. + /// Png = 1, - /// The sticker format type is apng. + /// + /// The sticker format type is apng. + /// Apng = 2, - /// The sticker format type is lottie. - Lottie = 3, + /// + /// The sticker format type is lottie. + /// + Lottie = 3 } } diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs index 21d30456f0..347b0daaa8 100644 --- a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -24,18 +20,13 @@ public class TimestampTag /// /// Converts the current timestamp tag to the string representation supported by discord. /// - /// If the is null then the default 0 will be used. + /// If the is null then the default 0 will be used. /// /// - /// A string thats compatible in a discord message, ex: <t:1625944201:f> + /// A string that is compatible in a discord message, ex: <t:1625944201:f> public override string ToString() { - if (Time == null) - return $""; - - var offset = (DateTimeOffset)this.Time; - - return $""; + return $""; } /// @@ -46,7 +37,7 @@ public override string ToString() /// The newly create timestamp tag. public static TimestampTag FromDateTime(DateTime time, TimestampTagStyles style = TimestampTagStyles.ShortDateTime) { - return new TimestampTag() + return new TimestampTag { Style = style, Time = time diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs index 9c83a070e8..89f3c79b51 100644 --- a/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs index 5410075ba7..9a99b34f1d 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -18,6 +12,6 @@ public enum ApplicationCommandPermissionTarget /// /// The target of the permission is a user. /// - User = 2, + User = 2 } } diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs index 4be7244537..e738fec4c7 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs index ff06a43427..9cba38c802 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord diff --git a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs index a3c520b4ac..9deea753f7 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs @@ -1,6 +1,4 @@ -using System; using System.Collections.Generic; -using System.Threading.Tasks; namespace Discord { @@ -57,12 +55,12 @@ public interface ISticker : IStickerItem new StickerFormatType Format { get; } /// - /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts + /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts. /// bool? IsAvailable { get; } /// - /// Gets the standard sticker's sort order within its pack + /// Gets the standard sticker's sort order within its pack. /// int? SortOrder { get; } /// diff --git a/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs b/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs index 3825a27026..07ea63db98 100644 --- a/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs +++ b/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs index 76d424a470..c0c90aa69a 100644 --- a/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs +++ b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs @@ -1,16 +1,12 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { /// /// Represents a discord sticker pack. /// - /// The type of the stickers within the collection + /// The type of the stickers within the collection. public class StickerPack where TSticker : ISticker { /// diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs b/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs index 21267cdda3..5f51e5f3dd 100644 --- a/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs +++ b/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerType.cs b/src/Discord.Net.Core/Entities/Stickers/StickerType.cs index 35946df7a2..0db5507722 100644 --- a/src/Discord.Net.Core/Entities/Stickers/StickerType.cs +++ b/src/Discord.Net.Core/Entities/Stickers/StickerType.cs @@ -1,13 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// - /// Represents a type of sticker + /// Represents a type of sticker.. /// public enum StickerType { @@ -19,6 +13,6 @@ public enum StickerType /// /// Represents a sticker that was created within a guild. /// - Guild = 2, + Guild = 2 } } diff --git a/src/Discord.Net.Core/Net/ApplicationCommandException.cs b/src/Discord.Net.Core/Net/ApplicationCommandException.cs index acf19afe46..62c80b388d 100644 --- a/src/Discord.Net.Core/Net/ApplicationCommandException.cs +++ b/src/Discord.Net.Core/Net/ApplicationCommandException.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.Net { diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs index fd1642f5ce..ab651da0dc 100644 --- a/src/Discord.Net.Core/Utils/UrlValidation.cs +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -2,38 +2,38 @@ namespace Discord.Utils { - static class UrlValidation + internal static class UrlValidation { /// /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https - /// should be used for url buttons + /// should be used for url buttons. /// - /// url to validate before sending to Discord. + /// The URL to validate before sending to Discord. /// A URL must include a protocol (http or https). - /// true if url is valid by our standard, false if null, throws an error upon invalid + /// true if URL is valid by our standard, false if null, throws an error upon invalid. public static bool Validate(string url) { if (string.IsNullOrEmpty(url)) return false; - if(!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)))) + if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))) throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP or HTTPS)"); return true; } /// /// Not full URL validation right now. Just Ensures the protocol is either http, https, or discord - /// should be used everything other than url buttons + /// should be used everything other than url buttons. /// - /// the url to validate before sending to discord + /// The URL to validate before sending to discord. /// A URL must include a protocol (either http, https, or discord). - /// true if the url is valid by our standard, false if null, throws an error upon invalid + /// true if the URL is valid by our standard, false if null, throws an error upon invalid. public static bool ValidateButton(string url) { if (string.IsNullOrEmpty(url)) return false; - if(!((url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) || - (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) || - (url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase)))) + if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase))) throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP, HTTPS, or DISCORD)"); return true; } diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs index 92778849cf..9dede7e034 100644 --- a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -1,10 +1,5 @@ using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -26,7 +21,7 @@ internal ActionRowComponent(Discord.ActionRowComponent c) { ComponentType.Button => new ButtonComponent(x as Discord.ButtonComponent), ComponentType.SelectMenu => new SelectMenuComponent(x as Discord.SelectMenuComponent), - _ => null, + _ => null }; }).ToArray(); } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs index 9de2727066..81598b96ea 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index bb395df139..a98ed77d63 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System.Collections.Generic; namespace Discord.API { @@ -19,6 +18,5 @@ internal class ApplicationCommandInteractionData : IResolvable, IDiscordInteract [JsonProperty("type")] public ApplicationCommandType Type { get; set; } - } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs index 5f75c901f7..1e488c4e67 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System.Collections.Generic; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index f1c4cce424..67fce2bb55 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -40,7 +36,7 @@ public ApplicationCommandOption() { } public ApplicationCommandOption(IApplicationCommandOption cmd) { - Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice() + Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice { Name = x.Name, Value = x.Value @@ -50,42 +46,28 @@ public ApplicationCommandOption(IApplicationCommandOption cmd) ChannelTypes = cmd.ChannelTypes.ToArray(); - Required = cmd.IsRequired.HasValue - ? cmd.IsRequired.Value - : Optional.Unspecified; - Default = cmd.IsDefault.HasValue - ? cmd.IsDefault.Value - : Optional.Unspecified; + Required = cmd.IsRequired ?? Optional.Unspecified; + Default = cmd.IsDefault ?? Optional.Unspecified; Name = cmd.Name; Type = cmd.Type; Description = cmd.Description; } - public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties option) + public ApplicationCommandOption(ApplicationCommandOptionProperties option) { - Choices = option.Choices != null - ? option.Choices.Select(x => new ApplicationCommandOptionChoice() - { - Name = x.Name, - Value = x.Value - }).ToArray() - : Optional.Unspecified; - - Options = option.Options != null - ? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; - - Required = option.Required.HasValue - ? option.Required.Value - : Optional.Unspecified; - - Default = option.Default.HasValue - ? option.Default.Value - : Optional.Unspecified; - - ChannelTypes = option.ChannelTypes != null - ? option.ChannelTypes.ToArray() - : Optional.Unspecified; + Choices = option.Choices?.Select(x => new ApplicationCommandOptionChoice + { + Name = x.Name, + Value = x.Value + }).ToArray() ?? Optional.Unspecified; + + Options = option.Options?.Select(x => new ApplicationCommandOption(x)).ToArray() ?? Optional.Unspecified; + + Required = option.Required ?? Optional.Unspecified; + + Default = option.Default ?? Optional.Unspecified; + + ChannelTypes = option.ChannelTypes?.ToArray() ?? Optional.Unspecified; Name = option.Name; Type = option.Type; diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs index b847fceba3..6f84437f63 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs index 281ded90f2..8bde80f50b 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs index ea2cd4fd9d..2184a0e987 100644 --- a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs index 1ea3ad54a9..1419f93b66 100644 --- a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index 8870400061..7f737d7ad4 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -45,16 +40,16 @@ public ButtonComponent(Discord.ButtonComponent c) { if (c.Emote is Emote e) { - Emote = new Emoji() + Emote = new Emoji { Name = e.Name, Animated = e.Animated, - Id = e.Id, + Id = e.Id }; } else { - Emote = new Emoji() + Emote = new Emoji { Name = c.Emote.Name }; diff --git a/src/Discord.Net.Rest/API/Common/ChannelThreads.cs b/src/Discord.Net.Rest/API/Common/ChannelThreads.cs index eccac8e54c..94b2396bf1 100644 --- a/src/Discord.Net.Rest/API/Common/ChannelThreads.cs +++ b/src/Discord.Net.Rest/API/Common/ChannelThreads.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs index 3ab5ef6508..cc74299f74 100644 --- a/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -19,6 +14,6 @@ internal class GuildApplicationCommandPermission public ulong GuildId { get; set; } [JsonProperty("permissions")] - public API.ApplicationCommandPermissions[] Permissions { get; set; } + public ApplicationCommandPermissions[] Permissions { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/Interaction.cs b/src/Discord.Net.Rest/API/Common/Interaction.cs index ebbc5fc1b7..7f953384d8 100644 --- a/src/Discord.Net.Rest/API/Common/Interaction.cs +++ b/src/Discord.Net.Rest/API/Common/Interaction.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index 38b35c8ecd..b07ebff49e 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -11,7 +11,7 @@ internal class InteractionCallbackData public Optional Content { get; set; } [JsonProperty("embeds")] - public Optional Embeds { get; set; } + public Optional Embeds { get; set; } [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } @@ -20,9 +20,9 @@ internal class InteractionCallbackData public Optional Flags { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } [JsonProperty("choices")] - public Optional Choices { get; set; } + public Optional Choices { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/InteractionResponse.cs b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs index e50e8076ef..93d4cd307e 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionResponse.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs index 5dc81e61ed..a7760911cd 100644 --- a/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs b/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs index ddb9b0bc53..cc2f0d963c 100644 --- a/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs +++ b/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs index 16daa66ab6..0886a8fe90 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs index cb0e63035a..8f2424dbc8 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -36,23 +31,23 @@ public SelectMenuOption(Discord.SelectMenuOption option) { if (option.Emote is Emote e) { - Emoji = new Emoji() + Emoji = new Emoji { Name = e.Name, Animated = e.Animated, - Id = e.Id, + Id = e.Id }; } else { - Emoji = new Emoji() + Emoji = new Emoji { Name = option.Emote.Name }; } } - Default = option.Default.HasValue ? option.Default.Value : Optional.Unspecified; + Default = option.Default ?? Optional.Unspecified; } } } diff --git a/src/Discord.Net.Rest/API/Common/StageInstance.cs b/src/Discord.Net.Rest/API/Common/StageInstance.cs index 4cb5f58237..3ec6239497 100644 --- a/src/Discord.Net.Rest/API/Common/StageInstance.cs +++ b/src/Discord.Net.Rest/API/Common/StageInstance.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/Sticker.cs b/src/Discord.Net.Rest/API/Common/Sticker.cs index 45e6d18b37..b2c58d57c6 100644 --- a/src/Discord.Net.Rest/API/Common/Sticker.cs +++ b/src/Discord.Net.Rest/API/Common/Sticker.cs @@ -11,7 +11,7 @@ internal class Sticker [JsonProperty("name")] public string Name { get; set; } [JsonProperty("description")] - public string Desription { get; set; } + public string Description { get; set; } [JsonProperty("tags")] public Optional Tags { get; set; } [JsonProperty("type")] diff --git a/src/Discord.Net.Rest/API/Common/StickerItem.cs b/src/Discord.Net.Rest/API/Common/StickerItem.cs index 9ec0fb503b..4b24f711b3 100644 --- a/src/Discord.Net.Rest/API/Common/StickerItem.cs +++ b/src/Discord.Net.Rest/API/Common/StickerItem.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/StickerPack.cs b/src/Discord.Net.Rest/API/Common/StickerPack.cs index aa3314d7ce..3daaac5bfc 100644 --- a/src/Discord.Net.Rest/API/Common/StickerPack.cs +++ b/src/Discord.Net.Rest/API/Common/StickerPack.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ThreadMember.cs b/src/Discord.Net.Rest/API/Common/ThreadMember.cs index d8ce15e920..3e30d2c959 100644 --- a/src/Discord.Net.Rest/API/Common/ThreadMember.cs +++ b/src/Discord.Net.Rest/API/Common/ThreadMember.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -18,7 +14,7 @@ internal class ThreadMember [JsonProperty("join_timestamp")] public DateTimeOffset JoinTimestamp { get; set; } - [JsonProperty("presense")] + [JsonProperty("presence")] public Optional Presence { get; set; } [JsonProperty("member")] diff --git a/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs index 0bc068c1c6..39e9bd13ed 100644 --- a/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs +++ b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs index 7fe8b10ad7..82f0befcdc 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs @@ -1,10 +1,4 @@ -using Discord.API; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { @@ -30,7 +24,7 @@ public CreateApplicationCommandParams(string name, string description, Applicati { Name = name; Description = description; - Options = Optional.Create(options); + Options = Optional.Create(options); Type = type; } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs index 294f9e1a5c..a1d59bb51c 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs index 225caaaae3..b330a01111 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs @@ -1,12 +1,6 @@ using Discord.Net.Rest; -using Newtonsoft.Json; -using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord.API.Rest { internal class CreateStickerParams @@ -30,7 +24,7 @@ public IReadOnlyDictionary ToDictionary() if (File is FileStream fileStream) contentType = $"image/{Path.GetExtension(fileStream.Name)}"; - else if(FileName != null) + else if (FileName != null) contentType = $"image/{Path.GetExtension(FileName)}"; d["file"] = new MultipartFile(File, FileName ?? "image", contentType.Replace(".", "")); diff --git a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs index 2ed9466c07..5891c2c28e 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs index 5e42ee4c43..a557061f3b 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs index af8ee95d40..322875b8e8 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs index b2800a0662..a2c7cbee6b 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { @@ -19,7 +14,7 @@ internal class ModifyInteractionResponseParams public Optional AllowedMentions { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } [JsonProperty("flags")] public Optional Flags { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs index df73954de8..c09d8f2169 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs @@ -1,15 +1,9 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { internal class ModifyStageInstanceParams { - [JsonProperty("topic")] public Optional Topic { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs index 47331b5a06..bd538c72e1 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs index c62b3bfbbb..8c9216c3fc 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Discord; using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs index ed3701cad1..7810557ebf 100644 --- a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs +++ b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 4581219bbb..5debea27e8 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -194,17 +194,17 @@ public static async Task GetBotGatewayAsync(BaseDiscordClient client }; } - public static async Task> GetGlobalApplicationCommands(BaseDiscordClient client, + public static async Task> GetGlobalApplicationCommandsAsync(BaseDiscordClient client, RequestOptions options = null) { var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(options).ConfigureAwait(false); if (!response.Any()) - return new RestGlobalCommand[0]; + return Array.Empty(); return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); } - public static async Task GetGlobalApplicationCommand(BaseDiscordClient client, ulong id, + public static async Task GetGlobalApplicationCommandAsync(BaseDiscordClient client, ulong id, RequestOptions options = null) { var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options); @@ -212,55 +212,55 @@ public static async Task GetGlobalApplicationCommand(BaseDisc return model != null ? RestGlobalCommand.Create(client, model) : null; } - public static async Task> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, + public static async Task> GetGuildApplicationCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) { var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, options).ConfigureAwait(false); if (!response.Any()) - return new RestGuildCommand[0].ToImmutableArray(); + return ImmutableArray.Create(); return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); } - public static async Task GetGuildApplicationCommand(BaseDiscordClient client, ulong id, ulong guildId, + public static async Task GetGuildApplicationCommandAsync(BaseDiscordClient client, ulong id, ulong guildId, RequestOptions options = null) { var model = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, id, options); return model != null ? RestGuildCommand.Create(client, model, guildId) : null; } - public static async Task CreateGuildApplicationCommand(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties, + public static async Task CreateGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(client, guildId, properties, options); + var model = await InteractionHelper.CreateGuildCommandAsync(client, guildId, properties, options); return RestGuildCommand.Create(client, model, guildId); } - public static async Task CreateGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties properties, + public static async Task CreateGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGlobalCommand(client, properties, options); + var model = await InteractionHelper.CreateGlobalCommandAsync(client, properties, options); return RestGlobalCommand.Create(client, model); } - public static async Task> BulkOverwriteGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties[] properties, + public static async Task> BulkOverwriteGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGlobalCommands(client, properties, options); + var models = await InteractionHelper.BulkOverwriteGlobalCommandsAsync(client, properties, options); return models.Select(x => RestGlobalCommand.Create(client, x)).ToImmutableArray(); } - public static async Task> BulkOverwriteGuildApplicationCommand(BaseDiscordClient client, ulong guildId, + public static async Task> BulkOverwriteGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(client, guildId, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(client, guildId, properties, options); return models.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); } public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) => client.ApiClient.AddRoleAsync(guildId, userId, roleId, options); - + public static Task RemoveRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) => client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options); #endregion diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 1f23b92242..f88ad66990 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -534,7 +534,7 @@ public async Task GetActiveThreadsAsync(ulong channelId, Request var bucket = new BucketIds(channelId: channelId); - return await SendAsync("GET", () => $"channels/{channelId}/threads/active", bucket); + return await SendAsync("GET", () => $"channels/{channelId}/threads/active", bucket, options: options); } public async Task GetPublicArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, RequestOptions options = null) @@ -609,7 +609,6 @@ public async Task GetJoinedPrivateArchivedThreadsAsync(ulong cha #region Stage public async Task CreateStageInstanceAsync(CreateStageInstanceParams args, RequestOptions options = null) { - options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(); diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index c8f16a1f07..847ba68355 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -110,17 +110,17 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null => ClientHelper.GetWebhookAsync(this, id, options); public Task CreateGlobalCommand(ApplicationCommandProperties properties, RequestOptions options = null) - => ClientHelper.CreateGlobalApplicationCommand(this, properties, options); + => ClientHelper.CreateGlobalApplicationCommandAsync(this, properties, options); public Task CreateGuildCommand(ApplicationCommandProperties properties, ulong guildId, RequestOptions options = null) - => ClientHelper.CreateGuildApplicationCommand(this, guildId, properties, options); + => ClientHelper.CreateGuildApplicationCommandAsync(this, guildId, properties, options); public Task> GetGlobalApplicationCommands(RequestOptions options = null) - => ClientHelper.GetGlobalApplicationCommands(this, options); + => ClientHelper.GetGlobalApplicationCommandsAsync(this, options); public Task> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) - => ClientHelper.GetGuildApplicationCommands(this, guildId, options); + => ClientHelper.GetGuildApplicationCommandsAsync(this, guildId, options); public Task> BulkOverwriteGlobalCommands(ApplicationCommandProperties[] commandProperties, RequestOptions options = null) - => ClientHelper.BulkOverwriteGlobalApplicationCommand(this, commandProperties, options); + => ClientHelper.BulkOverwriteGlobalApplicationCommandAsync(this, commandProperties, options); public Task> BulkOverwriteGuildCommands(ApplicationCommandProperties[] commandProperties, ulong guildId, RequestOptions options = null) - => ClientHelper.BulkOverwriteGuildApplicationCommand(this, guildId, commandProperties, options); + => ClientHelper.BulkOverwriteGuildApplicationCommandAsync(this, guildId, commandProperties, options); public Task> BatchEditGuildCommandPermissions(ulong guildId, IDictionary permissions, RequestOptions options = null) => InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options); public Task DeleteAllGlobalCommandsAsync(RequestOptions options = null) @@ -231,7 +231,7 @@ async Task> IDiscordClient.GetGlobalApp => await GetGlobalApplicationCommands(options).ConfigureAwait(false); /// async Task IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) - => await ClientHelper.GetGlobalApplicationCommand(this, id, options).ConfigureAwait(false); + => await ClientHelper.GetGlobalApplicationCommandAsync(this, id, options).ConfigureAwait(false); #endregion } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs index 00571c65cd..3700796e63 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord.Rest { /// @@ -28,9 +22,9 @@ public class StageInfo internal StageInfo(IUser user, StagePrivacyLevel? level, string topic) { - this.Topic = topic; - this.PrivacyLevel = level; - this.User = user; + Topic = topic; + PrivacyLevel = level; + User = user; } } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs index d2e2ffdc87..eac99e87bc 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; - using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs index 0681628b40..d22c56010a 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; - using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs index 0e26a829f5..93a0344b26 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs index 721e2d7809..c01df96fdf 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -1,10 +1,8 @@ +using Discord.API; +using Discord.API.Rest; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; -using StageInstance = Discord.API.StageInstance; namespace Discord.Rest { @@ -25,12 +23,9 @@ public class RestStageChannel : RestVoiceChannel, IStageChannel /// public bool IsLive { get; private set; } internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) - : base(discord, guild, id) - { - - } + : base(discord, guild, id) { } - internal static new RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model) + internal new static RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model) { var entity = new RestStageChannel(discord, guild, model.Id); entity.Update(model); @@ -65,7 +60,7 @@ public async Task ModifyInstanceAsync(Action func, Requ /// public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null) { - var args = new API.Rest.CreateStageInstanceParams() + var args = new CreateStageInstanceParams { ChannelId = Id, PrivacyLevel = privacyLevel, @@ -82,7 +77,7 @@ public async Task StopStageAsync(RequestOptions options = null) { await Discord.ApiClient.DeleteStageInstanceAsync(Id, options); - Update(null, false); + Update(null); } /// @@ -98,7 +93,7 @@ public override async Task UpdateAsync(RequestOptions options = null) /// public Task RequestToSpeakAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, RequestToSpeakTimestamp = DateTimeOffset.UtcNow @@ -109,7 +104,7 @@ public Task RequestToSpeakAsync(RequestOptions options = null) /// public Task BecomeSpeakerAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -120,7 +115,7 @@ public Task BecomeSpeakerAsync(RequestOptions options = null) /// public Task StopSpeakingAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = true @@ -131,7 +126,7 @@ public Task StopSpeakingAsync(RequestOptions options = null) /// public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -143,7 +138,7 @@ public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) /// public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = true diff --git a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs index 05117be06e..63071b9a55 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.IO; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; @@ -42,10 +40,7 @@ public class RestThreadChannel : RestTextChannel, IThreadChannel public ulong ParentChannelId { get; private set; } internal RestThreadChannel(BaseDiscordClient discord, IGuild guild, ulong id) - : base(discord, guild, id) - { - - } + : base(discord, guild, id) { } internal new static RestThreadChannel Create(BaseDiscordClient discord, IGuild guild, Model model) { @@ -66,7 +61,6 @@ internal override void Update(Model model) AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); - } MemberCount = model.MemberCount.GetValueOrDefault(0); @@ -110,107 +104,106 @@ public override async Task ModifyAsync(Action func, Reque /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task GetCategoryAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetInvitesAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override OverwritePermissions? GetPermissionOverwrite(IRole role) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override OverwritePermissions? GetPermissionOverwrite(IUser user) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task GetWebhookAsync(ulong id, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetWebhooksAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override IReadOnlyCollection PermissionOverwrites - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); - /// public Task JoinAsync(RequestOptions options = null) => Discord.ApiClient.JoinThreadAsync(Id, options); diff --git a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs index f1bf238bce..69eb0d7681 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs @@ -1,8 +1,6 @@ using Discord.API.Rest; using System; -using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; @@ -14,22 +12,22 @@ public static async Task CreateThreadAsync(BaseDiscordClient client, ITex ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) { if (autoArchiveDuration == ThreadArchiveDuration.OneWeek && !channel.Guild.Features.Contains("SEVEN_DAY_THREAD_ARCHIVE")) - throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!"); + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !channel.Guild.Features.Contains("THREE_DAY_THREAD_ARCHIVE")) - throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!"); + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); if (type == ThreadType.PrivateThread && !channel.Guild.Features.Contains("PRIVATE_THREADS")) - throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!"); + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!", nameof(type)); - var args = new StartThreadParams() + var args = new StartThreadParams { Name = name, Duration = autoArchiveDuration, Type = type }; - Model model = null; + Model model; if (message != null) model = await client.ApiClient.StartThreadAsync(channel.Id, message.Id, args, options).ConfigureAwait(false); @@ -45,7 +43,7 @@ public static async Task ModifyAsync(IThreadChannel channel, BaseDiscordC { var args = new TextChannelProperties(); func(args); - var apiArgs = new API.Rest.ModifyThreadParams + var apiArgs = new ModifyThreadParams { Name = args.Name, Archived = args.Archived, @@ -63,7 +61,7 @@ public static async Task GetUsersAsync(IThreadChannel channel, return users.Select(x => RestThreadUser.Create(client, channel.Guild, x, channel)).ToArray(); } - public static async Task GetUserAsync(ulong userdId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) - => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userdId); + public static async Task GetUserAsync(ulong userId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) + => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userId); } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 7a14fa9df9..8b0659baf9 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -922,7 +922,7 @@ public Task> GetWebhooksAsync(RequestOptions op /// of application commands found within the guild. /// public async Task> GetApplicationCommandsAsync (RequestOptions options = null) - => await ClientHelper.GetGuildApplicationCommands(Discord, Id, options).ConfigureAwait(false); + => await ClientHelper.GetGuildApplicationCommandsAsync(Discord, Id, options).ConfigureAwait(false); /// /// Gets an application command within this guild with the specified id. /// @@ -933,7 +933,7 @@ public async Task> GetApplicationCommandsA /// if found, otherwise . /// public async Task GetApplicationCommandAsync(ulong id, RequestOptions options = null) - => await ClientHelper.GetGuildApplicationCommand(Discord, id, Id, options); + => await ClientHelper.GetGuildApplicationCommandAsync(Discord, id, Id, options); /// /// Creates an application command within this guild. /// @@ -944,7 +944,7 @@ public async Task GetApplicationCommandAsync(ulong id, Request /// public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options); + var model = await InteractionHelper.CreateGuildCommandAsync(Discord, Id, properties, options); return RestGuildCommand.Create(Discord, model, Id); } @@ -959,7 +959,7 @@ public async Task CreateApplicationCommandAsync(ApplicationCom public async Task> BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(Discord, Id, properties, options); return models.Select(x => RestGuildCommand.Create(Discord, x, Id)).ToImmutableArray(); } diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 760fc8300d..f1b1e67bd6 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Threading.Tasks; namespace Discord.Rest @@ -13,15 +14,15 @@ internal static class InteractionHelper #region InteractionHelper public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) { - return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, new CreateApplicationCommandParams[0], options); + return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, Array.Empty(), options); } public static Task DeleteAllGlobalCommandsAsync(BaseDiscordClient client, RequestOptions options = null) { - return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(new CreateApplicationCommandParams[0], options); + return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(Array.Empty(), options); } - public static Task SendInteractionResponse(BaseDiscordClient client, InteractionResponse response, + public static Task SendInteractionResponseAsync(BaseDiscordClient client, InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { return client.ApiClient.CreateInteractionResponseAsync(response, interactionId, interactionToken, options); @@ -39,7 +40,7 @@ public static async Task SendFollowupAsync(BaseDiscordClien { var model = await client.ApiClient.CreateInteractionFollowupMessageAsync(args, token, options).ConfigureAwait(false); - RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); + var entity = RestFollowupMessage.Create(client, model, token, channel); return entity; } #endregion @@ -50,22 +51,21 @@ public static async Task GetGlobalCommandAsync(BaseDiscordCli { var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); - return RestGlobalCommand.Create(client, model); } - public static Task CreateGlobalCommand(BaseDiscordClient client, + public static Task CreateGlobalCommandAsync(BaseDiscordClient client, Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); func((TArg)args); - return CreateGlobalCommand(client, (TArg)args, options); + return CreateGlobalCommandAsync(client, (TArg)args, options); } - public static async Task CreateGlobalCommand(BaseDiscordClient client, + public static async Task CreateGlobalCommandAsync(BaseDiscordClient client, ApplicationCommandProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -81,25 +81,25 @@ public static async Task CreateGlobalCommand(BaseDiscordClie model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); } - public static async Task BulkOverwriteGlobalCommands(BaseDiscordClient client, + public static async Task BulkOverwriteGlobalCommandsAsync(BaseDiscordClient client, ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); - List models = new List(); + var models = new List(); foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -115,28 +115,28 @@ public static async Task BulkOverwriteGlobalCommands(BaseD model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } models.Add(model); } - return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false); + return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false); } - public static async Task> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, + public static async Task> BulkOverwriteGuildCommandsAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); - List models = new List(); + var models = new List(); foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -152,8 +152,8 @@ public static async Task> BulkOverwriteG model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } models.Add(model); @@ -180,15 +180,15 @@ private static TArg GetApplicationCommandProperties(IApplicationCommand co } } - public static Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, + public static Task ModifyGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var arg = GetApplicationCommandProperties(command); func(arg); - return ModifyGlobalCommand(client, command, arg, options); + return ModifyGlobalCommandAsync(client, command, arg, options); } - public static async Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, + public static async Task ModifyGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, ApplicationCommandProperties args, RequestOptions options = null) { if (args.Name.IsSpecified) @@ -197,7 +197,7 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie Preconditions.AtLeast(args.Name.Value.Length, 1, nameof(args.Name)); } - var model = new Discord.API.Rest.ModifyApplicationCommandParams() + var model = new ModifyApplicationCommandParams { Name = args.Name, DefaultPermission = args.DefaultPermission.IsSpecified @@ -205,7 +205,7 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie : Optional.Unspecified }; - if(args is SlashCommandProperties slashProps) + if (args is SlashCommandProperties slashProps) { if (slashProps.Description.IsSpecified) { @@ -222,15 +222,14 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie model.Description = slashProps.Description; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); } - - public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null) + public static async Task DeleteGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); @@ -240,18 +239,18 @@ public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicat #endregion #region Guild Commands - public static Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static Task CreateGuildCommandAsync(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); func((TArg)args); - return CreateGuildCommand(client, guildId, (TArg)args, options); + return CreateGuildCommandAsync(client, guildId, (TArg)args, options); } - public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static async Task CreateGuildCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties arg, RequestOptions options = null) { - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -267,25 +266,25 @@ public static async Task CreateGuildCommand(BaseDiscordClien model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); } - public static Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, + public static Task ModifyGuildCommandAsync(BaseDiscordClient client, IApplicationCommand command, ulong guildId, Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var arg = GetApplicationCommandProperties(command); func(arg); - return ModifyGuildCommand(client, command, guildId, arg, options); + return ModifyGuildCommandAsync(client, command, guildId, arg, options); } - public static async Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, + public static async Task ModifyGuildCommandAsync(BaseDiscordClient client, IApplicationCommand command, ulong guildId, ApplicationCommandProperties arg, RequestOptions options = null) { - var model = new ModifyApplicationCommandParams() + var model = new ModifyApplicationCommandParams { Name = arg.Name, DefaultPermission = arg.DefaultPermission.IsSpecified @@ -300,14 +299,14 @@ public static async Task ModifyGuildCommand(BaseDiscordClien model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.ModifyGuildApplicationCommandAsync(model, guildId, command.Id, options).ConfigureAwait(false); } - public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) + public static async Task DeleteGuildCommandAsync(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); @@ -315,21 +314,16 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); } - public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null) + public static Task DeleteUnknownApplicationCommandAsync(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null) { - if (guildId.HasValue) - { - return DeleteGuildCommand(client, guildId.Value, command, options); - } - else - { - return DeleteGlobalCommand(client, command, options); - } + return guildId.HasValue + ? DeleteGuildCommandAsync(client, guildId.Value, command, options) + : DeleteGlobalCommandAsync(client, command, options); } #endregion #region Responses - public static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, + public static async Task ModifyFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, Action func, RequestOptions options = null) { var args = new MessageProperties(); @@ -359,21 +353,19 @@ public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulo Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); - var apiArgs = new API.Rest.ModifyInteractionResponseParams + var apiArgs = new ModifyInteractionResponseParams { Content = args.Content, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified }; return await client.ApiClient.ModifyInteractionFollowupMessageAsync(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); } - - public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) + public static async Task DeleteFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); - - public static async Task ModifyInteractionResponse(BaseDiscordClient client, string token, Action func, + public static async Task ModifyInteractionResponseAsync(BaseDiscordClient client, string token, Action func, RequestOptions options = null) { var args = new MessageProperties(); @@ -415,25 +407,24 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl return await client.ApiClient.ModifyInteractionResponseAsync(apiArgs, token, options).ConfigureAwait(false); } - public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) + public static async Task DeleteInteractionResponseAsync(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); - public static Task SendAutocompleteResult(BaseDiscordClient client, IEnumerable result, ulong interactionId, + public static Task SendAutocompleteResultAsync(BaseDiscordClient client, IEnumerable result, ulong interactionId, string interactionToken, RequestOptions options) { - if (result == null) - result = new AutocompleteResult[0]; + result ??= Array.Empty(); Preconditions.AtMost(result.Count(), 20, nameof(result), "A maximum of 20 choices are allowed!"); - var apiArgs = new InteractionResponse() + var apiArgs = new InteractionResponse { Type = InteractionResponseType.ApplicationCommandAutocompleteResult, - Data = new InteractionCallbackData() + Data = new InteractionCallbackData { Choices = result.Any() - ? result.Select(x => new API.ApplicationCommandOptionChoice() { Name = x.Name, Value = x.Value }).ToArray() - : new ApplicationCommandOptionChoice[0] + ? result.Select(x => new ApplicationCommandOptionChoice { Name = x.Name, Value = x.Value }).ToArray() + : Array.Empty() } }; @@ -448,7 +439,7 @@ public static async Task> var models = await client.ApiClient.GetGuildApplicationCommandPermissionsAsync(guildId, options); return models.Select(x => new GuildApplicationCommandPermission(x.Id, x.ApplicationId, guildId, x.Permissions.Select( - y => new Discord.ApplicationCommandPermission(y.Id, y.Type, y.Permission)) + y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)) .ToArray()) ).ToArray(); } @@ -464,7 +455,7 @@ public static async Task GetGuildCommandPermi } catch (HttpException x) { - if (x.HttpCode == System.Net.HttpStatusCode.NotFound) + if (x.HttpCode == HttpStatusCode.NotFound) return null; throw; } @@ -477,11 +468,11 @@ public static async Task ModifyGuildCommandPe Preconditions.AtMost(args.Length, 10, nameof(args)); Preconditions.AtLeast(args.Length, 0, nameof(args)); - List permissionsList = new List(); + var permissionsList = new List(); foreach (var arg in args) { - var permissions = new ApplicationCommandPermissions() + var permissions = new ApplicationCommandPermissions { Id = arg.TargetId, Permission = arg.Permission, @@ -491,7 +482,7 @@ public static async Task ModifyGuildCommandPe permissionsList.Add(permissions); } - ModifyGuildApplicationCommandPermissionsParams model = new ModifyGuildApplicationCommandPermissionsParams() + var model = new ModifyGuildApplicationCommandPermissionsParams { Permissions = permissionsList.ToArray() }; @@ -508,16 +499,16 @@ public static async Task> Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(args.Count, 0, nameof(args)); - List models = new List(); + var models = new List(); foreach (var arg in args) { Preconditions.AtMost(arg.Value.Length, 10, nameof(args)); - var model = new ModifyGuildApplicationCommandPermissions() + var model = new ModifyGuildApplicationCommandPermissions { Id = arg.Key, - Permissions = arg.Value.Select(x => new ApplicationCommandPermissions() + Permissions = arg.Value.Select(x => new ApplicationCommandPermissions { Id = x.TargetId, Permission = x.Permission, diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index 0ef365eb7b..c3edaf6ff8 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ApplicationCommand; @@ -38,21 +37,13 @@ public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); internal RestApplicationCommand(BaseDiscordClient client, ulong id) - : base(client, id) - { - - } + : base(client, id) { } internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, ulong? guildId) { - if (guildId.HasValue) - { - return RestGuildCommand.Create(client, model, guildId.Value); - } - else - { - return RestGlobalCommand.Create(client, model); - } + return guildId.HasValue + ? RestGuildCommand.Create(client, model, guildId.Value) + : RestGlobalCommand.Create(client, model); } internal virtual void Update(Model model) @@ -64,7 +55,7 @@ internal virtual void Update(Model model) IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() + ? model.Options.Value.Select(RestApplicationCommandOption.Create).ToImmutableArray() : ImmutableArray.Create(); } @@ -76,7 +67,7 @@ public Task ModifyAsync(Action func, RequestOption { return ModifyAsync(func, options); } - + /// public abstract Task ModifyAsync(Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties; diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs index cd1f737684..a40491a2c4 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOptionChoice; namespace Discord.Rest diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index f3487ae67e..460ff872a0 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOption; namespace Discord.Rest @@ -66,7 +63,7 @@ internal void Update(Model model) IsRequired = model.Required.Value; Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => Create(x)).ToImmutableArray() + ? model.Options.Value.Select(Create).ToImmutableArray() : ImmutableArray.Create(); Choices = model.Choices.IsSpecified diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs index bee1f39cd1..c319bcf349 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ApplicationCommand; @@ -13,10 +10,7 @@ namespace Discord.Rest public class RestGlobalCommand : RestApplicationCommand { internal RestGlobalCommand(BaseDiscordClient client, ulong id) - : base(client, id) - { - - } + : base(client, id) { } internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) { @@ -27,7 +21,7 @@ internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) /// public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGlobalCommand(Discord, this).ConfigureAwait(false); + => await InteractionHelper.DeleteGlobalCommandAsync(Discord, this).ConfigureAwait(false); /// /// Modifies this . @@ -39,7 +33,7 @@ public override async Task DeleteAsync(RequestOptions options = null) /// public override async Task ModifyAsync(Action func, RequestOptions options = null) { - var cmd = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + var cmd = await InteractionHelper.ModifyGlobalCommandAsync(Discord, this, func, options).ConfigureAwait(false); Update(cmd); } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index fb41c18127..00804e57ee 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ApplicationCommand; @@ -32,7 +29,7 @@ internal static RestGuildCommand Create(BaseDiscordClient client, Model model, u /// public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGuildCommand(Discord, GuildId, this).ConfigureAwait(false); + => await InteractionHelper.DeleteGuildCommandAsync(Discord, GuildId, this).ConfigureAwait(false); /// /// Modifies this . @@ -44,7 +41,7 @@ public override async Task DeleteAsync(RequestOptions options = null) /// public override async Task ModifyAsync(Action func, RequestOptions options = null) { - var model = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyGuildCommandAsync(Discord, this, GuildId, func, options).ConfigureAwait(false); Update(model); } diff --git a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs index e0d3900fa9..6fd0f7700a 100644 --- a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Sticker; diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 8de9ccf32e..01a861cc54 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -84,7 +84,7 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie { Content = args.Content, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, Flags = args.Flags, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, }; @@ -151,7 +151,7 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, }; return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs index f1a03a3847..693d36e565 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs @@ -1,11 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Message; - namespace Discord.Rest { /// @@ -39,7 +35,7 @@ internal static RestFollowupMessage Create(BaseDiscordClient discord, Model mode /// /// A task that represents the asynchronous delete operation. public Task DeleteAsync() - => InteractionHelper.DeleteFollowupMessage(Discord, this); + => InteractionHelper.DeleteFollowupMessageAsync(Discord, this); /// /// Modifies this interaction followup message. @@ -65,12 +61,12 @@ public Task DeleteAsync() { try { - var model = await InteractionHelper.ModifyFollowupMessage(Discord, this, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyFollowupMessageAsync(Discord, this, func, options).ConfigureAwait(false); Update(model); } - catch (Discord.Net.HttpException x) + catch (Net.HttpException x) { - if(x.HttpCode == System.Net.HttpStatusCode.NotFound) + if (x.HttpCode == System.Net.HttpStatusCode.NotFound) { throw new InvalidOperationException("The token of this message has expired!", x); } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs index 51fc194834..26beb03b60 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs @@ -35,7 +35,7 @@ internal static RestInteractionMessage Create(BaseDiscordClient discord, Model m /// /// A task that represents the asynchronous delete operation. public Task DeleteAsync() - => InteractionHelper.DeletedInteractionResponse(Discord, this); + => InteractionHelper.DeleteInteractionResponseAsync(Discord, this); /// /// Modifies this interaction response @@ -61,10 +61,10 @@ public Task DeleteAsync() { try { - var model = await InteractionHelper.ModifyInteractionResponse(Discord, Token, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyInteractionResponseAsync(Discord, Token, func, options).ConfigureAwait(false); Update(model); } - catch (Discord.Net.HttpException x) + catch (Net.HttpException x) { if (x.HttpCode == System.Net.HttpStatusCode.NotFound) { diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index 75bc9bd384..accdbe66a1 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -43,8 +44,8 @@ internal void Update(Model model) { PackId = model.PackId; Name = model.Name; - Description = model.Desription; - Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0]; + Description = model.Description; + Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : Array.Empty(); Type = model.Type; SortOrder = model.SortValue; IsAvailable = model.Available; diff --git a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs index f1bcb99513..0ce4f634b9 100644 --- a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs +++ b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.StickerItem; @@ -31,15 +27,13 @@ internal StickerItem(BaseDiscordClient client, Model model) /// /// A task representing the download operation, the result of the task is a sticker object. /// - public async Task ResolveStickerAsync() { var model = await Discord.ApiClient.GetStickerAsync(Id); - if (model.GuildId.IsSpecified) - return CustomSticker.Create(Discord, model, model.GuildId.Value, model.User.IsSpecified ? model.User.Value.Id : null); - else - return Sticker.Create(Discord, model); + return model.GuildId.IsSpecified + ? CustomSticker.Create(Discord, model, model.GuildId.Value, model.User.IsSpecified ? model.User.Value.Id : null) + : Sticker.Create(Discord, model); } } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs index 4dd7f7aafc..82830dafd1 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ThreadMember; diff --git a/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs index 8159165c9c..ca82146825 100644 --- a/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs @@ -1,10 +1,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.Net.Converters { diff --git a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs index 2203008d6c..0bf11a3692 100644 --- a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs @@ -1,10 +1,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.Net.Converters { diff --git a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs index 9d41ecf488..91dcbde112 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs @@ -1,13 +1,8 @@ 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 ApplicationCommandCreatedUpdatedEvent : API.ApplicationCommand + internal class ApplicationCommandCreatedUpdatedEvent : ApplicationCommand { [JsonProperty("guild_id")] public Optional GuildId { get; set; } diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs index 8f3ba683b9..f0ecd3a4fb 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Gateway { diff --git a/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs index ab79892687..5084f6c958 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Gateway { diff --git a/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs b/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs index b6acba6ae7..83d2c0edda 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Gateway { diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index def163db6a..264151e947 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -434,7 +434,7 @@ public async Task> GetGlobalApplic public async Task CreateGlobalApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGlobalCommand(this, properties, options).ConfigureAwait(false); + var model = await InteractionHelper.CreateGlobalCommandAsync(this, properties, options).ConfigureAwait(false); var entity = State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(this, model)); @@ -446,7 +446,7 @@ public async Task CreateGlobalApplicationCommandAsync( public async Task> BulkOverwriteGlobalApplicationCommandsAsync( ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGlobalCommands(this, properties, options); + var models = await InteractionHelper.BulkOverwriteGlobalCommandsAsync(this, properties, options); var entities = models.Select(x => SocketApplicationCommand.Create(this, x)); diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index a8c0101e77..91bca50542 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; using StageInstance = Discord.API.StageInstance; @@ -25,7 +24,7 @@ public class SocketStageChannel : SocketVoiceChannel, IStageChannel public bool? IsDiscoverableDisabled { get; private set; } /// - public bool IsLive { get; private set; } = false; + public bool IsLive { get; private set; } /// /// Returns if the current user is a speaker within the stage, otherwise . @@ -41,12 +40,8 @@ public IReadOnlyCollection Speakers internal new SocketStageChannel Clone() => MemberwiseClone() as SocketStageChannel; - internal SocketStageChannel(DiscordSocketClient discord, ulong id, SocketGuild guild) - : base(discord, id, guild) - { - - } + : base(discord, id, guild) { } internal new static SocketStageChannel Create(SocketGuild guild, ClientState state, Model model) { @@ -55,11 +50,6 @@ internal SocketStageChannel(DiscordSocketClient discord, ulong id, SocketGuild g return entity; } - internal override void Update(ClientState state, Model model) - { - base.Update(state, model); - } - internal void Update(StageInstance model, bool isLive = false) { IsLive = isLive; @@ -80,11 +70,11 @@ internal void Update(StageInstance model, bool isLive = false) /// public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null) { - var args = new API.Rest.CreateStageInstanceParams() + var args = new API.Rest.CreateStageInstanceParams { ChannelId = Id, Topic = topic, - PrivacyLevel = privacyLevel, + PrivacyLevel = privacyLevel }; var model = await Discord.ApiClient.CreateStageInstanceAsync(args, options).ConfigureAwait(false); @@ -105,13 +95,13 @@ public async Task StopStageAsync(RequestOptions options = null) { await Discord.ApiClient.DeleteStageInstanceAsync(Id, options); - Update(null, false); + Update(null); } /// public Task RequestToSpeakAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, RequestToSpeakTimestamp = DateTimeOffset.UtcNow @@ -122,7 +112,7 @@ public Task RequestToSpeakAsync(RequestOptions options = null) /// public Task BecomeSpeakerAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -133,7 +123,7 @@ public Task BecomeSpeakerAsync(RequestOptions options = null) /// public Task StopSpeakingAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = true @@ -144,7 +134,7 @@ public Task StopSpeakingAsync(RequestOptions options = null) /// public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -156,7 +146,7 @@ public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) /// public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = true diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 3fd47ec872..7fcafc14a1 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -5,11 +5,9 @@ using System.Diagnostics; using System.IO; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; using ThreadMember = Discord.API.ThreadMember; -using MemberUpdates = Discord.API.Gateway.ThreadMembersUpdated; using System.Collections.Concurrent; namespace Discord.WebSocket @@ -72,14 +70,13 @@ public bool IsPrivateThread public new IReadOnlyCollection Users => _members.Values.ToImmutableArray(); - - private ConcurrentDictionary _members; + private readonly ConcurrentDictionary _members; private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; - private bool _usersDownloaded = false; + private bool _usersDownloaded; - private object _downloadLock = new object(); + private readonly object _downloadLock = new object(); internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) : base(discord, id, guild) @@ -103,12 +100,12 @@ internal override void Update(ClientState state, Model model) Type = (ThreadType)model.Type; MessageCount = model.MessageCount.GetValueOrDefault(-1); MemberCount = model.MemberCount.GetValueOrDefault(-1); - + if (model.ThreadMetadata.IsSpecified) { IsArchived = model.ThreadMetadata.Value.Archived; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; - AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; + AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } @@ -173,12 +170,11 @@ public async Task> GetUsersAsync(RequestOp return Users; } - /// /// Downloads all users that have access to this thread. /// /// The options to be used when sending the request. - /// A task representing the asyncronous download operation. + /// A task representing the asynchronous download operation. public async Task DownloadUsersAsync(RequestOptions options = null) { var users = await Discord.ApiClient.ListThreadMembersAsync(Id, options); @@ -193,7 +189,7 @@ public async Task DownloadUsersAsync(RequestOptions options = null) } } } - + internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; /// @@ -210,7 +206,7 @@ public Task LeaveAsync(RequestOptions options = null) /// The to add. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of adding a member to a thread. + /// A task that represents the asynchronous operation of adding a member to a thread. /// public Task AddUserAsync(IGuildUser user, RequestOptions options = null) => Discord.ApiClient.AddThreadMemberAsync(Id, user.Id, options); @@ -221,60 +217,59 @@ public Task AddUserAsync(IGuildUser user, RequestOptions options = null) /// The to remove from this thread. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of removing a user from this thread. + /// A task that represents the asynchronous operation of removing a user from this thread. /// public Task RemoveUserAsync(IGuildUser user, RequestOptions options = null) => Discord.ApiClient.RemoveThreadMemberAsync(Id, user.Id, options); - /// /// /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetInvitesAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// @@ -295,14 +290,14 @@ public override Task> GetInvitesAsync(Reque /// This method is not supported in threads. /// public override Task GetWebhookAsync(ulong id, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetWebhooksAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// @@ -316,28 +311,28 @@ public override Task ModifyAsync(Action func, RequestOpti /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override IReadOnlyCollection PermissionOverwrites - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task SyncPermissionsAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); string IChannel.Name => Name; } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 4f595539e8..5421718cbb 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -906,7 +906,7 @@ public async ValueTask GetApplicationCommandAsync(ulon /// public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options); + var model = await InteractionHelper.CreateGuildCommandAsync(Discord, Id, properties, options); var entity = Discord.State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(Discord, model)); @@ -926,7 +926,7 @@ public async Task CreateApplicationCommandAsync(Applic public async Task> BulkOverwriteApplicationCommandAsync(ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(Discord, Id, properties, options); var entities = models.Select(x => SocketApplicationCommand.Create(Discord, x)); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs index efd99c2c44..6d0f5ced04 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs @@ -1,7 +1,3 @@ -using Discord.Rest; -using System; -using System.Linq; -using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -20,8 +16,8 @@ public class SocketMessageCommand : SocketCommandBase internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -31,7 +27,7 @@ internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMe Data = SocketMessageCommandData.Create(client, dataModel, model.Id, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketMessageCommand(client, model, channel); entity.Update(model); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs index a61279db97..a4e162039a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs @@ -1,7 +1,3 @@ -using Discord.Rest; -using System; -using System.Linq; -using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -20,8 +16,8 @@ public class SocketUserCommand : SocketCommandBase internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -31,11 +27,11 @@ internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessa Data = SocketUserCommandData.Create(client, dataModel, model.Id, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketUserCommand(client, model, channel); entity.Update(model); return entity; - } + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 2e48b6dd9c..624861182d 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -18,7 +18,7 @@ public class SocketMessageComponent : SocketInteraction /// /// The data received with this interaction, contains the button that was clicked. /// - new public SocketMessageComponentData Data { get; } + public new SocketMessageComponentData Data { get; } /// /// The message that contained the trigger for this interaction. @@ -28,20 +28,19 @@ public class SocketMessageComponent : SocketInteraction internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; Data = new SocketMessageComponentData(dataModel); } - new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketMessageComponent(client, model, channel); entity.Update(model); return entity; } - internal override void Update(Model model) { base.Update(model); @@ -69,7 +68,6 @@ internal override void Update(Model model) } } } - /// public override async Task RespondAsync( string text = null, @@ -90,7 +88,7 @@ public override async Task RespondAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -115,7 +113,7 @@ public override async Task RespondAsync( { Content = text ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel(), - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), TTS = isTTS, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified } @@ -124,7 +122,7 @@ public override async Task RespondAsync( if (ephemeral) response.Data.Value.Flags = MessageFlags.Ephemeral; - await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options); } /// @@ -197,13 +195,13 @@ public async Task UpdateAsync(Action func, RequestOptions opt AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Components = args.Components.IsSpecified - ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] + ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified } }; - await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options); } /// @@ -226,15 +224,15 @@ public override async Task FollowupAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); var args = new API.Rest.CreateWebhookMessageParams { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; if (ephemeral) @@ -265,7 +263,7 @@ public override async Task FollowupWithFileAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNull(fileStream, nameof(fileStream), "File Stream must have data"); Preconditions.NotNullOrWhitespace(fileName, nameof(fileName), "File Name must not be empty or null"); @@ -274,7 +272,7 @@ public override async Task FollowupWithFileAsync( Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = fileStream is not null ? new MultipartFile(fileStream, fileName) : Optional.Unspecified }; @@ -307,7 +305,7 @@ public override async Task FollowupWithFileAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNullOrWhitespace(filePath, nameof(filePath), "Path must exist"); var args = new API.Rest.CreateWebhookMessageParams @@ -315,7 +313,7 @@ public override async Task FollowupWithFileAsync( Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = !string.IsNullOrEmpty(filePath) ? new MultipartFile(new MemoryStream(File.ReadAllBytes(filePath), false), fileName) : Optional.Unspecified }; @@ -336,11 +334,10 @@ public override async Task FollowupWithFileAsync( /// public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = null) { - var response = new API.InteractionResponse() + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, - Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified - + Data = ephemeral ? new API.InteractionCallbackData { Flags = MessageFlags.Ephemeral } : Optional.Unspecified }; return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); @@ -349,11 +346,10 @@ public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = n /// public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { - var response = new API.InteractionResponse() + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredUpdateMessage, - Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified - + Data = ephemeral ? new API.InteractionCallbackData { Flags = MessageFlags.Ephemeral } : Optional.Unspecified }; return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs index 098478612d..408a7f8536 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.MessageComponentInteractionData; namespace Discord.WebSocket diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs index fb6aa2a769..6aa18db231 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs @@ -2,13 +2,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Interaction; using DataModel = Discord.API.AutocompleteInteractionData; - namespace Discord.WebSocket { /// @@ -54,7 +51,7 @@ internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, /// A task that represents the asynchronous operation of responding to this interaction. /// public Task RespondAsync(IEnumerable result, RequestOptions options = null) - => InteractionHelper.SendAutocompleteResult(Discord, result, Id, Token, options); + => InteractionHelper.SendAutocompleteResultAsync(Discord, result, Id, Token, options); /// /// Responds to this interaction with a set of choices. @@ -71,27 +68,31 @@ public Task RespondAsync(IEnumerable result, RequestOptions /// A task that represents the asynchronous operation of responding to this interaction. /// public Task RespondAsync(RequestOptions options = null, params AutocompleteResult[] result) - => InteractionHelper.SendAutocompleteResult(Discord, result, Id, Token, options); - + => InteractionHelper.SendAutocompleteResultAsync(Discord, result, Id, Token, options); /// [Obsolete("Autocomplete interactions cannot be deferred!", true)] - public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) => throw new NotSupportedException(); + public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupWithFileAsync(Stream fileStream, string fileName, string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupWithFileAsync(Stream fileStream, string fileName, string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupWithFileAsync(string filePath, string text = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupWithFileAsync(string filePath, string text = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have normal responses!", true)] - public override Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index 1f70cfa4bb..d0c44bab16 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -1,12 +1,8 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using DataModel = Discord.API.AutocompleteInteractionData; - namespace Discord.WebSocket { /// @@ -46,12 +42,12 @@ public class SocketAutocompleteInteractionData internal SocketAutocompleteInteractionData(DataModel model) { - var options = model.Options.SelectMany(x => GetOptions(x)); + var options = model.Options.SelectMany(GetOptions); Current = options.FirstOrDefault(x => x.Focused); Options = options.ToImmutableArray(); - if (options != null && options.Count() == 1 && Current == null) + if (Options.Count == 1 && Current == null) Current = Options.FirstOrDefault(); CommandName = model.Name; @@ -62,11 +58,11 @@ internal SocketAutocompleteInteractionData(DataModel model) private List GetOptions(API.AutocompleteInteractionDataOption model) { - List options = new List(); + var options = new List(); if (model.Options.IsSpecified) { - options.AddRange(model.Options.Value.SelectMany(x => GetOptions(x))); + options.AddRange(model.Options.Value.SelectMany(GetOptions)); } else if(model.Focused.IsSpecified) { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index db53f5d081..0594bc09b1 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -1,7 +1,3 @@ -using Discord.Rest; -using System; -using System.Linq; -using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -15,13 +11,13 @@ public class SocketSlashCommand : SocketCommandBase /// /// The data associated with this interaction. /// - new public SocketSlashCommandData Data { get; } + private new SocketSlashCommandData Data { get; } internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -31,7 +27,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess Data = SocketSlashCommandData.Create(client, dataModel, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketSlashCommand(client, model, channel); entity.Update(model); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 7b504f1190..39dc9a46a0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Model = Discord.API.ApplicationCommandInteractionData; @@ -25,7 +24,7 @@ internal override void Update(Model model) Options = model.Options.IsSpecified ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(this, x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index 6bd1c69e02..265eda75b7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -6,7 +6,7 @@ namespace Discord.WebSocket { /// - /// Represents a Websocket-based received by the gateway + /// Represents a Websocket-based received by the gateway. /// public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOption { @@ -61,7 +61,7 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) break; case ApplicationCommandOptionType.Mentionable: { - if(data.ResolvableData.GuildMembers.Any(x => x.Key == valueId) || data.ResolvableData.Users.Any(x => x.Key == valueId)) + if (data.ResolvableData.GuildMembers.Any(x => x.Key == valueId) || data.ResolvableData.Users.Any(x => x.Key == valueId)) { var guildUser = data.ResolvableData.GuildMembers.FirstOrDefault(x => x.Key == valueId).Value; @@ -70,7 +70,7 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) else Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; } - else if(data.ResolvableData.Roles.Any(x => x.Key == valueId)) + else if (data.ResolvableData.Roles.Any(x => x.Key == valueId)) { Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; } @@ -110,14 +110,13 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) } break; } - } Options = model.Options.IsSpecified ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); } -#endregion + #endregion #region Converters public static explicit operator bool(SocketSlashCommandDataOption option) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index 2eef2e4ce9..d986a93f3a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; using System.Threading.Tasks; using GatewayModel = Discord.API.Gateway.ApplicationCommandCreatedUpdatedEvent; using Model = Discord.API.ApplicationCommand; @@ -11,7 +10,7 @@ namespace Discord.WebSocket { /// - /// Represends a Websocket-based . + /// Represents a Websocket-based . /// public class SocketApplicationCommand : SocketEntity, IApplicationCommand { @@ -85,33 +84,26 @@ internal void Update(Model model) Type = model.Type; Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() - : new ImmutableArray(); + ? model.Options.Value.Select(SocketApplicationCommandOption.Create).ToImmutableArray() + : ImmutableArray.Create(); } /// public Task DeleteAsync(RequestOptions options = null) - => InteractionHelper.DeleteUnknownApplicationCommand(Discord, GuildId, this, options); + => InteractionHelper.DeleteUnknownApplicationCommandAsync(Discord, GuildId, this, options); /// public Task ModifyAsync(Action func, RequestOptions options = null) { return ModifyAsync(func, options); } - + /// public async Task ModifyAsync(Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { - Model command = null; - - if (IsGlobalCommand) - { - command = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); - } - else - { - command = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId.Value, func, options); - } + var command = IsGlobalCommand + ? await InteractionHelper.ModifyGlobalCommandAsync(Discord, this, func, options).ConfigureAwait(false) + : await InteractionHelper.ModifyGuildCommandAsync(Discord, this, GuildId.Value, func, options); Update(command); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs index 0f36af0b88..e70efa27b4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOptionChoice; namespace Discord.WebSocket diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs index e4332b02a9..8fd5f449c6 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOption; namespace Discord.WebSocket @@ -66,16 +63,16 @@ internal void Update(Model model) : null; Choices = model.Choices.IsSpecified - ? model.Choices.Value.Select(x => SocketApplicationCommandChoice.Create(x)).ToImmutableArray() - : new ImmutableArray(); + ? model.Choices.Value.Select(SocketApplicationCommandChoice.Create).ToImmutableArray() + : ImmutableArray.Create(); Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() - : new ImmutableArray(); + ? model.Options.Value.Select(Create).ToImmutableArray() + : ImmutableArray.Create(); ChannelTypes = model.ChannelTypes.IsSpecified ? model.ChannelTypes.Value.ToImmutableArray() - : new ImmutableArray(); + : ImmutableArray.Create(); } IReadOnlyCollection IApplicationCommandOption.Choices => Choices; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 8677a4a32a..586b785f5f 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -1,10 +1,8 @@ using Discord.Net.Rest; using Discord.Rest; using System; -using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -31,13 +29,13 @@ public ulong CommandId /// /// The data associated with this interaction. /// - new internal SocketCommandBaseData Data { get; } + internal new SocketCommandBaseData Data { get; } internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -47,7 +45,7 @@ internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessa Data = SocketCommandBaseData.Create(client, dataModel, model.Id, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketCommandBase(client, model, channel); entity.Update(model); @@ -56,8 +54,8 @@ internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessa internal override void Update(Model model) { - var data = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var data = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; Data.Update(data); @@ -85,7 +83,7 @@ public override async Task RespondAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -110,14 +108,14 @@ public override async Task RespondAsync( { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - TTS = isTTS ? true : Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), + TTS = isTTS, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, Flags = ephemeral ? MessageFlags.Ephemeral : Optional.Unspecified } }; - await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options); } /// @@ -140,14 +138,14 @@ public override async Task FollowupAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); var args = new API.Rest.CreateWebhookMessageParams { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; @@ -179,7 +177,7 @@ public override async Task FollowupWithFileAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNull(fileStream, nameof(fileStream), "File Stream must have data"); Preconditions.NotNullOrEmpty(fileName, nameof(fileName), "File Name must not be empty or null"); @@ -188,7 +186,7 @@ public override async Task FollowupWithFileAsync( Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = fileStream is not null ? new MultipartFile(fileStream, fileName) : Optional.Unspecified }; @@ -221,7 +219,7 @@ public override async Task FollowupWithFileAsync( Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNullOrEmpty(filePath, nameof(filePath), "Path must exist"); fileName ??= Path.GetFileName(filePath); @@ -232,7 +230,7 @@ public override async Task FollowupWithFileAsync( Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = !string.IsNullOrEmpty(filePath) ? new MultipartFile(new MemoryStream(File.ReadAllBytes(filePath), false), fileName) : Optional.Unspecified }; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs index cac1ce2df1..cb2f01f5f7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; using Model = Discord.API.ApplicationCommandInteractionData; namespace Discord.WebSocket diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs index c76bc49c3f..c065637ca8 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.WebSocket { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 47b0ebcb6a..2863e772db 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -63,9 +63,9 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model { if (model.Type == InteractionType.ApplicationCommand) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value - : null; + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value + : null; if (dataModel == null) return null; @@ -75,15 +75,17 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model ApplicationCommandType.Slash => SocketSlashCommand.Create(client, model, channel), ApplicationCommandType.Message => SocketMessageCommand.Create(client, model, channel), ApplicationCommandType.User => SocketUserCommand.Create(client, model, channel), - _ => null, + _ => null }; } - else if (model.Type == InteractionType.MessageComponent) + + if (model.Type == InteractionType.MessageComponent) return SocketMessageComponent.Create(client, model, channel); - else if (model.Type == InteractionType.ApplicationCommandAutocomplete) + + if (model.Type == InteractionType.ApplicationCommandAutocomplete) return SocketAutocompleteInteraction.Create(client, model, channel); - else - return null; + + return null; } internal virtual void Update(Model model) @@ -138,7 +140,7 @@ public abstract Task RespondAsync(string text = null, Embed[] embeds = null, boo /// /// The sent message. /// - public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// @@ -195,7 +197,7 @@ public Task GetOriginalResponseAsync(RequestOptions opti /// A that represents the initial response. public async Task ModifyOriginalResponseAsync(Action func, RequestOptions options = null) { - var model = await InteractionHelper.ModifyInteractionResponse(Discord, Token, func, options); + var model = await InteractionHelper.ModifyInteractionResponseAsync(Discord, Token, func, options); return RestInteractionMessage.Create(Discord, model, Token, Channel); } @@ -214,20 +216,20 @@ private bool CheckToken() // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction return (DateTime.UtcNow - CreatedAt.UtcDateTime).TotalMinutes <= 15d; } -#endregion + #endregion #region IDiscordInteraction /// - async Task IDiscordInteraction.FollowupAsync (string text, Embed[] embeds, bool isTTS, bool ephemeral, AllowedMentions allowedMentions, + async Task IDiscordInteraction.FollowupAsync(string text, Embed[] embeds, bool isTTS, bool ephemeral, AllowedMentions allowedMentions, RequestOptions options, MessageComponent component, Embed embed) => await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component, embed).ConfigureAwait(false); /// - async Task IDiscordInteraction.GetOriginalResponseAsync (RequestOptions options) + async Task IDiscordInteraction.GetOriginalResponseAsync(RequestOptions options) => await GetOriginalResponseAsync(options).ConfigureAwait(false); /// - async Task IDiscordInteraction.ModifyOriginalResponseAsync (Action func, RequestOptions options) + async Task IDiscordInteraction.ModifyOriginalResponseAsync(Action func, RequestOptions options) => await ModifyOriginalResponseAsync(func, options).ConfigureAwait(false); #endregion } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index cfe12ebef5..6a51040127 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -1,13 +1,9 @@ using Discord.Rest; using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Sticker; - namespace Discord.WebSocket { /// @@ -54,7 +50,7 @@ internal static SocketCustomSticker Create(DiscordSocketClient client, Model mod /// public async Task ModifyAsync(Action func, RequestOptions options = null) { - if(!Guild.CurrentUser.GuildPermissions.Has(GuildPermission.ManageEmojisAndStickers)) + if (!Guild.CurrentUser.GuildPermissions.Has(GuildPermission.ManageEmojisAndStickers)) throw new InvalidOperationException($"Missing permission {nameof(GuildPermission.ManageEmojisAndStickers)}"); var model = await GuildHelper.ModifyStickerAsync(Discord, Guild.Id, this, func, options); @@ -72,7 +68,7 @@ public async Task DeleteAsync(RequestOptions options = null) internal SocketCustomSticker Clone() => MemberwiseClone() as SocketCustomSticker; private new string DebuggerDisplay => Guild == null ? base.DebuggerDisplay : $"{Name} in {Guild.Name} ({Id})"; -#endregion + #endregion #region ICustomSticker ulong? ICustomSticker.AuthorId diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index 758ecebb4d..ee45720b52 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -1,11 +1,7 @@ -using Discord.Rest; -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.Sticker; namespace Discord.WebSocket @@ -49,12 +45,9 @@ internal SocketSticker(DiscordSocketClient client, ulong id) internal static SocketSticker Create(DiscordSocketClient client, Model model) { - SocketSticker entity; - - if (model.GuildId.IsSpecified) - entity = new SocketCustomSticker(client, model.Id, client.GetGuild(model.GuildId.Value), model.User.IsSpecified ? model.User.Value.Id : null); - else - entity = new SocketSticker(client, model.Id); + var entity = model.GuildId.IsSpecified + ? new SocketCustomSticker(client, model.Id, client.GetGuild(model.GuildId.Value), model.User.IsSpecified ? model.User.Value.Id : null) + : new SocketSticker(client, model.Id); entity.Update(model); return entity; @@ -63,21 +56,16 @@ internal static SocketSticker Create(DiscordSocketClient client, Model model) internal virtual void Update(Model model) { Name = model.Name; - Description = model.Desription; + Description = model.Description; PackId = model.PackId; IsAvailable = model.Available; Format = model.FormatType; Type = model.Type; SortOrder = model.SortValue; - if (model.Tags.IsSpecified) - { - Tags = model.Tags.Value.Split(',').Select(x => x.Trim()).ToImmutableArray(); - } - else - { - Tags = ImmutableArray.Empty; - } + Tags = model.Tags.IsSpecified + ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToImmutableArray() + : ImmutableArray.Create(); } internal string DebuggerDisplay => $"{Name} ({Id})"; @@ -85,10 +73,10 @@ internal virtual void Update(Model model) /// public override bool Equals(object obj) { - if (obj is API.Sticker stickerModel) + if (obj is Model stickerModel) { return stickerModel.Name == Name && - stickerModel.Desription == Description && + stickerModel.Description == Description && stickerModel.FormatType == Format && stickerModel.Id == Id && stickerModel.PackId == PackId && @@ -97,8 +85,8 @@ public override bool Equals(object obj) stickerModel.Available == IsAvailable && (!stickerModel.Tags.IsSpecified || stickerModel.Tags.Value == string.Join(", ", Tags)); } - else - return base.Equals(obj); + + return base.Equals(obj); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs index 2e9514595a..ca7d2d0f1a 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -1,8 +1,5 @@ -using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.StickerItem; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index 2cec3d6123..c91921379b 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -1,11 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ThreadMember; -using MemberModel = Discord.API.GuildMember; -using Discord.API; using System.Collections.Immutable; namespace Discord.WebSocket @@ -163,7 +160,6 @@ internal void Update(Model model) } } - /// public ChannelPermissions GetPermissions(IGuildChannel channel) => GuildUser.GetPermissions(channel); From 266a9c89c95c8f8087cb569206697bb74f41acf6 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 00:24:39 -0300 Subject: [PATCH 386/494] Ephemeral attachments --- src/Discord.Net.Core/Entities/Messages/IAttachment.cs | 7 +++++++ src/Discord.Net.Rest/API/Common/Attachment.cs | 1 + src/Discord.Net.Rest/Entities/Messages/Attachment.cs | 8 ++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Messages/IAttachment.cs b/src/Discord.Net.Core/Entities/Messages/IAttachment.cs index 6557779984..e94e9f97c4 100644 --- a/src/Discord.Net.Core/Entities/Messages/IAttachment.cs +++ b/src/Discord.Net.Core/Entities/Messages/IAttachment.cs @@ -55,5 +55,12 @@ public interface IAttachment /// The width of this attachment if it is a picture; otherwise null. /// int? Width { get; } + /// + /// Gets whether or not this attachment is ephemeral. + /// + /// + /// if the attachment is ephemeral; otherwise . + /// + bool Ephemeral { get; } } } diff --git a/src/Discord.Net.Rest/API/Common/Attachment.cs b/src/Discord.Net.Rest/API/Common/Attachment.cs index 3ac445f8ca..302d684277 100644 --- a/src/Discord.Net.Rest/API/Common/Attachment.cs +++ b/src/Discord.Net.Rest/API/Common/Attachment.cs @@ -18,5 +18,6 @@ internal class Attachment public Optional Height { get; set; } [JsonProperty("width")] public Optional Width { get; set; } + public Optional Ephemeral { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Messages/Attachment.cs b/src/Discord.Net.Rest/Entities/Messages/Attachment.cs index 1cd73518a7..4e4849c512 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Attachment.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Attachment.cs @@ -21,8 +21,10 @@ public class Attachment : IAttachment public int? Height { get; } /// public int? Width { get; } + /// + public bool Ephemeral { get; } - internal Attachment(ulong id, string filename, string url, string proxyUrl, int size, int? height, int? width) + internal Attachment(ulong id, string filename, string url, string proxyUrl, int size, int? height, int? width, bool? ephemeral) { Id = id; Filename = filename; @@ -31,12 +33,14 @@ internal Attachment(ulong id, string filename, string url, string proxyUrl, int Size = size; Height = height; Width = width; + Ephemeral = ephemeral.GetValueOrDefault(false); } internal static Attachment Create(Model model) { return new Attachment(model.Id, model.Filename, model.Url, model.ProxyUrl, model.Size, model.Height.IsSpecified ? model.Height.Value : (int?)null, - model.Width.IsSpecified ? model.Width.Value : (int?)null); + model.Width.IsSpecified ? model.Width.Value : (int?)null, + model.Ephemeral.ToNullable()); } /// From 1adadf1c003a4b19c2b8f4a6c69b7b7390c5991f Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 00:26:28 -0300 Subject: [PATCH 387/494] Add missing jsonproperty attribute --- src/Discord.Net.Rest/API/Common/Attachment.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Discord.Net.Rest/API/Common/Attachment.cs b/src/Discord.Net.Rest/API/Common/Attachment.cs index 302d684277..0d98fc3a4a 100644 --- a/src/Discord.Net.Rest/API/Common/Attachment.cs +++ b/src/Discord.Net.Rest/API/Common/Attachment.cs @@ -18,6 +18,7 @@ internal class Attachment public Optional Height { get; set; } [JsonProperty("width")] public Optional Width { get; set; } + [JsonProperty("ephemeral")] public Optional Ephemeral { get; set; } } } From 6533a2ad367f48dbde5b9ffe7a8cacdececc7b77 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 01:00:24 -0300 Subject: [PATCH 388/494] Add IMessage.Interaction --- src/Discord.Net.Core/Discord.Net.Core.xml | 170 ++++++++++++++---- .../Entities/Messages/IMessage.cs | 10 +- .../Entities/Messages/IMessageInteraction.cs | 34 ++++ .../Entities/Messages/MessageInteraction.cs | 45 +++++ src/Discord.Net.Rest/API/Common/Message.cs | 1 + .../API/Common/MessageInteraction.cs | 21 +++ src/Discord.Net.Rest/Discord.Net.Rest.xml | 11 ++ .../Entities/Messages/RestMessage.cs | 16 ++ .../Discord.Net.WebSocket.xml | 18 +- .../Entities/Messages/SocketMessage.cs | 16 ++ 10 files changed, 297 insertions(+), 45 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs create mode 100644 src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs create mode 100644 src/Discord.Net.Rest/API/Common/MessageInteraction.cs diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index a12881481c..0c89d54166 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -2277,7 +2277,7 @@ The options to be used when sending the request. - A task that represents the asynchronous join operation. + A task that represents the asynchronous join operation. @@ -2286,7 +2286,7 @@ The options to be used when sending the request. - A task that represents the asynchronous leave operation. + A task that represents the asynchronous leave operation. @@ -2296,7 +2296,7 @@ The to add. The options to be used when sending the request. - A task that represents the asynchronous operation of adding a member to a thread. + A task that represents the asynchronous operation of adding a member to a thread. @@ -2306,7 +2306,7 @@ The to remove from this thread. The options to be used when sending the request. - A task that represents the asynchronous operation of removing a user from this thread. + A task that represents the asynchronous operation of removing a user from this thread. @@ -2384,6 +2384,21 @@ Gets or sets the privacy level of the stage. + + + Specifies the privacy levels of a Stage instance. + + + + + The Stage instance is visible publicly, such as on Stage Discovery. + + + + + The Stage instance is visible to only guild members. + + Provides properties that are used to modify an with the specified changes. @@ -2457,7 +2472,7 @@ Three days (4320 minutes). - This option is explicity avaliable to nitro users. + This option is explicitly available to nitro users. @@ -2465,7 +2480,7 @@ One week (10080 minutes). - This option is explicity avaliable to nitro users. + This option is explicitly available to nitro users. @@ -4632,7 +4647,7 @@ - A . + A . @@ -4758,7 +4773,7 @@ - + Returns the maximum length a commands name allowed by Discord @@ -4860,7 +4875,7 @@ - The type of the command + The type of the command. @@ -5100,7 +5115,7 @@ - Represents an interface used to specify classes that they are a vaild data type of a class. + Represents an interface used to specify classes that they are a valid data type of a class. @@ -5111,7 +5126,7 @@ After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. - You can read more about Response types Here + You can read more about Response types Here. @@ -5141,17 +5156,17 @@ - For components: ACK an interaction and edit the original message later; the user does not see a loading state + For components: ACK an interaction and edit the original message later; the user does not see a loading state. - For components: edit the message the component was attached to + For components: edit the message the component was attached to. - Respond with a set of choices to a autocomplete interaction + Respond with a set of choices to a autocomplete interaction. @@ -5181,7 +5196,7 @@ - Represents a Row for child components to live in. + Represents a Row for child components to live in. @@ -5220,7 +5235,7 @@ - Gets the URL for a button. + Gets the URL for a button. You cannot have a button with a URL and a CustomId. @@ -5762,7 +5777,7 @@ - Gets or sets the custom id of the current select menu. + Gets or sets the value of the current select menu. length exceeds . length subceeds 1. @@ -5860,22 +5875,22 @@ - Represents a type of a component + Represents a type of a component. - A container for other components + A container for other components. - A clickable button + A clickable button. - A select menu for picking from choices + A select menu for picking from choices. @@ -6061,7 +6076,7 @@ The description of this option. If this option is required for this command. If this option is the default option. - If this option is set to autocompleate. + If this option is set to autocomplete. The options of the option to add. The allowed channel types for this option. The choices of this option. @@ -6196,7 +6211,7 @@ - Adds a channnel type to the current option. + Adds a channel type to the current option. The to add. The current builder. @@ -7466,6 +7481,14 @@ The width of this attachment if it is a picture; otherwise null. + + + Gets whether or not this attachment is ephemeral. + + + if the attachment is ephemeral; otherwise . + + Represents a Discord embed object. @@ -7784,6 +7807,14 @@ A message's flags, if any is associated. + + + Gets the interaction this message is a response to. + + + A if the message is a response to an interaction; otherwise . + + Adds a reaction to this message. @@ -7891,6 +7922,31 @@ Paged collection of users. + + + Represents a partial within a message. + + + + + Gets the snowflake id of the interaction. + + + + + Gets the type of the interaction. + + + + + Gets the name of the application command used. + + + + + Gets the who invoked the interaction. + + Represents a generic reaction object. @@ -8082,6 +8138,32 @@ Flag given to messages that is an Interaction Response and the bot is "thinking" + + + Represents a partial within a message. + + The type of the user. + + + + Gets the snowflake id of the interaction. + + + + + Gets the type of the interaction. + + + + + Gets the name of the application command used. + + + + + Gets the who invoked the interaction. + + Properties that are used to modify an with the specified changes. @@ -8345,19 +8427,29 @@ - Defines the types of formats for stickers. + + Defines the types of formats for stickers. + - Default value for a sticker format type. + + Default value for a sticker format type. + - The sticker format type is png. + + The sticker format type is png. + - The sticker format type is apng. + + The sticker format type is apng. + - The sticker format type is lottie. + + The sticker format type is lottie. + @@ -8444,7 +8536,7 @@ If the is null then the default 0 will be used. - A string thats compatible in a discord message, ex: <t:1625944201:f> + A string that is compatible in a discord message, ex: <t:1625944201:f> @@ -9996,12 +10088,12 @@ - Gets whether this guild sticker can be used, may be false due to loss of Server Boosts + Gets whether this guild sticker can be used, may be false due to loss of Server Boosts. - Gets the standard sticker's sort order within its pack + Gets the standard sticker's sort order within its pack. @@ -10033,7 +10125,7 @@ Represents a discord sticker pack. - The type of the stickers within the collection + The type of the stickers within the collection. @@ -10092,7 +10184,7 @@ - Represents a type of sticker + Represents a type of sticker.. @@ -12970,20 +13062,20 @@ Not full URL validation right now. Just ensures protocol is present and that it's either http or https - should be used for url buttons + should be used for url buttons. - url to validate before sending to Discord. + The URL to validate before sending to Discord. A URL must include a protocol (http or https). - true if url is valid by our standard, false if null, throws an error upon invalid + true if URL is valid by our standard, false if null, throws an error upon invalid. Not full URL validation right now. Just Ensures the protocol is either http, https, or discord - should be used everything other than url buttons + should be used everything other than url buttons. - the url to validate before sending to discord + The URL to validate before sending to discord. A URL must include a protocol (either http, https, or discord). - true if the url is valid by our standard, false if null, throws an error upon invalid + true if the URL is valid by our standard, false if null, throws an error upon invalid. diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index af88554e71..f5f2ca0076 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -194,7 +194,15 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// A message's flags, if any is associated. /// MessageFlags? Flags { get; } - + + /// + /// Gets the interaction this message is a response to. + /// + /// + /// A if the message is a response to an interaction; otherwise . + /// + IMessageInteraction Interaction { get; } + /// /// Adds a reaction to this message. /// diff --git a/src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs b/src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs new file mode 100644 index 0000000000..ebd03b627f --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a partial within a message. + /// + public interface IMessageInteraction + { + /// + /// Gets the snowflake id of the interaction. + /// + ulong Id { get; } + + /// + /// Gets the type of the interaction. + /// + InteractionType Type { get; } + + /// + /// Gets the name of the application command used. + /// + string Name { get; } + + /// + /// Gets the who invoked the interaction. + /// + IUser User { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs b/src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs new file mode 100644 index 0000000000..cbbebd932a --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a partial within a message. + /// + /// The type of the user. + public class MessageInteraction : IMessageInteraction where TUser : IUser + { + /// + /// Gets the snowflake id of the interaction. + /// + public ulong Id { get; } + + /// + /// Gets the type of the interaction. + /// + public InteractionType Type { get; } + + /// + /// Gets the name of the application command used. + /// + public string Name { get; } + + /// + /// Gets the who invoked the interaction. + /// + public TUser User { get; } + + internal MessageInteraction(ulong id, InteractionType type, string name, TUser user) + { + Id = id; + Type = type; + Name = name; + User = user; + } + + IUser IMessageInteraction.User => User; + } +} diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index c19dc89422..d33a03fe5a 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -59,6 +59,7 @@ internal class Message public Optional ReferencedMessage { get; set; } [JsonProperty("components")] public Optional Components { get; set; } + public Optional Interaction { get; set; } [JsonProperty("sticker_items")] public Optional StickerItems { get; set; } } diff --git a/src/Discord.Net.Rest/API/Common/MessageInteraction.cs b/src/Discord.Net.Rest/API/Common/MessageInteraction.cs new file mode 100644 index 0000000000..48f2783964 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/MessageInteraction.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class MessageInteraction + { + [JsonProperty("id")] + public ulong Id { get; set; } + [JsonProperty("type")] + public InteractionType Type { get; set; } + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("user")] + public User User { get; set; } + } +} diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml index cd5187220e..a8927268d3 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ b/src/Discord.Net.Rest/Discord.Net.Rest.xml @@ -4449,6 +4449,11 @@ + + + Gets the interaction this message is a response to. + + @@ -4489,6 +4494,9 @@ + + + @@ -5248,6 +5256,9 @@ + + + Returns the filename of this attachment. diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 22b1095499..c48a60aac7 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -70,6 +70,11 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable public MessageApplication Application { get; private set; } /// public MessageReference Reference { get; private set; } + + /// + /// Gets the interaction this message is a response to. + /// + public MessageInteraction Interaction { get; private set; } /// public MessageFlags? Flags { get; private set; } /// @@ -212,6 +217,14 @@ internal virtual void Update(Model model) else _reactions = ImmutableArray.Create(); + if (model.Interaction.IsSpecified) + { + Interaction = new MessageInteraction(model.Interaction.Value.Id, + model.Interaction.Value.Type, + model.Interaction.Value.Name, + RestUser.Create(Discord, model.Interaction.Value.User)); + } + if (model.UserMentions.IsSpecified) { var value = model.UserMentions.Value; @@ -257,6 +270,9 @@ public Task DeleteAsync(RequestOptions options = null) /// IReadOnlyCollection IMessage.Components => Components; + /// + IMessageInteraction IMessage.Interaction => Interaction; + /// IReadOnlyCollection IMessage.Stickers => Stickers; diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml index c2f7382f1f..f3a05fafa1 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml @@ -2664,7 +2664,7 @@ Downloads all users that have access to this thread. The options to be used when sending the request. - A task representing the asyncronous download operation. + A task representing the asynchronous download operation. @@ -2679,7 +2679,7 @@ The to add. The options to be used when sending the request. - A task that represents the asynchronous operation of adding a member to a thread. + A task that represents the asynchronous operation of adding a member to a thread. @@ -2689,7 +2689,7 @@ The to remove from this thread. The options to be used when sending the request. - A task that represents the asynchronous operation of removing a user from this thread. + A task that represents the asynchronous operation of removing a user from this thread. @@ -4081,7 +4081,7 @@ - Represents a Websocket-based received by the gateway + Represents a Websocket-based received by the gateway. @@ -4100,7 +4100,7 @@ - Represends a Websocket-based . + Represents a Websocket-based . @@ -4574,6 +4574,11 @@ + + + Gets the interaction this message is a response to. + + @@ -4667,6 +4672,9 @@ + + + diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index a287610f5c..bbadb8ce51 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -67,6 +67,11 @@ public abstract class SocketMessage : SocketEntity, IMessage /// public IReadOnlyCollection Components { get; private set; } + /// + /// Gets the interaction this message is a response to. + /// + public MessageInteraction Interaction { get; private set; } + /// public MessageFlags? Flags { get; private set; } @@ -253,6 +258,14 @@ internal virtual void Update(ClientState state, Model model) } } + if (model.Interaction.IsSpecified) + { + Interaction = new MessageInteraction(model.Interaction.Value.Id, + model.Interaction.Value.Type, + model.Interaction.Value.Name, + SocketGlobalUser.Create(Discord, state, model.Interaction.Value.User)); + } + if (model.Flags.IsSpecified) Flags = model.Flags.Value; } @@ -290,6 +303,9 @@ public Task DeleteAsync(RequestOptions options = null) /// IReadOnlyCollection IMessage.Components => Components; + /// + IMessageInteraction IMessage.Interaction => Interaction; + /// IReadOnlyCollection IMessage.Stickers => Stickers; From f2a84298048689cff6ecdd864399b63ef12c2502 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 01:05:47 -0300 Subject: [PATCH 389/494] Update attachment checks for embed urls --- .../Entities/Messages/EmbedBuilder.cs | 14 +++++++------- src/Discord.Net.Core/Utils/UrlValidation.cs | 7 ++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 5b92e02a56..0304120f50 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -408,22 +408,22 @@ public Embed Build() if (Length > MaxEmbedLength) throw new InvalidOperationException($"Total embed length must be less than or equal to {MaxEmbedLength}."); if (!string.IsNullOrEmpty(Url)) - UrlValidation.Validate(Url); + UrlValidation.Validate(Url, true); if (!string.IsNullOrEmpty(ThumbnailUrl)) - UrlValidation.Validate(ThumbnailUrl); - if (!string.IsNullOrEmpty(ImageUrl) && !ImageUrl.StartsWith("attachment://", StringComparison.Ordinal)) - UrlValidation.Validate(ImageUrl); + UrlValidation.Validate(ThumbnailUrl, true); + if (!string.IsNullOrEmpty(ImageUrl)) + UrlValidation.Validate(ImageUrl, true); if (Author != null) { if (!string.IsNullOrEmpty(Author.Url)) - UrlValidation.Validate(Author.Url); + UrlValidation.Validate(Author.Url, true); if (!string.IsNullOrEmpty(Author.IconUrl)) - UrlValidation.Validate(Author.IconUrl); + UrlValidation.Validate(Author.IconUrl, true); } if(Footer != null) { if (!string.IsNullOrEmpty(Footer.IconUrl)) - UrlValidation.Validate(Footer.IconUrl); + UrlValidation.Validate(Footer.IconUrl, true); } var fields = ImmutableArray.CreateBuilder(Fields.Count); for (int i = 0; i < Fields.Count; i++) diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs index ab651da0dc..2699bdc9ff 100644 --- a/src/Discord.Net.Core/Utils/UrlValidation.cs +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -9,14 +9,15 @@ internal static class UrlValidation /// should be used for url buttons. /// /// The URL to validate before sending to Discord. + /// to allow the attachment:// protocol; otherwise . /// A URL must include a protocol (http or https). /// true if URL is valid by our standard, false if null, throws an error upon invalid. - public static bool Validate(string url) + public static bool Validate(string url, bool allowAttachments = false) { if (string.IsNullOrEmpty(url)) return false; - if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))) - throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP or HTTPS)"); + if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || allowAttachments ? url.StartsWith("attachment://", StringComparison.Ordinal) : false)) + throw new InvalidOperationException($"The url {url} must include a protocol (either {(allowAttachments ? "HTTP, HTTPS, or ATTACHMENT" : "HTTP or HTTPS")})"); return true; } From e2927f220b0516481533162bb107594fac70bc21 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 02:26:06 -0300 Subject: [PATCH 390/494] meta: bump version --- src/Discord.Net/Discord.Net.nuspec | 39 ++++++++++++++++++------------ 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index c41d0ff51b..ec303de946 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.1$suffix$ + 3.1.2$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -13,26 +13,33 @@ false https://avatars.githubusercontent.com/u/84047264 + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From 799fa9184346ee96ce19a9f9a55c650c2dbd7d18 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 02:38:23 -0300 Subject: [PATCH 391/494] Remove old package configs and update image --- src/Discord.Net.Commands/Discord.Net.Commands.csproj | 6 ------ src/Discord.Net.Core/Discord.Net.Core.csproj | 6 ------ src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 ------ src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 6 ------ src/Discord.Net.Webhook/Discord.Net.Webhook.csproj | 6 ------ src/Discord.Net/Discord.Net.nuspec | 2 +- 6 files changed, 1 insertion(+), 31 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index ce4d0dd3df..fee17ff57d 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -18,12 +18,6 @@ - - - True - - - Always diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 8888332ae5..605dccc86e 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -33,12 +33,6 @@ - - - True - - - Always diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index b280cfd4f6..8dc44490a8 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -21,12 +21,6 @@ - - - True - - - Always diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index f6af62a12e..2de3c4c2c2 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -26,12 +26,6 @@ - - - True - - - Always diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 7ccc7cfb91..ccc806e7f6 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -19,12 +19,6 @@ - - - True - - - Always diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index ec303de946..dec3cc7a06 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -11,7 +11,7 @@ https://github.com/Discord-Net-Labs/Discord.Net-Labs http://opensource.org/licenses/MIT false - https://avatars.githubusercontent.com/u/84047264 + https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png From d4ee375ce3b3fe41232e755107236222cbdb1ba3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 02:42:56 -0300 Subject: [PATCH 392/494] Update package logos --- src/Discord.Net.Commands/Discord.Net.Commands.csproj | 2 +- src/Discord.Net.Core/Discord.Net.Core.csproj | 2 +- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 2 +- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 2 +- src/Discord.Net.Webhook/Discord.Net.Webhook.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index fee17ff57d..dadd017e45 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -10,7 +10,7 @@ Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png + ..\..\docs\marketing\logo\PackageLogo.png ..\Discord.Net.Commands\Discord.Net.Commands.xml diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 605dccc86e..15acb9db59 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -10,7 +10,7 @@ Discord.Net.Labs.Core Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png + ..\..\docs\marketing\logo\PackageLogo.png false diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 8dc44490a8..f54c25b156 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -7,7 +7,7 @@ A core Discord.Net Labs library containing the REST client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - Temporary.png + ..\..\docs\marketing\logo\PackageLogo.png https://github.com/Discord-Net-Labs/Discord.Net-Labs Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 2de3c4c2c2..949e5f84f9 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -10,7 +10,7 @@ true https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png + ..\..\docs\marketing\logo\PackageLogo.png Discord.Net.Labs.WebSocket PackageReference true diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index ccc806e7f6..53f607cc66 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -10,7 +10,7 @@ Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs - Temporary.png + ..\..\docs\marketing\logo\PackageLogo.png ..\Discord.Net.Webhook\Discord.Net.Webhook.xml From 6cfbb59e80f9230a3eebeaad41913a4fc08ac7f3 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 02:48:47 -0300 Subject: [PATCH 393/494] Fix logo reference for azure --- src/Discord.Net.Commands/Discord.Net.Commands.csproj | 7 ++++++- src/Discord.Net.Core/Discord.Net.Core.csproj | 6 +++++- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 6 +++++- src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 6 +++++- src/Discord.Net.Webhook/Discord.Net.Webhook.csproj | 6 +++++- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index dadd017e45..119ed42f2f 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -10,10 +10,11 @@ Discord.Net.Labs.Commands https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs - ..\..\docs\marketing\logo\PackageLogo.png + PackageLogo.png ..\Discord.Net.Commands\Discord.Net.Commands.xml + @@ -22,6 +23,10 @@ Always + + True + + diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 15acb9db59..3b915ef492 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -10,7 +10,7 @@ Discord.Net.Labs.Core Discord.Net.Labs.Core https://github.com/Discord-Net-Labs/Discord.Net-Labs - ..\..\docs\marketing\logo\PackageLogo.png + PackageLogo.png false @@ -37,5 +37,9 @@ Always + + True + + diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index f54c25b156..c54482136f 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -7,7 +7,7 @@ A core Discord.Net Labs library containing the REST client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - ..\..\docs\marketing\logo\PackageLogo.png + PackageLogo.png https://github.com/Discord-Net-Labs/Discord.Net-Labs Discord.Net.Labs.Rest https://github.com/Discord-Net-Labs/Discord.Net-Labs @@ -25,5 +25,9 @@ Always + + True + + diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 949e5f84f9..5d7d9caa11 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -10,7 +10,7 @@ true https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs - ..\..\docs\marketing\logo\PackageLogo.png + PackageLogo.png Discord.Net.Labs.WebSocket PackageReference true @@ -30,5 +30,9 @@ Always + + True + + diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 53f607cc66..57a705b30a 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -10,7 +10,7 @@ Discord.Net.Labs.Webhook https://github.com/Discord-Net-Labs/Discord.Net-Labs https://github.com/Discord-Net-Labs/Discord.Net-Labs - ..\..\docs\marketing\logo\PackageLogo.png + PackageLogo.png ..\Discord.Net.Webhook\Discord.Net.Webhook.xml @@ -23,5 +23,9 @@ Always + + True + + From dabed499fae960fb4f48fe11137abbd0fbc06ff6 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 03:25:01 -0300 Subject: [PATCH 394/494] Deprecate old package definitions in favor for target file --- Discord.Net.targets | 9 +- .../Discord.Net.Commands.csproj | 20 +- .../Discord.Net.Commands.xml | 1498 -- src/Discord.Net.Core/Discord.Net.Core.csproj | 19 +- src/Discord.Net.Core/Discord.Net.Core.xml | 13081 ---------------- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 16 - src/Discord.Net.Rest/Discord.Net.Rest.xml | 5271 ------- .../Discord.Net.WebSocket.csproj | 24 +- .../Discord.Net.WebSocket.xml | 5922 ------- .../Discord.Net.Webhook.csproj | 16 - .../Discord.Net.Webhook.xml | 111 - 11 files changed, 7 insertions(+), 25980 deletions(-) delete mode 100644 src/Discord.Net.Commands/Discord.Net.Commands.xml delete mode 100644 src/Discord.Net.Core/Discord.Net.Core.xml delete mode 100644 src/Discord.Net.Rest/Discord.Net.Rest.xml delete mode 100644 src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml delete mode 100644 src/Discord.Net.Webhook/Discord.Net.Webhook.xml diff --git a/Discord.Net.targets b/Discord.Net.targets index febd921d1f..f303f4594e 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,15 +1,14 @@ - 3.0.0 - dev + 3.1.2 latest Discord.Net Contributors discord;discordapp - https://github.com/Discord-Net/Discord.Net + https://github.com/Discord-Net-Labs/Discord.Net-Labs http://opensource.org/licenses/MIT - https://github.com/Discord-Net/Discord.Net/raw/dev/docs/marketing/logo/PackageLogo.png + https://github.com/Discord-Net-Labs/Discord.Net-Labs/raw/dev/docs/marketing/logo/PackageLogo.png git - git://github.com/Discord-Net/Discord.Net + git://github.com/Discord-Net-Labs/Discord.Net-Labs $(VersionSuffix)-dev diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 119ed42f2f..af2293ac98 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -1,4 +1,4 @@ - + @@ -7,26 +7,8 @@ A Discord.Net Labs extension adding support for bot commands. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - Discord.Net.Labs.Commands - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - - - ..\Discord.Net.Commands\Discord.Net.Commands.xml - - - - Always - - - True - - - - diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml deleted file mode 100644 index b24a8fdd00..0000000000 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ /dev/null @@ -1,1498 +0,0 @@ - - - - Discord.Net.Commands - - - - - Marks the aliases for a command. - - - This attribute allows a command to have one or multiple aliases. In other words, the base command can have - multiple aliases when triggering the command itself, giving the end-user more freedom of choices when giving - hot-words to trigger the desired command. See the example for a better illustration. - - - In the following example, the command can be triggered with the base name, "stats", or either "stat" or - "info". - - [Command("stats")] - [Alias("stat", "info")] - public Task GetStatsAsync(IUser user) - { - // ...pull stats - } - - - - - - Gets the aliases which have been defined for the command. - - - - - Creates a new with the given aliases. - - - - - Marks the execution information for a command. - - - - - Gets the text that has been set to be recognized as a command. - - - - - Specifies the of the command. This affects how the command is executed. - - - - - - - - Initializes a new attribute with the specified name. - - The name of the command. - - - - Prevents the marked module from being loaded automatically. - - - This attribute tells to ignore the marked module from being loaded - automatically (e.g. the method). If a non-public module marked - with this attribute is attempted to be loaded manually, the loading process will also fail. - - - - - Prevents the marked property from being injected into a module. - - - This attribute prevents the marked member from being injected into its parent module. Useful when you have a - public property that you do not wish to invoke the library's dependency injection service. - - - In the following example, DatabaseService will not be automatically injected into the module and will - not throw an error message if the dependency fails to be resolved. - - public class MyModule : ModuleBase - { - [DontInject] - public DatabaseService DatabaseService; - public MyModule() - { - DatabaseService = DatabaseFactory.Generate(); - } - } - - - - - - Marks the module as a command group. - - - - - Gets the prefix set for the module. - - - - - - - - Initializes a new with the provided prefix. - - The prefix of the module group. - - - - Marks the public name of a command, module, or parameter. - - - - - Gets the name of the command. - - - - - Marks the public name of a command, module, or parameter with the provided name. - - The public name of the object. - - - - Instructs the command system to treat command parameters of this type - as a collection of named arguments matching to its properties. - - - - - Marks the to be read by the specified . - - - This attribute will override the to be used when parsing for the - desired type in the command. This is useful when one wishes to use a particular - without affecting other commands that are using the same target - type. - - If the given type reader does not inherit from , an - will be thrown. - - - - In this example, the will be read by a custom - , FriendlyTimeSpanTypeReader, instead of the - shipped by Discord.Net. - - [Command("time")] - public Task GetTimeAsync([OverrideTypeReader(typeof(FriendlyTimeSpanTypeReader))]TimeSpan time) - => ReplyAsync(time); - - - - - - Gets the specified of the parameter. - - - - - The to be used with the parameter. - The given does not inherit from . - - - - Requires the parameter to pass the specified precondition before execution can begin. - - - - - - Checks whether the condition is met before execution of the command. - - The context of the command. - The parameter of the command being checked against. - The raw value of the parameter. - The service collection used for dependency injection. - - - - Requires the module or class to pass the specified precondition before execution can begin. - - - - - - Specifies a group that this precondition belongs to. - - - of the same group require only one of the preconditions to pass in order to - be successful (A || B). Specifying = null or not at all will - require *all* preconditions to pass, just like normal (A && B). - - - - - When overridden in a derived class, uses the supplied string - as the error message if the precondition doesn't pass. - Setting this for a class that doesn't override - this property is a no-op. - - - - - Checks if the has the sufficient permission to be executed. - - The context of the command. - The command being executed. - The service collection used for dependency injection. - - - - Requires the bot to have a specific permission in the channel a command is invoked in. - - - - - Gets the specified of the precondition. - - - - - Gets the specified of the precondition. - - - - - - - - Gets or sets the error message if the precondition - fails due to being run outside of a Guild channel. - - - - - Requires the bot account to have a specific . - - - This precondition will always fail if the command is being invoked in a . - - - The that the bot must have. Multiple permissions can be specified - by ORing the permissions together. - - - - - Requires that the bot account to have a specific . - - - The that the bot must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - - - - Defines the type of command context (i.e. where the command is being executed). - - - - - Specifies the command to be executed within a guild. - - - - - Specifies the command to be executed within a DM. - - - - - Specifies the command to be executed within a group. - - - - - Requires the command to be invoked in a specified context (e.g. in guild, DM). - - - - - Gets the context required to execute the command. - - - - - - - Requires the command to be invoked in the specified context. - The type of context the command can be invoked in. Multiple contexts can be specified by ORing the contexts together. - - - [Command("secret")] - [RequireContext(ContextType.DM | ContextType.Group)] - public Task PrivateOnlyAsync() - { - return ReplyAsync("shh, this command is a secret"); - } - - - - - - - - - Requires the command to be invoked in a channel marked NSFW. - - - The precondition will restrict the access of the command or module to be accessed within a guild channel - that has been marked as mature or NSFW. If the channel is not of type or the - channel is not marked as NSFW, the precondition will fail with an erroneous . - - - The following example restricts the command too-cool to an NSFW-enabled channel only. - - public class DankModule : ModuleBase - { - [Command("cool")] - public Task CoolAsync() - => ReplyAsync("I'm cool for everyone."); - - [RequireNsfw] - [Command("too-cool")] - public Task TooCoolAsync() - => ReplyAsync("You can only see this if you're cool enough."); - } - - - - - - - - - - - - Requires the command to be invoked by the owner of the bot. - - - This precondition will restrict the access of the command or module to the owner of the Discord application. - If the precondition fails to be met, an erroneous will be returned with the - message "Command can only be run by the owner of the bot." - - This precondition will only work if the account has a of - ;otherwise, this precondition will always fail. - - - - The following example restricts the command to a set of sensitive commands that only the owner of the bot - application should be able to access. - - [RequireOwner] - [Group("admin")] - public class AdminModule : ModuleBase - { - [Command("exit")] - public async Task ExitAsync() - { - Environment.Exit(0); - } - } - - - - - - - - - - - - Requires the user invoking the command to have a specified permission. - - - - - Gets the specified of the precondition. - - - - - Gets the specified of the precondition. - - - - - - - - Gets or sets the error message if the precondition - fails due to being run outside of a Guild channel. - - - - - Requires that the user invoking the command to have a specific . - - - This precondition will always fail if the command is being invoked in a . - - - The that the user must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - Requires that the user invoking the command to have a specific . - - - The that the user must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - - - - Sets priority of commands. - - - - - Gets the priority which has been set for the command. - - - - - Initializes a new attribute with the given priority. - - - - - Marks the input to not be parsed by the parser. - - - - - Attaches remarks to your commands. - - - - - Attaches a summary to your command. - - - - Only the last parameter in a command may have the Remainder or Multiple flag. - - - The context of a command which may contain the client, user, guild, channel, and message. - - - - - - - - - - - - - - - - - - Indicates whether the channel that the command is executed in is a private channel. - - - - Initializes a new class with the provided client and message. - - The underlying client. - The underlying message. - - - Defines the type of error a command can throw. - - - - Thrown when the command is unknown. - - - - - Thrown when the command fails to be parsed. - - - - - Thrown when the input text has too few or too many arguments. - - - - - Thrown when the object cannot be found by the . - - - - - Thrown when more than one object is matched by . - - - - - Thrown when the command fails to meet a 's conditions. - - - - - Thrown when an exception occurs mid-command execution. - - - - - Thrown when the command is not successfully executed on runtime. - - - - - The exception that is thrown if another exception occurs during a command execution. - - - - Gets the command that caused the exception. - - - Gets the command context of the exception. - - - - Initializes a new instance of the class using a - information, a context, and the exception that - interrupted the execution. - - The command information. - The context of the command. - The exception that interrupted the command execution. - - - The command that matches the search result. - - - The alias of the command. - - - - Provides a framework for building Discord commands. - - - - The service provides a framework for building Discord commands both dynamically via runtime builders or - statically via compile-time modules. To create a command module at compile-time, see - (most common); otherwise, see . - - - This service also provides several events for monitoring command usages; such as - for any command-related log events, and - for information about commands that have - been successfully executed. - - - - - - Occurs when a command-related information is received. - - - - - Occurs when a command is executed. - - - This event is fired when a command has been executed, successfully or not. When a command fails to - execute during parsing or precondition stage, the CommandInfo may not be returned. - - - - - Represents all modules loaded within . - - - - - Represents all commands loaded within . - - - - - Represents all loaded within . - - - - - Initializes a new class. - - - - - Initializes a new class with the provided configuration. - - The configuration class. - - The cannot be set to . - - - - - Add a command module from a . - - - The following example registers the module MyModule to commandService. - - await commandService.AddModuleAsync<MyModule>(serviceProvider); - - - The type of module. - The for your dependency injection solution if using one; otherwise, pass null. - This module has already been added. - - The fails to be built; an invalid type may have been provided. - - - A task that represents the asynchronous operation for adding the module. The task result contains the - built module. - - - - - Adds a command module from a . - - The type of module. - The for your dependency injection solution if using one; otherwise, pass null . - This module has already been added. - - The fails to be built; an invalid type may have been provided. - - - A task that represents the asynchronous operation for adding the module. The task result contains the - built module. - - - - - Add command modules from an . - - The containing command modules. - The for your dependency injection solution if using one; otherwise, pass null. - - A task that represents the asynchronous operation for adding the command modules. The task result - contains an enumerable collection of modules added. - - - - - Removes the command module. - - The to be removed from the service. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the is successfully removed. - - - - - Removes the command module. - - The of the module. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the module is successfully removed. - - - - - Removes the command module. - - The of the module. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the module is successfully removed. - - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable will - also be added. - If a default exists for , a warning will be logged - and the default will be replaced. - - The object type to be read by the . - An instance of the to be added. - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable for the - value type will also be added. - If a default exists for , a warning will be logged and - the default will be replaced. - - A instance for the type to be read. - An instance of the to be added. - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable will - also be added. - - The object type to be read by the . - An instance of the to be added. - - Defines whether the should replace the default one for - if it exists. - - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable for the - value type will also be added. - - A instance for the type to be read. - An instance of the to be added. - - Defines whether the should replace the default one for if - it exists. - - - - - Searches for the command. - - The context of the command. - The position of which the command starts at. - The result containing the matching commands. - - - - Searches for the command. - - The context of the command. - The command string. - The result containing the matching commands. - - - - Executes the command. - - The context of the command. - The position of which the command starts at. - The service to be used in the command's dependency injection. - The handling mode when multiple command matches are found. - - A task that represents the asynchronous execution operation. The task result contains the result of the - command execution. - - - - - Executes the command. - - The context of the command. - The command string. - The service to be used in the command's dependency injection. - The handling mode when multiple command matches are found. - - A task that represents the asynchronous execution operation. The task result contains the result of the - command execution. - - - - - Represents a configuration class for . - - - - - Gets or sets the default commands should have, if one is not specified on the - Command attribute or builder. - - - - - Gets or sets the that separates an argument with another. - - - - - Gets or sets whether commands should be case-sensitive. - - - - - Gets or sets the minimum log level severity that will be sent to the event. - - - - - Gets or sets whether commands should push exceptions up to the caller. - - - - - Collection of aliases for matching pairs of string delimiters. - The dictionary stores the opening delimiter as a key, and the matching closing delimiter as the value. - If no value is supplied will be used, which contains - many regional equivalents. - Only values that are specified in this map will be used as string delimiters, so if " is removed then - it won't be used. - If this map is set to null or empty, the default delimiter of " will be used. - - - - QuotationMarkAliasMap = new Dictionary<char, char>() - { - {'\"', '\"' }, - {'“', '”' }, - {'「', '」' }, - } - - - - - - Gets or sets a value that indicates whether extra parameters should be ignored. - - - - - Provides extension methods for the class. - - - - - Returns commands that can be executed under the current context. - - The set of commands to be checked against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Returns commands that can be executed under the current context. - - The desired command service class to check against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Returns commands that can be executed under the current context. - - The module to be checked against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Provides extension methods for that relates to commands. - - - - - Gets whether the message starts with the provided character. - - The message to check against. - The char prefix. - References where the command starts. - - true if the message begins with the char ; otherwise false. - - - - - Gets whether the message starts with the provided string. - - - - - Gets whether the message starts with the user's mention string. - - - - - Provides the information of a command. - - - This object contains the information of a command. This can include the module of the command, various - descriptions regarding the command, and its . - - - - - Gets the module that the command belongs in. - - - - - Gets the name of the command. If none is set, the first alias is used. - - - - - Gets the summary of the command. - - - This field returns the summary of the command. and can be - useful in help commands and various implementation that fetches details of the command for the user. - - - - - Gets the remarks of the command. - - - This field returns the summary of the command. and can be - useful in help commands and various implementation that fetches details of the command for the user. - - - - - Gets the priority of the command. This is used when there are multiple overloads of the command. - - - - - Indicates whether the command accepts a [] for its - parameter. - - - - - Indicates whether extra arguments should be ignored for this command. - - - - - Gets the that is being used for the command. - - - - - Gets a list of aliases defined by the of the command. - - - - - Gets a list of information about the parameters of the command. - - - - - Gets a list of preconditions defined by the of the command. - - - - - Gets a list of attributes of the command. - - - - - Provides the information of a module. - - - - - Gets the command service associated with this module. - - - - - Gets the name of this module. - - - - - Gets the summary of this module. - - - - - Gets the remarks of this module. - - - - - Gets the group name (main prefix) of this module. - - - - - Gets a read-only list of aliases associated with this module. - - - - - Gets a read-only list of commands associated with this module. - - - - - Gets a read-only list of preconditions that apply to this module. - - - - - Gets a read-only list of attributes that apply to this module. - - - - - Gets a read-only list of submodules associated with this module. - - - - - Gets the parent module of this submodule if applicable. - - - - - Gets a value that indicates whether this module is a submodule or not. - - - - - Provides the information of a parameter. - - - - - Gets the command that associates with this parameter. - - - - - Gets the name of this parameter. - - - - - Gets the summary of this parameter. - - - - - Gets a value that indicates whether this parameter is optional or not. - - - - - Gets a value that indicates whether this parameter is a remainder parameter or not. - - - - - Gets the type of the parameter. - - - - - Gets the default value for this optional parameter if applicable. - - - - - Gets a read-only list of precondition that apply to this parameter. - - - - - Gets a read-only list of attributes that apply to this parameter. - - - - Cannot add commands to the root node. - - - - Provides a base class for a command module to inherit from. - - - - - Provides a base class for a command module to inherit from. - - A class that implements . - - - - The underlying context of the command. - - - - - - - Sends a message to the source channel. - - - Contents of the message; optional only if is specified. - - Specifies if Discord should read this aloud using text-to-speech. - An embed to be displayed alongside the . - - Specifies if notifications are sent for mentioned users and roles in the . - If null, all mentioned roles and users will be notified. - - The request options for this request. - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - - - The method to execute before executing the command. - - The of the command to be executed. - - - - The method to execute after executing the command. - - The of the command to be executed. - - - - The method to execute when building the module. - - The used to create the module. - The builder used to build the module. - - - - Specifies the behavior when multiple matches are found during the command parsing stage. - - - - Indicates that when multiple results are found, an exception should be thrown. - - - Indicates that when multiple results are found, the best result should be chosen. - - - - A for parsing objects implementing . - - - This is shipped with Discord.Net and is used by default to parse any - implemented object within a command. The TypeReader will attempt to first parse the - input by mention, then the snowflake identifier, then by name; the highest candidate will be chosen as the - final output; otherwise, an erroneous is returned. - - The type to be checked; must implement . - - - - - - - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - - - must be within the range [0, 1]. - - - must be within the range [0, 1]. - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - - - - Defines a reader class that parses user input into a specified type. - - - - - Attempts to parse the into the desired type. - - The context of the command. - The raw input of the command. - The service collection used for dependency injection. - - A task that represents the asynchronous parsing operation. The task result contains the parsing result. - - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - Contains information of the command's overall execution result. - - - - - Gets the exception that may have occurred during the command execution. - - - - - - - - - - - - - - Initializes a new with no error, indicating a successful execution. - - - A that does not contain any errors. - - - - - Initializes a new with a specified and its - reason, indicating an unsuccessful execution. - - The type of error. - The reason behind the error. - - A that contains a and reason. - - - - - Initializes a new with a specified exception, indicating an unsuccessful - execution. - - The exception that caused the command execution to fail. - - A that contains the exception that caused the unsuccessful execution, along - with a of type Exception as well as the exception message as the - reason. - - - - - Initializes a new with a specified result; this may or may not be an - successful execution depending on the and - specified. - - The result to inherit from. - - A that inherits the error type and reason. - - - - - Gets a string that indicates the execution result. - - - Success if is true; otherwise ": - ". - - - - - Contains information of the result related to a command. - - - - - Describes the error type that may have occurred during the operation. - - - A indicating the type of error that may have occurred during the operation; - null if the operation was successful. - - - - - Describes the reason for the error. - - - A string containing the error reason. - - - - - Indicates whether the operation was successful or not. - - - true if the result is positive; otherwise false. - - - - - Contains information for the parsing result from the command service's parser. - - - - - - - - - - - Provides information about the parameter that caused the parsing error. - - - A indicating the parameter info of the error that may have occurred during parsing; - null if the parsing was successful or the parsing error is not specific to a single parameter. - - - - - - - - Represents a result type for command preconditions. - - - - - - - - - - - - - - Initializes a new class with the command type - and reason. - - The type of failure. - The reason of failure. - - - - Returns a with no errors. - - - - - Returns a with and the - specified reason. - - The reason of failure. - - - - Returns a with the specified type. - - The result of failure. - - - - Returns a string indicating whether the is successful. - - - - - Initializes a new class with the type of error and reason. - - The type of failure, or null if none. - The reason of failure. - - - - - - Describes the execution reason or result. - - - - - - - - - - - - - - - - - - - - - - - - - - - TypeReaderResult was not successful. - - - - Specifies the behavior of the command execution workflow. - - - - - - - The default behavior set in . - - - - - Executes the command on the same thread as gateway one. - - - - - Executes the command on a different thread from the gateway one. - - - - - Utility class which contains the default matching pairs of quotation marks for CommandServiceConfig - - - - - A default map of open-close pairs of quotation marks. - Contains many regional and Unicode equivalents. - Used in the . - - - - - diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 3b915ef492..85769f1c56 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,4 +1,4 @@ - + @@ -7,14 +7,6 @@ The core components for the Discord.Net Labs library. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - Discord.Net.Labs.Core - Discord.Net.Labs.Core - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - false - - - ..\Discord.Net.Core\Discord.Net.Core.xml @@ -33,13 +25,4 @@ - - - Always - - - True - - - diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml deleted file mode 100644 index 0c89d54166..0000000000 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ /dev/null @@ -1,13081 +0,0 @@ - - - - Discord.Net.Core - - - - - Reading this stream is not supported. - - - - Setting the length to this stream is not supported. - - - - Seeking this stream is not supported.. - - - This stream does not accept headers. - - - - Reading stream length is not supported. - - - - Getting or setting this stream position is not supported. - - - - Reading this stream is not supported. - - - - Setting the length to this stream is not supported. - - - - Seeking this stream is not supported.. - - - Gets the current connection state of this client. - - - Gets the estimated round-trip latency, in milliseconds, to the voice WebSocket server. - - - Gets the estimated round-trip latency, in milliseconds, to the voice UDP server. - - - Gets the current audio streams. - - - Creates a new outgoing stream accepting Opus-encoded data. - - - Creates a new outgoing stream accepting Opus-encoded data. This is a direct stream with no internal timer. - - - Creates a new outgoing stream accepting PCM (raw) data. - - - Creates a new direct outgoing stream accepting PCM (raw) data. This is a direct stream with no internal timer. - - - - Represents a class containing the strings related to various Content Delivery Networks (CDNs). - - - - - Returns a team icon URL. - - The team identifier. - The icon identifier. - - A URL pointing to the team's icon. - - - - - Returns an application icon URL. - - The application identifier. - The icon identifier. - - A URL pointing to the application's icon. - - - - - Returns a user avatar URL. - - The user snowflake identifier. - The avatar identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the user's avatar in the specified size. - - - - - Returns a user banner URL. - - The user snowflake identifier. - The banner identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the user's banner in the specified size. - - - - - Returns the default user avatar URL. - - The discriminator value of a user. - - A URL pointing to the user's default avatar when one isn't set. - - - - - Returns an icon URL. - - The guild snowflake identifier. - The icon identifier. - - A URL pointing to the guild's icon. - - - - - Returns a guild role's icon URL. - - The role identifier. - The icon hash. - - A URL pointing to the guild role's icon. - - - - - Returns a guild splash URL. - - The guild snowflake identifier. - The splash icon identifier. - - A URL pointing to the guild's splash. - - - - - Returns a guild discovery splash URL. - - The guild snowflake identifier. - The discovery splash icon identifier. - - A URL pointing to the guild's discovery splash. - - - - - Returns a channel icon URL. - - The channel snowflake identifier. - The icon identifier. - - A URL pointing to the channel's icon. - - - - - Returns a guild banner URL. - - The guild snowflake identifier. - The banner image identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048 inclusive. - - A URL pointing to the guild's banner image. - - - - - Returns an emoji URL. - - The emoji snowflake identifier. - Whether this emoji is animated. - - A URL pointing to the custom emote. - - - - - Returns a Rich Presence asset URL. - - The application identifier. - The asset identifier. - The size of the image to return in. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the asset image in the specified size. - - - - - Returns a Spotify album URL. - - The identifier for the album art (e.g. 6be8f4c8614ecf4f1dd3ebba8d8692d8ce4951ac). - - A URL pointing to the Spotify album art. - - - - - Returns a Spotify direct URL for a track. - - The identifier for the track (e.g. 4uLU6hMCjMI75M1A2tKUQC). - - A URL pointing to the Spotify track. - - - - - Gets a stickers url based off the id and format. - - The id of the sticker. - The format of the sticker. - - A URL to the sticker. - - - - - Represents a context of a command. This may include the client, guild, channel, user, and message. - - - - - Gets the that the command is executed with. - - - - - Gets the that the command is executed in. - - - - - Gets the that the command is executed in. - - - - - Gets the who executed the command. - - - - - Gets the that the command is interpreted from. - - - - Specifies the connection state of a client. - - - The client has disconnected from Discord. - - - The client is connecting to Discord. - - - The client has established a connection to Discord. - - - The client is disconnecting from Discord. - - - - Defines various behaviors of Discord.Net. - - - - - Returns the API version Discord.Net uses. - - - An representing the API version that Discord.Net uses to communicate with Discord. - A list of available API version can be seen on the official - Discord API documentation - . - - - - - Returns the Voice API version Discord.Net uses. - - - An representing the API version that Discord.Net uses to communicate with Discord's - voice server. - - - - - Gets the Discord.Net version, including the build number. - - - A string containing the detailed version information, including its build number; Unknown when - the version fails to be fetched. - - - - - Gets the user agent that Discord.Net uses in its clients. - - - The user agent used in each Discord.Net request. - - - - - Returns the base Discord API URL. - - - The Discord API URL using . - - - - - Returns the base Discord CDN URL. - - - The base Discord Content Delivery Network (CDN) URL. - - - - - Returns the base Discord invite URL. - - - The base Discord invite URL. - - - - - Returns the default timeout for requests. - - - The amount of time it takes in milliseconds before a request is timed out. - - - - - Returns the max length for a Discord message. - - - The maximum length of a message allowed by Discord. - - - - - Returns the max messages allowed to be in a request. - - - The maximum number of messages that can be gotten per-batch. - - - - - Returns the max users allowed to be in a request. - - - The maximum number of users that can be gotten per-batch. - - - - - Returns the max guilds allowed to be in a request. - - - The maximum number of guilds that can be gotten per-batch. - - - - - Returns the max user reactions allowed to be in a request. - - - The maximum number of user reactions that can be gotten per-batch. - - - - - Returns the max audit log entries allowed to be in a request. - - - The maximum number of audit log entries that can be gotten per-batch. - - - - - Gets or sets how a request should act in the case of an error, by default. - - - The currently set . - - - - - Gets or sets the minimum log level severity that will be sent to the Log event. - - - The currently set for logging level. - - - - - Gets or sets whether the initial log entry should be printed. - - - If set to true, the library will attempt to print the current version of the library, as well as - the API version it uses on startup. - - - - - Gets or sets whether or not rate-limits should use the system clock. - - - If set to false, we will use the X-RateLimit-Reset-After header - to determine when a rate-limit expires, rather than comparing the - X-RateLimit-Reset timestamp to the system time. - - This should only be changed to false if the system is known to have - a clock that is out of sync. Relying on the Reset-After header will - incur network lag. - - Regardless of this property, we still rely on the system's wall-clock - to determine if a bucket is rate-limited; we do not use any monotonic - clock. Your system will still need a stable clock. - - - - - Flags for the property, that are ORd together. - These describe what the activity payload includes. - - - - - Indicates that no actions on this activity can be taken. - - - - - Indicates that this activity can be joined. - - - - - Indicates that this activity can be spectated. - - - - - Indicates that a user may request to join an activity. - - - - - Indicates that a user can listen along in Spotify. - - - - - Indicates that a user can play this song. - - - - - Specifies a Discord user's activity type. - - - - - The user is playing a game. - - - - - The user is streaming online. - - - - - The user is listening to a song. - - - - - The user is watching some form of media. - - - - - The user has set a custom status. - - - - - The user is competing in a game. - - - - - A user's activity for their custom status. - - - - - Gets the emote, if it is set. - - - An containing the or set by the user. - - - - - Gets the timestamp of when this status was created. - - - A containing the time when this status was created. - - - - - Gets the state of the status. - - - - - A user's game status. - - - - - - - - - - - - - - - - - Creates a with the provided name and . - - The name of the game. - The type of activity. - - - Returns the name of the . - - - - An asset for a object containing the text and image. - - - - - Gets the description of the asset. - - - A string containing the description of the asset. - - - - - Gets the image ID of the asset. - - - A string containing the unique image identifier of the asset. - - - - - Returns the image URL of the asset. - - The size of the image to return in. This can be any power of two between 16 and 2048. - The format to return. - - A string pointing to the image URL of the asset; null when the application ID does not exist. - - - - - Party information for a object. - - - - - Gets the ID of the party. - - - A string containing the unique identifier of the party. - - - - - Gets the party's current and maximum size. - - - A representing the capacity of the party. - - - - - Party secret for a object. - - - - - Gets the secret for a specific instanced match. - - - - - Gets the secret for joining a party. - - - - - Gets the secret for spectating a game. - - - - - Timestamps for a object. - - - - - Gets when the activity started. - - - - - Gets when the activity ends. - - - - - A user's activity status, typically a . - - - - - Gets the name of the activity. - - - A string containing the name of the activity that the user is doing. - - - - - Gets the type of the activity. - - - The type of activity. - - - - - Gets the flags that are relevant to this activity. - - - This value is determined by bitwise OR-ing values together. - - - The value of flags for this activity. - - - - - Gets the details on what the player is currently doing. - - - A string describing what the player is doing. - - - - - A user's Rich Presence status. - - - - - Gets the user's current party status. - - - - - Gets the application ID for the game. - - - - - Gets the small image for the presence and their hover texts. - - - - - Gets the large image for the presence and their hover texts. - - - - - Gets the information for the current party of the player. - - - - - Gets the secrets for Rich Presence joining and spectating. - - - - - Gets the timestamps for start and/or end of the game. - - - - - Returns the name of the Rich Presence. - - - - - A user's activity for listening to a song on Spotify. - - - - - Gets the song's artist(s). - - - A collection of string containing all artists featured in the track (e.g. Avicii; Rita Ora). - - - - - Gets the Spotify album title of the song. - - - A string containing the name of the album (e.g. AVĪCI (01)). - - - - - Gets the track title of the song. - - - A string containing the name of the song (e.g. Lonely Together (feat. Rita Ora)). - - - - - Gets the date when the track started playing. - - - A containing the start timestamp of the song. - - - - - Gets the date when the track ends. - - - A containing the finish timestamp of the song. - - - - - Gets the duration of the song. - - - A containing the duration of the song. - - - - - Gets the elapsed duration of the song. - - - A containing the elapsed duration of the song. - - - - - Gets the remaining duration of the song. - - - A containing the remaining duration of the song. - - - - - Gets the track ID of the song. - - - A string containing the Spotify ID of the track (e.g. 7DoN0sCGIT9IcLrtBDm4f0). - - - - - Gets the session ID of the song. - - - The purpose of this property is currently unknown. - - - A string containing the session ID. - - - - - Gets the URL of the album art. - - - A URL pointing to the album art of the track (e.g. - https://i.scdn.co/image/ba2fd8823d42802c2f8738db0b33a4597f2f39e7). - - - - - Gets the direct Spotify URL of the track. - - - A URL pointing directly to the track on Spotify. (e.g. - https://open.spotify.com/track/7DoN0sCGIT9IcLrtBDm4f0). - - - - - Gets the full information of the song. - - - A string containing the full information of the song (e.g. - Avicii, Rita Ora - Lonely Together (feat. Rita Ora) (3:08) - - - - - A user's activity for streaming on services such as Twitch. - - - - - Gets the URL of the stream. - - - - - Creates a new based on the on the stream URL. - - The name of the stream. - The URL of the stream. - - - - Gets the name of the stream. - - - - - Representing a type of action within an . - - - - - this guild was updated. - - - - - A channel was created. - - - - - A channel was updated. - - - - - A channel was deleted. - - - - - A permission overwrite was created for a channel. - - - - - A permission overwrite was updated for a channel. - - - - - A permission overwrite was deleted for a channel. - - - - - A user was kicked from this guild. - - - - - A prune took place in this guild. - - - - - A user banned another user from this guild. - - - - - A user unbanned another user from this guild. - - - - - A guild member whose information was updated. - - - - - A guild member's role collection was updated. - - - - - A guild member moved to a voice channel. - - - - - A guild member disconnected from a voice channel. - - - - - A bot was added to this guild. - - - - - A role was created in this guild. - - - - - A role was updated in this guild. - - - - - A role was deleted from this guild. - - - - - An invite was created in this guild. - - - - - An invite was updated in this guild. - - - - - An invite was deleted from this guild. - - - - - A Webhook was created in this guild. - - - - - A Webhook was updated in this guild. - - - - - A Webhook was deleted from this guild. - - - - - An emoji was created in this guild. - - - - - An emoji was updated in this guild. - - - - - An emoji was deleted from this guild. - - - - - A message was deleted from this guild. - - - - - Multiple messages were deleted from this guild. - - - - - A message was pinned from this guild. - - - - - A message was unpinned from this guild. - - - - - A integration was created - - - - - A integration was updated - - - - - An integration was deleted - - - - - A stage instance was created. - - - - - A stage instance was updated. - - - - - A stage instance was deleted. - - - - - A sticker was created. - - - - - A sticker was updated. - - - - - A sticker was deleted. - - - - - A thread was created. - - - - - A thread was updated. - - - - - A thread was deleted. - - - - - Represents data applied to an . - - - - - Represents a generic audit log entry. - - - - - Gets the action which occurred to create this entry. - - - The type of action for this audit log entry. - - - - - Gets the data for this entry. - - - An for this audit log entry; null if no data is available. - - - - - Gets the user responsible for causing the changes. - - - A user object. - - - - - Gets the reason behind the change. - - - A string containing the reason for the change; null if none is provided. - - - - - Specifies the cache mode that should be used. - - - - - Allows the object to be downloaded if it does not exist in the current cache. - - - - - Only allows the object to be pulled from the existing cache. - - - - Defines the types of channels. - - - The channel is a text channel. - - - The channel is a Direct Message channel. - - - The channel is a voice channel. - - - The channel is a group channel. - - - The channel is a category channel. - - - The channel is a news channel. - - - The channel is a store channel. - - - The channel is a temporary thread channel under a news channel. - - - The channel is a temporary thread channel under a text channel. - - - The channel is a private temporary thread channel under a text channel. - - - The channel is a stage voice channel. - - - - Specifies the direction of where message(s) should be retrieved from. - - - This enum is used to specify the direction for retrieving messages. - - At the time of writing, is not yet implemented into - . - Attempting to use the method with will throw - a . - - - - - - The message(s) should be retrieved before a message. - - - - - The message(s) should be retrieved after a message. - - - - - The message(s) should be retrieved around a message. - - - - - Properties that are used to modify an with the specified changes. - - - - - - Gets or sets the channel to this name. - - - This property defines the new name for this channel. - - When modifying an , the must be alphanumeric with - dashes. It must match the RegEx [a-z0-9-_]{2,100}. - - - - - - Moves the channel to the following position. This property is zero-based. - - - - - Gets or sets the category ID for this channel. - - - Setting this value to a category's snowflake identifier will change or set this channel's parent to the - specified channel; setting this value to will detach this channel from its parent if one - is set. - - - - - Gets or sets the permission overwrites for this channel. - - - - - Represents a generic audio channel. - - - - - Connects to this audio channel. - - Determines whether the client should deaf itself upon connection. - Determines whether the client should mute itself upon connection. - Determines whether the audio client is an external one or not. - - A task representing the asynchronous connection operation. The task result contains the - responsible for the connection. - - - - - Disconnects from this audio channel. - - - A task representing the asynchronous operation for disconnecting from the audio channel. - - - - - Represents a generic category channel. - - - - - Represents a generic channel. - - - - - Gets the name of this channel. - - - A string containing the name of this channel. - - - - - Gets a collection of users that are able to view the channel or are currently in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - This method will attempt to fetch all users that is able to view this channel or is currently in this channel. - The library will attempt to split up the requests according to and . - In other words, if there are 3000 users, and the constant - is 1000, the request will be split into 3 individual requests; thus returning 53individual asynchronous - responses, hence the need of flattening. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - Paged collection of users. - - - - - Gets a user in this channel. - - The snowflake identifier of the user (e.g. 168693960628371456). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a user object that - represents the found user; null if none is found. - - - - - Represents a generic direct-message channel. - - - - - Gets the recipient of all messages in this channel. - - - A user object that represents the other user in this channel. - - - - - Closes this private channel, removing it from your channel list. - - The options to be used when sending the request. - - A task that represents the asynchronous close operation. - - - - - Represents a generic private group channel. - - - - - Leaves this group. - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Represents a generic guild channel. - - - - - - - - Gets the position of this channel. - - - An representing the position of this channel in the guild's channel list relative to - others of the same type. - - - - - Gets the guild associated with this channel. - - - A guild object that this channel belongs to. - - - - - Gets the guild ID associated with this channel. - - - An representing the guild snowflake identifier for the guild that this channel - belongs to. - - - - - Gets a collection of permission overwrites for this channel. - - - A collection of overwrites associated with this channel. - - - - - Modifies this guild channel. - - - This method modifies the current guild channel with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The delegate containing the properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Adds or updates the permission overwrite for the given role. - - - The following example fetches a role via and a channel via - . Next, it checks if an overwrite had already been set via - ; if not, it denies the role from sending any - messages to the channel. - - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the - channel. - - - - - Adds or updates the permission overwrite for the given user. - - - The following example fetches a user via and a channel via - . Next, it checks if an overwrite had already been set via - ; if not, it denies the user from sending any - messages to the channel. - - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Gets a collection of users that are able to view the channel or are currently in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - Paged collection of users. - - - - - Gets a user in this channel. - - The snowflake identifier of the user. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task representing the asynchronous get operation. The task result contains a guild user object that - represents the user; null if none is found. - - - - - Represents a generic channel that can send and receive messages. - - - - - Sends a message to this message channel. - - - The following example sends a message with the current system time in RFC 1123 format to the channel and - deletes itself after 5 seconds. - - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a local file called wumpus.txt along with the text - good discord boi to the channel. - - The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the - channel. - - - - This method sends a file as if you are uploading an attachment directly from your Discord client. - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a - rich embed to the channel. - - - - This method sends a file as if you are uploading an attachment directly from your Discord client. - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a message from this message channel. - - The snowflake identifier of the message. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under . The - library will attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example downloads 300 messages and gets messages that belong to the user - 53905483156684800. - - - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under around - the message depending on the . The library will - attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets 5 message prior to the message identifier 442012544660537354. - - The following example attempts to retrieve messageCount number of messages from the - beginning of the channel and prints them to the console. - - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under around - the message depending on the . The library will - attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets 5 message prior to a specific message, oldMessage. - - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of pinned messages in this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a collection of messages found in the pinned messages. - - - - - Deletes a message. - - The snowflake identifier of the message that would be removed. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - Deletes a message based on the provided message in this channel. - The message that would be removed. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Modifies a message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The snowflake identifier of the message that would be changed. - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. - - The options to be used when sending the request. - - A task that represents the asynchronous operation that triggers the broadcast. - - - - - Continuously broadcasts the "user is typing" message to all users in this channel until the returned - object is disposed. - - - The following example keeps the client in the typing state until LongRunningAsync has finished. - - - The options to be used when sending the request. - - A disposable object that, upon its disposal, will stop the client from broadcasting its typing state in - this channel. - - - - - Represents a type of guild channel that can be nested within a category. - - - - - Gets the parent (category) ID of this channel in the guild's channel list. - - - A representing the snowflake identifier of the parent of this channel; - null if none is set. - - - - - Gets the parent (category) channel of this channel. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - Syncs the permissions of this nested channel with its parent's. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for syncing channel permissions with its parent's. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The id of the embedded application to open for this invite. - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The id of the user whose stream to display for this invite. - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Gets a collection of all invites to this channel. - B - - The following example gets all of the invites that have been created in this channel and selects the - most used invite. - - var invites = await channel.GetInvitesAsync(); - if (invites.Count == 0) return; - var invite = invites.OrderByDescending(x => x.Uses).FirstOrDefault(); - - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of invite metadata that are created for this channel. - - - - - Represents a generic news channel in a guild that can send and receive messages. - - - - - Represents a generic channel that is private to select recipients. - - - - - Gets the users that can access this channel. - - - A read-only collection of users that can access this channel. - - - - - Represents a generic Stage Channel. - - - - - Gets the topic of the Stage instance. - - - If the stage isn't live then this property will be set to . - - - - - The of the current stage. - Gets the of the current stage. - - - If the stage isn't live then this property will be set to . - - - - - Gets whether or not stage discovery is disabled. - - - - - Gets whether or not the stage is live. - - - - - Starts the stage, creating a stage instance. - - The topic for the stage/ - The privacy level of the stage. - The options to be used when sending the request. - - A task that represents the asynchronous start operation. - - - - - Modifies the current stage instance. - - The properties to modify the stage instance with. - The options to be used when sending the request. - - A task that represents the asynchronous modify operation. - - - - - Stops the stage, deleting the stage instance. - - The options to be used when sending the request. - - A task that represents the asynchronous stop operation. - - - - - Indicates that the bot would like to speak within a stage channel. - - The options to be used when sending the request. - - A task that represents the asynchronous request to speak operation. - - - - - Makes the current user become a speaker within a stage. - - The options to be used when sending the request. - - A task that represents the asynchronous speaker modify operation. - - - - - Makes the current user a listener. - - The options to be used when sending the request. - - A task that represents the asynchronous stop operation. - - - - - Makes a user a speaker within a stage. - - The user to make the speaker. - The options to be used when sending the request. - - A task that represents the asynchronous move operation. - - - - - Removes a user from speaking. - - The user to remove from speaking. - The options to be used when sending the request. - - A task that represents the asynchronous remove operation. - - - - - Represents a generic channel in a guild that can send and receive messages. - - - - - Gets a value that indicates whether the channel is NSFW. - - - true if the channel has the NSFW flag enabled; otherwise false. - - - - - Gets the current topic for this text channel. - - - A string representing the topic set in the channel; null if none is set. - - - - - Gets the current slow-mode delay for this channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - - - - - Bulk-deletes multiple messages. - - - The following example gets 250 messages from the channel and deletes them. - - var messages = await textChannel.GetMessagesAsync(250).FlattenAsync(); - await textChannel.DeleteMessagesAsync(messages); - - - - This method attempts to remove the messages specified in bulk. - - Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! - - - The messages to be bulk-deleted. - The options to be used when sending the request. - - A task that represents the asynchronous bulk-removal operation. - - - - - Bulk-deletes multiple messages. - - - This method attempts to remove the messages specified in bulk. - - Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! - - - The snowflake identifier of the messages to be bulk-deleted. - The options to be used when sending the request. - - A task that represents the asynchronous bulk-removal operation. - - - - - Modifies this text channel. - - The delegate containing the properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - Represents a thread channel inside of a guild. - - - - - Gets the type of the current thread channel. - - - - - Gets whether or not the current user has joined this thread. - - - - - if the current thread is archived, otherwise . - - - - - Gets whether or not the current thread is archived. - - - - - Gets the timestamp when the thread's archive status was last changed, used for calculating recent activity. - - - - - Gets whether or not the current thread is locked. - - - - - Gets an approximate count of users in a thread, stops counting after 50. - - - - - Gets an approximate count of messages in a thread, stops counting after 50. - - - - - Joins the current thread. - - The options to be used when sending the request. - - A task that represents the asynchronous join operation. - - - - - Leaves the current thread. - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Adds a user to this thread. - - The to add. - The options to be used when sending the request. - - A task that represents the asynchronous operation of adding a member to a thread. - - - - - Removes a user from this thread. - - The to remove from this thread. - The options to be used when sending the request. - - A task that represents the asynchronous operation of removing a user from this thread. - - - - - Represents a generic voice channel in a guild. - - - - - Gets the bit-rate that the clients in this voice channel are requested to use. - - - An representing the bit-rate (bps) that this voice channel defines and requests the - client(s) to use. - - - - - Gets the max number of users allowed to be connected to this channel at once. - - - An representing the maximum number of users that are allowed to be connected to this - channel at once; null if a limit is not set. - - - - - Modifies this voice channel. - - The properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - - Provides properties that are used to reorder an . - - - - - Gets the ID of the channel to apply this position to. - - - A representing the snowflake identifier of this channel. - - - - - Gets the new zero-based position of this channel. - - - An representing the new position of this channel. - - - - Initializes a new instance of the class used to reorder a channel. - Sets the ID of the channel to apply this position to. - Sets the new zero-based position of this channel. - - - - Represents properties to use when modifying a stage instance. - - - - - Gets or sets the topic of the stage. - - - - - Gets or sets the privacy level of the stage. - - - - - Specifies the privacy levels of a Stage instance. - - - - - The Stage instance is visible publicly, such as on Stage Discovery. - - - - - The Stage instance is visible to only guild members. - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the topic of the channel. - - - Setting this value to any string other than null or will set the - channel topic or description to the desired value. - - - - - Gets or sets whether this channel should be flagged as NSFW. - - - Setting this value to true will mark the channel as NSFW (Not Safe For Work) and will prompt the - user about its possibly mature nature before they may view the channel; setting this value to false will - remove the NSFW indicator. - - - - - Gets or sets the slow-mode ratelimit in seconds for this channel. - - - Setting this value to anything above zero will require each user to wait X seconds before - sending another message; setting this value to 0 will disable slow-mode for this channel. - - Users with or - will be exempt from slow-mode. - - - Thrown if the value does not fall within [0, 21600]. - - - - Gets or sets whether or not the thread is archived. - - - - - Gets or sets whether or not the thread is locked. - - - - - Gets or sets the auto archive duration. - - - - - Represents the thread auto archive duration. - - - - - One hour (60 minutes). - - - - - One day (1440 minutes). - - - - - Three days (4320 minutes). - - This option is explicitly available to nitro users. - - - - - - One week (10080 minutes). - - This option is explicitly available to nitro users. - - - - - - Represents types of threads. - - - - - Represents a temporary sub-channel within a GUILD_NEWS channel. - - - - - Represents a temporary sub-channel within a GUILD_TEXT channel. - - - - - Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission - - - - - Provides properties that are used to modify an with the specified changes. - - - - - Gets or sets the bitrate of the voice connections in this channel. Must be greater than 8000. - - - - - Gets or sets the maximum number of users that can be present in a channel, or null if none. - - - - - A Unicode emoji. - - - - - - - - Gets the Unicode representation of this emoji. - - - A string that resolves to . - - - - - Initializes a new class with the provided Unicode. - - The pure UTF-8 encoding of an emoji. - - - - Determines whether the specified emoji is equal to the current one. - - The object to compare with the current object. - - - Tries to parse an from its raw format. - The raw encoding of an emoji. For example: :heart: or ❤ - An emoji. - - - Parse an from its raw format. - The raw encoding of an emoji. For example: :heart: or ❤ - String is not emoji or unicode! - - - - - - - A custom image-based emote. - - - - - - - - - - - Gets whether this emote is animated. - - - A boolean that determines whether or not this emote is an animated one. - - - - - - - - Gets the image URL of this emote. - - - A string that points to the URL of this emote. - - - - - Determines whether the specified emote is equal to the current emote. - - The object to compare with the current object. - - - - - - Parses an from its raw format. - The raw encoding of an emote (e.g. <:dab:277855270321782784>). - An emote. - Invalid emote format. - - - Tries to parse an from its raw format. - The raw encoding of an emote; for example, <:dab:277855270321782784>. - An emote. - - - - Returns the raw representation of the emote. - - - A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the name of the . - - - - - Gets or sets the roles that can access this . - - - - - An image-based emote that is attached to a guild. - - - - - Gets whether this emoji is managed by an integration. - - - A boolean that determines whether or not this emote is managed by a Twitch integration. - - - - - Gets whether this emoji must be wrapped in colons. - - - A boolean that determines whether or not this emote requires the use of colons in chat to be used. - - - - - Gets the roles that are allowed to use this emoji. - - - A read-only list containing snowflake identifiers for roles that are allowed to use this emoji. - - - - - Gets the user ID associated with the creation of this emoji. - - - An snowflake identifier representing the user who created this emoji; - null if unknown. - - - - - Gets the raw representation of the emote. - - - A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). - - - - - Represents a general container for any type of emote in a message. - - - - - Gets the display name or Unicode representation of this emote. - - - A string representing the display name or the Unicode representation (e.g. 🤔) of this emote. - - - - - Stores the gateway information related to the current bot. - - - - - Gets the WSS URL that can be used for connecting to the gateway. - - - - - Gets the recommended number of shards to use when connecting. - - - - - Gets the that contains the information - about the current session start limit. - - - - - Stores the information related to the gateway identify request. - - - - - Gets the total number of session starts the current user is allowed. - - - The maximum amount of session starts the current user is allowed. - - - - - Gets the remaining number of session starts the current user is allowed. - - - The remaining amount of session starts the current user is allowed. - - - - - Gets the number of milliseconds after which the limit resets. - - - The milliseconds until the limit resets back to the . - - - - - Gets the maximum concurrent identify requests in a time window. - - - The maximum concurrent identify requests in a time window, - limited to the same rate limit key. - - - - - Specifies the default message notification behavior the guild uses. - - - - - By default, all messages will trigger notifications. - - - - - By default, only mentions will trigger notifications. - - - - No messages will be scanned. - - - Scans messages from all guild members that do not have a role. - Recommented option for servers that use roles for trusted membership. - - - Scan messages sent by all guild members. - - - - Provides properties used to modify an with the specified changes. - - - - - Gets or sets the behavior when an integration subscription lapses. - - - - - Gets or sets the period (in seconds) where the integration will ignore lapsed subscriptions. - - - - - Gets or sets whether emoticons should be synced for this integration. - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the name of the guild. Must be within 100 characters. - - - - - Gets or sets the region for the guild's voice connections. - - - - - Gets or sets the ID of the region for the guild's voice connections. - - - - - Gets or sets the verification level new users need to achieve before speaking. - - - - - Gets or sets the default message notification state for the guild. - - - - - Gets or sets how many seconds before a user is sent to AFK. This value MUST be one of: (60, 300, 900, - 1800, 3600). - - - - - Gets or sets the icon of the guild. - - - - - Gets or sets the banner of the guild. - - - - - Gets or sets the guild's splash image. - - - The guild must be partnered for this value to have any effect. - - - - - Gets or sets the where AFK users should be sent. - - - - - Gets or sets the ID of the where AFK users should be sent. - - - - - Gets or sets the where system messages should be sent. - - - - - Gets or sets the ID of the where system messages should be sent. - - - - - Gets or sets the owner of this guild. - - - - - Gets or sets the ID of the owner of this guild. - - - - - Gets or sets the explicit content filter level of this guild. - - - - - Gets or sets the flags that DISABLE types of system channel messages. - - - These flags are inverted. Setting a flag will disable that system channel message from being sent. - A value of will allow all system channel message types to be sent, - given that the has also been set. - A value of will deny guild boost messages from being sent, and allow all - other types of messages. - Refer to the extension methods and - to check if these system channel message types - are enabled, without the need to manipulate the logic of the flag. - - - - - Gets or sets the preferred locale of the guild in IETF BCP 47 language tag format. - - - This property takes precedence over . - When it is set, the value of - will not be used. - - - - - Gets or sets the preferred locale of the guild. - - - The property takes precedence - over this property. When is set, - the value of will be unused. - - - - - Provides properties that are used to modify the widget of an with the specified changes. - - - - - Sets whether the widget should be enabled. - - - - - Sets the channel that the invite should place its users in, if not . - - - - - Sets the channel that the invite should place its users in, if not . - - - - - Represents a generic ban object. - - - - - Gets the banned user. - - - A user that was banned. - - - - - Gets the reason why the user is banned if specified. - - - A string containing the reason behind the ban; null if none is specified. - - - - - Represents a generic guild/server. - - - - - Gets the name of this guild. - - - A string containing the name of this guild. - - - - - Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are - automatically moved to the AFK voice channel. - - - An representing the amount of time in seconds for a user to be marked as inactive - and moved into the AFK voice channel. - - - - - Gets a value that indicates whether this guild has the widget enabled. - - - if this guild has a widget enabled; otherwise . - - - - - Gets the default message notifications for users who haven't explicitly set their notification settings. - - - - - Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to - perform administrative actions in this guild. - - - The level of MFA requirement. - - - - - Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. - - - The level of requirements. - - - - - Gets the level of content filtering applied to user's content in a Guild. - - - The level of explicit content filtering. - - - - - Gets the ID of this guild's icon. - - - An identifier for the splash image; if none is set. - - - - - Gets the URL of this guild's icon. - - - A URL pointing to the guild's icon; if none is set. - - - - - Gets the ID of this guild's splash image. - - - An identifier for the splash image; if none is set. - - - - - Gets the URL of this guild's splash image. - - - A URL pointing to the guild's splash image; if none is set. - - - - - Gets the ID of this guild's discovery splash image. - - - An identifier for the discovery splash image; if none is set. - - - - - Gets the URL of this guild's discovery splash image. - - - A URL pointing to the guild's discovery splash image; if none is set. - - - - - Determines if this guild is currently connected and ready to be used. - - - - This property only applies to a WebSocket-based client. - - This boolean is used to determine if the guild is currently connected to the WebSocket and is ready to be used/accessed. - - - true if this guild is currently connected and ready to be used; otherwise . - - - - - Gets the ID of the AFK voice channel for this guild. - - - A representing the snowflake identifier of the AFK voice channel; if - none is set. - - - - - Gets the ID of the channel assigned to the widget of this guild. - - - A representing the snowflake identifier of the channel assigned to the widget found - within the widget settings of this guild; if none is set. - - - - - Gets the ID of the channel where randomized welcome messages are sent. - - - A representing the snowflake identifier of the system channel where randomized - welcome messages are sent; if none is set. - - - - - Gets the ID of the channel with the rules. - - - A representing the snowflake identifier of the channel that contains the rules; - if none is set. - - - - - Gets the ID of the channel where admins and moderators of Community guilds receive notices from Discord. - - - A representing the snowflake identifier of the channel where admins and moderators - of Community guilds receive notices from Discord; if none is set. - - - - - Gets the ID of the user that owns this guild. - - - A representing the snowflake identifier of the user that owns this guild. - - - - - Gets the application ID of the guild creator if it is bot-created. - - - A representing the snowflake identifier of the application ID that created this guild, or if it was not bot-created. - - - - - Gets the ID of the region hosting this guild's voice channels. - - - A string containing the identifier for the voice region that this guild uses (e.g. eu-central). - - - - - Gets the currently associated with this guild. - - - An currently associated with this guild. - - - - - Gets the built-in role containing all users in this guild. - - - A role object that represents an @everyone role in this guild. - - - - - Gets a collection of all custom emotes for this guild. - - - A read-only collection of all custom emotes for this guild. - - - - - Gets a collection of all custom stickers for this guild. - - - A read-only collection of all custom stickers for this guild. - - - - - Gets a collection of all extra features added to this guild. - - - A read-only collection of enabled features in this guild. - - - - - Gets a collection of all roles in this guild. - - - A read-only collection of roles found within this guild. - - - - - Gets the tier of guild boosting in this guild. - - - The tier of guild boosting in this guild. - - - - - Gets the identifier for this guilds banner image. - - - An identifier for the banner image; if none is set. - - - - - Gets the URL of this guild's banner image. - - - A URL pointing to the guild's banner image; if none is set. - - - - - Gets the code for this guild's vanity invite URL. - - - A string containing the vanity invite code for this guild; if none is set. - - - - - Gets the flags for the types of system channel messages that are disabled. - - - The flags for the types of system channel messages that are disabled. - - - - - Gets the description for the guild. - - - The description for the guild; if none is set. - - - - - Gets the number of premium subscribers of this guild. - - - This is the number of users who have boosted this guild. - - - The number of premium subscribers of this guild; if not available. - - - - - Gets the maximum number of presences for the guild. - - - The maximum number of presences for the guild. - - - - - Gets the maximum number of members for the guild. - - - The maximum number of members for the guild. - - - - - Gets the maximum amount of users in a video channel. - - - The maximum amount of users in a video channel. - - - - - Gets the approximate number of members in this guild. - - - Only available when getting a guild via REST when `with_counts` is true. - - - The approximate number of members in this guild. - - - - - Gets the approximate number of non-offline members in this guild. - - - Only available when getting a guild via REST when `with_counts` is true. - - - The approximate number of non-offline members in this guild. - - - - - Gets the preferred locale of this guild in IETF BCP 47 - language tag format. - - - The preferred locale of the guild in IETF BCP 47 - language tag format. - - - - - Gets the NSFW level of this guild. - - - The NSFW level of this guild. - - - - - Gets the preferred culture of this guild. - - - The preferred culture information of this guild. - - - - - Modifies this guild. - - The delegate containing the properties to modify the guild with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Modifies this guild's widget. - - The delegate containing the properties to modify the guild widget with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Bulk-modifies the order of channels in this guild. - - The properties used to modify the channel positions with. - The options to be used when sending the request. - - A task that represents the asynchronous reorder operation. - - - - - Bulk-modifies the order of roles in this guild. - - The properties used to modify the role positions with. - The options to be used when sending the request. - - A task that represents the asynchronous reorder operation. - - - - - Leaves this guild. - - - This method will make the currently logged-in user leave the guild. - - If the user is the owner of this guild, use instead. - - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Bans the user from this guild and optionally prunes their recent messages. - - The user to ban. - The number of days to remove messages from this user for, and this number must be between [0, 7]. - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous add operation for the ban. - - - - - Bans the user from this guild and optionally prunes their recent messages. - - The snowflake ID of the user to ban. - The number of days to remove messages from this user for, and this number must be between [0, 7]. - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous add operation for the ban. - - - - - Unbans the user if they are currently banned. - - The user to be unbanned. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation for the ban. - - - - - Unbans the user if they are currently banned. - - The snowflake identifier of the user to be unbanned. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation for the ban. - - - - - Gets a collection of all channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - generic channels found within this guild. - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the generic channel - associated with the specified ; if none is found. - - - - - Gets a collection of all text channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - message channels found within this guild. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - associated with the specified ; if none is found. - - - - - Gets a collection of all voice channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - category channels found within this guild. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel associated - with the specified ; if none is found. - - - - - Gets a stage channel in this guild. - - The snowflake identifier for the stage channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the stage channel associated - with the specified ; if none is found. - - - - - Gets a collection of all stage channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - stage channels found within this guild. - - - - - Gets the AFK voice channel in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel that the - AFK users will be moved to after they have idled for too long; if none is set. - - - - - Gets the system channel where randomized welcome messages are sent in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel where - randomized welcome messages will be sent to; if none is set. - - - - - Gets the first viewable text channel in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the first viewable text - channel in this guild; if none is found. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the widget channel set - within the server's widget settings; if none is set. - - - - - Gets the text channel where Community guilds can display rules and/or guidelines. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where Community guilds can display rules and/or guidelines; if none is set. - - - - - Gets the text channel where admins and moderators of Community guilds receive notices from Discord. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel where - admins and moderators of Community guilds receive notices from Discord; if none is set. - - - - - Gets a thread channel within this guild. - - The id of the thread channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the thread channel. - - - - - Gets a collection of all thread channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - thread channels found within this guild. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a new voice channel in this guild. - - The new name for the voice channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a new channel category in this guild. - - The new name for the category. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the partial metadata of - the vanity invite found within this guild; if none is found. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - Whether the role can be mentioned. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Adds a user to this guild. - - - This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. - - The snowflake identifier of the user. - The OAuth2 access token for the user, requested with the guilds.join scope. - The delegate containing the properties to be applied to the user upon being added to the guild. - The options to be used when sending the request. - A guild user associated with the specified ; if the user is already in the guild. - - - - Disconnects the user from its current voice channel. - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild. - - This may return an incomplete collection in the WebSocket implementation due to how Discord does not - send a complete user list for large guilds. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds. - - - The snowflake identifier of the user. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild user - associated with the specified ; if none is found. - - - - - Gets the current user for this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the currently logged-in - user within this guild. - - - - - Gets the owner of this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the owner of this guild. - - - - - Downloads all users for this guild if the current list is incomplete. - - - This method downloads all users found within this guild through the Gateway and caches them. - - - A task that represents the asynchronous download operation. - - - - - Prunes inactive users. - - - - This method removes all users that have not logged on in the provided number of . - - - If is true, this method will only return the number of users that - would be removed without kicking the users. - - - The number of days required for the users to be kicked. - Whether this prune action is a simulation. - The options to be used when sending the request. - An array of role IDs to be included in the prune of users who do not have any additional roles. - - A task that represents the asynchronous prune operation. The task result contains the number of users to - be or has been removed from this guild. - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - The audit log entry ID to get entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - Gets a collection of emotes from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of emotes found within the guild. - - - - - Gets a specific emote from this guild. - - The snowflake identifier for the guild emote. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the emote found with the - specified ; if none is found. - - - - - Creates a new in this guild. - - The name of the guild emote. - The image of the new emote. - The roles to limit the emote usage to. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created emote. - - - - - Modifies an existing in this guild. - - The emote to be modified. - The delegate containing the properties to modify the emote with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. The task result contains the modified - emote. - - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - Deletes an existing from this guild. - - The emote to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a collection of all stickers within this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets this guilds application commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of application commands found within the guild. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Holds information for a guild integration feature. - - - - - Gets the integration ID. - - - An representing the unique identifier value of this integration. - - - - - Gets the integration name. - - - A string containing the name of this integration. - - - - - Gets the integration type (Twitch, YouTube, etc). - - - A string containing the name of the type of integration. - - - - - Gets a value that indicates whether this integration is enabled or not. - - - true if this integration is enabled; otherwise false. - - - - - Gets a value that indicates whether this integration is syncing or not. - - - An integration with syncing enabled will update its "subscribers" on an interval, while one with syncing - disabled will not. A user must manually choose when sync the integration if syncing is disabled. - - - true if this integration is syncing; otherwise false. - - - - - Gets the ID that this integration uses for "subscribers". - - - - - Gets the grace period before expiring "subscribers". - - - - - Gets when this integration was last synced. - - - A containing a date and time of day when the integration was last synced. - - - - - Gets integration account information. - - - - Gets the ID of the account. - A unique identifier of this integration account. - - - Gets the name of the account. - A string containing the name of this integration account. - - - - Gets the name of this guild. - - - - - Gets the icon URL associated with this guild, or null if one is not set. - - - - - Returns true if the current user owns this guild. - - - - - Returns the current user's permissions for this guild. - - - - - Represents a region of which the user connects to when using voice. - - - - - Gets the unique identifier for this voice region. - - - A string that represents the identifier for this voice region (e.g. eu-central). - - - - - Gets the name of this voice region. - - - A string that represents the human-readable name of this voice region (e.g. Central Europe). - - - - - Gets a value that indicates whether or not this voice region is exclusive to partnered servers. - - - true if this voice region is exclusive to VIP accounts; otherwise false. - - - - - Gets a value that indicates whether this voice region is optimal for your client in terms of latency. - - - true if this voice region is the closest to your machine; otherwise false . - - - - - Gets a value that indicates whether this voice region is no longer being maintained. - - - true if this is a deprecated voice region; otherwise false. - - - - - Gets a value that indicates whether this voice region is custom-made for events. - - - true if this is a custom voice region (used for events/etc); otherwise false/ - - - - - Specifies the guild's Multi-Factor Authentication (MFA) level requirement. - - - - - Users have no additional MFA restriction on this guild. - - - - - Users must have MFA enabled on their account to perform administrative actions. - - - - - Default or unset. - - - - - Guild has extremely suggestive or mature content that would only be suitable for users 18 or over. - - - - - Guild has no content that could be deemed NSFW; in other words, SFW. - - - - - Guild has mildly NSFW content that may not be suitable for users under 18. - - - - - Specifies the target of the permission. - - - - - The target of the permission is a role. - - - - - The target of the permission is a user. - - - - - Used for guilds that have no guild boosts. - - - - - Used for guilds that have Tier 1 guild boosts. - - - - - Used for guilds that have Tier 2 guild boosts. - - - - - Used for guilds that have Tier 3 guild boosts. - - - - - Deny none of the system channel messages. - This will enable all of the system channel messages. - - - - - Deny the messages that are sent when a user joins the guild. - - - - - Deny the messages that are sent when a user boosts the guild. - - - - - Specifies the verification level the guild uses. - - - - - Users have no additional restrictions on sending messages to this guild. - - - - - Users must have a verified email on their account. - - - - - Users must fulfill the requirements of Low and be registered on Discord for at least 5 minutes. - - - - - Users must fulfill the requirements of Medium and be a member of this guild for at least 10 minutes. - - - - - Users must fulfill the requirements of High and must have a verified phone on their Discord account. - - - - - Represents a Discord application created via the developer portal. - - - - - Gets the name of the application. - - - - - Gets the description of the application. - - - - - Gets the RPC origins of the application. - - - - - Gets the icon URL of the application. - - - - - Gets if the bot is public. - - - - - Gets if the bot requires code grant. - - - - - Gets the team associated with this application if there is one. - - - - - Gets the partial user object containing info on the owner of the application. - - - - - Determines whether the object is deletable or not. - - - - - Deletes this object and all its children. - - The options to be used when sending the request. - - - - Gets the unique identifier for this object. - - - - - An image that will be uploaded to Discord. - - - - - Gets the stream to be uploaded to Discord. - - - - - Create the image with a . - - - The to create the image with. Note that this must be some type of stream - with the contents of a file in it. - - - - - Create the image from a file path. - - - This file path is NOT validated and is passed directly into a - . - - The path to the file. - - is a zero-length string, contains only white space, or contains one or more invalid - characters as defined by . - - is null. - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - is in an invalid format. - - The specified is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - The file specified in was not found. - - An I/O error occurred while opening the file. - - - - - - - Specifies the type of format the image should return in. - - - - - Use automatically detected format. - - - - - Use Google's WebP image format. - - - - - Use PNG. - - - - - Use JPEG. - - - - - Use GIF. - - - - - Determines whether the object is mentionable or not. - - - - - Returns a special string used to mention this object. - - - A string that is recognized by Discord as a mention (e.g. <@168693960628371456>). - - - - - Represents a for making slash commands. - - - - - Gets or sets the name of this option. - - - - - Gets or sets the description of this option. - - - - - Gets or sets the type of this option. - - - - - Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - - - - - Gets or sets if the option is required. - - - - - Gets or sets whether or not this option supports autocomplete. - - - - - Gets or sets the choices for string and int types for the user to pick from. - - - - - Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. - - - - - Gets or sets the allowed channel types for this option. - - - - - Represents a choice for a . This class is used when making new commands. - - - - - The name of this choice. - - - - - The value of this choice. - - Discord only accepts int and string as the input. - - - - - - The option type of the Slash command parameter, See the discord docs. - - - - - A sub command. - - - - - A group of sub commands. - - - - - A of text. - - - - - An . - - - - - A . - - - - - A . - - - - - A . - - - - - A . - - - - - A or . - - - - - A . - - - - - Represents the base class to create/modify application commands. - - - - - Gets or sets the name of this command. - - - - - Whether the command is enabled by default when the app is added to a guild. Default is - - - - - ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message - - - - - ApplicationCommandType.Slash is Slash command type - - - - - ApplicationCommandType.User is Context Menu User command type - - - - - ApplicationCommandType.Message is Context Menu Message command type - - - - - Represents an autocomplete option. - - - - - Gets the type of this option - - - - - Gets the name of the option. - - - - - Gets the value of the option. - - - - - Gets whether or not this option is focused by the executing user. - - - - - Represents a result to an autocomplete interaction. - - - - - Gets or sets the name of the result. - - - Name cannot be null and has to be between 1-100 characters in length. - - - - - - - Gets or sets the value of the result. - - - Only , , and are allowed for a value. - - - - - - - Creates a new . - - - - - Creates a new with the passed in and . - - - - - - - A class used to build Message commands. - - - - - Returns the maximum length a commands name allowed by Discord - - - - - Gets or sets the name of this Message command. - - - - - Gets or sets whether the command is enabled by default when the app is added to a guild - - - - - Build the current builder into a class. - - - A that can be used to create message commands. - - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - A class used to create message commands. - - - - - A class used to build user commands. - - - - - Returns the maximum length a commands name allowed by Discord. - - - - - Gets or sets the name of this User command. - - - - - Gets or sets whether the command is enabled by default when the app is added to a guild. - - - - - Build the current builder into a class. - - A that can be used to create user commands. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - A class used to create User commands. - - - - - The base command model that belongs to an application. - - - - - Gets the unique id of the parent application. - - - - - The type of the command. - - - - - The name of the command. - - - - - The description of the command. - - - - - Whether the command is enabled by default when the app is added to a guild. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - Modifies the current application command. - - The new properties to use when modifying the command. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Modifies the current application command. - - The new properties to use when modifying the command. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - Thrown when you pass in an invalid type. - - - - Represents data of an Interaction Command, see . - - - - - The snowflake id of this command. - - - - - The name of this command. - - - - - The params + values from the user. - - - - - Represents a option group for a command, see . - - - - - The name of the parameter. - - - - - The value of the pair. - - This objects type can be any one of the option types in - - - - - - The type of this data's option. - - - - - Present if this option is a group or subcommand. - - - - - Options for the , see The docs. - - - - - The type of this . - - - - - The name of this command option, 1-32 character name. - - - - - The description of this command option, 1-100 character description. - - - - - The first required option for the user to complete--only one option can be default. - - - - - If the parameter is required or optional, default is . - - - - - Choices for string and int types for the user to pick from. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - The allowed channel types for this option. - - - - - Specifies choices for command group. - - - - - 1-100 character choice name. - - - - - value of the choice. - - - - - Represents a discord interaction - - An interaction is the base "thing" that is sent when a user invokes a command, and is the same for Slash Commands - and other future interaction types. see . - - - - - - The id of the interaction. - - - - - The type of this . - - - - - Represents the data sent within this interaction. - - - - - A continuation token for responding to the interaction. - - - - - read-only property, always 1. - - - - - Responds to an Interaction with type . - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Gets the original response for this interaction. - - The request options for this request. - A that represents the initial response. - - - - Edits original response for this interaction. - - A delegate containing the properties to modify the message with. - The request options for this request. - A that represents the initial response. - - - - Acknowledges this interaction. - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - Represents an interface used to specify classes that they are a valid data type of a class. - - - - - The response type for an . - - - After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using - or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, - and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. - You can read more about Response types Here. - - - - - ACK a Ping. - - - - - ACK a command without sending a message, eating the user's input. - - - - - Respond with a message, showing the user's input. - - - - - Respond to an interaction with a message. - - - - - ACK an interaction and edit a response later, the user sees a loading state. - - - - - For components: ACK an interaction and edit the original message later; the user does not see a loading state. - - - - - For components: edit the message the component was attached to. - - - - - Respond with a set of choices to a autocomplete interaction. - - - - - Represents a type of Interaction from discord. - - - - - A ping from discord. - - - - - A sent from discord. - - - - - A sent from discord. - - - - - An autocomplete request sent from discord. - - - - - Represents a Row for child components to live in. - - - - - - - - Gets the child components in this row. - - - - - Represents a Button. - - - - - - - - Gets the of this button, example buttons with each style can be found Here. - - - - - Gets the label of the button, this is the text that is shown. - - - - - Gets the displayed with this button. - - - - - - - - Gets the URL for a button. - - - You cannot have a button with a URL and a CustomId. - - - - - Gets whether this button is disabled or not. - - - - - Turns this button into a button builder. - - - A newly created button builder with the same properties as this button. - - - - - Represents different styles to use with buttons. You can see an example of the different styles at - - - - - A Blurple button - - - - - A Grey (or gray) button - - - - - A Green button - - - - - A Red button - - - - - A button with a little popup box indicating that this button is a link. - - - - - Represents a builder for creating a . - - - - - The max length of a . - - - - - The max amount of rows a message can have. - - - - - Gets or sets the Action Rows for this Component Builder. - - cannot be null. - count exceeds . - - - - Creates a new builder from a message. - - The message to create the builder from. - The newly created builder. - - - - Creates a new builder from the provided list of components. - - The components to create the builder from. - The newly created builder. - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The custom id of the menu. - The options of the menu. - The placeholder of the menu. - The min values of the placeholder. - The max values of the placeholder. - Whether or not the menu is disabled. - The row to add the menu to. - - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The menu to add. - The row to attempt to add this component on. - There is no more row to add a menu. - must be less than . - The current builder. - - - - Adds a with specified parameters to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The label text for the newly added button. - The style of this newly added button. - A to be used with this button. - The custom id of the newly added button. - A URL to be used only if the is a Link. - Whether or not the newly created button is disabled. - The row the button should be placed on. - The current builder. - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The button to add. - The row to add the button. - There is no more row to add a menu. - must be less than . - The current builder. - - - - Builds this builder into a used to send your components. - - A that can be sent with . - - - - Represents a class used to build Action rows. - - - - - The max amount of child components this row can hold. - - - - - Gets or sets the components inside this row. - - cannot be null. - count exceeds . - - - - Adds a list of components to the current row. - - The list of components to add. - - The current builder. - - - - Adds a component at the end of the current row. - - The component to add. - Components count reached - The current builder. - - - - Builds the current builder to a that can be used within a - - A that can be used within a - - - - Represents a class used to build 's. - - - - - The max length of a . - - - - - Gets or sets the label of the current button. - - length exceeds . - length exceeds . - - - - Gets or sets the custom id of the current button. - - length exceeds - length subceeds 1. - - - - Gets or sets the of the current button. - - - - - Gets or sets the of the current button. - - - - - Gets or sets the url of the current button. - - - - - Gets or sets whether the current button is disabled. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a . - - The label to use on the newly created link button. - The url of this button. - The custom ID of this button. - The custom ID of this button. - The emote of this button. - Disabled this button or not. - - - - Creates a new instance of a from instance of a . - - - - - Creates a button with the style. - - The label for this link button. - The url for this link button to go to. - The emote for this link button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this danger button. - The custom id for this danger button. - The emote for this danger button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this primary button. - The custom id for this primary button. - The emote for this primary button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this secondary button. - The custom id for this secondary button. - The emote for this secondary button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this success button. - The custom id for this success button. - The emote for this success button. - A builder with the newly created button. - - - - Sets the current buttons label to the specified text. - - The text for the label. - - The current builder. - - - - Sets the current buttons style. - - The style for this builders button. - The current builder. - - - - Sets the current buttons emote. - - The emote to use for the current button. - The current builder. - - - - Sets the current buttons url. - - The url to use for the current button. - The current builder. - - - - Sets the custom id of the current button. - - The id to use for the current button. - - The current builder. - - - - Sets whether the current button is disabled. - - Whether the current button is disabled or not. - The current builder. - - - - Builds this builder into a to be used in a . - - A to be used in a . - A button must contain either a or a , but not both. - A button must have an or a . - A link button must contain a URL. - A URL must include a protocol (http or https). - A non-link button must contain a custom id - - - - Represents a class used to build 's. - - - - - The max length of a . - - - - - The maximum number of values for the and properties. - - - - - The maximum number of options a can have. - - - - - Gets or sets the custom id of the current select menu. - - length exceeds - length subceeds 1. - - - - Gets or sets the placeholder text of the current select menu. - - length exceeds . - length subceeds 1. - - - - Gets or sets the minimum values of the current select menu. - - exceeds . - - - - Gets or sets the maximum values of the current select menu. - - exceeds . - - - - Gets or sets a collection of for this current select menu. - - count exceeds . - is null. - - - - Gets or sets whether the current menu is disabled. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a from instance of . - - - - - Creates a new instance of a . - - The custom id of this select menu. - The options for this select menu. - The placeholder of this select menu. - The max values of this select menu. - The min values of this select menu. - Disabled this select menu or not. - - - - Sets the field CustomId. - - The value to set the field CustomId to. - - - The current builder. - - - - - Sets the field placeholder. - - The value to set the field placeholder to. - - - The current builder. - - - - - Sets the field minValues. - - The value to set the field minValues to. - - - The current builder. - - - - - Sets the field maxValues. - - The value to set the field maxValues to. - - - The current builder. - - - - - Sets the field options. - - The value to set the field options to. - - - The current builder. - - - - - Add one option to menu options. - - The option builder class containing the option properties. - Options count reached . - - The current builder. - - - - - Add one option to menu options. - - The label for this option. - The value of this option. - The description of this option. - The emote of this option. - Render this option as selected by default or not. - Options count reached . - - The current builder. - - - - - Sets whether the current menu is disabled. - - Whether the current menu is disabled or not. - - The current builder. - - - - - Builds a - - The newly built - - - - Represents a class used to build 's. - - - - - The maximum length of a . - - - - - The maximum length of a . - - - - - The maximum length of a . - - - - - Gets or sets the label of the current select menu. - - length exceeds - length subceeds 1. - - - - Gets or sets the value of the current select menu. - - length exceeds . - length subceeds 1. - - - - Gets or sets this menu options description. - - length exceeds . - length subceeds 1. - - - - Gets or sets the emote of this option. - - - - - Gets or sets the whether or not this option will render selected by default. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a . - - The label for this option. - The value of this option. - The description of this option. - The emote of this option. - Render this option as selected by default or not. - - - - Creates a new instance of a from instance of a . - - - - - Sets the field label. - - The value to set the field label to. - - - The current builder. - - - - - Sets the field value. - - The value to set the field value to. - - - The current builder. - - - - - Sets the field description. - - The value to set the field description to. - - - The current builder. - - - - - Sets the field emote. - - The value to set the field emote to. - - The current builder. - - - - - Sets the field default. - - The value to set the field default to. - - The current builder. - - - - - Builds a . - - The newly built . - - - - Represents a type of a component. - - - - - A container for other components. - - - - - A clickable button. - - - - - A select menu for picking from choices. - - - - - Represents a message component on a message. - - - - - Gets the of this Message Component. - - - - - Gets the custom id of the component if possible; otherwise . - - - - - Represents a component object used to send components with messages. - - - - - Gets the components to be used in a message. - - - - - Returns a empty . - - - - - Represents a select menu component defined at - - - - - - - - - - - Gets the menus options to select from. - - - - - Gets the custom placeholder text if nothing is selected. - - - - - Gets the minimum number of items that must be chosen. - - - - - Gets the maximum number of items that can be chosen. - - - - - Gets whether this menu is disabled or not. - - - - - Turns this select menu into a builder. - - - A newly create builder with the same properties as this select menu. - - - - - Represents a choice for a . - - - - - The user-facing name of the option, max 25 characters. - - - - - The dev-define value of the option, max 100 characters. - - - - - An additional description of the option, max 50 characters. - - - - - A that will be displayed with this menu option. - - - - - Will render this option as selected by default. - - - - - A class used to build slash commands. - - - - - Returns the maximum length a commands name allowed by Discord - - - - - Returns the maximum length of a commands description allowed by Discord. - - - - - Returns the maximum count of command options allowed by Discord - - - - - The name of this slash command. - - - - - A 1-100 length description of this slash command. - The description is not allowed to be null. - - - - - Gets or sets the options for this command. - - - - - Whether the command is enabled by default when the app is added to a guild - - - - - Build the current builder into a class. - - A that can be used to create slash commands over rest. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the description of the current command. - - The description of this command. - The current builder. - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - If this option is set to autocomplete. - The options of the option to add. - The allowed channel types for this option. - The choices of this option. - The current builder. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - The current builder. - - - - Adds an option to this slash command. - - The option to add. - The current builder. - - - - Adds a collection of options to the current slash command. - - The collection of options to add. - The current builder. - - - - Represents a class used to build options for the . - - - - - The max length of a choice's name allowed by Discord. - - - - - The maximum number of choices allowed by Discord. - - - - - Gets or sets the name of this option. - - - - - Gets or sets the description of this option. - - - - - Gets or sets the type of this option. - - - - - Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - - - - - Gets or sets if the option is required. - - - - - Gets or sets whether or not this option supports autocomplete. - - - - - Gets or sets the choices for string and int types for the user to pick from. - - - - - Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. - - - - - Gets or sets the allowed channel types for this option. - - - - - Builds the current option. - - The built version of this option. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - If this option supports autocomplete. - The options of the option to add. - The allowed channel types for this option. - The choices of this option. - The current builder. - - - - Adds a sub option to the current option. - - The sub option to add. - The current builder. - - - - Adds a choice to the current option. - - The name of the choice. - The value of the choice. - The current builder. - - - - Adds a choice to the current option. - - The name of the choice. - The value of the choice. - The current builder. - - - - Adds a channel type to the current option. - - The to add. - The current builder. - - - - Sets the current builders name. - - The name to set the current option builder. - The current builder. - - - - Sets the current builders description. - - The description to set. - The current builder. - - - - Sets the current builders required field. - - The value to set. - The current builder. - - - - Sets the current builders default field. - - The value to set. - The current builder. - - - - Sets the current builders autocomplete field. - - The value to set. - The current builder. - - - - Sets the current type of this builder. - - The type to set. - The current builder. - - - - A class used to create slash commands. - - - - - The description of this command. - - - - - Gets or sets the options for this command. - - - - - Represents a generic invite object. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets the URL used to accept this invite using . - - - A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). - - - - - Gets the user that created this invite. - - - A user that created this invite. - - - - - Gets the channel this invite is linked to. - - - A generic channel that the invite points to. - - - - - Gets the type of the channel this invite is linked to. - - - - - Gets the ID of the channel this invite is linked to. - - - An representing the channel snowflake identifier that the invite points to. - - - - - Gets the name of the channel this invite is linked to. - - - A string containing the name of the channel that the invite points to. - - - - - Gets the guild this invite is linked to. - - - A guild object representing the guild that the invite points to. - - - - - Gets the ID of the guild this invite is linked to. - - - An representing the guild snowflake identifier that the invite points to. - - - - - Gets the name of the guild this invite is linked to. - - - A string containing the name of the guild that the invite points to. - - - - - Gets the approximated count of online members in the guild. - - - An representing the approximated online member count of the guild that the - invite points to; null if one cannot be obtained. - - - - - Gets the approximated count of total members in the guild. - - - An representing the approximated total member count of the guild that the - invite points to; null if one cannot be obtained. - - - - - Gets the user this invite is linked to via . - - - A user that is linked to this invite. - - - - - Gets the type of the linked for this invite. - - - The type of the linked user that is linked to this invite. - - - - - Represents additional information regarding the generic invite object. - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires; null if this - invite never expires. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite has been used. - - - - - Gets when this invite was created. - - - A representing the time of which the invite was first created. - - - - - The invite whose target user type is not defined. - - - - - The invite is for a Go Live stream. - - - - - The invite is for embedded application. - - - - Represents a Discord snowflake entity. - - - - Gets when the snowflake was created. - - - A representing when the entity was first created. - - - - - Defines whether the object is updateable or not. - - - - - Updates this object's properties with its current state. - - The options to be used when sending the request. - - - - Defines which mentions and types of mentions that will notify users from the message content. - - - - - Gets a value which indicates that no mentions in the message content should notify users. - - - - - Gets a value which indicates that all mentions in the message content should notify users. - - - - - Gets or sets the type of mentions that will be parsed from the message content. - - - The flag is mutually exclusive with the - property, and the flag is mutually exclusive with the - property. - If null, only the ids specified in and will be mentioned. - - - - - Gets or sets the list of all role ids that will be mentioned. - This property is mutually exclusive with the - flag of the property. If the flag is set, the value of this property - must be null or empty. - - - - - Gets or sets the list of all user ids that will be mentioned. - This property is mutually exclusive with the - flag of the property. If the flag is set, the value of this property - must be null or empty. - - - - - Gets or sets whether to mention the author of the message you are replying to or not. - - - Specifically for inline replies. - - - - - Initializes a new instance of the class. - - - The types of mentions to parse from the message content. - If null, only the ids specified in and will be mentioned. - - - - - Specifies the type of mentions that will be notified from the message content. - - - - - No flag is set. - - - This flag is not used to control mentions. - - It will always be present and does not mean mentions will not be allowed. - - - - - - Controls role mentions. - - - - - Controls user mentions. - - - - - Controls @everyone and @here mentions. - - - - - Represents an embed object seen in an . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the total length of all embed properties. - - - - - Gets the title of the embed. - - - - - A author field of an . - - - - - Gets the name of the author field. - - - - - Gets the URL of the author field. - - - - - Gets the icon URL of the author field. - - - - - Gets the proxified icon URL of the author field. - - - - - Gets the name of the author field. - - - - - - - - Represents a builder class for creating a . - - - - - Returns the maximum number of fields allowed by Discord. - - - - - Returns the maximum length of title allowed by Discord. - - - - - Returns the maximum length of description allowed by Discord. - - - - - Returns the maximum length of total characters allowed by Discord. - - - - Initializes a new class. - - - Gets or sets the title of an . - Title length exceeds . - - The title of the embed. - - - Gets or sets the description of an . - Description length exceeds . - The description of the embed. - - - Gets or sets the URL of an . - Url is not a well-formed . - The URL of the embed. - - - Gets or sets the thumbnail URL of an . - Url is not a well-formed . - The thumbnail URL of the embed. - - - Gets or sets the image URL of an . - Url is not a well-formed . - The image URL of the embed. - - - Gets or sets the list of of an . - An embed builder's fields collection is set to - null. - Fields count exceeds . - - The list of existing . - - - - Gets or sets the timestamp of an . - - - The timestamp of the embed, or null if none is set. - - - - - Gets or sets the sidebar color of an . - - - The color of the embed, or null if none is set. - - - - - Gets or sets the of an . - - - The author field builder of the embed, or null if none is set. - - - - - Gets or sets the of an . - - - The footer field builder of the embed, or null if none is set. - - - - - Gets the total length of all embed properties. - - - The combined length of , , , - , , and . - - - - - Sets the title of an . - - The title to be set. - - The current builder. - - - - - Sets the description of an . - - The description to be set. - - The current builder. - - - - - Sets the URL of an . - - The URL to be set. - - The current builder. - - - - - Sets the thumbnail URL of an . - - The thumbnail URL to be set. - - The current builder. - - - - - Sets the image URL of an . - - The image URL to be set. - - The current builder. - - - - - Sets the timestamp of an to the current time. - - - The current builder. - - - - - Sets the timestamp of an . - - The timestamp to be set. - - The current builder. - - - - - Sets the sidebar color of an . - - The color to be set. - - The current builder. - - - - - Sets the of an . - - The author builder class containing the author field properties. - - The current builder. - - - - - Sets the author field of an with the provided properties. - - The delegate containing the author field properties. - - The current builder. - - - - - Sets the author field of an with the provided name, icon URL, and URL. - - The title of the author field. - The icon URL of the author field. - The URL of the author field. - - The current builder. - - - - - Sets the of an . - - The footer builder class containing the footer field properties. - - The current builder. - - - - - Sets the footer field of an with the provided properties. - - The delegate containing the footer field properties. - - The current builder. - - - - - Sets the footer field of an with the provided name, icon URL. - - The title of the footer field. - The icon URL of the footer field. - - The current builder. - - - - - Adds an field with the provided name and value. - - The title of the field. - The value of the field. - Indicates whether the field is in-line or not. - - The current builder. - - - - - Adds a field with the provided to an - . - - The field builder class containing the field properties. - Field count exceeds . - - The current builder. - - - - - Adds an field with the provided properties. - - The delegate containing the field properties. - - The current builder. - - - - - Builds the into a Rich Embed ready to be sent. - - - The built embed object. - - Total embed length exceeds . - Any Url must include its protocols (i.e http:// or https://). - - - - Represents a builder class for an embed field. - - - - - Gets the maximum field length for name allowed by Discord. - - - - - Gets the maximum field length for value allowed by Discord. - - - - - Gets or sets the field name. - - - Field name is null, empty or entirely whitespace. - - or - - Field name length exceeds . - - - The name of the field. - - - - - Gets or sets the field value. - - - Field value is null, empty or entirely whitespace. - - or - - Field value length exceeds . - - - The value of the field. - - - - - Gets or sets a value that indicates whether the field should be in-line with each other. - - - - - Sets the field name. - - The name to set the field name to. - - The current builder. - - - - - Sets the field value. - - The value to set the field value to. - - The current builder. - - - - - Determines whether the field should be in-line with each other. - - - The current builder. - - - - - Builds the field builder into a class. - - - The current builder. - - - or is null, empty or entirely whitespace. - - or - - or exceeds the maximum length allowed by Discord. - - - - - Represents a builder class for a author field. - - - - - Gets the maximum author name length allowed by Discord. - - - - - Gets or sets the author name. - - - Author name length is longer than . - - - The author name. - - - - - Gets or sets the URL of the author field. - - Url is not a well-formed . - - The URL of the author field. - - - - - Gets or sets the icon URL of the author field. - - Url is not a well-formed . - - The icon URL of the author field. - - - - - Sets the name of the author field. - - The name of the author field. - - The current builder. - - - - - Sets the URL of the author field. - - The URL of the author field. - - The current builder. - - - - - Sets the icon URL of the author field. - - The icon URL of the author field. - - The current builder. - - - - - Builds the author field to be used. - - - Author name length is longer than . - - or - - is not a well-formed . - - or - - is not a well-formed . - - - The built author field. - - - - - Represents a builder class for an embed footer. - - - - - Gets the maximum footer length allowed by Discord. - - - - - Gets or sets the footer text. - - - Author name length is longer than . - - - The footer text. - - - - - Gets or sets the icon URL of the footer field. - - Url is not a well-formed . - - The icon URL of the footer field. - - - - - Sets the name of the footer field. - - The text of the footer field. - - The current builder. - - - - - Sets the icon URL of the footer field. - - The icon URL of the footer field. - - The current builder. - - - - - Builds the footer field to be used. - - - - length is longer than . - - or - - is not a well-formed . - - - A built footer field. - - - - - A field for an . - - - - - Gets the name of the field. - - - - - Gets the value of the field. - - - - - Gets a value that indicates whether the field should be in-line with each other. - - - - - Gets the name of the field. - - - A string that resolves to . - - - - A footer field for an . - - - - Gets the text of the footer field. - - - A string containing the text of the footer field. - - - - - Gets the URL of the footer icon. - - - A string containing the URL of the footer icon. - - - - - Gets the proxied URL of the footer icon link. - - - A string containing the proxied URL of the footer icon. - - - - - Gets the text of the footer field. - - - A string that resolves to . - - - - An image for an . - - - - Gets the URL of the image. - - - A string containing the URL of the image. - - - - - Gets a proxied URL of this image. - - - A string containing the proxied URL of this image. - - - - - Gets the height of this image. - - - A representing the height of this image if it can be retrieved; otherwise - null. - - - - - Gets the width of this image. - - - A representing the width of this image if it can be retrieved; otherwise - null. - - - - - Gets the URL of the thumbnail. - - - A string that resolves to . - - - - A provider field for an . - - - - Gets the name of the provider. - - - A string representing the name of the provider. - - - - - Gets the URL of the provider. - - - A string representing the link to the provider. - - - - - Gets the name of the provider. - - - A string that resolves to . - - - - A thumbnail featured in an . - - - - Gets the URL of the thumbnail. - - - A string containing the URL of the thumbnail. - - - - - Gets a proxied URL of this thumbnail. - - - A string containing the proxied URL of this thumbnail. - - - - - Gets the height of this thumbnail. - - - A representing the height of this thumbnail if it can be retrieved; otherwise - null. - - - - - Gets the width of this thumbnail. - - - A representing the width of this thumbnail if it can be retrieved; otherwise - null. - - - - - Gets the URL of the thumbnail. - - - A string that resolves to . - - - - - Specifies the type of embed. - - - - - An unknown embed type. - - - - - A rich embed type. - - - - - A link embed type. - - - - - A video embed type. - - - - - An image embed type. - - - - - A GIFV embed type. - - - - - An article embed type. - - - - - A tweet embed type. - - - - - A HTML embed type. - - - - - A video featured in an . - - - - - Gets the URL of the video. - - - A string containing the URL of the image. - - - - - Gets the height of the video. - - - A representing the height of this video if it can be retrieved; otherwise - null. - - - - - Gets the weight of the video. - - - A representing the width of this video if it can be retrieved; otherwise - null. - - - - - Gets the URL of the video. - - - A string that resolves to . - - - - - Represents a message attachment found in a . - - - - - Gets the ID of this attachment. - - - A snowflake ID associated with this attachment. - - - - - Gets the filename of this attachment. - - - A string containing the full filename of this attachment (e.g. textFile.txt). - - - - - Gets the URL of this attachment. - - - A string containing the URL of this attachment. - - - - - Gets a proxied URL of this attachment. - - - A string containing the proxied URL of this attachment. - - - - - Gets the file size of this attachment. - - - The size of this attachment in bytes. - - - - - Gets the height of this attachment. - - - The height of this attachment if it is a picture; otherwise null. - - - - - Gets the width of this attachment. - - - The width of this attachment if it is a picture; otherwise null. - - - - - Gets whether or not this attachment is ephemeral. - - - if the attachment is ephemeral; otherwise . - - - - - Represents a Discord embed object. - - - - - Gets the title URL of this embed. - - - A string containing the URL set in a title of the embed. - - - - - Gets the title of this embed. - - - The title of the embed. - - - - - Gets the description of this embed. - - - The description field of the embed. - - - - - Gets the type of this embed. - - - The type of the embed. - - - - - Gets the timestamp of this embed. - - - A based on the timestamp present at the bottom left of the embed, or - null if none is set. - - - - - Gets the color of this embed. - - - The color of the embed present on the side of the embed, or null if none is set. - - - - - Gets the image of this embed. - - - The image of the embed, or null if none is set. - - - - - Gets the video of this embed. - - - The video of the embed, or null if none is set. - - - - - Gets the author field of this embed. - - - The author field of the embed, or null if none is set. - - - - - Gets the footer field of this embed. - - - The author field of the embed, or null if none is set. - - - - - Gets the provider of this embed. - - - The source of the embed, or null if none is set. - - - - - Gets the thumbnail featured in this embed. - - - The thumbnail featured in the embed, or null if none is set. - - - - - Gets the fields of the embed. - - - An array of the fields of the embed. - - - - - Represents a message object. - - - - - Gets the type of this message. - - - - - Gets the source type of this message. - - - - - Gets the value that indicates whether this message was meant to be read-aloud by Discord. - - - true if this message was sent as a text-to-speech message; otherwise false. - - - - - Gets the value that indicates whether this message is pinned. - - - true if this message was added to its channel's pinned messages; otherwise false. - - - - - Gets the value that indicates whether or not this message's embeds are suppressed. - - - true if the embeds in this message have been suppressed (made invisible); otherwise false. - - - - - Gets the value that indicates whether this message mentioned everyone. - - - true if this message mentioned everyone; otherwise false. - - - - - Gets the content for this message. - - - A string that contains the body of the message; note that this field may be empty if there is an embed. - - - - - Gets the clean content for this message. - - - A string that contains the body of the message stripped of mentions, markdown, emojis and pings; note that this field may be empty if there is an embed. - - - - - Gets the time this message was sent. - - - Time of when the message was sent. - - - - - Gets the time of this message's last edit. - - - Time of when the message was last edited; null if the message is never edited. - - - - - Gets the source channel of the message. - - - - - Gets the author of this message. - - - - - Gets all attachments included in this message. - - - This property gets a read-only collection of attachments associated with this message. Depending on the - user's end-client, a sent message may contain one or more attachments. For example, mobile users may - attach more than one file in their message, while the desktop client only allows for one. - - - A read-only collection of attachments. - - - - - Gets all embeds included in this message. - - - This property gets a read-only collection of embeds associated with this message. Depending on the - message, a sent message may contain one or more embeds. This is usually true when multiple link previews - are generated; however, only one can be featured. - - - A read-only collection of embed objects. - - - - - Gets all tags included in this message's content. - - - - - Gets the IDs of channels mentioned in this message. - - - A read-only collection of channel IDs. - - - - - Gets the IDs of roles mentioned in this message. - - - A read-only collection of role IDs. - - - - - Gets the IDs of users mentioned in this message. - - - A read-only collection of user IDs. - - - - - Gets the activity associated with a message. - - - Sent with Rich Presence-related chat embeds. This often refers to activity that requires end-user's - interaction, such as a Spotify Invite activity. - - - A message's activity, if any is associated. - - - - - Gets the application associated with a message. - - - Sent with Rich-Presence-related chat embeds. - - - A message's application, if any is associated. - - - - - Gets the reference to the original message if it is a crosspost, channel follow add, pin, or reply message. - - - Sent with cross-posted messages, meaning they were published from news channels - and received by subscriber channels, channel follow adds, pins, and message replies. - - - A message's reference, if any is associated. - - - - - Gets all reactions included in this message. - - - - - The 's attached to this message - - - - - Gets all stickers items included in this message. - - - A read-only collection of sticker item objects. - - - - - Gets the flags related to this message. - - - This value is determined by bitwise OR-ing values together. - - - A message's flags, if any is associated. - - - - - Gets the interaction this message is a response to. - - - A if the message is a response to an interaction; otherwise . - - - - - Adds a reaction to this message. - - - The following example adds the reaction, 💕, to the message. - - await msg.AddReactionAsync(new Emoji("\U0001f495")); - - - The emoji used to react to this message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for adding a reaction to this message. - - - - - - Removes a reaction from message. - - - The following example removes the reaction, 💕, added by the message author from the message. - - await msg.RemoveReactionAsync(new Emoji("\U0001f495"), msg.Author); - - - The emoji used to react to this message. - The user that added the emoji. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - Removes a reaction from message. - - - The following example removes the reaction, 💕, added by the user with ID 84291986575613952 from the message. - - await msg.RemoveReactionAsync(new Emoji("\U0001f495"), 84291986575613952); - - - The emoji used to react to this message. - The ID of the user that added the emoji. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - Removes all reactions from this message. - - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Removes all reactions with a specific emoji from this message. - - The emoji used to react to this message. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets all users that reacted to a message with a given emote. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the users as a - collection. - - - Do not fetch too many users at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of reactions specified under . - The library will attempt to split up the requests according to your and - . In other words, should the user request 500 reactions, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets the users that have reacted with the emoji 💕 to the message. - - var emoji = new Emoji("\U0001f495"); - var reactedUsers = await message.GetReactionUsersAsync(emoji, 100).FlattenAsync(); - - - The emoji that represents the reaction that you wish to get. - The number of users to request. - The options to be used when sending the request. - - Paged collection of users. - - - - - Represents a partial within a message. - - - - - Gets the snowflake id of the interaction. - - - - - Gets the type of the interaction. - - - - - Gets the name of the application command used. - - - - - Gets the who invoked the interaction. - - - - - Represents a generic reaction object. - - - - - The used in the reaction. - - - - - Represents a generic message sent by the system. - - - - - Represents a generic message sent by a user. - - - - - Gets the referenced message if it is a crosspost, channel follow add, pin, or reply message. - - - The referenced message, if any is associated and still exists. - - - - - Modifies this message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Adds this message to its channel's pinned messages. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for pinning this message. - - - - - Removes this message from its channel's pinned messages. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for unpinning this message. - - - - - Publishes (crossposts) this message. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for publishing this message. - - - - This call will throw an if attempted in a non-news channel. - - This method will publish (crosspost) the message. Please note, publishing (crossposting), is only available in news channels. - - - - - Transforms this message's text into a human-readable form by resolving its tags. - - Determines how the user tag should be handled. - Determines how the channel tag should be handled. - Determines how the role tag should be handled. - Determines how the @everyone tag should be handled. - Determines how the emoji tag should be handled. - - - - An activity object found in a sent message. - - - - This class refers to an activity object, visually similar to an embed within a message. However, a message - activity is interactive as opposed to a standard static embed. - - For example, a Spotify party invitation counts as a message activity. - - - - - Gets the type of activity of this message. - - - - - Gets the party ID of this activity, if any. - - - - - Gets the snowflake ID of the application. - - - - - Gets the ID of the embed's image asset. - - - - - Gets the application's description. - - - - - Gets the ID of the application's icon. - - - - - Gets the Url of the application's icon. - - - - - Gets the name of the application. - - - - - Default value for flags, when none are given to a message. - - - - - Flag given to messages that have been published to subscribed - channels (via Channel Following). - - - - - Flag given to messages that originated from a message in another - channel (via Channel Following). - - - - - Flag given to messages that do not display any embeds. - - - - - Flag given to messages that the source message for this crosspost - has been deleted (via Channel Following). - - - - - Flag given to messages that came from the urgent message system. - - - - - Flag given to messages has an associated thread, with the same id as the message - - - - - Flag given to messages that is only visible to the user who invoked the Interaction. - - - - - Flag given to messages that is an Interaction Response and the bot is "thinking" - - - - - Represents a partial within a message. - - The type of the user. - - - - Gets the snowflake id of the interaction. - - - - - Gets the type of the interaction. - - - - - Gets the name of the application command used. - - - - - Gets the who invoked the interaction. - - - - - Properties that are used to modify an with the specified changes. - - - The content of a message can be cleared with if and only if an - is present. - - - - - - Gets or sets the content of the message. - - - This must be less than the constant defined by . - - - - - Gets or sets a single embed for this message. - - - This property will be added to the array, in the future please use the array rather than this property. - - - - - Gets or sets the embeds of the message. - - - - - Gets or sets the components for this message. - - - - - Gets or sets the flags of the message. - - - Only can be set/unset and you need to be - the author of the message. - - - - - Gets or sets the allowed mentions of the message. - - - - - Contains the IDs sent from a crossposted message or inline reply. - - - - - Gets the Message ID of the original message. - - - - - Gets the Channel ID of the original message. - - - It only will be the default value (zero) if it was instantiated with a in the constructor. - - - - - Gets the Guild ID of the original message. - - - - - Initializes a new instance of the class. - - - The ID of the message that will be referenced. Used to reply to specific messages and the only parameter required for it. - - - The ID of the channel that will be referenced. It will be validated if sent. - - - The ID of the guild that will be referenced. It will be validated if sent. - - - - - Specifies the source of the Discord message. - - - - - The message is sent by the system. - - - - - The message is sent by a user. - - - - - The message is sent by a bot. - - - - - The message is sent by a webhook. - - - - - Specifies the type of message. - - - - - The default message type. - - - - - The message when a recipient is added. - - - - - The message when a recipient is removed. - - - - - The message when a user is called. - - - - - The message when a channel name is changed. - - - - - The message when a channel icon is changed. - - - - - The message when another message is pinned. - - - - - The message when a new member joined. - - - - - The message for when a user boosts a guild. - - - - - The message for when a guild reaches Tier 1 of Nitro boosts. - - - - - The message for when a guild reaches Tier 2 of Nitro boosts. - - - - - The message for when a guild reaches Tier 3 of Nitro boosts. - - - - - The message for when a news channel subscription is added to a text channel. - - - - - The message for when a guild is disqualified from discovery. - - - - - The message for when a guild is requalified for discovery. - - - - - The message for when the initial warning is sent for the initial grace period discovery. - - - - - The message for when the final warning is sent for the initial grace period discovery. - - - - - The message for when a thread is created. - - - - - The message is an inline reply. - - - Only available in API v8. - - - - - The message is an Application Command. - - - Only available in API v8. - - - - - The message that starts a thread. - - - Only available in API v9. - - - - - The message for a invite reminder. - - - - - The message for a context menu command. - - - - - A metadata containing reaction information. - - - - - Gets the number of reactions. - - - An representing the number of this reactions that has been added to this message. - - - - - Gets a value that indicates whether the current user has reacted to this. - - - true if the user has reacted to the message; otherwise false. - - - - - Defines the types of formats for stickers. - - - - - Default value for a sticker format type. - - - - - The sticker format type is png. - - - - - The sticker format type is apng. - - - - - The sticker format type is lottie. - - - - - Specifies the handling type the tag should use. - - - - - - - Tag handling is ignored (e.g. <@53905483156684800> -> <@53905483156684800>). - - - - - Removes the tag entirely. - - - - - Resolves to username (e.g. <@53905483156684800> -> @Voltana). - - - - - Resolves to username without mention prefix (e.g. <@53905483156684800> -> Voltana). - - - - - Resolves to username with discriminator value. (e.g. <@53905483156684800> -> @Voltana#8252). - - - - - Resolves to username with discriminator value without mention prefix. (e.g. <@53905483156684800> -> Voltana#8252). - - - - - Sanitizes the tag (e.g. <@53905483156684800> -> <@53905483156684800> (w/ nbsp)). - - - - Specifies the type of Discord tag. - - - The object is an user mention. - - - The object is a channel mention. - - - The object is a role mention. - - - The object is an everyone mention. - - - The object is a here mention. - - - The object is an emoji. - - - - Represents a class used to make timestamps in messages. see . - - - - - Gets or sets the style of the timestamp tag. - - - - - Gets or sets the time for this timestamp tag. - - - - - Converts the current timestamp tag to the string representation supported by discord. - - If the is null then the default 0 will be used. - - - A string that is compatible in a discord message, ex: <t:1625944201:f> - - - - Creates a new timestamp tag with the specified datetime object. - - The time of this timestamp tag. - The style for this timestamp tag. - The newly create timestamp tag. - - - - Represents a set of styles to use with a - - - - - A short time string: 16:20 - - - - - A long time string: 16:20:30 - - - - - A short date string: 20/04/2021 - - - - - A long date string: 20 April 2021 - - - - - A short datetime string: 20 April 2021 16:20 - - - - - A long datetime string: Tuesday, 20 April 2021 16:20 - - - - - The relative time to the user: 2 months ago - - - - - Application command permissions allow you to enable or disable commands for specific users or roles within a guild. - - - - - The id of the role or user. - - - - - The target of this permission. - - - - - to allow, otherwise . - - - - - Creates a new . - - The id you want to target this permission value for. - The type of the targetId parameter. - The value of this permission. - - - - Creates a new targeting . - - The user you want to target this permission value for. - The value of this permission. - - - - Creates a new targeting . - - The role you want to target this permission value for. - The value of this permission. - - - - Specifies the target of the permission. - - - - - The target of the permission is a role. - - - - - The target of the permission is a user. - - - - Defines the available permissions for a channel. - - - - Allows creation of instant invites. - - - - - Allows management and editing of channels. - - - - - Allows for the addition of reactions to messages. - - - - - Allows guild members to view a channel, which includes reading messages in text channels. - - - - - Allows for sending messages in a channel. - - - - - Allows for sending of text-to-speech messages. - - - - - Allows for deletion of other users messages. - - - - - Allows links sent by users with this permission will be auto-embedded. - - - - - Allows for uploading images and files. - - - - - Allows for reading of message history. - - - - - Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all - online users in a channel. - - - - - Allows the usage of custom emojis from other servers. - - - - - Allows for joining of a voice channel. - - - - - Allows for speaking in a voice channel. - - - - - Allows for muting members in a voice channel. - - - - - Allows for deafening of members in a voice channel. - - - - - Allows for moving of members between voice channels. - - - - - Allows for using voice-activity-detection in a voice channel. - - - - - Allows for using priority speaker in a voice channel. - - - - - Allows video streaming in a voice channel. - - - - - Allows management and editing of roles. - - - - - Allows management and editing of webhooks. - - - - - Allows management and editing of emojis. - - - - - Allows members to use slash commands in text channels. - - - - - Allows members to use slash commands in text channels. - - - - - Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.) - - - - - Allows for deleting and archiving threads, and viewing all private threads - - - - - Allows for creating and participating in threads - - - - - Allows for creating and participating in private threads - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows the usage of custom stickers from other servers. - - - - - Allows for sending messages in threads. - - - - - Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. - - - - Gets a blank that grants no permissions. - A structure that does not contain any set permissions. - - - Gets a that grants all permissions for text channels. - - - Gets a that grants all permissions for voice channels. - - - Gets a that grants all permissions for stage channels. - - - Gets a that grants all permissions for category channels. - - - Gets a that grants all permissions for direct message channels. - - - Gets a that grants all permissions for group channels. - - - Gets a that grants all permissions for a given channel type. - Unknown channel type. - - - Gets a packed value representing all the permissions in this . - - - If true, a user may create invites. - - - If true, a user may create, delete and modify this channel. - - - If true, a user may add reactions. - - - If true, a user may view channels. - - - If true, a user may send messages. - - - If true, a user may send text-to-speech messages. - - - If true, a user may delete messages. - - - If true, Discord will auto-embed links sent by this user. - - - If true, a user may send files. - - - If true, a user may read previous messages. - - - If true, a user may mention @everyone. - - - If true, a user may use custom emoji from other guilds. - - - If true, a user may connect to a voice channel. - - - If true, a user may speak in a voice channel. - - - If true, a user may mute users. - - - If true, a user may deafen users. - - - If true, a user may move other users between voice channels. - - - If true, a user may use voice-activity-detection rather than push-to-talk. - - - If true, a user may use priority speaker in a voice channel. - - - If true, a user may stream video in a voice channel. - - - If true, a user may adjust role permissions. This also implicitly grants all other permissions. - - - If true, a user may edit the webhooks for this channel. - - - If true, a user may use application commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activities in voice channels in this guild. - - - Creates a new with the provided packed value. - - - Creates a new with the provided permissions. - - - Creates a new from this one, changing the provided non-null permissions. - - - - Returned when fetching the permissions for a command in a guild. - - - - - The id of the command. - - - - - The id of the application the command belongs to. - - - - - The id of the guild. - - - - - The permissions for the command in the guild. - - - - Defines the available permissions for a channel. - - - - Allows creation of instant invites. - - - - - Allows kicking members. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows banning members. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows all permissions and bypasses channel permission overwrites. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of channels. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of the guild. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows for viewing of guild insights - - - - - Allows for the addition of reactions to messages. - - - - - Allows for viewing of audit logs. - - - - - Allows guild members to view a channel, which includes reading messages in text channels. - - - - - Allows for sending messages in a channel - - - - - Allows for sending of text-to-speech messages. - - - - - Allows for deletion of other users messages. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows links sent by users with this permission will be auto-embedded. - - - - - Allows for uploading images and files. - - - - - Allows for reading of message history. - - - - - Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all - online users in a channel. - - - - - Allows the usage of custom emojis from other servers. - - - - - Allows for joining of a voice channel. - - - - - Allows for speaking in a voice channel. - - - - - Allows for muting members in a voice channel. - - - - - Allows for deafening of members in a voice channel. - - - - - Allows for moving of members between voice channels. - - - - - Allows for using voice-activity-detection in a voice channel. - - - - - Allows for using priority speaker in a voice channel. - - - - - Allows video streaming in a voice channel. - - - - - Allows for modification of own nickname. - - - - - Allows for modification of other users nicknames. - - - - - Allows management and editing of roles. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of webhooks. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of emojis and stickers. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows members to use slash commands in text channels. - - - - - Allows members to use application commands like slash commands and context menus in text channels. - - - - - Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.). - - - - - Allows for deleting and archiving threads, and viewing all private threads. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows the usage of custom stickers from other servers. - - - - - Allows for sending messages in threads. - - - - - Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. - - - - Gets a blank that grants no permissions. - - - Gets a that grants all guild permissions for webhook users. - - - Gets a that grants all guild permissions. - - - Gets a packed value representing all the permissions in this . - - - If true, a user may create invites. - - - If true, a user may ban users from the guild. - - - If true, a user may kick users from the guild. - - - If true, a user is granted all permissions, and cannot have them revoked via channel permissions. - - - If true, a user may create, delete and modify channels. - - - If true, a user may adjust guild properties. - - - If true, a user may add reactions. - - - If true, a user may view the audit log. - - - If true, a user may view the guild insights. - - - If True, a user may view channels. - - - If True, a user may send messages. - - - If true, a user may send text-to-speech messages. - - - If true, a user may delete messages. - - - If true, Discord will auto-embed links sent by this user. - - - If true, a user may send files. - - - If true, a user may read previous messages. - - - If true, a user may mention @everyone. - - - If true, a user may use custom emoji from other guilds. - - - If true, a user may connect to a voice channel. - - - If true, a user may speak in a voice channel. - - - If true, a user may mute users. - - - If true, a user may deafen users. - - - If true, a user may move other users between voice channels. - - - If true, a user may use voice-activity-detection rather than push-to-talk. - - - If True, a user may use priority speaker in a voice channel. - - - If True, a user may stream video in a voice channel. - - - If true, a user may change their own nickname. - - - If true, a user may change the nickname of other users. - - - If true, a user may adjust roles. - - - If true, a user may edit the webhooks for this guild. - - - If true, a user may edit the emojis and stickers for this guild. - - - If true, a user may use slash commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activities in voice channels in this guild. - - - Creates a new with the provided packed value. - - - Creates a new with the provided packed value after converting to ulong. - - - Creates a new structure with the provided permissions. - - - Creates a new from this one, changing the provided non-null permissions. - - - - Returns a value that indicates if a specific is enabled - in these permissions. - - The permission value to check for. - true if the permission is enabled, false otherwise. - - - - Returns a containing all of the - flags that are enabled. - - A containing flags. Empty if none are enabled. - - - - Represent a permission object. - - - - - Gets the unique identifier for the object this overwrite is targeting. - - - - - Gets the type of object this overwrite is targeting. - - - - - Gets the permissions associated with this overwrite entry. - - - - - Initializes a new with provided target information and modified permissions. - - - - - Represents a container for a series of overwrite permissions. - - - - - Gets a blank that inherits all permissions. - - - - - Gets a that grants all permissions for the given channel. - - Unknown channel type. - - - - Gets a that denies all permissions for the given channel. - - Unknown channel type. - - - - Gets a packed value representing all the allowed permissions in this . - - - - - Gets a packed value representing all the denied permissions in this . - - - - If Allowed, a user may create invites. - - - If Allowed, a user may create, delete and modify this channel. - - - If Allowed, a user may add reactions. - - - If Allowed, a user may join channels. - - - If Allowed, a user may send messages. - - - If Allowed, a user may send text-to-speech messages. - - - If Allowed, a user may delete messages. - - - If Allowed, Discord will auto-embed links sent by this user. - - - If Allowed, a user may send files. - - - If Allowed, a user may read previous messages. - - - If Allowed, a user may mention @everyone. - - - If Allowed, a user may use custom emoji from other guilds. - - - If Allowed, a user may connect to a voice channel. - - - If Allowed, a user may speak in a voice channel. - - - If Allowed, a user may mute users. - - - If Allowed, a user may deafen users. - - - If Allowed, a user may move other users between voice channels. - - - If Allowed, a user may use voice-activity-detection rather than push-to-talk. - - - If Allowed, a user may use priority speaker in a voice channel. - - - If Allowed, a user may go live in a voice channel. - - - If Allowed, a user may adjust role permissions. This also implicitly grants all other permissions. - - - If True, a user may edit the webhooks for this channel. - - - If true, a user may use slash commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activities in voice channels in this guild. - - - Creates a new OverwritePermissions with the provided allow and deny packed values. - - - Creates a new OverwritePermissions with the provided allow and deny packed values after converting to ulong. - - - - Initializes a new struct with the provided permissions. - - - - - Initializes a new from the current one, changing the provided - non-null permissions. - - - - - Creates a of all the values that are allowed. - - A of all allowed flags. If none, the list will be empty. - - - - Creates a of all the values that are denied. - - A of all denied flags. If none, the list will be empty. - - - Specifies the permission value. - - - Allows this permission. - - - Denies this permission. - - - Inherits the permission settings. - - - - Represents a color used in Discord. - - - - Gets the max decimal value of color. - - - Gets the default user color value. - - - Gets the teal color value. - A color struct with the hex value of 1ABC9C. - - - Gets the dark teal color value. - A color struct with the hex value of 11806A. - - - Gets the green color value. - A color struct with the hex value of 2ECC71. - - - Gets the dark green color value. - A color struct with the hex value of 1F8B4C. - - - Gets the blue color value. - A color struct with the hex value of 3498DB. - - - Gets the dark blue color value. - A color struct with the hex value of 206694. - - - Gets the purple color value. - A color struct with the hex value of 9B59B6. - - - Gets the dark purple color value. - A color struct with the hex value of 71368A. - - - Gets the magenta color value. - A color struct with the hex value of E91E63. - - - Gets the dark magenta color value. - A color struct with the hex value of AD1457. - - - Gets the gold color value. - A color struct with the hex value of F1C40F. - - - Gets the light orange color value. - A color struct with the hex value of C27C0E. - - - Gets the orange color value. - A color struct with the hex value of E67E22. - - - Gets the dark orange color value. - A color struct with the hex value of A84300. - - - Gets the red color value. - A color struct with the hex value of E74C3C. - - - Gets the dark red color value. - A color struct with the hex value of 992D22. - - - Gets the light grey color value. - A color struct with the hex value of 979C9F. - - - Gets the lighter grey color value. - A color struct with the hex value of 95A5A6. - - - Gets the dark grey color value. - A color struct with the hex value of 607D8B. - - - Gets the darker grey color value. - A color struct with the hex value of 546E7A. - - - Gets the encoded value for this color. - - This value is encoded as an unsigned integer value. The most-significant 8 bits contain the red value, - the middle 8 bits contain the green value, and the least-significant 8 bits contain the blue value. - - - - Gets the red component for this color. - - - Gets the green component for this color. - - - Gets the blue component for this color. - - - - Initializes a struct with the given raw value. - - - The following will create a color that has a hex value of - #607D8B. - - Color darkGrey = new Color(0x607D8B); - - - The raw value of the color (e.g. 0x607D8B). - Value exceeds . - - - - Initializes a struct with the given RGB bytes. - - - The following will create a color that has a value of - #607D8B. - - Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); - - - The byte that represents the red color. - The byte that represents the green color. - The byte that represents the blue color. - Value exceeds . - - - - Initializes a struct with the given RGB value. - - - The following will create a color that has a value of - #607D8B. - - Color darkGrey = new Color(96, 125, 139); - - - The value that represents the red color. Must be within 0~255. - The value that represents the green color. Must be within 0~255. - The value that represents the blue color. Must be within 0~255. - The argument value is not between 0 to 255. - - - - Initializes a struct with the given RGB float value. - - - The following will create a color that has a value of - #607c8c. - - Color darkGrey = new Color(0.38f, 0.49f, 0.55f); - - - The value that represents the red color. Must be within 0~1. - The value that represents the green color. Must be within 0~1. - The value that represents the blue color. Must be within 0~1. - The argument value is not between 0 to 1. - - - - Gets the hexadecimal representation of the color (e.g. #000ccc). - - - A hexadecimal string of the color. - - - - - Represents a generic role object to be given to a guild user. - - - - - Gets the guild that owns this role. - - - A guild representing the parent guild of this role. - - - - - Gets the color given to users of this role. - - - A struct representing the color of this role. - - - - - Gets a value that indicates whether the role can be separated in the user list. - - - true if users of this role are separated in the user list; otherwise false. - - - - - Gets a value that indicates whether the role is managed by Discord. - - - true if this role is automatically managed by Discord; otherwise false. - - - - - Gets a value that indicates whether the role is mentionable. - - - true if this role may be mentioned in messages; otherwise false. - - - - - Gets the name of this role. - - - A string containing the name of this role. - - - - - Gets the icon of this role. - - - A string containing the hash of this role's icon. - - - - - Gets the permissions granted to members of this role. - - - A struct that this role possesses. - - - - - Gets this role's position relative to other roles in the same guild. - - - An representing the position of the role in the role list of the guild. - - - - - Gets the tags related to this role. - - - A object containing all tags related to this role. - - - - - Modifies this role. - - - This method modifies this role with the specified properties. To see an example of this - method and what properties are available, please refer to . - - A delegate containing the properties to modify the role with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Gets the image url of the icon role. - - - An image url of the icon role. - - - - - Properties that are used to reorder an . - - - - - Gets the identifier of the role to be edited. - - - A representing the snowflake identifier of the role to be modified. - - - - - Gets the new zero-based position of the role. - - - An representing the new zero-based position of the role. - - - - - Initializes a with the given role ID and position. - - The ID of the role to be edited. - The new zero-based position of the role. - - - - Properties that are used to modify an with the specified changes. - - - The following example modifies the role to a mentionable one, renames the role into Sonic, and - changes the color to a light-blue. - - await role.ModifyAsync(x => - { - x.Name = "Sonic"; - x.Color = new Color(0x1A50BC); - x.Mentionable = true; - }); - - - - - - - Gets or sets the name of the role. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets the role's . - - - - - Gets or sets the position of the role. This is 0-based! - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets the color of the role. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets whether or not this role should be displayed independently in the user list. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets whether or not this role can be mentioned. - - - This value may not be set if the role is an @everyone role. - - - - - Provides tags related to a discord role. - - - - - Gets the identifier of the bot that this role belongs to, if it does. - - - A if this role belongs to a bot; otherwise - . - - - - - Gets the identifier of the integration that this role belongs to, if it does. - - - A if this role belongs to an integration; otherwise - . - - - - - Gets if this role is the guild's premium subscriber (booster) role. - - - if this role is the guild's premium subscriber role; - otherwise . - - - - - Represents a custom sticker within a guild. - - - - - Gets the users id who uploaded the sticker. - - - In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - Gets the guild that this custom sticker is in. - - - - - Modifies this sticker. - - - This method modifies this sticker with the specified properties. To see an example of this - method and what properties are available, please refer to . -
-
- The bot needs the MANAGE_EMOJIS_AND_STICKERS permission within the guild in order to modify stickers. -
- - The following example replaces the name of the sticker with kekw. - - await sticker.ModifyAsync(x => x.Name = "kekw"); - - - A delegate containing the properties to modify the sticker with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - -
- - - Deletes the current sticker. - - - The bot needs the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. - - The options to be used when sending the request. - - A task that represents the asynchronous deletion operation. - - - - - Represents a discord sticker. - - - - - Gets the ID of this sticker. - - - A snowflake ID associated with this sticker. - - - - - Gets the ID of the pack of this sticker. - - - A snowflake ID associated with the pack of this sticker. - - - - - Gets the name of this sticker. - - - A with the name of this sticker. - - - - - Gets the description of this sticker. - - - A with the description of this sticker. - - - - - Gets the list of tags of this sticker. - - - A read-only list with the tags of this sticker. - - - - - Gets the type of this sticker. - - - - - Gets the format type of this sticker. - - - A with the format type of this sticker. - - - - - Gets whether this guild sticker can be used, may be false due to loss of Server Boosts. - - - - - Gets the standard sticker's sort order within its pack. - - - - - Gets the image url for this sticker. - - - - - Represents a partial sticker item received with a message. - - - - - The id of the sticker. - - - - - The name of the sticker. - - - - - The format of the sticker. - - - - - Represents a discord sticker pack. - - The type of the stickers within the collection. - - - - Gets the id of the sticker pack. - - - - - Gets a collection of the stickers in the pack. - - - - - Gets the name of the sticker pack. - - - - - Gets the id of the pack's SKU. - - - - - Gets the id of a sticker in the pack which is shown as the pack's icon. - - - - - Gets the description of the sticker pack. - - - - - Gets the id of the sticker pack's banner image - - - - - Represents a class used to modify stickers. - - - - - Gets or sets the name of the sticker. - - - - - Gets or sets the description of the sticker. - - - - - Gets or sets the tags of the sticker. - - - - - Represents a type of sticker.. - - - - - Represents a discord standard sticker, this type of sticker cannot be modified by an application. - - - - - Represents a sticker that was created within a guild. - - - - - Represents a Discord Team. - - - - - Gets the team icon url. - - - - - Gets the team unique identifier. - - - - - Gets the members of this team. - - - - - Gets the name of this team. - - - - - Gets the user identifier that owns this team. - - - - - Represents a Discord Team member. - - - - - Gets the membership state of this team member. - - - - - Gets the permissions of this team member. - - - - - Gets the team unique identifier for this team member. - - - - - Gets the Discord user of this team member. - - - - - Represents the membership state of a team member. - - - - - Properties that are used to add a new to the guild with the following parameters. - - - - - - Gets or sets the user's nickname. - - - To clear the user's nickname, this value can be set to null or - . - - - - - Gets or sets whether the user should be muted in a voice channel. - - - If this value is set to true, no user will be able to hear this user speak in the guild. - - - - - Gets or sets whether the user should be deafened in a voice channel. - - - If this value is set to true, this user will not be able to hear anyone speak in the guild. - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Defines the types of clients a user can be active on. - - - - - The user is active using the mobile application. - - - - - The user is active using the desktop application. - - - - - The user is active using the web application. - - - - - Properties that are used to modify an with the following parameters. - - - - - - Gets or sets whether the user should be muted in a voice channel. - - - If this value is set to true, no user will be able to hear this user speak in the guild. - - - - - Gets or sets whether the user should be deafened in a voice channel. - - - If this value is set to true, this user will not be able to hear anyone speak in the guild. - - - - - Gets or sets the user's nickname. - - - To clear the user's nickname, this value can be set to null or - . - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Moves a user to a voice channel. If null, this user will be disconnected from their current voice channel. - - - This user MUST already be in a for this to work. - When set, this property takes precedence over . - - - - - Moves a user to a voice channel. Set to null to disconnect this user from their current voice channel. - - - This user MUST already be in a for this to work. - - - - Gets the ID of the connection account. - A representing the unique identifier value of this connection. - - - Gets the service of the connection (twitch, youtube). - A string containing the name of this type of connection. - - - Gets the username of the connection account. - A string containing the name of this connection. - - - Gets whether the connection is revoked. - A value which if true indicates that this connection has been revoked, otherwise false. - - - Gets a of integration IDs. - - An containing - representations of unique identifier values of integrations. - - - - - Represents a Discord user that is in a group. - - - - - Represents a generic guild user. - - - - - Gets when this user joined the guild. - - - A representing the time of which the user has joined the guild; - null when it cannot be obtained. - - - - - Gets the nickname for this user. - - - A string representing the nickname of the user; null if none is set. - - - - - Gets the guild-level permissions for this user. - - - A structure for this user, representing what - permissions this user has in the guild. - - - - - Gets the guild for this user. - - - A guild object that this user belongs to. - - - - - Gets the ID of the guild for this user. - - - An representing the snowflake identifier of the guild that this user belongs to. - - - - - Gets the date and time for when this user's guild boost began. - - - A for when the user began boosting this guild; null if they are not boosting the guild. - - - - - Gets a collection of IDs for the roles that this user currently possesses in the guild. - - - This property returns a read-only collection of the identifiers of the roles that this user possesses. - For WebSocket users, a Roles property can be found in place of this property. Due to the REST - implementation, only a collection of identifiers can be retrieved instead of the full role objects. - - - A read-only collection of , each representing a snowflake identifier for a role that - this user possesses. - - - - - Whether the user has passed the guild's Membership Screening requirements. - - - - - Gets the users position within the role hierarchy. - - - - - Gets the level permissions granted to this user to a given channel. - - - The following example checks if the current user has the ability to send a message with attachment in - this channel; if so, uploads a file via . - - if (currentUser?.GetPermissions(targetChannel)?.AttachFiles) - await targetChannel.SendFileAsync("fortnite.png"); - - - The channel to get the permission from. - - A structure representing the permissions that a user has in the - specified channel. - - - - - Kicks this user from this guild. - - The reason for the kick which will be recorded in the audit log. - The options to be used when sending the request. - - A task that represents the asynchronous kick operation. - - - - - Modifies this user's properties in this guild. - - - This method modifies the current guild user with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The delegate containing the properties to modify the user with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Adds the specified role to this user in the guild. - - The role to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified role to this user in the guild. - - The role to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified to this user in the guild. - - The roles to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified to this user in the guild. - - The roles to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Removes the specified from this user in the guild. - - The role to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The role to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The roles to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The roles to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Represents the user's presence status. This may include their online status and their activity. - - - - - Gets the current status of this user. - - - - - Gets the set of clients where this user is currently active. - - - - - Gets the list of activities that this user currently has available. - - - - - Represents the logged-in Discord user. - - - - - Gets the email associated with this user. - - - - - Indicates whether or not this user has their email verified. - - - true if this user's email has been verified; false if not. - - - - - Indicates whether or not this user has MFA enabled on their account. - - - true if this user has enabled multi-factor authentication on their account; false if not. - - - - - Gets the flags that are applied to a user's account. - - - This value is determined by bitwise OR-ing values together. - - - The value of flags for this user. - - - - - Gets the type of Nitro subscription that is active on this user's account. - - - This information may only be available with the identify OAuth scope. - - - The type of Nitro subscription the user subscribes to, if any. - - - - - Gets the user's chosen language option. - - - The IETF language tag of the user's chosen region, if provided. - For example, a locale of "English, US" is "en-US", "Chinese (Taiwan)" is "zh-TW", etc. - - - - - Modifies the user's properties. - - - - - Represents a generic user. - - - - - Gets the identifier of this user's avatar. - - - - - Gets the identifier of this user's banner. - - - - - Gets the user's banner color. - - - A struct representing the accent color of this user's banner. - - - - - Gets the avatar URL for this user. - - - This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar - (i.e. their avatar identifier is not set), this method will return null. If you wish to - retrieve the default avatar for this user, consider using (see - example). - - - 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. - - - The format to return. - The size of the image to return in. This can be any power of two between 16 and 2048. - - - A string representing the user's avatar URL; null if the user does not have an avatar in place. - - - - - Gets the banner URL for this user. - - The format to return. - The size of the image to return in. This can be any power of two between 16 and 2048. - - - A string representing the user's avatar URL; null if the user does not have an banner in place. - - - - - Gets the default avatar URL for this user. - - - This property retrieves a URL for this user's default avatar generated by Discord (Discord logo followed - by a random color as its background). This property will always return a value as it is calculated based - on the user's (discriminator % 5). - - - A string representing the user's avatar URL. - - - - - Gets the per-username unique ID for this user. - - - - - Gets the per-username unique ID for this user. - - - - - Gets a value that indicates whether this user is identified as a bot. - - - This property retrieves a value that indicates whether this user is a registered bot application - (indicated by the blue BOT tag within the official chat client). - - - true if the user is a bot application; otherwise false. - - - - - Gets a value that indicates whether this user is a webhook user. - - - true if the user is a webhook; otherwise false. - - - - - Gets the username for this user. - - - - - Gets the public flags that are applied to this user's account. - - - This value is determined by bitwise OR-ing values together. - - - The value of public flags for this user. - - - - - Creates the direct message channel of this user. - - - This method is used to obtain or create a channel used to send a direct message. - - In event that the current user cannot send a message to the target user, a channel can and will - still be created by Discord. However, attempting to send a message will yield a - with a 403 as its - . There are currently no official workarounds by - Discord. - - - - The following example attempts to send a direct message to the target user and logs the incident should - it fail. - - - The options to be used when sending the request. - - A task that represents the asynchronous operation for getting or creating a DM channel. The task result - contains the DM channel associated with this user. - - - - - Represents a user's voice connection status. - - - - - Gets a value that indicates whether this user is deafened by the guild. - - - true if the user is deafened (i.e. not permitted to listen to or speak to others) by the guild; - otherwise false. - - - - - Gets a value that indicates whether this user is muted (i.e. not permitted to speak via voice) by the - guild. - - - true if this user is muted by the guild; otherwise false. - - - - - Gets a value that indicates whether this user has marked themselves as deafened. - - - true if this user has deafened themselves (i.e. not permitted to listen to or speak to others); otherwise false. - - - - - Gets a value that indicates whether this user has marked themselves as muted (i.e. not permitted to - speak via voice). - - - true if this user has muted themselves; otherwise false. - - - - - Gets a value that indicates whether the user is muted by the current user. - - - true if the guild is temporarily blocking audio to/from this user; otherwise false. - - - - - Gets the voice channel this user is currently in. - - - A generic voice channel object representing the voice channel that the user is currently in; null - if none. - - - - - Gets the unique identifier for this user's voice session. - - - - - Gets a value that indicates if this user is streaming in a voice channel. - - - true if the user is streaming; otherwise false. - - - - - Gets the time on which the user requested to speak. - - - - Represents a Webhook Discord user. - - - Gets the ID of a webhook. - - - - Specifies the type of subscription a user is subscribed to. - - - - - No subscription. - - - - - Nitro Classic subscription. Includes app perks like animated emojis and avatars, but not games. - - - - - Nitro subscription. Includes app perks as well as the games subscription service. - - - - - Properties that are used to modify the with the specified changes. - - - - - - Gets or sets the username. - - - - - Gets or sets the avatar. - - - - - Default value for flags, when none are given to an account. - - - - - Flag given to users who are a Discord employee. - - - - - Flag given to users who are owners of a partnered Discord server. - - - - - Flag given to users in HypeSquad events. - - - - - Flag given to users who have participated in the bug report program and are level 1. - - - - - Flag given to users who are in the HypeSquad House of Bravery. - - - - - Flag given to users who are in the HypeSquad House of Brilliance. - - - - - Flag given to users who are in the HypeSquad House of Balance. - - - - - Flag given to users who subscribed to Nitro before games were added. - - - - - Flag given to users who are part of a team. - - - - - Flag given to users who represent Discord (System). - - - - - Flag given to users who have participated in the bug report program and are level 2. - - - - - Flag given to users who are verified bots. - - - - - Flag given to users that developed bots and early verified their accounts. - - - - - Flag given to users that are discord certified moderators who has give discord's exam. - - - - - Defines the available Discord user status. - - - - - The user is offline. - - - - - The user is online. - - - - - The user is idle. - - - - - The user is AFK. - - - - - The user is busy. - - - - - The user is invisible. - - - - - Represents a webhook object on Discord. - - - - - Gets the token of this webhook. - - - - - Gets the default name of this webhook. - - - - - Gets the ID of this webhook's default avatar. - - - - - Gets the URL to this webhook's default avatar. - - - - - Gets the channel for this webhook. - - - - - Gets the ID of the channel for this webhook. - - - - - Gets the guild owning this webhook. - - - - - Gets the ID of the guild owning this webhook. - - - - - Gets the user that created this webhook. - - - - - Gets the ID of the application owning this webhook. - - - - - Modifies this webhook. - - - - - Properties used to modify an with the specified changes. - - - - - - Gets or sets the default name of the webhook. - - - - - Gets or sets the default avatar of the webhook. - - - - - Gets or sets the channel for this webhook. - - - This field is not used when authenticated with . - - - - - Gets or sets the channel ID for this webhook. - - - This field is not used when authenticated with . - - - - - Represents the type of a webhook. - - - This type is currently unused, and is only returned in audit log responses. - - - - An incoming webhook - - - An extension class for squashing . - - This set of extension methods will squash an into a - single . This is often associated with requests that has a - set limit when requesting. - - - - Flattens the specified pages into one asynchronously. - - - Flattens the specified pages into one . - - - - The prefix applied to files to indicate that it is a spoiler. - - - - - Gets whether the message's attachments are spoilers or not. - - - - An extension class for the Discord client. - - - Gets the private channel with the provided ID. - - - Gets the DM channel with the provided ID. - - - Gets all available DM channels for the client. - - - Gets the group channel with the provided ID. - - - Gets all available group channels for the client. - - - Gets the most optimal voice region for the client. - - - An extension class for building an embed. - - - Adds embed color based on the provided raw value. - - - Adds embed color based on the provided RGB value. - - - Adds embed color based on the provided RGB value. - The argument value is not between 0 to 255. - - - Adds embed color based on the provided RGB value. - The argument value is not between 0 to 1. - - - Fills the embed author field with the provided user's full username and avatar URL. - - - Converts a object to a . - The embed type is not . - - - - Adds the specified fields into this . - - Field count exceeds . - - - - Adds the specified fields into this . - - - - - An extension class for . - - - - - Gets if welcome system messages are enabled. - - The guild to check. - A bool indicating if the welcome messages are enabled in the system channel. - - - - Gets if guild boost system messages are enabled. - - The guild to check. - A bool indicating if the guild boost messages are enabled in the system channel. - - - - Provides extension methods for . - - - - - Gets a URL that jumps to the message. - - The message to jump to. - - A string that contains a URL for jumping to the message in chat. - - - - - Add multiple reactions to a message. - - - This method does not bulk add reactions! It will send a request for each reaction included. - - - - IEmote A = new Emoji("🅰"); - IEmote B = new Emoji("🅱"); - await msg.AddReactionsAsync(new[] { A, B }); - - - The message to add reactions to. - An array of reactions to add to the message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for adding a reaction to this message. - - - - - - - Remove multiple reactions from a message. - - - This method does not bulk remove reactions! If you want to clear reactions from a message, - - - - - await msg.RemoveReactionsAsync(currentUser, new[] { A, B }); - - - The message to remove reactions from. - The user who removed the reaction. - An array of reactions to remove from the message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - - Sends an inline reply that references a message. - - The message that is being replied on. - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - A array of s to send with this response. Max 10. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The options to be used when sending the request. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - An extension class for various Discord user objects. - - - - Sends a message via DM. - - - This method attempts to send a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - The user to send the DM to. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message components to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents the asynchronous send operation. The task result contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a - rich embed to the channel. - - await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); - - - - This method attempts to send an attachment as a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The user to send the DM to. - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - The message component to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file via DM with an optional caption. - - - The following example uploads a local file called wumpus.txt along with the text - good discord boi to the channel. - - await channel.SendFileAsync("wumpus.txt", "good discord boi"); - - - The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the - channel. - - await channel.SendFileAsync("b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); - - - - This method attempts to send an attachment as a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The user to send the DM to. - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - The message component to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Bans the user from the guild and optionally prunes their recent messages. - - The user to ban. - The number of days to remove messages from this for - must be between [0, 7] - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous operation for banning a user. - - - - A helper class for formatting characters. - - - Returns a markdown-formatted string with bold formatting. - - - Returns a markdown-formatted string with italics formatting. - - - Returns a markdown-formatted string with underline formatting. - - - Returns a markdown-formatted string with strike-through formatting. - - - Returns a string with spoiler formatting. - - - Returns a markdown-formatted URL. Only works in descriptions and fields. - - - Escapes a URL so that a preview is not generated. - - - Returns a markdown-formatted string with codeblock formatting. - - - Sanitizes the string, safely escaping any Markdown sequences. - - - - Formats a string as a quote. - - The text to format. - Gets the formatted quote text. - - - - Formats a string as a block quote. - - The text to format. - Gets the formatted block quote text. - - - - Remove discord supported markdown from text. - - The to remove markdown from. - Gets the unformatted text. - - - This intent includes no events - - - This intent includes GUILD_CREATE, GUILD_UPDATE, GUILD_DELETE, GUILD_ROLE_CREATE, GUILD_ROLE_UPDATE, GUILD_ROLE_DELETE, CHANNEL_CREATE, CHANNEL_UPDATE, CHANNEL_DELETE, CHANNEL_PINS_UPDATE - - - This intent includes GUILD_MEMBER_ADD, GUILD_MEMBER_UPDATE, GUILD_MEMBER_REMOVE - This is a privileged intent and must be enabled in the Developer Portal. - - - This intent includes GUILD_BAN_ADD, GUILD_BAN_REMOVE - - - This intent includes GUILD_EMOJIS_UPDATE - - - This intent includes GUILD_INTEGRATIONS_UPDATE - - - This intent includes WEBHOOKS_UPDATE - - - This intent includes INVITE_CREATE, INVITE_DELETE - - - This intent includes VOICE_STATE_UPDATE - - - This intent includes PRESENCE_UPDATE - This is a privileged intent and must be enabled in the Developer Portal. - - - This intent includes MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, MESSAGE_DELETE_BULK - - - This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI - - - This intent includes TYPING_START - - - This intent includes CHANNEL_CREATE, MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, CHANNEL_PINS_UPDATE - - - This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI - - - This intent includes TYPING_START - - - - This intent includes all but and - which are privileged and must be enabled in the Developer Portal. - - - - - This intent includes all of them, including privileged ones. - - - - - Represents a generic Discord client. - - - - - Gets the current state of connection. - - - - - Gets the currently logged-in user. - - - - - Gets the token type of the logged-in user. - - - - - Starts the connection between Discord and the client.. - - - This method will initialize the connection between the client and Discord. - - This method will immediately return after it is called, as it will initialize the connection on - another thread. - - - - A task that represents the asynchronous start operation. - - - - - Stops the connection between Discord and the client. - - - A task that represents the asynchronous stop operation. - - - - - Gets a Discord application information for the logged-in user. - - - This method reflects your application information you submitted when creating a Discord application via - the Developer Portal. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application - information. - - - - - Gets a generic channel. - - - - var channel = await _client.GetChannelAsync(381889909113225237); - if (channel != null && channel is IMessageChannel msgChannel) - { - await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); - } - - - The snowflake identifier of the channel (e.g. `381889909113225237`). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the channel associated - with the snowflake identifier; null when the channel cannot be found. - - - - - Gets a collection of private channels opened in this session. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - This method will retrieve all private channels (including direct-message, group channel and such) that - are currently opened in this session. - - This method will not return previously opened private channels outside of the current session! If - you have just started the client, this may return an empty collection. - - - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of private channels that the user currently partakes in. - - - - - Gets a collection of direct message channels opened in this session. - - - This method returns a collection of currently opened direct message channels. - - This method will not return previously opened DM channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of direct-message channels that the user currently partakes in. - - - - - Gets a collection of group channels opened in this session. - - - This method returns a collection of currently opened group channels. - - This method will not return previously opened group channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of group channels that the user currently partakes in. - - - - - Gets the connections that the user has set up. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. - - - - - Gets a global application command. - - The id of the command. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application command if found, otherwise - . - - - - - Gets a collection of all global commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of global - application commands. - - - - - Creates a global application command. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created application command. - - - - - Bulk overwrites all global application commands. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of application commands that were created. - - - - - Gets a guild. - - The guild snowflake identifier. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild associated - with the snowflake identifier; null when the guild cannot be found. - - - - - Gets a collection of guilds that the user is currently in. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of guilds that the current user is in. - - - - - Creates a guild for the logged-in user who is in less than 10 active guilds. - - - This method creates a new guild on behalf of the logged-in user. - - Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. - - - The name of the new guild. - The voice region to create the guild with. - The icon of the guild. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created guild. - - - - - Gets an invite. - - The invitation identifier. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the invite information. - - - - - Gets a user. - - - - var user = await _client.GetUserAsync(168693960628371456); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The snowflake identifier of the user (e.g. `168693960628371456`). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the snowflake identifier; null if the user is not found. - - - - - Gets a user. - - - - var user = await _client.GetUserAsync("Still", "2876"); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The name of the user (e.g. `Still`). - The discriminator value of the user (e.g. `2876`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the name and the discriminator; null if the user is not found. - - - - - Gets a collection of the available voice regions. - - - The following example gets the most optimal voice region from the collection. - - var regions = await client.GetVoiceRegionsAsync(); - var optimalRegion = regions.FirstOrDefault(x => x.IsOptimal); - - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - with all of the available voice regions in this session. - - - - - Gets a voice region. - - The identifier of the voice region (e.g. eu-central ). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice region - associated with the identifier; null if the voice region is not found. - - - - - Gets a webhook available. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the recommended shard count as suggested by Discord. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains an - that represents the number of shards that should be used with this account. - - - - - Gets the gateway information related to the bot. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - that represents the gateway information related to the bot. - - - - - Provides a message object used for logging purposes. - - - - - Gets the severity of the log entry. - - - A enum to indicate the severeness of the incident or event. - - - - - Gets the source of the log entry. - - - A string representing the source of the log entry. - - - - - Gets the message of this log entry. - - - A string containing the message of this log entry. - - - - - Gets the exception of this log entry. - - - An object associated with an incident; otherwise null. - - - - - Initializes a new struct with the severity, source, message of the event, and - optionally, an exception. - - The severity of the event. - The source of the event. - The message of the event. - The exception of the event. - - - - Specifies the severity of the log message. - - - - - Logs that contain the most severe level of error. This type of error indicate that immediate attention - may be required. - - - - - Logs that highlight when the flow of execution is stopped due to a failure. - - - - - Logs that highlight an abnormal activity in the flow of execution. - - - - - Logs that track the general flow of the application. - - - - - Logs that are used for interactive investigation during development. - - - - - Logs that contain the most detailed messages. - - - - Specifies the state of the client's login status. - - - The client is currently logged out. - - - The client is currently logging in. - - - The client is currently logged in. - - - The client is currently logging out. - - - - Gets the JSON error code returned by Discord. - - - A - JSON error code - from Discord, or null if none. - - - - - Gets the reason of the exception. - - - - - Gets the request object used to send the request. - - - - - The error object returned from discord. - - - Note: This object can be null if discord didn't provide it. - - - - - The request json used to create the application command. This is useful for checking your commands for any format errors. - - - - - The underlying that caused this exception to be thrown. - - - - - Initializes a new instance of the class. - - - - - - - Represents a ratelimit bucket. - - - - - Gets the http method used to make the request if available. - - - - - Gets the endpoint that is going to be requested if available. - - - - - Gets the major parameters of the route. - - - - - Gets the hash of this bucket. - - - The hash is provided by Discord to group ratelimits. - - - - - Gets if this bucket is a hash type. - - - - - Creates a new based on the - and . - - Http method used to make the request. - Endpoint that is going to receive requests. - Major parameters of the route of this endpoint. - - A based on the - and the with the provided data. - - - - - Creates a new based on a - and a previous . - - Bucket hash provided by Discord. - that is going to be upgraded to a hash type. - - A based on the - and . - - - - - Gets the string that will define this bucket as a hash based one. - - - A that defines this bucket as a hash based one. - - - - - Gets the string that will define this bucket as an endpoint based one. - - - A that defines this bucket as an endpoint based one. - - - - - The exception that is thrown if an error occurs while processing an Discord HTTP request. - - - - - Gets the HTTP status code returned by Discord. - - - An - HTTP status code - from Discord. - - - - - Gets the JSON error code returned by Discord. - - - A - JSON error code - from Discord, or null if none. - - - - - Gets the reason of the exception. - - - - - Gets the request object used to send the request. - - - - - The error object returned from discord. - - - Note: This object can be null if discord didn't provide it. - - - - - Initializes a new instance of the class. - - The HTTP status code returned. - The request that was sent prior to the exception. - The Discord status code returned. - The reason behind the exception. - - - - Represents a generic request to be sent to Discord. - - - - - The exception that is thrown when the user is being rate limited by Discord. - - - - - Gets the request object used to send the request. - - - - - Initializes a new instance of the class using the - sent. - - - - - Represents a generic REST-based client. - - - - - Sets the HTTP header of this client for all requests. - - The field name of the header. - The value of the header. - - - - Sets the cancellation token for this client. - - The cancellation token. - - - - Sends a REST request. - - The method used to send this request (i.e. HTTP verb such as GET, POST). - The endpoint to send this request to. - The cancellation token used to cancel the task. - Indicates whether to send the header only. - The audit log reason. - - - - - The exception that is thrown when the WebSocket session is closed by Discord. - - - - - Gets the close code sent by Discord. - - - A - close code - from Discord. - - - - - Gets the reason of the interruption. - - - - - Initializes a new instance of the using a Discord close code - and an optional reason. - - - - - Represents a generic ratelimit info. - - - - - Gets whether or not this ratelimit info is global. - - - - - Gets the number of requests that can be made. - - - - - Gets the number of remaining requests that can be made. - - - - - Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision. - - - - - Gets the at which the rate limit resets. - - - - - Gets the absolute time when this ratelimit resets. - - - - - Gets a unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path). - - - - - Gets the amount of lag for the request. This is used to denote the precise time of when the ratelimit expires. - - - - - Gets the endpoint that this ratelimit info came from. - - - - - Represents options that should be used when sending a request. - - - - - Creates a new class with its default settings. - - - - - Gets or sets the maximum time to wait for this request to complete. - - - Gets or set the max time, in milliseconds, to wait for this request to complete. If - null, a request will not time out. If a rate limit has been triggered for this request's bucket - and will not be unpaused in time, this request will fail immediately. - - - A in milliseconds for when the request times out. - - - - - Gets or sets the cancellation token for this request. - - - A for this request. - - - - - Gets or sets the retry behavior when the request fails. - - - - - Gets or sets the reason for this action in the guild's audit log. - - - Gets or sets the reason that will be written to the guild's audit log if applicable. This may not apply - to all actions. - - - - - Gets or sets whether or not this request should use the system - clock for rate-limiting. Defaults to true. - - - This property can also be set in . - On a per-request basis, the system clock should only be disabled - when millisecond precision is especially important, and the - hosting system is known to have a desynced clock. - - - - - Gets or sets the callback to execute regarding ratelimits for this request. - - - - - Initializes a new class with the default request timeout set in - . - - - - Specifies how a request should act in the case of an error. - - - If a request fails, an exception is thrown immediately. - - - Retry if a request timed out. - - - Retry if a request failed due to a rate-limit. - - - Retry if a request failed due to an HTTP error 502. - - - Continuously retry a request until it times out, its cancel token is triggered, or the server responds with a non-502 error. - - - Specifies the type of token to use with the client. - - - - An OAuth2 token type. - - - - - A bot token type. - - - - - A webhook token type. - - - - - Represents a cached entity. - - The type of entity that is cached. - The type of this entity's ID. - - - - Gets whether this entity is cached. - - - - - Gets the ID of this entity. - - - - - Gets the entity if it could be pulled from cache. - - - This value is not guaranteed to be set; in cases where the entity cannot be pulled from cache, it is - null. - - - - - Downloads this entity to cache. - - Thrown when used from a user account. - Thrown when the message is deleted. - - A task that represents the asynchronous download operation. The task result contains the downloaded - entity. - - - - - Returns the cached entity if it exists; otherwise downloads it. - - Thrown when used from a user account. - Thrown when the message is deleted and is not in cache. - - A task that represents the asynchronous operation that attempts to get the message via cache or to - download the message. The task result contains the downloaded entity. - - - - - Represents a collection of for various Discord objects. - - - - - Gets an to be used to compare users. - - - - - Gets an to be used to compare guilds. - - - - - Gets an to be used to compare channels. - - - - - Gets an to be used to compare roles. - - - - - Gets an to be used to compare messages. - - - - is null - - - - or is null - - - - is null - - - is null - - - is null - - - - - - - Provides a series of helper methods for parsing mentions. - - - - - Returns a mention string based on the user ID. - - - A user mention string (e.g. <@80351110224678912>). - - - - - Returns a mention string based on the channel ID. - - - A channel mention string (e.g. <#103735883630395392>). - - - - - Returns a mention string based on the role ID. - - - A role mention string (e.g. <@&165511591545143296>). - - - - - Parses a provided user mention string. - - The user mention. - Invalid mention format. - - - - Tries to parse a provided user mention string. - - The user mention. - The UserId of the user. - - - - Parses a provided channel mention string. - - Invalid mention format. - - - - Tries to parse a provided channel mention string. - - - - - Parses a provided role mention string. - - Invalid mention format. - - - - Tries to parse a provided role mention string. - - - - Gets the value for this parameter. - This property has no value set. - - - Returns true if this value has been specified. - - - Creates a new Parameter with the provided value. - - - must not be . - - - must not be . - - - cannot be blank. - - - cannot be blank. - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Messages are younger than 2 weeks. - - - The everyone role cannot be assigned to a user. - - - - Provides a series of helper methods for handling snowflake identifiers. - - - - - Resolves the time of which the snowflake is generated. - - The snowflake identifier to resolve. - - A representing the time for when the object is generated. - - - - - Generates a pseudo-snowflake identifier with a . - - The time to be used in the new snowflake. - - A representing the newly generated snowflake identifier. - - - - - Provides a series of helper methods for handling Discord login tokens. - - - - - The minimum length of a Bot token. - - - This value was determined by comparing against the examples in the Discord - documentation, and pre-existing tokens. - - - - - Pads a base64-encoded string with 0, 1, or 2 '=' characters, - if the string is not a valid multiple of 4. - Does not ensure that the provided string contains only valid base64 characters. - Strings that already contain padding will not have any more padding applied. - - - A string that would require 3 padding characters is considered to be already corrupt. - Some older bot tokens may require padding, as the format provided by Discord - does not include this padding in the token. - - The base64 encoded string to pad with characters. - A string containing the base64 padding. - - Thrown if would require an invalid number of padding characters. - - - Thrown if is null, empty, or whitespace. - - - - - Decodes a base 64 encoded string into a ulong value. - - A base 64 encoded string containing a User Id. - A ulong containing the decoded value of the string, or null if the value was invalid. - - - - Checks the validity of a bot token by attempting to decode a ulong userid - from the bot token. - - - The bot token to validate. - - - True if the bot token was valid, false if it was not. - - - - - The set of all characters that are not allowed inside of a token. - - - - - Checks if the given token contains a whitespace or newline character - that would fail to log in. - - The token to validate. - - True if the token contains a whitespace or newline character. - - - - - Checks the validity of the supplied token of a specific type. - - The type of token to validate. - The token value to validate. - Thrown when the supplied token string is null, empty, or contains only whitespace. - Thrown when the supplied or token value is invalid. - - - - Not full URL validation right now. Just ensures protocol is present and that it's either http or https - should be used for url buttons. - - The URL to validate before sending to Discord. - A URL must include a protocol (http or https). - true if URL is valid by our standard, false if null, throws an error upon invalid. - - - - Not full URL validation right now. Just Ensures the protocol is either http, https, or discord - should be used everything other than url buttons. - - The URL to validate before sending to discord. - A URL must include a protocol (either http, https, or discord). - true if the URL is valid by our standard, false if null, throws an error upon invalid. - -
-
diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index c54482136f..f428b39fbf 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -7,13 +7,6 @@ A core Discord.Net Labs library containing the REST client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - PackageLogo.png - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Discord.Net.Labs.Rest - https://github.com/Discord-Net-Labs/Discord.Net-Labs -
- - ..\Discord.Net.Rest\Discord.Net.Rest.xml @@ -21,13 +14,4 @@ - - - Always - - - True - - -
diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml deleted file mode 100644 index a8927268d3..0000000000 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ /dev/null @@ -1,5271 +0,0 @@ - - - - Discord.Net.Rest - - - - - Represents a vanity invite. - - - - - The unique code for the invite link. - - - - - The total amount of vanity invite uses. - - - - - Gets the snowflake ID of the application. - - - - - Gets the ID of the embed's image asset. - - - - - Gets the application's description. - - - - - Gets the ID of the application's icon. - - - - - Gets the name of the application. - - - - Unknown OAuth token type. - - - Unknown OAuth token type. - - - Unknown OAuth token type. - - - - must not be equal to zero. - -and- - must be greater than zero. - - - must not be . - -and- - must not be or empty. - - - - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - - - - and must not be equal to zero. - -and- - must be between 0 to 7. - - must not be . - - - and must not be equal to zero. - - - must not be equal to zero. - - - must not be equal to zero. - must not be . - - - must not be equal to zero. - - - and must not be equal to zero. - must not be . - - - cannot be blank. - must not be . - - - may not be equal to zero. - - - may not be equal to zero. - - - may not be equal to zero. - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - must not be . - - - Client is not logged in. - - - Unsupported param type. - - - The default RestClientProvider is not supported on this platform. - - - Cannot read from image. - - - - Represents a REST-Based ratelimit info. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the login state of the client. - - - - - Gets the logged-in user. - - - - - - - Creates a new REST-only Discord client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creating a guild is not supported with the base client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unexpected channel type. - - - - Provides a client to send REST-based requests to Discord. - - - - - Gets the logged-in user. - - - - - - - - Initializes a new with the provided configuration. - - The configuration to be used with the client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a configuration class for . - - - - Gets or sets the provider used to generate new REST connections. - - - - Contains a piece of audit log data related to a ban. - - - - - Gets the user that was banned. - - - A user object representing the banned user. - - - - - Contains a piece of audit log data related to a adding a bot to a guild. - - - - - Gets the bot that was added. - - - A user object representing the bot. - - - - - Contains a piece of audit log data related to a channel creation. - - - - - Gets the snowflake ID of the created channel. - - - A representing the snowflake identifier for the created channel. - - - - - Gets the name of the created channel. - - - A string containing the name of the created channel. - - - - - Gets the type of the created channel. - - - The type of channel that was created. - - - - - Gets the current slow-mode delay of the created channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether the created channel is NSFW. - - - true if the created channel has the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate that the clients in the created voice channel are requested to use. - - - An representing the bit-rate (bps) that the created voice channel defines and requests the - client(s) to use. - null if this is not mentioned in this entry. - - - - - Gets a collection of permission overwrites that was assigned to the created channel. - - - A collection of permission , containing the permission overwrites that were - assigned to the created channel. - - - - - Contains a piece of audit log data related to a channel deletion. - - - - - Gets the snowflake ID of the deleted channel. - - - A representing the snowflake identifier for the deleted channel. - - - - - Gets the name of the deleted channel. - - - A string containing the name of the deleted channel. - - - - - Gets the type of the deleted channel. - - - The type of channel that was deleted. - - - - - Gets the slow-mode delay of the deleted channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether the deleted channel was NSFW. - - - true if this channel had the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate of this channel if applicable. - - - An representing the bit-rate set of the voice channel. - null if this is not mentioned in this entry. - - - - - Gets a collection of permission overwrites that was assigned to the deleted channel. - - - A collection of permission . - - - - - Represents information for a channel. - - - - - Gets the name of this channel. - - - A string containing the name of this channel. - - - - - Gets the topic of this channel. - - - A string containing the topic of this channel, if any. - - - - - Gets the current slow-mode delay of this channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether this channel is NSFW. - - - true if this channel has the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate of this channel if applicable. - - - An representing the bit-rate set for the voice channel; - null if this is not mentioned in this entry. - - - - - Gets the type of this channel. - - - The channel type of this channel; null if not applicable. - - - - - Contains a piece of audit log data related to a channel update. - - - - - Gets the snowflake ID of the updated channel. - - - A representing the snowflake identifier for the updated channel. - - - - - Gets the channel information before the changes. - - - An information object containing the original channel information before the changes were made. - - - - - Gets the channel information after the changes. - - - An information object containing the channel information after the changes were made. - - - - - Contains a piece of audit log data related to an emoji creation. - - - - - Gets the snowflake ID of the created emoji. - - - A representing the snowflake identifier for the created emoji. - - - - - Gets the name of the created emoji. - - - A string containing the name of the created emoji. - - - - - Contains a piece of audit log data related to an emoji deletion. - - - - - Gets the snowflake ID of the deleted emoji. - - - A representing the snowflake identifier for the deleted emoji. - - - - - Gets the name of the deleted emoji. - - - A string containing the name of the deleted emoji. - - - - - Contains a piece of audit log data related to an emoji update. - - - - - Gets the snowflake ID of the updated emoji. - - - A representing the snowflake identifier of the updated emoji. - - - - - Gets the new name of the updated emoji. - - - A string containing the new name of the updated emoji. - - - - - Gets the old name of the updated emoji. - - - A string containing the old name of the updated emoji. - - - - - Represents information for a guild. - - - - - Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are - automatically moved to the AFK voice channel. - - - An representing the amount of time in seconds for a user to be marked as inactive - and moved into the AFK voice channel. - null if this is not mentioned in this entry. - - - - - Gets the default message notifications for users who haven't explicitly set their notification settings. - - - The default message notifications setting of this guild. - null if this is not mentioned in this entry. - - - - - Gets the ID of the AFK voice channel for this guild. - - - A representing the snowflake identifier of the AFK voice channel; null if - none is set. - - - - - Gets the name of this guild. - - - A string containing the name of this guild. - - - - - Gets the ID of the region hosting this guild's voice channels. - - - - - Gets the ID of this guild's icon. - - - A string containing the identifier for the splash image; null if none is set. - - - - - Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. - - - The level of requirements. - null if this is not mentioned in this entry. - - - - - Gets the owner of this guild. - - - A user object representing the owner of this guild. - - - - - Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to - perform administrative actions in this guild. - - - The level of MFA requirement. - null if this is not mentioned in this entry. - - - - - Gets the level of content filtering applied to user's content in a Guild. - - - The level of explicit content filtering. - - - - - Gets the ID of the channel where system messages are sent. - - - A representing the snowflake identifier of the channel where system - messages are sent; null if none is set. - - - - - Gets the ID of the widget embed channel of this guild. - - - A representing the snowflake identifier of the embedded channel found within the - widget settings of this guild; null if none is set. - - - - - Gets a value that indicates whether this guild is embeddable (i.e. can use widget). - - - true if this guild can be embedded via widgets; otherwise false. - null if this is not mentioned in this entry. - - - - - Contains a piece of audit log data related to a guild update. - - - - - Gets the guild information before the changes. - - - An information object containing the original guild information before the changes were made. - - - - - Gets the guild information after the changes. - - - An information object containing the guild information after the changes were made. - - - - - Contains a piece of audit log data related to an invite creation. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that determines whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the user that created this invite if available. - - - A user that created this invite or . - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite was used. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Contains a piece of audit log data related to an invite removal. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the user that created this invite if available. - - - A user that created this invite or . - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite has been used. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Represents information for an invite. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires; null if this - invite never expires or not specified. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off, - false if not; null if not specified. - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to; - null if not specified. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is specified. - - - - - Contains a piece of audit log data relating to an invite update. - - - - - Gets the invite information before the changes. - - - An information object containing the original invite information before the changes were made. - - - - - Gets the invite information after the changes. - - - An information object containing the invite information after the changes were made. - - - - - Contains a piece of audit log data related to a kick. - - - - - Gets the user that was kicked. - - - A user object representing the kicked user. - - - - - Contains a piece of audit log data related to disconnecting members from voice channels. - - - - - Gets the number of members that were disconnected. - - - An representing the number of members that were disconnected from a voice channel. - - - - - Represents information for a member. - - - - - Gets the nickname of the updated member. - - - A string representing the nickname of the updated member; null if none is set. - - - - - Gets a value that indicates whether the updated member is deafened by the guild. - - - true if the updated member is deafened (i.e. not permitted to listen to or speak to others) by the guild; - otherwise false. - null if this is not mentioned in this entry. - - - - - Gets a value that indicates whether the updated member is muted (i.e. not permitted to speak via voice) by the - guild. - - - true if the updated member is muted by the guild; otherwise false. - null if this is not mentioned in this entry. - - - - - Contains a piece of audit log data related to moving members between voice channels. - - - - - Gets the ID of the channel that the members were moved to. - - - A representing the snowflake identifier for the channel that the members were moved to. - - - - - Gets the number of members that were moved. - - - An representing the number of members that were moved to another voice channel. - - - - - Contains a piece of audit log data related to a change in a guild member's roles. - - - - - Gets a collection of role changes that were performed on the member. - - - A read-only collection of , containing the roles that were changed on - the member. - - - - - Gets the user that the roles changes were performed on. - - - A user object representing the user that the role changes were performed on. - - - - - An information object representing a change in one of a guild member's roles. - - - - - Gets the name of the role that was changed. - - - A string containing the name of the role that was changed. - - - - - Gets the ID of the role that was changed. - - - A representing the snowflake identifier of the role that was changed. - - - - - Gets a value that indicates whether the role was added to the user. - - - true if the role was added to the user; otherwise false. - - - - - Contains a piece of audit log data related to a change in a guild member. - - - - - Gets the user that the changes were performed on. - - - A user object representing the user who the changes were performed on. - - - - - Gets the member information before the changes. - - - An information object containing the original member information before the changes were made. - - - - - Gets the member information after the changes. - - - An information object containing the member information after the changes were made. - - - - - Contains a piece of audit log data related to message deletion(s). - - - - - Gets the ID of the channel that the messages were deleted from. - - - A representing the snowflake identifier for the channel that the messages were - deleted from. - - - - - Gets the number of messages that were deleted. - - - An representing the number of messages that were deleted from the channel. - - - - - Contains a piece of audit log data related to message deletion(s). - - - - - Gets the number of messages that were deleted. - - - An representing the number of messages that were deleted from the channel. - - - - - Gets the ID of the channel that the messages were deleted from. - - - A representing the snowflake identifier for the channel that the messages were - deleted from. - - - - - Gets the user of the messages that were deleted. - - - A user object representing the user that created the deleted messages. - - - - - Contains a piece of audit log data related to a pinned message. - - - - - Gets the ID of the messages that was pinned. - - - A representing the snowflake identifier for the messages that was pinned. - - - - - Gets the ID of the channel that the message was pinned from. - - - A representing the snowflake identifier for the channel that the message was pinned from. - - - - - Gets the user of the message that was pinned if available. - - - A user object representing the user that created the pinned message or . - - - - - Contains a piece of audit log data related to an unpinned message. - - - - - Gets the ID of the messages that was unpinned. - - - A representing the snowflake identifier for the messages that was unpinned. - - - - - Gets the ID of the channel that the message was unpinned from. - - - A representing the snowflake identifier for the channel that the message was unpinned from. - - - - - Gets the user of the message that was unpinned if available. - - - A user object representing the user that created the unpinned message or . - - - - - Contains a piece of audit log data for a permissions overwrite creation. - - - - - Gets the ID of the channel that the overwrite was created from. - - - A representing the snowflake identifier for the channel that the overwrite was - created from. - - - - - Gets the permission overwrite object that was created. - - - An object representing the overwrite that was created. - - - - - Contains a piece of audit log data related to the deletion of a permission overwrite. - - - - - Gets the ID of the channel that the overwrite was deleted from. - - - A representing the snowflake identifier for the channel that the overwrite was - deleted from. - - - - - Gets the permission overwrite object that was deleted. - - - An object representing the overwrite that was deleted. - - - - - Contains a piece of audit log data related to the update of a permission overwrite. - - - - - Gets the ID of the channel that the overwrite was updated from. - - - A representing the snowflake identifier for the channel that the overwrite was - updated from. - - - - - Gets the overwrite permissions before the changes. - - - An overwrite permissions object representing the overwrite permissions that the overwrite had before - the changes were made. - - - - - Gets the overwrite permissions after the changes. - - - An overwrite permissions object representing the overwrite permissions that the overwrite had after the - changes. - - - - - Gets the ID of the overwrite that was updated. - - - A representing the snowflake identifier of the overwrite that was updated. - - - - - Gets the target of the updated permission overwrite. - - - The target of the updated permission overwrite. - - - - - Contains a piece of audit log data related to a guild prune. - - - - - Gets the threshold for a guild member to not be kicked. - - - An representing the amount of days that a member must have been seen in the server, - to avoid being kicked. (i.e. If a user has not been seen for more than , they will be - kicked from the server) - - - - - Gets the number of members that were kicked during the purge. - - - An representing the number of members that were removed from this guild for having - not been seen within . - - - - - Contains a piece of audit log data related to a role creation. - - - - - Gets the ID of the role that was created. - - - A representing the snowflake identifier to the role that was created. - - - - - Gets the role information that was created. - - - An information object representing the properties of the role that was created. - - - - - Contains a piece of audit log data relating to a role deletion. - - - - - Gets the ID of the role that was deleted. - - - A representing the snowflake identifier to the role that was deleted. - - - - - Gets the role information that was deleted. - - - An information object representing the properties of the role that was deleted. - - - - - Represents information for a role edit. - - - - - Gets the color of this role. - - - A color object representing the color assigned to this role; null if this role does not have a - color. - - - - - Gets a value that indicates whether this role is mentionable. - - - true if other members can mention this role in a text channel; otherwise false; - null if this is not mentioned in this entry. - - - - - Gets a value that indicates whether this role is hoisted (i.e. its members will appear in a separate - section on the user list). - - - true if this role's members will appear in a separate section in the user list; otherwise - false; null if this is not mentioned in this entry. - - - - - Gets the name of this role. - - - A string containing the name of this role. - - - - - Gets the permissions assigned to this role. - - - A guild permissions object representing the permissions that have been assigned to this role; null - if no permissions have been assigned. - - - - - Contains a piece of audit log data related to a role update. - - - - - Gets the ID of the role that was changed. - - - A representing the snowflake identifier of the role that was changed. - - - - - Gets the role information before the changes. - - - A role information object containing the role information before the changes were made. - - - - - Gets the role information after the changes. - - - A role information object containing the role information after the changes were made. - - - - - Represents information for a stage. - - - - - Gets the topic of the stage channel. - - - - - Gets the privacy level of the stage channel. - - - - - Gets the user who started the stage channel. - - - - - Contains a piece of audit log data related to a stage going live. - - - - - Gets the topic of the stage channel. - - - - - Gets the privacy level of the stage channel. - - - - - Gets the user who started the stage channel. - - - - - Gets the Id of the stage channel. - - - - - Contains a piece of audit log data related to a stage instance deleted. - - - - - Gets the topic of the stage channel. - - - - - Gets the privacy level of the stage channel. - - - - - Gets the user who started the stage channel. - - - - - Gets the Id of the stage channel. - - - - - Contains a piece of audit log data related to a stage instance update. - - - - - Gets the Id of the stage channel. - - - - - Gets the stage information before the changes. - - - - - Gets the stage information after the changes. - - - - - Contains a piece of audit log data related to an unban. - - - - - Gets the user that was unbanned. - - - A user object representing the user that was unbanned. - - - - - Contains a piece of audit log data related to a webhook creation. - - - - - Gets the webhook that was created if it still exists. - - - A webhook object representing the webhook that was created if it still exists, otherwise returns null. - - - - - Gets the webhook id. - - - The webhook identifier. - - - - - Gets the type of webhook that was created. - - - The type of webhook that was created. - - - - - Gets the name of the webhook. - - - A string containing the name of the webhook. - - - - - Gets the ID of the channel that the webhook could send to. - - - A representing the snowflake identifier of the channel that the webhook could send - to. - - - - - Contains a piece of audit log data related to a webhook deletion. - - - - - Gets the ID of the webhook that was deleted. - - - A representing the snowflake identifier of the webhook that was deleted. - - - - - Gets the ID of the channel that the webhook could send to. - - - A representing the snowflake identifier of the channel that the webhook could send - to. - - - - - Gets the type of the webhook that was deleted. - - - The type of webhook that was deleted. - - - - - Gets the name of the webhook that was deleted. - - - A string containing the name of the webhook that was deleted. - - - - - Gets the hash value of the webhook's avatar. - - - A string containing the hash of the webhook's avatar. - - - - - Represents information for a webhook. - - - - - Gets the name of this webhook. - - - A string containing the name of this webhook. - - - - - Gets the ID of the channel that this webhook sends to. - - - A representing the snowflake identifier of the channel that this webhook can send - to. - - - - - Gets the hash value of this webhook's avatar. - - - A string containing the hash of this webhook's avatar. - - - - - Contains a piece of audit log data related to a webhook update. - - - - - Gets the webhook that was updated. - - - A webhook object representing the webhook that was updated. - - - - - Gets the webhook information before the changes. - - - A webhook information object representing the webhook before the changes were made. - - - - - Gets the webhook information after the changes. - - - A webhook information object representing the webhook after the changes were made. - - - - - Represents a REST-based audit log entry. - - - - - - - - - - - - - - - - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - Message content is too long, length must be less or equal to . - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - - - Resolving permissions requires the parent guild to be downloaded. - - - Resolving permissions requires the parent guild to be downloaded. - - - This channel does not have a parent channel. - - - - Represents a REST-based channel that can send and receive messages. - - - - - Sends a message to this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in - . Please visit - its documentation for more details on this method. - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of pinned messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a collection of messages found in the pinned messages. - - - - - Represents a REST-based channel that is private to select recipients. - - - - - Users that can access this channel. - - - - - Represents a REST-based category channel. - - - - - This method is not supported with category channels. - - - - This method is not supported with category channels. - - - - Represents a generic REST-based channel. - - - - - - - Unexpected channel type. - - - Unexpected channel type. - - - - - - - - - - - - - - - - Represents a REST-based direct-message channel. - - - - - Gets the current logged-in user. - - - - - Gets the recipient of the channel. - - - - - Gets a collection that is the current logged-in user and the recipient. - - - - - - - - - - - Gets a user in this channel from the provided . - - The snowflake identifier of the user. - - A object that is a recipient of this channel; otherwise null. - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a string that represents the Username#Discriminator of the recipient. - - - A string that resolves to the Recipient of this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based group-message channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - Connecting to a group channel is not supported. - - - - Represents a private REST-based group channel. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Adds or updates the permission overwrite for the given user. - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Adds or updates the permission overwrite for the given role. - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Gets the name of this channel. - - - A string that is the name of this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based news channel in a guild that has the same properties as a . - - - - - Represents a REST-based stage channel in a guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based channel in a guild that can send and receive messages. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets a user in this channel. - - The snowflake identifier of the user. - The options to be used when sending the request. - - Resolving permissions requires the parent guild to be downloaded. - - - A task representing the asynchronous get operation. The task result contains a guild user object that - represents the user; null if none is found. - - - - - Gets a collection of users that are able to view the channel. - - The options to be used when sending the request. - - Resolving permissions requires the parent guild to be downloaded. - - - A paged collection containing a collection of guild users that can access this channel. Flattening the - paginated response into a collection of users with - is required if you wish to access the users. - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - Gets the parent (category) channel of this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread channel received over REST. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the parent text channel id. - - - - - Gets a user within this thread. - - The id of the user to fetch. - The options to be used when sending the request. - - A task representing the asynchronous get operation. The task returns a - if found, otherwise . - - - - - Gets a collection of users within this thread. - - The options to be used when sending the request. - - A task representing the asynchronous get operation. The task returns a - of 's. - - - - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - - - - - - - - - - - - Represents a REST-based voice channel in a guild. - - - - - - - - - - - - - - - - - - - - - - - Gets the parent (category) channel of this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - - - - - - - Connecting to a REST-based channel is not supported. - - - - - - - - - - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - - Represents a REST-based ban object. - - - - - Gets the banned user. - - - A generic object that was banned. - - - - - - - - Gets the name of the banned user. - - - A string containing the name of the user that was banned. - - - - - - - - Represents a REST-based guild/server. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the built-in role containing all users in this guild. - - - - - Gets a collection of all roles in this guild. - - - - - - - - - - - - - - Updates this object's properties with its current state. - - - If true, and - will be updated as well. - - The options to be used when sending the request. - - If is true, and - will be updated as well. - - - - - - - - is . - - - - is . - - - - is . - - - - - - - - - - Deletes all slash commands in the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous delete operation. - - - - - Gets a collection of slash commands created by the current user in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - slash commands created by the current user. - - - - - Gets a slash command in the current guild. - - The unique identifier of the slash command. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - slash command created by the current user. - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - - - - - - - - - - - - - Gets a collection of all channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - generic channels found within this guild. - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the generic channel - associated with the specified ; if none is found. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - associated with the specified ; if none is found. - - - - - Gets a collection of all text channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - message channels found within this guild. - - - - - Gets a thread channel in this guild. - - The snowflake identifier for the thread channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the thread channel associated - with the specified ; if none is found. - - - - - Gets a collection of all thread in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - threads found within this guild. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel associated - with the specified ; if none is found. - - - - - Gets a collection of all voice channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice channels found within this guild. - - - - - Gets a stage channel in this guild - - The snowflake identifier for the stage channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the stage channel associated - with the specified ; if none is found. - - - - - Gets a collection of all stage channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - stage channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - category channels found within this guild. - - - - - Gets the AFK voice channel in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel that the - AFK users will be moved to after they have idled for too long; if none is set. - - - - - Gets the first viewable text channel in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the first viewable text - channel in this guild; if none is found. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the widget channel set - within the server's widget settings; if none is set. - - - - - Gets the text channel where guild notices such as welcome messages and boost events are posted. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where guild notices such as welcome messages and boost events are post; if none is found. - - - - - Gets the text channel where Community guilds can display rules and/or guidelines. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where Community guilds can display rules and/or guidelines; if none is set. - - - - - Gets the text channel where admins and moderators of Community guilds receive notices from Discord. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel where - admins and moderators of Community guilds receive notices from Discord; if none is set. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - 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}."; - }); - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a voice channel with the provided name. - - The name of the new channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - The created voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a category channel with the provided name. - - The name of the new channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - The created category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A partial metadata of the vanity invite found within this guild. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - The options to be used when sending the request. - Whether the role can be mentioned. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - The snowflake identifier of the user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild user - associated with the specified ; if none is found. - - - - - Gets the current user for this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the currently logged-in - user within this guild. - - - - - Gets the owner of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the owner of this guild. - - - - - - Prunes inactive users. - - - - This method removes all users that have not logged on in the provided number of . - - - If is true, this method will only return the number of users that - would be removed without kicking the users. - - - The number of days required for the users to be kicked. - Whether this prune action is a simulation. - The options to be used when sending the request. - - A task that represents the asynchronous prune operation. The task result contains the number of users to - be or has been removed from this guild. - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The options to be used when sending the request. - The audit log entry ID to get entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - Gets this guilds slash commands - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of application commands found within the guild. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Returns the name of the guild. - - - The name of the guild. - - - - - - - - - - - - - - is . - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a collection of all stickers within this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Disconnects the user from its current voice channel - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - - - - - - - - - - - - - Downloading users is not supported for a REST-based guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based voice region. - - - - - - - - - - - - - - - - - - - - Represents a Rest-based implementation of the . - - - - - - - - - - - - - - - - - - - - The options of this command. - - - - - - - - - - - - - - - - - Represents a Rest-based implementation of . - - - - - - - - - - - Represents a Rest-based implementation of . - - - - - - - - - - - - - - - - - - - - A collection of 's for this command. - - - - - A collection of 's for this command. - - - - - The allowed channel types for this option. - - - - - Represents a Rest-based global application command. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command. - - - - - Represents a Rest-based guild application command. - - - - - The guild Id where this command originates. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command - - - - - Gets this commands permissions inside of the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - object defining the permissions of the current slash command. - - - - - Modifies the current command permissions for this guild command. - - The permissions to overwrite. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. The task result contains a - object containing the modified permissions. - - - - - Gets the guild that this slash command resides in. - - if you want the approximate member and presence counts for the guild, otherwise . - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the URL of the invite. - - - A string that resolves to the Url of the invite. - - - - - - - - - - Represents additional information regarding the REST-based invite object. - - - - - - - - - - - - - - - - - - - Represents a Rest-based custom sticker within a guild. - - - - - Gets the users id who uploaded the sticker. - - - In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - Gets the guild that this custom sticker is in. - - - Note: This property can be if the sticker wasn't fetched from a guild. - - - - - - - - - - - Regex used to check if some text is formatted as inline code. - - - - - Regex used to check if some text is formatted as a code block. - - - - Only the author of a message may modify the message. - Message content is too long, length must be less or equal to . - - - - Represents a REST-based follow up message sent by a bot responding to a slash command. - - - - - Deletes this object and all of it's children. - - A task that represents the asynchronous delete operation. - - - - Modifies this interaction followup message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - The token used to modify/delete this message expired. - /// Something went wrong during the request. - - - - Represents the initial REST-based response to a slash command. - - - - - Deletes this object and all of it's children. - - A task that represents the asynchronous delete operation. - - - - Modifies this interaction response - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - The token used to modify/delete this message expired. - /// Something went wrong during the request. - - - - Represents a REST-based message. - - - - - - - - Gets the Author of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets a collection of the 's on the message. - - - - - Gets a collection of the 's on the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the interaction this message is a response to. - - - - - - - - - - - - - - Gets a collection of the mentioned users in the message. - - - - - - - - - - - Gets the of the message. - - - A string that is the of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST reaction object. - - - - - - - - Gets the number of reactions added. - - - - - Gets whether the reactions is added by the user. - - - - - Represents a REST-based system message. - - - - - Represents a REST-based message sent by a user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This operation may only be called on a channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a partial sticker received in a message. - - - - - - - - - - - Resolves this sticker item by fetching the from the API. - - - A task representing the download operation, the result of the task is a sticker object. - - - - - Represents a REST-based entity that contains information about a Discord application created via the developer portal. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unable to update this object from a different application token. - - - - Gets the name of the application. - - - Name of the application. - - - - - Represents a REST-based role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets if this role is the @everyone role of the guild or not. - - - - - - - - - - - - - - - - - - - - Gets the name of the role. - - - A string that is the name of the role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the name of the connection. - - - Name of the connection. - - - - - Represents a REST-based group user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based guild user. - - - - - - - - - - - - - - - - - - - - - - - - - - Resolving permissions requires the parent guild to be downloaded. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Resolving permissions requires the parent guild to be downloaded. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents the logged-in REST-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - Unable to update this object using a different token. - - - - Unable to modify this object using a different token. - - - - Represents a thread user received over the REST api. - - - - - Gets the this user is in. - - - - - Gets the timestamp for when this user joined this thread. - - - - - Gets the guild this user is in. - - - - - Gets the guild user for this thread user. - - - A task representing the asynchronous get operation. The task returns a - that represents the current thread user. - - - - - Represents a REST-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creates a direct message channel to this user. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a rest DM channel where the user is the recipient. - - - - - - - - - - - - - - Gets the Username#Discriminator of the user. - - - A string that resolves to Username#Discriminator of the user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Adds a user to the specified guild. - - - This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. - - The Discord client object. - The snowflake identifier of the guild. - The snowflake identifier of the user. - The OAuth2 access token for the user, requested with the guilds.join scope. - The delegate containing the properties to be applied to the user upon being added to the guild. - The options to be used when sending the request. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns the filename of this attachment. - - - A string containing the filename of this attachment. - - - - diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 5d7d9caa11..ac3d3b5ba3 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,31 +8,9 @@ net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 true - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - Discord.Net.Labs.WebSocket - PackageReference - true -
- - ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - - - TRACE - - + - - - Always - - - True - - - diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml deleted file mode 100644 index f3a05fafa1..0000000000 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ /dev/null @@ -1,5922 +0,0 @@ - - - - Discord.Net.WebSocket - - - - C←S - Used to send most events. - - - C↔S - Used to keep the connection alive and measure latency. - - - C→S - Used to associate a connection with a token and specify configuration. - - - C→S - Used to update client's status and current game id. - - - C→S - Used to join a particular voice channel. - - - C→S - Used to ensure the guild's voice server is alive. - - - C→S - Used to resume a connection after a redirect occurs. - - - C←S - Used to notify a client that they must reconnect to another gateway. - - - C→S - Used to request members that were withheld by large_threshold - - - C←S - Used to notify the client that their session has expired and cannot be resumed. - - - C←S - Used to provide information to the client immediately on connection. - - - C←S - Used to reply to a client's heartbeat. - - - C→S - Used to request presence updates from particular guilds. - - - C→S - Used to associate a connection with a token. - - - C→S - Used to specify configuration. - - - C←S - Used to notify that the voice connection was successful and informs the client of available protocols. - - - C→S - Used to keep the connection alive and measure latency. - - - C←S - Used to provide an encryption key to the client. - - - C↔S - Used to inform that a certain user is speaking. - - - C←S - Used to reply to a client's heartbeat. - - - C→S - Used to resume a connection. - - - C←S - Used to inform the client the heartbeat interval. - - - C←S - Used to acknowledge a resumed connection. - - - C←S - Used to notify that a client has disconnected. - - - The client must be logged in before connecting. - This client is not configured with WebSocket support. - - - This client is not configured with WebSocket support. - - - - Represents the base of a WebSocket-based Discord client. - - - - - Gets the estimated round-trip latency, in milliseconds, to the gateway server. - - - An that represents the round-trip latency to the WebSocket server. Please - note that this value does not represent a "true" latency for operations such as sending a message. - - - - - Gets the status for the logged-in user. - - - A status object that represents the user's online presence status. - - - - - Gets the activity for the logged-in user. - - - An activity object that represents the user's current activity. - - - - - Provides access to a REST-only client with a shared state from this client. - - - - - Gets a collection of default stickers. - - - - - Gets the current logged-in user. - - - - - Gets a collection of guilds that the user is currently in. - - - A read-only collection of guilds that the current user is in. - - - - - Gets a collection of private channels opened in this session. - - - This method will retrieve all private channels (including direct-message, group channel and such) that - are currently opened in this session. - - This method will not return previously opened private channels outside of the current session! If - you have just started the client, this may return an empty collection. - - - - A read-only collection of private channels that the user currently partakes in. - - - - - Gets a Discord application information for the logged-in user. - - - This method reflects your application information you submitted when creating a Discord application via - the Developer Portal. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application - information. - - - - - Gets a generic user. - - The user snowflake ID. - - This method gets the user present in the WebSocket cache with the given condition. - - Sometimes a user may return null 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 . - - - 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 - . - - - - A generic WebSocket-based user; null when the user cannot be found. - - - - - Gets a user. - - - This method gets the user present in the WebSocket cache with the given condition. - - Sometimes a user may return null 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 . - - - 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 - . - - - The name of the user. - The discriminator value of the user. - - A generic WebSocket-based user; null when the user cannot be found. - - - - - Gets a channel. - - The snowflake identifier of the channel (e.g. `381889909113225237`). - - A generic WebSocket-based channel object (voice, text, category, etc.) associated with the identifier; - null when the channel cannot be found. - - - - - Gets a guild. - - The guild snowflake identifier. - - A WebSocket-based guild associated with the snowflake identifier; null when the guild cannot be - found. - - - - - Gets all voice regions. - - The options to be used when sending the request. - - A task that contains a read-only collection of REST-based voice regions. - - - - - Gets a voice region. - - The identifier of the voice region (e.g. eu-central ). - The options to be used when sending the request. - - A task that contains a REST-based voice region associated with the identifier; null if the - voice region is not found. - - - - - - - - - - - Sets the current status of the user (e.g. Online, Do not Disturb). - - The new status to be set. - - A task that represents the asynchronous set operation. - - - - - Sets the game of the user. - - The name of the game. - If streaming, the URL of the stream. Must be a valid Twitch URL. - The type of the game. - - - Bot accounts cannot set as their activity - type and it will have no effect. - - - - A task that represents the asynchronous set operation. - - - - - Sets the of the logged-in user. - - - This method sets the of the user. - - Discord will only accept setting of name and the type of activity. - - - Bot accounts cannot set as their activity - type and it will have no effect. - - - Rich Presence cannot be set via this method or client. Rich Presence is strictly limited to RPC - clients only. - - - The activity to be set. - - A task that represents the asynchronous set operation. - - - - - Attempts to download users into the user cache for the selected guilds. - - The guilds to download the members from. - - A task that represents the asynchronous download operation. - - - - - Creates a guild for the logged-in user who is in less than 10 active guilds. - - - This method creates a new guild on behalf of the logged-in user. - - Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. - - - The name of the new guild. - The voice region to create the guild with. - The icon of the guild. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created guild. - - - - - Gets the connections that the user has set up. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. - - - - - Gets an invite. - - The invitation identifier. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the invite information. - - - - - Gets a sticker. - - Whether or not to allow downloading from the api. - The id of the sticker to get. - The options to be used when sending the request. - - A if found, otherwise . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when a channel is created. - - - This event is fired when a generic channel has been created. The event handler must return a - and accept a as its parameter. - - - The newly created channel is passed into the event handler parameter. The given channel type may - include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); - see the derived classes of for more details. - - - - - - - - Fired when a channel is destroyed. - - - This event is fired when a generic channel has been destroyed. The event handler must return a - and accept a as its parameter. - - - The destroyed channel is passed into the event handler parameter. The given channel type may - include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); - see the derived classes of for more details. - - - - - - - - Fired when a channel is updated. - - - This event is fired when a generic channel has been destroyed. The event handler must return a - and accept 2 as its parameters. - - - The original (prior to update) channel is passed into the first , while - the updated channel is passed into the second. The given channel type may include, but not limited - to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); see the derived classes of - for more details. - - - - - - - - Fired when a message is received. - - - This event is fired when a message is received. The event handler must return a - and accept a as its parameter. - - - The message that is sent to the client is passed into the event handler parameter as - . This message may be a system message (i.e. - ) or a user message (i.e. . See the - derived classes of for more details. - - - - The example below checks if the newly received message contains the target user. - - - - - Fired when a message is deleted. - - - This event is fired when a message is deleted. The event handler must return a - and accept a and - as its parameters. - - - - It is not possible to retrieve the message via - ; the message cannot be retrieved by Discord - after the message has been deleted. - - If caching is enabled via , the - entity will contain the deleted message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the removed message will be passed into the - parameter. - - - - - - - - Fired when multiple messages are bulk deleted. - - - The event will not be fired for individual messages contained in this event. - - - This event is fired when multiple messages are bulk deleted. The event handler must return a - and accept an and - as its parameters. - - - - It is not possible to retrieve the message via - ; the message cannot be retrieved by Discord - after the message has been deleted. - - If caching is enabled via , the - entity will contain the deleted message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the removed message will be passed into the - parameter. - - - - - Fired when a message is updated. - - - This event is fired when a message is updated. The event handler must return a - and accept a , , - and as its parameters. - - - If caching is enabled via , the - entity will contain the original message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The updated message will be passed into the parameter. - - - The source channel of the updated message will be passed into the - parameter. - - - - - Fired when a reaction is added to a message. - - - This event is fired when a reaction is added to a user message. The event handler must return a - and accept a , an - , and a as its parameter. - - - If caching is enabled via , the - entity will contain the original message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the reaction addition will be passed into the - parameter. - - - The reaction that was added will be passed into the parameter. - - - When fetching the reaction from this event, a user may not be provided under - . Please see the documentation of the property for more - information. - - - - - - - - Fired when a reaction is removed from a message. - - - Fired when all reactions to a message are cleared. - - - - Fired when all reactions to a message with a specific emote are removed. - - - - This event is fired when all reactions to a message with a specific emote are removed. - The event handler must return a and accept a and - a as its parameters. - - - The channel where this message was sent will be passed into the parameter. - - - The emoji that all reactions had and were removed will be passed into the parameter. - - - - - Fired when a role is created. - - - Fired when a role is deleted. - - - Fired when a role is updated. - - - Fired when the connected account joins a guild. - - - Fired when the connected account leaves a guild. - - - Fired when a guild becomes available. - - - Fired when a guild becomes unavailable. - - - Fired when offline guild members are downloaded. - - - Fired when a guild is updated. - - - Fired when a user joins a guild. - - - Fired when a user leaves a guild. - - - Fired when a user is banned from a guild. - - - Fired when a user is unbanned from a guild. - - - Fired when a user is updated. - - - Fired when a guild member is updated, or a member presence is updated. - - - Fired when a user joins, leaves, or moves voice channels. - - - Fired when the bot connects to a Discord voice server. - - - Fired when the connected account is updated. - - - Fired when a user starts typing. - - - Fired when a user joins a group channel. - - - Fired when a user is removed from a group channel. - - - - Fired when an invite is created. - - - - This event is fired when an invite is created. The event handler must return a - and accept a as its parameter. - - - The invite created will be passed into the parameter. - - - - - - Fired when an invite is deleted. - - - - This event is fired when an invite is deleted. The event handler must return - a and accept a and - as its parameter. - - - The channel where this invite was created will be passed into the parameter. - - - The code of the deleted invite will be passed into the parameter. - - - - - - Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands, autocompletes. - - - - This event is fired when an interaction is created. The event handler must return a - and accept a as its parameter. - - - The interaction created will be passed into the parameter. - - - - - - Fired when a button is clicked and its interaction is received. - - - - - Fired when a select menu is used and its interaction is received. - - - - - Fired when a slash command is used and its interaction is received. - - - - - Fired when a user command is used and its interaction is received. - - - - - Fired when a message command is used and its interaction is received. - - - - - Fired when an autocomplete is used and its interaction is received. - - - - - Fired when a guild application command is created. - - - - This event is fired when an application command is created. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a guild application command is updated. - - - - This event is fired when an application command is updated. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a guild application command is deleted. - - - - This event is fired when an application command is deleted. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a thread is created within a guild, or when the current user is added to a thread. - - - - - Fired when a thread is updated within a guild. - - - - - Fired when a thread is deleted. - - - - - Fired when a user joins a thread - - - - - Fired when a user leaves a thread - - - - - Fired when a stage is started. - - - - - Fired when a stage ends. - - - - - Fired when a stage is updated. - - - - - Fired when a user requests to speak within a stage channel. - - - - - Fired when a speaker is added in a stage channel. - - - - - Fired when a speaker is removed from a stage channel. - - - - - Fired when a sticker in a guild is created. - - - - - Fired when a sticker in a guild is updated. - - - - - Fired when a sticker in a guild is deleted. - - - - - - - - - - - - - - - - - - - - - - - Provides access to a REST-only client with a shared state from this client. - - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - is - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when a shard is connected to the Discord gateway. - - - Fired when a shard is disconnected from the Discord gateway. - - - Fired when a guild data for a shard has finished downloading. - - - Fired when a shard receives a heartbeat from the Discord gateway. - - - - Represents a WebSocket-based Discord client. - - - - - Provides access to a REST-only client with a shared state from this client. - - - - Gets the shard of this client. - - - Gets the current connection state of this client. - - - - - - - - - - - - - - - - - - - - - - Gets a collection of direct message channels opened in this session. - - - This method returns a collection of currently opened direct message channels. - - This method will not return previously opened DM channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - - A collection of DM channels that have been opened in this session. - - - - - Gets a collection of group channels opened in this session. - - - This method returns a collection of currently opened group channels. - - This method will not return previously opened group channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - - A collection of group channels that have been opened in this session. - - - - - Initializes a new REST/WebSocket-based Discord client. - - - - - Initializes a new REST/WebSocket-based Discord client with the provided configuration. - - The configuration to be used with the client. - - - - - - - - - - - - - - - - - - - - - - - - - Gets a generic channel from the cache or does a rest request if unavailable. - - - - var channel = await _client.GetChannelAsync(381889909113225237); - if (channel != null && channel is IMessageChannel msgChannel) - { - await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); - } - - - The snowflake identifier of the channel (e.g. `381889909113225237`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the channel associated - with the snowflake identifier; null when the channel cannot be found. - - - - - Gets a user from the cache or does a rest request if unavailable. - - - - var user = await _client.GetUserAsync(168693960628371456); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The snowflake identifier of the user (e.g. `168693960628371456`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the snowflake identifier; null if the user is not found. - - - - - Clears all cached channels from the client. - - - - - Clears cached DM channels from the client. - - - - - - - - - - - Gets a global application command. - - The id of the command. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains the application command if found, otherwise - . - - - - - Gets a collection of all global commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of global - application commands. - - - - - Clears cached users from the client. - - - - - - - - Gets a sticker. - - The unique identifier of the sticker. - A sticker if found, otherwise . - - - - - - - - - - - - - - The following example sets the status of the current user to Do Not Disturb. - - await client.SetStatusAsync(UserStatus.DoNotDisturb); - - - - - - - - The following example sets the activity of the current user to the specified game name. - - await client.SetGameAsync("A Strange Game"); - - - - The following example sets the activity of the current user to a streaming status. - - await client.SetGameAsync("Great Stream 10/10", "https://twitch.tv/MyAmazingStream1337", ActivityType.Streaming); - - - - - - - - - Unexpected channel type is created. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when connected to the Discord gateway. - - - Fired when disconnected to the Discord gateway. - - - - Fired when guild data has finished downloading. - - - It is possible that some guilds might be unsynced if - was not long enough to receive all GUILD_AVAILABLEs before READY. - - - - Fired when a heartbeat is received from the Discord gateway. - - - - Represents a configuration class for . - - - This configuration, based on , helps determine several key configurations the - socket client depend on. For instance, shards and connection timeout. - - - The following config enables the message cache and configures the client to always download user upon guild - availability. - - var config = new DiscordSocketConfig - { - AlwaysDownloadUsers = true, - MessageCacheSize = 100 - }; - var client = new DiscordSocketClient(config); - - - - - - Returns the encoding gateway should use. - - - - - Gets or sets the WebSocket host to connect to. If null, the client will use the - /gateway endpoint. - - - - - Gets or sets the time, in milliseconds, to wait for a connection to complete before aborting. - - - - - Gets or sets the ID for this shard. Must be less than . - - - - - Gets or sets the total number of shards for this application. - - - - - Gets or sets the number of messages per channel that should be kept in cache. Setting this to zero - disables the message cache entirely. - - - - - Gets or sets the max number of users a guild may have for offline users to be included in the READY - packet. The maximum value allowed is 250. - - - - - Gets or sets the provider used to generate new WebSocket connections. - - - - - Gets or sets the provider used to generate new UDP sockets. - - - - - Gets or sets whether or not all users should be downloaded as guilds come available. - - - - By default, the Discord gateway will only send offline members if a guild has less than a certain number - of members (determined by in this library). This behavior is why - sometimes a user may be missing from the WebSocket cache for collections such as - . - - - This property ensures that whenever a guild becomes available (determined by - ), incomplete user chunks will be - downloaded to the WebSocket cache. - - - For more information, please see - Request Guild Members - on the official Discord API documentation. - - - 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 - 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 - - or - as a backup. - - - - - - Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. - Setting this property to nulldisables this check. - - - - - Gets or sets the maximum identify concurrency. - - - This information is provided by Discord. - It is only used when using a and auto-sharding is disabled. - - - - - Gets or sets the maximum wait time in milliseconds between GUILD_AVAILABLE events before firing READY. - If zero, READY will fire as soon as it is received and all guilds will be unavailable. - - - This property is measured in milliseconds; negative values will throw an exception. - If a guild is not received before READY, it will be unavailable. - - - A representing the maximum wait time in milliseconds between GUILD_AVAILABLE events - before firing READY. - - Value must be at least 0. - - - - Gets or sets gateway intents to limit what events are sent from Discord. - The default is . - - - For more information, please see - GatewayIntents - on the official Discord API documentation. - - - - - Initializes a new instance of the class with the default configuration. - - - - - Represents a generic WebSocket-based audio channel. - - - - - Represents a generic WebSocket-based channel that can send and receive messages. - - - - - Gets all messages in this channel's cache. - - - A read-only collection of WebSocket-based messages. - - - - - Sends a message to this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a cached message from this channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return null. Please refer to - for more details. - - - This method retrieves the message from the local WebSocket cache and does not send any additional - request to Discord. This message may be a message that has been deleted. - - - The snowflake identifier of the message. - - A WebSocket-based message object; null if it does not exist in the cache or if caching is not - enabled. - - - - - Gets the last N cached messages from this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets the last N cached messages starting from a certain message in this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The message ID to start the fetching from. - The direction of which the message should be gotten from. - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets the last N cached messages starting from a certain message in this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The message to start the fetching from. - The direction of which the message should be gotten from. - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets a read-only collection of pinned messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a read-only collection of messages found in the pinned messages. - - - - - Represents a generic WebSocket-based channel that is private to select recipients. - - - - - Represents a WebSocket-based category channel. - - - - - - - - Gets the child channels of this category. - - - A read-only collection of whose - matches the snowflake identifier of this category - channel. - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based channel. - - - - - Gets when the channel is created. - - - - - Gets a collection of users from the WebSocket cache. - - - - Unexpected channel type is created. - - - - Gets a generic user from this channel. - - The snowflake identifier of the user. - - A generic WebSocket-based user associated with the snowflake identifier. - - - - - - - - - - - - - Unexpected type. - - - Unexpected type. - - - - Represents a WebSocket-based direct-message channel. - - - - - Gets the recipient of the channel. - - - - - - - - Gets a collection that is the current logged-in user and the recipient. - - - - - - - - - - - Gets the message associated with the given . - - TThe ID of the message. - The options to be used when sending the request. - - The message gotten from either the cache or the download, or null if none is found. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a user in this channel from the provided . - - The snowflake identifier of the user. - - A object that is a recipient of this channel; otherwise null. - - - - - Returns the recipient user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based private group channel. - - - - - - - - - - - Returns a collection representing all of the users in the group. - - - - - Returns a collection representing all users in the group, not including the client. - - - - - - - Voice is not yet supported for group channels. - - - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a user from this group. - - The snowflake identifier of the user. - - A WebSocket-based group user associated with the snowflake identifier. - - - - - Returns the name of the group. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Connecting to a group channel is not supported. - - - - - - - - - - Represents a WebSocket-based guild channel. - - - - - Gets the guild associated with this channel. - - - A guild object that this channel belongs to. - - - - - - - - - - - - - - Gets a collection of users that are able to view the channel. - - - A read-only collection of users that can access the channel (i.e. the users seen in the user list). - - - - - - - - - - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Adds or updates the permission overwrite for the given user. - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Adds or updates the permission overwrite for the given role. - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Gets the name of the channel. - - - A string that resolves to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based news channel in a guild that has the same properties as a . - - - - The property is not supported for news channels. - - - - - - - - This property is not supported by this type. Attempting to use this property will result in a . - - - - - - Represents a stage channel received over the gateway. - - - - - - - - - - - - - - - - - Returns if the current user is a speaker within the stage, otherwise . - - - - - Gets a collection of users who are speakers within the stage. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based channel in a guild that can send and receive messages. - - - - - - - - - - - - - - Gets the parent (category) of this channel in the guild's channel list. - - - An representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - - - - - - - Gets a collection of threads within this text channel. - - - - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread channel inside of a guild. - - - - - - - - Gets the owner of the current thread. - - - - - Gets the current users within this thread. - - - - - - - - if this thread is private, otherwise - - - - - Gets the parent channel this thread resides in. - - - - - - - - - - - - - - - - - - - - - - - Gets a collection of cached users within this thread. - - - - - - - - Gets all users inside this thread. - - - If all users are not downloaded then this method will call and return the result. - - The options to be used when sending the request. - A task representing the download operation. - - - - Downloads all users that have access to this thread. - - The options to be used when sending the request. - A task representing the asynchronous download operation. - - - - - - - - - - Adds a user to this thread. - - The to add. - The options to be used when sending the request. - - A task that represents the asynchronous operation of adding a member to a thread. - - - - - Removes a user from this thread. - - The to remove from this thread. - The options to be used when sending the request. - - A task that represents the asynchronous operation of removing a user from this thread. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - Represents a WebSocket-based voice channel in a guild. - - - - - - - - - - - - - - Gets the parent (category) channel of this channel. - - - A category channel representing the parent of this channel; null if none is set. - - - - - - - - - - - Gets a collection of users that are currently connected to this voice channel. - - - A read-only collection of users that are currently connected to this voice channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based guild object. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the number of members. - - - This property retrieves the number of members returned by Discord. - - - Due to how this property is returned by Discord instead of relying on the WebSocket cache, the - number here is the most accurate in terms of counting the number of users within this guild. - - - Use this instead of enumerating the count of the - collection, as you may see discrepancy - between that and this property. - - - - - - Gets the number of members downloaded to the local guild cache. - - - Indicates whether the client is connected to this guild. - - - - - - - - - Gets the user that owns this guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Indicates whether the client has all the members downloaded to the local guild cache. - - - Indicates whether the guild cache is synced to this guild. - - - - Gets the associated with this guild. - - - - - Gets the default channel in this guild. - - - This property retrieves the first viewable text channel for this guild. - - This channel does not guarantee the user can send message to it, as it only looks for the first viewable - text channel. - - - - A representing the first viewable channel that the user has access to. - - - - - Gets the AFK voice channel in this guild. - - - A that the AFK users will be moved to after they have idled for too - long; if none is set. - - - - - Gets the max bitrate for voice channels in this guild. - - - A representing the maximum bitrate value allowed by Discord in this guild. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - - A channel set within the server's widget settings; if none is set. - - - - - Gets the system channel where randomized welcome messages are sent in this guild. - - - A text channel where randomized welcome messages will be sent to; if none is set. - - - - - Gets the channel with the guild rules. - - - A text channel with the guild rules; if none is set. - - - - - Gets the channel where admins and moderators of Community guilds receive - notices from Discord. - - - A text channel where admins and moderators of Community guilds receive - notices from Discord; if none is set. - - - - - Gets a collection of all text channels in this guild. - - - A read-only collection of message channels found within this guild. - - - - - Gets a collection of all voice channels in this guild. - - - A read-only collection of voice channels found within this guild. - - - - - Gets a collection of all stage channels in this guild. - - - A read-only collection of stage channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - - A read-only collection of category channels found within this guild. - - - - - Gets a collection of all thread channels in this guild. - - - A read-only collection of thread channels found within this guild. - - - - - Gets the current logged-in user. - - - - - Gets the built-in role containing all users in this guild. - - - A role object that represents an @everyone role in this guild. - - - - - Gets a collection of all channels in this guild. - - - A read-only collection of generic channels found within this guild. - - - - - - - - Gets a collection of all custom stickers for this guild. - - - - - - - - Gets a collection of users in this guild. - - - This property retrieves all users found within this guild. - - - This property may not always return all the members for large guilds (i.e. guilds containing - 100+ users). If you are simply looking to get the number of users present in this guild, - consider using instead. - - - Otherwise, you may need to enable to fetch - the full user list upon startup, or use to manually download - the users. - - - - - A collection of guild users found within this guild. - - - - - Gets a collection of all roles in this guild. - - - A read-only collection of roles found within this guild. - - - - - - - - is . - - - - is . - - - - - - - - - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - - - - - - - - - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - - A generic channel associated with the specified ; if none is found. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - - A text channel associated with the specified ; if none is found. - - - - - Gets a thread in this guild. - - The snowflake identifier for the thread. - - A thread channel associated with the specified ; if none is found. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - - A voice channel associated with the specified ; if none is found. - - - - - Gets a stage channel in this guild. - - The snowflake identifier for the stage channel. - - A stage channel associated with the specified ; if none is found. - - - - - Gets a category channel in this guild. - - The snowflake identifier for the category channel. - - A category channel associated with the specified ; if none is found. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - 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}."; - }); - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a new voice channel in this guild. - - The new name for the voice channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a new channel category in this guild. - - The new name for the category. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Deletes all application commands in the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous delete operation. - - - - - Gets a collection of slash commands created by the current user in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - slash commands created by the current user. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the partial metadata of - the vanity invite found within this guild; if none is found. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - Whether the role can be mentioned. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds. - - - The snowflake identifier of the user. - - A guild user associated with the specified ; if none is found. - - - - - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild throught REST. - Users returned by this method are not cached. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The options to be used when sending the request. - The audit log entry ID to filter entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - - - - - - - - - - is . - - - - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - Disconnects the user from its current voice channel - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - A sticker, if none is found then . - - - - Gets a collection of all stickers within this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets the name of the guild. - - - A string that resolves to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Gets the message associated with this message command. - - - - - - Note Not implemented for - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Gets the user who this command targets. - - - - - - Note Not implemented for - - - - - Represents a Websocket-based interaction type for Message Components. - - - - - The data received with this interaction, contains the button that was clicked. - - - - - The message that contained the trigger for this interaction. - - - - - - - - Updates the message which this component resides in with the type - - A delegate containing the properties to modify the message with. - The request options for this request. - A task that represents the asynchronous operation of updating the message. - - - - - - - - - - - - - Defers an interaction and responds with type 5 () - - to send this message ephemerally, otherwise . - The request options for this request. - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - - - - Represents the data sent with a . - - - - - The components Custom Id that was clicked - - - - - The type of the component clicked - - - - - The value(s) of a interaction response. - - - - - Represents a received over the gateway. - - - - - The autocomplete data of this interaction. - - - - - Responds to this interaction with a set of choices. - - - The set of choices for the user to pick from. - - A max of 20 choices are allowed. Passing for this argument will show the executing user that - there is no choices for their autocompleted input. - - - The request options for this response. - - A task that represents the asynchronous operation of responding to this interaction. - - - - - Responds to this interaction with a set of choices. - - The request options for this response. - - The set of choices for the user to pick from. - - A max of 20 choices are allowed. Passing for this argument will show the executing user that - there is no choices for their autocompleted input. - - - - A task that represents the asynchronous operation of responding to this interaction. - - - - - - - - - - - - - - - - - - - - Represents data for a slash commands autocomplete interaction. - - - - - Gets the name of the invoked command. - - - - - Gets the id of the invoked command. - - - - - Gets the type of the invoked command. - - - - - Gets the version of the invoked command. - - - - - Gets the current autocomplete option that is actively being filled out. - - - - - Gets a collection of all the other options the executing users has filled out. - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Represents a Websocket-based received by the gateway. - - - - - - - - - - - - - - The sub command options received for this sub command group. - - - - - Represents a Websocket-based . - - - - - if this command is a global command, otherwise . - - - - - - - - - - - - - - - - - - - - A collection of 's for this command. - - - If the is not a slash command, this field will be an empty collection. - - - - - - - - Returns the guild this command resides in, if this command is a global command then it will return - - - - - - - - - - - - - - Represents a choice for a . - - - - - - - - - - - Represents an option for a . - - - - - - - - - - - - - - - - - - - - Choices for string and int types for the user to pick from. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - The allowed channel types for this option. - - - - - Base class for User, Message, and Slash command interactions. - - - - - Gets the name of the invoked command. - - - - - Gets the id of the invoked command. - - - - - The data associated with this interaction. - - - - - - - - - - - - - - - - - Acknowledges this interaction with the . - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - Represents the base data tied with the interaction. - - - - - - - - The received with this interaction. - - - - - Represents the base data tied with the interaction. - - - - - Represents an Interaction received over the gateway. - - - - - The this interaction was used in. - - - - - The who triggered this interaction. - - - - - The type of this interaction. - - - - - The token used to respond to this interaction. - - - - - The data sent with this interaction. - - - - - The version of this interaction. - - - - - - - - if the token is valid for replying to, otherwise . - - - - - Responds to an Interaction with type . - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - Message content is too long, length must be less or equal to . - The parameters provided were invalid or the token was invalid. - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - The file to upload. - The file name of the attachment. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - The file to upload. - The file name of the attachment. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Gets the original response for this interaction. - - The request options for this request. - A that represents the initial response. - - - - Edits original response for this interaction. - - A delegate containing the properties to modify the message with. - The request options for this request. - A that represents the initial response. - - - - Acknowledges this interaction. - - to send this message ephemerally, otherwise . - The request options for this request. - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - - - - - - - - - - Represents a WebSocket-based invite to a guild. - - - - - - - - Gets the channel where this invite was created. - - - - - - - - Gets the guild where this invite was created. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the time (in seconds) until the invite expires. - - - - - Gets the max number of uses this invite may have. - - - - - Gets the number of times this invite has been used. - - - - - Gets the user that created this invite if available. - - - - - - - - Gets when this invite was created. - - - - - Gets the user targeted by this invite if available. - - - - - Gets the type of the user targeted by this invite. - - - - - - - - - - - - - - Gets the URL of the invite. - - - A string that resolves to the Url of the invite. - - - - - - - - - - - - - - - - is less than 0. - - - - Represents a WebSocket-based message. - - - - - Gets the author of this message. - - - A WebSocket-based user object. - - - - - Gets the source channel of the message. - - - A WebSocket-based message channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the interaction this message is a response to. - - - - - - - - - - - Returns all attachments included in this message. - - - Collection of attachments. - - - - - Returns all embeds included in this message. - - - Collection of embed objects. - - - - - Returns the channels mentioned in this message. - - - Collection of WebSocket-based guild channels. - - - - - Returns the roles mentioned in this message. - - - Collection of WebSocket-based roles. - - - - - - - - - - - - - - Returns the users mentioned in this message. - - - Collection of WebSocket-based users. - - - - - - - - - - - Gets the content of the message. - - - Content of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based reaction object. - - - - - Gets the ID of the user who added the reaction. - - - This property retrieves the snowflake identifier of the user responsible for this reaction. This - property will always contain the user identifier in event that - cannot be retrieved. - - - A user snowflake identifier associated with the user. - - - - - Gets the user who added the reaction if possible. - - - - This property attempts to retrieve a WebSocket-cached user that is responsible for this reaction from - the client. In other words, when the user is not in the WebSocket cache, this property may not - contain a value, leaving the only identifiable information to be - . - - - If you wish to obtain an identifiable user object, consider utilizing - which will attempt to retrieve the user from REST. - - - - A user object where possible; a value is not always returned. - - - - - - Gets the ID of the message that has been reacted to. - - - A message snowflake identifier associated with the message. - - - - - Gets the message that has been reacted to if possible. - - - A WebSocket-based message where possible; a value is not always returned. - - - - - - Gets the channel where the reaction takes place in. - - - A WebSocket-based message channel. - - - - - - - - - - - - - - Represents a WebSocket-based message sent by the system. - - - - - Represents a WebSocket-based message sent by a user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Only the author of a message may modify the message. - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - This operation may only be called on a channel. - - - - Represents a WebSocket-based role to be given to a guild user. - - - - - Gets the guild that owns this role. - - - A representing the parent guild of this role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns a value that determines if the role is an @everyone role. - - - true if the role is @everyone; otherwise false. - - - - - - - - Returns an IEnumerable containing all that have this role. - - - - - - - - - - - - - - Gets the name of the role. - - - A string that resolves to . - - - - - - - - - - - - - - Represents a custom sticker within a guild received over the gateway. - - - - - Gets the user that uploaded the guild sticker. - - - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds, or the bot doesn't have the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - - Gets the guild the sticker was created in. - - - - - - - - - - - - - - Represents a general sticker received over the gateway. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents an unknown sticker received over the gateway. - - - - - - - - - - - - - - - - - - - - - - - Attempts to try to find the sticker. - - - The sticker representing this unknown stickers Id, if none is found then . - - - - - Represents a WebSocket-based group user. - - - - - Gets the group channel of the user. - - - A representing the channel of which the user belongs to. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based guild user. - - - - - Gets the guild the user is in. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns a collection of roles that the user possesses. - - - - - Returns the voice channel the user is in, or null if none. - - - - - - - - Gets the voice connection status of the user if any. - - - A representing the user's voice status; null if the user is not - connected to a voice channel. - - - - - - - - Returns the position of the user within the role hierarchy. - - - The returned value equal to the position of the highest role the user has, or - if user is the server owner. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents the WebSocket user's presence status. This may include their online status and their activity. - - - - - - - - - - - - - - Creates a new containing all of the client types - where a user is active from the data supplied in the Presence update frame. - - - A dictionary keyed by the - and where the value is the . - - - A collection of all s that this user is active. - - - - - Creates a new containing all the activities - that a user has from the data supplied in the Presence update frame. - - - A list of . - - - A list of all that this user currently has available. - - - - - Gets the status of the user. - - - A string that resolves to . - - - - - Represents the logged-in WebSocket-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread user received over the gateway. - - - - - Gets the this user is in. - - - - - Gets the timestamp for when this user joined this thread. - - - - - Gets the guild this user is in. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the guild user of this thread user. - - - - - - Represents a WebSocket-based user that is yet to be recognized by the client. - - - A user may not be recognized due to the user missing from the cache or failed to be recognized properly. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This field is not supported for an unknown user. - - - - Represents a WebSocket-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets mutual guilds shared with this user. - - - This property will only include guilds in the same . - - - - - - - - - - - - - - - - - Gets the full name of the user (e.g. Example#0001). - - - The full name of the user. - - - - - Represents a WebSocket user's voice connection status. - - - - - Initializes a default with everything set to null or false. - - - - - Gets the voice channel that the user is currently in; or null if none. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the name of this voice channel. - - - A string that resolves to name of this voice channel; otherwise "Unknown". - - - - - - - - Represents a WebSocket-based webhook user. - - - - Gets the guild of this webhook. - - - - - - - - - - - - - - - - Webhook users does not support banners. - - - - Webhook users does not support accent colors. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Webhook users cannot be kicked. - - - - Webhook users cannot be modified. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based voice server. - - - - - Gets the guild associated with the voice server. - - - A cached entity of the guild. - - - - - Gets the endpoint URL of the voice server host. - - - An URL representing the voice server host. - - - - - Gets the voice connection token. - - - A voice connection token. - - - - - The exception thrown when the gateway client has been requested to reconnect. - - - - - Initializes a new instance of the class with the reconnection - message. - - The reason why the gateway has been requested to reconnect. - - - Creates a new REST/WebSocket discord client. - - - - - - Wraps another stream with a timed buffer. - - - Reads the payload from an RTP frame - - - Converts Opus to PCM - - - Header received with no payload. - - - Received payload without an RTP header. - - - Converts PCM to Opus - - - Wraps an IAudioClient, sending voice data on write. - - - Reads the payload from an RTP frame - - - The token has had cancellation requested. - The associated has been disposed. - - - Wraps data in an RTP frame - - - - Decrypts an RTP frame using libsodium. - - - - - Encrypts an RTP frame using libsodium. - - - - Header received with no payload. - - - Received payload without an RTP header. - The token has had cancellation requested. - The associated has been disposed. - - - The sharded variant of , which may contain the client, user, guild, channel, and message. - - - Gets the that the command is executed with. - - - Gets the shard ID of the command context. - - - - - - - Represents a WebSocket-based context of a command. This may include the client, guild, channel, user, and message. - - - - - Gets the that the command is executed with. - - - - - Gets the that the command is executed in. - - - - - Gets the that the command is executed in. - - - - - Gets the who executed the command. - - - - - Gets the that the command is interpreted from. - - - - - Indicates whether the channel that the command is executed in is a private channel. - - - - - Initializes a new class with the provided client and message. - - The underlying client. - The underlying message. - - - - - - - - - - - - - - - - - - The default WebSocketProvider is not supported on this platform. - - - diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 57a705b30a..0f695f4c61 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -7,25 +7,9 @@ A core Discord.Net Labs library containing the Webhook client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - Discord.Net.Labs.Webhook - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - - - ..\Discord.Net.Webhook\Discord.Net.Webhook.xml - - - Always - - - True - - - diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml deleted file mode 100644 index d1bafb9a37..0000000000 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - Discord.Net.Webhook - - - - A client responsible for connecting as a Webhook. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - - Creates a new Webhook Discord client. - - The url of the webhook. - The configuration options to use for this client. - Thrown if the is an invalid format. - Thrown if the is null or whitespace. - - - Sends a message to the channel for this webhook. - Returns the ID of the created message. - - - - Modifies a message posted using this webhook. - - - This method can only modify messages that were sent using the same webhook. - - ID of the modified message. - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Deletes a message posted using this webhook. - - - This method can only delete messages that were sent using the same webhook. - - ID of the deleted message. - The options to be used when sending the request. - - A task that represents the asynchronous deletion operation. - - - - Sends a message to the channel for this webhook with an attachment. - Returns the ID of the created message. - - - Sends a message to the channel for this webhook with an attachment. - Returns the ID of the created message. - - - Modifies the properties of this webhook. - - - Deletes this webhook from Discord and disposes the client. - - - - Properties that are used to modify an Webhook message with the specified changes. - - - - - Gets or sets the content of the message. - - - This must be less than the constant defined by . - - - - - Gets or sets the embed array that the message should display. - - - - - Gets or sets the allowed mentions of the message. - - - - - Gets or sets the components that the message should display. - - - - Could not find a webhook with the supplied credentials. - - - From 81d31cae13652215476d11cd9c1f602aeb01802e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 03:25:01 -0300 Subject: [PATCH 395/494] Deprecate old package definitions in favor for target file Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com> --- Discord.Net.targets | 9 +- .../Discord.Net.Commands.csproj | 20 +- .../Discord.Net.Commands.xml | 1498 -- src/Discord.Net.Core/Discord.Net.Core.csproj | 19 +- src/Discord.Net.Core/Discord.Net.Core.xml | 13081 ---------------- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 16 - src/Discord.Net.Rest/Discord.Net.Rest.xml | 5271 ------- .../Discord.Net.WebSocket.csproj | 24 +- .../Discord.Net.WebSocket.xml | 5922 ------- .../Discord.Net.Webhook.csproj | 16 - .../Discord.Net.Webhook.xml | 111 - 11 files changed, 7 insertions(+), 25980 deletions(-) delete mode 100644 src/Discord.Net.Commands/Discord.Net.Commands.xml delete mode 100644 src/Discord.Net.Core/Discord.Net.Core.xml delete mode 100644 src/Discord.Net.Rest/Discord.Net.Rest.xml delete mode 100644 src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml delete mode 100644 src/Discord.Net.Webhook/Discord.Net.Webhook.xml diff --git a/Discord.Net.targets b/Discord.Net.targets index febd921d1f..f303f4594e 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,15 +1,14 @@ - 3.0.0 - dev + 3.1.2 latest Discord.Net Contributors discord;discordapp - https://github.com/Discord-Net/Discord.Net + https://github.com/Discord-Net-Labs/Discord.Net-Labs http://opensource.org/licenses/MIT - https://github.com/Discord-Net/Discord.Net/raw/dev/docs/marketing/logo/PackageLogo.png + https://github.com/Discord-Net-Labs/Discord.Net-Labs/raw/dev/docs/marketing/logo/PackageLogo.png git - git://github.com/Discord-Net/Discord.Net + git://github.com/Discord-Net-Labs/Discord.Net-Labs $(VersionSuffix)-dev diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index 119ed42f2f..af2293ac98 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -1,4 +1,4 @@ - + @@ -7,26 +7,8 @@ A Discord.Net Labs extension adding support for bot commands. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - Discord.Net.Labs.Commands - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - - - ..\Discord.Net.Commands\Discord.Net.Commands.xml - - - - Always - - - True - - - - diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.xml b/src/Discord.Net.Commands/Discord.Net.Commands.xml deleted file mode 100644 index b24a8fdd00..0000000000 --- a/src/Discord.Net.Commands/Discord.Net.Commands.xml +++ /dev/null @@ -1,1498 +0,0 @@ - - - - Discord.Net.Commands - - - - - Marks the aliases for a command. - - - This attribute allows a command to have one or multiple aliases. In other words, the base command can have - multiple aliases when triggering the command itself, giving the end-user more freedom of choices when giving - hot-words to trigger the desired command. See the example for a better illustration. - - - In the following example, the command can be triggered with the base name, "stats", or either "stat" or - "info". - - [Command("stats")] - [Alias("stat", "info")] - public Task GetStatsAsync(IUser user) - { - // ...pull stats - } - - - - - - Gets the aliases which have been defined for the command. - - - - - Creates a new with the given aliases. - - - - - Marks the execution information for a command. - - - - - Gets the text that has been set to be recognized as a command. - - - - - Specifies the of the command. This affects how the command is executed. - - - - - - - - Initializes a new attribute with the specified name. - - The name of the command. - - - - Prevents the marked module from being loaded automatically. - - - This attribute tells to ignore the marked module from being loaded - automatically (e.g. the method). If a non-public module marked - with this attribute is attempted to be loaded manually, the loading process will also fail. - - - - - Prevents the marked property from being injected into a module. - - - This attribute prevents the marked member from being injected into its parent module. Useful when you have a - public property that you do not wish to invoke the library's dependency injection service. - - - In the following example, DatabaseService will not be automatically injected into the module and will - not throw an error message if the dependency fails to be resolved. - - public class MyModule : ModuleBase - { - [DontInject] - public DatabaseService DatabaseService; - public MyModule() - { - DatabaseService = DatabaseFactory.Generate(); - } - } - - - - - - Marks the module as a command group. - - - - - Gets the prefix set for the module. - - - - - - - - Initializes a new with the provided prefix. - - The prefix of the module group. - - - - Marks the public name of a command, module, or parameter. - - - - - Gets the name of the command. - - - - - Marks the public name of a command, module, or parameter with the provided name. - - The public name of the object. - - - - Instructs the command system to treat command parameters of this type - as a collection of named arguments matching to its properties. - - - - - Marks the to be read by the specified . - - - This attribute will override the to be used when parsing for the - desired type in the command. This is useful when one wishes to use a particular - without affecting other commands that are using the same target - type. - - If the given type reader does not inherit from , an - will be thrown. - - - - In this example, the will be read by a custom - , FriendlyTimeSpanTypeReader, instead of the - shipped by Discord.Net. - - [Command("time")] - public Task GetTimeAsync([OverrideTypeReader(typeof(FriendlyTimeSpanTypeReader))]TimeSpan time) - => ReplyAsync(time); - - - - - - Gets the specified of the parameter. - - - - - The to be used with the parameter. - The given does not inherit from . - - - - Requires the parameter to pass the specified precondition before execution can begin. - - - - - - Checks whether the condition is met before execution of the command. - - The context of the command. - The parameter of the command being checked against. - The raw value of the parameter. - The service collection used for dependency injection. - - - - Requires the module or class to pass the specified precondition before execution can begin. - - - - - - Specifies a group that this precondition belongs to. - - - of the same group require only one of the preconditions to pass in order to - be successful (A || B). Specifying = null or not at all will - require *all* preconditions to pass, just like normal (A && B). - - - - - When overridden in a derived class, uses the supplied string - as the error message if the precondition doesn't pass. - Setting this for a class that doesn't override - this property is a no-op. - - - - - Checks if the has the sufficient permission to be executed. - - The context of the command. - The command being executed. - The service collection used for dependency injection. - - - - Requires the bot to have a specific permission in the channel a command is invoked in. - - - - - Gets the specified of the precondition. - - - - - Gets the specified of the precondition. - - - - - - - - Gets or sets the error message if the precondition - fails due to being run outside of a Guild channel. - - - - - Requires the bot account to have a specific . - - - This precondition will always fail if the command is being invoked in a . - - - The that the bot must have. Multiple permissions can be specified - by ORing the permissions together. - - - - - Requires that the bot account to have a specific . - - - The that the bot must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - - - - Defines the type of command context (i.e. where the command is being executed). - - - - - Specifies the command to be executed within a guild. - - - - - Specifies the command to be executed within a DM. - - - - - Specifies the command to be executed within a group. - - - - - Requires the command to be invoked in a specified context (e.g. in guild, DM). - - - - - Gets the context required to execute the command. - - - - - - - Requires the command to be invoked in the specified context. - The type of context the command can be invoked in. Multiple contexts can be specified by ORing the contexts together. - - - [Command("secret")] - [RequireContext(ContextType.DM | ContextType.Group)] - public Task PrivateOnlyAsync() - { - return ReplyAsync("shh, this command is a secret"); - } - - - - - - - - - Requires the command to be invoked in a channel marked NSFW. - - - The precondition will restrict the access of the command or module to be accessed within a guild channel - that has been marked as mature or NSFW. If the channel is not of type or the - channel is not marked as NSFW, the precondition will fail with an erroneous . - - - The following example restricts the command too-cool to an NSFW-enabled channel only. - - public class DankModule : ModuleBase - { - [Command("cool")] - public Task CoolAsync() - => ReplyAsync("I'm cool for everyone."); - - [RequireNsfw] - [Command("too-cool")] - public Task TooCoolAsync() - => ReplyAsync("You can only see this if you're cool enough."); - } - - - - - - - - - - - - Requires the command to be invoked by the owner of the bot. - - - This precondition will restrict the access of the command or module to the owner of the Discord application. - If the precondition fails to be met, an erroneous will be returned with the - message "Command can only be run by the owner of the bot." - - This precondition will only work if the account has a of - ;otherwise, this precondition will always fail. - - - - The following example restricts the command to a set of sensitive commands that only the owner of the bot - application should be able to access. - - [RequireOwner] - [Group("admin")] - public class AdminModule : ModuleBase - { - [Command("exit")] - public async Task ExitAsync() - { - Environment.Exit(0); - } - } - - - - - - - - - - - - Requires the user invoking the command to have a specified permission. - - - - - Gets the specified of the precondition. - - - - - Gets the specified of the precondition. - - - - - - - - Gets or sets the error message if the precondition - fails due to being run outside of a Guild channel. - - - - - Requires that the user invoking the command to have a specific . - - - This precondition will always fail if the command is being invoked in a . - - - The that the user must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - Requires that the user invoking the command to have a specific . - - - The that the user must have. Multiple permissions can be - specified by ORing the permissions together. - - - - - - - - Sets priority of commands. - - - - - Gets the priority which has been set for the command. - - - - - Initializes a new attribute with the given priority. - - - - - Marks the input to not be parsed by the parser. - - - - - Attaches remarks to your commands. - - - - - Attaches a summary to your command. - - - - Only the last parameter in a command may have the Remainder or Multiple flag. - - - The context of a command which may contain the client, user, guild, channel, and message. - - - - - - - - - - - - - - - - - - Indicates whether the channel that the command is executed in is a private channel. - - - - Initializes a new class with the provided client and message. - - The underlying client. - The underlying message. - - - Defines the type of error a command can throw. - - - - Thrown when the command is unknown. - - - - - Thrown when the command fails to be parsed. - - - - - Thrown when the input text has too few or too many arguments. - - - - - Thrown when the object cannot be found by the . - - - - - Thrown when more than one object is matched by . - - - - - Thrown when the command fails to meet a 's conditions. - - - - - Thrown when an exception occurs mid-command execution. - - - - - Thrown when the command is not successfully executed on runtime. - - - - - The exception that is thrown if another exception occurs during a command execution. - - - - Gets the command that caused the exception. - - - Gets the command context of the exception. - - - - Initializes a new instance of the class using a - information, a context, and the exception that - interrupted the execution. - - The command information. - The context of the command. - The exception that interrupted the command execution. - - - The command that matches the search result. - - - The alias of the command. - - - - Provides a framework for building Discord commands. - - - - The service provides a framework for building Discord commands both dynamically via runtime builders or - statically via compile-time modules. To create a command module at compile-time, see - (most common); otherwise, see . - - - This service also provides several events for monitoring command usages; such as - for any command-related log events, and - for information about commands that have - been successfully executed. - - - - - - Occurs when a command-related information is received. - - - - - Occurs when a command is executed. - - - This event is fired when a command has been executed, successfully or not. When a command fails to - execute during parsing or precondition stage, the CommandInfo may not be returned. - - - - - Represents all modules loaded within . - - - - - Represents all commands loaded within . - - - - - Represents all loaded within . - - - - - Initializes a new class. - - - - - Initializes a new class with the provided configuration. - - The configuration class. - - The cannot be set to . - - - - - Add a command module from a . - - - The following example registers the module MyModule to commandService. - - await commandService.AddModuleAsync<MyModule>(serviceProvider); - - - The type of module. - The for your dependency injection solution if using one; otherwise, pass null. - This module has already been added. - - The fails to be built; an invalid type may have been provided. - - - A task that represents the asynchronous operation for adding the module. The task result contains the - built module. - - - - - Adds a command module from a . - - The type of module. - The for your dependency injection solution if using one; otherwise, pass null . - This module has already been added. - - The fails to be built; an invalid type may have been provided. - - - A task that represents the asynchronous operation for adding the module. The task result contains the - built module. - - - - - Add command modules from an . - - The containing command modules. - The for your dependency injection solution if using one; otherwise, pass null. - - A task that represents the asynchronous operation for adding the command modules. The task result - contains an enumerable collection of modules added. - - - - - Removes the command module. - - The to be removed from the service. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the is successfully removed. - - - - - Removes the command module. - - The of the module. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the module is successfully removed. - - - - - Removes the command module. - - The of the module. - - A task that represents the asynchronous removal operation. The task result contains a value that - indicates whether the module is successfully removed. - - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable will - also be added. - If a default exists for , a warning will be logged - and the default will be replaced. - - The object type to be read by the . - An instance of the to be added. - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable for the - value type will also be added. - If a default exists for , a warning will be logged and - the default will be replaced. - - A instance for the type to be read. - An instance of the to be added. - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable will - also be added. - - The object type to be read by the . - An instance of the to be added. - - Defines whether the should replace the default one for - if it exists. - - - - - Adds a custom to this for the supplied object - type. - If is a , a nullable for the - value type will also be added. - - A instance for the type to be read. - An instance of the to be added. - - Defines whether the should replace the default one for if - it exists. - - - - - Searches for the command. - - The context of the command. - The position of which the command starts at. - The result containing the matching commands. - - - - Searches for the command. - - The context of the command. - The command string. - The result containing the matching commands. - - - - Executes the command. - - The context of the command. - The position of which the command starts at. - The service to be used in the command's dependency injection. - The handling mode when multiple command matches are found. - - A task that represents the asynchronous execution operation. The task result contains the result of the - command execution. - - - - - Executes the command. - - The context of the command. - The command string. - The service to be used in the command's dependency injection. - The handling mode when multiple command matches are found. - - A task that represents the asynchronous execution operation. The task result contains the result of the - command execution. - - - - - Represents a configuration class for . - - - - - Gets or sets the default commands should have, if one is not specified on the - Command attribute or builder. - - - - - Gets or sets the that separates an argument with another. - - - - - Gets or sets whether commands should be case-sensitive. - - - - - Gets or sets the minimum log level severity that will be sent to the event. - - - - - Gets or sets whether commands should push exceptions up to the caller. - - - - - Collection of aliases for matching pairs of string delimiters. - The dictionary stores the opening delimiter as a key, and the matching closing delimiter as the value. - If no value is supplied will be used, which contains - many regional equivalents. - Only values that are specified in this map will be used as string delimiters, so if " is removed then - it won't be used. - If this map is set to null or empty, the default delimiter of " will be used. - - - - QuotationMarkAliasMap = new Dictionary<char, char>() - { - {'\"', '\"' }, - {'“', '”' }, - {'「', '」' }, - } - - - - - - Gets or sets a value that indicates whether extra parameters should be ignored. - - - - - Provides extension methods for the class. - - - - - Returns commands that can be executed under the current context. - - The set of commands to be checked against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Returns commands that can be executed under the current context. - - The desired command service class to check against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Returns commands that can be executed under the current context. - - The module to be checked against. - The current command context. - The service provider used for dependency injection upon precondition check. - - A read-only collection of commands that can be executed under the current context. - - - - - Provides extension methods for that relates to commands. - - - - - Gets whether the message starts with the provided character. - - The message to check against. - The char prefix. - References where the command starts. - - true if the message begins with the char ; otherwise false. - - - - - Gets whether the message starts with the provided string. - - - - - Gets whether the message starts with the user's mention string. - - - - - Provides the information of a command. - - - This object contains the information of a command. This can include the module of the command, various - descriptions regarding the command, and its . - - - - - Gets the module that the command belongs in. - - - - - Gets the name of the command. If none is set, the first alias is used. - - - - - Gets the summary of the command. - - - This field returns the summary of the command. and can be - useful in help commands and various implementation that fetches details of the command for the user. - - - - - Gets the remarks of the command. - - - This field returns the summary of the command. and can be - useful in help commands and various implementation that fetches details of the command for the user. - - - - - Gets the priority of the command. This is used when there are multiple overloads of the command. - - - - - Indicates whether the command accepts a [] for its - parameter. - - - - - Indicates whether extra arguments should be ignored for this command. - - - - - Gets the that is being used for the command. - - - - - Gets a list of aliases defined by the of the command. - - - - - Gets a list of information about the parameters of the command. - - - - - Gets a list of preconditions defined by the of the command. - - - - - Gets a list of attributes of the command. - - - - - Provides the information of a module. - - - - - Gets the command service associated with this module. - - - - - Gets the name of this module. - - - - - Gets the summary of this module. - - - - - Gets the remarks of this module. - - - - - Gets the group name (main prefix) of this module. - - - - - Gets a read-only list of aliases associated with this module. - - - - - Gets a read-only list of commands associated with this module. - - - - - Gets a read-only list of preconditions that apply to this module. - - - - - Gets a read-only list of attributes that apply to this module. - - - - - Gets a read-only list of submodules associated with this module. - - - - - Gets the parent module of this submodule if applicable. - - - - - Gets a value that indicates whether this module is a submodule or not. - - - - - Provides the information of a parameter. - - - - - Gets the command that associates with this parameter. - - - - - Gets the name of this parameter. - - - - - Gets the summary of this parameter. - - - - - Gets a value that indicates whether this parameter is optional or not. - - - - - Gets a value that indicates whether this parameter is a remainder parameter or not. - - - - - Gets the type of the parameter. - - - - - Gets the default value for this optional parameter if applicable. - - - - - Gets a read-only list of precondition that apply to this parameter. - - - - - Gets a read-only list of attributes that apply to this parameter. - - - - Cannot add commands to the root node. - - - - Provides a base class for a command module to inherit from. - - - - - Provides a base class for a command module to inherit from. - - A class that implements . - - - - The underlying context of the command. - - - - - - - Sends a message to the source channel. - - - Contents of the message; optional only if is specified. - - Specifies if Discord should read this aloud using text-to-speech. - An embed to be displayed alongside the . - - Specifies if notifications are sent for mentioned users and roles in the . - If null, all mentioned roles and users will be notified. - - The request options for this request. - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - - - The method to execute before executing the command. - - The of the command to be executed. - - - - The method to execute after executing the command. - - The of the command to be executed. - - - - The method to execute when building the module. - - The used to create the module. - The builder used to build the module. - - - - Specifies the behavior when multiple matches are found during the command parsing stage. - - - - Indicates that when multiple results are found, an exception should be thrown. - - - Indicates that when multiple results are found, the best result should be chosen. - - - - A for parsing objects implementing . - - - This is shipped with Discord.Net and is used by default to parse any - implemented object within a command. The TypeReader will attempt to first parse the - input by mention, then the snowflake identifier, then by name; the highest candidate will be chosen as the - final output; otherwise, an erroneous is returned. - - The type to be checked; must implement . - - - - - - - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - - - must be within the range [0, 1]. - - - must be within the range [0, 1]. - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - - - - Defines a reader class that parses user input into a specified type. - - - - - Attempts to parse the into the desired type. - - The context of the command. - The raw input of the command. - The service collection used for dependency injection. - - A task that represents the asynchronous parsing operation. The task result contains the parsing result. - - - - - A for parsing objects implementing . - - The type to be checked; must implement . - - - - - - - Contains information of the command's overall execution result. - - - - - Gets the exception that may have occurred during the command execution. - - - - - - - - - - - - - - Initializes a new with no error, indicating a successful execution. - - - A that does not contain any errors. - - - - - Initializes a new with a specified and its - reason, indicating an unsuccessful execution. - - The type of error. - The reason behind the error. - - A that contains a and reason. - - - - - Initializes a new with a specified exception, indicating an unsuccessful - execution. - - The exception that caused the command execution to fail. - - A that contains the exception that caused the unsuccessful execution, along - with a of type Exception as well as the exception message as the - reason. - - - - - Initializes a new with a specified result; this may or may not be an - successful execution depending on the and - specified. - - The result to inherit from. - - A that inherits the error type and reason. - - - - - Gets a string that indicates the execution result. - - - Success if is true; otherwise ": - ". - - - - - Contains information of the result related to a command. - - - - - Describes the error type that may have occurred during the operation. - - - A indicating the type of error that may have occurred during the operation; - null if the operation was successful. - - - - - Describes the reason for the error. - - - A string containing the error reason. - - - - - Indicates whether the operation was successful or not. - - - true if the result is positive; otherwise false. - - - - - Contains information for the parsing result from the command service's parser. - - - - - - - - - - - Provides information about the parameter that caused the parsing error. - - - A indicating the parameter info of the error that may have occurred during parsing; - null if the parsing was successful or the parsing error is not specific to a single parameter. - - - - - - - - Represents a result type for command preconditions. - - - - - - - - - - - - - - Initializes a new class with the command type - and reason. - - The type of failure. - The reason of failure. - - - - Returns a with no errors. - - - - - Returns a with and the - specified reason. - - The reason of failure. - - - - Returns a with the specified type. - - The result of failure. - - - - Returns a string indicating whether the is successful. - - - - - Initializes a new class with the type of error and reason. - - The type of failure, or null if none. - The reason of failure. - - - - - - Describes the execution reason or result. - - - - - - - - - - - - - - - - - - - - - - - - - - - TypeReaderResult was not successful. - - - - Specifies the behavior of the command execution workflow. - - - - - - - The default behavior set in . - - - - - Executes the command on the same thread as gateway one. - - - - - Executes the command on a different thread from the gateway one. - - - - - Utility class which contains the default matching pairs of quotation marks for CommandServiceConfig - - - - - A default map of open-close pairs of quotation marks. - Contains many regional and Unicode equivalents. - Used in the . - - - - - diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 3b915ef492..85769f1c56 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -1,4 +1,4 @@ - + @@ -7,14 +7,6 @@ The core components for the Discord.Net Labs library. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - Discord.Net.Labs.Core - Discord.Net.Labs.Core - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - false - - - ..\Discord.Net.Core\Discord.Net.Core.xml @@ -33,13 +25,4 @@ - - - Always - - - True - - - diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml deleted file mode 100644 index 0c89d54166..0000000000 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ /dev/null @@ -1,13081 +0,0 @@ - - - - Discord.Net.Core - - - - - Reading this stream is not supported. - - - - Setting the length to this stream is not supported. - - - - Seeking this stream is not supported.. - - - This stream does not accept headers. - - - - Reading stream length is not supported. - - - - Getting or setting this stream position is not supported. - - - - Reading this stream is not supported. - - - - Setting the length to this stream is not supported. - - - - Seeking this stream is not supported.. - - - Gets the current connection state of this client. - - - Gets the estimated round-trip latency, in milliseconds, to the voice WebSocket server. - - - Gets the estimated round-trip latency, in milliseconds, to the voice UDP server. - - - Gets the current audio streams. - - - Creates a new outgoing stream accepting Opus-encoded data. - - - Creates a new outgoing stream accepting Opus-encoded data. This is a direct stream with no internal timer. - - - Creates a new outgoing stream accepting PCM (raw) data. - - - Creates a new direct outgoing stream accepting PCM (raw) data. This is a direct stream with no internal timer. - - - - Represents a class containing the strings related to various Content Delivery Networks (CDNs). - - - - - Returns a team icon URL. - - The team identifier. - The icon identifier. - - A URL pointing to the team's icon. - - - - - Returns an application icon URL. - - The application identifier. - The icon identifier. - - A URL pointing to the application's icon. - - - - - Returns a user avatar URL. - - The user snowflake identifier. - The avatar identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the user's avatar in the specified size. - - - - - Returns a user banner URL. - - The user snowflake identifier. - The banner identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the user's banner in the specified size. - - - - - Returns the default user avatar URL. - - The discriminator value of a user. - - A URL pointing to the user's default avatar when one isn't set. - - - - - Returns an icon URL. - - The guild snowflake identifier. - The icon identifier. - - A URL pointing to the guild's icon. - - - - - Returns a guild role's icon URL. - - The role identifier. - The icon hash. - - A URL pointing to the guild role's icon. - - - - - Returns a guild splash URL. - - The guild snowflake identifier. - The splash icon identifier. - - A URL pointing to the guild's splash. - - - - - Returns a guild discovery splash URL. - - The guild snowflake identifier. - The discovery splash icon identifier. - - A URL pointing to the guild's discovery splash. - - - - - Returns a channel icon URL. - - The channel snowflake identifier. - The icon identifier. - - A URL pointing to the channel's icon. - - - - - Returns a guild banner URL. - - The guild snowflake identifier. - The banner image identifier. - The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048 inclusive. - - A URL pointing to the guild's banner image. - - - - - Returns an emoji URL. - - The emoji snowflake identifier. - Whether this emoji is animated. - - A URL pointing to the custom emote. - - - - - Returns a Rich Presence asset URL. - - The application identifier. - The asset identifier. - The size of the image to return in. This can be any power of two between 16 and 2048. - The format to return. - - A URL pointing to the asset image in the specified size. - - - - - Returns a Spotify album URL. - - The identifier for the album art (e.g. 6be8f4c8614ecf4f1dd3ebba8d8692d8ce4951ac). - - A URL pointing to the Spotify album art. - - - - - Returns a Spotify direct URL for a track. - - The identifier for the track (e.g. 4uLU6hMCjMI75M1A2tKUQC). - - A URL pointing to the Spotify track. - - - - - Gets a stickers url based off the id and format. - - The id of the sticker. - The format of the sticker. - - A URL to the sticker. - - - - - Represents a context of a command. This may include the client, guild, channel, user, and message. - - - - - Gets the that the command is executed with. - - - - - Gets the that the command is executed in. - - - - - Gets the that the command is executed in. - - - - - Gets the who executed the command. - - - - - Gets the that the command is interpreted from. - - - - Specifies the connection state of a client. - - - The client has disconnected from Discord. - - - The client is connecting to Discord. - - - The client has established a connection to Discord. - - - The client is disconnecting from Discord. - - - - Defines various behaviors of Discord.Net. - - - - - Returns the API version Discord.Net uses. - - - An representing the API version that Discord.Net uses to communicate with Discord. - A list of available API version can be seen on the official - Discord API documentation - . - - - - - Returns the Voice API version Discord.Net uses. - - - An representing the API version that Discord.Net uses to communicate with Discord's - voice server. - - - - - Gets the Discord.Net version, including the build number. - - - A string containing the detailed version information, including its build number; Unknown when - the version fails to be fetched. - - - - - Gets the user agent that Discord.Net uses in its clients. - - - The user agent used in each Discord.Net request. - - - - - Returns the base Discord API URL. - - - The Discord API URL using . - - - - - Returns the base Discord CDN URL. - - - The base Discord Content Delivery Network (CDN) URL. - - - - - Returns the base Discord invite URL. - - - The base Discord invite URL. - - - - - Returns the default timeout for requests. - - - The amount of time it takes in milliseconds before a request is timed out. - - - - - Returns the max length for a Discord message. - - - The maximum length of a message allowed by Discord. - - - - - Returns the max messages allowed to be in a request. - - - The maximum number of messages that can be gotten per-batch. - - - - - Returns the max users allowed to be in a request. - - - The maximum number of users that can be gotten per-batch. - - - - - Returns the max guilds allowed to be in a request. - - - The maximum number of guilds that can be gotten per-batch. - - - - - Returns the max user reactions allowed to be in a request. - - - The maximum number of user reactions that can be gotten per-batch. - - - - - Returns the max audit log entries allowed to be in a request. - - - The maximum number of audit log entries that can be gotten per-batch. - - - - - Gets or sets how a request should act in the case of an error, by default. - - - The currently set . - - - - - Gets or sets the minimum log level severity that will be sent to the Log event. - - - The currently set for logging level. - - - - - Gets or sets whether the initial log entry should be printed. - - - If set to true, the library will attempt to print the current version of the library, as well as - the API version it uses on startup. - - - - - Gets or sets whether or not rate-limits should use the system clock. - - - If set to false, we will use the X-RateLimit-Reset-After header - to determine when a rate-limit expires, rather than comparing the - X-RateLimit-Reset timestamp to the system time. - - This should only be changed to false if the system is known to have - a clock that is out of sync. Relying on the Reset-After header will - incur network lag. - - Regardless of this property, we still rely on the system's wall-clock - to determine if a bucket is rate-limited; we do not use any monotonic - clock. Your system will still need a stable clock. - - - - - Flags for the property, that are ORd together. - These describe what the activity payload includes. - - - - - Indicates that no actions on this activity can be taken. - - - - - Indicates that this activity can be joined. - - - - - Indicates that this activity can be spectated. - - - - - Indicates that a user may request to join an activity. - - - - - Indicates that a user can listen along in Spotify. - - - - - Indicates that a user can play this song. - - - - - Specifies a Discord user's activity type. - - - - - The user is playing a game. - - - - - The user is streaming online. - - - - - The user is listening to a song. - - - - - The user is watching some form of media. - - - - - The user has set a custom status. - - - - - The user is competing in a game. - - - - - A user's activity for their custom status. - - - - - Gets the emote, if it is set. - - - An containing the or set by the user. - - - - - Gets the timestamp of when this status was created. - - - A containing the time when this status was created. - - - - - Gets the state of the status. - - - - - A user's game status. - - - - - - - - - - - - - - - - - Creates a with the provided name and . - - The name of the game. - The type of activity. - - - Returns the name of the . - - - - An asset for a object containing the text and image. - - - - - Gets the description of the asset. - - - A string containing the description of the asset. - - - - - Gets the image ID of the asset. - - - A string containing the unique image identifier of the asset. - - - - - Returns the image URL of the asset. - - The size of the image to return in. This can be any power of two between 16 and 2048. - The format to return. - - A string pointing to the image URL of the asset; null when the application ID does not exist. - - - - - Party information for a object. - - - - - Gets the ID of the party. - - - A string containing the unique identifier of the party. - - - - - Gets the party's current and maximum size. - - - A representing the capacity of the party. - - - - - Party secret for a object. - - - - - Gets the secret for a specific instanced match. - - - - - Gets the secret for joining a party. - - - - - Gets the secret for spectating a game. - - - - - Timestamps for a object. - - - - - Gets when the activity started. - - - - - Gets when the activity ends. - - - - - A user's activity status, typically a . - - - - - Gets the name of the activity. - - - A string containing the name of the activity that the user is doing. - - - - - Gets the type of the activity. - - - The type of activity. - - - - - Gets the flags that are relevant to this activity. - - - This value is determined by bitwise OR-ing values together. - - - The value of flags for this activity. - - - - - Gets the details on what the player is currently doing. - - - A string describing what the player is doing. - - - - - A user's Rich Presence status. - - - - - Gets the user's current party status. - - - - - Gets the application ID for the game. - - - - - Gets the small image for the presence and their hover texts. - - - - - Gets the large image for the presence and their hover texts. - - - - - Gets the information for the current party of the player. - - - - - Gets the secrets for Rich Presence joining and spectating. - - - - - Gets the timestamps for start and/or end of the game. - - - - - Returns the name of the Rich Presence. - - - - - A user's activity for listening to a song on Spotify. - - - - - Gets the song's artist(s). - - - A collection of string containing all artists featured in the track (e.g. Avicii; Rita Ora). - - - - - Gets the Spotify album title of the song. - - - A string containing the name of the album (e.g. AVĪCI (01)). - - - - - Gets the track title of the song. - - - A string containing the name of the song (e.g. Lonely Together (feat. Rita Ora)). - - - - - Gets the date when the track started playing. - - - A containing the start timestamp of the song. - - - - - Gets the date when the track ends. - - - A containing the finish timestamp of the song. - - - - - Gets the duration of the song. - - - A containing the duration of the song. - - - - - Gets the elapsed duration of the song. - - - A containing the elapsed duration of the song. - - - - - Gets the remaining duration of the song. - - - A containing the remaining duration of the song. - - - - - Gets the track ID of the song. - - - A string containing the Spotify ID of the track (e.g. 7DoN0sCGIT9IcLrtBDm4f0). - - - - - Gets the session ID of the song. - - - The purpose of this property is currently unknown. - - - A string containing the session ID. - - - - - Gets the URL of the album art. - - - A URL pointing to the album art of the track (e.g. - https://i.scdn.co/image/ba2fd8823d42802c2f8738db0b33a4597f2f39e7). - - - - - Gets the direct Spotify URL of the track. - - - A URL pointing directly to the track on Spotify. (e.g. - https://open.spotify.com/track/7DoN0sCGIT9IcLrtBDm4f0). - - - - - Gets the full information of the song. - - - A string containing the full information of the song (e.g. - Avicii, Rita Ora - Lonely Together (feat. Rita Ora) (3:08) - - - - - A user's activity for streaming on services such as Twitch. - - - - - Gets the URL of the stream. - - - - - Creates a new based on the on the stream URL. - - The name of the stream. - The URL of the stream. - - - - Gets the name of the stream. - - - - - Representing a type of action within an . - - - - - this guild was updated. - - - - - A channel was created. - - - - - A channel was updated. - - - - - A channel was deleted. - - - - - A permission overwrite was created for a channel. - - - - - A permission overwrite was updated for a channel. - - - - - A permission overwrite was deleted for a channel. - - - - - A user was kicked from this guild. - - - - - A prune took place in this guild. - - - - - A user banned another user from this guild. - - - - - A user unbanned another user from this guild. - - - - - A guild member whose information was updated. - - - - - A guild member's role collection was updated. - - - - - A guild member moved to a voice channel. - - - - - A guild member disconnected from a voice channel. - - - - - A bot was added to this guild. - - - - - A role was created in this guild. - - - - - A role was updated in this guild. - - - - - A role was deleted from this guild. - - - - - An invite was created in this guild. - - - - - An invite was updated in this guild. - - - - - An invite was deleted from this guild. - - - - - A Webhook was created in this guild. - - - - - A Webhook was updated in this guild. - - - - - A Webhook was deleted from this guild. - - - - - An emoji was created in this guild. - - - - - An emoji was updated in this guild. - - - - - An emoji was deleted from this guild. - - - - - A message was deleted from this guild. - - - - - Multiple messages were deleted from this guild. - - - - - A message was pinned from this guild. - - - - - A message was unpinned from this guild. - - - - - A integration was created - - - - - A integration was updated - - - - - An integration was deleted - - - - - A stage instance was created. - - - - - A stage instance was updated. - - - - - A stage instance was deleted. - - - - - A sticker was created. - - - - - A sticker was updated. - - - - - A sticker was deleted. - - - - - A thread was created. - - - - - A thread was updated. - - - - - A thread was deleted. - - - - - Represents data applied to an . - - - - - Represents a generic audit log entry. - - - - - Gets the action which occurred to create this entry. - - - The type of action for this audit log entry. - - - - - Gets the data for this entry. - - - An for this audit log entry; null if no data is available. - - - - - Gets the user responsible for causing the changes. - - - A user object. - - - - - Gets the reason behind the change. - - - A string containing the reason for the change; null if none is provided. - - - - - Specifies the cache mode that should be used. - - - - - Allows the object to be downloaded if it does not exist in the current cache. - - - - - Only allows the object to be pulled from the existing cache. - - - - Defines the types of channels. - - - The channel is a text channel. - - - The channel is a Direct Message channel. - - - The channel is a voice channel. - - - The channel is a group channel. - - - The channel is a category channel. - - - The channel is a news channel. - - - The channel is a store channel. - - - The channel is a temporary thread channel under a news channel. - - - The channel is a temporary thread channel under a text channel. - - - The channel is a private temporary thread channel under a text channel. - - - The channel is a stage voice channel. - - - - Specifies the direction of where message(s) should be retrieved from. - - - This enum is used to specify the direction for retrieving messages. - - At the time of writing, is not yet implemented into - . - Attempting to use the method with will throw - a . - - - - - - The message(s) should be retrieved before a message. - - - - - The message(s) should be retrieved after a message. - - - - - The message(s) should be retrieved around a message. - - - - - Properties that are used to modify an with the specified changes. - - - - - - Gets or sets the channel to this name. - - - This property defines the new name for this channel. - - When modifying an , the must be alphanumeric with - dashes. It must match the RegEx [a-z0-9-_]{2,100}. - - - - - - Moves the channel to the following position. This property is zero-based. - - - - - Gets or sets the category ID for this channel. - - - Setting this value to a category's snowflake identifier will change or set this channel's parent to the - specified channel; setting this value to will detach this channel from its parent if one - is set. - - - - - Gets or sets the permission overwrites for this channel. - - - - - Represents a generic audio channel. - - - - - Connects to this audio channel. - - Determines whether the client should deaf itself upon connection. - Determines whether the client should mute itself upon connection. - Determines whether the audio client is an external one or not. - - A task representing the asynchronous connection operation. The task result contains the - responsible for the connection. - - - - - Disconnects from this audio channel. - - - A task representing the asynchronous operation for disconnecting from the audio channel. - - - - - Represents a generic category channel. - - - - - Represents a generic channel. - - - - - Gets the name of this channel. - - - A string containing the name of this channel. - - - - - Gets a collection of users that are able to view the channel or are currently in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - This method will attempt to fetch all users that is able to view this channel or is currently in this channel. - The library will attempt to split up the requests according to and . - In other words, if there are 3000 users, and the constant - is 1000, the request will be split into 3 individual requests; thus returning 53individual asynchronous - responses, hence the need of flattening. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - Paged collection of users. - - - - - Gets a user in this channel. - - The snowflake identifier of the user (e.g. 168693960628371456). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a user object that - represents the found user; null if none is found. - - - - - Represents a generic direct-message channel. - - - - - Gets the recipient of all messages in this channel. - - - A user object that represents the other user in this channel. - - - - - Closes this private channel, removing it from your channel list. - - The options to be used when sending the request. - - A task that represents the asynchronous close operation. - - - - - Represents a generic private group channel. - - - - - Leaves this group. - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Represents a generic guild channel. - - - - - - - - Gets the position of this channel. - - - An representing the position of this channel in the guild's channel list relative to - others of the same type. - - - - - Gets the guild associated with this channel. - - - A guild object that this channel belongs to. - - - - - Gets the guild ID associated with this channel. - - - An representing the guild snowflake identifier for the guild that this channel - belongs to. - - - - - Gets a collection of permission overwrites for this channel. - - - A collection of overwrites associated with this channel. - - - - - Modifies this guild channel. - - - This method modifies the current guild channel with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The delegate containing the properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Adds or updates the permission overwrite for the given role. - - - The following example fetches a role via and a channel via - . Next, it checks if an overwrite had already been set via - ; if not, it denies the role from sending any - messages to the channel. - - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the - channel. - - - - - Adds or updates the permission overwrite for the given user. - - - The following example fetches a user via and a channel via - . Next, it checks if an overwrite had already been set via - ; if not, it denies the user from sending any - messages to the channel. - - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Gets a collection of users that are able to view the channel or are currently in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - Paged collection of users. - - - - - Gets a user in this channel. - - The snowflake identifier of the user. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task representing the asynchronous get operation. The task result contains a guild user object that - represents the user; null if none is found. - - - - - Represents a generic channel that can send and receive messages. - - - - - Sends a message to this message channel. - - - The following example sends a message with the current system time in RFC 1123 format to the channel and - deletes itself after 5 seconds. - - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a local file called wumpus.txt along with the text - good discord boi to the channel. - - The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the - channel. - - - - This method sends a file as if you are uploading an attachment directly from your Discord client. - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a - rich embed to the channel. - - - - This method sends a file as if you are uploading an attachment directly from your Discord client. - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a message from this message channel. - - The snowflake identifier of the message. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under . The - library will attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example downloads 300 messages and gets messages that belong to the user - 53905483156684800. - - - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under around - the message depending on the . The library will - attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets 5 message prior to the message identifier 442012544660537354. - - The following example attempts to retrieve messageCount number of messages from the - beginning of the channel and prints them to the console. - - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the individual messages as a - collection. - - - Do not fetch too many messages at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of messages specified under around - the message depending on the . The library will - attempt to split up the requests according to your and - . In other words, should the user request 500 messages, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets 5 message prior to a specific message, oldMessage. - - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The that determines whether the object should be fetched from - cache. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of pinned messages in this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a collection of messages found in the pinned messages. - - - - - Deletes a message. - - The snowflake identifier of the message that would be removed. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - Deletes a message based on the provided message in this channel. - The message that would be removed. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Modifies a message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The snowflake identifier of the message that would be changed. - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. - - The options to be used when sending the request. - - A task that represents the asynchronous operation that triggers the broadcast. - - - - - Continuously broadcasts the "user is typing" message to all users in this channel until the returned - object is disposed. - - - The following example keeps the client in the typing state until LongRunningAsync has finished. - - - The options to be used when sending the request. - - A disposable object that, upon its disposal, will stop the client from broadcasting its typing state in - this channel. - - - - - Represents a type of guild channel that can be nested within a category. - - - - - Gets the parent (category) ID of this channel in the guild's channel list. - - - A representing the snowflake identifier of the parent of this channel; - null if none is set. - - - - - Gets the parent (category) channel of this channel. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - Syncs the permissions of this nested channel with its parent's. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for syncing channel permissions with its parent's. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The id of the embedded application to open for this invite. - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Creates a new invite to this channel. - - - The following example creates a new invite to this channel; the invite lasts for 12 hours and can only - be used 3 times throughout its lifespan. - - await guildChannel.CreateInviteAsync(maxAge: 43200, maxUses: 3); - - - The id of the user whose stream to display for this invite. - The time (in seconds) until the invite expires. Set to null to never expire. - The max amount of times this invite may be used. Set to null to have unlimited uses. - If true, the user accepting this invite will be kicked from the guild after closing their client. - If true, don't try to reuse a similar invite (useful for creating many unique one time use invites). - The options to be used when sending the request. - - A task that represents the asynchronous invite creation operation. The task result contains an invite - metadata object containing information for the created invite. - - - - - Gets a collection of all invites to this channel. - B - - The following example gets all of the invites that have been created in this channel and selects the - most used invite. - - var invites = await channel.GetInvitesAsync(); - if (invites.Count == 0) return; - var invite = invites.OrderByDescending(x => x.Uses).FirstOrDefault(); - - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of invite metadata that are created for this channel. - - - - - Represents a generic news channel in a guild that can send and receive messages. - - - - - Represents a generic channel that is private to select recipients. - - - - - Gets the users that can access this channel. - - - A read-only collection of users that can access this channel. - - - - - Represents a generic Stage Channel. - - - - - Gets the topic of the Stage instance. - - - If the stage isn't live then this property will be set to . - - - - - The of the current stage. - Gets the of the current stage. - - - If the stage isn't live then this property will be set to . - - - - - Gets whether or not stage discovery is disabled. - - - - - Gets whether or not the stage is live. - - - - - Starts the stage, creating a stage instance. - - The topic for the stage/ - The privacy level of the stage. - The options to be used when sending the request. - - A task that represents the asynchronous start operation. - - - - - Modifies the current stage instance. - - The properties to modify the stage instance with. - The options to be used when sending the request. - - A task that represents the asynchronous modify operation. - - - - - Stops the stage, deleting the stage instance. - - The options to be used when sending the request. - - A task that represents the asynchronous stop operation. - - - - - Indicates that the bot would like to speak within a stage channel. - - The options to be used when sending the request. - - A task that represents the asynchronous request to speak operation. - - - - - Makes the current user become a speaker within a stage. - - The options to be used when sending the request. - - A task that represents the asynchronous speaker modify operation. - - - - - Makes the current user a listener. - - The options to be used when sending the request. - - A task that represents the asynchronous stop operation. - - - - - Makes a user a speaker within a stage. - - The user to make the speaker. - The options to be used when sending the request. - - A task that represents the asynchronous move operation. - - - - - Removes a user from speaking. - - The user to remove from speaking. - The options to be used when sending the request. - - A task that represents the asynchronous remove operation. - - - - - Represents a generic channel in a guild that can send and receive messages. - - - - - Gets a value that indicates whether the channel is NSFW. - - - true if the channel has the NSFW flag enabled; otherwise false. - - - - - Gets the current topic for this text channel. - - - A string representing the topic set in the channel; null if none is set. - - - - - Gets the current slow-mode delay for this channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - - - - - Bulk-deletes multiple messages. - - - The following example gets 250 messages from the channel and deletes them. - - var messages = await textChannel.GetMessagesAsync(250).FlattenAsync(); - await textChannel.DeleteMessagesAsync(messages); - - - - This method attempts to remove the messages specified in bulk. - - Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! - - - The messages to be bulk-deleted. - The options to be used when sending the request. - - A task that represents the asynchronous bulk-removal operation. - - - - - Bulk-deletes multiple messages. - - - This method attempts to remove the messages specified in bulk. - - Due to the limitation set by Discord, this method can only remove messages that are posted within 14 days! - - - The snowflake identifier of the messages to be bulk-deleted. - The options to be used when sending the request. - - A task that represents the asynchronous bulk-removal operation. - - - - - Modifies this text channel. - - The delegate containing the properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - Represents a thread channel inside of a guild. - - - - - Gets the type of the current thread channel. - - - - - Gets whether or not the current user has joined this thread. - - - - - if the current thread is archived, otherwise . - - - - - Gets whether or not the current thread is archived. - - - - - Gets the timestamp when the thread's archive status was last changed, used for calculating recent activity. - - - - - Gets whether or not the current thread is locked. - - - - - Gets an approximate count of users in a thread, stops counting after 50. - - - - - Gets an approximate count of messages in a thread, stops counting after 50. - - - - - Joins the current thread. - - The options to be used when sending the request. - - A task that represents the asynchronous join operation. - - - - - Leaves the current thread. - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Adds a user to this thread. - - The to add. - The options to be used when sending the request. - - A task that represents the asynchronous operation of adding a member to a thread. - - - - - Removes a user from this thread. - - The to remove from this thread. - The options to be used when sending the request. - - A task that represents the asynchronous operation of removing a user from this thread. - - - - - Represents a generic voice channel in a guild. - - - - - Gets the bit-rate that the clients in this voice channel are requested to use. - - - An representing the bit-rate (bps) that this voice channel defines and requests the - client(s) to use. - - - - - Gets the max number of users allowed to be connected to this channel at once. - - - An representing the maximum number of users that are allowed to be connected to this - channel at once; null if a limit is not set. - - - - - Modifies this voice channel. - - The properties to modify the channel with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - - Provides properties that are used to reorder an . - - - - - Gets the ID of the channel to apply this position to. - - - A representing the snowflake identifier of this channel. - - - - - Gets the new zero-based position of this channel. - - - An representing the new position of this channel. - - - - Initializes a new instance of the class used to reorder a channel. - Sets the ID of the channel to apply this position to. - Sets the new zero-based position of this channel. - - - - Represents properties to use when modifying a stage instance. - - - - - Gets or sets the topic of the stage. - - - - - Gets or sets the privacy level of the stage. - - - - - Specifies the privacy levels of a Stage instance. - - - - - The Stage instance is visible publicly, such as on Stage Discovery. - - - - - The Stage instance is visible to only guild members. - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the topic of the channel. - - - Setting this value to any string other than null or will set the - channel topic or description to the desired value. - - - - - Gets or sets whether this channel should be flagged as NSFW. - - - Setting this value to true will mark the channel as NSFW (Not Safe For Work) and will prompt the - user about its possibly mature nature before they may view the channel; setting this value to false will - remove the NSFW indicator. - - - - - Gets or sets the slow-mode ratelimit in seconds for this channel. - - - Setting this value to anything above zero will require each user to wait X seconds before - sending another message; setting this value to 0 will disable slow-mode for this channel. - - Users with or - will be exempt from slow-mode. - - - Thrown if the value does not fall within [0, 21600]. - - - - Gets or sets whether or not the thread is archived. - - - - - Gets or sets whether or not the thread is locked. - - - - - Gets or sets the auto archive duration. - - - - - Represents the thread auto archive duration. - - - - - One hour (60 minutes). - - - - - One day (1440 minutes). - - - - - Three days (4320 minutes). - - This option is explicitly available to nitro users. - - - - - - One week (10080 minutes). - - This option is explicitly available to nitro users. - - - - - - Represents types of threads. - - - - - Represents a temporary sub-channel within a GUILD_NEWS channel. - - - - - Represents a temporary sub-channel within a GUILD_TEXT channel. - - - - - Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission - - - - - Provides properties that are used to modify an with the specified changes. - - - - - Gets or sets the bitrate of the voice connections in this channel. Must be greater than 8000. - - - - - Gets or sets the maximum number of users that can be present in a channel, or null if none. - - - - - A Unicode emoji. - - - - - - - - Gets the Unicode representation of this emoji. - - - A string that resolves to . - - - - - Initializes a new class with the provided Unicode. - - The pure UTF-8 encoding of an emoji. - - - - Determines whether the specified emoji is equal to the current one. - - The object to compare with the current object. - - - Tries to parse an from its raw format. - The raw encoding of an emoji. For example: :heart: or ❤ - An emoji. - - - Parse an from its raw format. - The raw encoding of an emoji. For example: :heart: or ❤ - String is not emoji or unicode! - - - - - - - A custom image-based emote. - - - - - - - - - - - Gets whether this emote is animated. - - - A boolean that determines whether or not this emote is an animated one. - - - - - - - - Gets the image URL of this emote. - - - A string that points to the URL of this emote. - - - - - Determines whether the specified emote is equal to the current emote. - - The object to compare with the current object. - - - - - - Parses an from its raw format. - The raw encoding of an emote (e.g. <:dab:277855270321782784>). - An emote. - Invalid emote format. - - - Tries to parse an from its raw format. - The raw encoding of an emote; for example, <:dab:277855270321782784>. - An emote. - - - - Returns the raw representation of the emote. - - - A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the name of the . - - - - - Gets or sets the roles that can access this . - - - - - An image-based emote that is attached to a guild. - - - - - Gets whether this emoji is managed by an integration. - - - A boolean that determines whether or not this emote is managed by a Twitch integration. - - - - - Gets whether this emoji must be wrapped in colons. - - - A boolean that determines whether or not this emote requires the use of colons in chat to be used. - - - - - Gets the roles that are allowed to use this emoji. - - - A read-only list containing snowflake identifiers for roles that are allowed to use this emoji. - - - - - Gets the user ID associated with the creation of this emoji. - - - An snowflake identifier representing the user who created this emoji; - null if unknown. - - - - - Gets the raw representation of the emote. - - - A string representing the raw presentation of the emote (e.g. <:thonkang:282745590985523200>). - - - - - Represents a general container for any type of emote in a message. - - - - - Gets the display name or Unicode representation of this emote. - - - A string representing the display name or the Unicode representation (e.g. 🤔) of this emote. - - - - - Stores the gateway information related to the current bot. - - - - - Gets the WSS URL that can be used for connecting to the gateway. - - - - - Gets the recommended number of shards to use when connecting. - - - - - Gets the that contains the information - about the current session start limit. - - - - - Stores the information related to the gateway identify request. - - - - - Gets the total number of session starts the current user is allowed. - - - The maximum amount of session starts the current user is allowed. - - - - - Gets the remaining number of session starts the current user is allowed. - - - The remaining amount of session starts the current user is allowed. - - - - - Gets the number of milliseconds after which the limit resets. - - - The milliseconds until the limit resets back to the . - - - - - Gets the maximum concurrent identify requests in a time window. - - - The maximum concurrent identify requests in a time window, - limited to the same rate limit key. - - - - - Specifies the default message notification behavior the guild uses. - - - - - By default, all messages will trigger notifications. - - - - - By default, only mentions will trigger notifications. - - - - No messages will be scanned. - - - Scans messages from all guild members that do not have a role. - Recommented option for servers that use roles for trusted membership. - - - Scan messages sent by all guild members. - - - - Provides properties used to modify an with the specified changes. - - - - - Gets or sets the behavior when an integration subscription lapses. - - - - - Gets or sets the period (in seconds) where the integration will ignore lapsed subscriptions. - - - - - Gets or sets whether emoticons should be synced for this integration. - - - - - Provides properties that are used to modify an with the specified changes. - - - - - - Gets or sets the name of the guild. Must be within 100 characters. - - - - - Gets or sets the region for the guild's voice connections. - - - - - Gets or sets the ID of the region for the guild's voice connections. - - - - - Gets or sets the verification level new users need to achieve before speaking. - - - - - Gets or sets the default message notification state for the guild. - - - - - Gets or sets how many seconds before a user is sent to AFK. This value MUST be one of: (60, 300, 900, - 1800, 3600). - - - - - Gets or sets the icon of the guild. - - - - - Gets or sets the banner of the guild. - - - - - Gets or sets the guild's splash image. - - - The guild must be partnered for this value to have any effect. - - - - - Gets or sets the where AFK users should be sent. - - - - - Gets or sets the ID of the where AFK users should be sent. - - - - - Gets or sets the where system messages should be sent. - - - - - Gets or sets the ID of the where system messages should be sent. - - - - - Gets or sets the owner of this guild. - - - - - Gets or sets the ID of the owner of this guild. - - - - - Gets or sets the explicit content filter level of this guild. - - - - - Gets or sets the flags that DISABLE types of system channel messages. - - - These flags are inverted. Setting a flag will disable that system channel message from being sent. - A value of will allow all system channel message types to be sent, - given that the has also been set. - A value of will deny guild boost messages from being sent, and allow all - other types of messages. - Refer to the extension methods and - to check if these system channel message types - are enabled, without the need to manipulate the logic of the flag. - - - - - Gets or sets the preferred locale of the guild in IETF BCP 47 language tag format. - - - This property takes precedence over . - When it is set, the value of - will not be used. - - - - - Gets or sets the preferred locale of the guild. - - - The property takes precedence - over this property. When is set, - the value of will be unused. - - - - - Provides properties that are used to modify the widget of an with the specified changes. - - - - - Sets whether the widget should be enabled. - - - - - Sets the channel that the invite should place its users in, if not . - - - - - Sets the channel that the invite should place its users in, if not . - - - - - Represents a generic ban object. - - - - - Gets the banned user. - - - A user that was banned. - - - - - Gets the reason why the user is banned if specified. - - - A string containing the reason behind the ban; null if none is specified. - - - - - Represents a generic guild/server. - - - - - Gets the name of this guild. - - - A string containing the name of this guild. - - - - - Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are - automatically moved to the AFK voice channel. - - - An representing the amount of time in seconds for a user to be marked as inactive - and moved into the AFK voice channel. - - - - - Gets a value that indicates whether this guild has the widget enabled. - - - if this guild has a widget enabled; otherwise . - - - - - Gets the default message notifications for users who haven't explicitly set their notification settings. - - - - - Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to - perform administrative actions in this guild. - - - The level of MFA requirement. - - - - - Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. - - - The level of requirements. - - - - - Gets the level of content filtering applied to user's content in a Guild. - - - The level of explicit content filtering. - - - - - Gets the ID of this guild's icon. - - - An identifier for the splash image; if none is set. - - - - - Gets the URL of this guild's icon. - - - A URL pointing to the guild's icon; if none is set. - - - - - Gets the ID of this guild's splash image. - - - An identifier for the splash image; if none is set. - - - - - Gets the URL of this guild's splash image. - - - A URL pointing to the guild's splash image; if none is set. - - - - - Gets the ID of this guild's discovery splash image. - - - An identifier for the discovery splash image; if none is set. - - - - - Gets the URL of this guild's discovery splash image. - - - A URL pointing to the guild's discovery splash image; if none is set. - - - - - Determines if this guild is currently connected and ready to be used. - - - - This property only applies to a WebSocket-based client. - - This boolean is used to determine if the guild is currently connected to the WebSocket and is ready to be used/accessed. - - - true if this guild is currently connected and ready to be used; otherwise . - - - - - Gets the ID of the AFK voice channel for this guild. - - - A representing the snowflake identifier of the AFK voice channel; if - none is set. - - - - - Gets the ID of the channel assigned to the widget of this guild. - - - A representing the snowflake identifier of the channel assigned to the widget found - within the widget settings of this guild; if none is set. - - - - - Gets the ID of the channel where randomized welcome messages are sent. - - - A representing the snowflake identifier of the system channel where randomized - welcome messages are sent; if none is set. - - - - - Gets the ID of the channel with the rules. - - - A representing the snowflake identifier of the channel that contains the rules; - if none is set. - - - - - Gets the ID of the channel where admins and moderators of Community guilds receive notices from Discord. - - - A representing the snowflake identifier of the channel where admins and moderators - of Community guilds receive notices from Discord; if none is set. - - - - - Gets the ID of the user that owns this guild. - - - A representing the snowflake identifier of the user that owns this guild. - - - - - Gets the application ID of the guild creator if it is bot-created. - - - A representing the snowflake identifier of the application ID that created this guild, or if it was not bot-created. - - - - - Gets the ID of the region hosting this guild's voice channels. - - - A string containing the identifier for the voice region that this guild uses (e.g. eu-central). - - - - - Gets the currently associated with this guild. - - - An currently associated with this guild. - - - - - Gets the built-in role containing all users in this guild. - - - A role object that represents an @everyone role in this guild. - - - - - Gets a collection of all custom emotes for this guild. - - - A read-only collection of all custom emotes for this guild. - - - - - Gets a collection of all custom stickers for this guild. - - - A read-only collection of all custom stickers for this guild. - - - - - Gets a collection of all extra features added to this guild. - - - A read-only collection of enabled features in this guild. - - - - - Gets a collection of all roles in this guild. - - - A read-only collection of roles found within this guild. - - - - - Gets the tier of guild boosting in this guild. - - - The tier of guild boosting in this guild. - - - - - Gets the identifier for this guilds banner image. - - - An identifier for the banner image; if none is set. - - - - - Gets the URL of this guild's banner image. - - - A URL pointing to the guild's banner image; if none is set. - - - - - Gets the code for this guild's vanity invite URL. - - - A string containing the vanity invite code for this guild; if none is set. - - - - - Gets the flags for the types of system channel messages that are disabled. - - - The flags for the types of system channel messages that are disabled. - - - - - Gets the description for the guild. - - - The description for the guild; if none is set. - - - - - Gets the number of premium subscribers of this guild. - - - This is the number of users who have boosted this guild. - - - The number of premium subscribers of this guild; if not available. - - - - - Gets the maximum number of presences for the guild. - - - The maximum number of presences for the guild. - - - - - Gets the maximum number of members for the guild. - - - The maximum number of members for the guild. - - - - - Gets the maximum amount of users in a video channel. - - - The maximum amount of users in a video channel. - - - - - Gets the approximate number of members in this guild. - - - Only available when getting a guild via REST when `with_counts` is true. - - - The approximate number of members in this guild. - - - - - Gets the approximate number of non-offline members in this guild. - - - Only available when getting a guild via REST when `with_counts` is true. - - - The approximate number of non-offline members in this guild. - - - - - Gets the preferred locale of this guild in IETF BCP 47 - language tag format. - - - The preferred locale of the guild in IETF BCP 47 - language tag format. - - - - - Gets the NSFW level of this guild. - - - The NSFW level of this guild. - - - - - Gets the preferred culture of this guild. - - - The preferred culture information of this guild. - - - - - Modifies this guild. - - The delegate containing the properties to modify the guild with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Modifies this guild's widget. - - The delegate containing the properties to modify the guild widget with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Bulk-modifies the order of channels in this guild. - - The properties used to modify the channel positions with. - The options to be used when sending the request. - - A task that represents the asynchronous reorder operation. - - - - - Bulk-modifies the order of roles in this guild. - - The properties used to modify the role positions with. - The options to be used when sending the request. - - A task that represents the asynchronous reorder operation. - - - - - Leaves this guild. - - - This method will make the currently logged-in user leave the guild. - - If the user is the owner of this guild, use instead. - - - The options to be used when sending the request. - - A task that represents the asynchronous leave operation. - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Bans the user from this guild and optionally prunes their recent messages. - - The user to ban. - The number of days to remove messages from this user for, and this number must be between [0, 7]. - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous add operation for the ban. - - - - - Bans the user from this guild and optionally prunes their recent messages. - - The snowflake ID of the user to ban. - The number of days to remove messages from this user for, and this number must be between [0, 7]. - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous add operation for the ban. - - - - - Unbans the user if they are currently banned. - - The user to be unbanned. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation for the ban. - - - - - Unbans the user if they are currently banned. - - The snowflake identifier of the user to be unbanned. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation for the ban. - - - - - Gets a collection of all channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - generic channels found within this guild. - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the generic channel - associated with the specified ; if none is found. - - - - - Gets a collection of all text channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - message channels found within this guild. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - associated with the specified ; if none is found. - - - - - Gets a collection of all voice channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - category channels found within this guild. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel associated - with the specified ; if none is found. - - - - - Gets a stage channel in this guild. - - The snowflake identifier for the stage channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the stage channel associated - with the specified ; if none is found. - - - - - Gets a collection of all stage channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - stage channels found within this guild. - - - - - Gets the AFK voice channel in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel that the - AFK users will be moved to after they have idled for too long; if none is set. - - - - - Gets the system channel where randomized welcome messages are sent in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel where - randomized welcome messages will be sent to; if none is set. - - - - - Gets the first viewable text channel in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the first viewable text - channel in this guild; if none is found. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the widget channel set - within the server's widget settings; if none is set. - - - - - Gets the text channel where Community guilds can display rules and/or guidelines. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where Community guilds can display rules and/or guidelines; if none is set. - - - - - Gets the text channel where admins and moderators of Community guilds receive notices from Discord. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel where - admins and moderators of Community guilds receive notices from Discord; if none is set. - - - - - Gets a thread channel within this guild. - - The id of the thread channel. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the thread channel. - - - - - Gets a collection of all thread channels in this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - thread channels found within this guild. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a new voice channel in this guild. - - The new name for the voice channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a new channel category in this guild. - - The new name for the category. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the partial metadata of - the vanity invite found within this guild; if none is found. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - Whether the role can be mentioned. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Adds a user to this guild. - - - This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. - - The snowflake identifier of the user. - The OAuth2 access token for the user, requested with the guilds.join scope. - The delegate containing the properties to be applied to the user upon being added to the guild. - The options to be used when sending the request. - A guild user associated with the specified ; if the user is already in the guild. - - - - Disconnects the user from its current voice channel. - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild. - - This may return an incomplete collection in the WebSocket implementation due to how Discord does not - send a complete user list for large guilds. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds. - - - The snowflake identifier of the user. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild user - associated with the specified ; if none is found. - - - - - Gets the current user for this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the currently logged-in - user within this guild. - - - - - Gets the owner of this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the owner of this guild. - - - - - Downloads all users for this guild if the current list is incomplete. - - - This method downloads all users found within this guild through the Gateway and caches them. - - - A task that represents the asynchronous download operation. - - - - - Prunes inactive users. - - - - This method removes all users that have not logged on in the provided number of . - - - If is true, this method will only return the number of users that - would be removed without kicking the users. - - - The number of days required for the users to be kicked. - Whether this prune action is a simulation. - The options to be used when sending the request. - An array of role IDs to be included in the prune of users who do not have any additional roles. - - A task that represents the asynchronous prune operation. The task result contains the number of users to - be or has been removed from this guild. - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - The audit log entry ID to get entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - Gets a collection of emotes from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of emotes found within the guild. - - - - - Gets a specific emote from this guild. - - The snowflake identifier for the guild emote. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the emote found with the - specified ; if none is found. - - - - - Creates a new in this guild. - - The name of the guild emote. - The image of the new emote. - The roles to limit the emote usage to. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created emote. - - - - - Modifies an existing in this guild. - - The emote to be modified. - The delegate containing the properties to modify the emote with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. The task result contains the modified - emote. - - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - Deletes an existing from this guild. - - The emote to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a collection of all stickers within this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets this guilds application commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of application commands found within the guild. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Holds information for a guild integration feature. - - - - - Gets the integration ID. - - - An representing the unique identifier value of this integration. - - - - - Gets the integration name. - - - A string containing the name of this integration. - - - - - Gets the integration type (Twitch, YouTube, etc). - - - A string containing the name of the type of integration. - - - - - Gets a value that indicates whether this integration is enabled or not. - - - true if this integration is enabled; otherwise false. - - - - - Gets a value that indicates whether this integration is syncing or not. - - - An integration with syncing enabled will update its "subscribers" on an interval, while one with syncing - disabled will not. A user must manually choose when sync the integration if syncing is disabled. - - - true if this integration is syncing; otherwise false. - - - - - Gets the ID that this integration uses for "subscribers". - - - - - Gets the grace period before expiring "subscribers". - - - - - Gets when this integration was last synced. - - - A containing a date and time of day when the integration was last synced. - - - - - Gets integration account information. - - - - Gets the ID of the account. - A unique identifier of this integration account. - - - Gets the name of the account. - A string containing the name of this integration account. - - - - Gets the name of this guild. - - - - - Gets the icon URL associated with this guild, or null if one is not set. - - - - - Returns true if the current user owns this guild. - - - - - Returns the current user's permissions for this guild. - - - - - Represents a region of which the user connects to when using voice. - - - - - Gets the unique identifier for this voice region. - - - A string that represents the identifier for this voice region (e.g. eu-central). - - - - - Gets the name of this voice region. - - - A string that represents the human-readable name of this voice region (e.g. Central Europe). - - - - - Gets a value that indicates whether or not this voice region is exclusive to partnered servers. - - - true if this voice region is exclusive to VIP accounts; otherwise false. - - - - - Gets a value that indicates whether this voice region is optimal for your client in terms of latency. - - - true if this voice region is the closest to your machine; otherwise false . - - - - - Gets a value that indicates whether this voice region is no longer being maintained. - - - true if this is a deprecated voice region; otherwise false. - - - - - Gets a value that indicates whether this voice region is custom-made for events. - - - true if this is a custom voice region (used for events/etc); otherwise false/ - - - - - Specifies the guild's Multi-Factor Authentication (MFA) level requirement. - - - - - Users have no additional MFA restriction on this guild. - - - - - Users must have MFA enabled on their account to perform administrative actions. - - - - - Default or unset. - - - - - Guild has extremely suggestive or mature content that would only be suitable for users 18 or over. - - - - - Guild has no content that could be deemed NSFW; in other words, SFW. - - - - - Guild has mildly NSFW content that may not be suitable for users under 18. - - - - - Specifies the target of the permission. - - - - - The target of the permission is a role. - - - - - The target of the permission is a user. - - - - - Used for guilds that have no guild boosts. - - - - - Used for guilds that have Tier 1 guild boosts. - - - - - Used for guilds that have Tier 2 guild boosts. - - - - - Used for guilds that have Tier 3 guild boosts. - - - - - Deny none of the system channel messages. - This will enable all of the system channel messages. - - - - - Deny the messages that are sent when a user joins the guild. - - - - - Deny the messages that are sent when a user boosts the guild. - - - - - Specifies the verification level the guild uses. - - - - - Users have no additional restrictions on sending messages to this guild. - - - - - Users must have a verified email on their account. - - - - - Users must fulfill the requirements of Low and be registered on Discord for at least 5 minutes. - - - - - Users must fulfill the requirements of Medium and be a member of this guild for at least 10 minutes. - - - - - Users must fulfill the requirements of High and must have a verified phone on their Discord account. - - - - - Represents a Discord application created via the developer portal. - - - - - Gets the name of the application. - - - - - Gets the description of the application. - - - - - Gets the RPC origins of the application. - - - - - Gets the icon URL of the application. - - - - - Gets if the bot is public. - - - - - Gets if the bot requires code grant. - - - - - Gets the team associated with this application if there is one. - - - - - Gets the partial user object containing info on the owner of the application. - - - - - Determines whether the object is deletable or not. - - - - - Deletes this object and all its children. - - The options to be used when sending the request. - - - - Gets the unique identifier for this object. - - - - - An image that will be uploaded to Discord. - - - - - Gets the stream to be uploaded to Discord. - - - - - Create the image with a . - - - The to create the image with. Note that this must be some type of stream - with the contents of a file in it. - - - - - Create the image from a file path. - - - This file path is NOT validated and is passed directly into a - . - - The path to the file. - - is a zero-length string, contains only white space, or contains one or more invalid - characters as defined by . - - is null. - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - is in an invalid format. - - The specified is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - The file specified in was not found. - - An I/O error occurred while opening the file. - - - - - - - Specifies the type of format the image should return in. - - - - - Use automatically detected format. - - - - - Use Google's WebP image format. - - - - - Use PNG. - - - - - Use JPEG. - - - - - Use GIF. - - - - - Determines whether the object is mentionable or not. - - - - - Returns a special string used to mention this object. - - - A string that is recognized by Discord as a mention (e.g. <@168693960628371456>). - - - - - Represents a for making slash commands. - - - - - Gets or sets the name of this option. - - - - - Gets or sets the description of this option. - - - - - Gets or sets the type of this option. - - - - - Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - - - - - Gets or sets if the option is required. - - - - - Gets or sets whether or not this option supports autocomplete. - - - - - Gets or sets the choices for string and int types for the user to pick from. - - - - - Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. - - - - - Gets or sets the allowed channel types for this option. - - - - - Represents a choice for a . This class is used when making new commands. - - - - - The name of this choice. - - - - - The value of this choice. - - Discord only accepts int and string as the input. - - - - - - The option type of the Slash command parameter, See the discord docs. - - - - - A sub command. - - - - - A group of sub commands. - - - - - A of text. - - - - - An . - - - - - A . - - - - - A . - - - - - A . - - - - - A . - - - - - A or . - - - - - A . - - - - - Represents the base class to create/modify application commands. - - - - - Gets or sets the name of this command. - - - - - Whether the command is enabled by default when the app is added to a guild. Default is - - - - - ApplicationCommandType is enum of current valid Application Command Types: Slash, User, Message - - - - - ApplicationCommandType.Slash is Slash command type - - - - - ApplicationCommandType.User is Context Menu User command type - - - - - ApplicationCommandType.Message is Context Menu Message command type - - - - - Represents an autocomplete option. - - - - - Gets the type of this option - - - - - Gets the name of the option. - - - - - Gets the value of the option. - - - - - Gets whether or not this option is focused by the executing user. - - - - - Represents a result to an autocomplete interaction. - - - - - Gets or sets the name of the result. - - - Name cannot be null and has to be between 1-100 characters in length. - - - - - - - Gets or sets the value of the result. - - - Only , , and are allowed for a value. - - - - - - - Creates a new . - - - - - Creates a new with the passed in and . - - - - - - - A class used to build Message commands. - - - - - Returns the maximum length a commands name allowed by Discord - - - - - Gets or sets the name of this Message command. - - - - - Gets or sets whether the command is enabled by default when the app is added to a guild - - - - - Build the current builder into a class. - - - A that can be used to create message commands. - - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - A class used to create message commands. - - - - - A class used to build user commands. - - - - - Returns the maximum length a commands name allowed by Discord. - - - - - Gets or sets the name of this User command. - - - - - Gets or sets whether the command is enabled by default when the app is added to a guild. - - - - - Build the current builder into a class. - - A that can be used to create user commands. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - A class used to create User commands. - - - - - The base command model that belongs to an application. - - - - - Gets the unique id of the parent application. - - - - - The type of the command. - - - - - The name of the command. - - - - - The description of the command. - - - - - Whether the command is enabled by default when the app is added to a guild. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - Modifies the current application command. - - The new properties to use when modifying the command. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Modifies the current application command. - - The new properties to use when modifying the command. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - Thrown when you pass in an invalid type. - - - - Represents data of an Interaction Command, see . - - - - - The snowflake id of this command. - - - - - The name of this command. - - - - - The params + values from the user. - - - - - Represents a option group for a command, see . - - - - - The name of the parameter. - - - - - The value of the pair. - - This objects type can be any one of the option types in - - - - - - The type of this data's option. - - - - - Present if this option is a group or subcommand. - - - - - Options for the , see The docs. - - - - - The type of this . - - - - - The name of this command option, 1-32 character name. - - - - - The description of this command option, 1-100 character description. - - - - - The first required option for the user to complete--only one option can be default. - - - - - If the parameter is required or optional, default is . - - - - - Choices for string and int types for the user to pick from. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - The allowed channel types for this option. - - - - - Specifies choices for command group. - - - - - 1-100 character choice name. - - - - - value of the choice. - - - - - Represents a discord interaction - - An interaction is the base "thing" that is sent when a user invokes a command, and is the same for Slash Commands - and other future interaction types. see . - - - - - - The id of the interaction. - - - - - The type of this . - - - - - Represents the data sent within this interaction. - - - - - A continuation token for responding to the interaction. - - - - - read-only property, always 1. - - - - - Responds to an Interaction with type . - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Gets the original response for this interaction. - - The request options for this request. - A that represents the initial response. - - - - Edits original response for this interaction. - - A delegate containing the properties to modify the message with. - The request options for this request. - A that represents the initial response. - - - - Acknowledges this interaction. - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - Represents an interface used to specify classes that they are a valid data type of a class. - - - - - The response type for an . - - - After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using - or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, - and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. - You can read more about Response types Here. - - - - - ACK a Ping. - - - - - ACK a command without sending a message, eating the user's input. - - - - - Respond with a message, showing the user's input. - - - - - Respond to an interaction with a message. - - - - - ACK an interaction and edit a response later, the user sees a loading state. - - - - - For components: ACK an interaction and edit the original message later; the user does not see a loading state. - - - - - For components: edit the message the component was attached to. - - - - - Respond with a set of choices to a autocomplete interaction. - - - - - Represents a type of Interaction from discord. - - - - - A ping from discord. - - - - - A sent from discord. - - - - - A sent from discord. - - - - - An autocomplete request sent from discord. - - - - - Represents a Row for child components to live in. - - - - - - - - Gets the child components in this row. - - - - - Represents a Button. - - - - - - - - Gets the of this button, example buttons with each style can be found Here. - - - - - Gets the label of the button, this is the text that is shown. - - - - - Gets the displayed with this button. - - - - - - - - Gets the URL for a button. - - - You cannot have a button with a URL and a CustomId. - - - - - Gets whether this button is disabled or not. - - - - - Turns this button into a button builder. - - - A newly created button builder with the same properties as this button. - - - - - Represents different styles to use with buttons. You can see an example of the different styles at - - - - - A Blurple button - - - - - A Grey (or gray) button - - - - - A Green button - - - - - A Red button - - - - - A button with a little popup box indicating that this button is a link. - - - - - Represents a builder for creating a . - - - - - The max length of a . - - - - - The max amount of rows a message can have. - - - - - Gets or sets the Action Rows for this Component Builder. - - cannot be null. - count exceeds . - - - - Creates a new builder from a message. - - The message to create the builder from. - The newly created builder. - - - - Creates a new builder from the provided list of components. - - The components to create the builder from. - The newly created builder. - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The custom id of the menu. - The options of the menu. - The placeholder of the menu. - The min values of the placeholder. - The max values of the placeholder. - Whether or not the menu is disabled. - The row to add the menu to. - - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The menu to add. - The row to attempt to add this component on. - There is no more row to add a menu. - must be less than . - The current builder. - - - - Adds a with specified parameters to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The label text for the newly added button. - The style of this newly added button. - A to be used with this button. - The custom id of the newly added button. - A URL to be used only if the is a Link. - Whether or not the newly created button is disabled. - The row the button should be placed on. - The current builder. - - - - Adds a to the at the specific row. - If the row cannot accept the component then it will add it to a row that can. - - The button to add. - The row to add the button. - There is no more row to add a menu. - must be less than . - The current builder. - - - - Builds this builder into a used to send your components. - - A that can be sent with . - - - - Represents a class used to build Action rows. - - - - - The max amount of child components this row can hold. - - - - - Gets or sets the components inside this row. - - cannot be null. - count exceeds . - - - - Adds a list of components to the current row. - - The list of components to add. - - The current builder. - - - - Adds a component at the end of the current row. - - The component to add. - Components count reached - The current builder. - - - - Builds the current builder to a that can be used within a - - A that can be used within a - - - - Represents a class used to build 's. - - - - - The max length of a . - - - - - Gets or sets the label of the current button. - - length exceeds . - length exceeds . - - - - Gets or sets the custom id of the current button. - - length exceeds - length subceeds 1. - - - - Gets or sets the of the current button. - - - - - Gets or sets the of the current button. - - - - - Gets or sets the url of the current button. - - - - - Gets or sets whether the current button is disabled. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a . - - The label to use on the newly created link button. - The url of this button. - The custom ID of this button. - The custom ID of this button. - The emote of this button. - Disabled this button or not. - - - - Creates a new instance of a from instance of a . - - - - - Creates a button with the style. - - The label for this link button. - The url for this link button to go to. - The emote for this link button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this danger button. - The custom id for this danger button. - The emote for this danger button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this primary button. - The custom id for this primary button. - The emote for this primary button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this secondary button. - The custom id for this secondary button. - The emote for this secondary button. - A builder with the newly created button. - - - - Creates a button with the style. - - The label for this success button. - The custom id for this success button. - The emote for this success button. - A builder with the newly created button. - - - - Sets the current buttons label to the specified text. - - The text for the label. - - The current builder. - - - - Sets the current buttons style. - - The style for this builders button. - The current builder. - - - - Sets the current buttons emote. - - The emote to use for the current button. - The current builder. - - - - Sets the current buttons url. - - The url to use for the current button. - The current builder. - - - - Sets the custom id of the current button. - - The id to use for the current button. - - The current builder. - - - - Sets whether the current button is disabled. - - Whether the current button is disabled or not. - The current builder. - - - - Builds this builder into a to be used in a . - - A to be used in a . - A button must contain either a or a , but not both. - A button must have an or a . - A link button must contain a URL. - A URL must include a protocol (http or https). - A non-link button must contain a custom id - - - - Represents a class used to build 's. - - - - - The max length of a . - - - - - The maximum number of values for the and properties. - - - - - The maximum number of options a can have. - - - - - Gets or sets the custom id of the current select menu. - - length exceeds - length subceeds 1. - - - - Gets or sets the placeholder text of the current select menu. - - length exceeds . - length subceeds 1. - - - - Gets or sets the minimum values of the current select menu. - - exceeds . - - - - Gets or sets the maximum values of the current select menu. - - exceeds . - - - - Gets or sets a collection of for this current select menu. - - count exceeds . - is null. - - - - Gets or sets whether the current menu is disabled. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a from instance of . - - - - - Creates a new instance of a . - - The custom id of this select menu. - The options for this select menu. - The placeholder of this select menu. - The max values of this select menu. - The min values of this select menu. - Disabled this select menu or not. - - - - Sets the field CustomId. - - The value to set the field CustomId to. - - - The current builder. - - - - - Sets the field placeholder. - - The value to set the field placeholder to. - - - The current builder. - - - - - Sets the field minValues. - - The value to set the field minValues to. - - - The current builder. - - - - - Sets the field maxValues. - - The value to set the field maxValues to. - - - The current builder. - - - - - Sets the field options. - - The value to set the field options to. - - - The current builder. - - - - - Add one option to menu options. - - The option builder class containing the option properties. - Options count reached . - - The current builder. - - - - - Add one option to menu options. - - The label for this option. - The value of this option. - The description of this option. - The emote of this option. - Render this option as selected by default or not. - Options count reached . - - The current builder. - - - - - Sets whether the current menu is disabled. - - Whether the current menu is disabled or not. - - The current builder. - - - - - Builds a - - The newly built - - - - Represents a class used to build 's. - - - - - The maximum length of a . - - - - - The maximum length of a . - - - - - The maximum length of a . - - - - - Gets or sets the label of the current select menu. - - length exceeds - length subceeds 1. - - - - Gets or sets the value of the current select menu. - - length exceeds . - length subceeds 1. - - - - Gets or sets this menu options description. - - length exceeds . - length subceeds 1. - - - - Gets or sets the emote of this option. - - - - - Gets or sets the whether or not this option will render selected by default. - - - - - Creates a new instance of a . - - - - - Creates a new instance of a . - - The label for this option. - The value of this option. - The description of this option. - The emote of this option. - Render this option as selected by default or not. - - - - Creates a new instance of a from instance of a . - - - - - Sets the field label. - - The value to set the field label to. - - - The current builder. - - - - - Sets the field value. - - The value to set the field value to. - - - The current builder. - - - - - Sets the field description. - - The value to set the field description to. - - - The current builder. - - - - - Sets the field emote. - - The value to set the field emote to. - - The current builder. - - - - - Sets the field default. - - The value to set the field default to. - - The current builder. - - - - - Builds a . - - The newly built . - - - - Represents a type of a component. - - - - - A container for other components. - - - - - A clickable button. - - - - - A select menu for picking from choices. - - - - - Represents a message component on a message. - - - - - Gets the of this Message Component. - - - - - Gets the custom id of the component if possible; otherwise . - - - - - Represents a component object used to send components with messages. - - - - - Gets the components to be used in a message. - - - - - Returns a empty . - - - - - Represents a select menu component defined at - - - - - - - - - - - Gets the menus options to select from. - - - - - Gets the custom placeholder text if nothing is selected. - - - - - Gets the minimum number of items that must be chosen. - - - - - Gets the maximum number of items that can be chosen. - - - - - Gets whether this menu is disabled or not. - - - - - Turns this select menu into a builder. - - - A newly create builder with the same properties as this select menu. - - - - - Represents a choice for a . - - - - - The user-facing name of the option, max 25 characters. - - - - - The dev-define value of the option, max 100 characters. - - - - - An additional description of the option, max 50 characters. - - - - - A that will be displayed with this menu option. - - - - - Will render this option as selected by default. - - - - - A class used to build slash commands. - - - - - Returns the maximum length a commands name allowed by Discord - - - - - Returns the maximum length of a commands description allowed by Discord. - - - - - Returns the maximum count of command options allowed by Discord - - - - - The name of this slash command. - - - - - A 1-100 length description of this slash command. - The description is not allowed to be null. - - - - - Gets or sets the options for this command. - - - - - Whether the command is enabled by default when the app is added to a guild - - - - - Build the current builder into a class. - - A that can be used to create slash commands over rest. - - - - Sets the field name. - - The value to set the field name to. - - The current builder. - - - - - Sets the description of the current command. - - The description of this command. - The current builder. - - - - Sets the default permission of the current command. - - The default permission value to set. - The current builder. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - If this option is set to autocomplete. - The options of the option to add. - The allowed channel types for this option. - The choices of this option. - The current builder. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - The current builder. - - - - Adds an option to this slash command. - - The option to add. - The current builder. - - - - Adds a collection of options to the current slash command. - - The collection of options to add. - The current builder. - - - - Represents a class used to build options for the . - - - - - The max length of a choice's name allowed by Discord. - - - - - The maximum number of choices allowed by Discord. - - - - - Gets or sets the name of this option. - - - - - Gets or sets the description of this option. - - - - - Gets or sets the type of this option. - - - - - Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. - - - - - Gets or sets if the option is required. - - - - - Gets or sets whether or not this option supports autocomplete. - - - - - Gets or sets the choices for string and int types for the user to pick from. - - - - - Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. - - - - - Gets or sets the allowed channel types for this option. - - - - - Builds the current option. - - The built version of this option. - - - - Adds an option to the current slash command. - - The name of the option to add. - The type of this option. - The description of this option. - If this option is required for this command. - If this option is the default option. - If this option supports autocomplete. - The options of the option to add. - The allowed channel types for this option. - The choices of this option. - The current builder. - - - - Adds a sub option to the current option. - - The sub option to add. - The current builder. - - - - Adds a choice to the current option. - - The name of the choice. - The value of the choice. - The current builder. - - - - Adds a choice to the current option. - - The name of the choice. - The value of the choice. - The current builder. - - - - Adds a channel type to the current option. - - The to add. - The current builder. - - - - Sets the current builders name. - - The name to set the current option builder. - The current builder. - - - - Sets the current builders description. - - The description to set. - The current builder. - - - - Sets the current builders required field. - - The value to set. - The current builder. - - - - Sets the current builders default field. - - The value to set. - The current builder. - - - - Sets the current builders autocomplete field. - - The value to set. - The current builder. - - - - Sets the current type of this builder. - - The type to set. - The current builder. - - - - A class used to create slash commands. - - - - - The description of this command. - - - - - Gets or sets the options for this command. - - - - - Represents a generic invite object. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets the URL used to accept this invite using . - - - A string containing the full invite URL (e.g. https://discord.gg/FTqNnyS). - - - - - Gets the user that created this invite. - - - A user that created this invite. - - - - - Gets the channel this invite is linked to. - - - A generic channel that the invite points to. - - - - - Gets the type of the channel this invite is linked to. - - - - - Gets the ID of the channel this invite is linked to. - - - An representing the channel snowflake identifier that the invite points to. - - - - - Gets the name of the channel this invite is linked to. - - - A string containing the name of the channel that the invite points to. - - - - - Gets the guild this invite is linked to. - - - A guild object representing the guild that the invite points to. - - - - - Gets the ID of the guild this invite is linked to. - - - An representing the guild snowflake identifier that the invite points to. - - - - - Gets the name of the guild this invite is linked to. - - - A string containing the name of the guild that the invite points to. - - - - - Gets the approximated count of online members in the guild. - - - An representing the approximated online member count of the guild that the - invite points to; null if one cannot be obtained. - - - - - Gets the approximated count of total members in the guild. - - - An representing the approximated total member count of the guild that the - invite points to; null if one cannot be obtained. - - - - - Gets the user this invite is linked to via . - - - A user that is linked to this invite. - - - - - Gets the type of the linked for this invite. - - - The type of the linked user that is linked to this invite. - - - - - Represents additional information regarding the generic invite object. - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires; null if this - invite never expires. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite has been used. - - - - - Gets when this invite was created. - - - A representing the time of which the invite was first created. - - - - - The invite whose target user type is not defined. - - - - - The invite is for a Go Live stream. - - - - - The invite is for embedded application. - - - - Represents a Discord snowflake entity. - - - - Gets when the snowflake was created. - - - A representing when the entity was first created. - - - - - Defines whether the object is updateable or not. - - - - - Updates this object's properties with its current state. - - The options to be used when sending the request. - - - - Defines which mentions and types of mentions that will notify users from the message content. - - - - - Gets a value which indicates that no mentions in the message content should notify users. - - - - - Gets a value which indicates that all mentions in the message content should notify users. - - - - - Gets or sets the type of mentions that will be parsed from the message content. - - - The flag is mutually exclusive with the - property, and the flag is mutually exclusive with the - property. - If null, only the ids specified in and will be mentioned. - - - - - Gets or sets the list of all role ids that will be mentioned. - This property is mutually exclusive with the - flag of the property. If the flag is set, the value of this property - must be null or empty. - - - - - Gets or sets the list of all user ids that will be mentioned. - This property is mutually exclusive with the - flag of the property. If the flag is set, the value of this property - must be null or empty. - - - - - Gets or sets whether to mention the author of the message you are replying to or not. - - - Specifically for inline replies. - - - - - Initializes a new instance of the class. - - - The types of mentions to parse from the message content. - If null, only the ids specified in and will be mentioned. - - - - - Specifies the type of mentions that will be notified from the message content. - - - - - No flag is set. - - - This flag is not used to control mentions. - - It will always be present and does not mean mentions will not be allowed. - - - - - - Controls role mentions. - - - - - Controls user mentions. - - - - - Controls @everyone and @here mentions. - - - - - Represents an embed object seen in an . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the total length of all embed properties. - - - - - Gets the title of the embed. - - - - - A author field of an . - - - - - Gets the name of the author field. - - - - - Gets the URL of the author field. - - - - - Gets the icon URL of the author field. - - - - - Gets the proxified icon URL of the author field. - - - - - Gets the name of the author field. - - - - - - - - Represents a builder class for creating a . - - - - - Returns the maximum number of fields allowed by Discord. - - - - - Returns the maximum length of title allowed by Discord. - - - - - Returns the maximum length of description allowed by Discord. - - - - - Returns the maximum length of total characters allowed by Discord. - - - - Initializes a new class. - - - Gets or sets the title of an . - Title length exceeds . - - The title of the embed. - - - Gets or sets the description of an . - Description length exceeds . - The description of the embed. - - - Gets or sets the URL of an . - Url is not a well-formed . - The URL of the embed. - - - Gets or sets the thumbnail URL of an . - Url is not a well-formed . - The thumbnail URL of the embed. - - - Gets or sets the image URL of an . - Url is not a well-formed . - The image URL of the embed. - - - Gets or sets the list of of an . - An embed builder's fields collection is set to - null. - Fields count exceeds . - - The list of existing . - - - - Gets or sets the timestamp of an . - - - The timestamp of the embed, or null if none is set. - - - - - Gets or sets the sidebar color of an . - - - The color of the embed, or null if none is set. - - - - - Gets or sets the of an . - - - The author field builder of the embed, or null if none is set. - - - - - Gets or sets the of an . - - - The footer field builder of the embed, or null if none is set. - - - - - Gets the total length of all embed properties. - - - The combined length of , , , - , , and . - - - - - Sets the title of an . - - The title to be set. - - The current builder. - - - - - Sets the description of an . - - The description to be set. - - The current builder. - - - - - Sets the URL of an . - - The URL to be set. - - The current builder. - - - - - Sets the thumbnail URL of an . - - The thumbnail URL to be set. - - The current builder. - - - - - Sets the image URL of an . - - The image URL to be set. - - The current builder. - - - - - Sets the timestamp of an to the current time. - - - The current builder. - - - - - Sets the timestamp of an . - - The timestamp to be set. - - The current builder. - - - - - Sets the sidebar color of an . - - The color to be set. - - The current builder. - - - - - Sets the of an . - - The author builder class containing the author field properties. - - The current builder. - - - - - Sets the author field of an with the provided properties. - - The delegate containing the author field properties. - - The current builder. - - - - - Sets the author field of an with the provided name, icon URL, and URL. - - The title of the author field. - The icon URL of the author field. - The URL of the author field. - - The current builder. - - - - - Sets the of an . - - The footer builder class containing the footer field properties. - - The current builder. - - - - - Sets the footer field of an with the provided properties. - - The delegate containing the footer field properties. - - The current builder. - - - - - Sets the footer field of an with the provided name, icon URL. - - The title of the footer field. - The icon URL of the footer field. - - The current builder. - - - - - Adds an field with the provided name and value. - - The title of the field. - The value of the field. - Indicates whether the field is in-line or not. - - The current builder. - - - - - Adds a field with the provided to an - . - - The field builder class containing the field properties. - Field count exceeds . - - The current builder. - - - - - Adds an field with the provided properties. - - The delegate containing the field properties. - - The current builder. - - - - - Builds the into a Rich Embed ready to be sent. - - - The built embed object. - - Total embed length exceeds . - Any Url must include its protocols (i.e http:// or https://). - - - - Represents a builder class for an embed field. - - - - - Gets the maximum field length for name allowed by Discord. - - - - - Gets the maximum field length for value allowed by Discord. - - - - - Gets or sets the field name. - - - Field name is null, empty or entirely whitespace. - - or - - Field name length exceeds . - - - The name of the field. - - - - - Gets or sets the field value. - - - Field value is null, empty or entirely whitespace. - - or - - Field value length exceeds . - - - The value of the field. - - - - - Gets or sets a value that indicates whether the field should be in-line with each other. - - - - - Sets the field name. - - The name to set the field name to. - - The current builder. - - - - - Sets the field value. - - The value to set the field value to. - - The current builder. - - - - - Determines whether the field should be in-line with each other. - - - The current builder. - - - - - Builds the field builder into a class. - - - The current builder. - - - or is null, empty or entirely whitespace. - - or - - or exceeds the maximum length allowed by Discord. - - - - - Represents a builder class for a author field. - - - - - Gets the maximum author name length allowed by Discord. - - - - - Gets or sets the author name. - - - Author name length is longer than . - - - The author name. - - - - - Gets or sets the URL of the author field. - - Url is not a well-formed . - - The URL of the author field. - - - - - Gets or sets the icon URL of the author field. - - Url is not a well-formed . - - The icon URL of the author field. - - - - - Sets the name of the author field. - - The name of the author field. - - The current builder. - - - - - Sets the URL of the author field. - - The URL of the author field. - - The current builder. - - - - - Sets the icon URL of the author field. - - The icon URL of the author field. - - The current builder. - - - - - Builds the author field to be used. - - - Author name length is longer than . - - or - - is not a well-formed . - - or - - is not a well-formed . - - - The built author field. - - - - - Represents a builder class for an embed footer. - - - - - Gets the maximum footer length allowed by Discord. - - - - - Gets or sets the footer text. - - - Author name length is longer than . - - - The footer text. - - - - - Gets or sets the icon URL of the footer field. - - Url is not a well-formed . - - The icon URL of the footer field. - - - - - Sets the name of the footer field. - - The text of the footer field. - - The current builder. - - - - - Sets the icon URL of the footer field. - - The icon URL of the footer field. - - The current builder. - - - - - Builds the footer field to be used. - - - - length is longer than . - - or - - is not a well-formed . - - - A built footer field. - - - - - A field for an . - - - - - Gets the name of the field. - - - - - Gets the value of the field. - - - - - Gets a value that indicates whether the field should be in-line with each other. - - - - - Gets the name of the field. - - - A string that resolves to . - - - - A footer field for an . - - - - Gets the text of the footer field. - - - A string containing the text of the footer field. - - - - - Gets the URL of the footer icon. - - - A string containing the URL of the footer icon. - - - - - Gets the proxied URL of the footer icon link. - - - A string containing the proxied URL of the footer icon. - - - - - Gets the text of the footer field. - - - A string that resolves to . - - - - An image for an . - - - - Gets the URL of the image. - - - A string containing the URL of the image. - - - - - Gets a proxied URL of this image. - - - A string containing the proxied URL of this image. - - - - - Gets the height of this image. - - - A representing the height of this image if it can be retrieved; otherwise - null. - - - - - Gets the width of this image. - - - A representing the width of this image if it can be retrieved; otherwise - null. - - - - - Gets the URL of the thumbnail. - - - A string that resolves to . - - - - A provider field for an . - - - - Gets the name of the provider. - - - A string representing the name of the provider. - - - - - Gets the URL of the provider. - - - A string representing the link to the provider. - - - - - Gets the name of the provider. - - - A string that resolves to . - - - - A thumbnail featured in an . - - - - Gets the URL of the thumbnail. - - - A string containing the URL of the thumbnail. - - - - - Gets a proxied URL of this thumbnail. - - - A string containing the proxied URL of this thumbnail. - - - - - Gets the height of this thumbnail. - - - A representing the height of this thumbnail if it can be retrieved; otherwise - null. - - - - - Gets the width of this thumbnail. - - - A representing the width of this thumbnail if it can be retrieved; otherwise - null. - - - - - Gets the URL of the thumbnail. - - - A string that resolves to . - - - - - Specifies the type of embed. - - - - - An unknown embed type. - - - - - A rich embed type. - - - - - A link embed type. - - - - - A video embed type. - - - - - An image embed type. - - - - - A GIFV embed type. - - - - - An article embed type. - - - - - A tweet embed type. - - - - - A HTML embed type. - - - - - A video featured in an . - - - - - Gets the URL of the video. - - - A string containing the URL of the image. - - - - - Gets the height of the video. - - - A representing the height of this video if it can be retrieved; otherwise - null. - - - - - Gets the weight of the video. - - - A representing the width of this video if it can be retrieved; otherwise - null. - - - - - Gets the URL of the video. - - - A string that resolves to . - - - - - Represents a message attachment found in a . - - - - - Gets the ID of this attachment. - - - A snowflake ID associated with this attachment. - - - - - Gets the filename of this attachment. - - - A string containing the full filename of this attachment (e.g. textFile.txt). - - - - - Gets the URL of this attachment. - - - A string containing the URL of this attachment. - - - - - Gets a proxied URL of this attachment. - - - A string containing the proxied URL of this attachment. - - - - - Gets the file size of this attachment. - - - The size of this attachment in bytes. - - - - - Gets the height of this attachment. - - - The height of this attachment if it is a picture; otherwise null. - - - - - Gets the width of this attachment. - - - The width of this attachment if it is a picture; otherwise null. - - - - - Gets whether or not this attachment is ephemeral. - - - if the attachment is ephemeral; otherwise . - - - - - Represents a Discord embed object. - - - - - Gets the title URL of this embed. - - - A string containing the URL set in a title of the embed. - - - - - Gets the title of this embed. - - - The title of the embed. - - - - - Gets the description of this embed. - - - The description field of the embed. - - - - - Gets the type of this embed. - - - The type of the embed. - - - - - Gets the timestamp of this embed. - - - A based on the timestamp present at the bottom left of the embed, or - null if none is set. - - - - - Gets the color of this embed. - - - The color of the embed present on the side of the embed, or null if none is set. - - - - - Gets the image of this embed. - - - The image of the embed, or null if none is set. - - - - - Gets the video of this embed. - - - The video of the embed, or null if none is set. - - - - - Gets the author field of this embed. - - - The author field of the embed, or null if none is set. - - - - - Gets the footer field of this embed. - - - The author field of the embed, or null if none is set. - - - - - Gets the provider of this embed. - - - The source of the embed, or null if none is set. - - - - - Gets the thumbnail featured in this embed. - - - The thumbnail featured in the embed, or null if none is set. - - - - - Gets the fields of the embed. - - - An array of the fields of the embed. - - - - - Represents a message object. - - - - - Gets the type of this message. - - - - - Gets the source type of this message. - - - - - Gets the value that indicates whether this message was meant to be read-aloud by Discord. - - - true if this message was sent as a text-to-speech message; otherwise false. - - - - - Gets the value that indicates whether this message is pinned. - - - true if this message was added to its channel's pinned messages; otherwise false. - - - - - Gets the value that indicates whether or not this message's embeds are suppressed. - - - true if the embeds in this message have been suppressed (made invisible); otherwise false. - - - - - Gets the value that indicates whether this message mentioned everyone. - - - true if this message mentioned everyone; otherwise false. - - - - - Gets the content for this message. - - - A string that contains the body of the message; note that this field may be empty if there is an embed. - - - - - Gets the clean content for this message. - - - A string that contains the body of the message stripped of mentions, markdown, emojis and pings; note that this field may be empty if there is an embed. - - - - - Gets the time this message was sent. - - - Time of when the message was sent. - - - - - Gets the time of this message's last edit. - - - Time of when the message was last edited; null if the message is never edited. - - - - - Gets the source channel of the message. - - - - - Gets the author of this message. - - - - - Gets all attachments included in this message. - - - This property gets a read-only collection of attachments associated with this message. Depending on the - user's end-client, a sent message may contain one or more attachments. For example, mobile users may - attach more than one file in their message, while the desktop client only allows for one. - - - A read-only collection of attachments. - - - - - Gets all embeds included in this message. - - - This property gets a read-only collection of embeds associated with this message. Depending on the - message, a sent message may contain one or more embeds. This is usually true when multiple link previews - are generated; however, only one can be featured. - - - A read-only collection of embed objects. - - - - - Gets all tags included in this message's content. - - - - - Gets the IDs of channels mentioned in this message. - - - A read-only collection of channel IDs. - - - - - Gets the IDs of roles mentioned in this message. - - - A read-only collection of role IDs. - - - - - Gets the IDs of users mentioned in this message. - - - A read-only collection of user IDs. - - - - - Gets the activity associated with a message. - - - Sent with Rich Presence-related chat embeds. This often refers to activity that requires end-user's - interaction, such as a Spotify Invite activity. - - - A message's activity, if any is associated. - - - - - Gets the application associated with a message. - - - Sent with Rich-Presence-related chat embeds. - - - A message's application, if any is associated. - - - - - Gets the reference to the original message if it is a crosspost, channel follow add, pin, or reply message. - - - Sent with cross-posted messages, meaning they were published from news channels - and received by subscriber channels, channel follow adds, pins, and message replies. - - - A message's reference, if any is associated. - - - - - Gets all reactions included in this message. - - - - - The 's attached to this message - - - - - Gets all stickers items included in this message. - - - A read-only collection of sticker item objects. - - - - - Gets the flags related to this message. - - - This value is determined by bitwise OR-ing values together. - - - A message's flags, if any is associated. - - - - - Gets the interaction this message is a response to. - - - A if the message is a response to an interaction; otherwise . - - - - - Adds a reaction to this message. - - - The following example adds the reaction, 💕, to the message. - - await msg.AddReactionAsync(new Emoji("\U0001f495")); - - - The emoji used to react to this message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for adding a reaction to this message. - - - - - - Removes a reaction from message. - - - The following example removes the reaction, 💕, added by the message author from the message. - - await msg.RemoveReactionAsync(new Emoji("\U0001f495"), msg.Author); - - - The emoji used to react to this message. - The user that added the emoji. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - Removes a reaction from message. - - - The following example removes the reaction, 💕, added by the user with ID 84291986575613952 from the message. - - await msg.RemoveReactionAsync(new Emoji("\U0001f495"), 84291986575613952); - - - The emoji used to react to this message. - The ID of the user that added the emoji. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - Removes all reactions from this message. - - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Removes all reactions with a specific emoji from this message. - - The emoji used to react to this message. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets all users that reacted to a message with a given emote. - - - - The returned collection is an asynchronous enumerable object; one must call - to access the users as a - collection. - - - Do not fetch too many users at once! This may cause unwanted preemptive rate limit or even actual - rate limit, causing your bot to freeze! - - This method will attempt to fetch the number of reactions specified under . - The library will attempt to split up the requests according to your and - . In other words, should the user request 500 reactions, - and the constant is 100, the request will - be split into 5 individual requests; thus returning 5 individual asynchronous responses, hence the need - of flattening. - - - The following example gets the users that have reacted with the emoji 💕 to the message. - - var emoji = new Emoji("\U0001f495"); - var reactedUsers = await message.GetReactionUsersAsync(emoji, 100).FlattenAsync(); - - - The emoji that represents the reaction that you wish to get. - The number of users to request. - The options to be used when sending the request. - - Paged collection of users. - - - - - Represents a partial within a message. - - - - - Gets the snowflake id of the interaction. - - - - - Gets the type of the interaction. - - - - - Gets the name of the application command used. - - - - - Gets the who invoked the interaction. - - - - - Represents a generic reaction object. - - - - - The used in the reaction. - - - - - Represents a generic message sent by the system. - - - - - Represents a generic message sent by a user. - - - - - Gets the referenced message if it is a crosspost, channel follow add, pin, or reply message. - - - The referenced message, if any is associated and still exists. - - - - - Modifies this message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Adds this message to its channel's pinned messages. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for pinning this message. - - - - - Removes this message from its channel's pinned messages. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for unpinning this message. - - - - - Publishes (crossposts) this message. - - The options to be used when sending the request. - - A task that represents the asynchronous operation for publishing this message. - - - - This call will throw an if attempted in a non-news channel. - - This method will publish (crosspost) the message. Please note, publishing (crossposting), is only available in news channels. - - - - - Transforms this message's text into a human-readable form by resolving its tags. - - Determines how the user tag should be handled. - Determines how the channel tag should be handled. - Determines how the role tag should be handled. - Determines how the @everyone tag should be handled. - Determines how the emoji tag should be handled. - - - - An activity object found in a sent message. - - - - This class refers to an activity object, visually similar to an embed within a message. However, a message - activity is interactive as opposed to a standard static embed. - - For example, a Spotify party invitation counts as a message activity. - - - - - Gets the type of activity of this message. - - - - - Gets the party ID of this activity, if any. - - - - - Gets the snowflake ID of the application. - - - - - Gets the ID of the embed's image asset. - - - - - Gets the application's description. - - - - - Gets the ID of the application's icon. - - - - - Gets the Url of the application's icon. - - - - - Gets the name of the application. - - - - - Default value for flags, when none are given to a message. - - - - - Flag given to messages that have been published to subscribed - channels (via Channel Following). - - - - - Flag given to messages that originated from a message in another - channel (via Channel Following). - - - - - Flag given to messages that do not display any embeds. - - - - - Flag given to messages that the source message for this crosspost - has been deleted (via Channel Following). - - - - - Flag given to messages that came from the urgent message system. - - - - - Flag given to messages has an associated thread, with the same id as the message - - - - - Flag given to messages that is only visible to the user who invoked the Interaction. - - - - - Flag given to messages that is an Interaction Response and the bot is "thinking" - - - - - Represents a partial within a message. - - The type of the user. - - - - Gets the snowflake id of the interaction. - - - - - Gets the type of the interaction. - - - - - Gets the name of the application command used. - - - - - Gets the who invoked the interaction. - - - - - Properties that are used to modify an with the specified changes. - - - The content of a message can be cleared with if and only if an - is present. - - - - - - Gets or sets the content of the message. - - - This must be less than the constant defined by . - - - - - Gets or sets a single embed for this message. - - - This property will be added to the array, in the future please use the array rather than this property. - - - - - Gets or sets the embeds of the message. - - - - - Gets or sets the components for this message. - - - - - Gets or sets the flags of the message. - - - Only can be set/unset and you need to be - the author of the message. - - - - - Gets or sets the allowed mentions of the message. - - - - - Contains the IDs sent from a crossposted message or inline reply. - - - - - Gets the Message ID of the original message. - - - - - Gets the Channel ID of the original message. - - - It only will be the default value (zero) if it was instantiated with a in the constructor. - - - - - Gets the Guild ID of the original message. - - - - - Initializes a new instance of the class. - - - The ID of the message that will be referenced. Used to reply to specific messages and the only parameter required for it. - - - The ID of the channel that will be referenced. It will be validated if sent. - - - The ID of the guild that will be referenced. It will be validated if sent. - - - - - Specifies the source of the Discord message. - - - - - The message is sent by the system. - - - - - The message is sent by a user. - - - - - The message is sent by a bot. - - - - - The message is sent by a webhook. - - - - - Specifies the type of message. - - - - - The default message type. - - - - - The message when a recipient is added. - - - - - The message when a recipient is removed. - - - - - The message when a user is called. - - - - - The message when a channel name is changed. - - - - - The message when a channel icon is changed. - - - - - The message when another message is pinned. - - - - - The message when a new member joined. - - - - - The message for when a user boosts a guild. - - - - - The message for when a guild reaches Tier 1 of Nitro boosts. - - - - - The message for when a guild reaches Tier 2 of Nitro boosts. - - - - - The message for when a guild reaches Tier 3 of Nitro boosts. - - - - - The message for when a news channel subscription is added to a text channel. - - - - - The message for when a guild is disqualified from discovery. - - - - - The message for when a guild is requalified for discovery. - - - - - The message for when the initial warning is sent for the initial grace period discovery. - - - - - The message for when the final warning is sent for the initial grace period discovery. - - - - - The message for when a thread is created. - - - - - The message is an inline reply. - - - Only available in API v8. - - - - - The message is an Application Command. - - - Only available in API v8. - - - - - The message that starts a thread. - - - Only available in API v9. - - - - - The message for a invite reminder. - - - - - The message for a context menu command. - - - - - A metadata containing reaction information. - - - - - Gets the number of reactions. - - - An representing the number of this reactions that has been added to this message. - - - - - Gets a value that indicates whether the current user has reacted to this. - - - true if the user has reacted to the message; otherwise false. - - - - - Defines the types of formats for stickers. - - - - - Default value for a sticker format type. - - - - - The sticker format type is png. - - - - - The sticker format type is apng. - - - - - The sticker format type is lottie. - - - - - Specifies the handling type the tag should use. - - - - - - - Tag handling is ignored (e.g. <@53905483156684800> -> <@53905483156684800>). - - - - - Removes the tag entirely. - - - - - Resolves to username (e.g. <@53905483156684800> -> @Voltana). - - - - - Resolves to username without mention prefix (e.g. <@53905483156684800> -> Voltana). - - - - - Resolves to username with discriminator value. (e.g. <@53905483156684800> -> @Voltana#8252). - - - - - Resolves to username with discriminator value without mention prefix. (e.g. <@53905483156684800> -> Voltana#8252). - - - - - Sanitizes the tag (e.g. <@53905483156684800> -> <@53905483156684800> (w/ nbsp)). - - - - Specifies the type of Discord tag. - - - The object is an user mention. - - - The object is a channel mention. - - - The object is a role mention. - - - The object is an everyone mention. - - - The object is a here mention. - - - The object is an emoji. - - - - Represents a class used to make timestamps in messages. see . - - - - - Gets or sets the style of the timestamp tag. - - - - - Gets or sets the time for this timestamp tag. - - - - - Converts the current timestamp tag to the string representation supported by discord. - - If the is null then the default 0 will be used. - - - A string that is compatible in a discord message, ex: <t:1625944201:f> - - - - Creates a new timestamp tag with the specified datetime object. - - The time of this timestamp tag. - The style for this timestamp tag. - The newly create timestamp tag. - - - - Represents a set of styles to use with a - - - - - A short time string: 16:20 - - - - - A long time string: 16:20:30 - - - - - A short date string: 20/04/2021 - - - - - A long date string: 20 April 2021 - - - - - A short datetime string: 20 April 2021 16:20 - - - - - A long datetime string: Tuesday, 20 April 2021 16:20 - - - - - The relative time to the user: 2 months ago - - - - - Application command permissions allow you to enable or disable commands for specific users or roles within a guild. - - - - - The id of the role or user. - - - - - The target of this permission. - - - - - to allow, otherwise . - - - - - Creates a new . - - The id you want to target this permission value for. - The type of the targetId parameter. - The value of this permission. - - - - Creates a new targeting . - - The user you want to target this permission value for. - The value of this permission. - - - - Creates a new targeting . - - The role you want to target this permission value for. - The value of this permission. - - - - Specifies the target of the permission. - - - - - The target of the permission is a role. - - - - - The target of the permission is a user. - - - - Defines the available permissions for a channel. - - - - Allows creation of instant invites. - - - - - Allows management and editing of channels. - - - - - Allows for the addition of reactions to messages. - - - - - Allows guild members to view a channel, which includes reading messages in text channels. - - - - - Allows for sending messages in a channel. - - - - - Allows for sending of text-to-speech messages. - - - - - Allows for deletion of other users messages. - - - - - Allows links sent by users with this permission will be auto-embedded. - - - - - Allows for uploading images and files. - - - - - Allows for reading of message history. - - - - - Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all - online users in a channel. - - - - - Allows the usage of custom emojis from other servers. - - - - - Allows for joining of a voice channel. - - - - - Allows for speaking in a voice channel. - - - - - Allows for muting members in a voice channel. - - - - - Allows for deafening of members in a voice channel. - - - - - Allows for moving of members between voice channels. - - - - - Allows for using voice-activity-detection in a voice channel. - - - - - Allows for using priority speaker in a voice channel. - - - - - Allows video streaming in a voice channel. - - - - - Allows management and editing of roles. - - - - - Allows management and editing of webhooks. - - - - - Allows management and editing of emojis. - - - - - Allows members to use slash commands in text channels. - - - - - Allows members to use slash commands in text channels. - - - - - Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.) - - - - - Allows for deleting and archiving threads, and viewing all private threads - - - - - Allows for creating and participating in threads - - - - - Allows for creating and participating in private threads - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows the usage of custom stickers from other servers. - - - - - Allows for sending messages in threads. - - - - - Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. - - - - Gets a blank that grants no permissions. - A structure that does not contain any set permissions. - - - Gets a that grants all permissions for text channels. - - - Gets a that grants all permissions for voice channels. - - - Gets a that grants all permissions for stage channels. - - - Gets a that grants all permissions for category channels. - - - Gets a that grants all permissions for direct message channels. - - - Gets a that grants all permissions for group channels. - - - Gets a that grants all permissions for a given channel type. - Unknown channel type. - - - Gets a packed value representing all the permissions in this . - - - If true, a user may create invites. - - - If true, a user may create, delete and modify this channel. - - - If true, a user may add reactions. - - - If true, a user may view channels. - - - If true, a user may send messages. - - - If true, a user may send text-to-speech messages. - - - If true, a user may delete messages. - - - If true, Discord will auto-embed links sent by this user. - - - If true, a user may send files. - - - If true, a user may read previous messages. - - - If true, a user may mention @everyone. - - - If true, a user may use custom emoji from other guilds. - - - If true, a user may connect to a voice channel. - - - If true, a user may speak in a voice channel. - - - If true, a user may mute users. - - - If true, a user may deafen users. - - - If true, a user may move other users between voice channels. - - - If true, a user may use voice-activity-detection rather than push-to-talk. - - - If true, a user may use priority speaker in a voice channel. - - - If true, a user may stream video in a voice channel. - - - If true, a user may adjust role permissions. This also implicitly grants all other permissions. - - - If true, a user may edit the webhooks for this channel. - - - If true, a user may use application commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activities in voice channels in this guild. - - - Creates a new with the provided packed value. - - - Creates a new with the provided permissions. - - - Creates a new from this one, changing the provided non-null permissions. - - - - Returned when fetching the permissions for a command in a guild. - - - - - The id of the command. - - - - - The id of the application the command belongs to. - - - - - The id of the guild. - - - - - The permissions for the command in the guild. - - - - Defines the available permissions for a channel. - - - - Allows creation of instant invites. - - - - - Allows kicking members. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows banning members. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows all permissions and bypasses channel permission overwrites. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of channels. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of the guild. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows for viewing of guild insights - - - - - Allows for the addition of reactions to messages. - - - - - Allows for viewing of audit logs. - - - - - Allows guild members to view a channel, which includes reading messages in text channels. - - - - - Allows for sending messages in a channel - - - - - Allows for sending of text-to-speech messages. - - - - - Allows for deletion of other users messages. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows links sent by users with this permission will be auto-embedded. - - - - - Allows for uploading images and files. - - - - - Allows for reading of message history. - - - - - Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all - online users in a channel. - - - - - Allows the usage of custom emojis from other servers. - - - - - Allows for joining of a voice channel. - - - - - Allows for speaking in a voice channel. - - - - - Allows for muting members in a voice channel. - - - - - Allows for deafening of members in a voice channel. - - - - - Allows for moving of members between voice channels. - - - - - Allows for using voice-activity-detection in a voice channel. - - - - - Allows for using priority speaker in a voice channel. - - - - - Allows video streaming in a voice channel. - - - - - Allows for modification of own nickname. - - - - - Allows for modification of other users nicknames. - - - - - Allows management and editing of roles. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of webhooks. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows management and editing of emojis and stickers. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows members to use slash commands in text channels. - - - - - Allows members to use application commands like slash commands and context menus in text channels. - - - - - Allows for requesting to speak in stage channels. (This permission is under active development and may be changed or removed.). - - - - - Allows for deleting and archiving threads, and viewing all private threads. - - - This permission requires the owner account to use two-factor - authentication when used on a guild that has server-wide 2FA enabled. - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows for creating public threads. - - - - - Allows for creating private threads. - - - - - Allows the usage of custom stickers from other servers. - - - - - Allows for sending messages in threads. - - - - - Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. - - - - Gets a blank that grants no permissions. - - - Gets a that grants all guild permissions for webhook users. - - - Gets a that grants all guild permissions. - - - Gets a packed value representing all the permissions in this . - - - If true, a user may create invites. - - - If true, a user may ban users from the guild. - - - If true, a user may kick users from the guild. - - - If true, a user is granted all permissions, and cannot have them revoked via channel permissions. - - - If true, a user may create, delete and modify channels. - - - If true, a user may adjust guild properties. - - - If true, a user may add reactions. - - - If true, a user may view the audit log. - - - If true, a user may view the guild insights. - - - If True, a user may view channels. - - - If True, a user may send messages. - - - If true, a user may send text-to-speech messages. - - - If true, a user may delete messages. - - - If true, Discord will auto-embed links sent by this user. - - - If true, a user may send files. - - - If true, a user may read previous messages. - - - If true, a user may mention @everyone. - - - If true, a user may use custom emoji from other guilds. - - - If true, a user may connect to a voice channel. - - - If true, a user may speak in a voice channel. - - - If true, a user may mute users. - - - If true, a user may deafen users. - - - If true, a user may move other users between voice channels. - - - If true, a user may use voice-activity-detection rather than push-to-talk. - - - If True, a user may use priority speaker in a voice channel. - - - If True, a user may stream video in a voice channel. - - - If true, a user may change their own nickname. - - - If true, a user may change the nickname of other users. - - - If true, a user may adjust roles. - - - If true, a user may edit the webhooks for this guild. - - - If true, a user may edit the emojis and stickers for this guild. - - - If true, a user may use slash commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activities in voice channels in this guild. - - - Creates a new with the provided packed value. - - - Creates a new with the provided packed value after converting to ulong. - - - Creates a new structure with the provided permissions. - - - Creates a new from this one, changing the provided non-null permissions. - - - - Returns a value that indicates if a specific is enabled - in these permissions. - - The permission value to check for. - true if the permission is enabled, false otherwise. - - - - Returns a containing all of the - flags that are enabled. - - A containing flags. Empty if none are enabled. - - - - Represent a permission object. - - - - - Gets the unique identifier for the object this overwrite is targeting. - - - - - Gets the type of object this overwrite is targeting. - - - - - Gets the permissions associated with this overwrite entry. - - - - - Initializes a new with provided target information and modified permissions. - - - - - Represents a container for a series of overwrite permissions. - - - - - Gets a blank that inherits all permissions. - - - - - Gets a that grants all permissions for the given channel. - - Unknown channel type. - - - - Gets a that denies all permissions for the given channel. - - Unknown channel type. - - - - Gets a packed value representing all the allowed permissions in this . - - - - - Gets a packed value representing all the denied permissions in this . - - - - If Allowed, a user may create invites. - - - If Allowed, a user may create, delete and modify this channel. - - - If Allowed, a user may add reactions. - - - If Allowed, a user may join channels. - - - If Allowed, a user may send messages. - - - If Allowed, a user may send text-to-speech messages. - - - If Allowed, a user may delete messages. - - - If Allowed, Discord will auto-embed links sent by this user. - - - If Allowed, a user may send files. - - - If Allowed, a user may read previous messages. - - - If Allowed, a user may mention @everyone. - - - If Allowed, a user may use custom emoji from other guilds. - - - If Allowed, a user may connect to a voice channel. - - - If Allowed, a user may speak in a voice channel. - - - If Allowed, a user may mute users. - - - If Allowed, a user may deafen users. - - - If Allowed, a user may move other users between voice channels. - - - If Allowed, a user may use voice-activity-detection rather than push-to-talk. - - - If Allowed, a user may use priority speaker in a voice channel. - - - If Allowed, a user may go live in a voice channel. - - - If Allowed, a user may adjust role permissions. This also implicitly grants all other permissions. - - - If True, a user may edit the webhooks for this channel. - - - If true, a user may use slash commands in this guild. - - - If true, a user may request to speak in stage channels. - - - If true, a user may manage threads in this guild. - - - If true, a user may create public threads in this guild. - - - If true, a user may create private threads in this guild. - - - If true, a user may use external stickers in this guild. - - - If true, a user may send messages in threads in this guild. - - - If true, a user launch application activities in voice channels in this guild. - - - Creates a new OverwritePermissions with the provided allow and deny packed values. - - - Creates a new OverwritePermissions with the provided allow and deny packed values after converting to ulong. - - - - Initializes a new struct with the provided permissions. - - - - - Initializes a new from the current one, changing the provided - non-null permissions. - - - - - Creates a of all the values that are allowed. - - A of all allowed flags. If none, the list will be empty. - - - - Creates a of all the values that are denied. - - A of all denied flags. If none, the list will be empty. - - - Specifies the permission value. - - - Allows this permission. - - - Denies this permission. - - - Inherits the permission settings. - - - - Represents a color used in Discord. - - - - Gets the max decimal value of color. - - - Gets the default user color value. - - - Gets the teal color value. - A color struct with the hex value of 1ABC9C. - - - Gets the dark teal color value. - A color struct with the hex value of 11806A. - - - Gets the green color value. - A color struct with the hex value of 2ECC71. - - - Gets the dark green color value. - A color struct with the hex value of 1F8B4C. - - - Gets the blue color value. - A color struct with the hex value of 3498DB. - - - Gets the dark blue color value. - A color struct with the hex value of 206694. - - - Gets the purple color value. - A color struct with the hex value of 9B59B6. - - - Gets the dark purple color value. - A color struct with the hex value of 71368A. - - - Gets the magenta color value. - A color struct with the hex value of E91E63. - - - Gets the dark magenta color value. - A color struct with the hex value of AD1457. - - - Gets the gold color value. - A color struct with the hex value of F1C40F. - - - Gets the light orange color value. - A color struct with the hex value of C27C0E. - - - Gets the orange color value. - A color struct with the hex value of E67E22. - - - Gets the dark orange color value. - A color struct with the hex value of A84300. - - - Gets the red color value. - A color struct with the hex value of E74C3C. - - - Gets the dark red color value. - A color struct with the hex value of 992D22. - - - Gets the light grey color value. - A color struct with the hex value of 979C9F. - - - Gets the lighter grey color value. - A color struct with the hex value of 95A5A6. - - - Gets the dark grey color value. - A color struct with the hex value of 607D8B. - - - Gets the darker grey color value. - A color struct with the hex value of 546E7A. - - - Gets the encoded value for this color. - - This value is encoded as an unsigned integer value. The most-significant 8 bits contain the red value, - the middle 8 bits contain the green value, and the least-significant 8 bits contain the blue value. - - - - Gets the red component for this color. - - - Gets the green component for this color. - - - Gets the blue component for this color. - - - - Initializes a struct with the given raw value. - - - The following will create a color that has a hex value of - #607D8B. - - Color darkGrey = new Color(0x607D8B); - - - The raw value of the color (e.g. 0x607D8B). - Value exceeds . - - - - Initializes a struct with the given RGB bytes. - - - The following will create a color that has a value of - #607D8B. - - Color darkGrey = new Color((byte)0b_01100000, (byte)0b_01111101, (byte)0b_10001011); - - - The byte that represents the red color. - The byte that represents the green color. - The byte that represents the blue color. - Value exceeds . - - - - Initializes a struct with the given RGB value. - - - The following will create a color that has a value of - #607D8B. - - Color darkGrey = new Color(96, 125, 139); - - - The value that represents the red color. Must be within 0~255. - The value that represents the green color. Must be within 0~255. - The value that represents the blue color. Must be within 0~255. - The argument value is not between 0 to 255. - - - - Initializes a struct with the given RGB float value. - - - The following will create a color that has a value of - #607c8c. - - Color darkGrey = new Color(0.38f, 0.49f, 0.55f); - - - The value that represents the red color. Must be within 0~1. - The value that represents the green color. Must be within 0~1. - The value that represents the blue color. Must be within 0~1. - The argument value is not between 0 to 1. - - - - Gets the hexadecimal representation of the color (e.g. #000ccc). - - - A hexadecimal string of the color. - - - - - Represents a generic role object to be given to a guild user. - - - - - Gets the guild that owns this role. - - - A guild representing the parent guild of this role. - - - - - Gets the color given to users of this role. - - - A struct representing the color of this role. - - - - - Gets a value that indicates whether the role can be separated in the user list. - - - true if users of this role are separated in the user list; otherwise false. - - - - - Gets a value that indicates whether the role is managed by Discord. - - - true if this role is automatically managed by Discord; otherwise false. - - - - - Gets a value that indicates whether the role is mentionable. - - - true if this role may be mentioned in messages; otherwise false. - - - - - Gets the name of this role. - - - A string containing the name of this role. - - - - - Gets the icon of this role. - - - A string containing the hash of this role's icon. - - - - - Gets the permissions granted to members of this role. - - - A struct that this role possesses. - - - - - Gets this role's position relative to other roles in the same guild. - - - An representing the position of the role in the role list of the guild. - - - - - Gets the tags related to this role. - - - A object containing all tags related to this role. - - - - - Modifies this role. - - - This method modifies this role with the specified properties. To see an example of this - method and what properties are available, please refer to . - - A delegate containing the properties to modify the role with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Gets the image url of the icon role. - - - An image url of the icon role. - - - - - Properties that are used to reorder an . - - - - - Gets the identifier of the role to be edited. - - - A representing the snowflake identifier of the role to be modified. - - - - - Gets the new zero-based position of the role. - - - An representing the new zero-based position of the role. - - - - - Initializes a with the given role ID and position. - - The ID of the role to be edited. - The new zero-based position of the role. - - - - Properties that are used to modify an with the specified changes. - - - The following example modifies the role to a mentionable one, renames the role into Sonic, and - changes the color to a light-blue. - - await role.ModifyAsync(x => - { - x.Name = "Sonic"; - x.Color = new Color(0x1A50BC); - x.Mentionable = true; - }); - - - - - - - Gets or sets the name of the role. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets the role's . - - - - - Gets or sets the position of the role. This is 0-based! - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets the color of the role. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets whether or not this role should be displayed independently in the user list. - - - This value may not be set if the role is an @everyone role. - - - - - Gets or sets whether or not this role can be mentioned. - - - This value may not be set if the role is an @everyone role. - - - - - Provides tags related to a discord role. - - - - - Gets the identifier of the bot that this role belongs to, if it does. - - - A if this role belongs to a bot; otherwise - . - - - - - Gets the identifier of the integration that this role belongs to, if it does. - - - A if this role belongs to an integration; otherwise - . - - - - - Gets if this role is the guild's premium subscriber (booster) role. - - - if this role is the guild's premium subscriber role; - otherwise . - - - - - Represents a custom sticker within a guild. - - - - - Gets the users id who uploaded the sticker. - - - In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - Gets the guild that this custom sticker is in. - - - - - Modifies this sticker. - - - This method modifies this sticker with the specified properties. To see an example of this - method and what properties are available, please refer to . -
-
- The bot needs the MANAGE_EMOJIS_AND_STICKERS permission within the guild in order to modify stickers. -
- - The following example replaces the name of the sticker with kekw. - - await sticker.ModifyAsync(x => x.Name = "kekw"); - - - A delegate containing the properties to modify the sticker with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - -
- - - Deletes the current sticker. - - - The bot needs the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. - - The options to be used when sending the request. - - A task that represents the asynchronous deletion operation. - - - - - Represents a discord sticker. - - - - - Gets the ID of this sticker. - - - A snowflake ID associated with this sticker. - - - - - Gets the ID of the pack of this sticker. - - - A snowflake ID associated with the pack of this sticker. - - - - - Gets the name of this sticker. - - - A with the name of this sticker. - - - - - Gets the description of this sticker. - - - A with the description of this sticker. - - - - - Gets the list of tags of this sticker. - - - A read-only list with the tags of this sticker. - - - - - Gets the type of this sticker. - - - - - Gets the format type of this sticker. - - - A with the format type of this sticker. - - - - - Gets whether this guild sticker can be used, may be false due to loss of Server Boosts. - - - - - Gets the standard sticker's sort order within its pack. - - - - - Gets the image url for this sticker. - - - - - Represents a partial sticker item received with a message. - - - - - The id of the sticker. - - - - - The name of the sticker. - - - - - The format of the sticker. - - - - - Represents a discord sticker pack. - - The type of the stickers within the collection. - - - - Gets the id of the sticker pack. - - - - - Gets a collection of the stickers in the pack. - - - - - Gets the name of the sticker pack. - - - - - Gets the id of the pack's SKU. - - - - - Gets the id of a sticker in the pack which is shown as the pack's icon. - - - - - Gets the description of the sticker pack. - - - - - Gets the id of the sticker pack's banner image - - - - - Represents a class used to modify stickers. - - - - - Gets or sets the name of the sticker. - - - - - Gets or sets the description of the sticker. - - - - - Gets or sets the tags of the sticker. - - - - - Represents a type of sticker.. - - - - - Represents a discord standard sticker, this type of sticker cannot be modified by an application. - - - - - Represents a sticker that was created within a guild. - - - - - Represents a Discord Team. - - - - - Gets the team icon url. - - - - - Gets the team unique identifier. - - - - - Gets the members of this team. - - - - - Gets the name of this team. - - - - - Gets the user identifier that owns this team. - - - - - Represents a Discord Team member. - - - - - Gets the membership state of this team member. - - - - - Gets the permissions of this team member. - - - - - Gets the team unique identifier for this team member. - - - - - Gets the Discord user of this team member. - - - - - Represents the membership state of a team member. - - - - - Properties that are used to add a new to the guild with the following parameters. - - - - - - Gets or sets the user's nickname. - - - To clear the user's nickname, this value can be set to null or - . - - - - - Gets or sets whether the user should be muted in a voice channel. - - - If this value is set to true, no user will be able to hear this user speak in the guild. - - - - - Gets or sets whether the user should be deafened in a voice channel. - - - If this value is set to true, this user will not be able to hear anyone speak in the guild. - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Defines the types of clients a user can be active on. - - - - - The user is active using the mobile application. - - - - - The user is active using the desktop application. - - - - - The user is active using the web application. - - - - - Properties that are used to modify an with the following parameters. - - - - - - Gets or sets whether the user should be muted in a voice channel. - - - If this value is set to true, no user will be able to hear this user speak in the guild. - - - - - Gets or sets whether the user should be deafened in a voice channel. - - - If this value is set to true, this user will not be able to hear anyone speak in the guild. - - - - - Gets or sets the user's nickname. - - - To clear the user's nickname, this value can be set to null or - . - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Gets or sets the roles the user should have. - - - - To add a role to a user: - - - - To remove a role from a user: - - - - - - - Moves a user to a voice channel. If null, this user will be disconnected from their current voice channel. - - - This user MUST already be in a for this to work. - When set, this property takes precedence over . - - - - - Moves a user to a voice channel. Set to null to disconnect this user from their current voice channel. - - - This user MUST already be in a for this to work. - - - - Gets the ID of the connection account. - A representing the unique identifier value of this connection. - - - Gets the service of the connection (twitch, youtube). - A string containing the name of this type of connection. - - - Gets the username of the connection account. - A string containing the name of this connection. - - - Gets whether the connection is revoked. - A value which if true indicates that this connection has been revoked, otherwise false. - - - Gets a of integration IDs. - - An containing - representations of unique identifier values of integrations. - - - - - Represents a Discord user that is in a group. - - - - - Represents a generic guild user. - - - - - Gets when this user joined the guild. - - - A representing the time of which the user has joined the guild; - null when it cannot be obtained. - - - - - Gets the nickname for this user. - - - A string representing the nickname of the user; null if none is set. - - - - - Gets the guild-level permissions for this user. - - - A structure for this user, representing what - permissions this user has in the guild. - - - - - Gets the guild for this user. - - - A guild object that this user belongs to. - - - - - Gets the ID of the guild for this user. - - - An representing the snowflake identifier of the guild that this user belongs to. - - - - - Gets the date and time for when this user's guild boost began. - - - A for when the user began boosting this guild; null if they are not boosting the guild. - - - - - Gets a collection of IDs for the roles that this user currently possesses in the guild. - - - This property returns a read-only collection of the identifiers of the roles that this user possesses. - For WebSocket users, a Roles property can be found in place of this property. Due to the REST - implementation, only a collection of identifiers can be retrieved instead of the full role objects. - - - A read-only collection of , each representing a snowflake identifier for a role that - this user possesses. - - - - - Whether the user has passed the guild's Membership Screening requirements. - - - - - Gets the users position within the role hierarchy. - - - - - Gets the level permissions granted to this user to a given channel. - - - The following example checks if the current user has the ability to send a message with attachment in - this channel; if so, uploads a file via . - - if (currentUser?.GetPermissions(targetChannel)?.AttachFiles) - await targetChannel.SendFileAsync("fortnite.png"); - - - The channel to get the permission from. - - A structure representing the permissions that a user has in the - specified channel. - - - - - Kicks this user from this guild. - - The reason for the kick which will be recorded in the audit log. - The options to be used when sending the request. - - A task that represents the asynchronous kick operation. - - - - - Modifies this user's properties in this guild. - - - This method modifies the current guild user with the specified properties. To see an example of this - method and what properties are available, please refer to . - - The delegate containing the properties to modify the user with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Adds the specified role to this user in the guild. - - The role to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified role to this user in the guild. - - The role to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified to this user in the guild. - - The roles to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Adds the specified to this user in the guild. - - The roles to be added to the user. - The options to be used when sending the request. - - A task that represents the asynchronous role addition operation. - - - - - Removes the specified from this user in the guild. - - The role to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The role to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The roles to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Removes the specified from this user in the guild. - - The roles to be removed from the user. - The options to be used when sending the request. - - A task that represents the asynchronous role removal operation. - - - - - Represents the user's presence status. This may include their online status and their activity. - - - - - Gets the current status of this user. - - - - - Gets the set of clients where this user is currently active. - - - - - Gets the list of activities that this user currently has available. - - - - - Represents the logged-in Discord user. - - - - - Gets the email associated with this user. - - - - - Indicates whether or not this user has their email verified. - - - true if this user's email has been verified; false if not. - - - - - Indicates whether or not this user has MFA enabled on their account. - - - true if this user has enabled multi-factor authentication on their account; false if not. - - - - - Gets the flags that are applied to a user's account. - - - This value is determined by bitwise OR-ing values together. - - - The value of flags for this user. - - - - - Gets the type of Nitro subscription that is active on this user's account. - - - This information may only be available with the identify OAuth scope. - - - The type of Nitro subscription the user subscribes to, if any. - - - - - Gets the user's chosen language option. - - - The IETF language tag of the user's chosen region, if provided. - For example, a locale of "English, US" is "en-US", "Chinese (Taiwan)" is "zh-TW", etc. - - - - - Modifies the user's properties. - - - - - Represents a generic user. - - - - - Gets the identifier of this user's avatar. - - - - - Gets the identifier of this user's banner. - - - - - Gets the user's banner color. - - - A struct representing the accent color of this user's banner. - - - - - Gets the avatar URL for this user. - - - This property retrieves a URL for this user's avatar. In event that the user does not have a valid avatar - (i.e. their avatar identifier is not set), this method will return null. If you wish to - retrieve the default avatar for this user, consider using (see - example). - - - 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. - - - The format to return. - The size of the image to return in. This can be any power of two between 16 and 2048. - - - A string representing the user's avatar URL; null if the user does not have an avatar in place. - - - - - Gets the banner URL for this user. - - The format to return. - The size of the image to return in. This can be any power of two between 16 and 2048. - - - A string representing the user's avatar URL; null if the user does not have an banner in place. - - - - - Gets the default avatar URL for this user. - - - This property retrieves a URL for this user's default avatar generated by Discord (Discord logo followed - by a random color as its background). This property will always return a value as it is calculated based - on the user's (discriminator % 5). - - - A string representing the user's avatar URL. - - - - - Gets the per-username unique ID for this user. - - - - - Gets the per-username unique ID for this user. - - - - - Gets a value that indicates whether this user is identified as a bot. - - - This property retrieves a value that indicates whether this user is a registered bot application - (indicated by the blue BOT tag within the official chat client). - - - true if the user is a bot application; otherwise false. - - - - - Gets a value that indicates whether this user is a webhook user. - - - true if the user is a webhook; otherwise false. - - - - - Gets the username for this user. - - - - - Gets the public flags that are applied to this user's account. - - - This value is determined by bitwise OR-ing values together. - - - The value of public flags for this user. - - - - - Creates the direct message channel of this user. - - - This method is used to obtain or create a channel used to send a direct message. - - In event that the current user cannot send a message to the target user, a channel can and will - still be created by Discord. However, attempting to send a message will yield a - with a 403 as its - . There are currently no official workarounds by - Discord. - - - - The following example attempts to send a direct message to the target user and logs the incident should - it fail. - - - The options to be used when sending the request. - - A task that represents the asynchronous operation for getting or creating a DM channel. The task result - contains the DM channel associated with this user. - - - - - Represents a user's voice connection status. - - - - - Gets a value that indicates whether this user is deafened by the guild. - - - true if the user is deafened (i.e. not permitted to listen to or speak to others) by the guild; - otherwise false. - - - - - Gets a value that indicates whether this user is muted (i.e. not permitted to speak via voice) by the - guild. - - - true if this user is muted by the guild; otherwise false. - - - - - Gets a value that indicates whether this user has marked themselves as deafened. - - - true if this user has deafened themselves (i.e. not permitted to listen to or speak to others); otherwise false. - - - - - Gets a value that indicates whether this user has marked themselves as muted (i.e. not permitted to - speak via voice). - - - true if this user has muted themselves; otherwise false. - - - - - Gets a value that indicates whether the user is muted by the current user. - - - true if the guild is temporarily blocking audio to/from this user; otherwise false. - - - - - Gets the voice channel this user is currently in. - - - A generic voice channel object representing the voice channel that the user is currently in; null - if none. - - - - - Gets the unique identifier for this user's voice session. - - - - - Gets a value that indicates if this user is streaming in a voice channel. - - - true if the user is streaming; otherwise false. - - - - - Gets the time on which the user requested to speak. - - - - Represents a Webhook Discord user. - - - Gets the ID of a webhook. - - - - Specifies the type of subscription a user is subscribed to. - - - - - No subscription. - - - - - Nitro Classic subscription. Includes app perks like animated emojis and avatars, but not games. - - - - - Nitro subscription. Includes app perks as well as the games subscription service. - - - - - Properties that are used to modify the with the specified changes. - - - - - - Gets or sets the username. - - - - - Gets or sets the avatar. - - - - - Default value for flags, when none are given to an account. - - - - - Flag given to users who are a Discord employee. - - - - - Flag given to users who are owners of a partnered Discord server. - - - - - Flag given to users in HypeSquad events. - - - - - Flag given to users who have participated in the bug report program and are level 1. - - - - - Flag given to users who are in the HypeSquad House of Bravery. - - - - - Flag given to users who are in the HypeSquad House of Brilliance. - - - - - Flag given to users who are in the HypeSquad House of Balance. - - - - - Flag given to users who subscribed to Nitro before games were added. - - - - - Flag given to users who are part of a team. - - - - - Flag given to users who represent Discord (System). - - - - - Flag given to users who have participated in the bug report program and are level 2. - - - - - Flag given to users who are verified bots. - - - - - Flag given to users that developed bots and early verified their accounts. - - - - - Flag given to users that are discord certified moderators who has give discord's exam. - - - - - Defines the available Discord user status. - - - - - The user is offline. - - - - - The user is online. - - - - - The user is idle. - - - - - The user is AFK. - - - - - The user is busy. - - - - - The user is invisible. - - - - - Represents a webhook object on Discord. - - - - - Gets the token of this webhook. - - - - - Gets the default name of this webhook. - - - - - Gets the ID of this webhook's default avatar. - - - - - Gets the URL to this webhook's default avatar. - - - - - Gets the channel for this webhook. - - - - - Gets the ID of the channel for this webhook. - - - - - Gets the guild owning this webhook. - - - - - Gets the ID of the guild owning this webhook. - - - - - Gets the user that created this webhook. - - - - - Gets the ID of the application owning this webhook. - - - - - Modifies this webhook. - - - - - Properties used to modify an with the specified changes. - - - - - - Gets or sets the default name of the webhook. - - - - - Gets or sets the default avatar of the webhook. - - - - - Gets or sets the channel for this webhook. - - - This field is not used when authenticated with . - - - - - Gets or sets the channel ID for this webhook. - - - This field is not used when authenticated with . - - - - - Represents the type of a webhook. - - - This type is currently unused, and is only returned in audit log responses. - - - - An incoming webhook - - - An extension class for squashing . - - This set of extension methods will squash an into a - single . This is often associated with requests that has a - set limit when requesting. - - - - Flattens the specified pages into one asynchronously. - - - Flattens the specified pages into one . - - - - The prefix applied to files to indicate that it is a spoiler. - - - - - Gets whether the message's attachments are spoilers or not. - - - - An extension class for the Discord client. - - - Gets the private channel with the provided ID. - - - Gets the DM channel with the provided ID. - - - Gets all available DM channels for the client. - - - Gets the group channel with the provided ID. - - - Gets all available group channels for the client. - - - Gets the most optimal voice region for the client. - - - An extension class for building an embed. - - - Adds embed color based on the provided raw value. - - - Adds embed color based on the provided RGB value. - - - Adds embed color based on the provided RGB value. - The argument value is not between 0 to 255. - - - Adds embed color based on the provided RGB value. - The argument value is not between 0 to 1. - - - Fills the embed author field with the provided user's full username and avatar URL. - - - Converts a object to a . - The embed type is not . - - - - Adds the specified fields into this . - - Field count exceeds . - - - - Adds the specified fields into this . - - - - - An extension class for . - - - - - Gets if welcome system messages are enabled. - - The guild to check. - A bool indicating if the welcome messages are enabled in the system channel. - - - - Gets if guild boost system messages are enabled. - - The guild to check. - A bool indicating if the guild boost messages are enabled in the system channel. - - - - Provides extension methods for . - - - - - Gets a URL that jumps to the message. - - The message to jump to. - - A string that contains a URL for jumping to the message in chat. - - - - - Add multiple reactions to a message. - - - This method does not bulk add reactions! It will send a request for each reaction included. - - - - IEmote A = new Emoji("🅰"); - IEmote B = new Emoji("🅱"); - await msg.AddReactionsAsync(new[] { A, B }); - - - The message to add reactions to. - An array of reactions to add to the message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for adding a reaction to this message. - - - - - - - Remove multiple reactions from a message. - - - This method does not bulk remove reactions! If you want to clear reactions from a message, - - - - - await msg.RemoveReactionsAsync(currentUser, new[] { A, B }); - - - The message to remove reactions from. - The user who removed the reaction. - An array of reactions to remove from the message. - The options to be used when sending the request. - - A task that represents the asynchronous operation for removing a reaction to this message. - - - - - - - Sends an inline reply that references a message. - - The message that is being replied on. - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - A array of s to send with this response. Max 10. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The options to be used when sending the request. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - An extension class for various Discord user objects. - - - - Sends a message via DM. - - - This method attempts to send a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - The user to send the DM to. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message components to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents the asynchronous send operation. The task result contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - The following example uploads a streamed image that will be called b1nzy.jpg embedded inside a - rich embed to the channel. - - await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); - - - - This method attempts to send an attachment as a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The user to send the DM to. - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - The message component to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file via DM with an optional caption. - - - The following example uploads a local file called wumpus.txt along with the text - good discord boi to the channel. - - await channel.SendFileAsync("wumpus.txt", "good discord boi"); - - - The following example uploads a local image called b1nzy.jpg embedded inside a rich embed to the - channel. - - await channel.SendFileAsync("b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); - - - - This method attempts to send an attachment as a direct-message to the user. - - - Please note that this method will throw an - if the user cannot receive DMs due to privacy reasons or if the user has the sender blocked. - - - You may want to consider catching for - 50007 when using this method. - - - - If you wish to upload an image and have it embedded in a embed, - you may upload the file and refer to the file with "attachment://filename.ext" in the - . See the example section for its usage. - - - The user to send the DM to. - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - The message component to be included with this message. Used for interactions. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Bans the user from the guild and optionally prunes their recent messages. - - The user to ban. - The number of days to remove messages from this for - must be between [0, 7] - The reason of the ban to be written in the audit log. - The options to be used when sending the request. - is not between 0 to 7. - - A task that represents the asynchronous operation for banning a user. - - - - A helper class for formatting characters. - - - Returns a markdown-formatted string with bold formatting. - - - Returns a markdown-formatted string with italics formatting. - - - Returns a markdown-formatted string with underline formatting. - - - Returns a markdown-formatted string with strike-through formatting. - - - Returns a string with spoiler formatting. - - - Returns a markdown-formatted URL. Only works in descriptions and fields. - - - Escapes a URL so that a preview is not generated. - - - Returns a markdown-formatted string with codeblock formatting. - - - Sanitizes the string, safely escaping any Markdown sequences. - - - - Formats a string as a quote. - - The text to format. - Gets the formatted quote text. - - - - Formats a string as a block quote. - - The text to format. - Gets the formatted block quote text. - - - - Remove discord supported markdown from text. - - The to remove markdown from. - Gets the unformatted text. - - - This intent includes no events - - - This intent includes GUILD_CREATE, GUILD_UPDATE, GUILD_DELETE, GUILD_ROLE_CREATE, GUILD_ROLE_UPDATE, GUILD_ROLE_DELETE, CHANNEL_CREATE, CHANNEL_UPDATE, CHANNEL_DELETE, CHANNEL_PINS_UPDATE - - - This intent includes GUILD_MEMBER_ADD, GUILD_MEMBER_UPDATE, GUILD_MEMBER_REMOVE - This is a privileged intent and must be enabled in the Developer Portal. - - - This intent includes GUILD_BAN_ADD, GUILD_BAN_REMOVE - - - This intent includes GUILD_EMOJIS_UPDATE - - - This intent includes GUILD_INTEGRATIONS_UPDATE - - - This intent includes WEBHOOKS_UPDATE - - - This intent includes INVITE_CREATE, INVITE_DELETE - - - This intent includes VOICE_STATE_UPDATE - - - This intent includes PRESENCE_UPDATE - This is a privileged intent and must be enabled in the Developer Portal. - - - This intent includes MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, MESSAGE_DELETE_BULK - - - This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI - - - This intent includes TYPING_START - - - This intent includes CHANNEL_CREATE, MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, CHANNEL_PINS_UPDATE - - - This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI - - - This intent includes TYPING_START - - - - This intent includes all but and - which are privileged and must be enabled in the Developer Portal. - - - - - This intent includes all of them, including privileged ones. - - - - - Represents a generic Discord client. - - - - - Gets the current state of connection. - - - - - Gets the currently logged-in user. - - - - - Gets the token type of the logged-in user. - - - - - Starts the connection between Discord and the client.. - - - This method will initialize the connection between the client and Discord. - - This method will immediately return after it is called, as it will initialize the connection on - another thread. - - - - A task that represents the asynchronous start operation. - - - - - Stops the connection between Discord and the client. - - - A task that represents the asynchronous stop operation. - - - - - Gets a Discord application information for the logged-in user. - - - This method reflects your application information you submitted when creating a Discord application via - the Developer Portal. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application - information. - - - - - Gets a generic channel. - - - - var channel = await _client.GetChannelAsync(381889909113225237); - if (channel != null && channel is IMessageChannel msgChannel) - { - await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); - } - - - The snowflake identifier of the channel (e.g. `381889909113225237`). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the channel associated - with the snowflake identifier; null when the channel cannot be found. - - - - - Gets a collection of private channels opened in this session. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - This method will retrieve all private channels (including direct-message, group channel and such) that - are currently opened in this session. - - This method will not return previously opened private channels outside of the current session! If - you have just started the client, this may return an empty collection. - - - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of private channels that the user currently partakes in. - - - - - Gets a collection of direct message channels opened in this session. - - - This method returns a collection of currently opened direct message channels. - - This method will not return previously opened DM channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of direct-message channels that the user currently partakes in. - - - - - Gets a collection of group channels opened in this session. - - - This method returns a collection of currently opened group channels. - - This method will not return previously opened group channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of group channels that the user currently partakes in. - - - - - Gets the connections that the user has set up. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. - - - - - Gets a global application command. - - The id of the command. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application command if found, otherwise - . - - - - - Gets a collection of all global commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of global - application commands. - - - - - Creates a global application command. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created application command. - - - - - Bulk overwrites all global application commands. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of application commands that were created. - - - - - Gets a guild. - - The guild snowflake identifier. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild associated - with the snowflake identifier; null when the guild cannot be found. - - - - - Gets a collection of guilds that the user is currently in. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of guilds that the current user is in. - - - - - Creates a guild for the logged-in user who is in less than 10 active guilds. - - - This method creates a new guild on behalf of the logged-in user. - - Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. - - - The name of the new guild. - The voice region to create the guild with. - The icon of the guild. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created guild. - - - - - Gets an invite. - - The invitation identifier. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the invite information. - - - - - Gets a user. - - - - var user = await _client.GetUserAsync(168693960628371456); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The snowflake identifier of the user (e.g. `168693960628371456`). - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the snowflake identifier; null if the user is not found. - - - - - Gets a user. - - - - var user = await _client.GetUserAsync("Still", "2876"); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The name of the user (e.g. `Still`). - The discriminator value of the user (e.g. `2876`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the name and the discriminator; null if the user is not found. - - - - - Gets a collection of the available voice regions. - - - The following example gets the most optimal voice region from the collection. - - var regions = await client.GetVoiceRegionsAsync(); - var optimalRegion = regions.FirstOrDefault(x => x.IsOptimal); - - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - with all of the available voice regions in this session. - - - - - Gets a voice region. - - The identifier of the voice region (e.g. eu-central ). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice region - associated with the identifier; null if the voice region is not found. - - - - - Gets a webhook available. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the recommended shard count as suggested by Discord. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains an - that represents the number of shards that should be used with this account. - - - - - Gets the gateway information related to the bot. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - that represents the gateway information related to the bot. - - - - - Provides a message object used for logging purposes. - - - - - Gets the severity of the log entry. - - - A enum to indicate the severeness of the incident or event. - - - - - Gets the source of the log entry. - - - A string representing the source of the log entry. - - - - - Gets the message of this log entry. - - - A string containing the message of this log entry. - - - - - Gets the exception of this log entry. - - - An object associated with an incident; otherwise null. - - - - - Initializes a new struct with the severity, source, message of the event, and - optionally, an exception. - - The severity of the event. - The source of the event. - The message of the event. - The exception of the event. - - - - Specifies the severity of the log message. - - - - - Logs that contain the most severe level of error. This type of error indicate that immediate attention - may be required. - - - - - Logs that highlight when the flow of execution is stopped due to a failure. - - - - - Logs that highlight an abnormal activity in the flow of execution. - - - - - Logs that track the general flow of the application. - - - - - Logs that are used for interactive investigation during development. - - - - - Logs that contain the most detailed messages. - - - - Specifies the state of the client's login status. - - - The client is currently logged out. - - - The client is currently logging in. - - - The client is currently logged in. - - - The client is currently logging out. - - - - Gets the JSON error code returned by Discord. - - - A - JSON error code - from Discord, or null if none. - - - - - Gets the reason of the exception. - - - - - Gets the request object used to send the request. - - - - - The error object returned from discord. - - - Note: This object can be null if discord didn't provide it. - - - - - The request json used to create the application command. This is useful for checking your commands for any format errors. - - - - - The underlying that caused this exception to be thrown. - - - - - Initializes a new instance of the class. - - - - - - - Represents a ratelimit bucket. - - - - - Gets the http method used to make the request if available. - - - - - Gets the endpoint that is going to be requested if available. - - - - - Gets the major parameters of the route. - - - - - Gets the hash of this bucket. - - - The hash is provided by Discord to group ratelimits. - - - - - Gets if this bucket is a hash type. - - - - - Creates a new based on the - and . - - Http method used to make the request. - Endpoint that is going to receive requests. - Major parameters of the route of this endpoint. - - A based on the - and the with the provided data. - - - - - Creates a new based on a - and a previous . - - Bucket hash provided by Discord. - that is going to be upgraded to a hash type. - - A based on the - and . - - - - - Gets the string that will define this bucket as a hash based one. - - - A that defines this bucket as a hash based one. - - - - - Gets the string that will define this bucket as an endpoint based one. - - - A that defines this bucket as an endpoint based one. - - - - - The exception that is thrown if an error occurs while processing an Discord HTTP request. - - - - - Gets the HTTP status code returned by Discord. - - - An - HTTP status code - from Discord. - - - - - Gets the JSON error code returned by Discord. - - - A - JSON error code - from Discord, or null if none. - - - - - Gets the reason of the exception. - - - - - Gets the request object used to send the request. - - - - - The error object returned from discord. - - - Note: This object can be null if discord didn't provide it. - - - - - Initializes a new instance of the class. - - The HTTP status code returned. - The request that was sent prior to the exception. - The Discord status code returned. - The reason behind the exception. - - - - Represents a generic request to be sent to Discord. - - - - - The exception that is thrown when the user is being rate limited by Discord. - - - - - Gets the request object used to send the request. - - - - - Initializes a new instance of the class using the - sent. - - - - - Represents a generic REST-based client. - - - - - Sets the HTTP header of this client for all requests. - - The field name of the header. - The value of the header. - - - - Sets the cancellation token for this client. - - The cancellation token. - - - - Sends a REST request. - - The method used to send this request (i.e. HTTP verb such as GET, POST). - The endpoint to send this request to. - The cancellation token used to cancel the task. - Indicates whether to send the header only. - The audit log reason. - - - - - The exception that is thrown when the WebSocket session is closed by Discord. - - - - - Gets the close code sent by Discord. - - - A - close code - from Discord. - - - - - Gets the reason of the interruption. - - - - - Initializes a new instance of the using a Discord close code - and an optional reason. - - - - - Represents a generic ratelimit info. - - - - - Gets whether or not this ratelimit info is global. - - - - - Gets the number of requests that can be made. - - - - - Gets the number of remaining requests that can be made. - - - - - Gets the total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision. - - - - - Gets the at which the rate limit resets. - - - - - Gets the absolute time when this ratelimit resets. - - - - - Gets a unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path). - - - - - Gets the amount of lag for the request. This is used to denote the precise time of when the ratelimit expires. - - - - - Gets the endpoint that this ratelimit info came from. - - - - - Represents options that should be used when sending a request. - - - - - Creates a new class with its default settings. - - - - - Gets or sets the maximum time to wait for this request to complete. - - - Gets or set the max time, in milliseconds, to wait for this request to complete. If - null, a request will not time out. If a rate limit has been triggered for this request's bucket - and will not be unpaused in time, this request will fail immediately. - - - A in milliseconds for when the request times out. - - - - - Gets or sets the cancellation token for this request. - - - A for this request. - - - - - Gets or sets the retry behavior when the request fails. - - - - - Gets or sets the reason for this action in the guild's audit log. - - - Gets or sets the reason that will be written to the guild's audit log if applicable. This may not apply - to all actions. - - - - - Gets or sets whether or not this request should use the system - clock for rate-limiting. Defaults to true. - - - This property can also be set in . - On a per-request basis, the system clock should only be disabled - when millisecond precision is especially important, and the - hosting system is known to have a desynced clock. - - - - - Gets or sets the callback to execute regarding ratelimits for this request. - - - - - Initializes a new class with the default request timeout set in - . - - - - Specifies how a request should act in the case of an error. - - - If a request fails, an exception is thrown immediately. - - - Retry if a request timed out. - - - Retry if a request failed due to a rate-limit. - - - Retry if a request failed due to an HTTP error 502. - - - Continuously retry a request until it times out, its cancel token is triggered, or the server responds with a non-502 error. - - - Specifies the type of token to use with the client. - - - - An OAuth2 token type. - - - - - A bot token type. - - - - - A webhook token type. - - - - - Represents a cached entity. - - The type of entity that is cached. - The type of this entity's ID. - - - - Gets whether this entity is cached. - - - - - Gets the ID of this entity. - - - - - Gets the entity if it could be pulled from cache. - - - This value is not guaranteed to be set; in cases where the entity cannot be pulled from cache, it is - null. - - - - - Downloads this entity to cache. - - Thrown when used from a user account. - Thrown when the message is deleted. - - A task that represents the asynchronous download operation. The task result contains the downloaded - entity. - - - - - Returns the cached entity if it exists; otherwise downloads it. - - Thrown when used from a user account. - Thrown when the message is deleted and is not in cache. - - A task that represents the asynchronous operation that attempts to get the message via cache or to - download the message. The task result contains the downloaded entity. - - - - - Represents a collection of for various Discord objects. - - - - - Gets an to be used to compare users. - - - - - Gets an to be used to compare guilds. - - - - - Gets an to be used to compare channels. - - - - - Gets an to be used to compare roles. - - - - - Gets an to be used to compare messages. - - - - is null - - - - or is null - - - - is null - - - is null - - - is null - - - - - - - Provides a series of helper methods for parsing mentions. - - - - - Returns a mention string based on the user ID. - - - A user mention string (e.g. <@80351110224678912>). - - - - - Returns a mention string based on the channel ID. - - - A channel mention string (e.g. <#103735883630395392>). - - - - - Returns a mention string based on the role ID. - - - A role mention string (e.g. <@&165511591545143296>). - - - - - Parses a provided user mention string. - - The user mention. - Invalid mention format. - - - - Tries to parse a provided user mention string. - - The user mention. - The UserId of the user. - - - - Parses a provided channel mention string. - - Invalid mention format. - - - - Tries to parse a provided channel mention string. - - - - - Parses a provided role mention string. - - Invalid mention format. - - - - Tries to parse a provided role mention string. - - - - Gets the value for this parameter. - This property has no value set. - - - Returns true if this value has been specified. - - - Creates a new Parameter with the provided value. - - - must not be . - - - must not be . - - - cannot be blank. - - - cannot be blank. - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - cannot be blank. - must not be . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value may not be equal to . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be at least . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be greater than . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be at most . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Value must be less than . - - - Messages are younger than 2 weeks. - - - The everyone role cannot be assigned to a user. - - - - Provides a series of helper methods for handling snowflake identifiers. - - - - - Resolves the time of which the snowflake is generated. - - The snowflake identifier to resolve. - - A representing the time for when the object is generated. - - - - - Generates a pseudo-snowflake identifier with a . - - The time to be used in the new snowflake. - - A representing the newly generated snowflake identifier. - - - - - Provides a series of helper methods for handling Discord login tokens. - - - - - The minimum length of a Bot token. - - - This value was determined by comparing against the examples in the Discord - documentation, and pre-existing tokens. - - - - - Pads a base64-encoded string with 0, 1, or 2 '=' characters, - if the string is not a valid multiple of 4. - Does not ensure that the provided string contains only valid base64 characters. - Strings that already contain padding will not have any more padding applied. - - - A string that would require 3 padding characters is considered to be already corrupt. - Some older bot tokens may require padding, as the format provided by Discord - does not include this padding in the token. - - The base64 encoded string to pad with characters. - A string containing the base64 padding. - - Thrown if would require an invalid number of padding characters. - - - Thrown if is null, empty, or whitespace. - - - - - Decodes a base 64 encoded string into a ulong value. - - A base 64 encoded string containing a User Id. - A ulong containing the decoded value of the string, or null if the value was invalid. - - - - Checks the validity of a bot token by attempting to decode a ulong userid - from the bot token. - - - The bot token to validate. - - - True if the bot token was valid, false if it was not. - - - - - The set of all characters that are not allowed inside of a token. - - - - - Checks if the given token contains a whitespace or newline character - that would fail to log in. - - The token to validate. - - True if the token contains a whitespace or newline character. - - - - - Checks the validity of the supplied token of a specific type. - - The type of token to validate. - The token value to validate. - Thrown when the supplied token string is null, empty, or contains only whitespace. - Thrown when the supplied or token value is invalid. - - - - Not full URL validation right now. Just ensures protocol is present and that it's either http or https - should be used for url buttons. - - The URL to validate before sending to Discord. - A URL must include a protocol (http or https). - true if URL is valid by our standard, false if null, throws an error upon invalid. - - - - Not full URL validation right now. Just Ensures the protocol is either http, https, or discord - should be used everything other than url buttons. - - The URL to validate before sending to discord. - A URL must include a protocol (either http, https, or discord). - true if the URL is valid by our standard, false if null, throws an error upon invalid. - -
-
diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index c54482136f..f428b39fbf 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -7,13 +7,6 @@ A core Discord.Net Labs library containing the REST client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - PackageLogo.png - https://github.com/Discord-Net-Labs/Discord.Net-Labs - Discord.Net.Labs.Rest - https://github.com/Discord-Net-Labs/Discord.Net-Labs -
- - ..\Discord.Net.Rest\Discord.Net.Rest.xml @@ -21,13 +14,4 @@ - - - Always - - - True - - -
diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.xml b/src/Discord.Net.Rest/Discord.Net.Rest.xml deleted file mode 100644 index a8927268d3..0000000000 --- a/src/Discord.Net.Rest/Discord.Net.Rest.xml +++ /dev/null @@ -1,5271 +0,0 @@ - - - - Discord.Net.Rest - - - - - Represents a vanity invite. - - - - - The unique code for the invite link. - - - - - The total amount of vanity invite uses. - - - - - Gets the snowflake ID of the application. - - - - - Gets the ID of the embed's image asset. - - - - - Gets the application's description. - - - - - Gets the ID of the application's icon. - - - - - Gets the name of the application. - - - - Unknown OAuth token type. - - - Unknown OAuth token type. - - - Unknown OAuth token type. - - - - must not be equal to zero. - -and- - must be greater than zero. - - - must not be . - -and- - must not be or empty. - - - - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - This operation may only be called with a token. - - - Message content is too long, length must be less or equal to . - - - - and must not be equal to zero. - -and- - must be between 0 to 7. - - must not be . - - - and must not be equal to zero. - - - must not be equal to zero. - - - must not be equal to zero. - must not be . - - - must not be equal to zero. - - - and must not be equal to zero. - must not be . - - - cannot be blank. - must not be . - - - may not be equal to zero. - - - may not be equal to zero. - - - may not be equal to zero. - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - must not be . - - - Client is not logged in. - - - Unsupported param type. - - - The default RestClientProvider is not supported on this platform. - - - Cannot read from image. - - - - Represents a REST-Based ratelimit info. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the login state of the client. - - - - - Gets the logged-in user. - - - - - - - Creates a new REST-only Discord client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creating a guild is not supported with the base client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unexpected channel type. - - - - Provides a client to send REST-based requests to Discord. - - - - - Gets the logged-in user. - - - - - - - - Initializes a new with the provided configuration. - - The configuration to be used with the client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a configuration class for . - - - - Gets or sets the provider used to generate new REST connections. - - - - Contains a piece of audit log data related to a ban. - - - - - Gets the user that was banned. - - - A user object representing the banned user. - - - - - Contains a piece of audit log data related to a adding a bot to a guild. - - - - - Gets the bot that was added. - - - A user object representing the bot. - - - - - Contains a piece of audit log data related to a channel creation. - - - - - Gets the snowflake ID of the created channel. - - - A representing the snowflake identifier for the created channel. - - - - - Gets the name of the created channel. - - - A string containing the name of the created channel. - - - - - Gets the type of the created channel. - - - The type of channel that was created. - - - - - Gets the current slow-mode delay of the created channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether the created channel is NSFW. - - - true if the created channel has the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate that the clients in the created voice channel are requested to use. - - - An representing the bit-rate (bps) that the created voice channel defines and requests the - client(s) to use. - null if this is not mentioned in this entry. - - - - - Gets a collection of permission overwrites that was assigned to the created channel. - - - A collection of permission , containing the permission overwrites that were - assigned to the created channel. - - - - - Contains a piece of audit log data related to a channel deletion. - - - - - Gets the snowflake ID of the deleted channel. - - - A representing the snowflake identifier for the deleted channel. - - - - - Gets the name of the deleted channel. - - - A string containing the name of the deleted channel. - - - - - Gets the type of the deleted channel. - - - The type of channel that was deleted. - - - - - Gets the slow-mode delay of the deleted channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether the deleted channel was NSFW. - - - true if this channel had the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate of this channel if applicable. - - - An representing the bit-rate set of the voice channel. - null if this is not mentioned in this entry. - - - - - Gets a collection of permission overwrites that was assigned to the deleted channel. - - - A collection of permission . - - - - - Represents information for a channel. - - - - - Gets the name of this channel. - - - A string containing the name of this channel. - - - - - Gets the topic of this channel. - - - A string containing the topic of this channel, if any. - - - - - Gets the current slow-mode delay of this channel. - - - An representing the time in seconds required before the user can send another - message; 0 if disabled. - null if this is not mentioned in this entry. - - - - - Gets the value that indicates whether this channel is NSFW. - - - true if this channel has the NSFW flag enabled; otherwise false. - null if this is not mentioned in this entry. - - - - - Gets the bit-rate of this channel if applicable. - - - An representing the bit-rate set for the voice channel; - null if this is not mentioned in this entry. - - - - - Gets the type of this channel. - - - The channel type of this channel; null if not applicable. - - - - - Contains a piece of audit log data related to a channel update. - - - - - Gets the snowflake ID of the updated channel. - - - A representing the snowflake identifier for the updated channel. - - - - - Gets the channel information before the changes. - - - An information object containing the original channel information before the changes were made. - - - - - Gets the channel information after the changes. - - - An information object containing the channel information after the changes were made. - - - - - Contains a piece of audit log data related to an emoji creation. - - - - - Gets the snowflake ID of the created emoji. - - - A representing the snowflake identifier for the created emoji. - - - - - Gets the name of the created emoji. - - - A string containing the name of the created emoji. - - - - - Contains a piece of audit log data related to an emoji deletion. - - - - - Gets the snowflake ID of the deleted emoji. - - - A representing the snowflake identifier for the deleted emoji. - - - - - Gets the name of the deleted emoji. - - - A string containing the name of the deleted emoji. - - - - - Contains a piece of audit log data related to an emoji update. - - - - - Gets the snowflake ID of the updated emoji. - - - A representing the snowflake identifier of the updated emoji. - - - - - Gets the new name of the updated emoji. - - - A string containing the new name of the updated emoji. - - - - - Gets the old name of the updated emoji. - - - A string containing the old name of the updated emoji. - - - - - Represents information for a guild. - - - - - Gets the amount of time (in seconds) a user must be inactive in a voice channel for until they are - automatically moved to the AFK voice channel. - - - An representing the amount of time in seconds for a user to be marked as inactive - and moved into the AFK voice channel. - null if this is not mentioned in this entry. - - - - - Gets the default message notifications for users who haven't explicitly set their notification settings. - - - The default message notifications setting of this guild. - null if this is not mentioned in this entry. - - - - - Gets the ID of the AFK voice channel for this guild. - - - A representing the snowflake identifier of the AFK voice channel; null if - none is set. - - - - - Gets the name of this guild. - - - A string containing the name of this guild. - - - - - Gets the ID of the region hosting this guild's voice channels. - - - - - Gets the ID of this guild's icon. - - - A string containing the identifier for the splash image; null if none is set. - - - - - Gets the level of requirements a user must fulfill before being allowed to post messages in this guild. - - - The level of requirements. - null if this is not mentioned in this entry. - - - - - Gets the owner of this guild. - - - A user object representing the owner of this guild. - - - - - Gets the level of Multi-Factor Authentication requirements a user must fulfill before being allowed to - perform administrative actions in this guild. - - - The level of MFA requirement. - null if this is not mentioned in this entry. - - - - - Gets the level of content filtering applied to user's content in a Guild. - - - The level of explicit content filtering. - - - - - Gets the ID of the channel where system messages are sent. - - - A representing the snowflake identifier of the channel where system - messages are sent; null if none is set. - - - - - Gets the ID of the widget embed channel of this guild. - - - A representing the snowflake identifier of the embedded channel found within the - widget settings of this guild; null if none is set. - - - - - Gets a value that indicates whether this guild is embeddable (i.e. can use widget). - - - true if this guild can be embedded via widgets; otherwise false. - null if this is not mentioned in this entry. - - - - - Contains a piece of audit log data related to a guild update. - - - - - Gets the guild information before the changes. - - - An information object containing the original guild information before the changes were made. - - - - - Gets the guild information after the changes. - - - An information object containing the guild information after the changes were made. - - - - - Contains a piece of audit log data related to an invite creation. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that determines whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the user that created this invite if available. - - - A user that created this invite or . - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite was used. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Contains a piece of audit log data related to an invite removal. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off; otherwise - false. - - - - - Gets the user that created this invite if available. - - - A user that created this invite or . - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to. - - - - - Gets the number of times this invite has been used. - - - An representing the number of times this invite has been used. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is set. - - - - - Represents information for an invite. - - - - - Gets the time (in seconds) until the invite expires. - - - An representing the time in seconds until this invite expires; null if this - invite never expires or not specified. - - - - - Gets the unique identifier for this invite. - - - A string containing the invite code (e.g. FTqNnyS). - - - - - Gets a value that indicates whether the invite is a temporary one. - - - true if users accepting this invite will be removed from the guild when they log off, - false if not; null if not specified. - - - - - Gets the ID of the channel this invite is linked to. - - - A representing the channel snowflake identifier that the invite points to; - null if not specified. - - - - - Gets the max number of uses this invite may have. - - - An representing the number of uses this invite may be accepted until it is removed - from the guild; null if none is specified. - - - - - Contains a piece of audit log data relating to an invite update. - - - - - Gets the invite information before the changes. - - - An information object containing the original invite information before the changes were made. - - - - - Gets the invite information after the changes. - - - An information object containing the invite information after the changes were made. - - - - - Contains a piece of audit log data related to a kick. - - - - - Gets the user that was kicked. - - - A user object representing the kicked user. - - - - - Contains a piece of audit log data related to disconnecting members from voice channels. - - - - - Gets the number of members that were disconnected. - - - An representing the number of members that were disconnected from a voice channel. - - - - - Represents information for a member. - - - - - Gets the nickname of the updated member. - - - A string representing the nickname of the updated member; null if none is set. - - - - - Gets a value that indicates whether the updated member is deafened by the guild. - - - true if the updated member is deafened (i.e. not permitted to listen to or speak to others) by the guild; - otherwise false. - null if this is not mentioned in this entry. - - - - - Gets a value that indicates whether the updated member is muted (i.e. not permitted to speak via voice) by the - guild. - - - true if the updated member is muted by the guild; otherwise false. - null if this is not mentioned in this entry. - - - - - Contains a piece of audit log data related to moving members between voice channels. - - - - - Gets the ID of the channel that the members were moved to. - - - A representing the snowflake identifier for the channel that the members were moved to. - - - - - Gets the number of members that were moved. - - - An representing the number of members that were moved to another voice channel. - - - - - Contains a piece of audit log data related to a change in a guild member's roles. - - - - - Gets a collection of role changes that were performed on the member. - - - A read-only collection of , containing the roles that were changed on - the member. - - - - - Gets the user that the roles changes were performed on. - - - A user object representing the user that the role changes were performed on. - - - - - An information object representing a change in one of a guild member's roles. - - - - - Gets the name of the role that was changed. - - - A string containing the name of the role that was changed. - - - - - Gets the ID of the role that was changed. - - - A representing the snowflake identifier of the role that was changed. - - - - - Gets a value that indicates whether the role was added to the user. - - - true if the role was added to the user; otherwise false. - - - - - Contains a piece of audit log data related to a change in a guild member. - - - - - Gets the user that the changes were performed on. - - - A user object representing the user who the changes were performed on. - - - - - Gets the member information before the changes. - - - An information object containing the original member information before the changes were made. - - - - - Gets the member information after the changes. - - - An information object containing the member information after the changes were made. - - - - - Contains a piece of audit log data related to message deletion(s). - - - - - Gets the ID of the channel that the messages were deleted from. - - - A representing the snowflake identifier for the channel that the messages were - deleted from. - - - - - Gets the number of messages that were deleted. - - - An representing the number of messages that were deleted from the channel. - - - - - Contains a piece of audit log data related to message deletion(s). - - - - - Gets the number of messages that were deleted. - - - An representing the number of messages that were deleted from the channel. - - - - - Gets the ID of the channel that the messages were deleted from. - - - A representing the snowflake identifier for the channel that the messages were - deleted from. - - - - - Gets the user of the messages that were deleted. - - - A user object representing the user that created the deleted messages. - - - - - Contains a piece of audit log data related to a pinned message. - - - - - Gets the ID of the messages that was pinned. - - - A representing the snowflake identifier for the messages that was pinned. - - - - - Gets the ID of the channel that the message was pinned from. - - - A representing the snowflake identifier for the channel that the message was pinned from. - - - - - Gets the user of the message that was pinned if available. - - - A user object representing the user that created the pinned message or . - - - - - Contains a piece of audit log data related to an unpinned message. - - - - - Gets the ID of the messages that was unpinned. - - - A representing the snowflake identifier for the messages that was unpinned. - - - - - Gets the ID of the channel that the message was unpinned from. - - - A representing the snowflake identifier for the channel that the message was unpinned from. - - - - - Gets the user of the message that was unpinned if available. - - - A user object representing the user that created the unpinned message or . - - - - - Contains a piece of audit log data for a permissions overwrite creation. - - - - - Gets the ID of the channel that the overwrite was created from. - - - A representing the snowflake identifier for the channel that the overwrite was - created from. - - - - - Gets the permission overwrite object that was created. - - - An object representing the overwrite that was created. - - - - - Contains a piece of audit log data related to the deletion of a permission overwrite. - - - - - Gets the ID of the channel that the overwrite was deleted from. - - - A representing the snowflake identifier for the channel that the overwrite was - deleted from. - - - - - Gets the permission overwrite object that was deleted. - - - An object representing the overwrite that was deleted. - - - - - Contains a piece of audit log data related to the update of a permission overwrite. - - - - - Gets the ID of the channel that the overwrite was updated from. - - - A representing the snowflake identifier for the channel that the overwrite was - updated from. - - - - - Gets the overwrite permissions before the changes. - - - An overwrite permissions object representing the overwrite permissions that the overwrite had before - the changes were made. - - - - - Gets the overwrite permissions after the changes. - - - An overwrite permissions object representing the overwrite permissions that the overwrite had after the - changes. - - - - - Gets the ID of the overwrite that was updated. - - - A representing the snowflake identifier of the overwrite that was updated. - - - - - Gets the target of the updated permission overwrite. - - - The target of the updated permission overwrite. - - - - - Contains a piece of audit log data related to a guild prune. - - - - - Gets the threshold for a guild member to not be kicked. - - - An representing the amount of days that a member must have been seen in the server, - to avoid being kicked. (i.e. If a user has not been seen for more than , they will be - kicked from the server) - - - - - Gets the number of members that were kicked during the purge. - - - An representing the number of members that were removed from this guild for having - not been seen within . - - - - - Contains a piece of audit log data related to a role creation. - - - - - Gets the ID of the role that was created. - - - A representing the snowflake identifier to the role that was created. - - - - - Gets the role information that was created. - - - An information object representing the properties of the role that was created. - - - - - Contains a piece of audit log data relating to a role deletion. - - - - - Gets the ID of the role that was deleted. - - - A representing the snowflake identifier to the role that was deleted. - - - - - Gets the role information that was deleted. - - - An information object representing the properties of the role that was deleted. - - - - - Represents information for a role edit. - - - - - Gets the color of this role. - - - A color object representing the color assigned to this role; null if this role does not have a - color. - - - - - Gets a value that indicates whether this role is mentionable. - - - true if other members can mention this role in a text channel; otherwise false; - null if this is not mentioned in this entry. - - - - - Gets a value that indicates whether this role is hoisted (i.e. its members will appear in a separate - section on the user list). - - - true if this role's members will appear in a separate section in the user list; otherwise - false; null if this is not mentioned in this entry. - - - - - Gets the name of this role. - - - A string containing the name of this role. - - - - - Gets the permissions assigned to this role. - - - A guild permissions object representing the permissions that have been assigned to this role; null - if no permissions have been assigned. - - - - - Contains a piece of audit log data related to a role update. - - - - - Gets the ID of the role that was changed. - - - A representing the snowflake identifier of the role that was changed. - - - - - Gets the role information before the changes. - - - A role information object containing the role information before the changes were made. - - - - - Gets the role information after the changes. - - - A role information object containing the role information after the changes were made. - - - - - Represents information for a stage. - - - - - Gets the topic of the stage channel. - - - - - Gets the privacy level of the stage channel. - - - - - Gets the user who started the stage channel. - - - - - Contains a piece of audit log data related to a stage going live. - - - - - Gets the topic of the stage channel. - - - - - Gets the privacy level of the stage channel. - - - - - Gets the user who started the stage channel. - - - - - Gets the Id of the stage channel. - - - - - Contains a piece of audit log data related to a stage instance deleted. - - - - - Gets the topic of the stage channel. - - - - - Gets the privacy level of the stage channel. - - - - - Gets the user who started the stage channel. - - - - - Gets the Id of the stage channel. - - - - - Contains a piece of audit log data related to a stage instance update. - - - - - Gets the Id of the stage channel. - - - - - Gets the stage information before the changes. - - - - - Gets the stage information after the changes. - - - - - Contains a piece of audit log data related to an unban. - - - - - Gets the user that was unbanned. - - - A user object representing the user that was unbanned. - - - - - Contains a piece of audit log data related to a webhook creation. - - - - - Gets the webhook that was created if it still exists. - - - A webhook object representing the webhook that was created if it still exists, otherwise returns null. - - - - - Gets the webhook id. - - - The webhook identifier. - - - - - Gets the type of webhook that was created. - - - The type of webhook that was created. - - - - - Gets the name of the webhook. - - - A string containing the name of the webhook. - - - - - Gets the ID of the channel that the webhook could send to. - - - A representing the snowflake identifier of the channel that the webhook could send - to. - - - - - Contains a piece of audit log data related to a webhook deletion. - - - - - Gets the ID of the webhook that was deleted. - - - A representing the snowflake identifier of the webhook that was deleted. - - - - - Gets the ID of the channel that the webhook could send to. - - - A representing the snowflake identifier of the channel that the webhook could send - to. - - - - - Gets the type of the webhook that was deleted. - - - The type of webhook that was deleted. - - - - - Gets the name of the webhook that was deleted. - - - A string containing the name of the webhook that was deleted. - - - - - Gets the hash value of the webhook's avatar. - - - A string containing the hash of the webhook's avatar. - - - - - Represents information for a webhook. - - - - - Gets the name of this webhook. - - - A string containing the name of this webhook. - - - - - Gets the ID of the channel that this webhook sends to. - - - A representing the snowflake identifier of the channel that this webhook can send - to. - - - - - Gets the hash value of this webhook's avatar. - - - A string containing the hash of this webhook's avatar. - - - - - Contains a piece of audit log data related to a webhook update. - - - - - Gets the webhook that was updated. - - - A webhook object representing the webhook that was updated. - - - - - Gets the webhook information before the changes. - - - A webhook information object representing the webhook before the changes were made. - - - - - Gets the webhook information after the changes. - - - A webhook information object representing the webhook after the changes were made. - - - - - Represents a REST-based audit log entry. - - - - - - - - - - - - - - - - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - - may not be equal to zero. - -and- - and must be greater than zero. - -and- - must be lesser than 86400. - - - - Message content is too long, length must be less or equal to . - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - Message content is too long, length must be less or equal to . - - - Resolving permissions requires the parent guild to be downloaded. - - - Resolving permissions requires the parent guild to be downloaded. - - - This channel does not have a parent channel. - - - - Represents a REST-based channel that can send and receive messages. - - - - - Sends a message to this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in - . Please visit - its documentation for more details on this method. - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of pinned messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a collection of messages found in the pinned messages. - - - - - Represents a REST-based channel that is private to select recipients. - - - - - Users that can access this channel. - - - - - Represents a REST-based category channel. - - - - - This method is not supported with category channels. - - - - This method is not supported with category channels. - - - - Represents a generic REST-based channel. - - - - - - - Unexpected channel type. - - - Unexpected channel type. - - - - - - - - - - - - - - - - Represents a REST-based direct-message channel. - - - - - Gets the current logged-in user. - - - - - Gets the recipient of the channel. - - - - - Gets a collection that is the current logged-in user and the recipient. - - - - - - - - - - - Gets a user in this channel from the provided . - - The snowflake identifier of the user. - - A object that is a recipient of this channel; otherwise null. - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a string that represents the Username#Discriminator of the recipient. - - - A string that resolves to the Recipient of this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based group-message channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - Connecting to a group channel is not supported. - - - - Represents a private REST-based group channel. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Adds or updates the permission overwrite for the given user. - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Adds or updates the permission overwrite for the given role. - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Gets the name of this channel. - - - A string that is the name of this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based news channel in a guild that has the same properties as a . - - - - - Represents a REST-based stage channel in a guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based channel in a guild that can send and receive messages. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets a user in this channel. - - The snowflake identifier of the user. - The options to be used when sending the request. - - Resolving permissions requires the parent guild to be downloaded. - - - A task representing the asynchronous get operation. The task result contains a guild user object that - represents the user; null if none is found. - - - - - Gets a collection of users that are able to view the channel. - - The options to be used when sending the request. - - Resolving permissions requires the parent guild to be downloaded. - - - A paged collection containing a collection of guild users that can access this channel. Flattening the - paginated response into a collection of users with - is required if you wish to access the users. - - - - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - is a zero-length string, contains only white space, or contains one or more - invalid characters as defined by . - - - is null. - - - The specified path, file name, or both exceed the system-defined maximum length. For example, on - Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 - characters. - - - The specified path is invalid, (for example, it is on an unmapped drive). - - - specified a directory.-or- The caller does not have the required permission. - - - The file specified in was not found. - - is in an invalid format. - An I/O error occurred while opening the file. - Message content is too long, length must be less or equal to . - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - Gets the parent (category) channel of this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread channel received over REST. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the parent text channel id. - - - - - Gets a user within this thread. - - The id of the user to fetch. - The options to be used when sending the request. - - A task representing the asynchronous get operation. The task returns a - if found, otherwise . - - - - - Gets a collection of users within this thread. - - The options to be used when sending the request. - - A task representing the asynchronous get operation. The task returns a - of 's. - - - - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - - - - - - - - - - - - Represents a REST-based voice channel in a guild. - - - - - - - - - - - - - - - - - - - - - - - Gets the parent (category) channel of this channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the category channel - representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - - - - - - - Connecting to a REST-based channel is not supported. - - - - - - - - - - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - is null. - - - - Represents a REST-based ban object. - - - - - Gets the banned user. - - - A generic object that was banned. - - - - - - - - Gets the name of the banned user. - - - A string containing the name of the user that was banned. - - - - - - - - Represents a REST-based guild/server. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the built-in role containing all users in this guild. - - - - - Gets a collection of all roles in this guild. - - - - - - - - - - - - - - Updates this object's properties with its current state. - - - If true, and - will be updated as well. - - The options to be used when sending the request. - - If is true, and - will be updated as well. - - - - - - - - is . - - - - is . - - - - is . - - - - - - - - - - Deletes all slash commands in the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous delete operation. - - - - - Gets a collection of slash commands created by the current user in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - slash commands created by the current user. - - - - - Gets a slash command in the current guild. - - The unique identifier of the slash command. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - slash command created by the current user. - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - - - - - - - - - - - - - Gets a collection of all channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - generic channels found within this guild. - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the generic channel - associated with the specified ; if none is found. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - associated with the specified ; if none is found. - - - - - Gets a collection of all text channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - message channels found within this guild. - - - - - Gets a thread channel in this guild. - - The snowflake identifier for the thread channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the thread channel associated - with the specified ; if none is found. - - - - - Gets a collection of all thread in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - threads found within this guild. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel associated - with the specified ; if none is found. - - - - - Gets a collection of all voice channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice channels found within this guild. - - - - - Gets a stage channel in this guild - - The snowflake identifier for the stage channel. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the stage channel associated - with the specified ; if none is found. - - - - - Gets a collection of all stage channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - stage channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - category channels found within this guild. - - - - - Gets the AFK voice channel in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the voice channel that the - AFK users will be moved to after they have idled for too long; if none is set. - - - - - Gets the first viewable text channel in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the first viewable text - channel in this guild; if none is found. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the widget channel set - within the server's widget settings; if none is set. - - - - - Gets the text channel where guild notices such as welcome messages and boost events are posted. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where guild notices such as welcome messages and boost events are post; if none is found. - - - - - Gets the text channel where Community guilds can display rules and/or guidelines. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel - where Community guilds can display rules and/or guidelines; if none is set. - - - - - Gets the text channel where admins and moderators of Community guilds receive notices from Discord. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the text channel where - admins and moderators of Community guilds receive notices from Discord; if none is set. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - 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}."; - }); - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a voice channel with the provided name. - - The name of the new channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - The created voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a category channel with the provided name. - - The name of the new channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - The created category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A partial metadata of the vanity invite found within this guild. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - The options to be used when sending the request. - Whether the role can be mentioned. - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - The snowflake identifier of the user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the guild user - associated with the specified ; if none is found. - - - - - Gets the current user for this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the currently logged-in - user within this guild. - - - - - Gets the owner of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the owner of this guild. - - - - - - Prunes inactive users. - - - - This method removes all users that have not logged on in the provided number of . - - - If is true, this method will only return the number of users that - would be removed without kicking the users. - - - The number of days required for the users to be kicked. - Whether this prune action is a simulation. - The options to be used when sending the request. - - A task that represents the asynchronous prune operation. The task result contains the number of users to - be or has been removed from this guild. - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The options to be used when sending the request. - The audit log entry ID to get entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - Gets this guilds slash commands - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of application commands found within the guild. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Returns the name of the guild. - - - The name of the guild. - - - - - - - - - - - - - - is . - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a collection of all stickers within this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Disconnects the user from its current voice channel - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - - - - - - - - - - - - - Downloading users is not supported for a REST-based guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based voice region. - - - - - - - - - - - - - - - - - - - - Represents a Rest-based implementation of the . - - - - - - - - - - - - - - - - - - - - The options of this command. - - - - - - - - - - - - - - - - - Represents a Rest-based implementation of . - - - - - - - - - - - Represents a Rest-based implementation of . - - - - - - - - - - - - - - - - - - - - A collection of 's for this command. - - - - - A collection of 's for this command. - - - - - The allowed channel types for this option. - - - - - Represents a Rest-based global application command. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command. - - - - - Represents a Rest-based guild application command. - - - - - The guild Id where this command originates. - - - - - - - - Modifies this . - - The delegate containing the properties to modify the command with. - The options to be used when sending the request. - - The modified command - - - - - Gets this commands permissions inside of the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - object defining the permissions of the current slash command. - - - - - Modifies the current command permissions for this guild command. - - The permissions to overwrite. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. The task result contains a - object containing the modified permissions. - - - - - Gets the guild that this slash command resides in. - - if you want the approximate member and presence counts for the guild, otherwise . - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the URL of the invite. - - - A string that resolves to the Url of the invite. - - - - - - - - - - Represents additional information regarding the REST-based invite object. - - - - - - - - - - - - - - - - - - - Represents a Rest-based custom sticker within a guild. - - - - - Gets the users id who uploaded the sticker. - - - In order to get the author id, the bot needs the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - Gets the guild that this custom sticker is in. - - - Note: This property can be if the sticker wasn't fetched from a guild. - - - - - - - - - - - Regex used to check if some text is formatted as inline code. - - - - - Regex used to check if some text is formatted as a code block. - - - - Only the author of a message may modify the message. - Message content is too long, length must be less or equal to . - - - - Represents a REST-based follow up message sent by a bot responding to a slash command. - - - - - Deletes this object and all of it's children. - - A task that represents the asynchronous delete operation. - - - - Modifies this interaction followup message. - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - The token used to modify/delete this message expired. - /// Something went wrong during the request. - - - - Represents the initial REST-based response to a slash command. - - - - - Deletes this object and all of it's children. - - A task that represents the asynchronous delete operation. - - - - Modifies this interaction response - - - This method modifies this message with the specified properties. To see an example of this - method and what properties are available, please refer to . - - - The following example replaces the content of the message with Hello World!. - - await msg.ModifyAsync(x => x.Content = "Hello World!"); - - - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - The token used to modify/delete this message expired. - /// Something went wrong during the request. - - - - Represents a REST-based message. - - - - - - - - Gets the Author of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets a collection of the 's on the message. - - - - - Gets a collection of the 's on the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the interaction this message is a response to. - - - - - - - - - - - - - - Gets a collection of the mentioned users in the message. - - - - - - - - - - - Gets the of the message. - - - A string that is the of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST reaction object. - - - - - - - - Gets the number of reactions added. - - - - - Gets whether the reactions is added by the user. - - - - - Represents a REST-based system message. - - - - - Represents a REST-based message sent by a user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This operation may only be called on a channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a partial sticker received in a message. - - - - - - - - - - - Resolves this sticker item by fetching the from the API. - - - A task representing the download operation, the result of the task is a sticker object. - - - - - Represents a REST-based entity that contains information about a Discord application created via the developer portal. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unable to update this object from a different application token. - - - - Gets the name of the application. - - - Name of the application. - - - - - Represents a REST-based role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets if this role is the @everyone role of the guild or not. - - - - - - - - - - - - - - - - - - - - Gets the name of the role. - - - A string that is the name of the role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the name of the connection. - - - Name of the connection. - - - - - Represents a REST-based group user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a REST-based guild user. - - - - - - - - - - - - - - - - - - - - - - - - - - Resolving permissions requires the parent guild to be downloaded. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Resolving permissions requires the parent guild to be downloaded. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents the logged-in REST-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - Unable to update this object using a different token. - - - - Unable to modify this object using a different token. - - - - Represents a thread user received over the REST api. - - - - - Gets the this user is in. - - - - - Gets the timestamp for when this user joined this thread. - - - - - Gets the guild this user is in. - - - - - Gets the guild user for this thread user. - - - A task representing the asynchronous get operation. The task returns a - that represents the current thread user. - - - - - Represents a REST-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creates a direct message channel to this user. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a rest DM channel where the user is the recipient. - - - - - - - - - - - - - - Gets the Username#Discriminator of the user. - - - A string that resolves to Username#Discriminator of the user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Adds a user to the specified guild. - - - This method requires you have an OAuth2 access token for the user, requested with the guilds.join scope, and that the bot have the MANAGE_INVITES permission in the guild. - - The Discord client object. - The snowflake identifier of the guild. - The snowflake identifier of the user. - The OAuth2 access token for the user, requested with the guilds.join scope. - The delegate containing the properties to be applied to the user upon being added to the guild. - The options to be used when sending the request. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns the filename of this attachment. - - - A string containing the filename of this attachment. - - - - diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index 5d7d9caa11..ac3d3b5ba3 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,31 +8,9 @@ net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 true - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - Discord.Net.Labs.WebSocket - PackageReference - true - - - ..\Discord.Net.WebSocket\Discord.Net.WebSocket.xml - - - TRACE - - + - - - Always - - - True - - - diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml deleted file mode 100644 index f3a05fafa1..0000000000 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.xml +++ /dev/null @@ -1,5922 +0,0 @@ - - - - Discord.Net.WebSocket - - - - C←S - Used to send most events. - - - C↔S - Used to keep the connection alive and measure latency. - - - C→S - Used to associate a connection with a token and specify configuration. - - - C→S - Used to update client's status and current game id. - - - C→S - Used to join a particular voice channel. - - - C→S - Used to ensure the guild's voice server is alive. - - - C→S - Used to resume a connection after a redirect occurs. - - - C←S - Used to notify a client that they must reconnect to another gateway. - - - C→S - Used to request members that were withheld by large_threshold - - - C←S - Used to notify the client that their session has expired and cannot be resumed. - - - C←S - Used to provide information to the client immediately on connection. - - - C←S - Used to reply to a client's heartbeat. - - - C→S - Used to request presence updates from particular guilds. - - - C→S - Used to associate a connection with a token. - - - C→S - Used to specify configuration. - - - C←S - Used to notify that the voice connection was successful and informs the client of available protocols. - - - C→S - Used to keep the connection alive and measure latency. - - - C←S - Used to provide an encryption key to the client. - - - C↔S - Used to inform that a certain user is speaking. - - - C←S - Used to reply to a client's heartbeat. - - - C→S - Used to resume a connection. - - - C←S - Used to inform the client the heartbeat interval. - - - C←S - Used to acknowledge a resumed connection. - - - C←S - Used to notify that a client has disconnected. - - - The client must be logged in before connecting. - This client is not configured with WebSocket support. - - - This client is not configured with WebSocket support. - - - - Represents the base of a WebSocket-based Discord client. - - - - - Gets the estimated round-trip latency, in milliseconds, to the gateway server. - - - An that represents the round-trip latency to the WebSocket server. Please - note that this value does not represent a "true" latency for operations such as sending a message. - - - - - Gets the status for the logged-in user. - - - A status object that represents the user's online presence status. - - - - - Gets the activity for the logged-in user. - - - An activity object that represents the user's current activity. - - - - - Provides access to a REST-only client with a shared state from this client. - - - - - Gets a collection of default stickers. - - - - - Gets the current logged-in user. - - - - - Gets a collection of guilds that the user is currently in. - - - A read-only collection of guilds that the current user is in. - - - - - Gets a collection of private channels opened in this session. - - - This method will retrieve all private channels (including direct-message, group channel and such) that - are currently opened in this session. - - This method will not return previously opened private channels outside of the current session! If - you have just started the client, this may return an empty collection. - - - - A read-only collection of private channels that the user currently partakes in. - - - - - Gets a Discord application information for the logged-in user. - - - This method reflects your application information you submitted when creating a Discord application via - the Developer Portal. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the application - information. - - - - - Gets a generic user. - - The user snowflake ID. - - This method gets the user present in the WebSocket cache with the given condition. - - Sometimes a user may return null 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 . - - - 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 - . - - - - A generic WebSocket-based user; null when the user cannot be found. - - - - - Gets a user. - - - This method gets the user present in the WebSocket cache with the given condition. - - Sometimes a user may return null 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 . - - - 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 - . - - - The name of the user. - The discriminator value of the user. - - A generic WebSocket-based user; null when the user cannot be found. - - - - - Gets a channel. - - The snowflake identifier of the channel (e.g. `381889909113225237`). - - A generic WebSocket-based channel object (voice, text, category, etc.) associated with the identifier; - null when the channel cannot be found. - - - - - Gets a guild. - - The guild snowflake identifier. - - A WebSocket-based guild associated with the snowflake identifier; null when the guild cannot be - found. - - - - - Gets all voice regions. - - The options to be used when sending the request. - - A task that contains a read-only collection of REST-based voice regions. - - - - - Gets a voice region. - - The identifier of the voice region (e.g. eu-central ). - The options to be used when sending the request. - - A task that contains a REST-based voice region associated with the identifier; null if the - voice region is not found. - - - - - - - - - - - Sets the current status of the user (e.g. Online, Do not Disturb). - - The new status to be set. - - A task that represents the asynchronous set operation. - - - - - Sets the game of the user. - - The name of the game. - If streaming, the URL of the stream. Must be a valid Twitch URL. - The type of the game. - - - Bot accounts cannot set as their activity - type and it will have no effect. - - - - A task that represents the asynchronous set operation. - - - - - Sets the of the logged-in user. - - - This method sets the of the user. - - Discord will only accept setting of name and the type of activity. - - - Bot accounts cannot set as their activity - type and it will have no effect. - - - Rich Presence cannot be set via this method or client. Rich Presence is strictly limited to RPC - clients only. - - - The activity to be set. - - A task that represents the asynchronous set operation. - - - - - Attempts to download users into the user cache for the selected guilds. - - The guilds to download the members from. - - A task that represents the asynchronous download operation. - - - - - Creates a guild for the logged-in user who is in less than 10 active guilds. - - - This method creates a new guild on behalf of the logged-in user. - - Due to Discord's limitation, this method will only work for users that are in less than 10 guilds. - - - The name of the new guild. - The voice region to create the guild with. - The icon of the guild. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created guild. - - - - - Gets the connections that the user has set up. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of connections. - - - - - Gets an invite. - - The invitation identifier. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the invite information. - - - - - Gets a sticker. - - Whether or not to allow downloading from the api. - The id of the sticker to get. - The options to be used when sending the request. - - A if found, otherwise . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when a channel is created. - - - This event is fired when a generic channel has been created. The event handler must return a - and accept a as its parameter. - - - The newly created channel is passed into the event handler parameter. The given channel type may - include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); - see the derived classes of for more details. - - - - - - - - Fired when a channel is destroyed. - - - This event is fired when a generic channel has been destroyed. The event handler must return a - and accept a as its parameter. - - - The destroyed channel is passed into the event handler parameter. The given channel type may - include, but not limited to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); - see the derived classes of for more details. - - - - - - - - Fired when a channel is updated. - - - This event is fired when a generic channel has been destroyed. The event handler must return a - and accept 2 as its parameters. - - - The original (prior to update) channel is passed into the first , while - the updated channel is passed into the second. The given channel type may include, but not limited - to, Private Channels (DM, Group), Guild Channels (Text, Voice, Category); see the derived classes of - for more details. - - - - - - - - Fired when a message is received. - - - This event is fired when a message is received. The event handler must return a - and accept a as its parameter. - - - The message that is sent to the client is passed into the event handler parameter as - . This message may be a system message (i.e. - ) or a user message (i.e. . See the - derived classes of for more details. - - - - The example below checks if the newly received message contains the target user. - - - - - Fired when a message is deleted. - - - This event is fired when a message is deleted. The event handler must return a - and accept a and - as its parameters. - - - - It is not possible to retrieve the message via - ; the message cannot be retrieved by Discord - after the message has been deleted. - - If caching is enabled via , the - entity will contain the deleted message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the removed message will be passed into the - parameter. - - - - - - - - Fired when multiple messages are bulk deleted. - - - The event will not be fired for individual messages contained in this event. - - - This event is fired when multiple messages are bulk deleted. The event handler must return a - and accept an and - as its parameters. - - - - It is not possible to retrieve the message via - ; the message cannot be retrieved by Discord - after the message has been deleted. - - If caching is enabled via , the - entity will contain the deleted message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the removed message will be passed into the - parameter. - - - - - Fired when a message is updated. - - - This event is fired when a message is updated. The event handler must return a - and accept a , , - and as its parameters. - - - If caching is enabled via , the - entity will contain the original message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The updated message will be passed into the parameter. - - - The source channel of the updated message will be passed into the - parameter. - - - - - Fired when a reaction is added to a message. - - - This event is fired when a reaction is added to a user message. The event handler must return a - and accept a , an - , and a as its parameter. - - - If caching is enabled via , the - entity will contain the original message; otherwise, in event - that the message cannot be retrieved, the snowflake ID of the message is preserved in the - . - - - The source channel of the reaction addition will be passed into the - parameter. - - - The reaction that was added will be passed into the parameter. - - - When fetching the reaction from this event, a user may not be provided under - . Please see the documentation of the property for more - information. - - - - - - - - Fired when a reaction is removed from a message. - - - Fired when all reactions to a message are cleared. - - - - Fired when all reactions to a message with a specific emote are removed. - - - - This event is fired when all reactions to a message with a specific emote are removed. - The event handler must return a and accept a and - a as its parameters. - - - The channel where this message was sent will be passed into the parameter. - - - The emoji that all reactions had and were removed will be passed into the parameter. - - - - - Fired when a role is created. - - - Fired when a role is deleted. - - - Fired when a role is updated. - - - Fired when the connected account joins a guild. - - - Fired when the connected account leaves a guild. - - - Fired when a guild becomes available. - - - Fired when a guild becomes unavailable. - - - Fired when offline guild members are downloaded. - - - Fired when a guild is updated. - - - Fired when a user joins a guild. - - - Fired when a user leaves a guild. - - - Fired when a user is banned from a guild. - - - Fired when a user is unbanned from a guild. - - - Fired when a user is updated. - - - Fired when a guild member is updated, or a member presence is updated. - - - Fired when a user joins, leaves, or moves voice channels. - - - Fired when the bot connects to a Discord voice server. - - - Fired when the connected account is updated. - - - Fired when a user starts typing. - - - Fired when a user joins a group channel. - - - Fired when a user is removed from a group channel. - - - - Fired when an invite is created. - - - - This event is fired when an invite is created. The event handler must return a - and accept a as its parameter. - - - The invite created will be passed into the parameter. - - - - - - Fired when an invite is deleted. - - - - This event is fired when an invite is deleted. The event handler must return - a and accept a and - as its parameter. - - - The channel where this invite was created will be passed into the parameter. - - - The code of the deleted invite will be passed into the parameter. - - - - - - Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands, autocompletes. - - - - This event is fired when an interaction is created. The event handler must return a - and accept a as its parameter. - - - The interaction created will be passed into the parameter. - - - - - - Fired when a button is clicked and its interaction is received. - - - - - Fired when a select menu is used and its interaction is received. - - - - - Fired when a slash command is used and its interaction is received. - - - - - Fired when a user command is used and its interaction is received. - - - - - Fired when a message command is used and its interaction is received. - - - - - Fired when an autocomplete is used and its interaction is received. - - - - - Fired when a guild application command is created. - - - - This event is fired when an application command is created. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a guild application command is updated. - - - - This event is fired when an application command is updated. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a guild application command is deleted. - - - - This event is fired when an application command is deleted. The event handler must return a - and accept a as its parameter. - - - The command that was deleted will be passed into the parameter. - - - This event is an undocumented discord event and may break at any time, its not recommended to rely on this event - - - - - - Fired when a thread is created within a guild, or when the current user is added to a thread. - - - - - Fired when a thread is updated within a guild. - - - - - Fired when a thread is deleted. - - - - - Fired when a user joins a thread - - - - - Fired when a user leaves a thread - - - - - Fired when a stage is started. - - - - - Fired when a stage ends. - - - - - Fired when a stage is updated. - - - - - Fired when a user requests to speak within a stage channel. - - - - - Fired when a speaker is added in a stage channel. - - - - - Fired when a speaker is removed from a stage channel. - - - - - Fired when a sticker in a guild is created. - - - - - Fired when a sticker in a guild is updated. - - - - - Fired when a sticker in a guild is deleted. - - - - - - - - - - - - - - - - - - - - - - - Provides access to a REST-only client with a shared state from this client. - - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - Creates a new REST/WebSocket Discord client. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - is - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when a shard is connected to the Discord gateway. - - - Fired when a shard is disconnected from the Discord gateway. - - - Fired when a guild data for a shard has finished downloading. - - - Fired when a shard receives a heartbeat from the Discord gateway. - - - - Represents a WebSocket-based Discord client. - - - - - Provides access to a REST-only client with a shared state from this client. - - - - Gets the shard of this client. - - - Gets the current connection state of this client. - - - - - - - - - - - - - - - - - - - - - - Gets a collection of direct message channels opened in this session. - - - This method returns a collection of currently opened direct message channels. - - This method will not return previously opened DM channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - - A collection of DM channels that have been opened in this session. - - - - - Gets a collection of group channels opened in this session. - - - This method returns a collection of currently opened group channels. - - This method will not return previously opened group channels outside of the current session! If you - have just started the client, this may return an empty collection. - - - - A collection of group channels that have been opened in this session. - - - - - Initializes a new REST/WebSocket-based Discord client. - - - - - Initializes a new REST/WebSocket-based Discord client with the provided configuration. - - The configuration to be used with the client. - - - - - - - - - - - - - - - - - - - - - - - - - Gets a generic channel from the cache or does a rest request if unavailable. - - - - var channel = await _client.GetChannelAsync(381889909113225237); - if (channel != null && channel is IMessageChannel msgChannel) - { - await msgChannel.SendMessageAsync($"{msgChannel} is created at {msgChannel.CreatedAt}"); - } - - - The snowflake identifier of the channel (e.g. `381889909113225237`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the channel associated - with the snowflake identifier; null when the channel cannot be found. - - - - - Gets a user from the cache or does a rest request if unavailable. - - - - var user = await _client.GetUserAsync(168693960628371456); - if (user != null) - Console.WriteLine($"{user} is created at {user.CreatedAt}."; - - - The snowflake identifier of the user (e.g. `168693960628371456`). - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the user associated with - the snowflake identifier; null if the user is not found. - - - - - Clears all cached channels from the client. - - - - - Clears cached DM channels from the client. - - - - - - - - - - - Gets a global application command. - - The id of the command. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains the application command if found, otherwise - . - - - - - Gets a collection of all global commands. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of global - application commands. - - - - - Clears cached users from the client. - - - - - - - - Gets a sticker. - - The unique identifier of the sticker. - A sticker if found, otherwise . - - - - - - - - - - - - - - The following example sets the status of the current user to Do Not Disturb. - - await client.SetStatusAsync(UserStatus.DoNotDisturb); - - - - - - - - The following example sets the activity of the current user to the specified game name. - - await client.SetGameAsync("A Strange Game"); - - - - The following example sets the activity of the current user to a streaming status. - - await client.SetGameAsync("Great Stream 10/10", "https://twitch.tv/MyAmazingStream1337", ActivityType.Streaming); - - - - - - - - - Unexpected channel type is created. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fired when connected to the Discord gateway. - - - Fired when disconnected to the Discord gateway. - - - - Fired when guild data has finished downloading. - - - It is possible that some guilds might be unsynced if - was not long enough to receive all GUILD_AVAILABLEs before READY. - - - - Fired when a heartbeat is received from the Discord gateway. - - - - Represents a configuration class for . - - - This configuration, based on , helps determine several key configurations the - socket client depend on. For instance, shards and connection timeout. - - - The following config enables the message cache and configures the client to always download user upon guild - availability. - - var config = new DiscordSocketConfig - { - AlwaysDownloadUsers = true, - MessageCacheSize = 100 - }; - var client = new DiscordSocketClient(config); - - - - - - Returns the encoding gateway should use. - - - - - Gets or sets the WebSocket host to connect to. If null, the client will use the - /gateway endpoint. - - - - - Gets or sets the time, in milliseconds, to wait for a connection to complete before aborting. - - - - - Gets or sets the ID for this shard. Must be less than . - - - - - Gets or sets the total number of shards for this application. - - - - - Gets or sets the number of messages per channel that should be kept in cache. Setting this to zero - disables the message cache entirely. - - - - - Gets or sets the max number of users a guild may have for offline users to be included in the READY - packet. The maximum value allowed is 250. - - - - - Gets or sets the provider used to generate new WebSocket connections. - - - - - Gets or sets the provider used to generate new UDP sockets. - - - - - Gets or sets whether or not all users should be downloaded as guilds come available. - - - - By default, the Discord gateway will only send offline members if a guild has less than a certain number - of members (determined by in this library). This behavior is why - sometimes a user may be missing from the WebSocket cache for collections such as - . - - - This property ensures that whenever a guild becomes available (determined by - ), incomplete user chunks will be - downloaded to the WebSocket cache. - - - For more information, please see - Request Guild Members - on the official Discord API documentation. - - - 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 - 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 - - or - as a backup. - - - - - - Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. - Setting this property to nulldisables this check. - - - - - Gets or sets the maximum identify concurrency. - - - This information is provided by Discord. - It is only used when using a and auto-sharding is disabled. - - - - - Gets or sets the maximum wait time in milliseconds between GUILD_AVAILABLE events before firing READY. - If zero, READY will fire as soon as it is received and all guilds will be unavailable. - - - This property is measured in milliseconds; negative values will throw an exception. - If a guild is not received before READY, it will be unavailable. - - - A representing the maximum wait time in milliseconds between GUILD_AVAILABLE events - before firing READY. - - Value must be at least 0. - - - - Gets or sets gateway intents to limit what events are sent from Discord. - The default is . - - - For more information, please see - GatewayIntents - on the official Discord API documentation. - - - - - Initializes a new instance of the class with the default configuration. - - - - - Represents a generic WebSocket-based audio channel. - - - - - Represents a generic WebSocket-based channel that can send and receive messages. - - - - - Gets all messages in this channel's cache. - - - A read-only collection of WebSocket-based messages. - - - - - Sends a message to this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The message to be sent. - Determines whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the message. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The file path of the file. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Sends a file to this message channel with an optional caption. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The of the file to be sent. - The name of the attachment. - The message to be sent. - Whether the message should be read aloud by Discord or not. - The to be sent. - The options to be used when sending the request. - Whether the message attachment should be hidden as a spoiler. - - Specifies if notifications are sent for mentioned users and roles in the message . - If null, all mentioned roles and users will be notified. - - The message references to be included. Used to reply to specific messages. - The message components to be included with this message. Used for interactions. - A collection of stickers to send with the file. - A array of s to send with this response. Max 10. - - A task that represents an asynchronous send operation for delivering the message. The task result - contains the sent message. - - - - - Gets a cached message from this channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return null. Please refer to - for more details. - - - This method retrieves the message from the local WebSocket cache and does not send any additional - request to Discord. This message may be a message that has been deleted. - - - The snowflake identifier of the message. - - A WebSocket-based message object; null if it does not exist in the cache or if caching is not - enabled. - - - - - Gets the last N cached messages from this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets the last N cached messages starting from a certain message in this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The message ID to start the fetching from. - The direction of which the message should be gotten from. - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets the last N cached messages starting from a certain message in this message channel. - - - - This method requires the use of cache, which is not enabled by default; if caching is not enabled, - this method will always return an empty collection. Please refer to - for more details. - - - This method retrieves the message(s) from the local WebSocket cache and does not send any additional - request to Discord. This read-only collection may include messages that have been deleted. The - maximum number of messages that can be retrieved from this method depends on the - set. - - - The message to start the fetching from. - The direction of which the message should be gotten from. - The number of messages to get. - - A read-only collection of WebSocket-based messages. - - - - - Gets a read-only collection of pinned messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation for retrieving pinned messages in this channel. - The task result contains a read-only collection of messages found in the pinned messages. - - - - - Represents a generic WebSocket-based channel that is private to select recipients. - - - - - Represents a WebSocket-based category channel. - - - - - - - - Gets the child channels of this category. - - - A read-only collection of whose - matches the snowflake identifier of this category - channel. - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based channel. - - - - - Gets when the channel is created. - - - - - Gets a collection of users from the WebSocket cache. - - - - Unexpected channel type is created. - - - - Gets a generic user from this channel. - - The snowflake identifier of the user. - - A generic WebSocket-based user associated with the snowflake identifier. - - - - - - - - - - - - - Unexpected type. - - - Unexpected type. - - - - Represents a WebSocket-based direct-message channel. - - - - - Gets the recipient of the channel. - - - - - - - - Gets a collection that is the current logged-in user and the recipient. - - - - - - - - - - - Gets the message associated with the given . - - TThe ID of the message. - The options to be used when sending the request. - - The message gotten from either the cache or the download, or null if none is found. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a user in this channel from the provided . - - The snowflake identifier of the user. - - A object that is a recipient of this channel; otherwise null. - - - - - Returns the recipient user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based private group channel. - - - - - - - - - - - Returns a collection representing all of the users in the group. - - - - - Returns a collection representing all users in the group, not including the client. - - - - - - - Voice is not yet supported for group channels. - - - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - Gets a user from this group. - - The snowflake identifier of the user. - - A WebSocket-based group user associated with the snowflake identifier. - - - - - Returns the name of the group. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Connecting to a group channel is not supported. - - - - - - - - - - Represents a WebSocket-based guild channel. - - - - - Gets the guild associated with this channel. - - - A guild object that this channel belongs to. - - - - - - - - - - - - - - Gets a collection of users that are able to view the channel. - - - A read-only collection of users that can access the channel (i.e. the users seen in the user list). - - - - - - - - - - - - - - Gets the permission overwrite for a specific user. - - The user to get the overwrite from. - - An overwrite object for the targeted user; null if none is set. - - - - - Gets the permission overwrite for a specific role. - - The role to get the overwrite from. - - An overwrite object for the targeted role; null if none is set. - - - - - Adds or updates the permission overwrite for the given user. - - The user to add the overwrite to. - The overwrite to add to the user. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Adds or updates the permission overwrite for the given role. - - The role to add the overwrite to. - The overwrite to add to the role. - The options to be used when sending the request. - - A task representing the asynchronous permission operation for adding the specified permissions to the channel. - - - - - Removes the permission overwrite for the given user, if one exists. - - The user to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Removes the permission overwrite for the given role, if one exists. - - The role to remove the overwrite from. - The options to be used when sending the request. - - A task representing the asynchronous operation for removing the specified permissions from the channel. - - - - - Gets the name of the channel. - - - A string that resolves to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based news channel in a guild that has the same properties as a . - - - - The property is not supported for news channels. - - - - - - - - This property is not supported by this type. Attempting to use this property will result in a . - - - - - - Represents a stage channel received over the gateway. - - - - - - - - - - - - - - - - - Returns if the current user is a speaker within the stage, otherwise . - - - - - Gets a collection of users who are speakers within the stage. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based channel in a guild that can send and receive messages. - - - - - - - - - - - - - - Gets the parent (category) of this channel in the guild's channel list. - - - An representing the parent of this channel; null if none is set. - - - - - - - - - - - - - - - - - - - - Gets a collection of threads within this text channel. - - - - - - - - Creates a thread within this . - - - When is the thread type will be based off of the - channel its created in. When called on a , it creates a . - When called on a , it creates a . The id of the created - thread will be the same as the id of the message, and as such a message can only have a - single thread created from it. - - The name of the thread. - - The type of the thread. - - Note: This parameter is not used if the parameter is not specified. - - - - The duration on which this thread archives after. - - Note: Options and - are only available for guilds that are boosted. You can check in the to see if the - guild has the THREE_DAY_THREAD_ARCHIVE and SEVEN_DAY_THREAD_ARCHIVE. - - - The message which to start the thread from. - The options to be used when sending the request. - - A task that represents the asynchronous create operation. The task result contains a - - - - - - - - Gets a message from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The snowflake identifier of the message. - The options to be used when sending the request. - - A task that represents an asynchronous get operation for retrieving the message. The task result contains - the retrieved message; null if no message is found with the specified identifier. - - - - - Gets the last N messages from this message channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The ID of the starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - Gets a collection of messages in this channel. - - - This method follows the same behavior as described in . - Please visit its documentation for more details on this method. - - The starting message to get the messages from. - The direction of the messages to be gotten from. - The numbers of message to be gotten from. - The options to be used when sending the request. - - Paged collection of messages. - - - - - - - - - - - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creates a webhook in this text channel. - - The name of the webhook. - The avatar of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - webhook. - - - - - Gets a webhook available in this text channel. - - The identifier of the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a webhook associated - with the identifier; null if the webhook is not found. - - - - - Gets the webhooks available in this text channel. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks that is available in this channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread channel inside of a guild. - - - - - - - - Gets the owner of the current thread. - - - - - Gets the current users within this thread. - - - - - - - - if this thread is private, otherwise - - - - - Gets the parent channel this thread resides in. - - - - - - - - - - - - - - - - - - - - - - - Gets a collection of cached users within this thread. - - - - - - - - Gets all users inside this thread. - - - If all users are not downloaded then this method will call and return the result. - - The options to be used when sending the request. - A task representing the download operation. - - - - Downloads all users that have access to this thread. - - The options to be used when sending the request. - A task representing the asynchronous download operation. - - - - - - - - - - Adds a user to this thread. - - The to add. - The options to be used when sending the request. - - A task that represents the asynchronous operation of adding a member to a thread. - - - - - Removes a user from this thread. - - The to remove from this thread. - The options to be used when sending the request. - - A task that represents the asynchronous operation of removing a user from this thread. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - - This method is not supported in threads. - - - - - Represents a WebSocket-based voice channel in a guild. - - - - - - - - - - - - - - Gets the parent (category) channel of this channel. - - - A category channel representing the parent of this channel; null if none is set. - - - - - - - - - - - Gets a collection of users that are currently connected to this voice channel. - - - A read-only collection of users that are currently connected to this voice channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based guild object. - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the number of members. - - - This property retrieves the number of members returned by Discord. - - - Due to how this property is returned by Discord instead of relying on the WebSocket cache, the - number here is the most accurate in terms of counting the number of users within this guild. - - - Use this instead of enumerating the count of the - collection, as you may see discrepancy - between that and this property. - - - - - - Gets the number of members downloaded to the local guild cache. - - - Indicates whether the client is connected to this guild. - - - - - - - - - Gets the user that owns this guild. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Indicates whether the client has all the members downloaded to the local guild cache. - - - Indicates whether the guild cache is synced to this guild. - - - - Gets the associated with this guild. - - - - - Gets the default channel in this guild. - - - This property retrieves the first viewable text channel for this guild. - - This channel does not guarantee the user can send message to it, as it only looks for the first viewable - text channel. - - - - A representing the first viewable channel that the user has access to. - - - - - Gets the AFK voice channel in this guild. - - - A that the AFK users will be moved to after they have idled for too - long; if none is set. - - - - - Gets the max bitrate for voice channels in this guild. - - - A representing the maximum bitrate value allowed by Discord in this guild. - - - - - Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. - - - A channel set within the server's widget settings; if none is set. - - - - - Gets the system channel where randomized welcome messages are sent in this guild. - - - A text channel where randomized welcome messages will be sent to; if none is set. - - - - - Gets the channel with the guild rules. - - - A text channel with the guild rules; if none is set. - - - - - Gets the channel where admins and moderators of Community guilds receive - notices from Discord. - - - A text channel where admins and moderators of Community guilds receive - notices from Discord; if none is set. - - - - - Gets a collection of all text channels in this guild. - - - A read-only collection of message channels found within this guild. - - - - - Gets a collection of all voice channels in this guild. - - - A read-only collection of voice channels found within this guild. - - - - - Gets a collection of all stage channels in this guild. - - - A read-only collection of stage channels found within this guild. - - - - - Gets a collection of all category channels in this guild. - - - A read-only collection of category channels found within this guild. - - - - - Gets a collection of all thread channels in this guild. - - - A read-only collection of thread channels found within this guild. - - - - - Gets the current logged-in user. - - - - - Gets the built-in role containing all users in this guild. - - - A role object that represents an @everyone role in this guild. - - - - - Gets a collection of all channels in this guild. - - - A read-only collection of generic channels found within this guild. - - - - - - - - Gets a collection of all custom stickers for this guild. - - - - - - - - Gets a collection of users in this guild. - - - This property retrieves all users found within this guild. - - - This property may not always return all the members for large guilds (i.e. guilds containing - 100+ users). If you are simply looking to get the number of users present in this guild, - consider using instead. - - - Otherwise, you may need to enable to fetch - the full user list upon startup, or use to manually download - the users. - - - - - A collection of guild users found within this guild. - - - - - Gets a collection of all roles in this guild. - - - A read-only collection of roles found within this guild. - - - - - - - - is . - - - - is . - - - - - - - - - - - - - Gets a collection of all users banned in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - ban objects that this guild currently possesses, with each object containing the user banned and reason - behind the ban. - - - - - Gets a ban object for a banned user. - - The banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - Gets a ban object for a banned user. - - The snowflake identifier for the banned user. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a ban object, which - contains the user information and the reason for the ban; if the ban entry cannot be found. - - - - - - - - - - - - - - - - - Gets a channel in this guild. - - The snowflake identifier for the channel. - - A generic channel associated with the specified ; if none is found. - - - - - Gets a text channel in this guild. - - The snowflake identifier for the text channel. - - A text channel associated with the specified ; if none is found. - - - - - Gets a thread in this guild. - - The snowflake identifier for the thread. - - A thread channel associated with the specified ; if none is found. - - - - - Gets a voice channel in this guild. - - The snowflake identifier for the voice channel. - - A voice channel associated with the specified ; if none is found. - - - - - Gets a stage channel in this guild. - - The snowflake identifier for the stage channel. - - A stage channel associated with the specified ; if none is found. - - - - - Gets a category channel in this guild. - - The snowflake identifier for the category channel. - - A category channel associated with the specified ; if none is found. - - - - - Creates a new text channel in this guild. - - - The following example creates a new text channel under an existing category named Wumpus with a set topic. - - 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}."; - }); - - - The new name for the text channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - text channel. - - - - - Creates a new voice channel in this guild. - - The new name for the voice channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - voice channel. - - - - - Creates a new stage channel in this guild. - - The new name for the stage channel. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the newly created - stage channel. - - - - - Creates a new channel category in this guild. - - The new name for the category. - The delegate containing the properties to be applied to the channel upon its creation. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - category channel. - - - - - Gets a collection of all the voice regions this guild can access. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - voice regions the guild can access. - - - - - Deletes all application commands in the current guild. - - The options to be used when sending the request. - - A task that represents the asynchronous delete operation. - - - - - Gets a collection of slash commands created by the current user in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - slash commands created by the current user. - - - - - Gets an application command within this guild with the specified id. - - The id of the application command to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A ValueTask that represents the asynchronous get operation. The task result contains a - if found, otherwise . - - - - - Creates an application command within this guild. - - The properties to use when creating the command. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the command that was created. - - - - - Overwrites the application commands within this guild. - - A collection of properties to use when creating the commands. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains a collection of commands that was created. - - - - - Gets a collection of all invites in this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection of - invite metadata, each representing information for an invite found within this guild. - - - - - Gets the vanity invite URL of this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the partial metadata of - the vanity invite found within this guild; if none is found. - - - - - Gets a role in this guild. - - The snowflake identifier for the role. - - A role that is associated with the specified ; if none is found. - - - - - - - - Creates a new role with the provided name. - - The new name for the role. - The guild permission that the role should possess. - The color of the role. - Whether the role is separated from others on the sidebar. - Whether the role can be mentioned. - The options to be used when sending the request. - is . - - A task that represents the asynchronous creation operation. The task result contains the newly created - role. - - - - - - - - Gets a user from this guild. - - - This method retrieves a user found within this guild. - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds. - - - The snowflake identifier of the user. - - A guild user associated with the specified ; if none is found. - - - - - - - - Gets a collection of all users in this guild. - - - This method retrieves all users found within this guild throught REST. - Users returned by this method are not cached. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users found within this guild. - - - - - - - - Gets a collection of users in this guild that the name or nickname starts with the - provided at . - - - The can not be higher than . - - The partial name or nickname to search. - The maximum number of users to be gotten. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a collection of guild - users that the name or nickname starts with the provided at . - - - - - Gets the specified number of audit log entries for this guild. - - The number of audit log entries to fetch. - The options to be used when sending the request. - The audit log entry ID to filter entries before. - The type of actions to filter. - The user ID to filter entries for. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of the requested audit log entries. - - - - - Gets a webhook found within this guild. - - The identifier for the webhook. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the webhook with the - specified ; if none is found. - - - - - Gets a collection of all webhook from this guild. - - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of webhooks found within the guild. - - - - - - - - - - - - - - is . - - - - - - - Moves the user to the voice channel. - - The user to move. - the channel where the user gets moved to. - A task that represents the asynchronous operation for moving a user. - - - - Disconnects the user from its current voice channel - - The user to disconnect. - A task that represents the asynchronous operation for disconnecting a user. - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains the sticker found with the - specified ; if none is found. - - - - - Gets a specific sticker within this guild. - - The id of the sticker to get. - A sticker, if none is found then . - - - - Gets a collection of all stickers within this guild. - - The that determines whether the object should be fetched from cache. - The options to be used when sending the request. - - A task that represents the asynchronous get operation. The task result contains a read-only collection - of stickers found within the guild. - - - - - Creates a new sticker in this guild. - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The image of the new emote. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The path of the file to upload. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Creates a new sticker in this guild - - The name of the sticker. - The description of the sticker. - The tags of the sticker. - The stream containing the file data. - The name of the file with the extension, ex: image.png. - The options to be used when sending the request. - - A task that represents the asynchronous creation operation. The task result contains the created sticker. - - - - - Deletes a sticker within this guild. - - The sticker to delete. - The options to be used when sending the request. - - A task that represents the asynchronous removal operation. - - - - - Gets the name of the guild. - - - A string that resolves to . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Gets the message associated with this message command. - - - - - - Note Not implemented for - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Gets the user who this command targets. - - - - - - Note Not implemented for - - - - - Represents a Websocket-based interaction type for Message Components. - - - - - The data received with this interaction, contains the button that was clicked. - - - - - The message that contained the trigger for this interaction. - - - - - - - - Updates the message which this component resides in with the type - - A delegate containing the properties to modify the message with. - The request options for this request. - A task that represents the asynchronous operation of updating the message. - - - - - - - - - - - - - Defers an interaction and responds with type 5 () - - to send this message ephemerally, otherwise . - The request options for this request. - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - - - - Represents the data sent with a . - - - - - The components Custom Id that was clicked - - - - - The type of the component clicked - - - - - The value(s) of a interaction response. - - - - - Represents a received over the gateway. - - - - - The autocomplete data of this interaction. - - - - - Responds to this interaction with a set of choices. - - - The set of choices for the user to pick from. - - A max of 20 choices are allowed. Passing for this argument will show the executing user that - there is no choices for their autocompleted input. - - - The request options for this response. - - A task that represents the asynchronous operation of responding to this interaction. - - - - - Responds to this interaction with a set of choices. - - The request options for this response. - - The set of choices for the user to pick from. - - A max of 20 choices are allowed. Passing for this argument will show the executing user that - there is no choices for their autocompleted input. - - - - A task that represents the asynchronous operation of responding to this interaction. - - - - - - - - - - - - - - - - - - - - Represents data for a slash commands autocomplete interaction. - - - - - Gets the name of the invoked command. - - - - - Gets the id of the invoked command. - - - - - Gets the type of the invoked command. - - - - - Gets the version of the invoked command. - - - - - Gets the current autocomplete option that is actively being filled out. - - - - - Gets a collection of all the other options the executing users has filled out. - - - - - Represents a Websocket-based slash command received over the gateway. - - - - - The data associated with this interaction. - - - - - Represents the data tied with the interaction. - - - - - Represents a Websocket-based received by the gateway. - - - - - - - - - - - - - - The sub command options received for this sub command group. - - - - - Represents a Websocket-based . - - - - - if this command is a global command, otherwise . - - - - - - - - - - - - - - - - - - - - A collection of 's for this command. - - - If the is not a slash command, this field will be an empty collection. - - - - - - - - Returns the guild this command resides in, if this command is a global command then it will return - - - - - - - - - - - - - - Represents a choice for a . - - - - - - - - - - - Represents an option for a . - - - - - - - - - - - - - - - - - - - - Choices for string and int types for the user to pick from. - - - - - If the option is a subcommand or subcommand group type, this nested options will be the parameters. - - - - - The allowed channel types for this option. - - - - - Base class for User, Message, and Slash command interactions. - - - - - Gets the name of the invoked command. - - - - - Gets the id of the invoked command. - - - - - The data associated with this interaction. - - - - - - - - - - - - - - - - - Acknowledges this interaction with the . - - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - Represents the base data tied with the interaction. - - - - - - - - The received with this interaction. - - - - - Represents the base data tied with the interaction. - - - - - Represents an Interaction received over the gateway. - - - - - The this interaction was used in. - - - - - The who triggered this interaction. - - - - - The type of this interaction. - - - - - The token used to respond to this interaction. - - - - - The data sent with this interaction. - - - - - The version of this interaction. - - - - - - - - if the token is valid for replying to, otherwise . - - - - - Responds to an Interaction with type . - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - Message content is too long, length must be less or equal to . - The parameters provided were invalid or the token was invalid. - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - The file to upload. - The file name of the attachment. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Sends a followup message for this interaction. - - The text of the message to be sent. - The file to upload. - The file name of the attachment. - A array of embeds to send with this response. Max 10. - if the message should be read out by a text-to-speech reader, otherwise . - if the response should be hidden to everyone besides the invoker of the command, otherwise . - The allowed mentions for this response. - The request options for this response. - A to be sent with this response. - A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - - The sent message. - - - - - Gets the original response for this interaction. - - The request options for this request. - A that represents the initial response. - - - - Edits original response for this interaction. - - A delegate containing the properties to modify the message with. - The request options for this request. - A that represents the initial response. - - - - Acknowledges this interaction. - - to send this message ephemerally, otherwise . - The request options for this request. - - A task that represents the asynchronous operation of acknowledging the interaction. - - - - - - - - - - - - - - Represents a WebSocket-based invite to a guild. - - - - - - - - Gets the channel where this invite was created. - - - - - - - - Gets the guild where this invite was created. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the time (in seconds) until the invite expires. - - - - - Gets the max number of uses this invite may have. - - - - - Gets the number of times this invite has been used. - - - - - Gets the user that created this invite if available. - - - - - - - - Gets when this invite was created. - - - - - Gets the user targeted by this invite if available. - - - - - Gets the type of the user targeted by this invite. - - - - - - - - - - - - - - Gets the URL of the invite. - - - A string that resolves to the Url of the invite. - - - - - - - - - - - - - - - - is less than 0. - - - - Represents a WebSocket-based message. - - - - - Gets the author of this message. - - - A WebSocket-based user object. - - - - - Gets the source channel of the message. - - - A WebSocket-based message channel. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the interaction this message is a response to. - - - - - - - - - - - Returns all attachments included in this message. - - - Collection of attachments. - - - - - Returns all embeds included in this message. - - - Collection of embed objects. - - - - - Returns the channels mentioned in this message. - - - Collection of WebSocket-based guild channels. - - - - - Returns the roles mentioned in this message. - - - Collection of WebSocket-based roles. - - - - - - - - - - - - - - Returns the users mentioned in this message. - - - Collection of WebSocket-based users. - - - - - - - - - - - Gets the content of the message. - - - Content of the message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based reaction object. - - - - - Gets the ID of the user who added the reaction. - - - This property retrieves the snowflake identifier of the user responsible for this reaction. This - property will always contain the user identifier in event that - cannot be retrieved. - - - A user snowflake identifier associated with the user. - - - - - Gets the user who added the reaction if possible. - - - - This property attempts to retrieve a WebSocket-cached user that is responsible for this reaction from - the client. In other words, when the user is not in the WebSocket cache, this property may not - contain a value, leaving the only identifiable information to be - . - - - If you wish to obtain an identifiable user object, consider utilizing - which will attempt to retrieve the user from REST. - - - - A user object where possible; a value is not always returned. - - - - - - Gets the ID of the message that has been reacted to. - - - A message snowflake identifier associated with the message. - - - - - Gets the message that has been reacted to if possible. - - - A WebSocket-based message where possible; a value is not always returned. - - - - - - Gets the channel where the reaction takes place in. - - - A WebSocket-based message channel. - - - - - - - - - - - - - - Represents a WebSocket-based message sent by the system. - - - - - Represents a WebSocket-based message sent by a user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Only the author of a message may modify the message. - Message content is too long, length must be less or equal to . - - - - - - - - - - - - - This operation may only be called on a channel. - - - - Represents a WebSocket-based role to be given to a guild user. - - - - - Gets the guild that owns this role. - - - A representing the parent guild of this role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns a value that determines if the role is an @everyone role. - - - true if the role is @everyone; otherwise false. - - - - - - - - Returns an IEnumerable containing all that have this role. - - - - - - - - - - - - - - Gets the name of the role. - - - A string that resolves to . - - - - - - - - - - - - - - Represents a custom sticker within a guild received over the gateway. - - - - - Gets the user that uploaded the guild sticker. - - - - This may return in the WebSocket implementation due to incomplete user collection in - large guilds, or the bot doesn't have the MANAGE_EMOJIS_AND_STICKERS permission. - - - - - - Gets the guild the sticker was created in. - - - - - - - - - - - - - - Represents a general sticker received over the gateway. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents an unknown sticker received over the gateway. - - - - - - - - - - - - - - - - - - - - - - - Attempts to try to find the sticker. - - - The sticker representing this unknown stickers Id, if none is found then . - - - - - Represents a WebSocket-based group user. - - - - - Gets the group channel of the user. - - - A representing the channel of which the user belongs to. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based guild user. - - - - - Gets the guild the user is in. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Returns a collection of roles that the user possesses. - - - - - Returns the voice channel the user is in, or null if none. - - - - - - - - Gets the voice connection status of the user if any. - - - A representing the user's voice status; null if the user is not - connected to a voice channel. - - - - - - - - Returns the position of the user within the role hierarchy. - - - The returned value equal to the position of the highest role the user has, or - if user is the server owner. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents the WebSocket user's presence status. This may include their online status and their activity. - - - - - - - - - - - - - - Creates a new containing all of the client types - where a user is active from the data supplied in the Presence update frame. - - - A dictionary keyed by the - and where the value is the . - - - A collection of all s that this user is active. - - - - - Creates a new containing all the activities - that a user has from the data supplied in the Presence update frame. - - - A list of . - - - A list of all that this user currently has available. - - - - - Gets the status of the user. - - - A string that resolves to . - - - - - Represents the logged-in WebSocket-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a thread user received over the gateway. - - - - - Gets the this user is in. - - - - - Gets the timestamp for when this user joined this thread. - - - - - Gets the guild this user is in. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the guild user of this thread user. - - - - - - Represents a WebSocket-based user that is yet to be recognized by the client. - - - A user may not be recognized due to the user missing from the cache or failed to be recognized properly. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This field is not supported for an unknown user. - - - - Represents a WebSocket-based user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets mutual guilds shared with this user. - - - This property will only include guilds in the same . - - - - - - - - - - - - - - - - - Gets the full name of the user (e.g. Example#0001). - - - The full name of the user. - - - - - Represents a WebSocket user's voice connection status. - - - - - Initializes a default with everything set to null or false. - - - - - Gets the voice channel that the user is currently in; or null if none. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the name of this voice channel. - - - A string that resolves to name of this voice channel; otherwise "Unknown". - - - - - - - - Represents a WebSocket-based webhook user. - - - - Gets the guild of this webhook. - - - - - - - - - - - - - - - - Webhook users does not support banners. - - - - Webhook users does not support accent colors. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Webhook users cannot be kicked. - - - - Webhook users cannot be modified. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - Roles are not supported on webhook users. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a WebSocket-based voice server. - - - - - Gets the guild associated with the voice server. - - - A cached entity of the guild. - - - - - Gets the endpoint URL of the voice server host. - - - An URL representing the voice server host. - - - - - Gets the voice connection token. - - - A voice connection token. - - - - - The exception thrown when the gateway client has been requested to reconnect. - - - - - Initializes a new instance of the class with the reconnection - message. - - The reason why the gateway has been requested to reconnect. - - - Creates a new REST/WebSocket discord client. - - - - - - Wraps another stream with a timed buffer. - - - Reads the payload from an RTP frame - - - Converts Opus to PCM - - - Header received with no payload. - - - Received payload without an RTP header. - - - Converts PCM to Opus - - - Wraps an IAudioClient, sending voice data on write. - - - Reads the payload from an RTP frame - - - The token has had cancellation requested. - The associated has been disposed. - - - Wraps data in an RTP frame - - - - Decrypts an RTP frame using libsodium. - - - - - Encrypts an RTP frame using libsodium. - - - - Header received with no payload. - - - Received payload without an RTP header. - The token has had cancellation requested. - The associated has been disposed. - - - The sharded variant of , which may contain the client, user, guild, channel, and message. - - - Gets the that the command is executed with. - - - Gets the shard ID of the command context. - - - - - - - Represents a WebSocket-based context of a command. This may include the client, guild, channel, user, and message. - - - - - Gets the that the command is executed with. - - - - - Gets the that the command is executed in. - - - - - Gets the that the command is executed in. - - - - - Gets the who executed the command. - - - - - Gets the that the command is interpreted from. - - - - - Indicates whether the channel that the command is executed in is a private channel. - - - - - Initializes a new class with the provided client and message. - - The underlying client. - The underlying message. - - - - - - - - - - - - - - - - - - The default WebSocketProvider is not supported on this platform. - - - diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 57a705b30a..0f695f4c61 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -7,25 +7,9 @@ A core Discord.Net Labs library containing the Webhook client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 - Discord.Net.Labs.Webhook - https://github.com/Discord-Net-Labs/Discord.Net-Labs - https://github.com/Discord-Net-Labs/Discord.Net-Labs - PackageLogo.png - - - ..\Discord.Net.Webhook\Discord.Net.Webhook.xml - - - Always - - - True - - - diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml b/src/Discord.Net.Webhook/Discord.Net.Webhook.xml deleted file mode 100644 index d1bafb9a37..0000000000 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - Discord.Net.Webhook - - - - A client responsible for connecting as a Webhook. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - Creates a new Webhook Discord client. - - - - Creates a new Webhook Discord client. - - The url of the webhook. - The configuration options to use for this client. - Thrown if the is an invalid format. - Thrown if the is null or whitespace. - - - Sends a message to the channel for this webhook. - Returns the ID of the created message. - - - - Modifies a message posted using this webhook. - - - This method can only modify messages that were sent using the same webhook. - - ID of the modified message. - A delegate containing the properties to modify the message with. - The options to be used when sending the request. - - A task that represents the asynchronous modification operation. - - - - - Deletes a message posted using this webhook. - - - This method can only delete messages that were sent using the same webhook. - - ID of the deleted message. - The options to be used when sending the request. - - A task that represents the asynchronous deletion operation. - - - - Sends a message to the channel for this webhook with an attachment. - Returns the ID of the created message. - - - Sends a message to the channel for this webhook with an attachment. - Returns the ID of the created message. - - - Modifies the properties of this webhook. - - - Deletes this webhook from Discord and disposes the client. - - - - Properties that are used to modify an Webhook message with the specified changes. - - - - - Gets or sets the content of the message. - - - This must be less than the constant defined by . - - - - - Gets or sets the embed array that the message should display. - - - - - Gets or sets the allowed mentions of the message. - - - - - Gets or sets the components that the message should display. - - - - Could not find a webhook with the supplied credentials. - - - From 978b3cdae4b5963125d2c2f2b90fbe2dbb775a66 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 04:04:46 -0300 Subject: [PATCH 396/494] Update package ids --- src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj | 3 ++- src/Discord.Net.Commands/Discord.Net.Commands.csproj | 2 ++ src/Discord.Net.Core/Discord.Net.Core.csproj | 1 + .../Discord.Net.Providers.WS4Net.csproj | 3 ++- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 1 + src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj | 1 + src/Discord.Net.Webhook/Discord.Net.Webhook.csproj | 1 + 7 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj index ae4f7a78c3..b28d9c2c12 100644 --- a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj +++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj @@ -1,10 +1,11 @@ - + Discord.Net.Analyzers Discord.Analyzers A Discord.Net extension adding support for design-time analysis of the API usage. netstandard2.0;netstandard2.1 + Discord.Net.Labs.Analyzers ..\Discord.Net.Analyzers\Discord.Net.Analyzers.xml diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj index af2293ac98..d71847b54e 100644 --- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj @@ -7,6 +7,8 @@ A Discord.Net Labs extension adding support for bot commands. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 + Discord.Net.Labs.Commands + diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj index 85769f1c56..8a00e6d0bd 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.csproj +++ b/src/Discord.Net.Core/Discord.Net.Core.csproj @@ -7,6 +7,7 @@ The core components for the Discord.Net Labs library. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 + Discord.Net.Labs.Core diff --git a/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj b/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj index e143340e17..ec7ee9b8f2 100644 --- a/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj +++ b/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj @@ -3,8 +3,9 @@ Discord.Net.Providers.WS4Net Discord.Providers.WS4Net - An optional WebSocket client provider for Discord.Net using WebSocket4Net + An optional WebSocket client provider for Discord.Net Labs using WebSocket4Net netstandard2.0 + Discord.Net.Labs.Providers.WS4Net diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index f428b39fbf..10f4d317d6 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -7,6 +7,7 @@ A core Discord.Net Labs library containing the REST client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 + Discord.Net.Labs.Rest diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj index ac3d3b5ba3..2702457f03 100644 --- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj +++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj @@ -8,6 +8,7 @@ net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 true + Discord.Net.Labs.WebSocket diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 0f695f4c61..9875cb6282 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -7,6 +7,7 @@ A core Discord.Net Labs library containing the Webhook client and models. net5.0;net461;netstandard2.0;netstandard2.1 net5.0;netstandard2.0;netstandard2.1 + Discord.Net.Labs.Webhook From 9a7e92503080ce38de9568264a05662dfe73d40d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 05:19:42 -0300 Subject: [PATCH 397/494] Fix url validation --- src/Discord.Net.Core/Utils/UrlValidation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs index 2699bdc9ff..e5c7eff862 100644 --- a/src/Discord.Net.Core/Utils/UrlValidation.cs +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -16,7 +16,7 @@ public static bool Validate(string url, bool allowAttachments = false) { if (string.IsNullOrEmpty(url)) return false; - if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || allowAttachments ? url.StartsWith("attachment://", StringComparison.Ordinal) : false)) + if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || (allowAttachments ? url.StartsWith("attachment://", StringComparison.Ordinal) : false))) throw new InvalidOperationException($"The url {url} must include a protocol (either {(allowAttachments ? "HTTP, HTTPS, or ATTACHMENT" : "HTTP or HTTPS")})"); return true; } From 136b5c1cbf9063789d891dd0ebdd9133c752c992 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 05:29:08 -0300 Subject: [PATCH 398/494] meta: bump version --- Discord.Net.targets | 2 +- src/Discord.Net/Discord.Net.nuspec | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Discord.Net.targets b/Discord.Net.targets index f303f4594e..67136d5869 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,6 +1,6 @@ - 3.1.2 + 3.1.3 latest Discord.Net Contributors discord;discordapp diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index dec3cc7a06..c84eca1999 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.2$suffix$ + 3.1.3$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,28 +14,28 @@ https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png - + - + - + - + From fda95c7b705d5b9a629ef27268501ccba1db207d Mon Sep 17 00:00:00 2001 From: Emily <89871431+emillly-b@users.noreply.github.com> Date: Tue, 12 Oct 2021 14:58:41 -0500 Subject: [PATCH 399/494] Fix assignment of UserMentions (#233) --- src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index bbadb8ce51..4be9f4c5a6 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -118,8 +118,7 @@ public abstract class SocketMessage : SocketEntity, IMessage /// /// Collection of WebSocket-based users. /// - public IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); - + public IReadOnlyCollection MentionedUsers => _userMentions; /// public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); From 33a96ab8d947cdd551e0ac3008d5d93154ecfb6b Mon Sep 17 00:00:00 2001 From: Emily <89871431+emillly-b@users.noreply.github.com> Date: Tue, 12 Oct 2021 15:00:21 -0500 Subject: [PATCH 400/494] Fix CleanContent (#231) --- src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 01a861cc54..6b9e134c1c 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -248,7 +248,7 @@ private static string UrlEncode(string text) } public static string SanitizeMessage(IMessage message) { - var newContent = MentionUtils.Resolve(message, 0, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize, TagHandling.Sanitize); + var newContent = MentionUtils.Resolve(message, 0, TagHandling.FullName, TagHandling.FullName, TagHandling.FullName, TagHandling.FullName, TagHandling.FullName); newContent = Format.StripMarkDown(newContent); return newContent; } From ae3f60bcdeb4c561066caf3a63bc892156af2d13 Mon Sep 17 00:00:00 2001 From: Emily <89871431+emillly-b@users.noreply.github.com> Date: Tue, 12 Oct 2021 15:28:55 -0500 Subject: [PATCH 401/494] Fix SocketSlashCommandData access modifier. (#237) Fixes #229 --- .../Entities/Interaction/Slash Commands/SocketSlashCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index 0594bc09b1..26614b5726 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -11,7 +11,7 @@ public class SocketSlashCommand : SocketCommandBase /// /// The data associated with this interaction. /// - private new SocketSlashCommandData Data { get; } + public new SocketSlashCommandData Data { get; } internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) From 03209c46e7bf5221d91ba522d165592c7961951c Mon Sep 17 00:00:00 2001 From: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> Date: Tue, 12 Oct 2021 22:44:08 +0200 Subject: [PATCH 402/494] 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 --- README.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4074c1c170..c3343cd384 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,27 @@ -# Discord.Net Labs -[![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000&logo=nuget)](https://www.nuget.org/packages/Discord.Net.Labs) -[![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dvSfUTet3K) +

+ + Logo + +
+
+ + NuGet + + + MyGet + + + Build Status + + + Discord + +

This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs -If this projects benefits you (*and you're financially stable*) consider donating or becoming a sponsor as it really helps out! +### ♥ Sponsor us! +- If this library benefits you consider [sponsoring](https://github.com/sponsors/quinchs) the project as it really helps out. *Only sponsor if you're financially stable!* ## Known issues Labs will not work with normal package of Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib. You can instead use the [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs) package which implements some of the features added in Discord.Net-Labs. @@ -16,6 +33,7 @@ Setting up labs in your project is really simple, here's how to do it: 3) Enjoy! ## Branches + ### Dev This branch is kept up to date with dnets dev branch. we pull of it to ensure that labs will work with pre existing dnet code. From 4c9b396fccf38c8cbd489e156f2eeb903263ec21 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 18:22:04 -0300 Subject: [PATCH 403/494] Implement checks for interaction respond times and multiple interaction responses. closes #236, #235 --- .../Interactions/InteractionHelper.cs | 12 +++ .../SocketMessageComponent.cs | 85 +++++++++++++++++-- .../SocketBaseCommand/SocketCommandBase.cs | 42 ++++++++- .../Entities/Interaction/SocketInteraction.cs | 11 +-- 4 files changed, 131 insertions(+), 19 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index f1b1e67bd6..44ee7ac229 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -11,7 +11,19 @@ namespace Discord.Rest { internal static class InteractionHelper { + public const double ResponseTimeLimit = 3; + public const double ResponseAndFollowupLimit = 15; + #region InteractionHelper + public static bool CanSendResponse(IDiscordInteraction interaction) + { + return (DateTime.UtcNow - interaction.CreatedAt).TotalSeconds < ResponseTimeLimit; + } + public static bool CanRespondOrFollowup(IDiscordInteraction interaction) + { + return (DateTime.UtcNow - interaction.CreatedAt).TotalMinutes <= ResponseAndFollowupLimit; + } + public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) { return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, Array.Empty(), options); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index 624861182d..926563c4cf 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -25,6 +25,9 @@ public class SocketMessageComponent : SocketInteraction ///
public SocketUserMessage Message { get; private set; } + private object _lock = new object(); + internal override bool _hasResponded { get; set; } = false; + internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { @@ -82,6 +85,9 @@ public override async Task RespondAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + embeds ??= Array.Empty(); if (embed != null) embeds = new[] { embed }.Concat(embeds).ToArray(); @@ -122,7 +128,20 @@ public override async Task RespondAsync( if (ephemeral) response.Data.Value.Flags = MessageFlags.Ephemeral; - await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); + } + } + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// @@ -139,6 +158,9 @@ public async Task UpdateAsync(Action func, RequestOptions opt if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + if (args.AllowedMentions.IsSpecified) { var allowedMentions = args.AllowedMentions.Value; @@ -201,7 +223,20 @@ public async Task UpdateAsync(Action func, RequestOptions opt } }; - await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); + } + } + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// @@ -238,7 +273,7 @@ public override async Task FollowupAsync( if (ephemeral) args.Flags = MessageFlags.Ephemeral; - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options).ConfigureAwait(false); } /// @@ -280,7 +315,7 @@ public override async Task FollowupWithFileAsync( if (ephemeral) args.Flags = MessageFlags.Ephemeral; - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options).ConfigureAwait(false); } /// @@ -321,7 +356,7 @@ public override async Task FollowupWithFileAsync( if (ephemeral) args.Flags = MessageFlags.Ephemeral; - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options).ConfigureAwait(false); } /// @@ -332,27 +367,59 @@ public override async Task FollowupWithFileAsync( /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = null) + public async Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = null) { + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot defer an interaction after {InteractionHelper.ResponseTimeLimit} seconds of no response/acknowledgement"); + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, Data = ephemeral ? new API.InteractionCallbackData { Flags = MessageFlags.Ephemeral } : Optional.Unspecified }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); + } + } + + await Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// - public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) + public override async Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot defer an interaction after {InteractionHelper.ResponseTimeLimit} seconds of no response/acknowledgement"); + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredUpdateMessage, Data = ephemeral ? new API.InteractionCallbackData { Flags = MessageFlags.Ephemeral } : Optional.Unspecified }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); + } + } + + await Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 586b785f5f..66d10fd3b0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -31,6 +31,10 @@ public ulong CommandId /// internal new SocketCommandBaseData Data { get; } + internal override bool _hasResponded { get; set; } + + private object _lock = new object(); + internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { @@ -77,6 +81,9 @@ public override async Task RespondAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + embeds ??= Array.Empty(); if (embed != null) embeds = new[] { embed }.Concat(embeds).ToArray(); @@ -115,7 +122,20 @@ public override async Task RespondAsync( } }; - await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond twice to the same interaction"); + } + } + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// @@ -247,8 +267,11 @@ public override async Task FollowupWithFileAsync( /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) + public override async Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot defer an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, @@ -258,7 +281,20 @@ public override Task DeferAsync(bool ephemeral = false, RequestOptions options = } }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); + } + } + + await Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 2863e772db..20d8fa0f53 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -47,11 +47,13 @@ public abstract class SocketInteraction : SocketEntity, IDiscordInteracti public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); + internal abstract bool _hasResponded { get; set; } + /// /// if the token is valid for replying to, otherwise . /// public bool IsValidToken - => CheckToken(); + => InteractionHelper.CanRespondOrFollowup(this); internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) @@ -210,12 +212,7 @@ public async Task ModifyOriginalResponseAsync(Action public abstract Task DeferAsync(bool ephemeral = false, RequestOptions options = null); - - private bool CheckToken() - { - // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction - return (DateTime.UtcNow - CreatedAt.UtcDateTime).TotalMinutes <= 15d; - } + #endregion #region IDiscordInteraction From a8625076308b559d79174cba1d9ccf9e13807d26 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 20:58:34 -0300 Subject: [PATCH 404/494] Add response check to socket auto complete --- .../SocketAutocompleteInteraction.cs | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs index 6aa18db231..e58589c08a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs @@ -18,6 +18,9 @@ public class SocketAutocompleteInteraction : SocketInteraction /// public new SocketAutocompleteInteractionData Data { get; } + internal override bool _hasResponded { get; set; } + private object _lock = new object(); + internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { @@ -50,8 +53,25 @@ internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, /// /// A task that represents the asynchronous operation of responding to this interaction. /// - public Task RespondAsync(IEnumerable result, RequestOptions options = null) - => InteractionHelper.SendAutocompleteResultAsync(Discord, result, Id, Token, options); + public async Task RespondAsync(IEnumerable result, RequestOptions options = null) + { + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond twice to the same interaction"); + } + } + + await InteractionHelper.SendAutocompleteResultAsync(Discord, result, Id, Token, options).ConfigureAwait(false); + lock (_lock) + { + _hasResponded = true; + } + } /// /// Responds to this interaction with a set of choices. @@ -68,7 +88,7 @@ public Task RespondAsync(IEnumerable result, RequestOptions /// A task that represents the asynchronous operation of responding to this interaction. /// public Task RespondAsync(RequestOptions options = null, params AutocompleteResult[] result) - => InteractionHelper.SendAutocompleteResultAsync(Discord, result, Id, Token, options); + => RespondAsync(result, options); /// [Obsolete("Autocomplete interactions cannot be deferred!", true)] From edba12a5870997eb67213c1e7ec5031de573b9e5 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 12 Oct 2021 21:01:32 -0300 Subject: [PATCH 405/494] meta: bump versions --- Discord.Net.targets | 2 +- src/Discord.Net/Discord.Net.nuspec | 42 +++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Discord.Net.targets b/Discord.Net.targets index 67136d5869..9a5715a692 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,6 +1,6 @@ - 3.1.3 + 3.1.4 latest Discord.Net Contributors discord;discordapp diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index c84eca1999..68d03de657 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.3$suffix$ + 3.1.4$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,32 +14,32 @@ https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From 62e38c9e9c8b1651d37b193d8eae8c57edc5a202 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 14 Oct 2021 23:27:35 -0300 Subject: [PATCH 406/494] Fix #239 --- .../Entities/Interactions/IDiscordInteraction.cs | 5 +++++ .../Entities/Interactions/InteractionHelper.cs | 2 +- .../Entities/Interaction/SocketInteraction.cs | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 925ae08fcf..56cc88eb12 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -37,6 +37,11 @@ public interface IDiscordInteraction : ISnowflakeEntity /// int Version { get; } + /// + /// Gets the time that the interaction was received. + /// + DateTimeOffset ReceivedAt { get; } + /// /// Responds to an Interaction with type . /// diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 44ee7ac229..30a8d8483a 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -17,7 +17,7 @@ internal static class InteractionHelper #region InteractionHelper public static bool CanSendResponse(IDiscordInteraction interaction) { - return (DateTime.UtcNow - interaction.CreatedAt).TotalSeconds < ResponseTimeLimit; + return (DateTime.UtcNow - interaction.ReceivedAt).TotalSeconds < ResponseTimeLimit; } public static bool CanRespondOrFollowup(IDiscordInteraction interaction) { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 20d8fa0f53..c63041ce55 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -47,6 +47,10 @@ public abstract class SocketInteraction : SocketEntity, IDiscordInteracti public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); + /// + public DateTimeOffset ReceivedAt { get; private set; } + + internal abstract bool _hasResponded { get; set; } /// @@ -58,6 +62,7 @@ public bool IsValidToken internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) { + ReceivedAt = DateTime.UtcNow; Channel = channel; } From 1211b855fdb8765b0f554ca5e3a8e025d01dbf59 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 14 Oct 2021 23:39:56 -0300 Subject: [PATCH 407/494] meta: bump version --- Discord.Net.targets | 2 +- src/Discord.Net/Discord.Net.nuspec | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Discord.Net.targets b/Discord.Net.targets index 9a5715a692..c3ea81b2a7 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,6 +1,6 @@ - 3.1.4 + 3.1.5 latest Discord.Net Contributors discord;discordapp diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 68d03de657..2cecefafdb 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.4$suffix$ + 3.1.5$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,30 +14,30 @@ https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png - + - + - + - + - + - + - + - + From 0e16088acb24ded696ae0e8fd7dae9a4f7cd769e Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Fri, 15 Oct 2021 01:49:00 -0300 Subject: [PATCH 408/494] meta: update logo --- Discord.Net.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Discord.Net.targets b/Discord.Net.targets index c3ea81b2a7..b251007457 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -6,7 +6,7 @@ discord;discordapp https://github.com/Discord-Net-Labs/Discord.Net-Labs http://opensource.org/licenses/MIT - https://github.com/Discord-Net-Labs/Discord.Net-Labs/raw/dev/docs/marketing/logo/PackageLogo.png + https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png git git://github.com/Discord-Net-Labs/Discord.Net-Labs From 0f18e5b17e8906383974c8dbda29ae47cce65697 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Fri, 15 Oct 2021 04:01:11 -0300 Subject: [PATCH 409/494] meta: bump versions --- Discord.Net.targets | 2 +- src/Discord.Net/Discord.Net.nuspec | 42 +++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Discord.Net.targets b/Discord.Net.targets index b251007457..7940a7eb2c 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,6 +1,6 @@ - 3.1.5 + 3.1.6 latest Discord.Net Contributors discord;discordapp diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 2cecefafdb..d791ee23f0 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.5$suffix$ + 3.1.6$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,32 +14,32 @@ https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From 830399fc7b0bd7f79500973df03de7fbe98b9311 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 16 Oct 2021 21:54:24 -0300 Subject: [PATCH 410/494] Revert received at time, confirmed by discord staff to be accurate --- .../Entities/Interactions/IDiscordInteraction.cs | 5 ----- .../Entities/Interactions/InteractionHelper.cs | 2 +- .../Entities/Interaction/SocketInteraction.cs | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 56cc88eb12..925ae08fcf 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -37,11 +37,6 @@ public interface IDiscordInteraction : ISnowflakeEntity /// int Version { get; } - /// - /// Gets the time that the interaction was received. - /// - DateTimeOffset ReceivedAt { get; } - /// /// Responds to an Interaction with type . /// diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 30a8d8483a..44ee7ac229 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -17,7 +17,7 @@ internal static class InteractionHelper #region InteractionHelper public static bool CanSendResponse(IDiscordInteraction interaction) { - return (DateTime.UtcNow - interaction.ReceivedAt).TotalSeconds < ResponseTimeLimit; + return (DateTime.UtcNow - interaction.CreatedAt).TotalSeconds < ResponseTimeLimit; } public static bool CanRespondOrFollowup(IDiscordInteraction interaction) { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index c63041ce55..20d8fa0f53 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -47,10 +47,6 @@ public abstract class SocketInteraction : SocketEntity, IDiscordInteracti public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); - /// - public DateTimeOffset ReceivedAt { get; private set; } - - internal abstract bool _hasResponded { get; set; } /// @@ -62,7 +58,6 @@ public bool IsValidToken internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) { - ReceivedAt = DateTime.UtcNow; Channel = channel; } From 097d284e5312fdd9fc6a708169b6539cd838e812 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 16 Oct 2021 22:27:52 -0300 Subject: [PATCH 411/494] 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. --- .../02-creating-slash-commands.md | 13 +- .../03-responding-to-slash-commands.md | 9 +- .../slash-commands/04-parameters.md | 5 + .../05-responding-ephemerally.md | 21 +- .../slash-commands/06-subcommands.md | 5 + .../slash-commands/07-choice-slash-command.md | 5 + ...bulk-overwrite-of-global-slash-commands.md | 12 +- .../slash-commands/README.md | 15 +- docs/guides/interactions/intro.md | 10 + docs/guides/toc.yml | 20 +- .../02_commands_framework.csproj | 2 +- samples/02_commands_framework/Program.cs | 2 +- .../03_sharded_client.csproj | 2 +- .../Services/CommandHandlingService.cs | 2 +- samples/idn/idn.csproj | 2 +- .../Discord.Net.Analyzers.csproj | 3 +- .../Attributes/AliasAttribute.cs | 2 +- .../Builders/ModuleClassBuilder.cs | 2 +- src/Discord.Net.Commands/CommandService.cs | 2 +- src/Discord.Net.Commands/ModuleBase.cs | 2 +- src/Discord.Net.Commands/RunMode.cs | 2 +- src/Discord.Net.Core/CDN.cs | 10 + .../Entities/Activities/ActivityType.cs | 4 + .../Entities/AuditLogs/ActionType.cs | 12 ++ .../Entities/Channels/IStageChannel.cs | 3 - .../Entities/Channels/IThreadChannel.cs | 13 +- .../Channels/StageInstanceProperties.cs | 6 - .../Entities/Channels/StagePrivacyLevel.cs | 6 - .../Channels/ThreadArchiveDuration.cs | 12 +- .../Entities/Channels/ThreadType.cs | 8 +- .../Entities/Guilds/IGuild.cs | 10 +- .../Interactions/ApplicationCommandOption.cs | 26 ++- .../ApplicationCommandOptionChoice.cs | 20 +- .../ApplicationCommandOptionType.cs | 10 +- .../ApplicationCommandProperties.cs | 6 - .../Interactions/ApplicationCommandTypes.cs | 6 - .../Interactions/AutocompleteOption.cs | 6 - .../Interactions/AutocompleteResult.cs | 42 ++-- .../Context Menus/MessageCommandBuilder.cs | 21 +- .../Context Menus/MessageCommandProperties.cs | 6 - .../Context Menus/UserCommandBuilder.cs | 19 +- .../Context Menus/UserCommandProperties.cs | 6 - .../Interactions/IApplicationCommand.cs | 2 - .../IApplicationCommandInteractionData.cs | 4 - ...ApplicationCommandInteractionDataOption.cs | 5 - .../Interactions/IApplicationCommandOption.cs | 13 +- .../IApplicationCommandOptionChoice.cs | 7 - .../Interactions/IDiscordInteraction.cs | 17 +- .../Interactions/IDiscordInteractionData.cs | 8 +- .../Interactions/InteractionResponseType.cs | 18 +- .../Entities/Interactions/InteractionType.cs | 8 +- .../Message Components/ActionRowComponent.cs | 12 +- .../Message Components/ButtonComponent.cs | 9 +- .../Message Components/ButtonStyle.cs | 6 - .../Message Components/ComponentType.cs | 16 +- .../Message Components/IMessageComponent.cs | 6 - .../Message Components/MessageComponent.cs | 4 - .../Message Components/SelectMenuComponent.cs | 3 - .../Message Components/SelectMenuOption.cs | 6 - .../Slash Commands/SlashCommandBuilder.cs | 183 +++++++++-------- .../Slash Commands/SlashCommandProperties.cs | 4 - .../Entities/Messages/EmbedBuilder.cs | 14 +- .../Entities/Messages/IAttachment.cs | 7 + .../Entities/Messages/IMessage.cs | 17 +- .../Entities/Messages/IMessageInteraction.cs | 34 ++++ .../Entities/Messages/MessageInteraction.cs | 45 +++++ .../Entities/Messages/MessageType.cs | 16 +- .../Entities/Messages/StickerFormatType.cs | 22 +- .../Entities/Messages/TimestampTag.cs | 17 +- .../Entities/Messages/TimestampTagStyle.cs | 6 - .../ApplicationCommandPermissionTarget.cs | 8 +- .../Entities/Permissions/ChannelPermission.cs | 17 -- .../Permissions/ChannelPermissions.cs | 4 +- .../GuildApplicationCommandPermissions.cs | 4 - .../Entities/Permissions/GuildPermission.cs | 15 -- .../Entities/Permissions/GuildPermissions.cs | 2 +- .../Permissions/OverwritePermissions.cs | 2 +- src/Discord.Net.Core/Entities/Roles/IRole.cs | 15 ++ .../Entities/Stickers/ICustomSticker.cs | 5 +- .../Entities/Stickers/ISticker.cs | 6 +- .../Entities/Stickers/IStickerItem.cs | 6 - .../Entities/Stickers/StickerPack.cs | 6 +- .../Entities/Stickers/StickerProperties.cs | 4 - .../Entities/Stickers/StickerType.cs | 10 +- .../Extensions/MessageExtensions.cs | 4 +- src/Discord.Net.Core/Format.cs | 15 +- .../Net/ApplicationCommandException.cs | 4 - src/Discord.Net.Core/RequestOptions.cs | 4 +- src/Discord.Net.Core/Utils/UrlValidation.cs | 30 ++- .../Channels/IMessageChannel.Examples.cs | 1 - .../Discord.Net.Examples.csproj | 2 +- .../Discord.Net.Providers.WS4Net.csproj | 3 +- .../API/Common/ActionRowComponent.cs | 7 +- .../API/Common/ApplicationCommand.cs | 5 - .../ApplicationCommandInteractionData.cs | 2 - ...ApplicationCommandInteractionDataOption.cs | 1 - .../API/Common/ApplicationCommandOption.cs | 53 ++--- .../Common/ApplicationCommandOptionChoice.cs | 5 - .../Common/ApplicationCommandPermissions.cs | 5 - src/Discord.Net.Rest/API/Common/Attachment.cs | 2 + src/Discord.Net.Rest/API/Common/AuditLog.cs | 8 +- .../API/Common/AuditLogEntry.cs | 2 +- .../API/Common/AutocompleteInteractionData.cs | 5 - .../AutocompleteInteractionDataOption.cs | 12 +- .../API/Common/ButtonComponent.cs | 11 +- .../API/Common/ChannelThreads.cs | 5 - .../GuildApplicationCommandPermissions.cs | 7 +- .../API/Common/Interaction.cs | 5 - .../API/Common/InteractionCallbackData.cs | 6 +- .../API/Common/InteractionResponse.cs | 5 - src/Discord.Net.Rest/API/Common/Message.cs | 3 +- .../Common/MessageComponentInteractionData.cs | 5 - .../API/Common/MessageInteraction.cs | 21 ++ .../API/Common/NitroStickerPacks.cs | 4 - src/Discord.Net.Rest/API/Common/Role.cs | 2 + .../API/Common/SelectMenuComponent.cs | 4 - .../API/Common/SelectMenuOption.cs | 13 +- .../API/Common/StageInstance.cs | 5 - src/Discord.Net.Rest/API/Common/Sticker.cs | 2 +- .../API/Common/StickerItem.cs | 5 - .../API/Common/StickerPack.cs | 5 - .../API/Common/ThreadMember.cs | 6 +- .../API/Common/ThreadMetadata.cs | 4 - .../Rest/CreateApplicationCommandParams.cs | 8 +- .../API/Rest/CreateStageInstanceParams.cs | 5 - .../API/Rest/CreateStickerParams.cs | 8 +- .../Rest/ModifyApplicationCommandParams.cs | 5 - ...odifyGuildApplicationCommandPermissions.cs | 5 - ...uildApplicationCommandPermissionsParams.cs | 5 - .../Rest/ModifyInteractionResponseParams.cs | 7 +- .../API/Rest/ModifyStageInstanceParams.cs | 6 - .../API/Rest/ModifyStickerParams.cs | 5 - .../API/Rest/ModifyThreadParams.cs | 6 - .../API/Rest/StartThreadParams.cs | 5 - src/Discord.Net.Rest/ClientHelper.cs | 30 +-- src/Discord.Net.Rest/Discord.Net.Rest.csproj | 4 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 44 ++-- src/Discord.Net.Rest/DiscordRestClient.cs | 14 +- .../Entities/AuditLogs/AuditLogHelper.cs | 3 +- .../Entities/AuditLogs/DataTypes/StageInfo.cs | 30 +++ .../StageInstanceCreateAuditLogData.cs | 50 +++++ .../StageInstanceDeleteAuditLogData.cs | 50 +++++ .../StageInstanceUpdatedAuditLogData.cs | 51 +++++ .../Entities/Channels/ChannelHelper.cs | 1 + .../Entities/Channels/RestStageChannel.cs | 27 +-- .../Entities/Channels/RestThreadChannel.cs | 45 ++--- .../Entities/Channels/ThreadHelper.cs | 18 +- .../Entities/Guilds/RestGuild.cs | 16 +- .../Interactions/InteractionHelper.cs | 158 ++++++++------- .../Interactions/RestApplicationCommand.cs | 23 +-- .../RestApplicationCommandChoice.cs | 5 - .../RestApplicationCommandOption.cs | 18 +- .../Interactions/RestGlobalCommand.cs | 12 +- .../Entities/Interactions/RestGuildCommand.cs | 7 +- .../Entities/Messages/Attachment.cs | 8 +- .../Entities/Messages/CustomSticker.cs | 5 +- .../Entities/Messages/MessageHelper.cs | 10 +- .../Entities/Messages/RestFollowupMessage.cs | 16 +- .../Messages/RestInteractionMessage.cs | 10 +- .../Entities/Messages/RestMessage.cs | 45 ++++- .../Entities/Messages/RestUserMessage.cs | 21 +- .../Entities/Messages/Sticker.cs | 5 +- .../Entities/Messages/StickerItem.cs | 12 +- .../Entities/Roles/RestRole.cs | 7 + .../Entities/Users/RestThreadUser.cs | 4 - .../Entities/Webhooks/WebhookHelper.cs | 1 - .../Net/Converters/InteractionConverter.cs | 4 - .../Converters/MessageComponentConverter.cs | 4 - .../Net/Queue/RequestQueueBucket.cs | 6 +- .../ApplicationCommandCreatedUpdatedEvent.cs | 7 +- .../API/Gateway/GuildStickerUpdateEvent.cs | 5 - .../API/Gateway/ThreadListSyncEvent.cs | 5 - .../API/Gateway/ThreadMembersUpdate.cs | 5 - .../API/Voice/ReadyEvent.cs | 2 +- .../Audio/Streams/BufferedWriteStream.cs | 2 +- .../BaseSocketClient.Events.cs | 11 +- .../DiscordShardedClient.cs | 1 + .../DiscordSocketClient.cs | 13 +- .../DiscordSocketConfig.cs | 2 +- .../Entities/Channels/SocketStageChannel.cs | 31 +-- .../Entities/Channels/SocketThreadChannel.cs | 49 ++--- .../Entities/Guilds/SocketGuild.cs | 6 +- .../Message Commands/SocketMessageCommand.cs | 10 +- .../SocketMessageCommandData.cs | 2 +- .../User Commands/SocketUserCommand.cs | 12 +- .../SocketMessageComponent.cs | 191 +++++++++++------- .../SocketMessageComponentData.cs | 4 - .../SocketAutocompleteInteraction.cs | 49 +++-- .../SocketAutocompleteInteractionData.cs | 27 ++- .../Slash Commands/SocketSlashCommand.cs | 12 +- .../Slash Commands/SocketSlashCommandData.cs | 3 +- .../SocketSlashCommandDataOption.cs | 11 +- .../SocketApplicationCommand.cs | 25 +-- .../SocketApplicationCommandChoice.cs | 5 - .../SocketApplicationCommandOption.cs | 20 +- .../SocketBaseCommand/SocketCommandBase.cs | 129 ++++++------ .../SocketCommandBaseData.cs | 2 - .../SocketBaseCommand/SocketResolvableData.cs | 4 - .../Entities/Interaction/SocketInteraction.cs | 59 +++--- .../Entities/Messages/SocketMessage.cs | 60 +++++- .../Entities/Messages/SocketUserMessage.cs | 27 +-- .../Entities/Roles/SocketRole.cs | 7 + .../Entities/Stickers/SocketCustomSticker.cs | 10 +- .../Entities/Stickers/SocketSticker.cs | 34 +--- .../Entities/Stickers/SocketUnknownSticker.cs | 3 - .../Entities/Users/SocketThreadUser.cs | 4 - .../Discord.Net.Webhook.csproj | 4 +- .../Discord.Net.Analyzers.Tests.csproj | 6 +- .../Discord.Net.Tests.Integration.csproj | 4 +- .../Discord.Net.Tests.Unit.csproj | 4 +- .../EmbedBuilderTests.cs | 2 +- test/Discord.Net.Tests.Unit/FormatTests.cs | 15 ++ 212 files changed, 1533 insertions(+), 1471 deletions(-) create mode 100644 docs/guides/interactions/intro.md create mode 100644 src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs create mode 100644 src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs create mode 100644 src/Discord.Net.Rest/API/Common/MessageInteraction.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs diff --git a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md index 830c52aa52..1abab1a258 100644 --- a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Creating +title: Creating Slash Commands +--- + # Creating your first slash commands. There are two kinds of Slash Commands: global commands and guild commands. @@ -35,7 +40,10 @@ The slash command builder will help you create slash commands. The builder has t | AddOption | Function | Adds an option to the current slash command. | | Build | Function | Builds the builder into a `SlashCommandCreationProperties` class used to make slash commands | -**Note**: Slash command names must be all lowercase! +> [!NOTE] +> Slash command names must be all lowercase! + +## Creating a Slash Command Let's use the slash command builder to make a global and guild command. @@ -84,4 +92,5 @@ public async Task Client_Ready() ``` -**Note**: Slash 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 slash commands. +> [!NOTE] +> Slash 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 slash commands. diff --git a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md index ad3c7145b7..cd6ad52172 100644 --- a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Receiving +title: Receiving and Responding to Slash Commands +--- + # Responding to interactions. Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. In order to receive a slash command we have to listen to the `InteractionCreated` event. Let's add this to our code. @@ -45,6 +50,8 @@ Let's try this out! Let's go over the response types quickly, as you would only change them for style points :P -> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`. If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) +> [!NOTE] +> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`. +> If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) This seems to be working! Next, we will look at parameters for slash commands. diff --git a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md index ddac72203a..cc61796c8e 100644 --- a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md +++ b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Parameters +title: Slash Command Parameters +--- + # Slash command parameters Slash commands can have a bunch of parameters, each their own type. Let's first go over the types of parameters we can have. diff --git a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md index f925049246..fa5ac449ba 100644 --- a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md +++ b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md @@ -1,20 +1,13 @@ -# Responding ephemerally - -What is an ephemeral response? Basically, only the user who executed the command can see the result of it. In labs this is pretty simple to do. - -First, we need to talk about `AlwaysAcknowledgeInteractions` in the discord config. `AlwaysAcknowledgeInteractions` will always acknowledge the message non-ephemerally, meaning any follow-up messages or responses will also be non-ephemeral. If you set `AlwaysAcknowledgeInteractions` to false, you can acknowledge interactions yourself with the ephemeral field set to your discretion. +--- +uid: Guides.SlashCommands.Ephemeral +title: Ephemeral Responses +--- -**Note**: You don't have to run arg.AcknowledgeAsync() to capture the interaction, you can use arg.RespondAsync with a message to capture it, this also follows the ephemeral rule. +# Responding ephemerally -Let's start by changing our client config. +What is an ephemeral response? Basically, only the user who executed the command can see the result of it, this is pretty simple to implement. -```cs -client = new DiscordSocketClient(new DiscordSocketConfig() -{ - // Add this! - AlwaysAcknowledgeInteractions = false, -}); -``` +**Note**: You don't have to run arg.DeferAsync() to capture the interaction, you can use arg.RespondAsync() with a message to capture it, this also follows the ephemeral rule. When responding with either `FollowupAsync` or `RespondAsync` you can pass in an `ephemeral` property. When setting it to true it will respond ephemerally, false and it will respond non-ephemerally. diff --git a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md index 54ff03cdc1..ac8c7313d2 100644 --- a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md +++ b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.SubCommand +title: Sub Commands +--- + # Subcommands Subcommands allow you to have multiple commands available in a single command. They can be useful for representing sub options for a command. For example: A settings command. Let's first look at some limitations with subcommands set by discord. diff --git a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md index 53cccb39ee..79de5ffbca 100644 --- a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md +++ b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md @@ -1,3 +1,8 @@ +--- +uid: Guides.SlashCommands.Choices +title: Slash Command Choices +--- + # Slash Command Choices. With slash command options you can add choices, making the user select between some set values. Lets create a command that asks how much they like our bot! diff --git a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md index 0a1aab461b..e2511ab983 100644 --- a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md @@ -1,4 +1,10 @@ +--- +uid: Guides.SlashCommands.BulkOverwrite +title: Slash Command Bulk Overwrites +--- + If you have too many global commands then you might want to consider using the bulk overwrite function. + ```cs public async Task Client_Ready() { List applicationCommandProperties = new(); @@ -8,7 +14,7 @@ public async Task Client_Ready() { globalCommandHelp.WithName("help"); globalCommandHelp.WithDescription("Shows information about the bot."); applicationCommandProperties.Add(globalCommandHelp.Build()); - + // Slash command with name as its parameter. SlashCommandOptionBuilder slashCommandOptionBuilder = new(); slashCommandOptionBuilder.WithName("name"); @@ -16,11 +22,11 @@ public async Task Client_Ready() { slashCommandOptionBuilder.WithDescription("Add a family"); slashCommandOptionBuilder.WithRequired(true); // Only add this if you want it to be required - SlashCommandBuilder globalCommandAddFamily = new SlashCommandBuilder(); + SlashCommandBuilder globalCommandAddFamily = new SlashCommandBuilder(); globalCommandAddFamily.WithName("add-family"); globalCommandAddFamily.WithDescription("Add a family"); applicationCommandProperties.Add(globalCommandAddFamily.Build()); - + await _client.BulkOverwriteGlobalApplicationCommandsAsync(applicationCommandProperties.ToArray()); } catch (ApplicationCommandException exception) { var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); diff --git a/docs/guides/interactions/application-commands/slash-commands/README.md b/docs/guides/interactions/application-commands/slash-commands/README.md index 70e31a8b4f..2abbddf0f2 100644 --- a/docs/guides/interactions/application-commands/slash-commands/README.md +++ b/docs/guides/interactions/application-commands/slash-commands/README.md @@ -2,11 +2,10 @@ Here you can find some guides on how to use slash commands. -1. [Getting started](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/01-getting-started.md) -2. [Creating a slash command](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/02-creating-slash-commands.md) -3. [Responding to slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/03-responding-to-slash-commands.md) -4. [Parameters in slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/04-parameters.md) -5. [Responding ephemerally](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/05-responding-ephemerally.md) -6. [Subcommands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/06-subcommands.md) -7. [Choices](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/slash-commands/07-choice-slash-command.md) -7. [Bulk overwrite of global slash commands](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/release/3.x/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md) +1. [Creating a slash command](https://github.com/discord-net/Discord.Net/blob/dev/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md) +2. [Responding to slash commands](https://github.com/discord-net/Discord.Net/blob/dev/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md) +3. [Parameters in slash commands](https://github.com/discord-net/Discord.Net/blob/dev/docs/guides/interactions/application-commands/slash-commands/04-parameters.md) +4. [Responding ephemerally](https://github.com/discord-net/Discord.Net/blob/dev/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md) +5. [Subcommands](https://github.com/discord-net/Discord.Net/blob/dev/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md) +6. [Choices](https://github.com/discord-net/Discord.Net/blob/dev/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md) +7. [Bulk overwrite of global slash commands](https://github.com/discord-net/Discord.Net/blob/dev/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md) diff --git a/docs/guides/interactions/intro.md b/docs/guides/interactions/intro.md new file mode 100644 index 0000000000..62b2dfdb57 --- /dev/null +++ b/docs/guides/interactions/intro.md @@ -0,0 +1,10 @@ +--- +uid: Guides.Interactions.Intro +title: Introduction to Interactions +--- + +# Interactions + +Placeholder text does the brrr. + +Links to different sections of guides: msg comp / slash commands. diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index a6c38768f6..64ed1c8cc1 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -35,9 +35,27 @@ topicUid: Guides.Commands.DI - name: Post-execution Handling topicUid: Guides.Commands.PostExecution +- name: Working with Interactions + items: + - name: Introduction + topicUid: Guides.Interactions.Intro + - name: Creating slash commands + topicUid: Guides.SlashCommands.Creating + - name: Receiving and responding to slash commands + topicUid: Guides.SlashCommands.Receiving + - name: Slash command parameters + topicUid: Guides.SlashCommands.Parameters + - name: Ephemeral responses + topicUid: Guides.SlashCommands.Ephemeral + - name: Sub commands + topicUid: Guides.SlashCommands.SubCommand + - name: Slash command choices + topicUid: Guides.SlashCommands.Choices + - name: Slash ommands Bulk Overwrites + topicUid: Guides.SlashCommands.BulkOverwrite - name: Emoji topicUid: Guides.Emoji - name: Voice topicUid: Guides.Voice.SendingVoice - name: Deployment - topicUid: Guides.Deployment \ No newline at end of file + topicUid: Guides.Deployment diff --git a/samples/02_commands_framework/02_commands_framework.csproj b/samples/02_commands_framework/02_commands_framework.csproj index 151e546a2f..83a62f8d74 100644 --- a/samples/02_commands_framework/02_commands_framework.csproj +++ b/samples/02_commands_framework/02_commands_framework.csproj @@ -6,7 +6,7 @@ - + diff --git a/samples/02_commands_framework/Program.cs b/samples/02_commands_framework/Program.cs index 67cb877642..8a2f37dce2 100644 --- a/samples/02_commands_framework/Program.cs +++ b/samples/02_commands_framework/Program.cs @@ -39,7 +39,7 @@ public async Task MainAsync() services.GetRequiredService().Log += LogAsync; // Tokens should be considered secret data and never hard-coded. - // We can read from the environment variable to avoid hardcoding. + // We can read from the environment variable to avoid hard coding. await client.LoginAsync(TokenType.Bot, Environment.GetEnvironmentVariable("token")); await client.StartAsync(); diff --git a/samples/03_sharded_client/03_sharded_client.csproj b/samples/03_sharded_client/03_sharded_client.csproj index 24f9942f96..91cacef646 100644 --- a/samples/03_sharded_client/03_sharded_client.csproj +++ b/samples/03_sharded_client/03_sharded_client.csproj @@ -7,7 +7,7 @@ - + diff --git a/samples/03_sharded_client/Services/CommandHandlingService.cs b/samples/03_sharded_client/Services/CommandHandlingService.cs index 1230cbcff3..adc91b12c0 100644 --- a/samples/03_sharded_client/Services/CommandHandlingService.cs +++ b/samples/03_sharded_client/Services/CommandHandlingService.cs @@ -54,7 +54,7 @@ public async Task CommandExecutedAsync(Optional command, ICommandCo if (!command.IsSpecified) return; - // the command was succesful, we don't care about this result, unless we want to log that a command succeeded. + // the command was successful, we don't care about this result, unless we want to log that a command succeeded. if (result.IsSuccess) return; diff --git a/samples/idn/idn.csproj b/samples/idn/idn.csproj index 984c863839..f982ff86d9 100644 --- a/samples/idn/idn.csproj +++ b/samples/idn/idn.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj index cfaf67d345..b28d9c2c12 100644 --- a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj +++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj @@ -5,12 +5,13 @@ Discord.Analyzers A Discord.Net extension adding support for design-time analysis of the API usage. netstandard2.0;netstandard2.1 + Discord.Net.Labs.Analyzers ..\Discord.Net.Analyzers\Discord.Net.Analyzers.xml - + diff --git a/src/Discord.Net.Commands/Attributes/AliasAttribute.cs b/src/Discord.Net.Commands/Attributes/AliasAttribute.cs index 16eb3ba738..c4b78f5341 100644 --- a/src/Discord.Net.Commands/Attributes/AliasAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/AliasAttribute.cs @@ -16,7 +16,7 @@ namespace Discord.Commands /// /// [Command("stats")] /// [Alias("stat", "info")] - /// public async Task GetStatsAsync(IUser user) + /// public Task GetStatsAsync(IUser user) /// { /// // ...pull stats /// } diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 59500439ac..8c10ae8065 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -291,7 +291,7 @@ internal static TypeReader GetTypeReader(CommandService service, Type paramType, return reader; } - //We dont have a cached type reader, create one + //We don't have a cached type reader, create one reader = ReflectionUtils.CreateObject(typeReaderType.GetTypeInfo(), service, services); service.AddTypeReader(paramType, reader, false); diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 468f7739f5..db08d0d79c 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -602,7 +602,7 @@ float CalculateScore(CommandMatch match, ParseResult parseResult) //If we get this far, at least one parse was successful. Execute the most likely overload. var chosenOverload = successfulParses[0]; var result = await chosenOverload.Key.ExecuteAsync(context, chosenOverload.Value, services).ConfigureAwait(false); - if (!result.IsSuccess && !(result is RuntimeResult || result is ExecuteResult)) // succesful results raise the event in CommandInfo#ExecuteInternalAsync (have to raise it there b/c deffered execution) + if (!result.IsSuccess && !(result is RuntimeResult || result is ExecuteResult)) // successful results raise the event in CommandInfo#ExecuteInternalAsync (have to raise it there b/c deferred execution) await _commandExecutedEvent.InvokeAsync(chosenOverload.Key.Command, context, result); return result; } diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index eb517e65d4..3eddc11d27 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -36,7 +36,7 @@ public abstract class ModuleBase : IModuleBase /// Specifies if notifications are sent for mentioned users and roles in the . /// If null, all mentioned roles and users will be notified. /// - /// The request options for this async request. + /// The request options for this request. /// The message references to be included. Used to reply to specific messages. /// The message components to be included with this message. Used for interactions. /// A collection of stickers to send with the file. diff --git a/src/Discord.Net.Commands/RunMode.cs b/src/Discord.Net.Commands/RunMode.cs index 8e230b500d..d6b49065bd 100644 --- a/src/Discord.Net.Commands/RunMode.cs +++ b/src/Discord.Net.Commands/RunMode.cs @@ -8,7 +8,7 @@ namespace Discord.Commands public enum RunMode { /// - /// The default behaviour set in . + /// The default behavior set in . /// Default, /// diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index 78fba574f1..b170336dc1 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -86,6 +86,16 @@ public static string GetDefaultUserAvatarUrl(ushort discriminator) public static string GetGuildIconUrl(ulong guildId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}icons/{guildId}/{iconId}.jpg" : null; /// + /// Returns a guild role's icon URL. + /// + /// The role identifier. + /// The icon hash. + /// + /// A URL pointing to the guild role's icon. + /// + public static string GetGuildRoleIconUrl(ulong roleId, string roleHash) + => roleHash != null ? $"{DiscordConfig.CDNUrl}role-icons/{roleId}/{roleHash}.png" : null; + /// /// Returns a guild splash URL. /// /// The guild snowflake identifier. diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityType.cs b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs index 8c44f49e37..1f67886ebe 100644 --- a/src/Discord.Net.Core/Entities/Activities/ActivityType.cs +++ b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs @@ -25,5 +25,9 @@ public enum ActivityType /// The user has set a custom status. /// CustomStatus = 4, + /// + /// The user is competing in a game. + /// + Competing = 5, } } diff --git a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs index b016a4c50b..5092b4e7fb 100644 --- a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs +++ b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs @@ -180,5 +180,17 @@ public enum ActionType /// A sticker was deleted. /// StickerDeleted = 92, + /// + /// A thread was created. + /// + ThreadCreate = 110, + /// + /// A thread was updated. + /// + ThreadUpdate = 111, + /// + /// A thread was deleted. + /// + ThreadDelete = 112 } } diff --git a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs index 0efc9d818d..3b1bc08da5 100644 --- a/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IStageChannel.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord diff --git a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs index e20d87d576..50e46efa65 100644 --- a/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord @@ -9,7 +6,7 @@ namespace Discord /// /// Represents a thread channel inside of a guild. /// - public interface IThreadChannel : ITextChannel, IGuildChannel + public interface IThreadChannel : ITextChannel { /// /// Gets the type of the current thread channel. @@ -56,7 +53,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// /// The options to be used when sending the request. /// - /// A task that represents the asynchronous join operation. + /// A task that represents the asynchronous join operation. /// Task JoinAsync(RequestOptions options = null); @@ -65,7 +62,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel ///
/// The options to be used when sending the request. /// - /// A task that represents the asynchronous leave operation. + /// A task that represents the asynchronous leave operation. /// Task LeaveAsync(RequestOptions options = null); @@ -75,7 +72,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// The to add. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of adding a member to a thread. + /// A task that represents the asynchronous operation of adding a member to a thread. /// Task AddUserAsync(IGuildUser user, RequestOptions options = null); @@ -85,7 +82,7 @@ public interface IThreadChannel : ITextChannel, IGuildChannel /// The to remove from this thread. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of removing a user from this thread. + /// A task that represents the asynchronous operation of removing a user from this thread. /// Task RemoveUserAsync(IGuildUser user, RequestOptions options = null); } diff --git a/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs b/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs index ad539adc39..35201fe0f0 100644 --- a/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs +++ b/src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs index 3a91b61aa3..c6eb3803f5 100644 --- a/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs +++ b/src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs b/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs index 01d1574bfa..2c8a0652c0 100644 --- a/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs +++ b/src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -24,7 +18,7 @@ public enum ThreadArchiveDuration /// /// Three days (4320 minutes). /// - /// This option is explicity avaliable to nitro users. + /// This option is explicitly available to nitro users. /// /// ThreeDays = 4320, @@ -32,9 +26,9 @@ public enum ThreadArchiveDuration /// /// One week (10080 minutes). /// - /// This option is explicity avaliable to nitro users. + /// This option is explicitly available to nitro users. /// /// - OneWeek = 10080, + OneWeek = 10080 } } diff --git a/src/Discord.Net.Core/Entities/Channels/ThreadType.cs b/src/Discord.Net.Core/Entities/Channels/ThreadType.cs index 2db09bcb9e..379128d21f 100644 --- a/src/Discord.Net.Core/Entities/Channels/ThreadType.cs +++ b/src/Discord.Net.Core/Entities/Channels/ThreadType.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -24,6 +18,6 @@ public enum ThreadType /// /// Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission /// - PrivateThread = 12, + PrivateThread = 12 } } diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 62e34cabb8..4a23336457 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -609,12 +609,12 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Task GetRulesChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); /// - /// Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + /// Gets the text channel where admins and moderators of Community guilds receive notices from Discord. /// /// The that determines whether the object should be fetched from cache. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous get operation. The task result contains the text channel channel where + /// A task that represents the asynchronous get operation. The task result contains the text channel where /// admins and moderators of Community guilds receive notices from Discord; if none is set. /// Task GetPublicUpdatesChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); @@ -771,7 +771,7 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// A guild user associated with the specified ; if the user is already in the guild. Task AddGuildUserAsync(ulong userId, string accessToken, Action func = null, RequestOptions options = null); /// - /// Disconnects the user from its current voice channel. + /// Disconnects the user from its current voice channel. /// /// The user to disconnect. /// A task that represents the asynchronous operation for disconnecting a user. @@ -834,7 +834,7 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// Downloads all users for this guild if the current list is incomplete. /// /// - /// This method downloads all users found within this guild throught the Gateway and caches them. + /// This method downloads all users found within this guild through the Gateway and caches them. /// /// /// A task that represents the asynchronous download operation. @@ -1057,7 +1057,7 @@ Task> GetAuditLogsAsync(int limit = DiscordC /// A task that represents the asynchronous get operation. The task result contains a read-only collection /// of application commands found within the guild. /// - Task> GetApplicationCommandsAsync (RequestOptions options = null); + Task> GetApplicationCommandsAsync(RequestOptions options = null); /// /// Gets an application command within this guild with the specified id. diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index 63ec3b9005..10aa6ab85d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -1,9 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; namespace Discord { @@ -24,13 +21,13 @@ public string Name set { if (value == null) - throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); + throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null."); if (value.Length > 32) - throw new ArgumentException($"{nameof(Name)} length must be less than or equal to 32"); + throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 32."); if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) - throw new ArgumentException($"{nameof(Name)} must match the regex ^[\\w-]{{1,32}}$"); + throw new FormatException($"{nameof(value)} must match the regex ^[\\w-]{{1,32}}$"); _name = value; } @@ -42,14 +39,12 @@ public string Name public string Description { get => _description; - set + set => _description = value?.Length switch { - if (value?.Length > 100) - throw new ArgumentException("Description length must be less than or equal to 100"); - if (value?.Length < 1) - throw new ArgumentException("Description length must at least 1 character in length"); - _description = value; - } + > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be less than or equal to 100."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be at least 1."), + _ => value + }; } /// @@ -81,6 +76,9 @@ public string Description /// public List Options { get; set; } - + /// + /// Gets or sets the allowed channel types for this option. + /// + public List ChannelTypes { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs index f7979f20dc..a9910a0afa 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -19,20 +15,18 @@ public class ApplicationCommandOptionChoiceProperties public string Name { get => _name; - set + set => _name = value?.Length switch { - if(value?.Length > 100) - throw new ArgumentException("Name length must be less than or equal to 100"); - if (value?.Length < 1) - throw new ArgumentException("Name length must at least 1 character in length"); - _name = value; - } + > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must at least 1."), + _ => value + }; } /// /// Gets or sets the value of this choice. /// - /// Discord only accepts int and string as the input. + /// Discord only accepts int, string, and doubles as the input. /// /// public object Value @@ -40,6 +34,8 @@ public object Value get => _value; set { + if (value != null && value is not int && value is not string && value is not double) + throw new ArgumentException("The value of a choice must be a string, int, or double!"); _value = value; } } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs index a1b366e187..0f919f1f69 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -37,7 +31,7 @@ public enum ApplicationCommandOptionType : byte Boolean = 5, /// - /// A . + /// A . /// User = 6, @@ -55,7 +49,7 @@ public enum ApplicationCommandOptionType : byte /// A or . /// Mentionable = 9, - + /// /// A . /// diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index bde3fcc914..501a0e9059 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs index 57ba37e188..8cd31a420d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs index 2a97a72951..4f7d3cb5f6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs index a0992fd00c..a4333ceb29 100644 --- a/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs +++ b/src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -11,8 +7,8 @@ namespace Discord /// public class AutocompleteResult { - private object _value { get; set; } - private string _name { get; set; } + private object _value; + private string _name; /// /// Gets or sets the name of the result. @@ -28,12 +24,13 @@ public string Name set { if (value == null) - throw new ArgumentException("Name cannot be null!"); - if (value.Length > 100) - throw new ArgumentException("Name length must be less than or equal to 100 characters in length!"); - if (value.Length < 1) - throw new ArgumentException("Name length must at least 1 character in length!"); - _name = value; + throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null."); + _name = value.Length switch + { + > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."), + 0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be at least 1."), + _ => value + }; } } @@ -48,20 +45,15 @@ public string Name public object Value { get => _value; - set + set => _value = value switch { - if (value == null) - throw new ArgumentNullException("Value cannot be null"); - - _value = value switch - { - string str => str, - int integer => integer, - long lng => lng, - double number => number, - _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"), - }; - } + string str => str, + int integer => integer, + long lng => lng, + double number => number, + null => throw new ArgumentNullException(nameof(value), $"{nameof(Value)} cannot be null."), + _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!") + }; } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs index e600beba7a..5e7bb660b7 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs @@ -1,10 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - namespace Discord { /// @@ -12,8 +5,8 @@ namespace Discord /// public class MessageCommandBuilder { - /// - /// Returns the maximun length a commands name allowed by Discord + /// + /// Returns the maximum length a commands name allowed by Discord /// public const int MaxNameLength = 32; @@ -22,10 +15,7 @@ public class MessageCommandBuilder /// public string Name { - get - { - return _name; - } + get => _name; set { Preconditions.NotNullOrEmpty(value, nameof(Name)); @@ -41,7 +31,7 @@ public string Name /// public bool IsDefaultPermission { get; set; } = true; - private string _name { get; set; } + private string _name; /// /// Build the current builder into a class. @@ -51,14 +41,13 @@ public string Name /// public MessageCommandProperties Build() { - MessageCommandProperties props = new MessageCommandProperties() + var props = new MessageCommandProperties { Name = Name, IsDefaultPermission = IsDefaultPermission }; return props; - } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs index 3af9b47f36..356ed23d67 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs index 34a9706ad6..f9c1c6f674 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs @@ -1,10 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - namespace Discord { /// @@ -13,7 +6,7 @@ namespace Discord public class UserCommandBuilder { /// - /// Returns the maximun length a commands name allowed by Discord + /// Returns the maximum length a commands name allowed by Discord. /// public const int MaxNameLength = 32; @@ -22,10 +15,7 @@ public class UserCommandBuilder /// public string Name { - get - { - return _name; - } + get => _name; set { Preconditions.NotNullOrEmpty(value, nameof(Name)); @@ -41,7 +31,7 @@ public string Name /// public bool IsDefaultPermission { get; set; } = true; - private string _name { get; set; } + private string _name; /// /// Build the current builder into a class. @@ -49,14 +39,13 @@ public string Name /// A that can be used to create user commands. public UserCommandProperties Build() { - UserCommandProperties props = new UserCommandProperties() + var props = new UserCommandProperties { Name = Name, IsDefaultPermission = IsDefaultPermission }; return props; - } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs index 091166a175..c42e916d93 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs index dd192958d6..7f33e77470 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs index 3d1a0349a6..6cfd62e720 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs index f801ce76cc..2a7e9b01ea 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -33,6 +29,5 @@ public interface IApplicationCommandInteractionDataOption /// Gets the nested options of this option. /// IReadOnlyCollection Options { get; } - } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index 457c046139..1ca5fc56a9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -39,11 +35,16 @@ public interface IApplicationCommandOption /// /// Gets a collection of choices for the user to pick from. /// - IReadOnlyCollection? Choices { get; } + IReadOnlyCollection Choices { get; } /// /// Gets the nested options of this option. /// - IReadOnlyCollection? Options { get; } + IReadOnlyCollection Options { get; } + + /// + /// The allowed channel types for this option. + /// + IReadOnlyCollection ChannelTypes { get; } } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs index 24fae04c29..9b7aa3858e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -20,6 +14,5 @@ public interface IApplicationCommandOptionChoice /// Gets the value of the choice. /// object Value { get; } - } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs index 0dea203eff..925ae08fcf 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord @@ -51,7 +48,7 @@ public interface IDiscordInteraction : ISnowflakeEntity /// The request options for this response. /// A to be sent with this response. /// A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored. - Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false, + Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// @@ -68,23 +65,23 @@ Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false /// /// The sent message. /// - Task FollowupAsync (string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// /// Gets the original response for this interaction. /// - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. - Task GetOriginalResponseAsync (RequestOptions options = null); + Task GetOriginalResponseAsync(RequestOptions options = null); /// /// Edits original response for this interaction. /// /// A delegate containing the properties to modify the message with. - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. - Task ModifyOriginalResponseAsync (Action func, RequestOptions options = null); + Task ModifyOriginalResponseAsync(Action func, RequestOptions options = null); /// /// Acknowledges this interaction. @@ -92,6 +89,6 @@ Task FollowupAsync (string text = null, Embed[] embeds = null, boo /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - Task DeferAsync (bool ephemeral = false, RequestOptions options = null); + Task DeferAsync(bool ephemeral = false, RequestOptions options = null); } } diff --git a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs index 7083810b75..42b95738eb 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs @@ -1,13 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// - /// Represents an interface used to specify classes that they are a vaild dataype of a class. + /// Represents an interface used to specify classes that they are a valid data type of a class. /// public interface IDiscordInteractionData { } } diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs index 43e614b57b..ebdf297817 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -13,7 +9,7 @@ namespace Discord /// After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using /// or you can choose to send a deferred response with . If choosing a deferred response, the user will see a loading state for the interaction, /// and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. - /// You can read more about Response types Here + /// You can read more about Response types Here. /// public enum InteractionResponseType : byte { @@ -22,18 +18,6 @@ public enum InteractionResponseType : byte /// Pong = 1, - /// - /// ACK a command without sending a message, eating the user's input. - /// - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] - Acknowledge = 2, - - /// - /// Respond with a message, showing the user's input. - /// - [Obsolete("This response type has been depricated by discord. Either use ChannelMessageWithSource or DeferredChannelMessageWithSource", true)] - ChannelMessage = 3, - /// /// Respond to an interaction with a message. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs index 989114505b..e09c906b59 100644 --- a/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/InteractionType.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -29,6 +23,6 @@ public enum InteractionType : byte /// /// An autocomplete request sent from discord. /// - ApplicationCommandAutocomplete = 4, + ApplicationCommandAutocomplete = 4 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs index df08e5ee30..202a5687ff 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs @@ -1,28 +1,22 @@ -using Newtonsoft.Json; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { /// - /// Represents a Row for child components to live in. + /// Represents a Row for child components to live in. /// public class ActionRowComponent : IMessageComponent { /// - public ComponentType Type { get; } = ComponentType.ActionRow; + public ComponentType Type => ComponentType.ActionRow; /// /// Gets the child components in this row. /// public IReadOnlyCollection Components { get; internal set; } - - internal ActionRowComponent() { } + internal ActionRowComponent(List components) { Components = components; diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs index 64a2ab0e99..a3badf32d9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs @@ -1,10 +1,3 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -13,7 +6,7 @@ namespace Discord public class ButtonComponent : IMessageComponent { /// - public ComponentType Type { get; } = ComponentType.Button; + public ComponentType Type => ComponentType.Button; /// /// Gets the of this button, example buttons with each style can be found Here. diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs index c72767cbd0..92d48ab4fb 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs index 5fb4fc092a..70bc1f301c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs @@ -1,29 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// - /// Represents a type of a component + /// Represents a type of a component. /// public enum ComponentType { /// - /// A container for other components + /// A container for other components. /// ActionRow = 1, /// - /// A clickable button + /// A clickable button. /// Button = 2, /// - /// A select menu for picking from choices + /// A select menu for picking from choices. /// - SelectMenu = 3, + SelectMenu = 3 } } diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs index 7614fbfd53..9366a44d69 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs index eb37a57b86..7205886816 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs index db79363656..a1ec7acd84 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs @@ -1,8 +1,5 @@ -using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs index 3c7fce181b..6856e1ee3f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index 7c337892f6..737092cb7d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; namespace Discord { @@ -12,15 +10,15 @@ namespace Discord /// public class SlashCommandBuilder { - /// - /// Returns the maximun length a commands name allowed by Discord + /// + /// Returns the maximum length a commands name allowed by Discord /// public const int MaxNameLength = 32; - /// - /// Returns the maximum length of a commands description allowed by Discord. + /// + /// Returns the maximum length of a commands description allowed by Discord. /// public const int MaxDescriptionLength = 100; - /// + /// /// Returns the maximum count of command options allowed by Discord /// public const int MaxOptionsCount = 25; @@ -30,20 +28,17 @@ public class SlashCommandBuilder /// public string Name { - get - { - return _name; - } + get => _name; set { - Preconditions.NotNullOrEmpty(value, nameof(Name)); - Preconditions.AtLeast(value.Length, 1, nameof(Name)); - Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); + Preconditions.NotNullOrEmpty(value, nameof(value)); + Preconditions.AtLeast(value.Length, 1, nameof(value)); + Preconditions.AtMost(value.Length, MaxNameLength, nameof(value)); // Discord updated the docs, this regex prevents special characters like @!$%(... etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(value)); _name = value; } @@ -54,12 +49,10 @@ public string Name /// public string Description { - get - { - return _description; - } + get => _description; set { + Preconditions.NotNullOrEmpty(value, nameof(Description)); Preconditions.AtLeast(value.Length, 1, nameof(Description)); Preconditions.AtMost(value.Length, MaxDescriptionLength, nameof(Description)); @@ -75,10 +68,7 @@ public List Options get => _options; set { - if (value != null) - if (value.Count > MaxOptionsCount) - throw new ArgumentException(message: $"Option count must be less than or equal to {MaxOptionsCount}.", paramName: nameof(Options)); - + Preconditions.AtMost(value?.Count ?? 0, MaxOptionsCount, nameof(value)); _options = value; } } @@ -88,9 +78,9 @@ public List Options /// public bool IsDefaultPermission { get; set; } = true; - private string _name { get; set; } - private string _description { get; set; } - private List _options { get; set; } + private string _name; + private string _description; + private List _options; /// /// Build the current builder into a class. @@ -98,7 +88,7 @@ public List Options /// A that can be used to create slash commands. public SlashCommandProperties Build() { - SlashCommandProperties props = new SlashCommandProperties() + var props = new SlashCommandProperties { Name = Name, Description = Description, @@ -160,12 +150,14 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// The description of this option. /// If this option is required for this command. /// If this option is the default option. - /// If this option is set to autocompleate. + /// If this option is set to autocomplete. /// The options of the option to add. + /// The allowed channel types for this option. /// The choices of this option. /// The current builder. public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? isRequired = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? isRequired = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, + List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -175,7 +167,7 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); // same with description Preconditions.NotNullOrEmpty(description, nameof(description)); @@ -183,14 +175,10 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t Preconditions.AtMost(description.Length, MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true - if (isDefault.HasValue && isDefault.Value) - { - if (Options != null) - if (Options.Any(x => x.IsDefault.HasValue && x.IsDefault.Value)) - throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - } + if (isDefault == true && Options?.Any(x => x.IsDefault == true) == true) + throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - SlashCommandOptionBuilder option = new SlashCommandOptionBuilder + var option = new SlashCommandOptionBuilder { Name = name, Description = description, @@ -199,7 +187,8 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t Options = options, Type = type, IsAutocomplete = isAutocomplete, - Choices = choices != null ? new List(choices) : null + Choices = (choices ?? Array.Empty()).ToList(), + ChannelTypes = channelTypes }; return AddOption(option); @@ -212,14 +201,12 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t /// The current builder. public SlashCommandBuilder AddOption(SlashCommandOptionBuilder option) { - if (Options == null) - Options = new List(); + Options ??= new List(); if (Options.Count >= MaxOptionsCount) - throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); + throw new InvalidOperationException($"Cannot have more than {MaxOptionsCount} options!"); - if (option == null) - throw new ArgumentNullException(nameof(option), "Option cannot be null"); + Preconditions.NotNull(option, nameof(option)); Options.Add(option); return this; @@ -235,10 +222,9 @@ public SlashCommandBuilder AddOptions(params SlashCommandOptionBuilder[] options throw new ArgumentNullException(nameof(options), "Options cannot be null!"); if (options.Length == 0) - throw new ArgumentException(nameof(options), "Options cannot be empty!"); + throw new ArgumentException("Options cannot be empty!", nameof(options)); - if (Options == null) - Options = new List(); + Options ??= new List(); if (Options.Count + options.Length > MaxOptionsCount) throw new ArgumentOutOfRangeException(nameof(options), $"Cannot have more than {MaxOptionsCount} options!"); @@ -274,14 +260,13 @@ public string Name get => _name; set { - if (value?.Length > SlashCommandBuilder.MaxNameLength) - throw new ArgumentException($"Name length must be less than or equal to {SlashCommandBuilder.MaxNameLength}"); - if (value?.Length < 1) - throw new ArgumentException("Name length must at least 1 characters in length"); - if (value != null) + { + Preconditions.AtLeast(value.Length, 1, nameof(value)); + Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxNameLength, nameof(value)); if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) - throw new ArgumentException("Option name cannot contian any special characters or whitespaces!"); + throw new ArgumentException("Option name cannot contain any special characters or whitespaces!", nameof(value)); + } _name = value; } @@ -295,10 +280,11 @@ public string Description get => _description; set { - if (value?.Length > SlashCommandBuilder.MaxDescriptionLength) - throw new ArgumentException($"Description length must be less than or equal to {SlashCommandBuilder.MaxDescriptionLength}"); - if (value?.Length < 1) - throw new ArgumentException("Description length must at least 1 character in length"); + if (value != null) + { + Preconditions.AtLeast(value.Length, 1, nameof(value)); + Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(value)); + } _description = value; } @@ -334,6 +320,11 @@ public string Description /// public List Options { get; set; } + /// + /// Gets or sets the allowed channel types for this option. + /// + public List ChannelTypes { get; set; } + /// /// Builds the current option. /// @@ -343,21 +334,22 @@ public ApplicationCommandOptionProperties Build() bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; if (isSubType && (Options == null || !Options.Any())) - throw new ArgumentException(nameof(Options), "SubCommands/SubCommandGroups must have at least one option"); + throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option"); - if (!isSubType && (Options != null && Options.Any()) && Type != ApplicationCommandOptionType.SubCommand) - throw new ArgumentException(nameof(Options), $"Cannot have options on {Type} type"); + if (!isSubType && Options != null && Options.Any() && Type != ApplicationCommandOptionType.SubCommand) + throw new InvalidOperationException($"Cannot have options on {Type} type"); - return new ApplicationCommandOptionProperties() + return new ApplicationCommandOptionProperties { Name = Name, Description = Description, IsDefault = IsDefault, IsRequired = IsRequired, Type = Type, - Options = Options?.Count > 0 ? new List(Options.Select(x => x.Build())) : null, + Options = Options?.Count > 0 ? Options.Select(x => x.Build()).ToList() : new List(), Choices = Choices, - IsAutocomplete = IsAutocomplete + IsAutocomplete = IsAutocomplete, + ChannelTypes = ChannelTypes }; } @@ -369,11 +361,14 @@ public ApplicationCommandOptionProperties Build() /// The description of this option. /// If this option is required for this command. /// If this option is the default option. + /// If this option supports autocomplete. /// The options of the option to add. + /// The allowed channel types for this option. /// The choices of this option. /// The current builder. public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? isRequired = null, bool isDefault = false, bool isAutocomplete = false, List options = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? isRequired = null, bool isDefault = false, bool isAutocomplete = false, List options = null, + List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -383,7 +378,7 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contian any special characters or whitespaces!", nameof(name)); + throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); // same with description Preconditions.NotNullOrEmpty(description, nameof(description)); @@ -391,14 +386,10 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Preconditions.AtMost(description.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(description)); // make sure theres only one option with default set to true - if (isDefault) - { - if (Options != null) - if (Options.Any(x => x.IsDefault.HasValue && x.IsDefault.Value)) - throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - } + if (isDefault && Options?.Any(x => x.IsDefault == true) == true) + throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); - SlashCommandOptionBuilder option = new SlashCommandOptionBuilder + var option = new SlashCommandOptionBuilder { Name = name, Description = description, @@ -407,7 +398,8 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption IsDefault = isDefault, Options = options, Type = type, - Choices = choices != null ? new List(choices) : null + Choices = (choices ?? Array.Empty()).ToList(), + ChannelTypes = channelTypes }; return AddOption(option); @@ -419,14 +411,12 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption /// The current builder. public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) { - if (Options == null) - Options = new List(); + Options ??= new List(); if (Options.Count >= SlashCommandBuilder.MaxOptionsCount) - throw new ArgumentOutOfRangeException(nameof(Choices), $"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); + throw new InvalidOperationException($"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); - if (option == null) - throw new ArgumentNullException(nameof(option), "Option cannot be null"); + Preconditions.NotNull(option, nameof(option)); Options.Add(option); return this; @@ -489,17 +479,13 @@ public SlashCommandOptionBuilder AddChoice(string name, long value) private SlashCommandOptionBuilder AddChoiceInternal(string name, object value) { - if (Choices == null) - Choices = new List(); + Choices ??= new List(); if (Choices.Count >= MaxChoiceCount) - throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); - - if (name == null) - throw new ArgumentNullException($"{nameof(name)} cannot be null!"); + throw new InvalidOperationException($"Cannot add more than {MaxChoiceCount} choices!"); - if (value == null) - throw new ArgumentNullException($"{nameof(value)} cannot be null!"); + Preconditions.NotNull(name, nameof(name)); + Preconditions.NotNull(value, nameof(value)); Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, 100, nameof(name)); @@ -510,7 +496,7 @@ private SlashCommandOptionBuilder AddChoiceInternal(string name, object value) Preconditions.AtMost(str.Length, 100, nameof(value)); } - Choices.Add(new ApplicationCommandOptionChoiceProperties() + Choices.Add(new ApplicationCommandOptionChoiceProperties { Name = name, Value = value @@ -519,6 +505,20 @@ private SlashCommandOptionBuilder AddChoiceInternal(string name, object value) return this; } + /// + /// Adds a channel type to the current option. + /// + /// The to add. + /// The current builder. + public SlashCommandOptionBuilder AddChannelType(ChannelType channelType) + { + ChannelTypes ??= new List(); + + ChannelTypes.Add(channelType); + + return this; + } + /// /// Sets the current builders name. /// @@ -564,6 +564,17 @@ public SlashCommandOptionBuilder WithDefault(bool value) return this; } + /// + /// Sets the current builders autocomplete field. + /// + /// The value to set. + /// The current builder. + public SlashCommandOptionBuilder WithAutocomplete(bool value) + { + IsAutocomplete = value; + return this; + } + /// /// Sets the current type of this builder. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs index 9405b18813..20ba2868f7 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 5b92e02a56..0304120f50 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -408,22 +408,22 @@ public Embed Build() if (Length > MaxEmbedLength) throw new InvalidOperationException($"Total embed length must be less than or equal to {MaxEmbedLength}."); if (!string.IsNullOrEmpty(Url)) - UrlValidation.Validate(Url); + UrlValidation.Validate(Url, true); if (!string.IsNullOrEmpty(ThumbnailUrl)) - UrlValidation.Validate(ThumbnailUrl); - if (!string.IsNullOrEmpty(ImageUrl) && !ImageUrl.StartsWith("attachment://", StringComparison.Ordinal)) - UrlValidation.Validate(ImageUrl); + UrlValidation.Validate(ThumbnailUrl, true); + if (!string.IsNullOrEmpty(ImageUrl)) + UrlValidation.Validate(ImageUrl, true); if (Author != null) { if (!string.IsNullOrEmpty(Author.Url)) - UrlValidation.Validate(Author.Url); + UrlValidation.Validate(Author.Url, true); if (!string.IsNullOrEmpty(Author.IconUrl)) - UrlValidation.Validate(Author.IconUrl); + UrlValidation.Validate(Author.IconUrl, true); } if(Footer != null) { if (!string.IsNullOrEmpty(Footer.IconUrl)) - UrlValidation.Validate(Footer.IconUrl); + UrlValidation.Validate(Footer.IconUrl, true); } var fields = ImmutableArray.CreateBuilder(Fields.Count); for (int i = 0; i < Fields.Count; i++) diff --git a/src/Discord.Net.Core/Entities/Messages/IAttachment.cs b/src/Discord.Net.Core/Entities/Messages/IAttachment.cs index 6557779984..e94e9f97c4 100644 --- a/src/Discord.Net.Core/Entities/Messages/IAttachment.cs +++ b/src/Discord.Net.Core/Entities/Messages/IAttachment.cs @@ -55,5 +55,12 @@ public interface IAttachment /// The width of this attachment if it is a picture; otherwise null. /// int? Width { get; } + /// + /// Gets whether or not this attachment is ephemeral. + /// + /// + /// if the attachment is ephemeral; otherwise . + /// + bool Ephemeral { get; } } } diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index 39419f0683..f5f2ca0076 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -53,6 +53,13 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// string Content { get; } /// + /// Gets the clean content for this message. + /// + /// + /// A string that contains the body of the message stripped of mentions, markdown, emojis and pings; note that this field may be empty if there is an embed. + /// + string CleanContent { get; } + /// /// Gets the time this message was sent. /// /// @@ -187,7 +194,15 @@ public interface IMessage : ISnowflakeEntity, IDeletable /// A message's flags, if any is associated. /// MessageFlags? Flags { get; } - + + /// + /// Gets the interaction this message is a response to. + /// + /// + /// A if the message is a response to an interaction; otherwise . + /// + IMessageInteraction Interaction { get; } + /// /// Adds a reaction to this message. /// diff --git a/src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs b/src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs new file mode 100644 index 0000000000..ebd03b627f --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/IMessageInteraction.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a partial within a message. + /// + public interface IMessageInteraction + { + /// + /// Gets the snowflake id of the interaction. + /// + ulong Id { get; } + + /// + /// Gets the type of the interaction. + /// + InteractionType Type { get; } + + /// + /// Gets the name of the application command used. + /// + string Name { get; } + + /// + /// Gets the who invoked the interaction. + /// + IUser User { get; } + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs b/src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs new file mode 100644 index 0000000000..cbbebd932a --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/MessageInteraction.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Represents a partial within a message. + /// + /// The type of the user. + public class MessageInteraction : IMessageInteraction where TUser : IUser + { + /// + /// Gets the snowflake id of the interaction. + /// + public ulong Id { get; } + + /// + /// Gets the type of the interaction. + /// + public InteractionType Type { get; } + + /// + /// Gets the name of the application command used. + /// + public string Name { get; } + + /// + /// Gets the who invoked the interaction. + /// + public TUser User { get; } + + internal MessageInteraction(ulong id, InteractionType type, string name, TUser user) + { + Id = id; + Type = type; + Name = name; + User = user; + } + + IUser IMessageInteraction.User => User; + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/MessageType.cs b/src/Discord.Net.Core/Entities/Messages/MessageType.cs index de30d80474..b83f884347 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageType.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageType.cs @@ -81,26 +81,30 @@ public enum MessageType /// The message is an inline reply. /// /// - /// Only available in API v8 + /// Only available in API v8. /// Reply = 19, /// - /// The message is an Application Command + /// The message is an Application Command. /// /// - /// Only available in API v8 + /// Only available in API v8. /// ApplicationCommand = 20, /// /// The message that starts a thread. /// /// - /// Only available in API v9 + /// Only available in API v9. /// ThreadStarterMessage = 21, /// - /// The message for a invite reminder + /// The message for a invite reminder. /// - GuildInviteReminder = 22 + GuildInviteReminder = 22, + /// + /// The message for a context menu command. + /// + ContextMenuCommand = 23, } } diff --git a/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs b/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs index d24a38534c..82e6b15a49 100644 --- a/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs +++ b/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs @@ -1,15 +1,25 @@ namespace Discord { - /// Defines the types of formats for stickers. + /// + /// Defines the types of formats for stickers. + /// public enum StickerFormatType { - /// Default value for a sticker format type. + /// + /// Default value for a sticker format type. + /// None = 0, - /// The sticker format type is png. + /// + /// The sticker format type is png. + /// Png = 1, - /// The sticker format type is apng. + /// + /// The sticker format type is apng. + /// Apng = 2, - /// The sticker format type is lottie. - Lottie = 3, + /// + /// The sticker format type is lottie. + /// + Lottie = 3 } } diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs index 829b35098a..347b0daaa8 100644 --- a/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTag.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { @@ -24,18 +20,13 @@ public class TimestampTag /// /// Converts the current timestamp tag to the string representation supported by discord. /// - /// If the is null then the default 0 will be used. + /// If the is null then the default 0 will be used. /// /// - /// A string thats compatable in a discord message, ex: <t:1625944201:f> + /// A string that is compatible in a discord message, ex: <t:1625944201:f> public override string ToString() { - if (Time == null) - return $""; - - var offset = (DateTimeOffset)this.Time; - - return $""; + return $""; } /// @@ -46,7 +37,7 @@ public override string ToString() /// The newly create timestamp tag. public static TimestampTag FromDateTime(DateTime time, TimestampTagStyles style = TimestampTagStyles.ShortDateTime) { - return new TimestampTag() + return new TimestampTag { Style = style, Time = time diff --git a/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs index 9c83a070e8..89f3c79b51 100644 --- a/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs +++ b/src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs index 5410075ba7..9a99b34f1d 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// @@ -18,6 +12,6 @@ public enum ApplicationCommandPermissionTarget /// /// The target of the permission is a user. /// - User = 2, + User = 2 } } diff --git a/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs b/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs index d76a579d9a..45e24b7fa9 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs @@ -110,12 +110,6 @@ public enum ChannelPermission : ulong /// ManageEmojis = 0x00_40_00_00_00, - /// - /// Allows members to use slash commands in text channels. - /// - [Obsolete("UseSlashCommands has been replaced by UseApplicationCommands", true)] - UseSlashCommands = 0x00_80_00_00_00, - /// /// Allows members to use slash commands in text channels. /// @@ -131,17 +125,6 @@ public enum ChannelPermission : ulong /// ManageThreads = 0x04_00_00_00_00, - /// - /// Allows for creating and participating in threads - /// - [Obsolete("UsePublicThreads has been replaced by CreatePublicThreads and SendMessagesInThreads", true)] - UsePublicThreads = 0x08_00_00_00_00, - - /// - /// Allows for creating and participating in private threads - /// - [Obsolete("UsePrivateThreads has been replaced by CreatePrivateThreads and SendMessagesInThreads", true)] - UsePrivateThreads = 0x10_00_00_00_00, /// /// Allows for creating public threads. /// diff --git a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs index 11130731e7..ee5c9984ad 100644 --- a/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs @@ -85,7 +85,7 @@ public static ChannelPermissions All(IChannel channel) /// If true, a user may stream video in a voice channel. public bool Stream => Permissions.GetValue(RawValue, ChannelPermission.Stream); - /// If true, a user may adjust role permissions. This also implictly grants all other permissions. + /// If true, a user may adjust role permissions. This also implicitly grants all other permissions. public bool ManageRoles => Permissions.GetValue(RawValue, ChannelPermission.ManageRoles); /// If true, a user may edit the webhooks for this channel. public bool ManageWebhooks => Permissions.GetValue(RawValue, ChannelPermission.ManageWebhooks); @@ -103,7 +103,7 @@ public static ChannelPermissions All(IChannel channel) public bool UseExternalStickers => Permissions.GetValue(RawValue, ChannelPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. public bool SendMessagesInThreads => Permissions.GetValue(RawValue, ChannelPermission.SendMessagesInThreads); - /// If true, a user launch application activites in voice channels in this guild. + /// If true, a user launch application activities in voice channels in this guild. public bool StartEmbeddedActivities => Permissions.GetValue(RawValue, ChannelPermission.StartEmbeddedActivities); /// Creates a new with the provided packed value. diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs index 4be7244537..e738fec4c7 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs index 746981c6e3..ac2f7276b4 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs @@ -176,11 +176,6 @@ public enum GuildPermission : ulong /// ManageEmojisAndStickers = 0x40_00_00_00, /// - /// Allows members to use slash commands in text channels. - /// - [Obsolete("UseSlashCommands has been replaced by UseApplicationCommands", true)] - UseSlashCommands = 0x80_00_00_00, - /// /// Allows members to use application commands like slash commands and context menus in text channels. /// UseApplicationCommands = 0x80_00_00_00, @@ -205,16 +200,6 @@ public enum GuildPermission : ulong /// CreatePrivateThreads = 0x10_00_00_00_00, /// - /// Allows for creating public threads. - /// - [Obsolete("UsePublicThreads has been replaced by CreatePublicThreads and SendMessagesInThreads", true)] - UsePublicThreads = 0x08_00_00_00_00, - /// - /// Allows for creating private threads. - /// - [Obsolete("UsePrivateThreads has been replaced by CreatePrivateThreads and SendMessagesInThreads", true)] - UsePrivateThreads = 0x10_00_00_00_00, - /// /// Allows the usage of custom stickers from other servers. /// UseExternalStickers = 0x20_00_00_00_00, diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs index 8924936a08..31f74ea224 100644 --- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs @@ -97,7 +97,7 @@ public struct GuildPermissions public bool UseExternalStickers => Permissions.GetValue(RawValue, GuildPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. public bool SendMessagesInThreads => Permissions.GetValue(RawValue, GuildPermission.SendMessagesInThreads); - /// If true, a user launch application activites in voice channels in this guild. + /// If true, a user launch application activities in voice channels in this guild. public bool StartEmbeddedActivities => Permissions.GetValue(RawValue, GuildPermission.StartEmbeddedActivities); /// Creates a new with the provided packed value. diff --git a/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs b/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs index cff938465f..0e634ad1aa 100644 --- a/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs +++ b/src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs @@ -97,7 +97,7 @@ public static OverwritePermissions DenyAll(IChannel channel) public PermValue UseExternalStickers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.UseExternalStickers); /// If true, a user may send messages in threads in this guild. public PermValue SendMessagesInThreads => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SendMessagesInThreads); - /// If true, a user launch application activites in voice channels in this guild. + /// If true, a user launch application activities in voice channels in this guild. public PermValue StartEmbeddedActivities => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.StartEmbeddedActivities); /// Creates a new OverwritePermissions with the provided allow and deny packed values. diff --git a/src/Discord.Net.Core/Entities/Roles/IRole.cs b/src/Discord.Net.Core/Entities/Roles/IRole.cs index c02322be94..c9e7ffef73 100644 --- a/src/Discord.Net.Core/Entities/Roles/IRole.cs +++ b/src/Discord.Net.Core/Entities/Roles/IRole.cs @@ -52,6 +52,13 @@ public interface IRole : ISnowflakeEntity, IDeletable, IMentionable, IComparable /// string Name { get; } /// + /// Gets the icon of this role. + /// + /// + /// A string containing the hash of this role's icon. + /// + string Icon { get; } + /// /// Gets the permissions granted to members of this role. /// /// @@ -86,5 +93,13 @@ public interface IRole : ISnowflakeEntity, IDeletable, IMentionable, IComparable /// A task that represents the asynchronous modification operation. /// Task ModifyAsync(Action func, RequestOptions options = null); + + /// + /// Gets the image url of the icon role. + /// + /// + /// An image url of the icon role. + /// + string GetIconUrl(); } } diff --git a/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs index 03f4ac2eb3..9cba38c802 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Discord @@ -51,7 +48,7 @@ public interface ICustomSticker : ISticker /// Deletes the current sticker. /// /// - /// The bot neeeds the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. + /// The bot needs the MANAGE_EMOJIS_AND_STICKERS permission inside the guild in order to delete stickers. /// /// The options to be used when sending the request. /// diff --git a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs index a3c520b4ac..9deea753f7 100644 --- a/src/Discord.Net.Core/Entities/Stickers/ISticker.cs +++ b/src/Discord.Net.Core/Entities/Stickers/ISticker.cs @@ -1,6 +1,4 @@ -using System; using System.Collections.Generic; -using System.Threading.Tasks; namespace Discord { @@ -57,12 +55,12 @@ public interface ISticker : IStickerItem new StickerFormatType Format { get; } /// - /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts + /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts. /// bool? IsAvailable { get; } /// - /// Gets the standard sticker's sort order within its pack + /// Gets the standard sticker's sort order within its pack. /// int? SortOrder { get; } /// diff --git a/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs b/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs index 3825a27026..07ea63db98 100644 --- a/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs +++ b/src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs index 76d424a470..c0c90aa69a 100644 --- a/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs +++ b/src/Discord.Net.Core/Entities/Stickers/StickerPack.cs @@ -1,16 +1,12 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { /// /// Represents a discord sticker pack. /// - /// The type of the stickers within the collection + /// The type of the stickers within the collection. public class StickerPack where TSticker : ISticker { /// diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs b/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs index 21267cdda3..5f51e5f3dd 100644 --- a/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs +++ b/src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord { diff --git a/src/Discord.Net.Core/Entities/Stickers/StickerType.cs b/src/Discord.Net.Core/Entities/Stickers/StickerType.cs index 35946df7a2..0db5507722 100644 --- a/src/Discord.Net.Core/Entities/Stickers/StickerType.cs +++ b/src/Discord.Net.Core/Entities/Stickers/StickerType.cs @@ -1,13 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord { /// - /// Represents a type of sticker + /// Represents a type of sticker.. /// public enum StickerType { @@ -19,6 +13,6 @@ public enum StickerType /// /// Represents a sticker that was created within a guild. /// - Guild = 2, + Guild = 2 } } diff --git a/src/Discord.Net.Core/Extensions/MessageExtensions.cs b/src/Discord.Net.Core/Extensions/MessageExtensions.cs index 3b21c128ac..c187ecd5b1 100644 --- a/src/Discord.Net.Core/Extensions/MessageExtensions.cs +++ b/src/Discord.Net.Core/Extensions/MessageExtensions.cs @@ -24,7 +24,7 @@ public static string GetJumpUrl(this IMessage msg) /// Add multiple reactions to a message. /// /// - /// This method does not bulk add reactions! It will send a request for each reaction inculded. + /// This method does not bulk add reactions! It will send a request for each reaction included. /// /// /// @@ -76,7 +76,7 @@ public static async Task RemoveReactionsAsync(this IUserMessage msg, IUser user, /// /// Sends an inline reply that references a message. /// - /// The message that is being replyed on. + /// The message that is being replied on. /// The message to be sent. /// Determines whether the message should be read aloud by Discord or not. /// The to be sent. diff --git a/src/Discord.Net.Core/Format.cs b/src/Discord.Net.Core/Format.cs index 0ab70f89ca..63f9d15a6d 100644 --- a/src/Discord.Net.Core/Format.cs +++ b/src/Discord.Net.Core/Format.cs @@ -1,4 +1,5 @@ using System.Text; +using System.Text.RegularExpressions; namespace Discord { @@ -14,7 +15,7 @@ public static class Format public static string Italics(string text) => $"*{text}*"; /// Returns a markdown-formatted string with underline formatting. public static string Underline(string text) => $"__{text}__"; - /// Returns a markdown-formatted string with strikethrough formatting. + /// Returns a markdown-formatted string with strike-through formatting. public static string Strikethrough(string text) => $"~~{text}~~"; /// Returns a string with spoiler formatting. public static string Spoiler(string text) => $"||{text}||"; @@ -91,5 +92,17 @@ public static string BlockQuote(string text) return $">>> {text}"; } + + /// + /// Remove discord supported markdown from text. + /// + /// The to remove markdown from. + /// Gets the unformatted text. + public static string StripMarkDown(string text) + { + //Remove discord supported markdown + var newText = Regex.Replace(text, @"(\*|_|`|~|>|\\)", ""); + return newText; + } } } diff --git a/src/Discord.Net.Core/Net/ApplicationCommandException.cs b/src/Discord.Net.Core/Net/ApplicationCommandException.cs index acf19afe46..62c80b388d 100644 --- a/src/Discord.Net.Core/Net/ApplicationCommandException.cs +++ b/src/Discord.Net.Core/Net/ApplicationCommandException.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.Net { diff --git a/src/Discord.Net.Core/RequestOptions.cs b/src/Discord.Net.Core/RequestOptions.cs index 101925ab2d..46aa2681fd 100644 --- a/src/Discord.Net.Core/RequestOptions.cs +++ b/src/Discord.Net.Core/RequestOptions.cs @@ -16,10 +16,10 @@ public class RequestOptions public static RequestOptions Default => new RequestOptions(); /// - /// Gets or sets the maximum time to wait for for this request to complete. + /// Gets or sets the maximum time to wait for this request to complete. /// /// - /// Gets or set the max time, in milliseconds, to wait for for this request to complete. If + /// Gets or set the max time, in milliseconds, to wait for this request to complete. If /// null, a request will not time out. If a rate limit has been triggered for this request's bucket /// and will not be unpaused in time, this request will fail immediately. /// diff --git a/src/Discord.Net.Core/Utils/UrlValidation.cs b/src/Discord.Net.Core/Utils/UrlValidation.cs index 23234b8996..8e877bd4ea 100644 --- a/src/Discord.Net.Core/Utils/UrlValidation.cs +++ b/src/Discord.Net.Core/Utils/UrlValidation.cs @@ -6,16 +6,36 @@ internal static class UrlValidation { /// /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https + /// should be used for url buttons. /// - /// url to validate before sending to Discord. + /// The URL to validate before sending to Discord. + /// to allow the attachment:// protocol; otherwise . /// A URL must include a protocol (http or https). - /// true if url is valid by our standard, false if null, throws an error upon invalid - public static bool Validate(string url) + /// true if URL is valid by our standard, false if null, throws an error upon invalid. + public static bool Validate(string url, bool allowAttachments = false) { if (string.IsNullOrEmpty(url)) return false; - if(!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)))) - throw new InvalidOperationException($"Url {url} must be include its protocol (either HTTP or HTTPS)"); + if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || (allowAttachments ? url.StartsWith("attachment://", StringComparison.Ordinal) : false))) + throw new InvalidOperationException($"The url {url} must include a protocol (either {(allowAttachments ? "HTTP, HTTPS, or ATTACHMENT" : "HTTP or HTTPS")})"); + return true; + } + + /// + /// Not full URL validation right now. Just Ensures the protocol is either http, https, or discord + /// should be used everything other than url buttons. + /// + /// The URL to validate before sending to discord. + /// A URL must include a protocol (either http, https, or discord). + /// true if the URL is valid by our standard, false if null, throws an error upon invalid. + public static bool ValidateButton(string url) + { + if (string.IsNullOrEmpty(url)) + return false; + if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase))) + throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP, HTTPS, or DISCORD)"); return true; } } diff --git a/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs b/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs index 5f9d4b5d61..d920e97103 100644 --- a/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs +++ b/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs @@ -108,7 +108,6 @@ await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", using (channel.EnterTypingState()) await LongRunningAsync(); #endregion - } } } diff --git a/src/Discord.Net.Examples/Discord.Net.Examples.csproj b/src/Discord.Net.Examples/Discord.Net.Examples.csproj index ec02534280..3371432b83 100644 --- a/src/Discord.Net.Examples/Discord.Net.Examples.csproj +++ b/src/Discord.Net.Examples/Discord.Net.Examples.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj b/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj index e143340e17..ec7ee9b8f2 100644 --- a/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj +++ b/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj @@ -3,8 +3,9 @@ Discord.Net.Providers.WS4Net Discord.Providers.WS4Net - An optional WebSocket client provider for Discord.Net using WebSocket4Net + An optional WebSocket client provider for Discord.Net Labs using WebSocket4Net netstandard2.0 + Discord.Net.Labs.Providers.WS4Net diff --git a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs index 92778849cf..9dede7e034 100644 --- a/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ActionRowComponent.cs @@ -1,10 +1,5 @@ using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -26,7 +21,7 @@ internal ActionRowComponent(Discord.ActionRowComponent c) { ComponentType.Button => new ButtonComponent(x as Discord.ButtonComponent), ComponentType.SelectMenu => new SelectMenuComponent(x as Discord.SelectMenuComponent), - _ => null, + _ => null }; }).ToArray(); } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs index 9de2727066..81598b96ea 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommand.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs index bb395df139..a98ed77d63 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System.Collections.Generic; namespace Discord.API { @@ -19,6 +18,5 @@ internal class ApplicationCommandInteractionData : IResolvable, IDiscordInteract [JsonProperty("type")] public ApplicationCommandType Type { get; set; } - } } diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs index 5f75c901f7..1e488c4e67 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System.Collections.Generic; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index c7b304c66f..b437d0ebf1 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -33,11 +29,14 @@ internal class ApplicationCommandOption [JsonProperty("autocomplete")] public Optional Autocomplete { get; set; } + [JsonProperty("channel_types")] + public Optional ChannelTypes { get; set; } + public ApplicationCommandOption() { } public ApplicationCommandOption(IApplicationCommandOption cmd) { - Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice() + Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice { Name = x.Name, Value = x.Value @@ -45,38 +44,30 @@ public ApplicationCommandOption(IApplicationCommandOption cmd) Options = cmd.Options.Select(x => new ApplicationCommandOption(x)).ToArray(); - Required = cmd.IsRequired.HasValue - ? cmd.IsRequired.Value - : Optional.Unspecified; - Default = cmd.IsDefault.HasValue - ? cmd.IsDefault.Value - : Optional.Unspecified; + ChannelTypes = cmd.ChannelTypes.ToArray(); + + Required = cmd.IsRequired ?? Optional.Unspecified; + Default = cmd.IsDefault ?? Optional.Unspecified; Name = cmd.Name; Type = cmd.Type; Description = cmd.Description; } - public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties option) + public ApplicationCommandOption(ApplicationCommandOptionProperties option) { - Choices = option.Choices != null - ? option.Choices.Select(x => new ApplicationCommandOptionChoice() - { - Name = x.Name, - Value = x.Value - }).ToArray() - : Optional.Unspecified; - - Options = option.Options != null - ? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; - - Required = option.IsRequired.HasValue - ? option.IsRequired.Value - : Optional.Unspecified; - - Default = option.IsDefault.HasValue - ? option.IsDefault.Value - : Optional.Unspecified; + Choices = option.Choices?.Select(x => new ApplicationCommandOptionChoice + { + Name = x.Name, + Value = x.Value + }).ToArray() ?? Optional.Unspecified; + + Options = option.Options?.Select(x => new ApplicationCommandOption(x)).ToArray() ?? Optional.Unspecified; + + Required = option.IsRequired ?? Optional.Unspecified; + + Default = option.IsDefault ?? Optional.Unspecified; + + ChannelTypes = option.ChannelTypes?.ToArray() ?? Optional.Unspecified; Name = option.Name; Type = option.Type; diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs index b847fceba3..6f84437f63 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs index 281ded90f2..8bde80f50b 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/Attachment.cs b/src/Discord.Net.Rest/API/Common/Attachment.cs index 3ac445f8ca..0d98fc3a4a 100644 --- a/src/Discord.Net.Rest/API/Common/Attachment.cs +++ b/src/Discord.Net.Rest/API/Common/Attachment.cs @@ -18,5 +18,7 @@ internal class Attachment public Optional Height { get; set; } [JsonProperty("width")] public Optional Width { get; set; } + [JsonProperty("ephemeral")] + public Optional Ephemeral { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/AuditLog.cs b/src/Discord.Net.Rest/API/Common/AuditLog.cs index cd8ad147d9..c8bd6d3e2e 100644 --- a/src/Discord.Net.Rest/API/Common/AuditLog.cs +++ b/src/Discord.Net.Rest/API/Common/AuditLog.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; namespace Discord.API { @@ -7,6 +7,12 @@ internal class AuditLog [JsonProperty("webhooks")] public Webhook[] Webhooks { get; set; } + [JsonProperty("threads")] + public Channel[] Threads { get; set; } + + [JsonProperty("integrations")] + public Integration[] Integrations { get; set; } + [JsonProperty("users")] public User[] Users { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs index 7458a19cbf..9626ad67ec 100644 --- a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs +++ b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs index ea2cd4fd9d..2184a0e987 100644 --- a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs index a9d5b66f0e..1419f93b66 100644 --- a/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs +++ b/src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -15,10 +10,13 @@ internal class AutocompleteInteractionDataOption [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("options")] + public Optional Options { get; set; } + [JsonProperty("value")] - public object Value { get; set; } + public Optional Value { get; set; } [JsonProperty("focused")] - public bool Focused { get; set; } + public Optional Focused { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs index 8870400061..7f737d7ad4 100644 --- a/src/Discord.Net.Rest/API/Common/ButtonComponent.cs +++ b/src/Discord.Net.Rest/API/Common/ButtonComponent.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -45,16 +40,16 @@ public ButtonComponent(Discord.ButtonComponent c) { if (c.Emote is Emote e) { - Emote = new Emoji() + Emote = new Emoji { Name = e.Name, Animated = e.Animated, - Id = e.Id, + Id = e.Id }; } else { - Emote = new Emoji() + Emote = new Emoji { Name = c.Emote.Name }; diff --git a/src/Discord.Net.Rest/API/Common/ChannelThreads.cs b/src/Discord.Net.Rest/API/Common/ChannelThreads.cs index eccac8e54c..94b2396bf1 100644 --- a/src/Discord.Net.Rest/API/Common/ChannelThreads.cs +++ b/src/Discord.Net.Rest/API/Common/ChannelThreads.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs index 3ab5ef6508..cc74299f74 100644 --- a/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -19,6 +14,6 @@ internal class GuildApplicationCommandPermission public ulong GuildId { get; set; } [JsonProperty("permissions")] - public API.ApplicationCommandPermissions[] Permissions { get; set; } + public ApplicationCommandPermissions[] Permissions { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/Interaction.cs b/src/Discord.Net.Rest/API/Common/Interaction.cs index ebbc5fc1b7..7f953384d8 100644 --- a/src/Discord.Net.Rest/API/Common/Interaction.cs +++ b/src/Discord.Net.Rest/API/Common/Interaction.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs index 38b35c8ecd..b07ebff49e 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs @@ -11,7 +11,7 @@ internal class InteractionCallbackData public Optional Content { get; set; } [JsonProperty("embeds")] - public Optional Embeds { get; set; } + public Optional Embeds { get; set; } [JsonProperty("allowed_mentions")] public Optional AllowedMentions { get; set; } @@ -20,9 +20,9 @@ internal class InteractionCallbackData public Optional Flags { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } [JsonProperty("choices")] - public Optional Choices { get; set; } + public Optional Choices { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/InteractionResponse.cs b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs index e50e8076ef..93d4cd307e 100644 --- a/src/Discord.Net.Rest/API/Common/InteractionResponse.cs +++ b/src/Discord.Net.Rest/API/Common/InteractionResponse.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/Message.cs b/src/Discord.Net.Rest/API/Common/Message.cs index 3b9e5379a4..d33a03fe5a 100644 --- a/src/Discord.Net.Rest/API/Common/Message.cs +++ b/src/Discord.Net.Rest/API/Common/Message.cs @@ -32,7 +32,7 @@ internal class Message [JsonProperty("mention_everyone")] public Optional MentionEveryone { get; set; } [JsonProperty("mentions")] - public Optional[]> UserMentions { get; set; } + public Optional UserMentions { get; set; } [JsonProperty("mention_roles")] public Optional RoleMentions { get; set; } [JsonProperty("attachments")] @@ -59,6 +59,7 @@ internal class Message public Optional ReferencedMessage { get; set; } [JsonProperty("components")] public Optional Components { get; set; } + public Optional Interaction { get; set; } [JsonProperty("sticker_items")] public Optional StickerItems { get; set; } } diff --git a/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs index 5dc81e61ed..a7760911cd 100644 --- a/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs +++ b/src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/MessageInteraction.cs b/src/Discord.Net.Rest/API/Common/MessageInteraction.cs new file mode 100644 index 0000000000..48f2783964 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/MessageInteraction.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API +{ + internal class MessageInteraction + { + [JsonProperty("id")] + public ulong Id { get; set; } + [JsonProperty("type")] + public InteractionType Type { get; set; } + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("user")] + public User User { get; set; } + } +} diff --git a/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs b/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs index ddb9b0bc53..cc2f0d963c 100644 --- a/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs +++ b/src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/Role.cs b/src/Discord.Net.Rest/API/Common/Role.cs index 4c33956afe..09fb998856 100644 --- a/src/Discord.Net.Rest/API/Common/Role.cs +++ b/src/Discord.Net.Rest/API/Common/Role.cs @@ -8,6 +8,8 @@ internal class Role public ulong Id { get; set; } [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("icon")] + public string Icon { get; set; } [JsonProperty("color")] public uint Color { get; set; } [JsonProperty("hoist")] diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs index 16daa66ab6..0886a8fe90 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs index 06c8f7dc3b..d0a25a8296 100644 --- a/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs +++ b/src/Discord.Net.Rest/API/Common/SelectMenuOption.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -36,23 +31,23 @@ public SelectMenuOption(Discord.SelectMenuOption option) { if (option.Emote is Emote e) { - Emoji = new Emoji() + Emoji = new Emoji { Name = e.Name, Animated = e.Animated, - Id = e.Id, + Id = e.Id }; } else { - Emoji = new Emoji() + Emoji = new Emoji { Name = option.Emote.Name }; } } - Default = option.IsDefault.HasValue ? option.IsDefault.Value : Optional.Unspecified; + Default = option.IsDefault ?? Optional.Unspecified; } } } diff --git a/src/Discord.Net.Rest/API/Common/StageInstance.cs b/src/Discord.Net.Rest/API/Common/StageInstance.cs index 4cb5f58237..3ec6239497 100644 --- a/src/Discord.Net.Rest/API/Common/StageInstance.cs +++ b/src/Discord.Net.Rest/API/Common/StageInstance.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/Sticker.cs b/src/Discord.Net.Rest/API/Common/Sticker.cs index 45e6d18b37..b2c58d57c6 100644 --- a/src/Discord.Net.Rest/API/Common/Sticker.cs +++ b/src/Discord.Net.Rest/API/Common/Sticker.cs @@ -11,7 +11,7 @@ internal class Sticker [JsonProperty("name")] public string Name { get; set; } [JsonProperty("description")] - public string Desription { get; set; } + public string Description { get; set; } [JsonProperty("tags")] public Optional Tags { get; set; } [JsonProperty("type")] diff --git a/src/Discord.Net.Rest/API/Common/StickerItem.cs b/src/Discord.Net.Rest/API/Common/StickerItem.cs index 9ec0fb503b..4b24f711b3 100644 --- a/src/Discord.Net.Rest/API/Common/StickerItem.cs +++ b/src/Discord.Net.Rest/API/Common/StickerItem.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/StickerPack.cs b/src/Discord.Net.Rest/API/Common/StickerPack.cs index aa3314d7ce..3daaac5bfc 100644 --- a/src/Discord.Net.Rest/API/Common/StickerPack.cs +++ b/src/Discord.Net.Rest/API/Common/StickerPack.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Common/ThreadMember.cs b/src/Discord.Net.Rest/API/Common/ThreadMember.cs index d8ce15e920..3e30d2c959 100644 --- a/src/Discord.Net.Rest/API/Common/ThreadMember.cs +++ b/src/Discord.Net.Rest/API/Common/ThreadMember.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { @@ -18,7 +14,7 @@ internal class ThreadMember [JsonProperty("join_timestamp")] public DateTimeOffset JoinTimestamp { get; set; } - [JsonProperty("presense")] + [JsonProperty("presence")] public Optional Presence { get; set; } [JsonProperty("member")] diff --git a/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs index 0bc068c1c6..39e9bd13ed 100644 --- a/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs +++ b/src/Discord.Net.Rest/API/Common/ThreadMetadata.cs @@ -1,9 +1,5 @@ using Newtonsoft.Json; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API { diff --git a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs index 7fe8b10ad7..82f0befcdc 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs @@ -1,10 +1,4 @@ -using Discord.API; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { @@ -30,7 +24,7 @@ public CreateApplicationCommandParams(string name, string description, Applicati { Name = name; Description = description; - Options = Optional.Create(options); + Options = Optional.Create(options); Type = type; } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs index 294f9e1a5c..a1d59bb51c 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs index 225caaaae3..b330a01111 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs @@ -1,12 +1,6 @@ using Discord.Net.Rest; -using Newtonsoft.Json; -using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace Discord.API.Rest { internal class CreateStickerParams @@ -30,7 +24,7 @@ public IReadOnlyDictionary ToDictionary() if (File is FileStream fileStream) contentType = $"image/{Path.GetExtension(fileStream.Name)}"; - else if(FileName != null) + else if (FileName != null) contentType = $"image/{Path.GetExtension(FileName)}"; d["file"] = new MultipartFile(File, FileName ?? "image", contentType.Replace(".", "")); diff --git a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs index 2ed9466c07..5891c2c28e 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs index 5e42ee4c43..a557061f3b 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs index af8ee95d40..322875b8e8 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs index b2800a0662..a2c7cbee6b 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { @@ -19,7 +14,7 @@ internal class ModifyInteractionResponseParams public Optional AllowedMentions { get; set; } [JsonProperty("components")] - public Optional Components { get; set; } + public Optional Components { get; set; } [JsonProperty("flags")] public Optional Flags { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs index df73954de8..c09d8f2169 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs @@ -1,15 +1,9 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { internal class ModifyStageInstanceParams { - [JsonProperty("topic")] public Optional Topic { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs index 47331b5a06..bd538c72e1 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs index c62b3bfbbb..8c9216c3fc 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Discord; using Newtonsoft.Json; namespace Discord.API.Rest diff --git a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs index ed3701cad1..7810557ebf 100644 --- a/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs +++ b/src/Discord.Net.Rest/API/Rest/StartThreadParams.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Rest { diff --git a/src/Discord.Net.Rest/ClientHelper.cs b/src/Discord.Net.Rest/ClientHelper.cs index 4581219bbb..5debea27e8 100644 --- a/src/Discord.Net.Rest/ClientHelper.cs +++ b/src/Discord.Net.Rest/ClientHelper.cs @@ -194,17 +194,17 @@ public static async Task GetBotGatewayAsync(BaseDiscordClient client }; } - public static async Task> GetGlobalApplicationCommands(BaseDiscordClient client, + public static async Task> GetGlobalApplicationCommandsAsync(BaseDiscordClient client, RequestOptions options = null) { var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(options).ConfigureAwait(false); if (!response.Any()) - return new RestGlobalCommand[0]; + return Array.Empty(); return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); } - public static async Task GetGlobalApplicationCommand(BaseDiscordClient client, ulong id, + public static async Task GetGlobalApplicationCommandAsync(BaseDiscordClient client, ulong id, RequestOptions options = null) { var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options); @@ -212,55 +212,55 @@ public static async Task GetGlobalApplicationCommand(BaseDisc return model != null ? RestGlobalCommand.Create(client, model) : null; } - public static async Task> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, + public static async Task> GetGuildApplicationCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) { var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, options).ConfigureAwait(false); if (!response.Any()) - return new RestGuildCommand[0].ToImmutableArray(); + return ImmutableArray.Create(); return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); } - public static async Task GetGuildApplicationCommand(BaseDiscordClient client, ulong id, ulong guildId, + public static async Task GetGuildApplicationCommandAsync(BaseDiscordClient client, ulong id, ulong guildId, RequestOptions options = null) { var model = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, id, options); return model != null ? RestGuildCommand.Create(client, model, guildId) : null; } - public static async Task CreateGuildApplicationCommand(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties, + public static async Task CreateGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(client, guildId, properties, options); + var model = await InteractionHelper.CreateGuildCommandAsync(client, guildId, properties, options); return RestGuildCommand.Create(client, model, guildId); } - public static async Task CreateGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties properties, + public static async Task CreateGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGlobalCommand(client, properties, options); + var model = await InteractionHelper.CreateGlobalCommandAsync(client, properties, options); return RestGlobalCommand.Create(client, model); } - public static async Task> BulkOverwriteGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties[] properties, + public static async Task> BulkOverwriteGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGlobalCommands(client, properties, options); + var models = await InteractionHelper.BulkOverwriteGlobalCommandsAsync(client, properties, options); return models.Select(x => RestGlobalCommand.Create(client, x)).ToImmutableArray(); } - public static async Task> BulkOverwriteGuildApplicationCommand(BaseDiscordClient client, ulong guildId, + public static async Task> BulkOverwriteGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(client, guildId, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(client, guildId, properties, options); return models.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); } public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) => client.ApiClient.AddRoleAsync(guildId, userId, roleId, options); - + public static Task RemoveRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) => client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options); #endregion diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj index 3ed886616a..8407abfd68 100644 --- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj +++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj @@ -1,4 +1,4 @@ - + @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index f986aecde6..6979d7030b 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -320,6 +320,7 @@ public async Task GetChannelAsync(ulong guildId, ulong channelId, Reque var model = await SendAsync("GET", () => $"channels/{channelId}", ids, options: options).ConfigureAwait(false); if (!model.GuildId.IsSpecified || model.GuildId.Value != guildId) return null; + return model; } catch (HttpException ex) when (ex.HttpCode == HttpStatusCode.NotFound) { return null; } @@ -338,11 +339,16 @@ public async Task CreateGuildChannelAsync(ulong guildId, CreateGuildCha Preconditions.NotNull(args, nameof(args)); Preconditions.GreaterThan(args.Bitrate, 0, nameof(args.Bitrate)); Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); + Preconditions.LessThan(args.Name.Length, 100, nameof(args.Name)); + if (args.Topic.IsSpecified) + Preconditions.LessThan(args.Topic.Value.Length, 1024, nameof(args.Name)); + options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(guildId: guildId); return await SendJsonAsync("POST", () => $"guilds/{guildId}/channels", args, ids, options: options).ConfigureAwait(false); } + public async Task DeleteChannelAsync(ulong channelId, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -366,18 +372,27 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyG Preconditions.NotEqual(channelId, 0, nameof(channelId)); Preconditions.NotNull(args, nameof(args)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); - Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); + Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); + Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); + options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}", args, ids, options: options).ConfigureAwait(false); } + public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyTextChannelParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); Preconditions.NotNull(args, nameof(args)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); - Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); + Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); + + if(args.Name.IsSpecified) + Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); + if(args.Topic.IsSpecified) + Preconditions.LessThan(args.Topic.Value.Length, 1024, nameof(args.Name)); + Preconditions.AtLeast(args.SlowModeInterval, 0, nameof(args.SlowModeInterval)); Preconditions.AtMost(args.SlowModeInterval, 21600, nameof(args.SlowModeInterval)); options = RequestOptions.CreateOrClone(options); @@ -385,6 +400,7 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyT var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}", args, ids, options: options).ConfigureAwait(false); } + public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyVoiceChannelParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -392,12 +408,13 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyV Preconditions.AtLeast(args.Bitrate, 8000, nameof(args.Bitrate)); Preconditions.AtLeast(args.UserLimit, 0, nameof(args.UserLimit)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); - Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); + Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}", args, ids, options: options).ConfigureAwait(false); } + public async Task ModifyGuildChannelsAsync(ulong guildId, IEnumerable args, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); @@ -441,7 +458,7 @@ public async Task StartThreadAsync(ulong channelId, ulong messageId, St return await SendJsonAsync("POST", () => $"channels/{channelId}/messages/{messageId}/threads", args, bucket, options: options).ConfigureAwait(false); } - + public async Task StartThreadAsync(ulong channelId, StartThreadParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); @@ -517,7 +534,7 @@ public async Task GetActiveThreadsAsync(ulong channelId, Request var bucket = new BucketIds(channelId: channelId); - return await SendAsync("GET", () => $"channels/{channelId}/threads/active", bucket); + return await SendAsync("GET", () => $"channels/{channelId}/threads/active", bucket, options: options); } public async Task GetPublicArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, RequestOptions options = null) @@ -592,7 +609,6 @@ public async Task GetJoinedPrivateArchivedThreadsAsync(ulong cha #region Stage public async Task CreateStageInstanceAsync(CreateStageInstanceParams args, RequestOptions options = null) { - options = RequestOptions.CreateOrClone(options); var bucket = new BucketIds(); @@ -636,7 +652,7 @@ public async Task GetStageInstanceAsync(ulong channelId, RequestO { return await SendAsync("POST", () => $"stage-instances/{channelId}", bucket, options: options).ConfigureAwait(false); } - catch(HttpException httpEx) when (httpEx.HttpCode == HttpStatusCode.NotFound) + catch (HttpException httpEx) when (httpEx.HttpCode == HttpStatusCode.NotFound) { return null; } @@ -1137,7 +1153,7 @@ public async Task GetGlobalApplicationCommandAsync(ulong id, { return await SendAsync("GET", () => $"applications/{CurrentUserId}/commands/{id}", new BucketIds(), options: options).ConfigureAwait(false); } - catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } + catch (HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } } public async Task CreateGlobalApplicationCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) @@ -1208,7 +1224,7 @@ public async Task GetGuildApplicationCommandAsync(ulong guil { return await SendAsync("GET", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", bucket, options: options); } - catch(HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } + catch (HttpException x) when (x.HttpCode == HttpStatusCode.NotFound) { return null; } } public async Task CreateGuildApplicationCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) @@ -1236,7 +1252,7 @@ public async Task ModifyGuildApplicationCommandAsync(ModifyA var bucket = new BucketIds(guildId: guildId); - return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); + return await TrySendApplicationCommandAsync(SendJsonAsync("PATCH", () => $"applications/{CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options)).ConfigureAwait(false); } public async Task DeleteGuildApplicationCommandAsync(ulong guildId, ulong commandId, RequestOptions options = null) { @@ -1260,7 +1276,7 @@ public async Task BulkOverwriteGuildApplicationCommandsAsy #region Interaction Responses public async Task CreateInteractionResponseAsync(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { - if(response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) + if (response.Data.IsSpecified && response.Data.Value.Content.IsSpecified) Preconditions.AtMost(response.Data.Value.Content.Value?.Length ?? 0, 2000, nameof(response.Data.Value.Content)); options = RequestOptions.CreateOrClone(options); @@ -1309,7 +1325,7 @@ public async Task ModifyInteractionFollowupMessageAsync(ModifyInteracti Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(id, 0, nameof(id)); - if(args.Content.IsSpecified) + if (args.Content.IsSpecified) if (args.Content.Value.Length > DiscordConfig.MaxMessageSize) throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content)); @@ -2102,7 +2118,7 @@ protected async Task TrySendApplicationCommandAsync(Task sendTask) else return result; } - catch(HttpException x) + catch (HttpException x) { if (x.HttpCode == HttpStatusCode.BadRequest) { @@ -2214,7 +2230,7 @@ private static Func CreateBucketId(Expression> Array.Copy(elements, 0, methodArgs, 1, elements.Length); } - int endIndex = format.IndexOf('?'); //Dont include params + int endIndex = format.IndexOf('?'); //Don't include params if (endIndex == -1) endIndex = format.Length; diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs index c8f16a1f07..847ba68355 100644 --- a/src/Discord.Net.Rest/DiscordRestClient.cs +++ b/src/Discord.Net.Rest/DiscordRestClient.cs @@ -110,17 +110,17 @@ public Task GetWebhookAsync(ulong id, RequestOptions options = null => ClientHelper.GetWebhookAsync(this, id, options); public Task CreateGlobalCommand(ApplicationCommandProperties properties, RequestOptions options = null) - => ClientHelper.CreateGlobalApplicationCommand(this, properties, options); + => ClientHelper.CreateGlobalApplicationCommandAsync(this, properties, options); public Task CreateGuildCommand(ApplicationCommandProperties properties, ulong guildId, RequestOptions options = null) - => ClientHelper.CreateGuildApplicationCommand(this, guildId, properties, options); + => ClientHelper.CreateGuildApplicationCommandAsync(this, guildId, properties, options); public Task> GetGlobalApplicationCommands(RequestOptions options = null) - => ClientHelper.GetGlobalApplicationCommands(this, options); + => ClientHelper.GetGlobalApplicationCommandsAsync(this, options); public Task> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) - => ClientHelper.GetGuildApplicationCommands(this, guildId, options); + => ClientHelper.GetGuildApplicationCommandsAsync(this, guildId, options); public Task> BulkOverwriteGlobalCommands(ApplicationCommandProperties[] commandProperties, RequestOptions options = null) - => ClientHelper.BulkOverwriteGlobalApplicationCommand(this, commandProperties, options); + => ClientHelper.BulkOverwriteGlobalApplicationCommandAsync(this, commandProperties, options); public Task> BulkOverwriteGuildCommands(ApplicationCommandProperties[] commandProperties, ulong guildId, RequestOptions options = null) - => ClientHelper.BulkOverwriteGuildApplicationCommand(this, guildId, commandProperties, options); + => ClientHelper.BulkOverwriteGuildApplicationCommandAsync(this, guildId, commandProperties, options); public Task> BatchEditGuildCommandPermissions(ulong guildId, IDictionary permissions, RequestOptions options = null) => InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options); public Task DeleteAllGlobalCommandsAsync(RequestOptions options = null) @@ -231,7 +231,7 @@ async Task> IDiscordClient.GetGlobalApp => await GetGlobalApplicationCommands(options).ConfigureAwait(false); /// async Task IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) - => await ClientHelper.GetGlobalApplicationCommand(this, id, options).ConfigureAwait(false); + => await ClientHelper.GetGlobalApplicationCommandAsync(this, id, options).ConfigureAwait(false); #endregion } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs index 6969172038..b3aaf582cc 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Model = Discord.API.AuditLog; @@ -51,6 +51,7 @@ private static readonly Dictionary + /// Represents information for a stage. + /// + public class StageInfo + { + /// + /// Gets the topic of the stage channel. + /// + public string Topic { get; } + + /// + /// Gets the privacy level of the stage channel. + /// + public StagePrivacyLevel? PrivacyLevel { get; } + + /// + /// Gets the user who started the stage channel. + /// + public IUser User { get; } + + internal StageInfo(IUser user, StagePrivacyLevel? level, string topic) + { + Topic = topic; + PrivacyLevel = level; + User = user; + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs new file mode 100644 index 0000000000..eac99e87bc --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs @@ -0,0 +1,50 @@ +using System.Linq; +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a stage going live. + /// + public class StageInstanceCreateAuditLogData : IAuditLogData + { + /// + /// Gets the topic of the stage channel. + /// + public string Topic { get; } + + /// + /// Gets the privacy level of the stage channel. + /// + public StagePrivacyLevel PrivacyLevel { get; } + + /// + /// Gets the user who started the stage channel. + /// + public IUser User { get; } + + /// + /// Gets the Id of the stage channel. + /// + public ulong StageChannelId { get; } + + internal StageInstanceCreateAuditLogData(string topic, StagePrivacyLevel privacyLevel, IUser user, ulong channelId) + { + Topic = topic; + PrivacyLevel = privacyLevel; + User = user; + StageChannelId = channelId; + } + + internal static StageInstanceCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic").NewValue.ToObject(discord.ApiClient.Serializer); + var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level").NewValue.ToObject(discord.ApiClient.Serializer); + var user = log.Users.FirstOrDefault(x => x.Id == entry.UserId); + var channelId = entry.Options.ChannelId; + + return new StageInstanceCreateAuditLogData(topic, privacyLevel, RestUser.Create(discord, user), channelId ?? 0); + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs new file mode 100644 index 0000000000..d22c56010a --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs @@ -0,0 +1,50 @@ +using System.Linq; +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a stage instance deleted. + /// + public class StageInstanceDeleteAuditLogData + { + /// + /// Gets the topic of the stage channel. + /// + public string Topic { get; } + + /// + /// Gets the privacy level of the stage channel. + /// + public StagePrivacyLevel PrivacyLevel { get; } + + /// + /// Gets the user who started the stage channel. + /// + public IUser User { get; } + + /// + /// Gets the Id of the stage channel. + /// + public ulong StageChannelId { get; } + + internal StageInstanceDeleteAuditLogData(string topic, StagePrivacyLevel privacyLevel, IUser user, ulong channelId) + { + Topic = topic; + PrivacyLevel = privacyLevel; + User = user; + StageChannelId = channelId; + } + + internal static StageInstanceDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic").OldValue.ToObject(discord.ApiClient.Serializer); + var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level").OldValue.ToObject(discord.ApiClient.Serializer); + var user = log.Users.FirstOrDefault(x => x.Id == entry.UserId); + var channelId = entry.Options.ChannelId; + + return new StageInstanceDeleteAuditLogData(topic, privacyLevel, RestUser.Create(discord, user), channelId ?? 0); + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs new file mode 100644 index 0000000000..93a0344b26 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs @@ -0,0 +1,51 @@ +using System.Linq; +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a stage instance update. + /// + public class StageInstanceUpdatedAuditLogData + { + /// + /// Gets the Id of the stage channel. + /// + public ulong StageChannelId { get; } + + /// + /// Gets the stage information before the changes. + /// + public StageInfo Before { get; } + + /// + /// Gets the stage information after the changes. + /// + public StageInfo After { get; } + + internal StageInstanceUpdatedAuditLogData(ulong channelId, StageInfo before, StageInfo after) + { + StageChannelId = channelId; + Before = before; + After = after; + } + + internal static StageInstanceUpdatedAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var channelId = entry.Options.ChannelId.Value; + + var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic"); + var privacy = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy"); + + var user = RestUser.Create(discord, log.Users.FirstOrDefault(x => x.Id == entry.UserId)); + + var oldTopic = topic?.OldValue.ToObject(); + var newTopic = topic?.NewValue.ToObject(); + var oldPrivacy = privacy?.OldValue.ToObject(); + var newPrivacy = privacy?.NewValue.ToObject(); + + return new StageInstanceUpdatedAuditLogData(channelId, new StageInfo(user, oldPrivacy, oldTopic), new StageInfo(user, newPrivacy, newTopic)); + } + } +} diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index c5d264ade0..d02e273de9 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -353,6 +353,7 @@ public static async Task SendFileAsync(IMessageChannel channel, Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.NotNullOrEmpty(filename, nameof(filename), "File Name must not be empty or null"); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs index 721e2d7809..c01df96fdf 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs @@ -1,10 +1,8 @@ +using Discord.API; +using Discord.API.Rest; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; -using StageInstance = Discord.API.StageInstance; namespace Discord.Rest { @@ -25,12 +23,9 @@ public class RestStageChannel : RestVoiceChannel, IStageChannel /// public bool IsLive { get; private set; } internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) - : base(discord, guild, id) - { - - } + : base(discord, guild, id) { } - internal static new RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model) + internal new static RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model) { var entity = new RestStageChannel(discord, guild, model.Id); entity.Update(model); @@ -65,7 +60,7 @@ public async Task ModifyInstanceAsync(Action func, Requ /// public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null) { - var args = new API.Rest.CreateStageInstanceParams() + var args = new CreateStageInstanceParams { ChannelId = Id, PrivacyLevel = privacyLevel, @@ -82,7 +77,7 @@ public async Task StopStageAsync(RequestOptions options = null) { await Discord.ApiClient.DeleteStageInstanceAsync(Id, options); - Update(null, false); + Update(null); } /// @@ -98,7 +93,7 @@ public override async Task UpdateAsync(RequestOptions options = null) /// public Task RequestToSpeakAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, RequestToSpeakTimestamp = DateTimeOffset.UtcNow @@ -109,7 +104,7 @@ public Task RequestToSpeakAsync(RequestOptions options = null) /// public Task BecomeSpeakerAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -120,7 +115,7 @@ public Task BecomeSpeakerAsync(RequestOptions options = null) /// public Task StopSpeakingAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = true @@ -131,7 +126,7 @@ public Task StopSpeakingAsync(RequestOptions options = null) /// public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -143,7 +138,7 @@ public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) /// public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new ModifyVoiceStateParams { ChannelId = Id, Suppressed = true diff --git a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs index 0fb55e797f..63071b9a55 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs @@ -2,15 +2,13 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.IO; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; namespace Discord.Rest { /// - /// Represents a thread channel recieved over REST. + /// Represents a thread channel received over REST. /// public class RestThreadChannel : RestTextChannel, IThreadChannel { @@ -42,10 +40,7 @@ public class RestThreadChannel : RestTextChannel, IThreadChannel public ulong ParentChannelId { get; private set; } internal RestThreadChannel(BaseDiscordClient discord, IGuild guild, ulong id) - : base(discord, guild, id) - { - - } + : base(discord, guild, id) { } internal new static RestThreadChannel Create(BaseDiscordClient discord, IGuild guild, Model model) { @@ -66,7 +61,6 @@ internal override void Update(Model model) AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); - } MemberCount = model.MemberCount.GetValueOrDefault(0); @@ -81,7 +75,7 @@ internal override void Update(Model model) /// The id of the user to fetch. /// The options to be used when sending the request. /// - /// A task representing the asyncronous get operation. The task returns a + /// A task representing the asynchronous get operation. The task returns a /// if found, otherwise . /// public new Task GetUserAsync(ulong userId, RequestOptions options = null) @@ -92,7 +86,7 @@ internal override void Update(Model model) /// /// The options to be used when sending the request. /// - /// A task representing the asyncronous get operation. The task returns a + /// A task representing the asynchronous get operation. The task returns a /// of 's. /// public new async Task> GetUsersAsync(RequestOptions options = null) @@ -110,107 +104,106 @@ public override async Task ModifyAsync(Action func, Reque /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task GetCategoryAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetInvitesAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override OverwritePermissions? GetPermissionOverwrite(IRole role) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override OverwritePermissions? GetPermissionOverwrite(IUser user) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task GetWebhookAsync(ulong id, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetWebhooksAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override IReadOnlyCollection PermissionOverwrites - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); - /// public Task JoinAsync(RequestOptions options = null) => Discord.ApiClient.JoinThreadAsync(Id, options); diff --git a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs index f1bf238bce..69eb0d7681 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs @@ -1,8 +1,6 @@ using Discord.API.Rest; using System; -using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; @@ -14,22 +12,22 @@ public static async Task CreateThreadAsync(BaseDiscordClient client, ITex ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) { if (autoArchiveDuration == ThreadArchiveDuration.OneWeek && !channel.Guild.Features.Contains("SEVEN_DAY_THREAD_ARCHIVE")) - throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!"); + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !channel.Guild.Features.Contains("THREE_DAY_THREAD_ARCHIVE")) - throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!"); + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); if (type == ThreadType.PrivateThread && !channel.Guild.Features.Contains("PRIVATE_THREADS")) - throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!"); + throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!", nameof(type)); - var args = new StartThreadParams() + var args = new StartThreadParams { Name = name, Duration = autoArchiveDuration, Type = type }; - Model model = null; + Model model; if (message != null) model = await client.ApiClient.StartThreadAsync(channel.Id, message.Id, args, options).ConfigureAwait(false); @@ -45,7 +43,7 @@ public static async Task ModifyAsync(IThreadChannel channel, BaseDiscordC { var args = new TextChannelProperties(); func(args); - var apiArgs = new API.Rest.ModifyThreadParams + var apiArgs = new ModifyThreadParams { Name = args.Name, Archived = args.Archived, @@ -63,7 +61,7 @@ public static async Task GetUsersAsync(IThreadChannel channel, return users.Select(x => RestThreadUser.Create(client, channel.Guild, x, channel)).ToArray(); } - public static async Task GetUserAsync(ulong userdId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) - => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userdId); + public static async Task GetUserAsync(ulong userId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) + => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userId); } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 5e56fd56ec..8b0659baf9 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -578,7 +578,7 @@ public async Task GetWidgetChannelAsync(RequestOptions options /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the text channel - /// where guild notices such as welcome messages and boost events are poste; if none is found. + /// where guild notices such as welcome messages and boost events are post; if none is found. /// public async Task GetSystemChannelAsync(RequestOptions options = null) { @@ -611,11 +611,11 @@ public async Task GetRulesChannelAsync(RequestOptions options = } /// - /// Gets the text channel channel where admins and moderators of Community guilds receive notices from Discord. + /// Gets the text channel where admins and moderators of Community guilds receive notices from Discord. /// /// The options to be used when sending the request. /// - /// A task that represents the asynchronous get operation. The task result contains the text channel channel where + /// A task that represents the asynchronous get operation. The task result contains the text channel where /// admins and moderators of Community guilds receive notices from Discord; if none is set. /// public async Task GetPublicUpdatesChannelAsync(RequestOptions options = null) @@ -914,7 +914,7 @@ public Task> GetWebhooksAsync(RequestOptions op #region Interactions /// - /// Gets this guilds slash commands commands + /// Gets this guilds slash commands /// /// The options to be used when sending the request. /// @@ -922,7 +922,7 @@ public Task> GetWebhooksAsync(RequestOptions op /// of application commands found within the guild. /// public async Task> GetApplicationCommandsAsync (RequestOptions options = null) - => await ClientHelper.GetGuildApplicationCommands(Discord, Id, options).ConfigureAwait(false); + => await ClientHelper.GetGuildApplicationCommandsAsync(Discord, Id, options).ConfigureAwait(false); /// /// Gets an application command within this guild with the specified id. /// @@ -933,7 +933,7 @@ public async Task> GetApplicationCommandsA /// if found, otherwise . /// public async Task GetApplicationCommandAsync(ulong id, RequestOptions options = null) - => await ClientHelper.GetGuildApplicationCommand(Discord, id, Id, options); + => await ClientHelper.GetGuildApplicationCommandAsync(Discord, id, Id, options); /// /// Creates an application command within this guild. /// @@ -944,7 +944,7 @@ public async Task GetApplicationCommandAsync(ulong id, Request /// public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options); + var model = await InteractionHelper.CreateGuildCommandAsync(Discord, Id, properties, options); return RestGuildCommand.Create(Discord, model, Id); } @@ -959,7 +959,7 @@ public async Task CreateApplicationCommandAsync(ApplicationCom public async Task> BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(Discord, Id, properties, options); return models.Select(x => RestGuildCommand.Create(Discord, x, Id)).ToImmutableArray(); } diff --git a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs index 6ec6819dea..7cfc6a2ec0 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs @@ -1,28 +1,40 @@ using Discord.API; using Discord.API.Rest; using Discord.Net; -//using Discord.Rest.Entities.Interactions; using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Threading.Tasks; namespace Discord.Rest { internal static class InteractionHelper { + public const double ResponseTimeLimit = 3; + public const double ResponseAndFollowupLimit = 15; + #region InteractionHelper + public static bool CanSendResponse(IDiscordInteraction interaction) + { + return (DateTime.UtcNow - interaction.CreatedAt).TotalSeconds < ResponseTimeLimit; + } + public static bool CanRespondOrFollowup(IDiscordInteraction interaction) + { + return (DateTime.UtcNow - interaction.CreatedAt).TotalMinutes <= ResponseAndFollowupLimit; + } + public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) { - return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, new CreateApplicationCommandParams[0], options); + return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, Array.Empty(), options); } public static Task DeleteAllGlobalCommandsAsync(BaseDiscordClient client, RequestOptions options = null) { - return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(new CreateApplicationCommandParams[0], options); + return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(Array.Empty(), options); } - public static Task SendInteractionResponse(BaseDiscordClient client, InteractionResponse response, + public static Task SendInteractionResponseAsync(BaseDiscordClient client, InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) { return client.ApiClient.CreateInteractionResponseAsync(response, interactionId, interactionToken, options); @@ -40,7 +52,7 @@ public static async Task SendFollowupAsync(BaseDiscordClien { var model = await client.ApiClient.CreateInteractionFollowupMessageAsync(args, token, options).ConfigureAwait(false); - RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); + var entity = RestFollowupMessage.Create(client, model, token, channel); return entity; } #endregion @@ -51,22 +63,21 @@ public static async Task GetGlobalCommandAsync(BaseDiscordCli { var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); - return RestGlobalCommand.Create(client, model); } - public static Task CreateGlobalCommand(BaseDiscordClient client, + public static Task CreateGlobalCommandAsync(BaseDiscordClient client, Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); func((TArg)args); - return CreateGlobalCommand(client, (TArg)args, options); + return CreateGlobalCommandAsync(client, (TArg)args, options); } - public static async Task CreateGlobalCommand(BaseDiscordClient client, + public static async Task CreateGlobalCommandAsync(BaseDiscordClient client, ApplicationCommandProperties arg, RequestOptions options = null) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -82,25 +93,25 @@ public static async Task CreateGlobalCommand(BaseDiscordClie model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); } - public static async Task BulkOverwriteGlobalCommands(BaseDiscordClient client, + public static async Task BulkOverwriteGlobalCommandsAsync(BaseDiscordClient client, ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); - List models = new List(); + var models = new List(); foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -116,28 +127,28 @@ public static async Task BulkOverwriteGlobalCommands(BaseD model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } models.Add(model); } - return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false); + return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false); } - public static async Task> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, + public static async Task> BulkOverwriteGuildCommandsAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties[] args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); - List models = new List(); + var models = new List(); foreach (var arg in args) { Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -153,8 +164,8 @@ public static async Task> BulkOverwriteG model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } models.Add(model); @@ -181,24 +192,24 @@ private static TArg GetApplicationCommandProperties(IApplicationCommand co } } - public static Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, + public static Task ModifyGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var arg = GetApplicationCommandProperties(command); func(arg); - return ModifyGlobalCommand(client, command, arg, options); + return ModifyGlobalCommandAsync(client, command, arg, options); } - public static async Task ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, + public static async Task ModifyGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, ApplicationCommandProperties args, RequestOptions options = null) { if (args.Name.IsSpecified) { Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); - Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); + Preconditions.AtLeast(args.Name.Value.Length, 1, nameof(args.Name)); } - var model = new Discord.API.Rest.ModifyApplicationCommandParams() + var model = new ModifyApplicationCommandParams { Name = args.Name, DefaultPermission = args.IsDefaultPermission.IsSpecified @@ -206,7 +217,7 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie : Optional.Unspecified }; - if(args is SlashCommandProperties slashProps) + if (args is SlashCommandProperties slashProps) { if (slashProps.Description.IsSpecified) { @@ -223,15 +234,14 @@ public static async Task ModifyGlobalCommand(BaseDiscordClie model.Description = slashProps.Description; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); } - - public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null) + public static async Task DeleteGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); @@ -241,18 +251,18 @@ public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicat #endregion #region Guild Commands - public static Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static Task CreateGuildCommandAsync(BaseDiscordClient client, ulong guildId, Action func, RequestOptions options) where TArg : ApplicationCommandProperties { var args = Activator.CreateInstance(typeof(TArg)); func((TArg)args); - return CreateGuildCommand(client, guildId, (TArg)args, options); + return CreateGuildCommandAsync(client, guildId, (TArg)args, options); } - public static async Task CreateGuildCommand(BaseDiscordClient client, ulong guildId, + public static async Task CreateGuildCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties arg, RequestOptions options = null) { - var model = new CreateApplicationCommandParams() + var model = new CreateApplicationCommandParams { Name = arg.Name.Value, Type = arg.Type, @@ -268,25 +278,25 @@ public static async Task CreateGuildCommand(BaseDiscordClien model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); } - public static Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, + public static Task ModifyGuildCommandAsync(BaseDiscordClient client, IApplicationCommand command, ulong guildId, Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { var arg = GetApplicationCommandProperties(command); func(arg); - return ModifyGuildCommand(client, command, guildId, arg, options); + return ModifyGuildCommandAsync(client, command, guildId, arg, options); } - public static async Task ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, + public static async Task ModifyGuildCommandAsync(BaseDiscordClient client, IApplicationCommand command, ulong guildId, ApplicationCommandProperties arg, RequestOptions options = null) { - var model = new ModifyApplicationCommandParams() + var model = new ModifyApplicationCommandParams { Name = arg.Name, DefaultPermission = arg.IsDefaultPermission.IsSpecified @@ -301,14 +311,14 @@ public static async Task ModifyGuildCommand(BaseDiscordClien model.Description = slashProps.Description.Value; model.Options = slashProps.Options.IsSpecified - ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() - : Optional.Unspecified; + ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() + : Optional.Unspecified; } return await client.ApiClient.ModifyGuildApplicationCommandAsync(model, guildId, command.Id, options).ConfigureAwait(false); } - public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) + public static async Task DeleteGuildCommandAsync(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) { Preconditions.NotNull(command, nameof(command)); Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); @@ -316,21 +326,16 @@ public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guil await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); } - public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null) + public static Task DeleteUnknownApplicationCommandAsync(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null) { - if (guildId.HasValue) - { - return DeleteGuildCommand(client, guildId.Value, command, options); - } - else - { - return DeleteGlobalCommand(client, command, options); - } + return guildId.HasValue + ? DeleteGuildCommandAsync(client, guildId.Value, command, options) + : DeleteGlobalCommandAsync(client, command, options); } #endregion #region Responses - public static async Task ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action func, + public static async Task ModifyFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, Action func, RequestOptions options = null) { var args = new MessageProperties(); @@ -360,21 +365,19 @@ public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulo Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); - var apiArgs = new API.Rest.ModifyInteractionResponseParams + var apiArgs = new ModifyInteractionResponseParams { Content = args.Content, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional.Unspecified }; return await client.ApiClient.ModifyInteractionFollowupMessageAsync(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); } - - public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) + public static async Task DeleteFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); - - public static async Task ModifyInteractionResponse(BaseDiscordClient client, string token, Action func, + public static async Task ModifyInteractionResponseAsync(BaseDiscordClient client, string token, Action func, RequestOptions options = null) { var args = new MessageProperties(); @@ -416,25 +419,24 @@ public static async Task ModifyInteractionResponse(BaseDiscordClient cl return await client.ApiClient.ModifyInteractionResponseAsync(apiArgs, token, options).ConfigureAwait(false); } - public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) + public static async Task DeleteInteractionResponseAsync(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); - public static Task SendAutocompleteResult(BaseDiscordClient client, IEnumerable result, ulong interactionId, + public static Task SendAutocompleteResultAsync(BaseDiscordClient client, IEnumerable result, ulong interactionId, string interactionToken, RequestOptions options) { - if (result == null) - result = new AutocompleteResult[0]; + result ??= Array.Empty(); Preconditions.AtMost(result.Count(), 20, nameof(result), "A maximum of 20 choices are allowed!"); - var apiArgs = new InteractionResponse() + var apiArgs = new InteractionResponse { Type = InteractionResponseType.ApplicationCommandAutocompleteResult, - Data = new InteractionCallbackData() + Data = new InteractionCallbackData { Choices = result.Any() - ? result.Select(x => new API.ApplicationCommandOptionChoice() { Name = x.Name, Value = x.Value }).ToArray() - : new ApplicationCommandOptionChoice[0] + ? result.Select(x => new ApplicationCommandOptionChoice { Name = x.Name, Value = x.Value }).ToArray() + : Array.Empty() } }; @@ -449,7 +451,7 @@ public static async Task> var models = await client.ApiClient.GetGuildApplicationCommandPermissionsAsync(guildId, options); return models.Select(x => new GuildApplicationCommandPermission(x.Id, x.ApplicationId, guildId, x.Permissions.Select( - y => new Discord.ApplicationCommandPermission(y.Id, y.Type, y.Permission)) + y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)) .ToArray()) ).ToArray(); } @@ -465,7 +467,7 @@ public static async Task GetGuildCommandPermi } catch (HttpException x) { - if (x.HttpCode == System.Net.HttpStatusCode.NotFound) + if (x.HttpCode == HttpStatusCode.NotFound) return null; throw; } @@ -478,11 +480,11 @@ public static async Task ModifyGuildCommandPe Preconditions.AtMost(args.Length, 10, nameof(args)); Preconditions.AtLeast(args.Length, 0, nameof(args)); - List permissionsList = new List(); + var permissionsList = new List(); foreach (var arg in args) { - var permissions = new ApplicationCommandPermissions() + var permissions = new ApplicationCommandPermissions { Id = arg.TargetId, Permission = arg.Permission, @@ -492,7 +494,7 @@ public static async Task ModifyGuildCommandPe permissionsList.Add(permissions); } - ModifyGuildApplicationCommandPermissionsParams model = new ModifyGuildApplicationCommandPermissionsParams() + var model = new ModifyGuildApplicationCommandPermissionsParams { Permissions = permissionsList.ToArray() }; @@ -509,16 +511,16 @@ public static async Task> Preconditions.NotNull(args, nameof(args)); Preconditions.NotEqual(args.Count, 0, nameof(args)); - List models = new List(); + var models = new List(); foreach (var arg in args) { Preconditions.AtMost(arg.Value.Length, 10, nameof(args)); - var model = new ModifyGuildApplicationCommandPermissions() + var model = new ModifyGuildApplicationCommandPermissions { Id = arg.Key, - Permissions = arg.Value.Select(x => new ApplicationCommandPermissions() + Permissions = arg.Value.Select(x => new ApplicationCommandPermissions { Id = x.TargetId, Permission = x.Permission, diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs index eb9cce07f3..c3edaf6ff8 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ApplicationCommand; @@ -38,21 +37,13 @@ public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); internal RestApplicationCommand(BaseDiscordClient client, ulong id) - : base(client, id) - { - - } + : base(client, id) { } internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, ulong? guildId) { - if (guildId.HasValue) - { - return RestGuildCommand.Create(client, model, guildId.Value); - } - else - { - return RestGlobalCommand.Create(client, model); - } + return guildId.HasValue + ? RestGuildCommand.Create(client, model, guildId.Value) + : RestGlobalCommand.Create(client, model); } internal virtual void Update(Model model) @@ -64,8 +55,8 @@ internal virtual void Update(Model model) IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() - : null; + ? model.Options.Value.Select(RestApplicationCommandOption.Create).ToImmutableArray() + : ImmutableArray.Create(); } /// @@ -76,7 +67,7 @@ public Task ModifyAsync(Action func, RequestOption { return ModifyAsync(func, options); } - + /// public abstract Task ModifyAsync(Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties; diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs index cd1f737684..a40491a2c4 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOptionChoice; namespace Discord.Rest diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 643cdcf3ce..460ff872a0 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOption; namespace Discord.Rest @@ -39,6 +36,11 @@ public class RestApplicationCommandOption : IApplicationCommandOption /// public IReadOnlyCollection Options { get; private set; } + /// + /// The allowed channel types for this option. + /// + public IReadOnlyCollection ChannelTypes { get; private set; } + internal RestApplicationCommandOption() { } internal static RestApplicationCommandOption Create(Model model) @@ -61,12 +63,16 @@ internal void Update(Model model) IsRequired = model.Required.Value; Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => Create(x)).ToImmutableArray() - : null; + ? model.Options.Value.Select(Create).ToImmutableArray() + : ImmutableArray.Create(); Choices = model.Choices.IsSpecified ? model.Choices.Value.Select(x => new RestApplicationCommandChoice(x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); + + ChannelTypes = model.ChannelTypes.IsSpecified + ? model.ChannelTypes.Value.ToImmutableArray() + : ImmutableArray.Create(); } #endregion diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs index bee1f39cd1..c319bcf349 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGlobalCommand.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ApplicationCommand; @@ -13,10 +10,7 @@ namespace Discord.Rest public class RestGlobalCommand : RestApplicationCommand { internal RestGlobalCommand(BaseDiscordClient client, ulong id) - : base(client, id) - { - - } + : base(client, id) { } internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) { @@ -27,7 +21,7 @@ internal static RestGlobalCommand Create(BaseDiscordClient client, Model model) /// public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGlobalCommand(Discord, this).ConfigureAwait(false); + => await InteractionHelper.DeleteGlobalCommandAsync(Discord, this).ConfigureAwait(false); /// /// Modifies this . @@ -39,7 +33,7 @@ public override async Task DeleteAsync(RequestOptions options = null) /// public override async Task ModifyAsync(Action func, RequestOptions options = null) { - var cmd = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); + var cmd = await InteractionHelper.ModifyGlobalCommandAsync(Discord, this, func, options).ConfigureAwait(false); Update(cmd); } } diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs index fb41c18127..00804e57ee 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestGuildCommand.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ApplicationCommand; @@ -32,7 +29,7 @@ internal static RestGuildCommand Create(BaseDiscordClient client, Model model, u /// public override async Task DeleteAsync(RequestOptions options = null) - => await InteractionHelper.DeleteGuildCommand(Discord, GuildId, this).ConfigureAwait(false); + => await InteractionHelper.DeleteGuildCommandAsync(Discord, GuildId, this).ConfigureAwait(false); /// /// Modifies this . @@ -44,7 +41,7 @@ public override async Task DeleteAsync(RequestOptions options = null) /// public override async Task ModifyAsync(Action func, RequestOptions options = null) { - var model = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyGuildCommandAsync(Discord, this, GuildId, func, options).ConfigureAwait(false); Update(model); } diff --git a/src/Discord.Net.Rest/Entities/Messages/Attachment.cs b/src/Discord.Net.Rest/Entities/Messages/Attachment.cs index 1cd73518a7..4e4849c512 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Attachment.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Attachment.cs @@ -21,8 +21,10 @@ public class Attachment : IAttachment public int? Height { get; } /// public int? Width { get; } + /// + public bool Ephemeral { get; } - internal Attachment(ulong id, string filename, string url, string proxyUrl, int size, int? height, int? width) + internal Attachment(ulong id, string filename, string url, string proxyUrl, int size, int? height, int? width, bool? ephemeral) { Id = id; Filename = filename; @@ -31,12 +33,14 @@ internal Attachment(ulong id, string filename, string url, string proxyUrl, int Size = size; Height = height; Width = width; + Ephemeral = ephemeral.GetValueOrDefault(false); } internal static Attachment Create(Model model) { return new Attachment(model.Id, model.Filename, model.Url, model.ProxyUrl, model.Size, model.Height.IsSpecified ? model.Height.Value : (int?)null, - model.Width.IsSpecified ? model.Width.Value : (int?)null); + model.Width.IsSpecified ? model.Width.Value : (int?)null, + model.Ephemeral.ToNullable()); } /// diff --git a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs index 94caf0f3fb..6fd0f7700a 100644 --- a/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/CustomSticker.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Sticker; @@ -26,7 +23,7 @@ public class CustomSticker : Sticker, ICustomSticker /// Gets the guild that this custom sticker is in. /// /// - /// Note: This property can be if the sticker wasnt fetched from a guild. + /// Note: This property can be if the sticker wasn't fetched from a guild. /// public RestGuild Guild { get; private set; } diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index e10be2c0a0..6b9e134c1c 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -84,7 +84,7 @@ public static async Task ModifyAsync(IMessage msg, BaseDiscordClient clie { Content = args.Content, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, Flags = args.Flags, AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, }; @@ -151,7 +151,7 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] : Optional.Unspecified, + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, }; return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); } @@ -246,6 +246,12 @@ private static string UrlEncode(string text) return System.Web.HttpUtility.UrlEncode(text); #endif } + public static string SanitizeMessage(IMessage message) + { + var newContent = MentionUtils.Resolve(message, 0, TagHandling.FullName, TagHandling.FullName, TagHandling.FullName, TagHandling.FullName, TagHandling.FullName); + newContent = Format.StripMarkDown(newContent); + return newContent; + } public static async Task PinAsync(IMessage msg, BaseDiscordClient client, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs index 103c856be4..693d36e565 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestFollowupMessage.cs @@ -1,11 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Message; - namespace Discord.Rest { /// @@ -35,11 +31,11 @@ internal static RestFollowupMessage Create(BaseDiscordClient discord, Model mode } /// - /// Deletes this object and all of it's childern. + /// Deletes this object and all of it's children. /// /// A task that represents the asynchronous delete operation. public Task DeleteAsync() - => InteractionHelper.DeleteFollowupMessage(Discord, this); + => InteractionHelper.DeleteFollowupMessageAsync(Discord, this); /// /// Modifies this interaction followup message. @@ -60,17 +56,17 @@ public Task DeleteAsync() /// A task that represents the asynchronous modification operation. /// /// The token used to modify/delete this message expired. - /// /// Somthing went wrong during the request. + /// /// Something went wrong during the request. public new async Task ModifyAsync(Action func, RequestOptions options = null) { try { - var model = await InteractionHelper.ModifyFollowupMessage(Discord, this, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyFollowupMessageAsync(Discord, this, func, options).ConfigureAwait(false); Update(model); } - catch (Discord.Net.HttpException x) + catch (Net.HttpException x) { - if(x.HttpCode == System.Net.HttpStatusCode.NotFound) + if (x.HttpCode == System.Net.HttpStatusCode.NotFound) { throw new InvalidOperationException("The token of this message has expired!", x); } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs index ae1b5f2fb2..26beb03b60 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestInteractionMessage.cs @@ -31,11 +31,11 @@ internal static RestInteractionMessage Create(BaseDiscordClient discord, Model m } /// - /// Deletes this object and all of it's childern. + /// Deletes this object and all of it's children. /// /// A task that represents the asynchronous delete operation. public Task DeleteAsync() - => InteractionHelper.DeletedInteractionResponse(Discord, this); + => InteractionHelper.DeleteInteractionResponseAsync(Discord, this); /// /// Modifies this interaction response @@ -56,15 +56,15 @@ public Task DeleteAsync() /// A task that represents the asynchronous modification operation. /// /// The token used to modify/delete this message expired. - /// /// Somthing went wrong during the request. + /// /// Something went wrong during the request. public new async Task ModifyAsync(Action func, RequestOptions options = null) { try { - var model = await InteractionHelper.ModifyInteractionResponse(Discord, Token, func, options).ConfigureAwait(false); + var model = await InteractionHelper.ModifyInteractionResponseAsync(Discord, Token, func, options).ConfigureAwait(false); Update(model); } - catch (Discord.Net.HttpException x) + catch (Net.HttpException x) { if (x.HttpCode == System.Net.HttpStatusCode.NotFound) { diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 09e262f006..c48a60aac7 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -15,6 +15,7 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable { private long _timestampTicks; private ImmutableArray _reactions = ImmutableArray.Create(); + private ImmutableArray _userMentions = ImmutableArray.Create(); /// public IMessageChannel Channel { get; } @@ -28,6 +29,9 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable /// public string Content { get; private set; } + /// + public string CleanContent => MessageHelper.SanitizeMessage(this); + /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); /// @@ -53,10 +57,6 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable public virtual IReadOnlyCollection MentionedChannelIds => ImmutableArray.Create(); /// public virtual IReadOnlyCollection MentionedRoleIds => ImmutableArray.Create(); - /// - /// Gets a collection of the mentioned users in the message. - /// - public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); /// @@ -70,6 +70,11 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable public MessageApplication Application { get; private set; } /// public MessageReference Reference { get; private set; } + + /// + /// Gets the interaction this message is a response to. + /// + public MessageInteraction Interaction { get; private set; } /// public MessageFlags? Flags { get; private set; } /// @@ -77,6 +82,10 @@ public abstract class RestMessage : RestEntity, IMessage, IUpdateable /// public IReadOnlyCollection Components { get; private set; } + /// + /// Gets a collection of the mentioned users in the message. + /// + public IReadOnlyCollection MentionedUsers => _userMentions; internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source) : base(discord, id) @@ -207,8 +216,31 @@ internal virtual void Update(Model model) } else _reactions = ImmutableArray.Create(); - } + if (model.Interaction.IsSpecified) + { + Interaction = new MessageInteraction(model.Interaction.Value.Id, + model.Interaction.Value.Type, + model.Interaction.Value.Name, + RestUser.Create(Discord, model.Interaction.Value.User)); + } + + if (model.UserMentions.IsSpecified) + { + var value = model.UserMentions.Value; + if (value.Length > 0) + { + var newMentions = ImmutableArray.CreateBuilder(value.Length); + for (int i = 0; i < value.Length; i++) + { + var val = value[i]; + if (val != null) + newMentions.Add(RestUser.Create(Discord, val)); + } + _userMentions = newMentions.ToImmutable(); + } + } + } /// public async Task UpdateAsync(RequestOptions options = null) { @@ -238,6 +270,9 @@ public Task DeleteAsync(RequestOptions options = null) /// IReadOnlyCollection IMessage.Components => Components; + /// + IMessageInteraction IMessage.Interaction => Interaction; + /// IReadOnlyCollection IMessage.Stickers => Stickers; diff --git a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs index e6f3ac30d4..083a8e72c3 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs @@ -20,7 +20,6 @@ public class RestUserMessage : RestMessage, IUserMessage private ImmutableArray _embeds = ImmutableArray.Create(); private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentionIds = ImmutableArray.Create(); - private ImmutableArray _userMentions = ImmutableArray.Create(); private ImmutableArray _stickers = ImmutableArray.Create(); /// @@ -42,8 +41,6 @@ public class RestUserMessage : RestMessage, IUserMessage /// public override IReadOnlyCollection MentionedRoleIds => _roleMentionIds; /// - public override IReadOnlyCollection MentionedUsers => _userMentions; - /// public override IReadOnlyCollection Tags => _tags; /// public override IReadOnlyCollection Stickers => _stickers; @@ -104,28 +101,12 @@ internal override void Update(Model model) _embeds = ImmutableArray.Create(); } - if (model.UserMentions.IsSpecified) - { - var value = model.UserMentions.Value; - if (value.Length > 0) - { - var newMentions = ImmutableArray.CreateBuilder(value.Length); - for (int i = 0; i < value.Length; i++) - { - var val = value[i]; - if (val.Object != null) - newMentions.Add(RestUser.Create(Discord, val.Object)); - } - _userMentions = newMentions.ToImmutable(); - } - } - var guildId = (Channel as IGuildChannel)?.GuildId; var guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; if (model.Content.IsSpecified) { var text = model.Content.Value; - _tags = MessageHelper.ParseTags(text, null, guild, _userMentions); + _tags = MessageHelper.ParseTags(text, null, guild, MentionedUsers); model.Content = text; } diff --git a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs index 75bc9bd384..accdbe66a1 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Sticker.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Sticker.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -43,8 +44,8 @@ internal void Update(Model model) { PackId = model.PackId; Name = model.Name; - Description = model.Desription; - Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : new string[0]; + Description = model.Description; + Tags = model.Tags.IsSpecified ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToArray() : Array.Empty(); Type = model.Type; SortOrder = model.SortValue; IsAvailable = model.Available; diff --git a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs index f1bcb99513..0ce4f634b9 100644 --- a/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs +++ b/src/Discord.Net.Rest/Entities/Messages/StickerItem.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.StickerItem; @@ -31,15 +27,13 @@ internal StickerItem(BaseDiscordClient client, Model model) /// /// A task representing the download operation, the result of the task is a sticker object. /// - public async Task ResolveStickerAsync() { var model = await Discord.ApiClient.GetStickerAsync(Id); - if (model.GuildId.IsSpecified) - return CustomSticker.Create(Discord, model, model.GuildId.Value, model.User.IsSpecified ? model.User.Value.Id : null); - else - return Sticker.Create(Discord, model); + return model.GuildId.IsSpecified + ? CustomSticker.Create(Discord, model, model.GuildId.Value, model.User.IsSpecified ? model.User.Value.Id : null) + : Sticker.Create(Discord, model); } } } diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index 3b6d8d3f7f..e0be8e9983 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -24,6 +24,8 @@ public class RestRole : RestEntity, IRole /// public string Name { get; private set; } /// + public string Icon { get; private set; } + /// public GuildPermissions Permissions { get; private set; } /// public int Position { get; private set; } @@ -53,6 +55,7 @@ internal static RestRole Create(BaseDiscordClient discord, IGuild guild, Model m internal void Update(Model model) { Name = model.Name; + Icon = model.Icon; IsHoisted = model.Hoist; IsManaged = model.Managed; IsMentionable = model.Mentionable; @@ -73,6 +76,10 @@ public async Task ModifyAsync(Action func, RequestOptions option public Task DeleteAsync(RequestOptions options = null) => RoleHelper.DeleteAsync(this, Discord, options); + /// + public string GetIconUrl() + => CDN.GetGuildRoleIconUrl(Id, Icon); + /// public int CompareTo(IRole role) => RoleUtils.Compare(this, role); diff --git a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs index 4dd7f7aafc..82830dafd1 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestThreadUser.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ThreadMember; diff --git a/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs b/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs index 50e9cab78a..0b61b6c225 100644 --- a/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs +++ b/src/Discord.Net.Rest/Entities/Webhooks/WebhookHelper.cs @@ -33,6 +33,5 @@ public static async Task DeleteAsync(IWebhook webhook, BaseDiscordClient client, { await client.ApiClient.DeleteWebhookAsync(webhook.Id, options).ConfigureAwait(false); } - } } diff --git a/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs index 8159165c9c..ca82146825 100644 --- a/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/InteractionConverter.cs @@ -1,10 +1,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.Net.Converters { diff --git a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs index 2203008d6c..0bf11a3692 100644 --- a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs @@ -1,10 +1,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.Net.Converters { diff --git a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs index 52fea021b3..52debd87fb 100644 --- a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs +++ b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs @@ -355,7 +355,7 @@ private void UpdateRateLimit(int id, IRequest request, RateLimitInfo info, bool if (info.Limit.HasValue && WindowCount != info.Limit.Value) { WindowCount = info.Limit.Value; - _semaphore = info.Remaining.Value; + _semaphore = is429 ? 0 : info.Remaining.Value; #if DEBUG_LIMITS Debug.WriteLine($"[{id}] Upgraded Semaphore to {info.Remaining.Value}/{WindowCount}"); #endif @@ -435,7 +435,7 @@ private void UpdateRateLimit(int id, IRequest request, RateLimitInfo info, bool if (!hasQueuedReset || resetTick > _resetTick) { _resetTick = resetTick; - LastAttemptAt = resetTick.Value; //Make sure we dont destroy this until after its been reset + LastAttemptAt = resetTick.Value; //Make sure we don't destroy this until after its been reset #if DEBUG_LIMITS Debug.WriteLine($"[{id}] Reset in {(int)Math.Ceiling((resetTick - DateTimeOffset.UtcNow).Value.TotalMilliseconds)} ms"); #endif @@ -456,7 +456,7 @@ private async Task QueueReset(int id, int millis, IRequest request) lock (_lock) { millis = (int)Math.Ceiling((_resetTick.Value - DateTimeOffset.UtcNow).TotalMilliseconds); - if (millis <= 0) //Make sure we havent gotten a more accurate reset time + if (millis <= 0) //Make sure we haven't gotten a more accurate reset time { #if DEBUG_LIMITS Debug.WriteLine($"[{id}] * Reset *"); diff --git a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs index 9d41ecf488..91dcbde112 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ApplicationCommandCreatedUpdatedEvent.cs @@ -1,13 +1,8 @@ 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 ApplicationCommandCreatedUpdatedEvent : API.ApplicationCommand + internal class ApplicationCommandCreatedUpdatedEvent : ApplicationCommand { [JsonProperty("guild_id")] public Optional GuildId { get; set; } diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs index 8f3ba683b9..f0ecd3a4fb 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildStickerUpdateEvent.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Gateway { diff --git a/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs index ab79892687..5084f6c958 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ThreadListSyncEvent.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Gateway { diff --git a/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs b/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs index b6acba6ae7..83d2c0edda 100644 --- a/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs +++ b/src/Discord.Net.WebSocket/API/Gateway/ThreadMembersUpdate.cs @@ -1,9 +1,4 @@ using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.API.Gateway { diff --git a/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs b/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs index 10479cdb29..fb910573ac 100644 --- a/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs +++ b/src/Discord.Net.WebSocket/API/Voice/ReadyEvent.cs @@ -14,7 +14,7 @@ internal class ReadyEvent [JsonProperty("modes")] public string[] Modes { get; set; } [JsonProperty("heartbeat_interval")] - [Obsolete("This field is errorneous and should not be used", true)] + [Obsolete("This field is erroneous and should not be used", true)] public int HeartbeatInterval { get; set; } } } diff --git a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs index a2de252a2b..25afde7845 100644 --- a/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs +++ b/src/Discord.Net.WebSocket/Audio/Streams/BufferedWriteStream.cs @@ -125,7 +125,7 @@ private Task Run() timestamp += OpusEncoder.FrameSamplesPerChannel; } #if DEBUG - var _ = _logger?.DebugAsync("Buffer underrun"); + var _ = _logger?.DebugAsync("Buffer under run"); #endif } } diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 58de002a01..b7bcfdf2e4 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -469,7 +469,7 @@ public event Func InviteDeleted #region Interactions /// - /// Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands. + /// Fired when an Interaction is created. This event covers all types of interactions including but not limited to: buttons, select menus, slash commands, autocompletes. /// /// /// @@ -535,6 +535,15 @@ public event Func MessageCommandExecuted remove => _messageCommandExecuted.Remove(value); } internal readonly AsyncEvent> _messageCommandExecuted = new AsyncEvent>(); + /// + /// Fired when an autocomplete is used and its interaction is received. + /// + public event Func AutocompleteExecuted + { + add => _autocompleteExecuted.Add(value); + remove => _autocompleteExecuted.Remove(value); + } + internal readonly AsyncEvent> _autocompleteExecuted = new AsyncEvent>(); /// /// Fired when a guild application command is created. diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index faafa918f4..613864fdc8 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -466,6 +466,7 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.SlashCommandExecuted += (arg) => _slashCommandExecuted.InvokeAsync(arg); client.UserCommandExecuted += (arg) => _userCommandExecuted.InvokeAsync(arg); client.MessageCommandExecuted += (arg) => _messageCommandExecuted.InvokeAsync(arg); + client.AutocompleteExecuted += (arg) => _autocompleteExecuted.InvokeAsync(arg); client.ThreadUpdated += (thread1, thread2) => _threadUpdated.InvokeAsync(thread1, thread2); client.ThreadCreated += (thread) => _threadCreated.InvokeAsync(thread); diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 61ee5f3cff..264151e947 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -51,7 +51,7 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient /// Provides access to a REST-only client with a shared state from this client. /// public override DiscordSocketRestClient Rest { get; } - /// Gets the shard of of this client. + /// Gets the shard of this client. public int ShardId { get; } /// Gets the current connection state of this client. public ConnectionState ConnectionState => _connection.State; @@ -434,11 +434,11 @@ public async Task> GetGlobalApplic public async Task CreateGlobalApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGlobalCommand(this, properties, options).ConfigureAwait(false); + var model = await InteractionHelper.CreateGlobalCommandAsync(this, properties, options).ConfigureAwait(false); var entity = State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(this, model)); - //Update it incase it was cached + //Update it in case it was cached entity.Update(model); return entity; @@ -446,7 +446,7 @@ public async Task CreateGlobalApplicationCommandAsync( public async Task> BulkOverwriteGlobalApplicationCommandsAsync( ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGlobalCommands(this, properties, options); + var models = await InteractionHelper.BulkOverwriteGlobalCommandsAsync(this, properties, options); var entities = models.Select(x => SocketApplicationCommand.Create(this, x)); @@ -1522,7 +1522,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } else { - //Edited message isnt in cache, create a detached one + //Edited message isn't in cache, create a detached one SocketUser author; if (data.Author.IsSpecified) { @@ -2125,6 +2125,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty case SocketMessageCommand messageCommand: await TimedInvokeAsync(_messageCommandExecuted, nameof(MessageCommandExecuted), messageCommand).ConfigureAwait(false); break; + case SocketAutocompleteInteraction autocomplete: + await TimedInvokeAsync(_autocompleteExecuted, nameof(AutocompleteExecuted), autocomplete).ConfigureAwait(false); + break; } } else diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index e2e4f98976..6946a02b54 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -79,7 +79,7 @@ public class DiscordSocketConfig : DiscordRestConfig /// /// /// By default, the Discord gateway will only send offline members if a guild has less than a certain number - /// of members (determined by in this library). This behaviour is why + /// of members (determined by in this library). This behavior is why /// sometimes a user may be missing from the WebSocket cache for collections such as /// . /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs index 890f58ed6c..91bca50542 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; using StageInstance = Discord.API.StageInstance; @@ -11,7 +10,7 @@ namespace Discord.WebSocket { /// - /// Represents a stage channel recieved over the gateway. + /// Represents a stage channel received over the gateway. /// public class SocketStageChannel : SocketVoiceChannel, IStageChannel { @@ -25,7 +24,7 @@ public class SocketStageChannel : SocketVoiceChannel, IStageChannel public bool? IsDiscoverableDisabled { get; private set; } /// - public bool IsLive { get; private set; } = false; + public bool IsLive { get; private set; } /// /// Returns if the current user is a speaker within the stage, otherwise . @@ -42,10 +41,7 @@ public IReadOnlyCollection Speakers internal new SocketStageChannel Clone() => MemberwiseClone() as SocketStageChannel; internal SocketStageChannel(DiscordSocketClient discord, ulong id, SocketGuild guild) - : base(discord, id, guild) - { - - } + : base(discord, id, guild) { } internal new static SocketStageChannel Create(SocketGuild guild, ClientState state, Model model) { @@ -54,11 +50,6 @@ internal SocketStageChannel(DiscordSocketClient discord, ulong id, SocketGuild g return entity; } - internal override void Update(ClientState state, Model model) - { - base.Update(state, model); - } - internal void Update(StageInstance model, bool isLive = false) { IsLive = isLive; @@ -79,11 +70,11 @@ internal void Update(StageInstance model, bool isLive = false) /// public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null) { - var args = new API.Rest.CreateStageInstanceParams() + var args = new API.Rest.CreateStageInstanceParams { ChannelId = Id, Topic = topic, - PrivacyLevel = privacyLevel, + PrivacyLevel = privacyLevel }; var model = await Discord.ApiClient.CreateStageInstanceAsync(args, options).ConfigureAwait(false); @@ -104,13 +95,13 @@ public async Task StopStageAsync(RequestOptions options = null) { await Discord.ApiClient.DeleteStageInstanceAsync(Id, options); - Update(null, false); + Update(null); } /// public Task RequestToSpeakAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, RequestToSpeakTimestamp = DateTimeOffset.UtcNow @@ -121,7 +112,7 @@ public Task RequestToSpeakAsync(RequestOptions options = null) /// public Task BecomeSpeakerAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -132,7 +123,7 @@ public Task BecomeSpeakerAsync(RequestOptions options = null) /// public Task StopSpeakingAsync(RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = true @@ -143,7 +134,7 @@ public Task StopSpeakingAsync(RequestOptions options = null) /// public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = false @@ -155,7 +146,7 @@ public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) /// public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null) { - var args = new API.Rest.ModifyVoiceStateParams() + var args = new API.Rest.ModifyVoiceStateParams { ChannelId = Id, Suppressed = true diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs index 3fd47ec872..7fcafc14a1 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs @@ -5,11 +5,9 @@ using System.Diagnostics; using System.IO; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Channel; using ThreadMember = Discord.API.ThreadMember; -using MemberUpdates = Discord.API.Gateway.ThreadMembersUpdated; using System.Collections.Concurrent; namespace Discord.WebSocket @@ -72,14 +70,13 @@ public bool IsPrivateThread public new IReadOnlyCollection Users => _members.Values.ToImmutableArray(); - - private ConcurrentDictionary _members; + private readonly ConcurrentDictionary _members; private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; - private bool _usersDownloaded = false; + private bool _usersDownloaded; - private object _downloadLock = new object(); + private readonly object _downloadLock = new object(); internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) : base(discord, id, guild) @@ -103,12 +100,12 @@ internal override void Update(ClientState state, Model model) Type = (ThreadType)model.Type; MessageCount = model.MessageCount.GetValueOrDefault(-1); MemberCount = model.MemberCount.GetValueOrDefault(-1); - + if (model.ThreadMetadata.IsSpecified) { IsArchived = model.ThreadMetadata.Value.Archived; ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; - AutoArchiveDuration = (ThreadArchiveDuration)model.ThreadMetadata.Value.AutoArchiveDuration; + AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); } @@ -173,12 +170,11 @@ public async Task> GetUsersAsync(RequestOp return Users; } - /// /// Downloads all users that have access to this thread. /// /// The options to be used when sending the request. - /// A task representing the asyncronous download operation. + /// A task representing the asynchronous download operation. public async Task DownloadUsersAsync(RequestOptions options = null) { var users = await Discord.ApiClient.ListThreadMembersAsync(Id, options); @@ -193,7 +189,7 @@ public async Task DownloadUsersAsync(RequestOptions options = null) } } } - + internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; /// @@ -210,7 +206,7 @@ public Task LeaveAsync(RequestOptions options = null) /// The to add. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of adding a member to a thread. + /// A task that represents the asynchronous operation of adding a member to a thread. /// public Task AddUserAsync(IGuildUser user, RequestOptions options = null) => Discord.ApiClient.AddThreadMemberAsync(Id, user.Id, options); @@ -221,60 +217,59 @@ public Task AddUserAsync(IGuildUser user, RequestOptions options = null) /// The to remove from this thread. /// The options to be used when sending the request. /// - /// A task that represents the asynchronous operation of removing a user from this thread. + /// A task that represents the asynchronous operation of removing a user from this thread. /// public Task RemoveUserAsync(IGuildUser user, RequestOptions options = null) => Discord.ApiClient.RemoveThreadMemberAsync(Id, user.Id, options); - /// /// /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetInvitesAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// @@ -295,14 +290,14 @@ public override Task> GetInvitesAsync(Reque /// This method is not supported in threads. /// public override Task GetWebhookAsync(ulong id, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task> GetWebhooksAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// @@ -316,28 +311,28 @@ public override Task ModifyAsync(Action func, RequestOpti /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override IReadOnlyCollection PermissionOverwrites - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); /// /// /// This method is not supported in threads. /// public override Task SyncPermissionsAsync(RequestOptions options = null) - => throw new NotImplementedException(); + => throw new NotSupportedException("This method is not supported in threads."); string IChannel.Name => Name; } diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index efc6f3ba5e..23712be66b 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -904,7 +904,7 @@ public async ValueTask GetApplicationCommandAsync(ulon /// public async Task CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) { - var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options); + var model = await InteractionHelper.CreateGuildCommandAsync(Discord, Id, properties, options); var entity = Discord.State.GetOrAddCommand(model.Id, (id) => SocketApplicationCommand.Create(Discord, model)); @@ -924,7 +924,7 @@ public async Task CreateApplicationCommandAsync(Applic public async Task> BulkOverwriteApplicationCommandAsync(ApplicationCommandProperties[] properties, RequestOptions options = null) { - var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options); + var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(Discord, Id, properties, options); var entities = models.Select(x => SocketApplicationCommand.Create(Discord, x)); @@ -1549,7 +1549,7 @@ private async Task DisconnectAudioInternalAsync() } internal async Task FinishConnectAudio(string url, string token) { - //TODO: Mem Leak: Disconnected/Connected handlers arent cleaned up + //TODO: Mem Leak: Disconnected/Connected handlers aren't cleaned up var voiceState = GetVoiceState(Discord.CurrentUser.Id).Value; await _audioLock.WaitAsync().ConfigureAwait(false); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs index efd99c2c44..6d0f5ced04 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommand.cs @@ -1,7 +1,3 @@ -using Discord.Rest; -using System; -using System.Linq; -using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -20,8 +16,8 @@ public class SocketMessageCommand : SocketCommandBase internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -31,7 +27,7 @@ internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMe Data = SocketMessageCommandData.Create(client, dataModel, model.Id, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketMessageCommand(client, model, channel); entity.Update(model); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs index e78da223d9..fc3be82b75 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/Message Commands/SocketMessageCommandData.cs @@ -10,7 +10,7 @@ namespace Discord.WebSocket public class SocketMessageCommandData : SocketCommandBaseData { /// - /// Gets the messagte associated with this message command. + /// Gets the message associated with this message command. /// public SocketMessage Message => ResolvableData?.Messages.FirstOrDefault().Value; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs index a61279db97..a4e162039a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Context Menu Commands/User Commands/SocketUserCommand.cs @@ -1,7 +1,3 @@ -using Discord.Rest; -using System; -using System.Linq; -using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -20,8 +16,8 @@ public class SocketUserCommand : SocketCommandBase internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -31,11 +27,11 @@ internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessa Data = SocketUserCommandData.Create(client, dataModel, model.Id, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketUserCommand(client, model, channel); entity.Update(model); return entity; - } + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs index aa3a915aef..926563c4cf 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponent.cs @@ -10,38 +10,40 @@ namespace Discord.WebSocket { -/// -/// Represents a Websocket-based interaction type for Message Components. -/// + /// + /// Represents a Websocket-based interaction type for Message Components. + /// public class SocketMessageComponent : SocketInteraction { /// /// The data received with this interaction, contains the button that was clicked. /// - new public SocketMessageComponentData Data { get; } + public new SocketMessageComponentData Data { get; } /// /// The message that contained the trigger for this interaction. /// public SocketUserMessage Message { get; private set; } + private object _lock = new object(); + internal override bool _hasResponded { get; set; } = false; + internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; Data = new SocketMessageComponentData(dataModel); } - new internal static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketMessageComponent(client, model, channel); entity.Update(model); return entity; } - internal override void Update(Model model) { base.Update(model); @@ -69,7 +71,6 @@ internal override void Update(Model model) } } } - /// public override async Task RespondAsync( string text = null, @@ -84,20 +85,16 @@ public override async Task RespondAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -122,7 +119,7 @@ public override async Task RespondAsync( { Content = text ?? Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel(), - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), TTS = isTTS, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified } @@ -131,14 +128,27 @@ public override async Task RespondAsync( if (ephemeral) response.Data.Value.Flags = MessageFlags.Ephemeral; - await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); + } + } + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// /// Updates the message which this component resides in with the type /// /// A delegate containing the properties to modify the message with. - /// The request options for this async request. + /// The request options for this request. /// A task that represents the asynchronous operation of updating the message. public async Task UpdateAsync(Action func, RequestOptions options = null) { @@ -148,11 +158,14 @@ public async Task UpdateAsync(Action func, RequestOptions opt if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + if (args.AllowedMentions.IsSpecified) { - var allowedMentions = args.AllowedMentions.Value; - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); + var allowedMentions = args.AllowedMentions.Value; + Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 role Ids are allowed."); + Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions), "A max of 100 user Ids are allowed."); } var embed = args.Embed; @@ -204,13 +217,26 @@ public async Task UpdateAsync(Action func, RequestOptions opt AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value?.ToModel() : Optional.Unspecified, Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, Components = args.Components.IsSpecified - ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? new API.ActionRowComponent[0] + ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, Flags = args.Flags.IsSpecified ? args.Flags.Value ?? Optional.Unspecified : Optional.Unspecified } }; - await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); + } + } + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// @@ -227,41 +253,34 @@ public override async Task FollowupAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); var args = new API.Rest.CreateWebhookMessageParams { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), + Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; if (ephemeral) args.Flags = MessageFlags.Ephemeral; - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options).ConfigureAwait(false); } /// public override async Task FollowupWithFileAsync( + Stream fileStream, + string fileName, string text = null, - Stream fileStream = null, - string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, @@ -273,20 +292,13 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNull(fileStream, nameof(fileStream), "File Stream must have data"); Preconditions.NotNullOrWhitespace(fileName, nameof(fileName), "File Name must not be empty or null"); @@ -295,7 +307,7 @@ public override async Task FollowupWithFileAsync( Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = fileStream is not null ? new MultipartFile(fileStream, fileName) : Optional.Unspecified }; @@ -303,13 +315,13 @@ public override async Task FollowupWithFileAsync( if (ephemeral) args.Flags = MessageFlags.Ephemeral; - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options).ConfigureAwait(false); } /// public override async Task FollowupWithFileAsync( + string filePath, string text = null, - string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, @@ -322,20 +334,13 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNullOrWhitespace(filePath, nameof(filePath), "Path must exist"); var args = new API.Rest.CreateWebhookMessageParams @@ -343,7 +348,7 @@ public override async Task FollowupWithFileAsync( Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = !string.IsNullOrEmpty(filePath) ? new MultipartFile(new MemoryStream(File.ReadAllBytes(filePath), false), fileName) : Optional.Unspecified }; @@ -351,40 +356,70 @@ public override async Task FollowupWithFileAsync( if (ephemeral) args.Flags = MessageFlags.Ephemeral; - return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options); + return await InteractionHelper.SendFollowupAsync(Discord.Rest, args, Token, Channel, options).ConfigureAwait(false); } /// /// Defers an interaction and responds with type 5 () /// /// to send this message ephemerally, otherwise . - /// The request options for this async request. + /// The request options for this request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = null) + public async Task DeferLoadingAsync(bool ephemeral = false, RequestOptions options = null) { - var response = new API.InteractionResponse() + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot defer an interaction after {InteractionHelper.ResponseTimeLimit} seconds of no response/acknowledgement"); + + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, - Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified - + Data = ephemeral ? new API.InteractionCallbackData { Flags = MessageFlags.Ephemeral } : Optional.Unspecified }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); + } + } + + await Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// - public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) + public override async Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { - var response = new API.InteractionResponse() + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot defer an interaction after {InteractionHelper.ResponseTimeLimit} seconds of no response/acknowledgement"); + + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredUpdateMessage, - Data = ephemeral ? new API.InteractionCallbackData() { Flags = MessageFlags.Ephemeral } : Optional.Unspecified - + Data = ephemeral ? new API.InteractionCallbackData { Flags = MessageFlags.Ephemeral } : Optional.Unspecified }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); + } + } + + await Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs index 098478612d..408a7f8536 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Message Components/SocketMessageComponentData.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.MessageComponentInteractionData; namespace Discord.WebSocket diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs index 0eb22f29d2..e58589c08a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteraction.cs @@ -2,13 +2,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Interaction; using DataModel = Discord.API.AutocompleteInteractionData; - namespace Discord.WebSocket { /// @@ -21,6 +18,9 @@ public class SocketAutocompleteInteraction : SocketInteraction /// public new SocketAutocompleteInteractionData Data { get; } + internal override bool _hasResponded { get; set; } + private object _lock = new object(); + internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { @@ -34,7 +34,7 @@ internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, internal new static SocketAutocompleteInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { - var entity = new SocketAutocompleteInteraction(client, model, channel); + var entity = new SocketAutocompleteInteraction(client, model, channel); entity.Update(model); return entity; } @@ -53,8 +53,25 @@ internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, /// /// A task that represents the asynchronous operation of responding to this interaction. /// - public Task RespondAsync(IEnumerable result, RequestOptions options = null) - => InteractionHelper.SendAutocompleteResult(Discord, result, Id, Token, options); + public async Task RespondAsync(IEnumerable result, RequestOptions options = null) + { + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond twice to the same interaction"); + } + } + + await InteractionHelper.SendAutocompleteResultAsync(Discord, result, Id, Token, options).ConfigureAwait(false); + lock (_lock) + { + _hasResponded = true; + } + } /// /// Responds to this interaction with a set of choices. @@ -71,27 +88,31 @@ public Task RespondAsync(IEnumerable result, RequestOptions /// A task that represents the asynchronous operation of responding to this interaction. /// public Task RespondAsync(RequestOptions options = null, params AutocompleteResult[] result) - => InteractionHelper.SendAutocompleteResult(Discord, result, Id, Token, options); - + => RespondAsync(result, options); /// - [Obsolete("Autocomplete interactions cannot be defered!", true)] - public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) => throw new NotSupportedException(); + [Obsolete("Autocomplete interactions cannot be deferred!", true)] + public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupWithFileAsync(string text = null, Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupWithFileAsync(Stream fileStream, string fileName, string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have followups!", true)] - public override Task FollowupWithFileAsync(string text = null, string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task FollowupWithFileAsync(string filePath, string text = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); /// [Obsolete("Autocomplete interactions cannot have normal responses!", true)] - public override Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); + public override Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) + => throw new NotSupportedException("Autocomplete interactions cannot be deferred!"); } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index 06e313b44d..d0c44bab16 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -1,12 +1,8 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using DataModel = Discord.API.AutocompleteInteractionData; - namespace Discord.WebSocket { /// @@ -35,7 +31,7 @@ public class SocketAutocompleteInteractionData public ulong Version { get; } /// - /// Gets the current autocomplete option that is activly being filled out. + /// Gets the current autocomplete option that is actively being filled out. /// public AutocompleteOption Current { get; } @@ -46,15 +42,34 @@ public class SocketAutocompleteInteractionData internal SocketAutocompleteInteractionData(DataModel model) { - var options = model.Options.Select(x => new AutocompleteOption(x.Type, x.Name, x.Value, x.Focused)); + var options = model.Options.SelectMany(GetOptions); Current = options.FirstOrDefault(x => x.Focused); Options = options.ToImmutableArray(); + if (Options.Count == 1 && Current == null) + Current = Options.FirstOrDefault(); + CommandName = model.Name; CommandId = model.Id; Type = model.Type; Version = model.Version; } + + private List GetOptions(API.AutocompleteInteractionDataOption model) + { + var options = new List(); + + if (model.Options.IsSpecified) + { + options.AddRange(model.Options.Value.SelectMany(GetOptions)); + } + else if(model.Focused.IsSpecified) + { + options.Add(new AutocompleteOption(model.Type, model.Name, model.Value.GetValueOrDefault(null), model.Focused.Value)); + } + + return options; + } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs index db53f5d081..26614b5726 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommand.cs @@ -1,7 +1,3 @@ -using Discord.Rest; -using System; -using System.Linq; -using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -15,13 +11,13 @@ public class SocketSlashCommand : SocketCommandBase /// /// The data associated with this interaction. /// - new public SocketSlashCommandData Data { get; } + public new SocketSlashCommandData Data { get; } internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -31,7 +27,7 @@ internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMess Data = SocketSlashCommandData.Create(client, dataModel, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketSlashCommand(client, model, channel); entity.Update(model); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs index 7b504f1190..39dc9a46a0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandData.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Model = Discord.API.ApplicationCommandInteractionData; @@ -25,7 +24,7 @@ internal override void Update(Model model) Options = model.Options.IsSpecified ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(this, x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs index b2ea828561..265eda75b7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketSlashCommandDataOption.cs @@ -6,7 +6,7 @@ namespace Discord.WebSocket { /// - /// Represents a Websocket-based recieved by the gateway + /// Represents a Websocket-based received by the gateway. /// public class SocketSlashCommandDataOption : IApplicationCommandInteractionDataOption { @@ -61,7 +61,7 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) break; case ApplicationCommandOptionType.Mentionable: { - if(data.ResolvableData.GuildMembers.Any(x => x.Key == valueId) || data.ResolvableData.Users.Any(x => x.Key == valueId)) + if (data.ResolvableData.GuildMembers.Any(x => x.Key == valueId) || data.ResolvableData.Users.Any(x => x.Key == valueId)) { var guildUser = data.ResolvableData.GuildMembers.FirstOrDefault(x => x.Key == valueId).Value; @@ -70,7 +70,7 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) else Value = data.ResolvableData.Users.FirstOrDefault(x => x.Key == valueId).Value; } - else if(data.ResolvableData.Roles.Any(x => x.Key == valueId)) + else if (data.ResolvableData.Roles.Any(x => x.Key == valueId)) { Value = data.ResolvableData.Roles.FirstOrDefault(x => x.Key == valueId).Value; } @@ -110,14 +110,13 @@ internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model) } break; } - } Options = model.Options.IsSpecified ? model.Options.Value.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray() - : null; + : ImmutableArray.Create(); } -#endregion + #endregion #region Converters public static explicit operator bool(SocketSlashCommandDataOption option) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs index c849341b85..d986a93f3a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; using System.Threading.Tasks; using GatewayModel = Discord.API.Gateway.ApplicationCommandCreatedUpdatedEvent; using Model = Discord.API.ApplicationCommand; @@ -11,7 +10,7 @@ namespace Discord.WebSocket { /// - /// Represends a Websocket-based . + /// Represents a Websocket-based . /// public class SocketApplicationCommand : SocketEntity, IApplicationCommand { @@ -82,35 +81,29 @@ internal void Update(Model model) Description = model.Description; Name = model.Name; IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); + Type = model.Type; Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() - : new ImmutableArray(); + ? model.Options.Value.Select(SocketApplicationCommandOption.Create).ToImmutableArray() + : ImmutableArray.Create(); } /// public Task DeleteAsync(RequestOptions options = null) - => InteractionHelper.DeleteUnknownApplicationCommand(Discord, GuildId, this, options); + => InteractionHelper.DeleteUnknownApplicationCommandAsync(Discord, GuildId, this, options); /// public Task ModifyAsync(Action func, RequestOptions options = null) { return ModifyAsync(func, options); } - + /// public async Task ModifyAsync(Action func, RequestOptions options = null) where TArg : ApplicationCommandProperties { - Model command = null; - - if (IsGlobalCommand) - { - command = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); - } - else - { - command = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId.Value, func, options); - } + var command = IsGlobalCommand + ? await InteractionHelper.ModifyGlobalCommandAsync(Discord, this, func, options).ConfigureAwait(false) + : await InteractionHelper.ModifyGuildCommandAsync(Discord, this, GuildId.Value, func, options); Update(command); } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs index 0f36af0b88..e70efa27b4 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandChoice.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOptionChoice; namespace Discord.WebSocket diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs index ab1ead5316..8fd5f449c6 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.ApplicationCommandOption; namespace Discord.WebSocket @@ -38,6 +35,11 @@ public class SocketApplicationCommandOption : IApplicationCommandOption /// public IReadOnlyCollection Options { get; private set; } + /// + /// The allowed channel types for this option. + /// + public IReadOnlyCollection ChannelTypes { get; private set; } + internal SocketApplicationCommandOption() { } internal static SocketApplicationCommandOption Create(Model model) { @@ -61,12 +63,16 @@ internal void Update(Model model) : null; Choices = model.Choices.IsSpecified - ? model.Choices.Value.Select(x => SocketApplicationCommandChoice.Create(x)).ToImmutableArray() - : new ImmutableArray(); + ? model.Choices.Value.Select(SocketApplicationCommandChoice.Create).ToImmutableArray() + : ImmutableArray.Create(); Options = model.Options.IsSpecified - ? model.Options.Value.Select(x => SocketApplicationCommandOption.Create(x)).ToImmutableArray() - : new ImmutableArray(); + ? model.Options.Value.Select(Create).ToImmutableArray() + : ImmutableArray.Create(); + + ChannelTypes = model.ChannelTypes.IsSpecified + ? model.ChannelTypes.Value.ToImmutableArray() + : ImmutableArray.Create(); } IReadOnlyCollection IApplicationCommandOption.Choices => Choices; diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index d0622196a4..66d10fd3b0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -1,10 +1,8 @@ using Discord.Net.Rest; using Discord.Rest; using System; -using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Threading.Tasks; using DataModel = Discord.API.ApplicationCommandInteractionData; using Model = Discord.API.Interaction; @@ -31,13 +29,17 @@ public ulong CommandId /// /// The data associated with this interaction. /// - new internal SocketCommandBaseData Data { get; } + internal new SocketCommandBaseData Data { get; } + + internal override bool _hasResponded { get; set; } + + private object _lock = new object(); internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; ulong? guildId = null; @@ -47,7 +49,7 @@ internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessa Data = SocketCommandBaseData.Create(client, dataModel, model.Id, guildId); } - new internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) + internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) { var entity = new SocketCommandBase(client, model, channel); entity.Update(model); @@ -56,8 +58,8 @@ internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessa internal override void Update(Model model) { - var data = model.Data.IsSpecified ? - (DataModel)model.Data.Value + var data = model.Data.IsSpecified + ? (DataModel)model.Data.Value : null; Data.Update(data); @@ -79,20 +81,16 @@ public override async Task RespondAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot respond to an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -117,14 +115,27 @@ public override async Task RespondAsync( { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, - TTS = isTTS ? true : Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), + TTS = isTTS, Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, Flags = ephemeral ? MessageFlags.Ephemeral : Optional.Unspecified } }; - await InteractionHelper.SendInteractionResponse(Discord, response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond twice to the same interaction"); + } + } + + await InteractionHelper.SendInteractionResponseAsync(Discord, response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } /// @@ -141,27 +152,20 @@ public override async Task FollowupAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); var args = new API.Rest.CreateWebhookMessageParams { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified }; @@ -173,8 +177,8 @@ public override async Task FollowupAsync( /// public override async Task FollowupWithFileAsync( + Stream fileStream, string text = null, - Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, @@ -187,29 +191,22 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); Preconditions.NotNull(fileStream, nameof(fileStream), "File Stream must have data"); - Preconditions.NotNullOrWhitespace(fileName, nameof(fileName), "File Name must not be empty or null"); + Preconditions.NotNullOrEmpty(fileName, nameof(fileName), "File Name must not be empty or null"); var args = new API.Rest.CreateWebhookMessageParams { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = fileStream is not null ? new MultipartFile(fileStream, fileName) : Optional.Unspecified }; @@ -222,8 +219,8 @@ public override async Task FollowupWithFileAsync( /// public override async Task FollowupWithFileAsync( + string filePath, string text = null, - string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, @@ -236,28 +233,24 @@ public override async Task FollowupWithFileAsync( if (!IsValidToken) throw new InvalidOperationException("Interaction token is no longer valid"); + embeds ??= Array.Empty(); if (embed != null) - { - if (embeds == null) - embeds = new[] { embed }; - else - { - List listEmbeds = embeds.ToList(); - listEmbeds.Insert(0, embed); - } - } + embeds = new[] { embed }.Concat(embeds).ToArray(); Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - Preconditions.AtMost(embeds?.Length ?? 0, 10, nameof(embeds), "A max of 10 embeds are allowed."); - Preconditions.NotNullOrWhitespace(filePath, nameof(filePath), "Path must exist"); + Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); + Preconditions.NotNullOrEmpty(filePath, nameof(filePath), "Path must exist"); + + fileName ??= Path.GetFileName(filePath); + Preconditions.NotNullOrEmpty(fileName, nameof(fileName), "File Name must not be empty or null"); var args = new API.Rest.CreateWebhookMessageParams { Content = text, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, IsTTS = isTTS, - Embeds = embeds?.Select(x => x.ToModel()).ToArray() ?? Optional.Unspecified, + Embeds = embeds.Select(x => x.ToModel()).ToArray(), Components = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, File = !string.IsNullOrEmpty(filePath) ? new MultipartFile(new MemoryStream(File.ReadAllBytes(filePath), false), fileName) : Optional.Unspecified }; @@ -274,8 +267,11 @@ public override async Task FollowupWithFileAsync( /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// - public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) + public override async Task DeferAsync(bool ephemeral = false, RequestOptions options = null) { + if (!InteractionHelper.CanSendResponse(this)) + throw new TimeoutException($"Cannot defer an interaction after {InteractionHelper.ResponseTimeLimit} seconds!"); + var response = new API.InteractionResponse { Type = InteractionResponseType.DeferredChannelMessageWithSource, @@ -285,7 +281,20 @@ public override Task DeferAsync(bool ephemeral = false, RequestOptions options = } }; - return Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options); + lock (_lock) + { + if (_hasResponded) + { + throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); + } + } + + await Discord.Rest.ApiClient.CreateInteractionResponseAsync(response, Id, Token, options).ConfigureAwait(false); + + lock (_lock) + { + _hasResponded = true; + } } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs index cac1ce2df1..cb2f01f5f7 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBaseData.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; using Model = Discord.API.ApplicationCommandInteractionData; namespace Discord.WebSocket diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs index c76bc49c3f..c065637ca8 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketResolvableData.cs @@ -1,8 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Discord.WebSocket { diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index c8e07bf97a..20d8fa0f53 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -8,7 +8,7 @@ namespace Discord.WebSocket { /// - /// Represents an Interaction recieved over the gateway. + /// Represents an Interaction received over the gateway. /// public abstract class SocketInteraction : SocketEntity, IDiscordInteraction { @@ -47,13 +47,13 @@ public abstract class SocketInteraction : SocketEntity, IDiscordInteracti public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); + internal abstract bool _hasResponded { get; set; } + /// /// if the token is valid for replying to, otherwise . /// public bool IsValidToken - => CheckToken(); - - private ulong? GuildId { get; set; } + => InteractionHelper.CanRespondOrFollowup(this); internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel) : base(client, id) @@ -65,9 +65,9 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model { if (model.Type == InteractionType.ApplicationCommand) { - var dataModel = model.Data.IsSpecified ? - (DataModel)model.Data.Value - : null; + var dataModel = model.Data.IsSpecified + ? (DataModel)model.Data.Value + : null; if (dataModel == null) return null; @@ -77,15 +77,17 @@ internal static SocketInteraction Create(DiscordSocketClient client, Model model ApplicationCommandType.Slash => SocketSlashCommand.Create(client, model, channel), ApplicationCommandType.Message => SocketMessageCommand.Create(client, model, channel), ApplicationCommandType.User => SocketUserCommand.Create(client, model, channel), - _ => null, + _ => null }; } - else if (model.Type == InteractionType.MessageComponent) + + if (model.Type == InteractionType.MessageComponent) return SocketMessageComponent.Create(client, model, channel); - else if (model.Type == InteractionType.ApplicationCommandAutocomplete) + + if (model.Type == InteractionType.ApplicationCommandAutocomplete) return SocketAutocompleteInteraction.Create(client, model, channel); - else - return null; + + return null; } internal virtual void Update(Model model) @@ -93,8 +95,6 @@ internal virtual void Update(Model model) Data = model.Data.IsSpecified ? model.Data.Value : null; - - GuildId = model.GuildId.ToNullable(); Token = model.Token; Version = model.Version; Type = model.Type; @@ -103,7 +103,7 @@ internal virtual void Update(Model model) { if (model.Member.IsSpecified && model.GuildId.IsSpecified) { - User = SocketGuildUser.Create(Discord.State.GetGuild(GuildId.Value), Discord.State, model.Member.Value); + User = SocketGuildUser.Create(Discord.State.GetGuild(model.GuildId.Value), Discord.State, model.Member.Value); } else { @@ -142,7 +142,7 @@ public abstract Task RespondAsync(string text = null, Embed[] embeds = null, boo /// /// The sent message. /// - public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + public abstract Task FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// @@ -161,7 +161,7 @@ public abstract Task FollowupAsync(string text = null, Embe /// /// The sent message. /// - public abstract Task FollowupWithFileAsync(string text = null, Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + public abstract Task FollowupWithFileAsync(Stream fileStream, string fileName, string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// @@ -180,13 +180,13 @@ public abstract Task FollowupWithFileAsync(string text = nu /// /// The sent message. /// - public abstract Task FollowupWithFileAsync(string text = null, string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, + public abstract Task FollowupWithFileAsync(string filePath, string text = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); /// /// Gets the original response for this interaction. /// - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. public Task GetOriginalResponseAsync(RequestOptions options = null) => InteractionHelper.GetOriginalResponseAsync(Discord, Channel, this, options); @@ -195,11 +195,11 @@ public Task GetOriginalResponseAsync(RequestOptions opti /// Edits original response for this interaction. /// /// A delegate containing the properties to modify the message with. - /// The request options for this async request. + /// The request options for this request. /// A that represents the initial response. public async Task ModifyOriginalResponseAsync(Action func, RequestOptions options = null) { - var model = await InteractionHelper.ModifyInteractionResponse(Discord, Token, func, options); + var model = await InteractionHelper.ModifyInteractionResponseAsync(Discord, Token, func, options); return RestInteractionMessage.Create(Discord, model, Token, Channel); } @@ -207,31 +207,26 @@ public async Task ModifyOriginalResponseAsync(Action /// to send this message ephemerally, otherwise . - /// The request options for this async request. + /// The request options for this request. /// /// A task that represents the asynchronous operation of acknowledging the interaction. /// public abstract Task DeferAsync(bool ephemeral = false, RequestOptions options = null); - - private bool CheckToken() - { - // Tokens last for 15 minutes according to https://discord.com/developers/docs/interactions/slash-commands#responding-to-an-interaction - return (DateTime.UtcNow - CreatedAt.UtcDateTime).TotalMinutes <= 15d; - } -#endregion + + #endregion #region IDiscordInteraction /// - async Task IDiscordInteraction.FollowupAsync (string text, Embed[] embeds, bool isTTS, bool ephemeral, AllowedMentions allowedMentions, + async Task IDiscordInteraction.FollowupAsync(string text, Embed[] embeds, bool isTTS, bool ephemeral, AllowedMentions allowedMentions, RequestOptions options, MessageComponent component, Embed embed) => await FollowupAsync(text, embeds, isTTS, ephemeral, allowedMentions, options, component, embed).ConfigureAwait(false); /// - async Task IDiscordInteraction.GetOriginalResponseAsync (RequestOptions options) + async Task IDiscordInteraction.GetOriginalResponseAsync(RequestOptions options) => await GetOriginalResponseAsync(options).ConfigureAwait(false); /// - async Task IDiscordInteraction.ModifyOriginalResponseAsync (Action func, RequestOptions options) + async Task IDiscordInteraction.ModifyOriginalResponseAsync(Action func, RequestOptions options) => await ModifyOriginalResponseAsync(func, options).ConfigureAwait(false); #endregion } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index acf60f3716..4be9f4c5a6 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -17,6 +17,7 @@ public abstract class SocketMessage : SocketEntity, IMessage #region SocketMessage private long _timestampTicks; private readonly List _reactions = new List(); + private ImmutableArray _userMentions = ImmutableArray.Create(); /// /// Gets the author of this message. @@ -38,6 +39,9 @@ public abstract class SocketMessage : SocketEntity, IMessage /// public string Content { get; private set; } + /// + public string CleanContent => MessageHelper.SanitizeMessage(this); + /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); /// @@ -63,6 +67,11 @@ public abstract class SocketMessage : SocketEntity, IMessage /// public IReadOnlyCollection Components { get; private set; } + /// + /// Gets the interaction this message is a response to. + /// + public MessageInteraction Interaction { get; private set; } + /// public MessageFlags? Flags { get; private set; } @@ -97,20 +106,19 @@ public abstract class SocketMessage : SocketEntity, IMessage /// Collection of WebSocket-based roles. /// public virtual IReadOnlyCollection MentionedRoles => ImmutableArray.Create(); - /// - /// Returns the users mentioned in this message. - /// - /// - /// Collection of WebSocket-based users. - /// - public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); /// public virtual IReadOnlyCollection Tags => ImmutableArray.Create(); /// public virtual IReadOnlyCollection Stickers => ImmutableArray.Create(); /// public IReadOnlyDictionary Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); - + /// + /// Returns the users mentioned in this message. + /// + /// + /// Collection of WebSocket-based users. + /// + public IReadOnlyCollection MentionedUsers => _userMentions; /// public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); @@ -139,7 +147,9 @@ internal virtual void Update(ClientState state, Model model) _timestampTicks = model.Timestamp.Value.UtcTicks; if (model.Content.IsSpecified) + { Content = model.Content.Value; + } if (model.Application.IsSpecified) { @@ -225,6 +235,36 @@ internal virtual void Update(ClientState state, Model model) else Components = new List(); + if (model.UserMentions.IsSpecified) + { + var value = model.UserMentions.Value; + if (value.Length > 0) + { + var newMentions = ImmutableArray.CreateBuilder(value.Length); + for (int i = 0; i < value.Length; i++) + { + var val = value[i]; + if (val != null) + { + var user = Channel.GetUserAsync(val.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; + if (user != null) + newMentions.Add(user); + else + newMentions.Add(SocketUnknownUser.Create(Discord, state, val)); + } + } + _userMentions = newMentions.ToImmutable(); + } + } + + if (model.Interaction.IsSpecified) + { + Interaction = new MessageInteraction(model.Interaction.Value.Id, + model.Interaction.Value.Type, + model.Interaction.Value.Name, + SocketGlobalUser.Create(Discord, state, model.Interaction.Value.User)); + } + if (model.Flags.IsSpecified) Flags = model.Flags.Value; } @@ -262,9 +302,13 @@ public Task DeleteAsync(RequestOptions options = null) /// IReadOnlyCollection IMessage.Components => Components; + /// + IMessageInteraction IMessage.Interaction => Interaction; + /// IReadOnlyCollection IMessage.Stickers => Stickers; + internal void AddReaction(SocketReaction reaction) { _reactions.Add(reaction); diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 7ff55c6138..e8f5604c4c 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -22,7 +22,6 @@ public class SocketUserMessage : SocketMessage, IUserMessage private ImmutableArray _embeds = ImmutableArray.Create(); private ImmutableArray _tags = ImmutableArray.Create(); private ImmutableArray _roleMentions = ImmutableArray.Create(); - private ImmutableArray _userMentions = ImmutableArray.Create(); private ImmutableArray _stickers = ImmutableArray.Create(); /// @@ -46,8 +45,6 @@ public class SocketUserMessage : SocketMessage, IUserMessage /// public override IReadOnlyCollection MentionedRoles => _roleMentions; /// - public override IReadOnlyCollection MentionedUsers => _userMentions; - /// public override IReadOnlyCollection Stickers => _stickers; /// public IUserMessage ReferencedMessage => _referencedMessage; @@ -108,32 +105,10 @@ internal override void Update(ClientState state, Model model) _embeds = ImmutableArray.Create(); } - if (model.UserMentions.IsSpecified) - { - var value = model.UserMentions.Value; - if (value.Length > 0) - { - var newMentions = ImmutableArray.CreateBuilder(value.Length); - for (int i = 0; i < value.Length; i++) - { - var val = value[i]; - if (val.Object != null) - { - var user = Channel.GetUserAsync(val.Object.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; - if (user != null) - newMentions.Add(user); - else - newMentions.Add(SocketUnknownUser.Create(Discord, state, val.Object)); - } - } - _userMentions = newMentions.ToImmutable(); - } - } - if (model.Content.IsSpecified) { var text = model.Content.Value; - _tags = MessageHelper.ParseTags(text, Channel, guild, _userMentions); + _tags = MessageHelper.ParseTags(text, Channel, guild, MentionedUsers); model.Content = text; } diff --git a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs index 20fa2a391a..2ccade2907 100644 --- a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs +++ b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs @@ -34,6 +34,8 @@ public class SocketRole : SocketEntity, IRole /// public string Name { get; private set; } /// + public string Icon { get; private set; } + /// public GuildPermissions Permissions { get; private set; } /// public int Position { get; private set; } @@ -72,6 +74,7 @@ internal static SocketRole Create(SocketGuild guild, ClientState state, Model mo internal void Update(ClientState state, Model model) { Name = model.Name; + Icon = model.Icon; IsHoisted = model.Hoist; IsManaged = model.Managed; IsMentionable = model.Mentionable; @@ -89,6 +92,10 @@ public Task ModifyAsync(Action func, RequestOptions options = nu public Task DeleteAsync(RequestOptions options = null) => RoleHelper.DeleteAsync(this, Discord, options); + /// + public string GetIconUrl() + => CDN.GetGuildRoleIconUrl(Id, Icon); + /// /// Gets the name of the role. /// diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index 9acc20a142..6a51040127 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -1,13 +1,9 @@ using Discord.Rest; using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.Sticker; - namespace Discord.WebSocket { /// @@ -23,7 +19,7 @@ public class SocketCustomSticker : SocketSticker, ICustomSticker /// /// /// This may return in the WebSocket implementation due to incomplete user collection in - /// large guilds, or the bot doesnt have the MANAGE_EMOJIS_AND_STICKERS permission. + /// large guilds, or the bot doesn't have the MANAGE_EMOJIS_AND_STICKERS permission. /// /// public SocketGuildUser Author @@ -54,7 +50,7 @@ internal static SocketCustomSticker Create(DiscordSocketClient client, Model mod /// public async Task ModifyAsync(Action func, RequestOptions options = null) { - if(!Guild.CurrentUser.GuildPermissions.Has(GuildPermission.ManageEmojisAndStickers)) + if (!Guild.CurrentUser.GuildPermissions.Has(GuildPermission.ManageEmojisAndStickers)) throw new InvalidOperationException($"Missing permission {nameof(GuildPermission.ManageEmojisAndStickers)}"); var model = await GuildHelper.ModifyStickerAsync(Discord, Guild.Id, this, func, options); @@ -72,7 +68,7 @@ public async Task DeleteAsync(RequestOptions options = null) internal SocketCustomSticker Clone() => MemberwiseClone() as SocketCustomSticker; private new string DebuggerDisplay => Guild == null ? base.DebuggerDisplay : $"{Name} in {Guild.Name} ({Id})"; -#endregion + #endregion #region ICustomSticker ulong? ICustomSticker.AuthorId diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index 758ecebb4d..ee45720b52 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -1,11 +1,7 @@ -using Discord.Rest; -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Model = Discord.API.Sticker; namespace Discord.WebSocket @@ -49,12 +45,9 @@ internal SocketSticker(DiscordSocketClient client, ulong id) internal static SocketSticker Create(DiscordSocketClient client, Model model) { - SocketSticker entity; - - if (model.GuildId.IsSpecified) - entity = new SocketCustomSticker(client, model.Id, client.GetGuild(model.GuildId.Value), model.User.IsSpecified ? model.User.Value.Id : null); - else - entity = new SocketSticker(client, model.Id); + var entity = model.GuildId.IsSpecified + ? new SocketCustomSticker(client, model.Id, client.GetGuild(model.GuildId.Value), model.User.IsSpecified ? model.User.Value.Id : null) + : new SocketSticker(client, model.Id); entity.Update(model); return entity; @@ -63,21 +56,16 @@ internal static SocketSticker Create(DiscordSocketClient client, Model model) internal virtual void Update(Model model) { Name = model.Name; - Description = model.Desription; + Description = model.Description; PackId = model.PackId; IsAvailable = model.Available; Format = model.FormatType; Type = model.Type; SortOrder = model.SortValue; - if (model.Tags.IsSpecified) - { - Tags = model.Tags.Value.Split(',').Select(x => x.Trim()).ToImmutableArray(); - } - else - { - Tags = ImmutableArray.Empty; - } + Tags = model.Tags.IsSpecified + ? model.Tags.Value.Split(',').Select(x => x.Trim()).ToImmutableArray() + : ImmutableArray.Create(); } internal string DebuggerDisplay => $"{Name} ({Id})"; @@ -85,10 +73,10 @@ internal virtual void Update(Model model) /// public override bool Equals(object obj) { - if (obj is API.Sticker stickerModel) + if (obj is Model stickerModel) { return stickerModel.Name == Name && - stickerModel.Desription == Description && + stickerModel.Description == Description && stickerModel.FormatType == Format && stickerModel.Id == Id && stickerModel.PackId == PackId && @@ -97,8 +85,8 @@ public override bool Equals(object obj) stickerModel.Available == IsAvailable && (!stickerModel.Tags.IsSpecified || stickerModel.Tags.Value == string.Join(", ", Tags)); } - else - return base.Equals(obj); + + return base.Equals(obj); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs index 2e9514595a..ca7d2d0f1a 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketUnknownSticker.cs @@ -1,8 +1,5 @@ -using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.StickerItem; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index 2cec3d6123..c91921379b 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -1,11 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using Model = Discord.API.ThreadMember; -using MemberModel = Discord.API.GuildMember; -using Discord.API; using System.Collections.Immutable; namespace Discord.WebSocket @@ -163,7 +160,6 @@ internal void Update(Model model) } } - /// public ChannelPermissions GetPermissions(IGuildChannel channel) => GuildUser.GetPermissions(channel); diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj index 036d8c9a8b..24ae442d70 100644 --- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj +++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj @@ -1,4 +1,4 @@ - + @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj b/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj index 8f69672f9e..1257041e4f 100644 --- a/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj +++ b/test/Discord.Net.Analyzers.Tests/Discord.Net.Analyzers.Tests.csproj @@ -15,10 +15,10 @@ - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj b/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj index c571059ef3..8b16b29713 100644 --- a/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj +++ b/test/Discord.Net.Tests.Integration/Discord.Net.Tests.Integration.csproj @@ -15,9 +15,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj b/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj index 8660416968..716c3ebc41 100644 --- a/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj +++ b/test/Discord.Net.Tests.Unit/Discord.Net.Tests.Unit.csproj @@ -13,9 +13,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs index 4d0cc8a558..83c6ede19e 100644 --- a/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs +++ b/test/Discord.Net.Tests.Unit/EmbedBuilderTests.cs @@ -171,7 +171,7 @@ IEnumerable GetValid() } /// - /// Tests that valid urls do not throw any exceptions. + /// Tests that valid url's do not throw any exceptions. /// /// The url to set. [Theory] diff --git a/test/Discord.Net.Tests.Unit/FormatTests.cs b/test/Discord.Net.Tests.Unit/FormatTests.cs index 2a5adbaae7..c015c7e155 100644 --- a/test/Discord.Net.Tests.Unit/FormatTests.cs +++ b/test/Discord.Net.Tests.Unit/FormatTests.cs @@ -59,5 +59,20 @@ public void BlockQuote(string input, string expected) { Assert.Equal(expected, Format.BlockQuote(input)); } + + [Theory] + [InlineData("", "")] + [InlineData("\n", "\n")] + [InlineData("**hi**", "hi")] + [InlineData("__uwu__", "uwu")] + [InlineData(">>__uwu__", "uwu")] + [InlineData("```uwu```", "uwu")] + [InlineData("~uwu~", "uwu")] + [InlineData("berries __and__ *Cream**, I'm a little lad who loves berries and cream", "berries and Cream, I'm a little lad who loves berries and cream")] + public void StripMarkdown(string input, string expected) + { + var test = Format.StripMarkDown(input); + Assert.Equal(expected, test); + } } } From 4ea9978aac29d79cc1bafffecd6618e008d0c230 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sat, 16 Oct 2021 23:31:07 -0300 Subject: [PATCH 412/494] Update docs --- .../01-getting-started.md | 9 ++- .../creating-context-menu-commands.md | 8 ++- .../receiving-context-menu-command-events.md | 41 +++++------- .../03-responding-to-slash-commands.md | 27 ++------ .../slash-commands/04-parameters.md | 17 +++-- .../05-responding-ephemerally.md | 19 ++---- .../slash-commands/06-subcommands.md | 27 ++++---- .../slash-commands/07-choice-slash-command.md | 31 +++++----- ...bulk-overwrite-of-global-slash-commands.md | 11 ++-- .../message-components/01-getting-started.md | 5 ++ .../02-responding-to-buttons.md | 33 +++------- .../message-components/03-buttons-in-depth.md | 5 ++ .../message-components/04-select-menus.md | 7 ++- .../message-components/05-advanced.md | 62 +++++++++++-------- docs/guides/toc.yml | 22 ++++++- 15 files changed, 162 insertions(+), 162 deletions(-) diff --git a/docs/guides/interactions/application-commands/01-getting-started.md b/docs/guides/interactions/application-commands/01-getting-started.md index 20201f46c4..089bd8b3bb 100644 --- a/docs/guides/interactions/application-commands/01-getting-started.md +++ b/docs/guides/interactions/application-commands/01-getting-started.md @@ -1,3 +1,9 @@ +--- +uid: Guides.SlashCommands.Intro +title: Introduction to slash commands +--- + + # Getting started with application commands. Welcome! This guide will show you how to use application commands. If you have extra questions that aren't covered here you can come to our [Discord](https://discord.com/invite/dvSfUTet3K) server and ask around there. @@ -22,4 +28,5 @@ Head over to your discord applications OAuth2 screen and make sure to select the From there you can then use the link to add your bot to a server. -**Note**: In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild. +> [!NOTE] +> In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild. diff --git a/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md b/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md index d497ca1e6e..02a9cde14b 100644 --- a/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md +++ b/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.ContextCommands.Creating +title: Creating Context Commands +--- + # Creating context menu commands. There are two kinds of Context Menu Commands: User Commands and Message Commands. @@ -96,4 +101,5 @@ public async Task Client_Ready() ``` -**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. +> [!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. diff --git a/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md b/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md index 52bc303e75..d4e973d049 100644 --- a/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md +++ b/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md @@ -1,40 +1,33 @@ +--- +uid: Guides.ContextCommands.Reveiving +title: Receiving Context Commands +--- + # Receiving Context Menu events -User commands and Message commands have their own unique objects returned. Different from Slash commands. To get the appropriate object returned, you can use a similar method to the slash commands. +User commands and Message commands have their own unique event just like the other interaction types. For user commands the event is `UserCommandExecuted` and for message commands the event is `MessageCommandExecuted`. ```cs -client.InteractionCreated += InteractionCreatedHandler; +// For message commands +client.MessageCommandExecuted += MessageCommandHandler; + +// For user commands +client.UserCommandExecuted += UserCommandHandler; ... -public async Task InteractionCreatedHandler(SocketInteraction arg) +public async Task MessageCommandHandler(SocketMessageCommand arg) { - if ( arg.Type == InteractionType.ApplicationCommand) - Task.Run(() => ApplicationCommandHandler(arg)); + Console.Writeline("Message command received!"); } -public async Task ApplicationCommandHandler(SocketInteraction arg) +public async Task UserCommandHandler(SocketUserCommand arg) { - switch (arg) - { - case SocketSlashCommand slashCommand: - Console.Writeline("Slash command received!"); - break; - case SocketUserCommand userCommand: - Console.Writeline("User command received!") - // userCommand.User = User who ran command. - // userCommand.Data.Member = User who was clicked. - break; - case SocketMessageCommand messageCommand: - Console.Writeline("Message command received!") - // messageCommand.User = User who ran command. - // messageCommand.Data.Message = Message that was clicked. - break; - } + Console.Writeline("User command received!"); } ``` -User commands return a SocketUser object, showing the user that was clicked to run the command. -Message commands return a SocketMessage object, showing the message that was clicked to run the command. +User commands contain a SocketUser object called `Member` in their data class, showing the user that was clicked to run the command. +Message commands contain a SocketMessage object called `Message` in their data class, showing the message that was clicked to run the command. Both return the user who ran the command, the guild (if any), channel, etc. \ No newline at end of file diff --git a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md index cd6ad52172..3dbc579fee 100644 --- a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md @@ -5,40 +5,25 @@ title: Receiving and Responding to Slash Commands # Responding to interactions. -Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. In order to receive a slash command we have to listen to the `InteractionCreated` event. Let's add this to our code. +Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. We can listen to the `SlashCommandExecuted` event to respond to them. Lets add this to our code: ```cs -client.InteractionCreated += Client_InteractionCreated; +client.SlashCommandExecuted += SlashCommandHandler; ... -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { } ``` -Now that we have the interaction event, let's talk about the `SocketInteraction` argument. The interaction can be cast to either a `SocketSlashCommand` or a `SocketMessageComponent`. In our case, we're trying to use slash commands so let's cast it to a `SocketSlashCommand`. - -```cs -private async Task Client_InteractionCreated(SocketInteraction arg) -{ - if(arg is SocketSlashCommand command) - { - // we now have an instance of a SocketSlashCommand named command. - } -} -``` - With every type of interaction there is a `Data` field. This is where the relevant information lives about our command that was executed. In our case, `Data` is a `SocketSlashCommandData` instance. In the data class, we can access the name of the command triggered as well as the options if there were any. For this example, we're just going to respond with the name of the command executed. ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) - { - await command.RespondAsync($"You executed {command.Data.Name}"); - } + await command.RespondAsync($"You executed {command.Data.Name}"); } ``` @@ -48,8 +33,6 @@ Let's try this out! ![slash command result](images/slashcommand2.png) -Let's go over the response types quickly, as you would only change them for style points :P - > [!NOTE] > After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`. > If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) diff --git a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md index cc61796c8e..6afd83729d 100644 --- a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md +++ b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md @@ -46,7 +46,7 @@ public async Task Client_Ready() var guildCommand = new SlashCommandBuilder() .WithName("list-roles") .WithDescription("Lists all roles of a user.") - .AddOption("user", ApplicationCommandOptionType.User, "The users whos roles you want to be listed", required: true); + .AddOption("user", ApplicationCommandOptionType.User, "The users whos roles you want to be listed", isRequired: true); try { @@ -66,17 +66,14 @@ public async Task Client_Ready() That seems to be working, now Let's handle the interaction. ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) { - // Let's add a switch statement for the command name so we can handle multiple commands in one event. - switch(command.Data.Name) - { - case "list-roles": - await HandleListRoleCommand(command); - break; - } + case "list-roles": + await HandleListRoleCommand(command); + break; } } diff --git a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md index 2b654763d5..10b04a8d26 100644 --- a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md +++ b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md @@ -5,21 +5,10 @@ title: Ephemeral Responses # Responding ephemerally -What is an ephemeral response? Basically, only the user who executed the command can see the result of it. In labs this is pretty simple to do. +What is an ephemeral response? Basically, only the user who executed the command can see the result of it, this is pretty simple to implement. -First, we need to talk about `AlwaysAcknowledgeInteractions` in the discord config. `AlwaysAcknowledgeInteractions` will always acknowledge the message non-ephemerally, meaning any follow-up messages or responses will also be non-ephemeral. If you set `AlwaysAcknowledgeInteractions` to false, you can acknowledge interactions yourself with the ephemeral field set to your discretion. - -**Note**: You don't have to run arg.AcknowledgeAsync() to capture the interaction, you can use arg.RespondAsync with a message to capture it, this also follows the ephemeral rule. - -Let's start by changing our client config. - -```cs -client = new DiscordSocketClient(new DiscordSocketConfig() -{ - // Add this! - AlwaysAcknowledgeInteractions = false, -}); -``` +> [!NOTE] +> You don't have to run arg.DeferAsync() to capture the interaction, you can use arg.RespondAsync() with a message to capture it, this also follows the ephemeral rule. When responding with either `FollowupAsync` or `RespondAsync` you can pass in an `ephemeral` property. When setting it to true it will respond ephemerally, false and it will respond non-ephemerally. @@ -31,4 +20,4 @@ await command.RespondAsync(embed: embedBuiler.Build(), ephemeral: true); Running the command now only shows the message to us! -![ephemeral command](images/ephemeral1.png) +![ephemeral command](images/ephemeral1.png) \ No newline at end of file diff --git a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md index ac8c7313d2..83d7b283cd 100644 --- a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md +++ b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md @@ -86,7 +86,7 @@ public async Task Client_Ready() .WithName("set") .WithDescription("Sets the field A") .WithType(ApplicationCommandOptionType.SubCommand) - .AddOption("value", ApplicationCommandOptionType.String, "the value to set the field ", required: true) + .AddOption("value", ApplicationCommandOptionType.String, "the value to set the field", isRequired: true) ).AddOption(new SlashCommandOptionBuilder() .WithName("get") .WithDescription("Gets the value of field A.") @@ -100,7 +100,7 @@ public async Task Client_Ready() .WithName("set") .WithDescription("Sets the field B") .WithType(ApplicationCommandOptionType.SubCommand) - .AddOption("value", ApplicationCommandOptionType.Integer, "the value to set the fie to.", required: true) + .AddOption("value", ApplicationCommandOptionType.Integer, "the value to set the fie to.", isRequired: true) ).AddOption(new SlashCommandOptionBuilder() .WithName("get") .WithDescription("Gets the value of field B.") @@ -114,7 +114,7 @@ public async Task Client_Ready() .WithName("set") .WithDescription("Sets the field C") .WithType(ApplicationCommandOptionType.SubCommand) - .AddOption("value", ApplicationCommandOptionType.Boolean, "the value to set the fie to.", required: true) + .AddOption("value", ApplicationCommandOptionType.Boolean, "the value to set the fie to.", isRequired: true) ).AddOption(new SlashCommandOptionBuilder() .WithName("get") .WithDescription("Gets the value of field C.") @@ -140,20 +140,17 @@ All that code generates a command that looks like this: Now that we have our command made, we need to handle the multiple options with this command. So lets add this into our handler: ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) { - // Let's add a switch statement for the command name so we can handle multiple commands in one event. - switch(command.Data.Name) - { - case "list-roles": - await HandleListRoleCommand(command); - break; - case "settings": - await HandleSettingsCommand(command); - break; - } + case "list-roles": + await HandleListRoleCommand(command); + break; + case "settings": + await HandleSettingsCommand(command); + break; } } diff --git a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md index 79de5ffbca..3951e1141c 100644 --- a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md +++ b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md @@ -40,8 +40,8 @@ private async Task Client_Ready() } } ``` - -> **Note:** Your `ApplicationCommandOptionType` specifies which type your choices are, you need to use `ApplicationCommandOptionType.Integer` if choices whos value are numbers and `ApplicationCommandOptionType.String` for string values. +> [!NOTE] +> Your `ApplicationCommandOptionType` specifies which type your choices are, you need to use `ApplicationCommandOptionType.Integer` for choices whos values are whole numbers, `ApplicationCommandOptionType.Number` for choices whos values are doubles, and `ApplicationCommandOptionType.String` for string values. We have defined 5 choices for the user to pick from, each choice has a value assigned to it. The value can either be a string or an int. In our case we're going to use an int. This is what the command looks like: @@ -50,23 +50,20 @@ We have defined 5 choices for the user to pick from, each choice has a value ass Lets add our code for handling the interaction. ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) { - // Let's add a switch statement for the command name so we can handle multiple commands in one event. - switch(command.Data.Name) - { - case "list-roles": - await HandleListRoleCommand(command); - break; - case "settings": - await HandleSettingsCommand(HandleFeedbackCommand); - break; - case "feedback": - await HandleFeedbackCommand(command); - break; - } + case "list-roles": + await HandleListRoleCommand(command); + break; + case "settings": + await HandleSettingsCommand(command); + break; + case "feedback": + await HandleFeedbackCommand(command); + break; } } diff --git a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md index e2511ab983..095eda14fa 100644 --- a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md @@ -6,9 +6,11 @@ title: Slash Command Bulk Overwrites If you have too many global commands then you might want to consider using the bulk overwrite function. ```cs -public async Task Client_Ready() { +public async Task Client_Ready() +{ List applicationCommandProperties = new(); - try { + try + { // Simple help slash command. SlashCommandBuilder globalCommandHelp = new SlashCommandBuilder(); globalCommandHelp.WithName("help"); @@ -28,10 +30,11 @@ public async Task Client_Ready() { applicationCommandProperties.Add(globalCommandAddFamily.Build()); await _client.BulkOverwriteGlobalApplicationCommandsAsync(applicationCommandProperties.ToArray()); - } catch (ApplicationCommandException exception) { + } + catch (ApplicationCommandException exception) + { var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); Console.WriteLine(json); } - Console.WriteLine("Client Ready: Finished"); } ``` diff --git a/docs/guides/interactions/message-components/01-getting-started.md b/docs/guides/interactions/message-components/01-getting-started.md index 2b1d3f5ff5..cd5eadd0a9 100644 --- a/docs/guides/interactions/message-components/01-getting-started.md +++ b/docs/guides/interactions/message-components/01-getting-started.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.GettingStarted +title: Getting Started with Components +--- + # Message Components Message components are a framework for adding interactive elements to a message your app or bot sends. They're accessible, customizable, and easy to use. diff --git a/docs/guides/interactions/message-components/02-responding-to-buttons.md b/docs/guides/interactions/message-components/02-responding-to-buttons.md index c83f1b9d24..00d651f6ba 100644 --- a/docs/guides/interactions/message-components/02-responding-to-buttons.md +++ b/docs/guides/interactions/message-components/02-responding-to-buttons.md @@ -1,30 +1,23 @@ +--- +uid: Guides.MessageComponents.Responding +title: Responding to Components +--- + # Responding to button clicks Responding to buttons is pretty simple, there are a couple ways of doing it and we can cover both. ### Method 1: Hooking the InteractionCreated Event -We can hook the `InteractionCreated` event since button clicks are a form of interactions: +We can hook the `ButtonExecuted` event for button type interactions: ```cs -client.IntreactionCreated += MyInteractionHandler; +client.ButtonExecuted += MyButtonHandler; ``` Now, lets write our handler. ```cs -public async Task MyInteractionHandler(SocketInteraction arg) -{ - // first we check the type of the interaction, this can be done with a switch statement - switch(arg) - { - case SocketMessageComponent component: - // we now have a variable defined as 'component' which contains our component data, lets pass it to a different handler. - - break; - } -} - public async Task MyButtonHandler(SocketMessageComponent component) { // We can now check for our custom id @@ -41,14 +34,4 @@ public async Task MyButtonHandler(SocketMessageComponent component) Running it and clicking the button: -![](Images/image2.png) - -### Method 2: Hooking the ButtonExecuted Event - -This method skips the first switch statement because the `ButtonExecuted` event is only fired when a button is clicked, meaning we dont have to check the type of the interaction. - -```cs -client.ButtonExecuted += MyButtonHandler; -``` - -The rest of the code is the same and produces the same result. +![](Images/image2.png) \ No newline at end of file diff --git a/docs/guides/interactions/message-components/03-buttons-in-depth.md b/docs/guides/interactions/message-components/03-buttons-in-depth.md index db38685017..f9fd67515d 100644 --- a/docs/guides/interactions/message-components/03-buttons-in-depth.md +++ b/docs/guides/interactions/message-components/03-buttons-in-depth.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.Buttons +title: Buttons in Depth +--- + # Buttons in depth There are many changes you can make to buttons, lets take a look at the parameters in the `WithButton` function" diff --git a/docs/guides/interactions/message-components/04-select-menus.md b/docs/guides/interactions/message-components/04-select-menus.md index 3f06aa389b..5181ddf347 100644 --- a/docs/guides/interactions/message-components/04-select-menus.md +++ b/docs/guides/interactions/message-components/04-select-menus.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.SelectMenus +title: Select Menus +--- + # Select menus Select menus allow users to select from a range of options, this can be quite useful with configuration commands etc. @@ -48,7 +53,7 @@ And opening the menu we see: ![](Images/image5.png) -Lets handle the selection of an option, as before we can hook the `InteractionCreated` event and check the type ourself but for this example im just going to use the `SelectMenuExecuted` event +Lets handle the selection of an option, We can hook the `SelectMenuExecuted` event to handle our select menu: ```cs client.SelectMenuExecuted += MyMenuHandler; diff --git a/docs/guides/interactions/message-components/05-advanced.md b/docs/guides/interactions/message-components/05-advanced.md index 638886ad32..49b3f31a6c 100644 --- a/docs/guides/interactions/message-components/05-advanced.md +++ b/docs/guides/interactions/message-components/05-advanced.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.Advanced +title: Advanced Concepts +--- + # Advanced Lets say you have some components on an ephemeral slash command, and you want to modify the message that the button is on. The issue with this is that ephemeral messages are not stored and can not be get via rest or other means. @@ -45,31 +50,38 @@ break; Now, let's listen to the select menu executed event and add a case for `select-1` ```cs -switch (arg.Data.CustomId) +client.SelectMenuExecuted += SelectMenuHandler; + +... + +public async Task SelectMenuHandler(SocketMessageComponent arg) { - case "select-1": - var value = arg.Data.Values.First(); - var menu = new SelectMenuBuilder() - { - CustomId = "select-1", - Placeholder = $"{(arg.Message.Components.First().Components.First() as SelectMenu).Options.FirstOrDefault(x => x.Value == value).Label}", - MaxValues = 1, - MinValues = 1, - Disabled = true - }; - - menu.AddOption("Meh", "1", "Its not gaming.") - .AddOption("Ish", "2", "Some would say that this is gaming.") - .AddOption("Moderate", "3", "It could pass as gaming") - .AddOption("Confirmed", "4", "We are gaming") - .AddOption("Excellent", "5", "It is renowned as gaming nation wide", new Emoji("🔥")); - - // We use UpdateAsync to update the message and its original content and components. - await arg.UpdateAsync(x => - { - x.Content = $"Thank you {arg.User.Mention} for rating us {value}/5 on the gaming scale"; - x.Components = new ComponentBuilder().WithSelectMenu(menu).Build(); - }); - break; + switch (arg.Data.CustomId) + { + case "select-1": + var value = arg.Data.Values.First(); + var menu = new SelectMenuBuilder() + { + CustomId = "select-1", + Placeholder = $"{(arg.Message.Components.First().Components.First() as SelectMenu).Options.FirstOrDefault(x => x.Value == value).Label}", + MaxValues = 1, + MinValues = 1, + Disabled = true + }; + + menu.AddOption("Meh", "1", "Its not gaming.") + .AddOption("Ish", "2", "Some would say that this is gaming.") + .AddOption("Moderate", "3", "It could pass as gaming") + .AddOption("Confirmed", "4", "We are gaming") + .AddOption("Excellent", "5", "It is renowned as gaming nation wide", new Emoji("🔥")); + + // We use UpdateAsync to update the message and its original content and components. + await arg.UpdateAsync(x => + { + x.Content = $"Thank you {arg.User.Mention} for rating us {value}/5 on the gaming scale"; + x.Components = new ComponentBuilder().WithSelectMenu(menu).Build(); + }); + break; + } } ``` diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index 64ed1c8cc1..df2eb025a2 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -35,10 +35,10 @@ topicUid: Guides.Commands.DI - name: Post-execution Handling topicUid: Guides.Commands.PostExecution -- name: Working with Interactions +- name: Working with Slash commands items: - name: Introduction - topicUid: Guides.Interactions.Intro + topicUid: Guides.SlashCommands.Intro - name: Creating slash commands topicUid: Guides.SlashCommands.Creating - name: Receiving and responding to slash commands @@ -53,6 +53,24 @@ topicUid: Guides.SlashCommands.Choices - name: Slash ommands Bulk Overwrites topicUid: Guides.SlashCommands.BulkOverwrite +- name: Working with Context commands + items: + - name: Creating Context Commands + topicUid: Guides.ContextCommands.Creating + - name: Receiving Context Commands + topicUid: Guides.ContextCommands.Reveiving +- name: Working with Message Components + items: + - name: Getting started + topicUid: Guides.MessageComponents.GettingStarted + - name: Responding to Components + topicUid: Guides.MessageComponents.Responding + - name: Buttons in depth + topicUid: Guides.MessageComponents.Buttons + - name: Select menus + topicUid: Guides.MessageComponents.SelectMenus + - name: Advanced Concepts + topicUid: Guides.MessageComponents.Advanced - name: Emoji topicUid: Guides.Emoji - name: Voice From fa6a0a8a80114be2edd62622269cad5f06e72eeb Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 07:28:37 -0300 Subject: [PATCH 413/494] Update CHANGELOG.md --- CHANGELOG.md | 598 +++++++++++++++++---------------------------------- 1 file changed, 192 insertions(+), 406 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21e37b2951..8f08ce69e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,441 +1,227 @@ # Changelog -## [2.4.0] - 2021-05-22 +## [3.1.4 - 3.1.6] - 10/12/2021 + ### Added -- #1726 Add stickers (91a9063) -- #1753 Webhook message edit & delete functionality (f67cd8e) -- #1757 Add ability to add/remove roles by id (4c9910c) -- #1781 Add GetEmotesAsync to IGuild (df23d57) -- #1801 Add missing property to MESSAGE_REACTION_ADD event (0715d7d) -- #1828 Add methods to interact with reactions without a message object (5b244f2) -- #1830 Add ModifyMessageAsync to IMessageChannel (365a848) -- #1844 Add Discord Certified Moderator user flag (4b8d444) -### Fixed -- #1486 Add type reader when entity type reader exists (c46daaa) -- #1835 Cached message emoji cleanup at MESSAGE_REACTION_REMOVE_EMOJI (8afef82) +- Added check for duplicate responses to interactions. +- Added check for 3 second timeout to interactions. -### Misc -- #1778 Remove URI check from EmbedBuilder (25b04c4) -- #1800 Fix spelling in SnowflakeUtils.FromSnowflake (6aff419) +### Fixes -## [2.3.1] - 2021-03-10 -### Fixed -- #1761 Deadlock in DiscordShardedClient when Ready is never received (73e5cc2) -- #1773 Private methods aren't added as commands (0fc713a) -- #1780 NullReferenceException in pin/unpin audit logs (f794163) -- #1786 Add ChannelType property to ChannelInfo audit log (6ac5ea1) -- #1791 Update Webhook ChannelId from model change (d2518db) -- #1794 Audit log UserId can be null (d41aeee) +- Fixed assignment of `UserMentions` +- Fixed `CleanContent` not being correct +- Fixed SocketSlashCommandData access modifier +- Fixed url validation for embed urls -### Misc -- #1774 Add remark regarding CustomStatus as the activity (51b7afe) +## [3.1.2 + 3.1.3] - 10/12/2021 -## [2.3.0] - 2021-01-28 ### Added -- #1491 Add INVITE_CREATE and INVITE_DELETE events (1ab670b) -- #1520 Support reading multiple activities (421a0c1) -- #1521 Allow for inherited commands in modules (a51cdf6) -- #1526 Add Direction.Around to GetMessagesAsync (f2130f8) -- #1537 Implement gateway ratelimit (ec673e1) -- #1544 Add MESSAGE_REACTION_REMOVE_EMOJI and RemoveAllReactionsForEmoteAsync (a89f076) -- #1549 Add GetUsersAsync to SocketGuild (30b5a83) -- #1566 Support Gateway Intents (d5d10d3) -- #1573 Add missing properties to Guild and deprecate GuildEmbed (ec212b1) -- #1581 Add includeRoleIds to PruneUsersAsync (a80e5ff) -- #1588 Add GetStreams to AudioClient (1e012ac) -- #1596 Add missing channel properties (2d80037) -- #1604 Add missing application properties (including Teams) (10fcde0) -- #1619 Add "View Guild Insights" to GuildPermission (2592264) -- #1637 Added CultureInvariant RegexOption to WebhookUrlRegex (e3925a7) -- #1659 Add inline replies (e3850e1) -- #1688 Send presence on Identify payload (25d5d36) -- #1721 Add role tags (6a62c47) -- #1722 Add user public flags (c683b29) -- #1724 Add MessageFlags and AllowedMentions to message modify (225550d) -- #1731 Add GuildUser IsPending property (8b25c9b) -- #1690 Add max bitrate value to SocketGuild (aacfea0) -### Fixed -- #1244 Missing AddReactions permission for DM channels. (e40ca4a) -- #1469 unsupported property causes an exception (468f826) -- #1525 AllowedMentions and AllowedMentionTypes (3325031) -- #1531 Add AllowedMentions to SendFileAsync (ab32607) -- #1532 GuildEmbed.ChannelId as nullable per API documentation (971d519) -- #1546 Different ratelimits for the same route (implement discord buckets) (2f6c017) -- #1548 Incomplete Ready, DownloadUsersAsync, and optimize AlwaysDownloadUsers (dc8c959) -- #1555 InvalidOperationException at MESSAGE_CREATE (bd4672a) -- #1557 Sending 2 requests instead of 1 to create a Guild role. (5430cc8) -- #1571 Not using the new domain name. (df8a0f7) -- #1578 Trim token before passing it to the authorization header (42ba372) -- #1580 Stop TaskCanceledException from bubbling up (b8fa464) -- #1599 Invite audit log without inviter (b95b95b) -- #1602 Add AllowedMentions to webhooks (bd4516b) -- #1603 Cancel reconnection when 4014 (f396cd9) -- #1608 Voice overwrites and CategoryId remarks (43c8fc0) -- #1614 Check error 404 and return null for GetBanAsync (ae9fff6) -- #1621 Parse mentions from message payload (366ca9a) -- #1622 Do not update overwrite cache locally (3860da0) -- #1623 Invoke UserUpdated from GuildMemberUpdated if needed (3085e88) -- #1624 Handle null PreferredLocale in rare cases (c1d04b4) -- #1639 Invite and InviteMetadata properties (dd2e524) -- #1642 Add missing permissions (4b389f3) -- #1647 handicap member downloading for verified bots (fa5ef5e) -- #1652 Update README.MD to reflect new discord domain (03b831e) -- #1667 Audio stream dispose (a2af985) -- #1671 Crosspost throwing InvalidOperationException (9134443) -- #1672 Team is nullable, not optional (be60d81) -- #1681 Emoji url encode (04389a4) -- #1683 SocketGuild.HasAllMembers is false if a user left a guild (47f571e) -- #1686 Revert PremiumSubscriptionCount type (97e71cd) -- #1695 Possible NullReferenceException when receiving InvalidSession (5213916) -- #1702 Rollback Activities to Game (9d7cb39) -- #1727 Move and fix internal AllowedMentions object (4a7f8fe) -- limit request members batch size (084db25) -- UserMentions throwing NullRef (5ed01a3) -- Wrong author for SocketUserMessage.ReferencedMessage (1e9b252) -- Discord sends null when there's no team (05a1f0a) -- IMessage.Embeds docs remarks (a4d32d3) -- Missing MessageReference when sending files (2095701) +- Added .NET 5 build. +- Added `Ephemeral` property to `Attachment`. +- Added `ChannelTypes` to `ApplicationCommandOption` and builders. +- Added event for `SocketAutocompleteInteraction` called `AutocompleteExecuted`. +- Added `CleanContent` to `IMessage` and implemented entities. +- Added support for `discord://` protocol on buttons. +- Added `Competing` status type. +- Added `Icon` and `GetIconUrl` to roles. +- Added `Interaction` to `IMessage` and implemented entities. +- Added `ContextMenuCommand` message type. +- Added stage instance audit logs as well as thread audit log type. +- Added restriction for description not being null in `SlashCommandBuilder`. + +### Fixes + +- Fixed channel name ratelimits being ignored + any other property specific ratelimits. +- Fix different rest channels not deserializing properly. +- Fix NRE in modify guild channel. +- Fixed system messages not including mentioned users. +- Fixed sub commands being interpreted as a parameter for autocomplete. +- Fixed `Type` not being set in `SocketApplicationCommand`. ### Misc -- #1545 MutualGuilds optimization (323a677) -- #1551 Update webhook regex to support discord.com (7585789) -- #1556 Add SearchUsersAsync (57880de) -- #1561 Minor refactor to switch expression (42826df) -- #1576 Updating comments for privileged intents (c42bfa6) -- #1678 Change ratelimit messages (47ed806) -- #1714 Update summary of SocketVoiceChannel.Users (e385c40) -- #1720 VoiceRegions and related changes (5934c79) -- Add updated libraries for LastModified (d761846) -- Add alternative documentation link (accd351) -- Temporarily disable StyleCops until all the fixes are impl'd (36de7b2) -- Remove redundant CreateGuildRoleParams (3df0539) -- Add minor tweaks to DiscordSocketConfig docs strings (2cd1880) -- Fix MaxWaitBetweenGuildAvailablesBeforeReady docs string (e31cdc7) -- Missing summary tag for GatewayIntents (3a10018) -- Add new method of role ID copy (857ef77) -- Resolve inheritdocs for IAttachment (9ea3291) -- Mark null as a specific langword in summary (13a41f8) -- Cleanup GatewayReconnectException docs (833ee42) -- Update Docfx.Plugins.LastModified to v1.2.4 (28a6f97) -- Update framework version for tests to Core 3.1 to comply with LTS (4988a07) -- Move bulk deletes remarks from to (62539f0) - -## [2.2.0] - 2020-04-16 + +- Simplified `FollowupWithFileAsync` to just take a file path. +- Renamed `Default` and Required to `IsDefault` and `IsRequired` in `IApplicationCommandOption`. +- Renamed `DefaultPermission` to `IsDefaultPermission` in `IApplicationCommand`. +- Refactored some summaries +- Renamed `Available` to `IsAvailable` in stickers. +- Removed file extension check. +- Remove null collections in favor for empty collections. + +## [3.1.1] - 9/23/2021 + ### Added -- #1247 Implement Client Status Support (9da11b4) -- #1310 id overload for RemoveReactionAsync (c88b1da) -- #1319 BOOST (faf23de) -- #1326 Added a Rest property to DiscordShardedClient (9fede34) -- #1348 Add Quote Formatting (265da99) -- #1354 Add support for setting X-RateLimit-Precision (9482204) -- #1355 Provide ParameterInfo with error ParseResult (3755a02) -- #1357 add the "Stream" permission. (b00da3d) -- #1358 Add ChannelFollowAdd MessageType (794eba5) -- #1369 Add SelfStream voice state property (9bb08c9) -- #1372 support X-RateLimit-Reset-After (7b9029d) -- #1373 update audit log models (c54867f) -- #1377 Support filtering audit log entries on user, action type, and before entry id (68eb71c) -- #1386 support guild subscription opt-out (0d54207) -- #1387 #1381 Guild PreferredLocale support (a61adb0) -- #1406 CustomStatusGame Activity (79a0ea9) -- #1413 Implemented Message Reference Property (f86c39d) -- #1414 add StartedAt, EndsAt, Elapsed and Remaining to SpotifyGame. (2bba324) -- #1432 Add ability to modify the banner for guilds (d734ce0) -- suppress messages (cd28892) -### Fixed -- #1318 #1314 Don't parse tags within code blocks (c977f2e) -- #1333 Remove null coalescing on ToEmbedBuilder Color (120c0f7) -- #1337 Fixed attempting to access a non-present optional value (4edda5b) -- #1346 CommandExecuted event will fire when a parameter precondition fails like what happens when standard precondition fails. (e8cb031) -- #1371 Fix keys of guild update audit (b0a595b) -- #1375 Use double precision for X-Reset-After, set CultureInfo when parsing numeric types (606dac3) -- #1392 patch todo in NamedTypeReader (0bda8a4) -- #1405 add .NET Standard 2.1 support for Color (7f0c0c9) -- #1412 GetUsersAsync to use MaxUsersPerBatch const as limit instead of MaxMessagesPerBatch. (5439cba) -- #1416 false-positive detection of CustomStatusGame based on Id property (a484651) -- #1418 #1335 Add isMentionable parameter to CreateRoleAsync in non-breaking manner (1c63fd4) -- #1421 (3ff4e3d) -- include MessageFlags and SuppressEmbedParams (d6d4429) - -### Changed -- #1368 Update ISystemMessage interface to allow reactions (07f4d5f) -- #1417 fix #1415 Re-add support for overwrite permissions for news channels (e627f07) -- use millisecond precision by default (bcb3534) +- Added `SocketAutocompleteInteraction` +- Added `IsAutocomplete` to slash command builders -### Misc -- #1290 Split Unit and Integration tests into separate projects (a797be9) -- #1328 Fix #1327 Color.ToString returns wrong value (1e8aa08) -- #1329 Fix invalid cref values in docs (363d1c6) -- #1330 Fix spelling mistake in ExclusiveBulkDelete warning (c864f48) -- #1331 Change token explanation (0484fe8) -- #1349 Fixed a spelling error. (af79ed5) -- #1353 [ci skip] Removed duplicate "any" from the readme (15b2a36) -- #1359 Fixing GatewayEncoding comment (52565ed) -- #1379 September 2019 Documentation Update (fd3810e) -- #1382 Fix .NET Core 3.0 compatibility + Drop NS1.3 (d199d93) -- #1388 fix coercion error with DateTime/Offset (3d39704) -- #1393 Utilize ValueTuples (99d7135) -- #1400 Fix #1394 Misworded doc for command params args (1c6ee72) -- #1401 Fix package publishing in azure pipelines (a08d529) -- #1402 Fix packaging (65223a6) -- #1403 Cache regex instances in MessageHelper (007b011) -- #1424 Fix the Comparer descriptions not linking the type (911523d) -- #1426 Fix incorrect and missing colour values for Color fields (9ede6b9) -- #1470 Added System.Linq reference (adf823c) -- temporary sanity checking in SocketGuild (c870e67) -- build and deploy docs automatically (2981d6b) -- 2.2.0 (4b602b4) -- target the Process env-var scope (3c6b376) -- fix metapackage build (1794f95) -- copy only _site to docs-static (a8cdadc) -- do not exit on failed robocopy (fd204ee) -- add idn debugger (91aec9f) -- rename IsStream to IsStreaming (dcd9cdd) -- feature (40844b9) - -## [2.1.1] - 2019-06-08 -### Fixed -- #994: Remainder parameters now ignore character escaping, as there is no reason to escape characters here (2e95c49) -- #1316: `Emote.Equals` now pays no respect to the Name property, since Discord's API does not care about an emote's name (abf3e90) -- #1317: `Emote.GetHashCode` now pays no respect to the Name property, see above (1b54883) -- #1323: Optionals will no longer claim to be specified when a reaction message was not cached (1cc5d73) -- Log messages sourcing from REST events will no longer be raised twice (c78a679) -- News embeds will be processed as `EmbedType.Unknown`, rather than throwing an error and dropping the message (d287ed1) - -### Changed -- #1311: Members may now be disconnected from voice channels by passing `null` as `GuildUserProperties.Channel` (fc48c66) -- #1313: `IMessage.Tags` now includes the EveryoneRole on @everyone and @here mentions (1f55f01) -- #1320: The maximum value for setting slow-mode has been updated to 6 hours, per the new API limit (4433ca7) +## [3.1.0] - 9/21/2021 + +### Added + +- Added warning for duplicate select menu values. +- Added `DisconnectAsync` and `MoveAsync` to `IGuild` and its children (`RestGuild`/`SocketGuild`). +- Added `CreateStageChannelAsync` to `IGuild` and its children (`RestGuild`/`SocketGuild`). +- Added `ISticker[]` as a parameter to `SendMessageAsync` and `ReplyAsync`. + +### Fixes + +- Fixed ratelimit sorcery and witchcraft. ### Misc -- This library's compatibility with Semantic Versioning has been clarified. Please see the README (4d7de17) -- The depency on System.Interactive.Async has been bumped to `3.2.0` (3e65e03) -## [2.1.0] - 2019-05-18 +- Renamed `SelectMenu` to `SelectMenuComponent`. +- Removed obsolete `AcknowledgeAsync` method from interactions in favor for `DeferAsync`. + +## [3.0.2] - 9/13/2021 + ### Added -- #1236: Bulk deletes (for messages) may now be accessed via the `MessagesBulkDeleted` event (dec353e) -- #1240: OAuth applications utilizing the `guilds.join` scope may now add users to guilds through any client (1356ea9) -- #1255: Message and attachment spoilers may now be set or detected (f3b20b2) -- #1260: DiscordWebhookClient may be created from a Webhook URL (f2113c7) -- #1261: A `GetCategoryChannel` helper may now be used to retrieve category channels directly from socket guilds (e03c527) -- #1263: "user joined the guild" messages are now supported (00d3f5a) -- #1271: AuthorID may now be retrieved from message delete audit log entries (1ae4220) -- #1293: News Channels are now supported 📰 (9084c42) -- `ExclusiveBulkDelete` configuration setting can be used to control bulk delete event behavior (03e6401) - -### Removed -- #1294: The `IGuildUser` overload of `EmbedBuilder.WithAuthor` no longer exists (b52b54d) -### Fixed -- #1256: Fetching audit logs no longer raises null reference exceptions when a webhook has been deleted (049b014) -- #1268: Null reference exceptions on `MESSAGE_CREATE` concerning partial member objects no longer occur (377622b) -- #1278: The token validator now internally pads tokens to the proper length (48b327b) -- #1292: Messages now properly initialize empty collections (b2ebc03) -- The `DiscordSocketRestClient` is now properly initialized (a44c13a) -- Exceptions in event handlers are now always logged (f6e3200) +- Added `Hierarchy` to `RestGuildUser` and `IGuildUser` +- Added github sponsors! +- Added implicit conversion from string to emoji and emote, allowing you to just pass in unicode into any emoji/emote func +- Added `ToBuilder` functions to `ButtonComponent` and `SelectMenu` +- Added `FollowupWithFileAsync` to interactions. -### Changed -- #1305: Token validation will fail when tokens contain whitespace (bb61efa) +### Fixes -### Misc -- #1241: Added documentation samples for Webhooks (655a006) -- #1243: Happy new year 🎉 (0275f7d) -- #1257: Improved clarity in comments in the command samples (2473619) -- #1276: Documentation uses a relative path for the logo asset (b80f0e8) -- #1303: EmbedBuilder documentation now builds in the correct spot (51618e6) -- #1304: Updated documentation (4309550) -- CI for this project is now powered by Azure DevOps (this is not a sponsored message 🚀) (9b2bc18) -- IDisposableAnalyzers should now be a development dependency (8003ac8) - -## [2.0.1] - 2019-01-04 -### Fixed -- #1226: Only escape the closing quotation mark of non-remainder strings (65b8c09) -- Commands with async RunModes will now propagate exceptions up to CommandExecuted (497918e) +- Fixed `auto_archive_duration` within thread models +- Fixed `ModifyGuildCommandPermissionsAsync` not allowing 0 args +- Fixed `MofifyXYZCommand` using abstracts in activators (big no no) +- Fixed specifying null for components within a modify context not removing the components within the message. -### Misc -- #1225: Commands sample no longer hooks the log event twice (552f34c) -- #1227: The logo on the docs index page should scale responsively (d39bf6e) -- #1230: Replaced precondition sample on docs (feed4fd) +## [3.0.1] - 8/25/2021 -## [2.0.0] - 2018-12-28 ### Added -- #747: `CommandService` now has a `CommandExecuted` event (e991715) -- #765: Parameters may have a name specified via `NameAttribute` (9c81ab9) -- #773: Both socket clients inherit from `BaseSocketClient` (9b7afec) -- #785: Primitives now automatically load a NullableTypeReader (cb0ff78) -- #819: Support for Welcome Message channels (30e867a) -- #835: Emoji may now be managed from a bot (b4bf046) -- #843: Webhooks may now be managed from a bot (7b2ddd0) -- #863: An embed may be converted to an `EmbedBuilder` using the `.ToEmbedBuilder()` method (5218e6b) -- #877: Support for reading rich presences (34b4e5a) -- #888: Users may now opt-in to using a proxy (678a723) -- #906: API Analyzers to assist users when writing their bot (f69ef2a) -- #907: Full support for channel categories (030422f) -- #913: Animated emoji may be read and written (a19ff18) -- #915: Unused parameters may be discarded, rather than failing the command (5f46aef) -- #929: Standard EqualityComparers for use in LINQ operations with the library's entities (b5e7548) -- #934: Modules now contain an `OnModuleBuilding` method, which is invoked when the module is built (bb8ebc1) -- #952: Added 'All' permission set for categories (6d58796) -- #957: Ratelimit related objects now include request information (500f5f4) -- #962: Add `GetRecommendedShardCountAsync` (fc5e70c) -- #970: Add Spotify track support to user Activities (64b9cc7) -- #973: Added `GetDefaultAvatarUrl` to user (109f663) -- #978: Embeds can be attached alongside a file upload (e9f9b48) -- #984, #1089: `VoiceServerUpdate` events are now publically accessible (e775853, 48fed06) -- #996: Added `DeleteMessageAsync` to `IMessageChannel` (bc6009e) -- #1005: Added dedicated `TimeSpan` TypeReader which "doesn't suck" (b52af7a) -- #1009: Users can now specify the replacement behavior or default typereaders (6b7c6e9) -- #1020: Users can now specify parameters when creating channels (bf5275e) -- #1030: Added `IsDeprecated`, `IsCustom` properties to `VoiceRegion` (510f474) -- #1037: Added `SocketUser.MutualGuilds`, various extension methods to commands (637d9fc) -- #1043: `Discord.Color` is now compatible with `System.Drawing.Color` (c275e57) -- #1055: Added audit logs (39dffe8) -- #1056: Added `GetBanAsync` (97c8931) -- #1102: Added `GetJumpUrl()` to messages (afc3a9d) -- #1123: Commands can now accept named parameters (419c0a5) -- #1124: Preconditions can now set custom error messages (5677f23) -- #1126: `Color` now has equality (a2d8800) -- #1159: Guild channels can now by synced with their parent category (5ea1fb3) -- #1165: Bring Guild and Message models up to date with the API (d30d122) -- #1166: Added `GetVoiceRegionsAsync` to `IGuild` (00717cf) -- #1183: Added Add Guild Member endpoint for OAuth clients (8ef5f81) -- #1196: Channel position can now be specified when creating a channel (a64ab60) -- #1198: The Socket client can now access its underlying REST client (65afd37) -- #1213: Added `GuildEmote#CreatorId` (92bf836) -- 'html' variant added to the `EmbedType` enum (42c879c) -- Modules can now be nested in non-module classes (4edbd8d) -- Added `BanAsync` to guild members (1905fde) -- Added the permisison bit for priority speaker (c1d7818) -- All result types can use `FromError` (748e92b) -- Added support for reading/writing slow mode (97d17cf) -- Added markdown format for URLs (f005af3) -- Reactions can now be added to messages in bulk (5421df1) +- Added a method in `ComponentBuilder` to create a builder from a message -### Fixed -- #742: `DiscordShardedClient#GetGuildFor` will now direct null guilds to Shard 0 (d5e9d6f) -- #743: Various issues with permissions and inheritance of permissions (f996338) -- #755: `IRole.Mention` will correctly tag the @everyone role (6b5a6e7) -- #768: `CreateGuildAsync` will include the icon stream (865080a) -- #866: Revised permissions constants and behavior (dec7cb2) -- #872: Bulk message deletion should no longer fail for incomplete batch sizes (804d918) -- #923: A null value should properly reset a user's nickname (227f61a) -- #938: The reconnect handler should no longer deadlock during Discord outages (73ac9d7) -- #941: Fix behavior of OverrideTypeReader (170a2e0) -- #945: Fix properties on SocketCategoryChannel (810f6d6) -- #959: Webhooks now use the correct parameter when assigning to the Avatar URL (8876597) -- #966: Correct the implementation of HasFlag and ResolveChannel in permissions (32ebdd5) -- #968: Add missing parameter in WebSocket4Net constructor (8537924) -- #981: Enforce a maximum value when parsing timestamps from Discord (bfaa6fc) -- #993: Null content will no longer null-ref on message sends/edits (55299ff) -- #1003: Fixed ordering of parameters in permissions classes (a06e212) -- #1010: EmbedBuilder no longer produces mutable embeds (2988b38) -- #1012: `Embed.Length` should now yield the correct results (a3ce80c) -- #1017: GetReactionUsersAsync includes query parameters (9b29c00) -- #1022: GetReactionUsersAsync is now correctly paginated (79811d0) -- #1023: Fix/update invite-related behaviors (7022149) -- #1031: Messages with no guild-specific data should no longer be lost (3631886) -- #1036: Fixed cases where `RetryMode.RetryRatelimit` were ignored (c618cb3) -- #1044: Populate the guild in `SocketWebhookUser` (6a7810b) -- #1048: The REST client will now create a full GuildUser object (033d312) -- #1049: Fixed null-ref in `GetShardIdFor` (7cfed7f) -- #1059: Include 'view channel' in voice channel's All permissions set (e764daf) -- #1083: Default type readers will now be properly replaced (4bc06a0) -- #1093: Fixed race condition in audio client authentication (322d46e) -- #1139: Fixed consistency in exceptions (9e9a11d) -- #1151: `GetReactionUsersAsync` now uses the correct pagination constant (c898325) -- #1163: Reaction ratelimits are now placed in the same bucket, treated correctly (5ea1fb3) -- #1186: Webhooks can now send files with embeds correctly (c1d5152) -- #1192: CommandExecuted no longer fires twice for RuntimeResults (10233f3) -- #1195: Channel Create audit log events properly deserialize (dca6c33) -- #1202: The UDP client should no longer be used after disposed (ccb16e4) -- #1203: The Audio client should no longer lock up on disconnect (2c93363) -- #1209: MessageUpdated should no longer pass a null after object (91e0f03) -- Ignore messages with no ID in bulk delete (676be40) -- No longer attempt to load generic types as modules (b1eaa44) -- No longer complain when a `PRESENCES_REPLACE` update is received (beb3d46) -- CommandExecuted will be raised on async exception failures (6260749) -- ExecuteResult now contains the entire exception, not an abridged message (f549da5) -- CommandExecuted will no longer be raised twice for exceptions (aec7105) -- The default WebSocket will now close correctly (ac389f5) - -### Changed -- #731: `IUserMessage#GetReactionUsersAsync` now takes an `IEmote` instead of a `string` (5d7f2fc) -- #744: IAsyncEnumerable has been redesigned (5bbd9bb) -- #777: `IGuild#DefaultChannel` will now resolve the first accessible channel, per changes to Discord (1ffcd4b) -- #781: Attempting to add or remove a member's EveryoneRole will throw (506a6c9) -- #801: `EmbedBuilder` will no longer implicitly convert to `Embed`, you must build manually (94f7dd2) -- #804: Command-related tasks will have the 'async' suffix (14fbe40) -- #812: The WebSocket4Net provider has been bumped to version 0.15, allowing support for .NET Standard apps (e25054b) -- #829: DeleteMessagesAsync moved from IMessageChannel to ITextChannel (e00f17f) -- #853: WebSocket will now use `zlib-stream` compression (759db34) -- #874: The `ReadMessages` permission is moving to `ViewChannel` (edfbd05) -- #877: Refactored Games into Activities (34b4e5a) -- #943: Multiple types of quotation marks can now be parsed (thanks 🍎) (cee71ef) -- #955: The `GameParty` model will now use long values (178ea8d) -- #986: Expose the internal entity TypeReaders (660fec0) -- #992: Throw an exception when trying to modify someone else's message (d50fc3b) -- #998: Commands can specify their own `IgnoreExtraArgs` behavior (6d30100) -- #1033: The `ReadMessages` permission bit is now named `ViewChannel` (5f084ad) -- #1042: Content parameter of `SendMessageAsync` is now optional (0ba8b06) -- #1057: An audio channel's `ConnectAsync` now allows users to handle the voice connection elsewhere, such as in Lavalink (890904f) -- #1094: Overhauled invites, added vanity invite support (ffe994a) -- #1108: Reactions now use the undocumented 1/.25 ratelimit, making them 4x faster (6b21b11) -- #1128: Bot tokens will now be validated for common mishaps before use (2de6cef) -- #1140: Check the invite `maxAge` parameter before making the request (649a779) -- #1164: All command results will now be raised in `CommandExecuted` (10f67a8) -- #1171: Clients have been changed to properly make use of `IDisposable` (7366cd4) -- #1172: Invite related methods were moved from `IGuildChannel` to `INestedChannel` (a3f5e0b) -- #1200: HasPrefix extensions now check for null values first (46e2674) -- `IGuildChannel#Nsfw` moved to `ITextChannel`, now maps to the API property (608bc35) -- Preemptive ratelimits are now logged under verbose, rather than warning. (3c1e766) -- The default InviteAge when creating Invites is now 24 hours (9979a02) -- All parameters to `ReplyAsync` have been made optional (b38dca7) -- The socket client will now use additional fields to fill in member/guild information on messages (8fb2c71) -- The Audio Client now uses Voice WS v3 (9ba38d7) - - -### Removed -- #790: Redundant overloads for `AddField` removed from EmbedBuilder (479361b) -- #925: RPC is no longer being maintained nor packaged (b30af57) -- #958: Remove support for user tokens (2fd4f56) -- User logins (including selfbots) are no longer supported (fc5adca) +### Fixes + +- Fixed default stickers not being set correctly +- Fixed NRE with application command routes +- Fixed KeyNotFoundException on Message Create +- Fixed RestUserMessage not being used for some message types +- Fixed NRE on default stickers +- Fixed Stickers being empty on messages +- Fixed `SocketUnknownSticker.ResolveAsync` throwing NRE + +## [3.0.0] - 8/5/2021 + +### Added + +- Added stage support. +- Added multi embed support for normal messages and refactored methods for interaction with embeds. +- Added check for proper urls in embeds and buttons. +- Added thread support. +- Added `NsfwLevel` property to guilds. +- Added missing message types: GuildDiscoveryDisqualified, GuildDiscoveryRequalified, GuildDiscoveryGracePeriodInitialWarning, GuildDiscoveryGracePeriodFinalWarning, ThreadCreated, ThreadStarterMessage, and GuildInviteReminder. +- Added `NUMBER` application command option type. +- Added missing audit log types: IntegrationCreated,IntegrationUpdated, IntegrationDeleted, StageInstanceCreated, StageInstanceUpdated, StageInstanceDeleted, StickerCreated, StickerUpdated, and StickerUpdated. + +### Fixes + +- Fixed respond async fallback not taking in components. +- Fixed Emoji UnicodeAndNames throwing exception because of duplicit keys. +- Fixed `PermissionTarget` and `ApplicationCommandPermissionTarget` confusion and Invalid Form Body for modifying channel overwrites. ### Misc -- #786: Unit tests for the Color structure (22b969c) -- #828: We now include a contributing guide (cd82a0f) -- #876: We now include a standard editorconfig (5c8c784) -- #963: Docs now include a release version, build instructions (88e6244) -- #964: Fix documentation spelling of 'echoes' (fda19b5) -- #967: Unit test permissions (63e6704) -- #968: Bumped version of WebSocket4Net to 0.15.2 (8537924) -- #972: Include sample bots in the source repository (217ec34) -- #1046: We now support .NET Standard 2.0 (bbbac85) -- #1114: Various performance optimizations (82cfdff) -- #1149: The CI will now test on Ubuntu as well as Windows (674a0fc) -- #1161: The entire documentation has been rewritten, all core entities were docstringed (ff0fea9) -- #1175: Documentation changes in command samples (fb8dbca) -- #1177: Added documentation for sharded bots (00097d3) -- #1219: The project now has a logo! 🎉 (5750c3e) -- This project is now licensed to the Discord.Net contributors (710e182) -- Added templates for pull requests (f2ddf51) -- Fixed documentation layout for the logo (bafdce4) - -## [1.0.2] - 2017-09-09 + +- Made custom id an optional parameter in buttons. +- Refactored the component builders to be more flexible. +- Changed `AcknowledgeAsync` to `DeferAsync` to avoid confusion. +- Updated `MaxOptionsCount` and `MaxChoiceCount` to 25. + +## [2.4.9] - 7/17/20201 + +### Fixes + +- The followup method that takes a single embed didnt return the RestFollupMessage + +## [2.4.8] - 7/17/2021 + +### Added + +- Added `ApplicationCommandPermissionTarget` enum for slash command permissions, slash commands dont use `PermissionTarget` anymore. + ### Fixed -- Guilds utilizing Channel Categories will no longer crash bots on the `READY` event. +- Fixed `AddPermissionOverride` not working +- Fixed invalid form body for responding with no embed + +## [2.4.6] - 7/14/2021 + +### Added + +- Added the ability to send multiple embeds on interaction responses and also fixed a few bits of docs. + +## [2.4.5] - 7/10/2021 + +### Added + +- Added `TimestampTag` +- Added `DeleteAllGlobalCommandsAsync` to Rest client. +- Added `DeleteSlashCommandsAsync` to SocketGuild and RestGuild, this **will** remove all the slash commands in the guild so be careful. + +### Fixes + +- Fixed `GetOriginalResponseAsync` using wrong http method and route. + +# [2.4.4] - 7/7/2021 + +- Added comment and parsing for `Mentionable` application option type. +- Added another `AddOption` method to SlashCommandOptionBuilder. + +### Added + +### Fixes + +- Fixed `GetCommandPermission()` throwing if no permissions are found, it will now return null. +- Fixed SlashCommandBuilder incorrectly limiting SubCommands. +- Fixed incorrect casing of .net types in SocketSlashCommandData. +- Fixed ambiguous method in `SlashCommandBuilder` . +- Fixed `WithAuthor` extension not using default avatars: https://github.com/discord-net/Discord.Net/pull/1890 +- Fixed Slash command routes not throwing a `ApplicationCommandException` +- Fixed duplicate `GetOriginalResponse` method in `SocketSlashCommand` + +## [2.4.3] - 7/6/20201 + +### Added + +- Added `GetSlashCommandsAsync` and `GetSlashCommandAsync` methods to `SocketGuild` and `RestGuild` +- Added `GetGuild` method to `RestGuildCommand` +- Added `GetCommandPermission` and `ModifyCommandPermissions` to `RestGuildCommand` +- Added `BulkOverwriteGlobalCommands` and `BulkOverwriteGuildCommands` to the rest client, this allows you to make a whole bunch of slash commands in one request +- Added `DefaultPermission` to IApplicationCommands. -## [1.0.1] - 2017-07-05 ### Fixed -- #732: Fixed parameter preconditions not being loaded from class-based modules (b6dcc9e) -- #726: Fixed CalculateScore throwing an ArgumentException for missing parameters (7597cf5) -- EmbedBuilder URI validation should no longer throw NullReferenceExceptions in certain edge cases (d89804d) -- Fixed module auto-detection for nested modules (d2afb06) +- Fixed bad parsing on SocketSlashCommand for channel resolved types. + +## [2.4.1] - 7/3/20201 + +### Added + +- Added `SelectMenu` as a component type. +- Added methods to build select menus in the `ComponentBuilder`. +- Added a `Values` property to `SocketMessageComponentData`, this is how you see the selected option on a select menus interaction event. +- Added resolved models to `SocketSlashCommandDataOption`, the `Value` field will now use the _strong_ type of the option type, ex a guild user option will now have the value of a `SocketGuildUser` +- Changed the embed description length to 4096 (https://discord.com/developers/docs/resources/channel#embed-limits) +- Streamlined the interaction data parsing, no more weird null exceptions in the `INTERACTION_CREATED` event +- Changed `SocketInteraction.Data` to the `IDiscordInteractionData` type. +- Merged DNET into interactions, we are now on api v9. This also includes all the bug fixes that dnet did. +- Added the new channel permission flags (https://discord.com/developers/docs/topics/permissions#permissions-bitwise-permission-flags) + +### Fixes + +- Fixed the component builders checks for adding new components. + +## [2.3.7 and older] - 5/29/2021 + +### Added -### Changed -- ShardedCommandContext now inherits from SocketCommandContext (8cd99be) +- Added message component support +- Added Interaction support +- Added slash command support From 516cfaf42f6154d8f56a4db8b6d1ec7e8689487c Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 08:07:51 -0300 Subject: [PATCH 414/494] meta: docs building --- azure-pipelines.yml | 42 +++++++++++++++++++++--------------------- azure/docs.yml | 4 ++-- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 07c8372b9c..3d880af70f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -7,30 +7,29 @@ variables: trigger: tags: include: - - '*' + - "*" branches: include: - - '*' + - "*" jobs: -- job: Linux - pool: - vmImage: 'ubuntu-latest' - steps: - - template: azure/build.yml + - job: Linux + pool: + vmImage: "ubuntu-latest" + steps: + - template: azure/build.yml -- job: Windows_build - pool: - vmImage: 'windows-latest' - condition: ne(variables['Build.SourceBranch'], 'refs/heads/release/3.x') - steps: - - template: azure/build.yml + - job: Windows_build + pool: + vmImage: "windows-latest" + condition: ne(variables['Build.SourceBranch'], 'refs/heads/release/3.x') + steps: + - template: azure/build.yml - -- job: Windows_deploy - pool: - vmImage: 'windows-latest' - condition: | + - job: Windows_deploy + pool: + vmImage: "windows-latest" + condition: | and ( succeeded(), or ( @@ -38,6 +37,7 @@ jobs: eq(variables['buildTag'], True) ) ) - steps: - - template: azure/build.yml - - template: azure/deploy.yml + steps: + - template: azure/build.yml + - template: azure/deploy.yml + - template: azure/docs.yml diff --git a/azure/docs.yml b/azure/docs.yml index 441864ff8f..f010a15e25 100644 --- a/azure/docs.yml +++ b/azure/docs.yml @@ -2,8 +2,8 @@ steps: - task: InstallSSHKey@0 displayName: Install deploy key for docs inputs: - knownHostsEntry: '|1|gFD+Dvd+09xvjlKReWSg3wE7q1A=|WJnD0RZ5H4HX5U0nA4Kt+R5yf+w= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==' - sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN1oXiGqKblqfO+vr3cMLSiV6paD5BT+2RXfeCpVkRWSFCB7dfP2m1osJSBqqoCHvJGfbX1brGa+3fnmBgbqQ9vl1NkAmdjHYz4yfTKAt6KShYKXmPpTWBfbAqO2DUzTfTJ18XxNutK931vbWRtOjAMt7Aohw0FYm541QPr2IHIabTvVTPujVExHnMTB9cyKa8xzMD9W3zRLXJbhwOi0LtpgxX6OC/HpwdWod6TfxKdnkPMmVCOo7GTJITyd1GEFg+eNShBIaAZ557nAr8rm2ybEqYvhqFQI0cYMXbfr934yPoNN5yONE1PxDarr1T3GE3ZCWQw2Rc9CAKxrMTez7h + knownHostsEntry: X2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== + sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZZmluHYxpA1haNn6ipmgUEPZ5LzezUP04jOqVkG/J6e/3Y6YtP2hO+AfTS/6Cena+xpkaKQReJ9piA/tIVDVUbHjRlfej5RcDsoVKu8aK2iKeMAYS5XwUDX9U6o6h+Cg2T0EQjEB9JuvsnmtyN9y2x7cYCna9K8uZiUcTzDhddWmlJhDpMc0fqCZdi09ZMCS78TLoxox/ek2TboGzFgs0TaJX9dJLYz/8FCP5qRxU7L1V2tpVtYCeFDnNawlUW06TGTz84AYckwsSGBVahqPRkU9ANskrAGm4iyo9pTypq+E+5gbGb6IDiUyDGDKntCRZ8zXhSTds72bmKW3wonehnmteeYHiKZ9W5xBUmH1aZIMQd8cUQlNPKCJnAbfM15WRbPYNb8JRsfRzOMtJUPVGb1N17WDCYkc1aJf1xpSOFl4N8xr2sSqxlmSVChFIcTf5HEIx/n+9k7QU03H3Fd9al9erBC2QhmDucKAnXt4CYiFqMec1NDExbpAsbZd83GM= sshKeySecureFile: docs-static_rsa - task: NuGetCommand@2 From 06711c435a8f53885fe5fe6f3a789268ad949cbc Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 08:18:02 -0300 Subject: [PATCH 415/494] Update docs.yml --- azure/docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure/docs.yml b/azure/docs.yml index f010a15e25..9b882da4dc 100644 --- a/azure/docs.yml +++ b/azure/docs.yml @@ -2,8 +2,8 @@ steps: - task: InstallSSHKey@0 displayName: Install deploy key for docs inputs: - knownHostsEntry: X2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== - sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZZmluHYxpA1haNn6ipmgUEPZ5LzezUP04jOqVkG/J6e/3Y6YtP2hO+AfTS/6Cena+xpkaKQReJ9piA/tIVDVUbHjRlfej5RcDsoVKu8aK2iKeMAYS5XwUDX9U6o6h+Cg2T0EQjEB9JuvsnmtyN9y2x7cYCna9K8uZiUcTzDhddWmlJhDpMc0fqCZdi09ZMCS78TLoxox/ek2TboGzFgs0TaJX9dJLYz/8FCP5qRxU7L1V2tpVtYCeFDnNawlUW06TGTz84AYckwsSGBVahqPRkU9ANskrAGm4iyo9pTypq+E+5gbGb6IDiUyDGDKntCRZ8zXhSTds72bmKW3wonehnmteeYHiKZ9W5xBUmH1aZIMQd8cUQlNPKCJnAbfM15WRbPYNb8JRsfRzOMtJUPVGb1N17WDCYkc1aJf1xpSOFl4N8xr2sSqxlmSVChFIcTf5HEIx/n+9k7QU03H3Fd9al9erBC2QhmDucKAnXt4CYiFqMec1NDExbpAsbZd83GM= + knownHostsEntry: X2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== robot@discord-net-labs + sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzSnLkKn1QxQC0E5Hu3YPaAy5aPCHi2CHtgqBLQglj9Wr1MGCXKerNwVJm5HkXt3/mSxn2TjtIXidcGkankZQASMLFp76Ze8brUxEBSNepfmb4+wpjaZH45hujjBHhhq5ihXxrS9NbjhP2KKhwYS0PxWEdD9otOciidQZc8sD05ynZeaiufUzeiKilKXaGiinwrZl/RcJ6Nhxdp4BJ9OuQoX+FhD8wrRpx4CHFO9s6rSoVnm5yZ6CkQrgqfXPBX3nL18uSdF34EBeIt7xgyuoKF2NtRyGI3nCxIvNiqtp0wewMjHC9MPQn4Qd7IX6OlkItRbE6+3zcZdw/mJEW8qzQJukbGmtQ2hfMT0f4CCuSg9zQaRvZ2+5C2J0DHogKJPhcx3KdN0jaGXoeQQVWAnDI4kuHVfeZNQV+WQCTbBurMTqlIOk6bq7mu6lyMNVGDAZ6X8Pm+J/aVzzOR5DIZ+8n8Kkwu6UPGD9TFZ2CF+lDnjcSimk5VKRR4iMAu+5a4IU= robot@discord-net-labs sshKeySecureFile: docs-static_rsa - task: NuGetCommand@2 From aec47dd869608f4a6842293775b7a9b44f07c163 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 08:24:29 -0300 Subject: [PATCH 416/494] Update docs.yml --- azure/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure/docs.yml b/azure/docs.yml index 9b882da4dc..3318a5d2fe 100644 --- a/azure/docs.yml +++ b/azure/docs.yml @@ -2,7 +2,7 @@ steps: - task: InstallSSHKey@0 displayName: Install deploy key for docs inputs: - knownHostsEntry: X2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== robot@discord-net-labs + knownHostsEntry: "|1|gFD+Dvd+09xvjlKReWSg3wE7q1A=|WJnD0RZ5H4HX5U0nA4Kt+R5yf+w= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzSnLkKn1QxQC0E5Hu3YPaAy5aPCHi2CHtgqBLQglj9Wr1MGCXKerNwVJm5HkXt3/mSxn2TjtIXidcGkankZQASMLFp76Ze8brUxEBSNepfmb4+wpjaZH45hujjBHhhq5ihXxrS9NbjhP2KKhwYS0PxWEdD9otOciidQZc8sD05ynZeaiufUzeiKilKXaGiinwrZl/RcJ6Nhxdp4BJ9OuQoX+FhD8wrRpx4CHFO9s6rSoVnm5yZ6CkQrgqfXPBX3nL18uSdF34EBeIt7xgyuoKF2NtRyGI3nCxIvNiqtp0wewMjHC9MPQn4Qd7IX6OlkItRbE6+3zcZdw/mJEW8qzQJukbGmtQ2hfMT0f4CCuSg9zQaRvZ2+5C2J0DHogKJPhcx3KdN0jaGXoeQQVWAnDI4kuHVfeZNQV+WQCTbBurMTqlIOk6bq7mu6lyMNVGDAZ6X8Pm+J/aVzzOR5DIZ+8n8Kkwu6UPGD9TFZ2CF+lDnjcSimk5VKRR4iMAu+5a4IU= robot@discord-net-labs sshKeySecureFile: docs-static_rsa From b8c0085d40453b92d34b56c0ce7178c4f6180f6a Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 08:29:52 -0300 Subject: [PATCH 417/494] Fix docfx version --- azure/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure/docs.yml b/azure/docs.yml index 3318a5d2fe..cb7730aa00 100644 --- a/azure/docs.yml +++ b/azure/docs.yml @@ -10,7 +10,7 @@ steps: displayName: Install DocFx inputs: command: custom - arguments: install docfx.console -ExcludeVersion + arguments: install docfx.console -Version 2.57.0 - script: azure/docs.bat displayName: Build and deploy docs From 81678ea4fe99f1058e51352739dd17a0e4e2de74 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 08:41:56 -0300 Subject: [PATCH 418/494] Update docs.yml --- azure/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure/docs.yml b/azure/docs.yml index cb7730aa00..b13e036fb1 100644 --- a/azure/docs.yml +++ b/azure/docs.yml @@ -10,7 +10,7 @@ steps: displayName: Install DocFx inputs: command: custom - arguments: install docfx.console -Version 2.57.0 + arguments: install docfx.console -ExcludeVersion -Version 2.57.0 - script: azure/docs.bat displayName: Build and deploy docs From ad09833cd2ff687d7f234db33b801482c962aabf Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 08:47:18 -0300 Subject: [PATCH 419/494] Update docs.bat --- azure/docs.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure/docs.bat b/azure/docs.bat index 504e129915..07fb88a46d 100644 --- a/azure/docs.bat +++ b/azure/docs.bat @@ -1,5 +1,5 @@ ECHO clone docs-static -git clone git@github.com:discord-net/docs-static.git || EXIT /B 1 +git clone git@github.com:Discord-Net-Labs/docs.git || EXIT /B 1 ECHO remove old 'latest' ECHO Y | RMDIR /S docs-static\latest || EXIT /B 1 From ec0c3e2edf6f7da38ad82c95142740d9c5e1f5ec Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 09:05:32 -0300 Subject: [PATCH 420/494] Rename docs repo for clone --- azure/docs.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure/docs.bat b/azure/docs.bat index 07fb88a46d..70958ec242 100644 --- a/azure/docs.bat +++ b/azure/docs.bat @@ -1,5 +1,5 @@ ECHO clone docs-static -git clone git@github.com:Discord-Net-Labs/docs.git || EXIT /B 1 +git clone git@github.com:Discord-Net-Labs/docs-static.git || EXIT /B 1 ECHO remove old 'latest' ECHO Y | RMDIR /S docs-static\latest || EXIT /B 1 @@ -9,7 +9,7 @@ docfx.console\tools\docfx.exe docs/docfx.json -o docs-staging || EXIT /B 1 ROBOCOPY docs-staging\_site docs-static\latest /MIR ECHO commit and deploy -git config --global user.name "Discord.Net CI Robot" && git config --global user.email "robot@foxbot.me" +git config --global user.name "Discord.Net Labs CI Robot" && git config --global user.email "robot@discord-net-labs.com" git -C docs-static add -A || EXIT /B 1 git -C docs-static commit -m "[ci deploy] %date% %time%: %Build.BuildId%" || EXIT /B 1 git -C docs-static push --force || EXIT /B 1 From 31118d29e27468044d14dffd720ef0b77a59478e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 10:02:52 -0300 Subject: [PATCH 421/494] update docfx version --- azure/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure/docs.yml b/azure/docs.yml index b13e036fb1..d948165a60 100644 --- a/azure/docs.yml +++ b/azure/docs.yml @@ -10,7 +10,7 @@ steps: displayName: Install DocFx inputs: command: custom - arguments: install docfx.console -ExcludeVersion -Version 2.57.0 + arguments: install docfx.console -ExcludeVersion -Version 2.47.0 - script: azure/docs.bat displayName: Build and deploy docs From 14a6ad9d1e4003352f84570f1cc8cd189f9b16ce Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 10:44:18 -0300 Subject: [PATCH 422/494] Update docs.bat --- azure/docs.bat | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azure/docs.bat b/azure/docs.bat index 70958ec242..187dcdd48f 100644 --- a/azure/docs.bat +++ b/azure/docs.bat @@ -5,6 +5,9 @@ ECHO remove old 'latest' ECHO Y | RMDIR /S docs-static\latest || EXIT /B 1 ECHO build docs + +TYPE D:\a\1\s\src\Discord.Net.Commands\Discord.Net.Commands.csproj || EXIT /B 1 + docfx.console\tools\docfx.exe docs/docfx.json -o docs-staging || EXIT /B 1 ROBOCOPY docs-staging\_site docs-static\latest /MIR From a794c7ab789ec5683f9e65f8c4f3096e0381fff9 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 10:50:18 -0300 Subject: [PATCH 423/494] Update docfx version --- azure/docs.bat | 2 -- azure/docs.yml | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/azure/docs.bat b/azure/docs.bat index 187dcdd48f..e2e860b4c5 100644 --- a/azure/docs.bat +++ b/azure/docs.bat @@ -6,8 +6,6 @@ ECHO Y | RMDIR /S docs-static\latest || EXIT /B 1 ECHO build docs -TYPE D:\a\1\s\src\Discord.Net.Commands\Discord.Net.Commands.csproj || EXIT /B 1 - docfx.console\tools\docfx.exe docs/docfx.json -o docs-staging || EXIT /B 1 ROBOCOPY docs-staging\_site docs-static\latest /MIR diff --git a/azure/docs.yml b/azure/docs.yml index d948165a60..d8f8466eec 100644 --- a/azure/docs.yml +++ b/azure/docs.yml @@ -10,7 +10,7 @@ steps: displayName: Install DocFx inputs: command: custom - arguments: install docfx.console -ExcludeVersion -Version 2.47.0 + arguments: install docfx.console -ExcludeVersion -Version 2.50.0 - script: azure/docs.bat displayName: Build and deploy docs From 785b4b68fb0df8cb933a911282bda02da2dcf72e Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 17 Oct 2021 10:55:25 -0300 Subject: [PATCH 424/494] Remove docs from pipeline --- azure-pipelines.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3d880af70f..5bbe17e4d2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -40,4 +40,3 @@ jobs: steps: - template: azure/build.yml - template: azure/deploy.yml - - template: azure/docs.yml From 15a160e1e587a4cea6e1c3a00b899e2629b91919 Mon Sep 17 00:00:00 2001 From: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> Date: Sun, 17 Oct 2021 16:27:35 +0200 Subject: [PATCH 425/494] FAQ revamped, metadata updated (#241) * FAQ revamped, metadata updated * Update FAQ.md * Update README.md * Docs index improvement --- FAQ.md | 50 ++++++ README.md | 158 ++++++------------ docs/docfx.json | 7 +- docs/faq/basics/basic-operations.md | 123 -------------- docs/faq/basics/client-basics.md | 94 ----------- docs/faq/basics/getting-started.md | 82 --------- docs/faq/basics/images/dev-mode.png | Bin 80742 -> 0 bytes docs/faq/basics/images/mention-escape.png | Bin 19611 -> 0 bytes docs/faq/basics/images/role-copy.png | Bin 16091 -> 0 bytes docs/faq/basics/images/snowflake.png | Bin 73062 -> 0 bytes docs/faq/basics/samples/cast.cs | 15 -- docs/faq/basics/samples/emoji-others.cs | 18 -- docs/faq/basics/samples/emoji-self.cs | 17 -- docs/faq/commands/dependency-injection.md | 54 ------ docs/faq/commands/general.md | 147 ---------------- docs/faq/commands/samples/DI.cs | 28 ---- docs/faq/commands/samples/Remainder.cs | 20 --- docs/faq/commands/samples/missing-dep.cs | 29 ---- .../faq/commands/samples/runmode-cmdattrib.cs | 7 - .../faq/commands/samples/runmode-cmdconfig.cs | 10 -- docs/faq/misc/glossary.md | 82 --------- docs/faq/misc/legacy.md | 29 ---- docs/faq/toc.yml | 18 -- docs/index.md | 24 ++- .../SVG/Combinationmark White Background.svg | 84 ++++------ .../logo/SVG/Combinationmark White Border.svg | 30 ++++ docs/toc.yml | 3 +- 27 files changed, 182 insertions(+), 947 deletions(-) create mode 100644 FAQ.md delete mode 100644 docs/faq/basics/basic-operations.md delete mode 100644 docs/faq/basics/client-basics.md delete mode 100644 docs/faq/basics/getting-started.md delete mode 100644 docs/faq/basics/images/dev-mode.png delete mode 100644 docs/faq/basics/images/mention-escape.png delete mode 100644 docs/faq/basics/images/role-copy.png delete mode 100644 docs/faq/basics/images/snowflake.png delete mode 100644 docs/faq/basics/samples/cast.cs delete mode 100644 docs/faq/basics/samples/emoji-others.cs delete mode 100644 docs/faq/basics/samples/emoji-self.cs delete mode 100644 docs/faq/commands/dependency-injection.md delete mode 100644 docs/faq/commands/general.md delete mode 100644 docs/faq/commands/samples/DI.cs delete mode 100644 docs/faq/commands/samples/Remainder.cs delete mode 100644 docs/faq/commands/samples/missing-dep.cs delete mode 100644 docs/faq/commands/samples/runmode-cmdattrib.cs delete mode 100644 docs/faq/commands/samples/runmode-cmdconfig.cs delete mode 100644 docs/faq/misc/glossary.md delete mode 100644 docs/faq/misc/legacy.md delete mode 100644 docs/faq/toc.yml create mode 100644 docs/marketing/logo/SVG/Combinationmark White Border.svg diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 0000000000..fbae6d5245 --- /dev/null +++ b/FAQ.md @@ -0,0 +1,50 @@ +# Frequently Asked Questions + +#### Whats the difference between DNet and DNet Labs? +DNet Labs is mostly the same as DNet as it just adds additional features. Discord.NET-labs adds several features Discord.NET does not. Examples of this are: Threads, application commands, message components, stage channels, role icons & more small functionality changes. More details [here](https://github.com/discord-net/Discord.Net/pull/1923). + +#### Should I use DNet Labs instead of DNet? or can I use both at the same time? +DNet Labs implements new experimental/unstable features and generally shouldn't be used in production environments. You should only use it if you want to test out new Discord features. As DNet Labs builds on top of DNet, you can not use both at the same time, however DNet Labs should be a pretty straight forward drop-in replacement for DNet. + +#### Why is x not doing y when it should? +Double check you are on the most recent version of Discord .Net labs, if you are and it looks like an issue, report it on [Discord](https://discord.com/invite/dnet-labs) or create an issue on [GitHub](https://github.com/Discord-Net-Labs/Discord.Net-Labs) + +#### When is feature x going to be added? +When someone adds it. If a new Discord feature is currently untouched, submit an issue on [GitHub](https://github.com/Discord-Net-Labs/Discord.Net-Labs) regarding the request. + +#### What's the difference between RespondAsync, DeferAsync and FollowupAsync? +The difference between these 3 functions is in how you handle the command response. [RespondAsync](https://discord-net-labs.com/api/Discord.WebSocket.SocketCommandBase.html#Discord_WebSocket_SocketCommandBase_DeferAsync_System_Boolean_Discord_RequestOptions_) and [DeferAsync](https://discord-net-labs.com/api/Discord.WebSocket.SocketCommandBase.html#Discord_WebSocket_SocketCommandBase_DeferAsync_System_Boolean_Discord_RequestOptions_) let the API know you have succesfully received the command. This is also called 'acknowledging' a command. DeferAsync will not send out a response, RespondAsync will not. [FollowupAsync](https://discord-net-labs.com/api/Discord.WebSocket.SocketCommandBase.html#Discord_WebSocket_SocketCommandBase_DeferAsync_System_Boolean_Discord_RequestOptions_) follows up on succesful acknowledgement. + +> [!WARNING] +> If you have not acknowledged the command FollowupAsync will not work. + +#### What's the difference between global commands and guild commands? (Why isn't my command show up in discord?) +Global commands can be used in every guild your bot is in. However, it can take up to an hour for every guild to have access to the commands. +Guild commands can only be used in specific guilds. They are available within a few minutes. (This is great for testing purposes). + +#### I'm getting a 50001: Missing access error while trying to create a guild command! +Guild commands require you give grant the bot the applications.commands OAuth2 scope in order to register guild commands in that guild. You can register global commands without this OAuth2 scope but will need it to use global commands in that guild. + +#### I'm getting errors when trying to create a slash command (The application command failed to be created, 400 bad request, 50035: Invalid Form Body, etc) +This could be caused by several things but the most common one is an invalid "Name" for the command or any of the options/arguments for the command. Make sure your "Name" is all lowercase and only contains letters or dashes. It should also be less than 32 characters. If you are still having issues after checking this, read up on the other slash commands limits [here](https://discord.com/developers/docs/interactions/slash-commands#a-quick-note-on-limits). + +> [!NOTE] +> In most cases, you can catch an [ApplicationCommandException](https://discord-net-labs.com/api/Discord.Net.ApplicationCommandException.html?q=applicationcommandexception) error from creation. +> This exception will tell you what part of your command is invalid as well as why. + +#### How can I use Victoria with Labs? +You can add a special build of victoria that supports labs by adding the below to your references: +```xml + + https://www.myget.org/F/yucked/api/v3/index.json + +``` + +#### I'm getting a 10062 exception: Unknown Interaction. What can I do? +This exception happens when an app tries to send an initial response to an interaction twice. This can be caused by: +- 2 instances of your app running at once. +- Responding 3+ seconds after the interaction was received. +If you're positive that your app doesn't do this and you are still receiving the exception, please submit an issue. + +#### Why is BannerId/AccentColour always null? +Currently SocketUser/SocketGuildUser does not expose the [BannerId](https://discord-net-labs.com/api/Discord.IUser.html#Discord_IUser_BannerId) nor [AccentColor](https://discord-net-labs.com/api/Discord.IUser.html#Discord_IUser_AccentColor). To get this info, a [RestUser](https://discord-net-labs.com/api/Discord.Rest.RestUser.html?q=RestUser) must be requested. diff --git a/README.md b/README.md index c3343cd384..7891195744 100644 --- a/README.md +++ b/README.md @@ -20,17 +20,60 @@ This repo is a custom fork of Discord.Net that introduces the newest features of discord for testing and experimenting. Nothing here is guaranteed to work but you are more than welcome to submit bugs in the issues tabs -### ♥ Sponsor us! +---- + +- 📄 [Documentation](https://discord-net-labs.com) +- 🔗 [Support](https://discord.com/invite/dnet-labs) +- 📚 [Guides](https://discord-net-labs.com/guides/introduction/intro.html) + +## Sponsor us! ❤ - If this library benefits you consider [sponsoring](https://github.com/sponsors/quinchs) the project as it really helps out. *Only sponsor if you're financially stable!* -## Known issues -Labs will not work with normal package of Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon). The reason is that his package depends on the base discord.net lib. You can instead use the [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs) package which implements some of the features added in Discord.Net-Labs. +## Known compatibility issues + +- Playwo's [InteractivityAddon](https://www.nuget.org/packages/Discord.InteractivityAddon) + * ❌ Reason: The default package depends on Discord.NET instead of labs. + * ✔ Fix: [InteractivityAddon.Labs](https://www.nuget.org/packages/Discord.InteractivityAddon.Labs), which implements some of the features added in Discord.Net-Labs. + +- [Victoria](https://github.com/Yucked/Victoria) + * ❌ Reason: Victoria is built around Discord.NET and is not supported by labs. + * ✔ Fix: A custom build based on Discord.NET-labs: +```xml + + https://www.myget.org/F/yucked/api/v3/index.json + +``` ## How to use Setting up labs in your project is really simple, here's how to do it: 1) Remove Discord.Net from your project 2) Add Discord.Net Labs nuget to your project -3) Enjoy! +3) That's all! + +## Implementations +What Discord.NET-labs has that Discord.NET does not: + +- Major changes + * Added Interaction Support. + * Added Application commands (slash, user, message). + * Added Message Components (buttons, select menus). + * Added Thread Channels. + * Added Stage Channels. + * Revamped Stickers. + +- Minor changes + * Added `TimestampTag`. + * Made `Hierarchy` a `IGuildUser` property. + * Changes embed discription length to 4096. + * Added `Name` property to teams. + * Added url validation to embeds. + * Added `NsfwLevel` to Guilds. + * Added helpers to `Emoji` for parsing. + * Fixed gateway serialization to include nulls. + * Added banner and accent color to guild users. + * Fixed `CurrentUserId` in sharded clients being null. + * Fixed Guild owner and Admin `GuildPermissions.All`. + * Added `RatelimitCallback` to `RequestOptions`. ## Branches @@ -45,110 +88,3 @@ This branch is on pause and does not work currently, There is a pull request ope ### feature/xyz These branches are features for new things, you are more than welcome to clone them and give feedback in the discord server or issues tab. - -## Listening for Interactions - -Interaction docs can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions). They are much more in depth than this readme. - -```cs -// Subscribe to the InteractionCreated event -client.InteractionCreated += Client_InteractionCreated; - -... -private async Task Client_InteractionCreated(SocketInteraction interaction) -{ - // Checking the type of this interaction - switch (interaction) - { - // Slash commands - case SocketSlashCommand commandInteraction: - await MySlashCommandHandler(commandInteraction); - break; - - // Button clicks/selection dropdowns - case SocketMessageComponent componentInteraction: - await MyMessageComponentHandler(componentInteraction); - break; - - // Unused or Unknown/Unsupported - default: - break; - } -} -``` - -### Simple handling slash commands -```cs -private async Task MySlashCommandHandler(SocketSlashCommand interaction) -{ - // Checking command name - if (interaction.Data.Name == "ping") - { - // Respond to interaction with message. - // You can also use "ephemeral" so that only the original user of the interaction sees the message - await interaction.RespondAsync($"Pong!", ephemeral: true); - - // Also you can followup with a additional messages, which also can be "ephemeral" - await interaction.FollowupAsync($"PongPong!", ephemeral: true); - } -} -``` - -### Simple handling button clicks and selection dropdowns -```cs -private async Task MyMessageComponentHandler(SocketMessageComponent interaction) -{ - // Get the custom ID - var customId = interaction.Data.CustomId; - // Get the user - var user = (SocketGuildUser) interaction.User; - // Get the guild - var guild = user.Guild; - - // Respond with the update message. This edits the message which this component resides. - await interaction.UpdateAsync(msgProps => msgProps.Content = $"Clicked {interaction.Data.CustomId}!"); - - // Also you can followup with a additional messages - await interaction.FollowupAsync($"Clicked {interaction.Data.CustomId}!", ephemeral: true); - - // If you are using selection dropdowns, you can get the selected label and values using these - var selectedLabel = ((SelectMenu) interaction.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == interaction.Data.Values.FirstOrDefault())?.Label; - var selectedValue = interaction.Data.Values.First(); -} -``` - -> Note: The example above assumes that the selection dropdown is expecting only 1 returned value, if you configured your dropdown for multiple values, you'll need to modify the code slightly. - -### Sending messages with buttons -Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: -```cs -var builder = new ComponentBuilder().WithButton("Hello!", customId: "id_1", ButtonStyle.Primary, row: 0); -await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); -``` - -### Sending messages with selection dropdowns -Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: -```cs -var builder = new ComponentBuilder() - .WithSelectMenu(new SelectMenuBuilder() - .WithCustomId("id_2") - .WithPlaceholder("This is a placeholder") - .AddOption( - label: "Option", - value: "value1", - description: "Evan pog champ", - emote: Emote.Parse("<:evanpog:810017136814194698>") - ) - .AddOption("Option B", "value2", "Option B is poggers") - ); - -await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); -``` - -> Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. - -## Slash Commands & Context Menu Commands -Slash command & Context command examples and how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions/application-commands). - -## Message Components -Message components (buttons, menus, etc) examples and how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/tree/release/3.x/docs/guides/interactions/message-components) diff --git a/docs/docfx.json b/docs/docfx.json index 424b951bc8..9179035fdf 100644 --- a/docs/docfx.json +++ b/docs/docfx.json @@ -23,7 +23,8 @@ "files": ["toc.yml", "index.md"] }, { - "files": ["faq/**.md", "faq/**/toc.yml"] + "src": "../", + "files": ["FAQ.md"] }, { "files": ["guides/**.md", "guides/**/toc.yml"] @@ -59,8 +60,8 @@ ], "overwrite": "_overwrites/**/**.md", "globalMetadata": { - "_appTitle": "Discord.Net Documentation", - "_appFooter": "Discord.Net (c) 2015-2020 2.2.0", + "_appTitle": "Discord.Net-Labs Documentation", + "_appFooter": "Discord.Net-Labs (c) 2020-2021 3.1.6", "_enableSearch": true, "_appLogoPath": "marketing/logo/SVG/Logomark Purple.svg", "_appFaviconPath": "favicon.ico" diff --git a/docs/faq/basics/basic-operations.md b/docs/faq/basics/basic-operations.md deleted file mode 100644 index 35c71709fc..0000000000 --- a/docs/faq/basics/basic-operations.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -uid: FAQ.Basics.BasicOp -title: Questions about Basic Operations ---- - -# Basic Operations Questions - -In the following section, you will find commonly asked questions and -answers regarding basic usage of the library, as well as -language-specific tips when using this library. - -## How should I safely check a type? - -> [!WARNING] -> Direct casting (e.g., `(Type)type`) is **the least recommended** -> way of casting, as it *can* throw an [InvalidCastException] -> when the object isn't the desired type. -> -> Please refer to [this post] for more details. - -In Discord.Net, the idea of polymorphism is used throughout. You may -need to cast the object as a certain type before you can perform any -action. - -A good and safe casting example: - -[!code-csharp[Casting](samples/cast.cs)] - -[InvalidCastException]: https://docs.microsoft.com/en-us/dotnet/api/system.invalidcastexception -[this post]: https://docs.microsoft.com/en-us/dotnet/csharp/how-to/safely-cast-using-pattern-matching-is-and-as-operators - -## How do I send a message? - -> [!TIP] -> The [GetChannel] method by default returns an [IChannel], allowing -> channel types such as [IVoiceChannel], [ICategoryChannel] -> to be returned; consequently, you cannot send a message -> to channels like those. - -Any implementation of [IMessageChannel] has a [SendMessageAsync] -method. You can get the channel via [GetChannel] under the client. -Remember, when using Discord.Net, polymorphism is a common recurring -theme. This means an object may take in many shapes or form, which -means casting is your friend. You should attempt to cast the channel -as an [IMessageChannel] or any other entity that implements it to be -able to message. - -[SendMessageAsync]: xref:Discord.IMessageChannel.SendMessageAsync* -[GetChannel]: xref:Discord.WebSocket.DiscordSocketClient.GetChannel* - -## How can I tell if a message is from X, Y, Z channel? - -You may check the message channel type. Visit [Glossary] to see the -various types of channels. - -[Glossary]: xref:FAQ.Glossary#message-channels - -## How can I get the guild from a message? - -There are 2 ways to do this. You can do either of the following, - -1. Cast the user as an [IGuildUser] and use its [IGuild] property. -2. Cast the channel as an [IGuildChannel] and use its [IGuild] property. - -## How do I add hyperlink text to an embed? - -Embeds can use standard [markdown] in the description field as well -as in field values. With that in mind, links can be added with -`[text](link)`. - -[markdown]: https://support.discordapp.com/hc/en-us/articles/210298617-Markdown-Text-101-Chat-Formatting-Bold-Italic-Underline- - -## How do I add reactions to a message? - -Any entity that implements [IUserMessage] has an [AddReactionAsync] -method. This method expects an [IEmote] as a parameter. -In Discord.Net, an Emote represents a custom-image emote, while an -Emoji is a Unicode emoji (standard emoji). Both [Emoji] and [Emote] -implement [IEmote] and are valid options. - -# [Adding a reaction to another message](#tab/emoji-others) - -[!code-csharp[Emoji](samples/emoji-others.cs)] - -# [Adding a reaction to a sent message](#tab/emoji-self) - -[!code-csharp[Emoji](samples/emoji-self.cs)] - -*** - -[AddReactionAsync]: xref:Discord.IMessage.AddReactionAsync* - -## What is a "preemptive rate limit?" - -A preemptive rate limit is Discord.Net's way of telling you to slow -down before you get hit by the real rate limit. Hitting a real rate -limit might prevent your entire client from sending any requests for -a period of time. This is calculated based on the HTTP header -returned by a Discord response. - -## Why am I getting so many preemptive rate limits when I try to add more than one reactions? - -This is due to how HTML header works, mistreating -0.25sec/action to 1sec. This causes the lib to throw preemptive rate -limit more frequently than it should for methods such as adding -reactions. - -## Can I opt-out of preemptive rate limits? - -Unfortunately, not at the moment. See [#401](https://github.com/RogueException/Discord.Net/issues/401). - -[IChannel]: xref:Discord.IChannel -[ICategoryChannel]: xref:Discord.ICategoryChannel -[IGuildChannel]: xref:Discord.IGuildChannel -[ITextChannel]: xref:Discord.ITextChannel -[IGuild]: xref:Discord.IGuild -[IVoiceChannel]: xref:Discord.IVoiceChannel -[IGuildUser]: xref:Discord.IGuildUser -[IMessageChannel]: xref:Discord.IMessageChannel -[IUserMessage]: xref:Discord.IUserMessage -[IEmote]: xref:Discord.IEmote -[Emote]: xref:Discord.Emote -[Emoji]: xref:Discord.Emoji \ No newline at end of file diff --git a/docs/faq/basics/client-basics.md b/docs/faq/basics/client-basics.md deleted file mode 100644 index 1176ee3fd6..0000000000 --- a/docs/faq/basics/client-basics.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -uid: FAQ.Basics.ClientBasics -title: Basic Questions about Client ---- - -# Client Basics Questions - -In the following section, you will find commonly asked questions and -answers about common issues that you may face when utilizing the -various clients offered by the library. - -## My client keeps returning 401 upon logging in! - -> [!WARNING] -> Userbot/selfbot (logging in with a user token) is no -> longer supported with this library starting from 2.0, as -> logging in under a user account may result in account termination. -> -> For more information, see issue [827] & [958], as well as the official -> [Discord API Terms of Service]. - -There are few possible reasons why this may occur. - -1. You are not using the appropriate [TokenType]. If you are using a - bot account created from the Discord Developer portal, you should - be using `TokenType.Bot`. -2. You are not using the correct login credentials. Please keep in - mind that a token is **different** from a *client secret*. - -[TokenType]: xref:Discord.TokenType -[827]: https://github.com/RogueException/Discord.Net/issues/827 -[958]: https://github.com/RogueException/Discord.Net/issues/958 -[Discord API Terms of Service]: https://discord.com/developers/docs/legal - -## How do I do X, Y, Z when my bot connects/logs on? Why do I get a `NullReferenceException` upon calling any client methods after connect? - -Your bot should **not** attempt to interact in any way with -guilds/servers until the [Ready] event fires. When the bot -connects, it first has to download guild information from -Discord for you to get access to any server -information; the client is not ready at this point. - -Technically, the [GuildAvailable] event fires once the data for a -particular guild has downloaded; however, it is best to wait for all -guilds to be downloaded. Once all downloads are complete, the [Ready] -event is triggered, then you can proceed to do whatever you like. - -[Ready]: xref:Discord.WebSocket.DiscordSocketClient.Ready -[GuildAvailable]: xref:Discord.WebSocket.BaseSocketClient.GuildAvailable - -## How do I get a message's previous content when that message is edited? - -If you need to do anything with messages (e.g., checking Reactions, -checking the content of edited/deleted messages), you must set the -[MessageCacheSize] in your [DiscordSocketConfig] settings in order to -use the cached message entity. Read more about it [here](xref:Guides.Concepts.Events#cacheable). - -1. Message Cache must be enabled. -2. Hook the MessageUpdated event. This event provides a *before* and - *after* object. -3. Only messages received *after* the bot comes online will be - available in the cache. - -[MessageCacheSize]: xref:Discord.WebSocket.DiscordSocketConfig.MessageCacheSize -[DiscordSocketConfig]: xref:Discord.WebSocket.DiscordSocketConfig -[MessageUpdated]: xref:Discord.WebSocket.BaseSocketClient.MessageUpdated - -## What is a shard/sharded client, and how is it different from the `DiscordSocketClient`? -As your bot grows in popularity, it is recommended that you should section your bot off into separate processes. -The [DiscordShardedClient] is essentially a class that allows you to easily create and manage multiple [DiscordSocketClient] -instances, with each one serving a different amount of guilds. - -There are very few differences from the [DiscordSocketClient] class, and it is very straightforward -to modify your existing code to use a [DiscordShardedClient] when necessary. - -1. You need to specify the total amount of shards, or shard ids, via [DiscordShardedClient]'s constructors. -2. The [Connected], [Disconnected], [Ready], and [LatencyUpdated] events - are replaced with [ShardConnected], [ShardDisconnected], [ShardReady], and [ShardLatencyUpdated]. -3. Every event handler you apply/remove to the [DiscordShardedClient] is applied/removed to each shard. - If you wish to control a specific shard's events, you can access an individual shard through the `Shards` property. - -If you do not wish to use the [DiscordShardedClient] and instead reuse the same [DiscordSocketClient] code and manually shard them, -you can do so by specifying the [ShardId] for the [DiscordSocketConfig] and pass that to the [DiscordSocketClient]'s constructor. - -[DiscordSocketClient]: xref:Discord.WebSocket.DiscordSocketClient -[DiscordShardedClient]: xref:Discord.WebSocket.DiscordShardedClient -[Connected]: xref:Discord.WebSocket.DiscordSocketClient.Connected -[Disconnected]: xref:Discord.WebSocket.DiscordSocketClient.Disconnected -[LatencyUpdated]: xref:Discord.WebSocket.DiscordSocketClient.LatencyUpdated -[ShardConnected]: xref:Discord.WebSocket.DiscordShardedClient.ShardConnected -[ShardDisconnected]: xref:Discord.WebSocket.DiscordShardedClient.ShardDisconnected -[ShardReady]: xref:Discord.WebSocket.DiscordShardedClient.ShardReady -[ShardLatencyUpdated]: xref:Discord.WebSocket.DiscordShardedClient.ShardLatencyUpdated -[ShardId]: xref:Discord.WebSocket.DiscordSocketConfig.ShardId diff --git a/docs/faq/basics/getting-started.md b/docs/faq/basics/getting-started.md deleted file mode 100644 index e254226d06..0000000000 --- a/docs/faq/basics/getting-started.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -uid: FAQ.Basics.GetStarted -title: Beginner Questions / How to Get Started ---- - -# Basic Concepts / Getting Started - -In this following section, you will find commonly asked questions and -answers about how to get started with Discord.Net, as well as basic -introduction to the Discord API ecosystem. - -## How do I add my bot to my server/guild? - -You can do so by using the [permission calculator] provided -by [FiniteReality]. -This tool allows you to set permissions that the bot will be assigned -with, and invite the bot into your guild. With this method, bots will -also be assigned a unique role that a regular user cannot use; this -is what we call a `Managed` role. Because you cannot assign this -role to any other users, it is much safer than creating a single -role which, intentionally or not, can be applied to other users -to escalate their privilege. - -[FiniteReality]: https://github.com/FiniteReality/permissions-calculator -[permission calculator]: https://finitereality.github.io/permissions-calculator - -## What is a token? - -A token is a credential used to log into an account. This information -should be kept **private** and for your eyes only. Anyone with your -token can log into your account. This risk applies to both user -and bot accounts. That also means that you should **never** hardcode -your token or add it into source control, as your identity may be -stolen by scrape bots on the internet that scours through -constantly to obtain a token. - -## What is a client/user/object ID? - -Each user and object on Discord has its own snowflake ID generated -based on various conditions. - -![Snowflake Generation](images/snowflake.png) - -Anyone can see the ID; it is public. It is merely used to -identify an object in the Discord ecosystem. Many things in the -Discord ecosystem require an ID to retrieve or identify the said -object. - -There are 2 common ways to obtain the said ID. - -### [Discord Developer Mode](#tab/dev-mode) - -By enabling the developer mode you can right click on most objects -to obtain their snowflake IDs (please note that this may not apply to -all objects, such as role IDs, or DM channel IDs). - -![Developer Mode](images/dev-mode.png) - -### [Escape Character](#tab/escape-char) - -You can escape an object by using `\` in front the object in the -Discord client. For example, when you do `\@Example#1234` in chat, -it will return the user ID of the aforementioned user. - -![Escaping mentions](images/mention-escape.png) - -*** - -## How do I get the role ID? - -> [!WARNING] -> Right-clicking on the role and copying the ID will **not** work. -> This will only copy the message ID. - -Several common ways to do this: - -1. (Easiest) Right click on the role either in the Server Settings - or in the user's role list. - ![Roles](images/role-copy.png) -2. Make the role mentionable and mention the role, and escape it - using the `\` character in front. -3. Inspect the roles collection within the guild via your debugger. \ No newline at end of file diff --git a/docs/faq/basics/images/dev-mode.png b/docs/faq/basics/images/dev-mode.png deleted file mode 100644 index fd20b95d188751a2f3b4268e7ba7294b71afaf06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80742 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 B0lxqM diff --git a/docs/faq/basics/images/mention-escape.png b/docs/faq/basics/images/mention-escape.png deleted file mode 100644 index 92797806155b8396211d6b0014d4f0e8d2aadfa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19611 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 diff --git a/docs/faq/basics/images/snowflake.png b/docs/faq/basics/images/snowflake.png deleted file mode 100644 index 816a10eee07e156ec4e27ee90a000512b1f12463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73062 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 XrU2O)WYlV=ATMnV1NF+Mj{p7##ChBc diff --git a/docs/faq/basics/samples/cast.cs b/docs/faq/basics/samples/cast.cs deleted file mode 100644 index 73ef5237f8..0000000000 --- a/docs/faq/basics/samples/cast.cs +++ /dev/null @@ -1,15 +0,0 @@ -public async Task MessageReceivedHandler(SocketMessage msg) -{ - // Option 1: - // Using the `as` keyword, which will return `null` if the object isn't the desired type. - var usermsg = msg as SocketUserMessage; - // We bail when the message isn't the desired type. - if (msg == null) return; - - // Option 2: - // Using the `is` keyword to cast (C#7 or above only) - if (msg is SocketUserMessage usermsg) - { - // Do things - } -} \ No newline at end of file diff --git a/docs/faq/basics/samples/emoji-others.cs b/docs/faq/basics/samples/emoji-others.cs deleted file mode 100644 index dd3e6317f8..0000000000 --- a/docs/faq/basics/samples/emoji-others.cs +++ /dev/null @@ -1,18 +0,0 @@ -// bail if the message is not a user one (system messages cannot have reactions) -var usermsg = msg as IUserMessage; -if (usermsg == null) return; - -// standard Unicode emojis -Emoji emoji = new Emoji("👍"); -// or -// Emoji emoji = new Emoji("\uD83D\uDC4D"); - -// custom guild emotes -Emote emote = Emote.Parse("<:dotnet:232902710280716288>"); -// using Emote.TryParse may be safer in regards to errors being thrown; -// please note that the method does not verify if the emote exists, -// it simply creates the Emote object for you. - -// add the reaction to the message -await usermsg.AddReactionAsync(emoji); -await usermsg.AddReactionAsync(emote); \ No newline at end of file diff --git a/docs/faq/basics/samples/emoji-self.cs b/docs/faq/basics/samples/emoji-self.cs deleted file mode 100644 index cd4cff1716..0000000000 --- a/docs/faq/basics/samples/emoji-self.cs +++ /dev/null @@ -1,17 +0,0 @@ -// capture the message you're sending in a variable -var msg = await channel.SendMessageAsync("This will have reactions added."); - -// standard Unicode emojis -Emoji emoji = new Emoji("👍"); -// or -// Emoji emoji = new Emoji("\uD83D\uDC4D"); - -// custom guild emotes -Emote emote = Emote.Parse("<:dotnet:232902710280716288>"); -// using Emote.TryParse may be safer in regards to errors being thrown; -// please note that the method does not verify if the emote exists, -// it simply creates the Emote object for you. - -// add the reaction to the message -await msg.AddReactionAsync(emoji); -await msg.AddReactionAsync(emote); \ No newline at end of file diff --git a/docs/faq/commands/dependency-injection.md b/docs/faq/commands/dependency-injection.md deleted file mode 100644 index 0a5de3e322..0000000000 --- a/docs/faq/commands/dependency-injection.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -uid: FAQ.Commands.DI -title: Questions about Dependency Injection with Commands ---- - -# Dependency-injection-related Questions - -In the following section, you will find common questions and answers -to utilizing dependency injection with @Discord.Commands, as well as -common troubleshooting steps regarding DI. - -## What is a service? Why does my module not hold any data after execution? - -In Discord.Net, modules are created similarly to ASP.NET, meaning -that they have a transient nature; modules are spawned whenever a -request is received, and are killed from memory when the execution -finishes. In other words, you cannot store persistent -data inside a module. Consider using a service if you wish to -workaround this. - -Service is often used to hold data externally so that they persist -throughout execution. Think of it like a chest that holds -whatever you throw at it that won't be affected by anything unless -you want it to. Note that you should also learn Microsoft's -implementation of [Dependency Injection] \([video]) before proceeding, -as well as how it works in [Discord.Net](xref:Guides.Commands.DI#usage-in-modules). - -A brief example of service and dependency injection can be seen below. - -[!code-csharp[DI](samples/DI.cs)] - -[Dependency Injection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection -[video]: https://www.youtube.com/watch?v=QtDTfn8YxXg - -## Why is my `CommandService` complaining about a missing dependency? - -If you encounter an error similar to `Failed to create MyModule, -dependency MyExternalDependency was not found.`, you may have -forgotten to add the external dependency to the dependency container. - -Starting from Discord.Net 2.0, all dependencies required by each -module must be present when the module is loaded into the -[CommandService]. This means when loading the module, you must pass a -valid [IServiceProvider] with the dependency loaded before the module -can be successfully registered. - -For example, if your module, `MyModule`, requests a `DatabaseService` -in its constructor, the `DatabaseService` must be present in the -[IServiceProvider] when registering `MyModule`. - -[!code-csharp[Missing Dependencies](samples/missing-dep.cs)] - -[IServiceProvider]: xref:System.IServiceProvider -[CommandService]: xref:Discord.Commands.CommandService diff --git a/docs/faq/commands/general.md b/docs/faq/commands/general.md deleted file mode 100644 index de6d48dc10..0000000000 --- a/docs/faq/commands/general.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -uid: FAQ.Commands.General -title: General Questions about Commands ---- - -# Command-related Questions - -In the following section, you will find commonly asked questions and -answered regarding general command usage when using @Discord.Commands. - -## How can I restrict some of my commands so only specific users can execute them? - -Based on how you want to implement the restrictions, you can use the -built-in [RequireUserPermission] precondition, which allows you to -restrict the command based on the user's current permissions in the -guild or channel (*e.g., `GuildPermission.Administrator`, -`ChannelPermission.ManageMessages`*). - -If, however, you wish to restrict the commands based on the user's -role, you can either create your custom precondition or use -Joe4evr's [Preconditions Addons] that provides a few custom -preconditions that aren't provided in the stock library. -Its source can also be used as an example for creating your -custom preconditions. - -[RequireUserPermission]: xref:Discord.Commands.RequireUserPermissionAttribute -[Preconditions Addons]: https://github.com/Joe4evr/Discord.Addons/tree/master/src/Discord.Addons.Preconditions - -## Why am I getting an error about `Assembly.GetEntryAssembly`? - -You may be confusing @Discord.Commands.CommandService.AddModulesAsync* -with @Discord.Commands.CommandService.AddModuleAsync*. The former -is used to add modules via the assembly, while the latter is used to -add a single module. - -## What does [Remainder] do in the command signature? - -The [RemainderAttribute] leaves the string unparsed, meaning you -do not have to add quotes around the text for the text to be -recognized as a single object. Please note that if your method has -multiple parameters, the remainder attribute can only be applied to -the last parameter. - -[!code-csharp[Remainder](samples/Remainder.cs)] - -[RemainderAttribute]: xref:Discord.Commands.RemainderAttribute - -## Discord.Net keeps saying that a `MessageReceived` handler is blocking the gateway, what should I do? - -By default, the library warns the user about any long-running event -handler that persists for **more than 3 seconds**. Any event -handlers that are run on the same thread as the gateway task, the task -in charge of keeping the connection alive, may block the processing of -heartbeat, and thus terminating the connection. - -In this case, the library detects that a `MessageReceived` -event handler is blocking the gateway thread. This warning is -typically associated with the command handler as it listens for that -particular event. If the command handler is blocking the thread, then -this **might** mean that you have a long-running command. - -> [!NOTE] -> In rare cases, runtime errors can also cause blockage, usually -> associated with Mono, which is not supported by this library. - -To prevent a long-running command from blocking the gateway -thread, a flag called [RunMode] is explicitly designed to resolve -this issue. - -There are 2 main `RunMode`s. - -1. `RunMode.Sync` -2. `RunMode.Async` - -`Sync` is the default behavior and makes the command to be run on the -same thread as the gateway one. `Async` will spin the task off to a -different thread from the gateway one. - -> [!IMPORTANT] -> While specifying `RunMode.Async` allows the command to be spun off -> to a different thread, keep in mind that by doing so, there will be -> **potentially unwanted consequences**. Before applying this flag, -> please consider whether it is necessary to do so. -> -> Further details regarding `RunMode.Async` can be found below. - -You can set the `RunMode` either by specifying it individually via -the `CommandAttribute` or by setting the global default with -the [DefaultRunMode] flag under `CommandServiceConfig`. - -# [CommandAttribute](#tab/cmdattrib) - -[!code-csharp[Command Attribute](samples/runmode-cmdattrib.cs)] - -# [CommandServiceConfig](#tab/cmdconfig) - -[!code-csharp[Command Service Config](samples/runmode-cmdconfig.cs)] - -*** - -*** - -[RunMode]: xref:Discord.Commands.RunMode -[CommandAttribute]: xref:Discord.Commands.CommandAttribute -[DefaultRunMode]: xref:Discord.Commands.CommandServiceConfig.DefaultRunMode - -## How does `RunMode.Async` work, and why is Discord.Net *not* using it by default? - -`RunMode.Async` works by spawning a new `Task` with an unawaited -[Task.Run], essentially making the task that is used to invoke the -command task to be finished on a different thread. This design means -that [ExecuteAsync] will be forced to return a successful -[ExecuteResult] regardless of the actual execution result. - -The following are the known caveats with `RunMode.Async`, - -1. You can potentially introduce a race condition. -2. Unnecessary overhead caused by the [async state machine]. -3. [ExecuteAsync] will immediately return [ExecuteResult] instead of - other result types (this is particularly important for those who wish - to utilize [RuntimeResult] in 2.0). -4. Exceptions are swallowed in the `ExecuteAsync` result. - -However, there are ways to remedy some of these. - -For #3, in Discord.Net 2.0, the library introduces a new event called -[CommandService.CommandExecuted], which is raised whenever the command is executed. -This event will be raised regardless of -the `RunMode` type and will return the appropriate execution result -and the associated @Discord.Commands.CommandInfo if applicable. - -For #4, exceptions are caught in [CommandService.Log] event under -[LogMessage.Exception] as [CommandException] and in the -[CommandService.CommandExecuted] event under the [IResult] as -[ExecuteResult.Exception]. - -[Task.Run]: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.run -[async state machine]: https://www.red-gate.com/simple-talk/dotnet/net-tools/c-async-what-is-it-and-how-does-it-work/ -[ExecuteAsync]: xref:Discord.Commands.CommandService.ExecuteAsync* -[ExecuteResult]: xref:Discord.Commands.ExecuteResult -[RuntimeResult]: xref:Discord.Commands.RuntimeResult -[CommandService.CommandExecuted]: xref:Discord.Commands.CommandService.CommandExecuted -[CommandService.Log]: xref:Discord.Commands.CommandService.Log -[LogMessage.Exception]: xref:Discord.LogMessage.Exception* -[ExecuteResult.Exception]: xref:Discord.Commands.ExecuteResult.Exception* -[CommandException]: xref:Discord.Commands.CommandException -[IResult]: xref:Discord.Commands.IResult \ No newline at end of file diff --git a/docs/faq/commands/samples/DI.cs b/docs/faq/commands/samples/DI.cs deleted file mode 100644 index ce4454bc28..0000000000 --- a/docs/faq/commands/samples/DI.cs +++ /dev/null @@ -1,28 +0,0 @@ -public class MyService -{ - public string MyCoolString { get; set; } -} -public class Setup -{ - public IServiceProvider BuildProvider() => - new ServiceCollection() - .AddSingleton() - .BuildServiceProvider(); -} -public class MyModule : ModuleBase -{ - // Inject via public settable prop - public MyService MyService { get; set; } - - // ...or via the module's constructor - - // private readonly MyService _myService; - // public MyModule (MyService myService) => _myService = myService; - - [Command("string")] - public Task GetOrSetStringAsync(string input) - { - if (string.IsNullOrEmpty(_myService.MyCoolString)) _myService.MyCoolString = input; - return ReplyAsync(_myService.MyCoolString); - } -} \ No newline at end of file diff --git a/docs/faq/commands/samples/Remainder.cs b/docs/faq/commands/samples/Remainder.cs deleted file mode 100644 index 337fb6e45c..0000000000 --- a/docs/faq/commands/samples/Remainder.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Input: -// !echo Coffee Cake - -// Output: -// Coffee Cake -[Command("echo")] -public Task EchoRemainderAsync([Remainder]string text) => ReplyAsync(text); - -// Output: -// CommandError.BadArgCount -[Command("echo-hassle")] -public Task EchoAsync(string text) => ReplyAsync(text); - -// The message would be seen as having multiple parameters, -// while the method only accepts one. -// Wrapping the message in quotes solves this. -// This way, the system knows the entire message is to be parsed as a -// single String. -// e.g., -// !echo "Coffee Cake" \ No newline at end of file diff --git a/docs/faq/commands/samples/missing-dep.cs b/docs/faq/commands/samples/missing-dep.cs deleted file mode 100644 index d3fb9085bb..0000000000 --- a/docs/faq/commands/samples/missing-dep.cs +++ /dev/null @@ -1,29 +0,0 @@ -public class MyModule : ModuleBase -{ - private readonly DatabaseService _dbService; - public MyModule(DatabaseService dbService) - => _dbService = dbService; -} -public class CommandHandler -{ - private readonly CommandService _commands; - private readonly IServiceProvider _services; - public CommandHandler(DiscordSocketClient client) - { - _services = new ServiceCollection() - .AddService() - .AddService(client) - // We are missing DatabaseService! - .BuildServiceProvider(); - } - public async Task RegisterCommandsAsync() - { - // ... - // The method fails here because DatabaseService is a required - // dependency and cannot be resolved by the dependency - // injection service at runtime since the service is not - // registered in this instance of _services. - await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), _services); - // ... - } -} \ No newline at end of file diff --git a/docs/faq/commands/samples/runmode-cmdattrib.cs b/docs/faq/commands/samples/runmode-cmdattrib.cs deleted file mode 100644 index 253acc4a98..0000000000 --- a/docs/faq/commands/samples/runmode-cmdattrib.cs +++ /dev/null @@ -1,7 +0,0 @@ -[Command("process", RunMode = RunMode.Async)] -public async Task ProcessAsync(string input) -{ - // Does heavy calculation here. - await Task.Delay(TimeSpan.FromMinute(1)); - await ReplyAsync(input); -} \ No newline at end of file diff --git a/docs/faq/commands/samples/runmode-cmdconfig.cs b/docs/faq/commands/samples/runmode-cmdconfig.cs deleted file mode 100644 index 11d9cc295f..0000000000 --- a/docs/faq/commands/samples/runmode-cmdconfig.cs +++ /dev/null @@ -1,10 +0,0 @@ -public class Setup -{ - private readonly CommandService _command; - - public Setup() - { - var config = new CommandServiceConfig{ DefaultRunMode = RunMode.Async }; - _command = new CommandService(config); - } -} \ No newline at end of file diff --git a/docs/faq/misc/glossary.md b/docs/faq/misc/glossary.md deleted file mode 100644 index 4b661f65ca..0000000000 --- a/docs/faq/misc/glossary.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -uid: FAQ.Glossary -title: Common Terminologies / Glossary ---- - -# Glossary - -This is an additional chapter for quick references to various common -types that you may see within Discord.Net. To see more information -regarding each type of object, click on the object to navigate -to our API documentation page where you might find more explanation -about it. - -## Common Types - -* A **Guild** ([IGuild]) is an isolated collection of users and -channels, and are often referred to as "servers". - - Example: [Discord API](https://discord.gg/jkrBmQR) -* A **Channel** ([IChannel]) represents a generic channel. - - Example: #dotnet_discord-net - - See [Channel Types](#channel-types) - -[IGuild]: xref:Discord.IGuild -[IChannel]: xref:Discord.IChannel - -## Channel Types - -### Message Channels -* A **Text Channel** ([ITextChannel]) is a message channel from a -Guild. -* A **DM Channel** ([IDMChannel]) is a message channel from a DM. -* A **Group Channel** ([IGroupChannel]) is a message channel from a -Group. - - This is rarely used due to the bot's inability to join groups. -* A **Private Channel** ([IPrivateChannel]) is a DM or a Group. -* A **Message Channel** ([IMessageChannel]) can be any of the above. - -### Misc Channels -* A **Guild Channel** ([IGuildChannel]) is a guild channel in a guild. - - This can be any channels that may exist in a guild. -* A **Voice Channel** ([IVoiceChannel]) is a voice channel in a guild. -* A **Category Channel** ([ICategoryChannel]) (2.0+) is a category that -holds one or more sub-channels. -* A **Nested Channel** ([INestedChannel]) (2.0+) is a channel that can -exist under a category. - -[INestedChannel]: xref:Discord.INestedChannel -[IGuildChannel]: xref:Discord.IGuildChannel -[IMessageChannel]: xref:Discord.IMessageChannel -[ITextChannel]: xref:Discord.ITextChannel -[IGroupChannel]: xref:Discord.IGroupChannel -[IDMChannel]: xref:Discord.IDMChannel -[IPrivateChannel]: xref:Discord.IPrivateChannel -[IVoiceChannel]: xref:Discord.IVoiceChannel -[ICategoryChannel]: xref:Discord.ICategoryChannel - -## Emoji Types - -* An **Emote** ([Emote]) is a custom emote from a guild. - - Example: `<:dotnet:232902710280716288>` -* An **Emoji** ([Emoji]) is a Unicode emoji. - - Example: `👍` - -[Emote]: xref:Discord.Emote -[Emoji]: xref:Discord.Emoji - -## Activity Types - -* A **Game** ([Game]) refers to a user's game activity. -* A **Rich Presence** ([RichGame]) refers to a user's detailed -gameplay status. - - Visit [Rich Presence Intro] on Discord docs for more info. -* A **Streaming Status** ([StreamingGame]) refers to user's activity -for streaming on services such as Twitch. -* A **Spotify Status** ([SpotifyGame]) (2.0+) refers to a user's -activity for listening to a song on Spotify. - -[Game]: xref:Discord.Game -[RichGame]: xref:Discord.RichGame -[StreamingGame]: xref:Discord.StreamingGame -[SpotifyGame]: xref:Discord.SpotifyGame -[Rich Presence Intro]: https://discord.com/developers/docs/rich-presence/best-practices diff --git a/docs/faq/misc/legacy.md b/docs/faq/misc/legacy.md deleted file mode 100644 index 5931579d38..0000000000 --- a/docs/faq/misc/legacy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -uid: FAQ.Legacy -title: Questions about Legacy Versions ---- - -# Legacy Questions - -This section refers to legacy library-related questions that do not -apply to the latest or recent version of the Discord.Net library. - -## X, Y, Z does not work! It doesn't return a valid value anymore. - -If you are currently using an older version of the stable branch, -please upgrade to the latest pre-release version to ensure maximum -compatibility. Several features may be broken in older -versions and will likely not be fixed in the version branch due to -their breaking nature. - -Visit the repo's [release tag] to see the latest public pre-release. - -[release tag]: https://github.com/RogueException/Discord.Net/releases - -## I came from an earlier version of Discord.Net 1.0, and DependencyMap doesn't seem to exist anymore in the later revision? What happened to it? - -The `DependencyMap` has been replaced with Microsoft's -[DependencyInjection] Abstractions. An example usage can be seen -[here](https://github.com/foxbot/DiscordBotBase/blob/csharp/src/DiscordBot/Program.cs#L36). - -[DependencyInjection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection \ No newline at end of file diff --git a/docs/faq/toc.yml b/docs/faq/toc.yml deleted file mode 100644 index 393e948f69..0000000000 --- a/docs/faq/toc.yml +++ /dev/null @@ -1,18 +0,0 @@ -- name: Basic Concepts - items: - - name: Getting Started - topicUid: FAQ.Basics.GetStarted - - name: Basic Operations - topicUid: FAQ.Basics.BasicOp - - name: Client Basics - topicUid: FAQ.Basics.ClientBasics -- name: Commands - items: - - name: General - topicUid: FAQ.Commands.General - - name: Dependency Injection - topicUid: FAQ.Commands.DI -- name: Glossary - topicUid: FAQ.Glossary -- name: Legacy or Upgrade - topicUid: FAQ.Legacy diff --git a/docs/index.md b/docs/index.md index 9a617344a8..063ec9e16f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,9 +19,29 @@ Discord.Net Labs is an experimental fork of Discord.Net that implements the newe ## Where to begin? -If this is your first time using Discord.Net, you should refer to the -[Intro](xref:Guides.Introduction) for tutorials. +If you are new to Discord.NET in general, you should refer their +[Documentation](https://docs.stillu.cc/) for guides & examples. + +Is this your first time using Labs, but you are already familiar with Discord.NET? +Refer to our [Guides](xref:Guides.Introduction) + +### Slashcommands: + +Examples on how slashcommands are created, handled & responded to is found +[Here](xref:Guides.SlashCommands.Intro) + +### User & Message commands: + +Creating User & Message commands is found +[Here](xref:Guides.ContextCommands.Creating), +interacting with them is covered +[Here](xref:Guides.ContextCommands.Reveiving). + +### Message components + +Handling & creating message components such as buttons & dropdown menu's is found [Here](xref:Guides.MessageComponents.GettingStarted) More experienced users might want to refer to the [API Documentation](xref:API.Docs) for a breakdown of the individual objects in the library. + diff --git a/docs/marketing/logo/SVG/Combinationmark White Background.svg b/docs/marketing/logo/SVG/Combinationmark White Background.svg index 5f59df1a57..249bba54ce 100644 --- a/docs/marketing/logo/SVG/Combinationmark White Background.svg +++ b/docs/marketing/logo/SVG/Combinationmark White Background.svg @@ -1,58 +1,30 @@ - - - \ No newline at end of file diff --git a/docs/marketing/logo/SVG/Combinationmark White Border.svg b/docs/marketing/logo/SVG/Combinationmark White Border.svg new file mode 100644 index 0000000000..b9a259a388 --- /dev/null +++ b/docs/marketing/logo/SVG/Combinationmark White Border.svg @@ -0,0 +1,30 @@ + + + + Combinationmark White + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/toc.yml b/docs/toc.yml index bea010c5a3..a1251a7286 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -2,8 +2,7 @@ href: guides/ topicUid: Guides.Introduction - name: FAQ - href: faq/ - topicUid: FAQ.Basics.GetStarted + topicHref: ../FAQ.md - name: API Documentation href: api/ topicUid: API.Docs From 830bc3dbf120909bc76bc57a67052ba78f0bb231 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 20 Oct 2021 05:35:58 -0300 Subject: [PATCH 426/494] Fix InvalidOperationException in modify channel --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index f88ad66990..48fafd090e 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -373,7 +373,9 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyG Preconditions.NotNull(args, nameof(args)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); - Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); + + if(args.Name.IsSpecified) + Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); options = RequestOptions.CreateOrClone(options); From 796d94dcf813261736a97f767382771b3cc652e8 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 20 Oct 2021 06:06:00 -0300 Subject: [PATCH 427/494] feature: guild avatars, closes #238 --- src/Discord.Net.Core/CDN.cs | 8 +++++++ .../Entities/Users/IGuildUser.cs | 21 +++++++++++++++++++ .../API/Common/GuildMember.cs | 2 ++ .../Entities/Users/RestGuildUser.cs | 7 +++++++ .../Entities/Users/RestWebhookUser.cs | 4 ++++ .../Entities/Users/SocketGuildUser.cs | 7 ++++++- .../Entities/Users/SocketThreadUser.cs | 5 +++++ .../Entities/Users/SocketWebhookUser.cs | 4 ++++ 8 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index b170336dc1..f46a0697fe 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -47,6 +47,14 @@ public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}"; } + public static string GetGuildUserAvatarUrl(ulong userId, ulong guildId, string avatarId, ushort size, ImageFormat format) + { + if (avatarId == null) + return null; + string extension = FormatToExtension(format, avatarId); + return $"{DiscordConfig.CDNUrl}guilds/{guildId}/users/{userId}/avatars/{avatarId}.{extension}?size={size}"; + } + /// /// Returns a user banner URL. /// diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs index 58a797c5fc..947ff8521c 100644 --- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs @@ -25,6 +25,13 @@ public interface IGuildUser : IUser, IVoiceState /// string Nickname { get; } /// + /// Gets the guild specific avatar for this users. + /// + /// + /// The users guild avatar hash if they have one; otherwise . + /// + string GuildAvatarId { get; } + /// /// Gets the guild-level permissions for this user. /// /// @@ -96,6 +103,20 @@ public interface IGuildUser : IUser, IVoiceState /// ChannelPermissions GetPermissions(IGuildChannel channel); + /// + /// Gets the guild avatar URL for this user. + /// + /// + /// This property retrieves a URL for this guild user's guild specific avatar. In event that the user does not have a valid guild avatar + /// (i.e. their avatar identifier is not set), this method will return null. + /// + /// The format to return. + /// The size of the image to return in. This can be any power of two between 16 and 2048. + /// + /// + /// A string representing the user's avatar URL; null if the user does not have an avatar in place. + /// + string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128); /// /// Kicks this user from this guild. /// diff --git a/src/Discord.Net.Rest/API/Common/GuildMember.cs b/src/Discord.Net.Rest/API/Common/GuildMember.cs index 53f4908bff..9b888e86ab 100644 --- a/src/Discord.Net.Rest/API/Common/GuildMember.cs +++ b/src/Discord.Net.Rest/API/Common/GuildMember.cs @@ -9,6 +9,8 @@ internal class GuildMember public User User { get; set; } [JsonProperty("nick")] public Optional Nick { get; set; } + [JsonProperty("avatar")] + public Optional Avatar { get; set; } [JsonProperty("roles")] public Optional Roles { get; set; } [JsonProperty("joined_at")] diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index 556e5e1249..2e184d32e7 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -21,6 +21,8 @@ public class RestGuildUser : RestUser, IGuildUser /// public string Nickname { get; private set; } + /// + public string GuildAvatarId { get; private set; } internal IGuild Guild { get; private set; } /// public bool IsDeafened { get; private set; } @@ -80,6 +82,8 @@ internal void Update(Model model) _joinedAtTicks = model.JoinedAt.Value.UtcTicks; if (model.Nick.IsSpecified) Nickname = model.Nick.Value; + if (model.Avatar.IsSpecified) + GuildAvatarId = model.Avatar.Value; if (model.Deaf.IsSpecified) IsDeafened = model.Deaf.Value; if (model.Mute.IsSpecified) @@ -156,6 +160,9 @@ public ChannelPermissions GetPermissions(IGuildChannel channel) var guildPerms = GuildPermissions; return new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, guildPerms.RawValue)); } + + public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) + => CDN.GetGuildUserAvatarUrl(Id, GuildId, GuildAvatarId, size, format); #endregion #region IGuildUser diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs index 561cd92eea..2cd19da410 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs @@ -54,6 +54,10 @@ IGuild IGuildUser.Guild /// string IGuildUser.Nickname => null; /// + string IGuildUser.GuildAvatarId => null; + /// + string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null; + /// bool? IGuildUser.IsPending => null; /// int IGuildUser.Hierarchy => 0; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 8dd48891b2..314471b17f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -30,7 +30,8 @@ public class SocketGuildUser : SocketUser, IGuildUser public SocketGuild Guild { get; } /// public string Nickname { get; private set; } - + /// + public string GuildAvatarId { get; private set; } /// public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } } /// @@ -154,6 +155,8 @@ internal void Update(ClientState state, MemberModel model) _joinedAtTicks = model.JoinedAt.Value.UtcTicks; if (model.Nick.IsSpecified) Nickname = model.Nick.Value; + if (model.Avatar.IsSpecified) + GuildAvatarId = model.Avatar.Value; if (model.Roles.IsSpecified) UpdateRoles(model.Roles.Value); if (model.PremiumSince.IsSpecified) @@ -218,6 +221,8 @@ public Task RemoveRolesAsync(IEnumerable roles, RequestOptions options = /// public ChannelPermissions GetPermissions(IGuildChannel channel) => new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, GuildPermissions.RawValue)); + public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) + => CDN.GetGuildUserAvatarUrl(Id, Guild.Id, GuildAvatarId, size, format); private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Guild)"; internal new SocketGuildUser Clone() => MemberwiseClone() as SocketGuildUser; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index c91921379b..42fb807a1f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -52,6 +52,9 @@ public override string AvatarId get => GuildUser.AvatarId; internal set => GuildUser.AvatarId = value; } + /// + public string GuildAvatarId + => GuildUser.GuildAvatarId; /// public override string BannerId @@ -205,6 +208,8 @@ internal void Update(Model model) /// IReadOnlyCollection IGuildUser.RoleIds => GuildUser.Roles.Select(x => x.Id).ToImmutableArray(); + string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => GuildUser.GetGuildAvatarUrl(format, size); + internal override SocketGlobalUser GlobalUser => GuildUser.GlobalUser; internal override SocketPresence Presence { get => GuildUser.Presence; set => GuildUser.Presence = value; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index d68414ebb1..7cc7d5a444 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -81,6 +81,10 @@ internal static SocketWebhookUser Create(SocketGuild guild, ClientState state, M /// string IGuildUser.Nickname => null; /// + string IGuildUser.GuildAvatarId => null; + /// + string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null; + /// DateTimeOffset? IGuildUser.PremiumSince => null; /// bool? IGuildUser.IsPending => null; From 6cc4e65ae4d413c06e484a20401d1472e4bec861 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 20 Oct 2021 06:17:23 -0300 Subject: [PATCH 428/494] feature: modify role icons --- src/Discord.Net.Core/Entities/Roles/RoleProperties.cs | 5 +++++ src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs | 2 ++ src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs b/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs index a58112b289..93cda8d5b5 100644 --- a/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs +++ b/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs @@ -50,6 +50,11 @@ public class RoleProperties /// This value may not be set if the role is an @everyone role. /// public Optional Hoist { get; set; } + + /// + /// Gets or sets the icon of the role. + /// + public Optional Icon { get; set; } /// /// Gets or sets whether or not this role can be mentioned. /// diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs index ce8c86fbf5..fbb9c3e482 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs @@ -13,6 +13,8 @@ internal class ModifyGuildRoleParams public Optional Color { get; set; } [JsonProperty("hoist")] public Optional Hoist { get; set; } + [JsonProperty("icon")] + public Optional Icon { get; set; } [JsonProperty("mentionable")] public Optional Mentionable { get; set; } } diff --git a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs index 8d525d4c3f..1211ec40b9 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs @@ -24,7 +24,8 @@ public static async Task ModifyAsync(IRole role, BaseDiscordClient client Hoist = args.Hoist, Mentionable = args.Mentionable, Name = args.Name, - Permissions = args.Permissions.IsSpecified ? args.Permissions.Value.RawValue.ToString() : Optional.Create() + Permissions = args.Permissions.IsSpecified ? args.Permissions.Value.RawValue.ToString() : Optional.Create(), + Icon = args.Icon.IsSpecified ? args.Icon.Value.ToModel() : Optional.Unspecified }; var model = await client.ApiClient.ModifyGuildRoleAsync(role.Guild.Id, role.Id, apiArgs, options).ConfigureAwait(false); From c9cba022b11b4120ae4be24f1da557861e494bee Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 20 Oct 2021 06:30:45 -0300 Subject: [PATCH 429/494] meta: changelog --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f08ce69e7..b83967caaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ # Changelog +## [3.1.7] - 10/20/2021 +### Added +- Added `Icon` property when modifying roles. +- Added `GuildAvatar` and `GetGuildAvatarUrl` to `IGuildUser`. + +### Fixed +- Fixed `InvalidOperationException` in modify guild channel. + +### Misc +- Revert received at time, confirmed by discord staff to be accurate ## [3.1.4 - 3.1.6] - 10/12/2021 @@ -169,7 +179,7 @@ - Fixed `GetOriginalResponseAsync` using wrong http method and route. -# [2.4.4] - 7/7/2021 +## [2.4.4] - 7/7/2021 - Added comment and parsing for `Mentionable` application option type. - Added another `AddOption` method to SlashCommandOptionBuilder. From 7e27a638bfdd0f2fd34c5220c9cb8ff3c7ea9ad2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 20 Oct 2021 06:35:33 -0300 Subject: [PATCH 430/494] meta: bump version --- Discord.Net.targets | 2 +- src/Discord.Net/Discord.Net.nuspec | 42 +++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Discord.Net.targets b/Discord.Net.targets index 7940a7eb2c..b60d61229e 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,6 +1,6 @@ - 3.1.6 + 3.1.7 latest Discord.Net Contributors discord;discordapp diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index d791ee23f0..4597d5b444 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.6$suffix$ + 3.1.7$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,32 +14,32 @@ https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From 89ba558ed6b41d23309759d7bf9ecd29f581be9c Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Wed, 20 Oct 2021 06:44:03 -0300 Subject: [PATCH 431/494] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7891195744..983b615862 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ MyGet - Build Status + Build Status Discord From 8f9eb072065101da9bbe07dd176e7f24e00e1c00 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 21 Oct 2021 04:20:05 -0300 Subject: [PATCH 432/494] Fix non value type options not being included in autocomplete --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 2 +- .../Slash Commands/SocketAutocompleteInteractionData.cs | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 264151e947..e118fa89d8 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -74,7 +74,7 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient internal WebSocketProvider WebSocketProvider { get; private set; } internal bool AlwaysDownloadUsers { get; private set; } internal int? HandlerTimeout { get; private set; } - internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; + internal new DiscordSocketApiClient ApiClient => base.ApiClient; /// public override IReadOnlyCollection Guilds => State.Guilds; /// diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index d0c44bab16..44aebf22de 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -60,14 +60,12 @@ private List GetOptions(API.AutocompleteInteractionDataOptio { var options = new List(); + options.Add(new AutocompleteOption(model.Type, model.Name, model.Value.GetValueOrDefault(null), model.Focused.GetValueOrDefault(false))); + if (model.Options.IsSpecified) { options.AddRange(model.Options.Value.SelectMany(GetOptions)); } - else if(model.Focused.IsSpecified) - { - options.Add(new AutocompleteOption(model.Type, model.Name, model.Value.GetValueOrDefault(null), model.Focused.Value)); - } return options; } From a20118a4ca6bc5402e6ac2210b4049a3b8eeec6a Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 22 Oct 2021 20:27:28 -0700 Subject: [PATCH 433/494] Add new activity flags (#254) * Add new activity flags * Add missing commas --- .../Entities/Activities/ActivityProperties.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs b/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs index a7d13235fa..587b21f03f 100644 --- a/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs +++ b/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs @@ -33,6 +33,18 @@ public enum ActivityProperties /// /// Indicates that a user can play this song. /// - Play = 0b100000 + Play = 0b100000, + /// + /// Indicates that a user is playing an activity in a voice channel with friends. + /// + PARTY_PRIVACY_FRIENDS = 0b1000000, + /// + /// Indicates that a user is playing an activity in a voice channel. + /// + PARTY_PRIVACY_VOICE_CHANNEL = 0b10000000, + /// + /// Indicates that a user is playing an activity in a voice channel. + /// + EMBEDDED = 0b10000000 } } From dd3214d279ce86d13597cdbf17b36b156c9f2ea7 Mon Sep 17 00:00:00 2001 From: Will Date: Fri, 22 Oct 2021 23:32:47 -0400 Subject: [PATCH 434/494] Added support for GUILD_JOIN_REQUEST_DELETE event (#253) Fixes #247 --- .../API/Gateway/GuildJoinRequestDeleteEvent.cs | 12 ++++++++++++ src/Discord.Net.WebSocket/BaseSocketClient.Events.cs | 7 +++++++ src/Discord.Net.WebSocket/DiscordShardedClient.cs | 1 + src/Discord.Net.WebSocket/DiscordSocketClient.cs | 8 ++++++++ 4 files changed, 28 insertions(+) create mode 100644 src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs new file mode 100644 index 0000000000..cb6fc5f40c --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace Discord.API.Gateway +{ + internal class GuildJoinRequestDeleteEvent + { + [JsonProperty("user_id")] + public ulong UserId { get; set; } + [JsonProperty("guild_id")] + public ulong GuildId { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index b7bcfdf2e4..1c314bd485 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -335,6 +335,13 @@ public event Func GuildUpdated remove { _guildUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _guildUpdatedEvent = new AsyncEvent>(); + /// Fired when a user leaves without agreeing to the member screening + public event Func GuildJoinRequestDeleted + { + add { _guildJoinRequestDeletedEvent.Add(value); } + remove { _guildJoinRequestDeletedEvent.Remove(value); } + } + internal readonly AsyncEvent> _guildJoinRequestDeletedEvent = new AsyncEvent>(); #endregion #region Users diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 613864fdc8..4e2b6f324b 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -485,6 +485,7 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.GuildStickerCreated += (sticker) => _guildStickerCreated.InvokeAsync(sticker); client.GuildStickerDeleted += (sticker) => _guildStickerDeleted.InvokeAsync(sticker); client.GuildStickerUpdated += (before, after) => _guildStickerUpdated.InvokeAsync(before, after); + client.GuildJoinRequestDeleted += (userId, guildId) => _guildJoinRequestDeletedEvent.InvokeAsync(userId, guildId); } #endregion diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index e118fa89d8..d2edd336a1 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1004,6 +1004,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + case "GUILD_JOIN_REQUEST_DELETE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_JOIN_REQUEST_DELETE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + await TimedInvokeAsync(_guildJoinRequestDeletedEvent, nameof(GuildJoinRequestDeleted), data.UserId, data.GuildId).ConfigureAwait(false); + } + break; #endregion #region Channels From 55794d5190ad5a9cc092536323d8e11462737711 Mon Sep 17 00:00:00 2001 From: KeylAmi Date: Fri, 22 Oct 2021 23:33:39 -0400 Subject: [PATCH 435/494] Adding BotHTTPInteraction user flag (#252) --- src/Discord.Net.Core/Entities/Users/UserProperties.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Users/UserProperties.cs b/src/Discord.Net.Core/Entities/Users/UserProperties.cs index 68232b2547..4cf4162a9d 100644 --- a/src/Discord.Net.Core/Entities/Users/UserProperties.cs +++ b/src/Discord.Net.Core/Entities/Users/UserProperties.cs @@ -61,9 +61,13 @@ public enum UserProperties /// Flag given to users that developed bots and early verified their accounts. /// EarlyVerifiedBotDeveloper = 1 << 17, - /// + /// /// Flag given to users that are discord certified moderators who has give discord's exam. /// DiscordCertifiedModerator = 1 << 18, + /// + /// Flag given to bots that use only outgoing webhooks, exclusively. + /// + BotHTTPInteractions = 1 << 19, } } From 501ff9d0f97d8cc4161fc3bbe7603301e3665f61 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Sat, 23 Oct 2021 10:48:18 -0400 Subject: [PATCH 436/494] animated guild banner support (#255) --- src/Discord.Net.Core/CDN.cs | 10 ++++++---- src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs | 2 +- .../Entities/Guilds/SocketGuild.cs | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index f46a0697fe..d6535a4f11 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -139,15 +139,17 @@ public static string GetChannelIconUrl(ulong channelId, string iconId) /// /// The guild snowflake identifier. /// The banner image identifier. + /// The format to return. /// The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048 inclusive. /// /// A URL pointing to the guild's banner image. /// - public static string GetGuildBannerUrl(ulong guildId, string bannerId, ushort? size = null) + public static string GetGuildBannerUrl(ulong guildId, string bannerId, ImageFormat format, ushort? size = null) { - if (!string.IsNullOrEmpty(bannerId)) - return $"{DiscordConfig.CDNUrl}banners/{guildId}/{bannerId}.jpg" + (size.HasValue ? $"?size={size}" : string.Empty); - return null; + if (string.IsNullOrEmpty(bannerId)) + return null; + string extension = FormatToExtension(format, bannerId); + return $"{DiscordConfig.CDNUrl}banners/{guildId}/{bannerId}.{extension}" + (size.HasValue ? $"?size={size}" : string.Empty); } /// /// Returns an emoji URL. diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 8b0659baf9..d90ba9adaf 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -102,7 +102,7 @@ public class RestGuild : RestEntity, IGuild, IUpdateable /// public string DiscoverySplashUrl => CDN.GetGuildDiscoverySplashUrl(Id, DiscoverySplashId); /// - public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId); + public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId, ImageFormat.Auto); /// /// Gets the built-in role containing all users in this guild. diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 5421718cbb..2f3ac4d904 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -138,7 +138,7 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable /// public string DiscoverySplashUrl => CDN.GetGuildDiscoverySplashUrl(Id, DiscoverySplashId); /// - public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId); + public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId, ImageFormat.Auto); /// Indicates whether the client has all the members downloaded to the local guild cache. public bool HasAllMembers => MemberCount <= DownloadedMemberCount;// _downloaderPromise.Task.IsCompleted; /// Indicates whether the guild cache is synced to this guild. From 13938686ccd11c09081c1fcfe2e02b4c74038de9 Mon Sep 17 00:00:00 2001 From: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> Date: Sat, 23 Oct 2021 17:33:07 +0200 Subject: [PATCH 437/494] Docs work (WIP) (#242) * Main page work * Metadata logo dir * More main page edits * Naming change * Dnet guide entries pruned --- docs/docfx.json | 4 +-- docs/guides/introduction/intro.md | 9 ++---- docs/guides/toc.yml | 43 +------------------------- docs/index.md | 50 +++++++++++++++++++++---------- 4 files changed, 41 insertions(+), 65 deletions(-) diff --git a/docs/docfx.json b/docs/docfx.json index 9179035fdf..514b2a499a 100644 --- a/docs/docfx.json +++ b/docs/docfx.json @@ -61,9 +61,9 @@ "overwrite": "_overwrites/**/**.md", "globalMetadata": { "_appTitle": "Discord.Net-Labs Documentation", - "_appFooter": "Discord.Net-Labs (c) 2020-2021 3.1.6", + "_appFooter": "Discord.Net-Labs (c) 2020-2021 3.1.7", "_enableSearch": true, - "_appLogoPath": "marketing/logo/SVG/Logomark Purple.svg", + "_appLogoPath": "marketing/logo/PackageLogo.png", "_appFaviconPath": "favicon.ico" }, "xrefService": ["https://xref.docs.microsoft.com/query?uid={uid}"] diff --git a/docs/guides/introduction/intro.md b/docs/guides/introduction/intro.md index 0a4ca26e9d..1956fdae7b 100644 --- a/docs/guides/introduction/intro.md +++ b/docs/guides/introduction/intro.md @@ -23,7 +23,7 @@ in [our GitHub repository]. > Please note that you should *not* try to blindly copy paste > the code. The examples are meant to be a template or a guide. -[our GitHub repository]: https://github.com/RogueException/Discord.Net/tree/dev/samples +[our GitHub repository]: https://github.com/Discord-Net-Labs/Discord.Net-Labs [Task-based Asynchronous Pattern]: https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap [polymorphism]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/polymorphism [interface]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/ @@ -44,8 +44,5 @@ resources to get you started. ## Still have questions? -Please visit us at `#dotnet_discord-net` on the [Discord API] server. -Describe the problem in details to us, what you've done, and, -if any, the problematic code uploaded onto [Hastebin](https://hastebin.com). - -[Discord API]: https://discord.gg/jkrBmQR \ No newline at end of file +Please visit us at the [Labs Discord](https://discord.gg/dnet-labs) server. +Describe the problem in details to us, what you've tried and what you need help with. \ No newline at end of file diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index df2eb025a2..603258c335 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -1,40 +1,5 @@ - name: Introduction topicUid: Guides.Introduction -- name: Getting Started - items: - - name: Installation - topicUid: Guides.GettingStarted.Installation - items: - - name: Nightly Builds - topicUid: Guides.GettingStarted.Installation.Nightlies - - name: Your First Bot - topicUid: Guides.GettingStarted.FirstBot - - name: Terminology - topicUid: Guides.GettingStarted.Terminology -- name: Basic Concepts - items: - - name: Logging Data - topicUid: Guides.Concepts.Logging - - name: Working with Events - topicUid: Guides.Concepts.Events - - name: Managing Connections - topicUid: Guides.Concepts.ManageConnections - - name: Entities - topicUid: Guides.Concepts.Entities -- name: Working with Commands - items: - - name: Introduction - topicUid: Guides.Commands.Intro - - name: TypeReaders - topicUid: Guides.Commands.TypeReaders - - name: Named Arguments - topicUid: Guides.Commands.NamedArguments - - name: Preconditions - topicUid: Guides.Commands.Preconditions - - name: Dependency Injection - topicUid: Guides.Commands.DI - - name: Post-execution Handling - topicUid: Guides.Commands.PostExecution - name: Working with Slash commands items: - name: Introduction @@ -51,7 +16,7 @@ topicUid: Guides.SlashCommands.SubCommand - name: Slash command choices topicUid: Guides.SlashCommands.Choices - - name: Slash ommands Bulk Overwrites + - name: Slash commands Bulk Overwrites topicUid: Guides.SlashCommands.BulkOverwrite - name: Working with Context commands items: @@ -71,9 +36,3 @@ topicUid: Guides.MessageComponents.SelectMenus - name: Advanced Concepts topicUid: Guides.MessageComponents.Advanced -- name: Emoji - topicUid: Guides.Emoji -- name: Voice - topicUid: Guides.Voice.SendingVoice -- name: Deployment - topicUid: Guides.Deployment diff --git a/docs/index.md b/docs/index.md index 063ec9e16f..6934a96167 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,7 +3,7 @@ uid: Root.Landing title: Home --- -# Discord.Net Labs Documentation +# Discord.NET Labs Documentation @@ -11,11 +11,11 @@ title: Home [![NuGet](https://img.shields.io/nuget/vpre/Discord.Net.Labs.svg?maxAge=2592000?style=plastic)](https://www.nuget.org/packages/Discord.Net.Labs/) [![MyGet](https://img.shields.io/myget/discord-net-labs/vpre/Discord.Net.Labs.svg)](https://www.myget.org/feed/Packages/discord-net-labs) [![Build Status](https://dev.azure.com/Discord-Net-Labs/Discord-Net-Labs/_apis/build/status/discord-net.Discord.Net?branchName=dev)](https://dev.azure.com/Discord-Net-Labs/Discord-Net-Labs/_build/latest?definitionId=1&branchName=release%2F3.x) -[![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dvSfUTet3K) +[![Discord](https://discord.com/api/guilds/848176216011046962/widget.png)](https://discord.gg/dnet-labs) -## What is Discord.Net Labs? +## What is Discord.NET Labs? -Discord.Net Labs is an experimental fork of Discord.Net that implements the newest discord features for testing and development to eventually get merged into Discord.Net +Discord.NET Labs is an experimental fork of Discord.NET that implements the newest discord features for testing and development to eventually get merged into Discord.NET. Serving as a developer branch to the default project, it is a drop in replacement and can be used instead. It is ill advised to use Discord.NET Labs in a production environment normally. However if approached correctly, will work as an improved and up-to-date replacement to Discord.NET! ## Where to begin? @@ -25,23 +25,43 @@ If you are new to Discord.NET in general, you should refer their Is this your first time using Labs, but you are already familiar with Discord.NET? Refer to our [Guides](xref:Guides.Introduction) -### Slashcommands: +## Questions? -Examples on how slashcommands are created, handled & responded to is found -[Here](xref:Guides.SlashCommands.Intro) +Frequently asked questions are covered in the +[FAQ](https://discord-net-labs.com/FAQ.html). Read it thoroughly because most common questions are already answered there. -### User & Message commands: +If you still have unanswered questions after reading the FAQ, further support is available on +[Discord](https://discord.gg/dnet-labs). -Creating User & Message commands is found -[Here](xref:Guides.ContextCommands.Creating), -interacting with them is covered -[Here](xref:Guides.ContextCommands.Reveiving). +## Commonly used features -### Message components +#### Slash commands -Handling & creating message components such as buttons & dropdown menu's is found [Here](xref:Guides.MessageComponents.GettingStarted) +Slash commands are purposed to take over the normal prefixed commands in Discord and comes with good functionality to serve as a replacement. +Being interactions, they are handled as SocketInteractions. Creating and receiving slashcommands is covered below. + +- Find out more about slash commands in the +[Slash Command Guides](xref:Guides.SlashCommands.Intro) + +#### Message & User commands + +These commands can be pointed at messages and users, in custom application tabs. +Being interactions as well, they are able to be handled just like slash commands. They do not have options however. + +- Learn how to create and handle these commands in the +[Context Command Guides](xref:Guides.ContextCommands.Creating) + +#### Message components + +Components of a message such as buttons and dropdowns, which can be interacted with and responded to. +Message components can be set in rows and multiple can exist on a single message! + +- Explanation on how to add & respond to message components can be found in the +[Message Component Guides](xref:Guides.MessageComponents.GettingStarted) + +#### Note More experienced users might want to refer to the [API Documentation](xref:API.Docs) for a breakdown of the individual -objects in the library. +components in the library. From a9216f12fc3d998ed0c3dfc3447c44e1c5a7422d Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Sun, 24 Oct 2021 03:28:18 -0400 Subject: [PATCH 438/494] Add student hub guild directory channel (#256) * animated guild banner support * Add guild directory channel --- src/Discord.Net.Core/Entities/Channels/ChannelType.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs index 85fc0b8111..e60bd5031d 100644 --- a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs +++ b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs @@ -24,7 +24,8 @@ public enum ChannelType /// The channel is a private temporary thread channel under a text channel. PrivateThread = 12, /// The channel is a stage voice channel. - Stage = 13 - + Stage = 13, + /// The channel is a guild directory used in hub servers. (Unreleased) + GuildDirectory = 14 } } From 6092c428dd1a7f5749f073aecfedc79dc4a98a8d Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 24 Oct 2021 08:47:49 -0300 Subject: [PATCH 439/494] Fix followup with file overwrite having incorrect parameter locations --- .../Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 66d10fd3b0..de9193e35c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -178,8 +178,8 @@ public override async Task FollowupAsync( /// public override async Task FollowupWithFileAsync( Stream fileStream, + string fileName, string text = null, - string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, From 969e882ed97cc57c8a6d3c0e3c09e149357a65ac Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 25 Oct 2021 12:34:07 -0300 Subject: [PATCH 440/494] Merge labs 3.x --- .../01-getting-started.md | 9 ++- .../creating-context-menu-commands.md | 8 ++- .../receiving-context-menu-command-events.md | 41 +++++------- .../03-responding-to-slash-commands.md | 27 ++------ .../slash-commands/04-parameters.md | 17 +++-- .../05-responding-ephemerally.md | 3 +- .../slash-commands/06-subcommands.md | 27 ++++---- .../slash-commands/07-choice-slash-command.md | 31 +++++----- ...bulk-overwrite-of-global-slash-commands.md | 11 ++-- .../message-components/01-getting-started.md | 5 ++ .../02-responding-to-buttons.md | 33 +++------- .../message-components/03-buttons-in-depth.md | 5 ++ .../message-components/04-select-menus.md | 7 ++- .../message-components/05-advanced.md | 62 +++++++++++-------- docs/guides/toc.yml | 24 ++++++- src/Discord.Net.Core/CDN.cs | 18 ++++-- .../Entities/Activities/ActivityProperties.cs | 14 ++++- .../Entities/Channels/ChannelType.cs | 5 +- .../Entities/Roles/RoleProperties.cs | 5 ++ .../Entities/Users/IGuildUser.cs | 21 +++++++ .../Entities/Users/UserProperties.cs | 6 +- .../API/Common/GuildMember.cs | 2 + .../API/Rest/ModifyGuildRoleParams.cs | 2 + src/Discord.Net.Rest/DiscordRestApiClient.cs | 4 +- .../Entities/Guilds/RestGuild.cs | 2 +- .../Entities/Roles/RoleHelper.cs | 3 +- .../Entities/Users/RestGuildUser.cs | 7 +++ .../Entities/Users/RestWebhookUser.cs | 4 ++ .../Gateway/GuildJoinRequestDeleteEvent.cs | 12 ++++ .../BaseSocketClient.Events.cs | 7 +++ .../DiscordShardedClient.cs | 1 + .../DiscordSocketClient.cs | 10 ++- .../Entities/Guilds/SocketGuild.cs | 2 +- .../SocketAutocompleteInteractionData.cs | 6 +- .../SocketBaseCommand/SocketCommandBase.cs | 2 +- .../Entities/Users/SocketGuildUser.cs | 7 ++- .../Entities/Users/SocketThreadUser.cs | 5 ++ .../Entities/Users/SocketWebhookUser.cs | 4 ++ 38 files changed, 291 insertions(+), 168 deletions(-) create mode 100644 src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs diff --git a/docs/guides/interactions/application-commands/01-getting-started.md b/docs/guides/interactions/application-commands/01-getting-started.md index 70d0bd6f75..fc8c8fe302 100644 --- a/docs/guides/interactions/application-commands/01-getting-started.md +++ b/docs/guides/interactions/application-commands/01-getting-started.md @@ -1,3 +1,9 @@ +--- +uid: Guides.SlashCommands.Intro +title: Introduction to slash commands +--- + + # Getting started with application commands. Welcome! This guide will show you how to use application commands. @@ -22,4 +28,5 @@ Head over to your discord applications OAuth2 screen and make sure to select the From there you can then use the link to add your bot to a server. -**Note**: In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild. +> [!NOTE] +> In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild. diff --git a/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md b/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md index d497ca1e6e..02a9cde14b 100644 --- a/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md +++ b/docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md @@ -1,3 +1,8 @@ +--- +uid: Guides.ContextCommands.Creating +title: Creating Context Commands +--- + # Creating context menu commands. There are two kinds of Context Menu Commands: User Commands and Message Commands. @@ -96,4 +101,5 @@ public async Task Client_Ready() ``` -**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. +> [!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. diff --git a/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md b/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md index 52bc303e75..d4e973d049 100644 --- a/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md +++ b/docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md @@ -1,40 +1,33 @@ +--- +uid: Guides.ContextCommands.Reveiving +title: Receiving Context Commands +--- + # Receiving Context Menu events -User commands and Message commands have their own unique objects returned. Different from Slash commands. To get the appropriate object returned, you can use a similar method to the slash commands. +User commands and Message commands have their own unique event just like the other interaction types. For user commands the event is `UserCommandExecuted` and for message commands the event is `MessageCommandExecuted`. ```cs -client.InteractionCreated += InteractionCreatedHandler; +// For message commands +client.MessageCommandExecuted += MessageCommandHandler; + +// For user commands +client.UserCommandExecuted += UserCommandHandler; ... -public async Task InteractionCreatedHandler(SocketInteraction arg) +public async Task MessageCommandHandler(SocketMessageCommand arg) { - if ( arg.Type == InteractionType.ApplicationCommand) - Task.Run(() => ApplicationCommandHandler(arg)); + Console.Writeline("Message command received!"); } -public async Task ApplicationCommandHandler(SocketInteraction arg) +public async Task UserCommandHandler(SocketUserCommand arg) { - switch (arg) - { - case SocketSlashCommand slashCommand: - Console.Writeline("Slash command received!"); - break; - case SocketUserCommand userCommand: - Console.Writeline("User command received!") - // userCommand.User = User who ran command. - // userCommand.Data.Member = User who was clicked. - break; - case SocketMessageCommand messageCommand: - Console.Writeline("Message command received!") - // messageCommand.User = User who ran command. - // messageCommand.Data.Message = Message that was clicked. - break; - } + Console.Writeline("User command received!"); } ``` -User commands return a SocketUser object, showing the user that was clicked to run the command. -Message commands return a SocketMessage object, showing the message that was clicked to run the command. +User commands contain a SocketUser object called `Member` in their data class, showing the user that was clicked to run the command. +Message commands contain a SocketMessage object called `Message` in their data class, showing the message that was clicked to run the command. Both return the user who ran the command, the guild (if any), channel, etc. \ No newline at end of file diff --git a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md index cd6ad52172..3dbc579fee 100644 --- a/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md @@ -5,40 +5,25 @@ title: Receiving and Responding to Slash Commands # Responding to interactions. -Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. In order to receive a slash command we have to listen to the `InteractionCreated` event. Let's add this to our code. +Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. We can listen to the `SlashCommandExecuted` event to respond to them. Lets add this to our code: ```cs -client.InteractionCreated += Client_InteractionCreated; +client.SlashCommandExecuted += SlashCommandHandler; ... -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { } ``` -Now that we have the interaction event, let's talk about the `SocketInteraction` argument. The interaction can be cast to either a `SocketSlashCommand` or a `SocketMessageComponent`. In our case, we're trying to use slash commands so let's cast it to a `SocketSlashCommand`. - -```cs -private async Task Client_InteractionCreated(SocketInteraction arg) -{ - if(arg is SocketSlashCommand command) - { - // we now have an instance of a SocketSlashCommand named command. - } -} -``` - With every type of interaction there is a `Data` field. This is where the relevant information lives about our command that was executed. In our case, `Data` is a `SocketSlashCommandData` instance. In the data class, we can access the name of the command triggered as well as the options if there were any. For this example, we're just going to respond with the name of the command executed. ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) - { - await command.RespondAsync($"You executed {command.Data.Name}"); - } + await command.RespondAsync($"You executed {command.Data.Name}"); } ``` @@ -48,8 +33,6 @@ Let's try this out! ![slash command result](images/slashcommand2.png) -Let's go over the response types quickly, as you would only change them for style points :P - > [!NOTE] > After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`. > If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response) diff --git a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md index cc61796c8e..6afd83729d 100644 --- a/docs/guides/interactions/application-commands/slash-commands/04-parameters.md +++ b/docs/guides/interactions/application-commands/slash-commands/04-parameters.md @@ -46,7 +46,7 @@ public async Task Client_Ready() var guildCommand = new SlashCommandBuilder() .WithName("list-roles") .WithDescription("Lists all roles of a user.") - .AddOption("user", ApplicationCommandOptionType.User, "The users whos roles you want to be listed", required: true); + .AddOption("user", ApplicationCommandOptionType.User, "The users whos roles you want to be listed", isRequired: true); try { @@ -66,17 +66,14 @@ public async Task Client_Ready() That seems to be working, now Let's handle the interaction. ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) { - // Let's add a switch statement for the command name so we can handle multiple commands in one event. - switch(command.Data.Name) - { - case "list-roles": - await HandleListRoleCommand(command); - break; - } + case "list-roles": + await HandleListRoleCommand(command); + break; } } diff --git a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md index fa5ac449ba..641103df57 100644 --- a/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md +++ b/docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md @@ -7,7 +7,8 @@ title: Ephemeral Responses What is an ephemeral response? Basically, only the user who executed the command can see the result of it, this is pretty simple to implement. -**Note**: You don't have to run arg.DeferAsync() to capture the interaction, you can use arg.RespondAsync() with a message to capture it, this also follows the ephemeral rule. +> [!NOTE] +> You don't have to run arg.DeferAsync() to capture the interaction, you can use arg.RespondAsync() with a message to capture it, this also follows the ephemeral rule. When responding with either `FollowupAsync` or `RespondAsync` you can pass in an `ephemeral` property. When setting it to true it will respond ephemerally, false and it will respond non-ephemerally. diff --git a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md index ac8c7313d2..83d7b283cd 100644 --- a/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md +++ b/docs/guides/interactions/application-commands/slash-commands/06-subcommands.md @@ -86,7 +86,7 @@ public async Task Client_Ready() .WithName("set") .WithDescription("Sets the field A") .WithType(ApplicationCommandOptionType.SubCommand) - .AddOption("value", ApplicationCommandOptionType.String, "the value to set the field ", required: true) + .AddOption("value", ApplicationCommandOptionType.String, "the value to set the field", isRequired: true) ).AddOption(new SlashCommandOptionBuilder() .WithName("get") .WithDescription("Gets the value of field A.") @@ -100,7 +100,7 @@ public async Task Client_Ready() .WithName("set") .WithDescription("Sets the field B") .WithType(ApplicationCommandOptionType.SubCommand) - .AddOption("value", ApplicationCommandOptionType.Integer, "the value to set the fie to.", required: true) + .AddOption("value", ApplicationCommandOptionType.Integer, "the value to set the fie to.", isRequired: true) ).AddOption(new SlashCommandOptionBuilder() .WithName("get") .WithDescription("Gets the value of field B.") @@ -114,7 +114,7 @@ public async Task Client_Ready() .WithName("set") .WithDescription("Sets the field C") .WithType(ApplicationCommandOptionType.SubCommand) - .AddOption("value", ApplicationCommandOptionType.Boolean, "the value to set the fie to.", required: true) + .AddOption("value", ApplicationCommandOptionType.Boolean, "the value to set the fie to.", isRequired: true) ).AddOption(new SlashCommandOptionBuilder() .WithName("get") .WithDescription("Gets the value of field C.") @@ -140,20 +140,17 @@ All that code generates a command that looks like this: Now that we have our command made, we need to handle the multiple options with this command. So lets add this into our handler: ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) { - // Let's add a switch statement for the command name so we can handle multiple commands in one event. - switch(command.Data.Name) - { - case "list-roles": - await HandleListRoleCommand(command); - break; - case "settings": - await HandleSettingsCommand(command); - break; - } + case "list-roles": + await HandleListRoleCommand(command); + break; + case "settings": + await HandleSettingsCommand(command); + break; } } diff --git a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md index 79de5ffbca..3951e1141c 100644 --- a/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md +++ b/docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md @@ -40,8 +40,8 @@ private async Task Client_Ready() } } ``` - -> **Note:** Your `ApplicationCommandOptionType` specifies which type your choices are, you need to use `ApplicationCommandOptionType.Integer` if choices whos value are numbers and `ApplicationCommandOptionType.String` for string values. +> [!NOTE] +> Your `ApplicationCommandOptionType` specifies which type your choices are, you need to use `ApplicationCommandOptionType.Integer` for choices whos values are whole numbers, `ApplicationCommandOptionType.Number` for choices whos values are doubles, and `ApplicationCommandOptionType.String` for string values. We have defined 5 choices for the user to pick from, each choice has a value assigned to it. The value can either be a string or an int. In our case we're going to use an int. This is what the command looks like: @@ -50,23 +50,20 @@ We have defined 5 choices for the user to pick from, each choice has a value ass Lets add our code for handling the interaction. ```cs -private async Task Client_InteractionCreated(SocketInteraction arg) +private async Task SlashCommandHandler(SocketSlashCommand command) { - if(arg is SocketSlashCommand command) + // Let's add a switch statement for the command name so we can handle multiple commands in one event. + switch(command.Data.Name) { - // Let's add a switch statement for the command name so we can handle multiple commands in one event. - switch(command.Data.Name) - { - case "list-roles": - await HandleListRoleCommand(command); - break; - case "settings": - await HandleSettingsCommand(HandleFeedbackCommand); - break; - case "feedback": - await HandleFeedbackCommand(command); - break; - } + case "list-roles": + await HandleListRoleCommand(command); + break; + case "settings": + await HandleSettingsCommand(command); + break; + case "feedback": + await HandleFeedbackCommand(command); + break; } } diff --git a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md index e2511ab983..095eda14fa 100644 --- a/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md @@ -6,9 +6,11 @@ title: Slash Command Bulk Overwrites If you have too many global commands then you might want to consider using the bulk overwrite function. ```cs -public async Task Client_Ready() { +public async Task Client_Ready() +{ List applicationCommandProperties = new(); - try { + try + { // Simple help slash command. SlashCommandBuilder globalCommandHelp = new SlashCommandBuilder(); globalCommandHelp.WithName("help"); @@ -28,10 +30,11 @@ public async Task Client_Ready() { applicationCommandProperties.Add(globalCommandAddFamily.Build()); await _client.BulkOverwriteGlobalApplicationCommandsAsync(applicationCommandProperties.ToArray()); - } catch (ApplicationCommandException exception) { + } + catch (ApplicationCommandException exception) + { var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented); Console.WriteLine(json); } - Console.WriteLine("Client Ready: Finished"); } ``` diff --git a/docs/guides/interactions/message-components/01-getting-started.md b/docs/guides/interactions/message-components/01-getting-started.md index 2b1d3f5ff5..cd5eadd0a9 100644 --- a/docs/guides/interactions/message-components/01-getting-started.md +++ b/docs/guides/interactions/message-components/01-getting-started.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.GettingStarted +title: Getting Started with Components +--- + # Message Components Message components are a framework for adding interactive elements to a message your app or bot sends. They're accessible, customizable, and easy to use. diff --git a/docs/guides/interactions/message-components/02-responding-to-buttons.md b/docs/guides/interactions/message-components/02-responding-to-buttons.md index c83f1b9d24..00d651f6ba 100644 --- a/docs/guides/interactions/message-components/02-responding-to-buttons.md +++ b/docs/guides/interactions/message-components/02-responding-to-buttons.md @@ -1,30 +1,23 @@ +--- +uid: Guides.MessageComponents.Responding +title: Responding to Components +--- + # Responding to button clicks Responding to buttons is pretty simple, there are a couple ways of doing it and we can cover both. ### Method 1: Hooking the InteractionCreated Event -We can hook the `InteractionCreated` event since button clicks are a form of interactions: +We can hook the `ButtonExecuted` event for button type interactions: ```cs -client.IntreactionCreated += MyInteractionHandler; +client.ButtonExecuted += MyButtonHandler; ``` Now, lets write our handler. ```cs -public async Task MyInteractionHandler(SocketInteraction arg) -{ - // first we check the type of the interaction, this can be done with a switch statement - switch(arg) - { - case SocketMessageComponent component: - // we now have a variable defined as 'component' which contains our component data, lets pass it to a different handler. - - break; - } -} - public async Task MyButtonHandler(SocketMessageComponent component) { // We can now check for our custom id @@ -41,14 +34,4 @@ public async Task MyButtonHandler(SocketMessageComponent component) Running it and clicking the button: -![](Images/image2.png) - -### Method 2: Hooking the ButtonExecuted Event - -This method skips the first switch statement because the `ButtonExecuted` event is only fired when a button is clicked, meaning we dont have to check the type of the interaction. - -```cs -client.ButtonExecuted += MyButtonHandler; -``` - -The rest of the code is the same and produces the same result. +![](Images/image2.png) \ No newline at end of file diff --git a/docs/guides/interactions/message-components/03-buttons-in-depth.md b/docs/guides/interactions/message-components/03-buttons-in-depth.md index db38685017..f9fd67515d 100644 --- a/docs/guides/interactions/message-components/03-buttons-in-depth.md +++ b/docs/guides/interactions/message-components/03-buttons-in-depth.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.Buttons +title: Buttons in Depth +--- + # Buttons in depth There are many changes you can make to buttons, lets take a look at the parameters in the `WithButton` function" diff --git a/docs/guides/interactions/message-components/04-select-menus.md b/docs/guides/interactions/message-components/04-select-menus.md index 3f06aa389b..5181ddf347 100644 --- a/docs/guides/interactions/message-components/04-select-menus.md +++ b/docs/guides/interactions/message-components/04-select-menus.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.SelectMenus +title: Select Menus +--- + # Select menus Select menus allow users to select from a range of options, this can be quite useful with configuration commands etc. @@ -48,7 +53,7 @@ And opening the menu we see: ![](Images/image5.png) -Lets handle the selection of an option, as before we can hook the `InteractionCreated` event and check the type ourself but for this example im just going to use the `SelectMenuExecuted` event +Lets handle the selection of an option, We can hook the `SelectMenuExecuted` event to handle our select menu: ```cs client.SelectMenuExecuted += MyMenuHandler; diff --git a/docs/guides/interactions/message-components/05-advanced.md b/docs/guides/interactions/message-components/05-advanced.md index 638886ad32..49b3f31a6c 100644 --- a/docs/guides/interactions/message-components/05-advanced.md +++ b/docs/guides/interactions/message-components/05-advanced.md @@ -1,3 +1,8 @@ +--- +uid: Guides.MessageComponents.Advanced +title: Advanced Concepts +--- + # Advanced Lets say you have some components on an ephemeral slash command, and you want to modify the message that the button is on. The issue with this is that ephemeral messages are not stored and can not be get via rest or other means. @@ -45,31 +50,38 @@ break; Now, let's listen to the select menu executed event and add a case for `select-1` ```cs -switch (arg.Data.CustomId) +client.SelectMenuExecuted += SelectMenuHandler; + +... + +public async Task SelectMenuHandler(SocketMessageComponent arg) { - case "select-1": - var value = arg.Data.Values.First(); - var menu = new SelectMenuBuilder() - { - CustomId = "select-1", - Placeholder = $"{(arg.Message.Components.First().Components.First() as SelectMenu).Options.FirstOrDefault(x => x.Value == value).Label}", - MaxValues = 1, - MinValues = 1, - Disabled = true - }; - - menu.AddOption("Meh", "1", "Its not gaming.") - .AddOption("Ish", "2", "Some would say that this is gaming.") - .AddOption("Moderate", "3", "It could pass as gaming") - .AddOption("Confirmed", "4", "We are gaming") - .AddOption("Excellent", "5", "It is renowned as gaming nation wide", new Emoji("🔥")); - - // We use UpdateAsync to update the message and its original content and components. - await arg.UpdateAsync(x => - { - x.Content = $"Thank you {arg.User.Mention} for rating us {value}/5 on the gaming scale"; - x.Components = new ComponentBuilder().WithSelectMenu(menu).Build(); - }); - break; + switch (arg.Data.CustomId) + { + case "select-1": + var value = arg.Data.Values.First(); + var menu = new SelectMenuBuilder() + { + CustomId = "select-1", + Placeholder = $"{(arg.Message.Components.First().Components.First() as SelectMenu).Options.FirstOrDefault(x => x.Value == value).Label}", + MaxValues = 1, + MinValues = 1, + Disabled = true + }; + + menu.AddOption("Meh", "1", "Its not gaming.") + .AddOption("Ish", "2", "Some would say that this is gaming.") + .AddOption("Moderate", "3", "It could pass as gaming") + .AddOption("Confirmed", "4", "We are gaming") + .AddOption("Excellent", "5", "It is renowned as gaming nation wide", new Emoji("🔥")); + + // We use UpdateAsync to update the message and its original content and components. + await arg.UpdateAsync(x => + { + x.Content = $"Thank you {arg.User.Mention} for rating us {value}/5 on the gaming scale"; + x.Components = new ComponentBuilder().WithSelectMenu(menu).Build(); + }); + break; + } } ``` diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index 64ed1c8cc1..10e91760bb 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -35,10 +35,10 @@ topicUid: Guides.Commands.DI - name: Post-execution Handling topicUid: Guides.Commands.PostExecution -- name: Working with Interactions +- name: Working with Slash commands items: - name: Introduction - topicUid: Guides.Interactions.Intro + topicUid: Guides.SlashCommands.Intro - name: Creating slash commands topicUid: Guides.SlashCommands.Creating - name: Receiving and responding to slash commands @@ -51,8 +51,26 @@ topicUid: Guides.SlashCommands.SubCommand - name: Slash command choices topicUid: Guides.SlashCommands.Choices - - name: Slash ommands Bulk Overwrites + - name: Slash commands Bulk Overwrites topicUid: Guides.SlashCommands.BulkOverwrite +- name: Working with Context commands + items: + - name: Creating Context Commands + topicUid: Guides.ContextCommands.Creating + - name: Receiving Context Commands + topicUid: Guides.ContextCommands.Reveiving +- name: Working with Message Components + items: + - name: Getting started + topicUid: Guides.MessageComponents.GettingStarted + - name: Responding to Components + topicUid: Guides.MessageComponents.Responding + - name: Buttons in depth + topicUid: Guides.MessageComponents.Buttons + - name: Select menus + topicUid: Guides.MessageComponents.SelectMenus + - name: Advanced Concepts + topicUid: Guides.MessageComponents.Advanced - name: Emoji topicUid: Guides.Emoji - name: Voice diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs index b170336dc1..d6535a4f11 100644 --- a/src/Discord.Net.Core/CDN.cs +++ b/src/Discord.Net.Core/CDN.cs @@ -47,6 +47,14 @@ public static string GetUserAvatarUrl(ulong userId, string avatarId, ushort size return $"{DiscordConfig.CDNUrl}avatars/{userId}/{avatarId}.{extension}?size={size}"; } + public static string GetGuildUserAvatarUrl(ulong userId, ulong guildId, string avatarId, ushort size, ImageFormat format) + { + if (avatarId == null) + return null; + string extension = FormatToExtension(format, avatarId); + return $"{DiscordConfig.CDNUrl}guilds/{guildId}/users/{userId}/avatars/{avatarId}.{extension}?size={size}"; + } + /// /// Returns a user banner URL. /// @@ -131,15 +139,17 @@ public static string GetChannelIconUrl(ulong channelId, string iconId) /// /// The guild snowflake identifier. /// The banner image identifier. + /// The format to return. /// The size of the image to return in horizontal pixels. This can be any power of two between 16 and 2048 inclusive. /// /// A URL pointing to the guild's banner image. /// - public static string GetGuildBannerUrl(ulong guildId, string bannerId, ushort? size = null) + public static string GetGuildBannerUrl(ulong guildId, string bannerId, ImageFormat format, ushort? size = null) { - if (!string.IsNullOrEmpty(bannerId)) - return $"{DiscordConfig.CDNUrl}banners/{guildId}/{bannerId}.jpg" + (size.HasValue ? $"?size={size}" : string.Empty); - return null; + if (string.IsNullOrEmpty(bannerId)) + return null; + string extension = FormatToExtension(format, bannerId); + return $"{DiscordConfig.CDNUrl}banners/{guildId}/{bannerId}.{extension}" + (size.HasValue ? $"?size={size}" : string.Empty); } /// /// Returns an emoji URL. diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs b/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs index a7d13235fa..587b21f03f 100644 --- a/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs +++ b/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs @@ -33,6 +33,18 @@ public enum ActivityProperties /// /// Indicates that a user can play this song. /// - Play = 0b100000 + Play = 0b100000, + /// + /// Indicates that a user is playing an activity in a voice channel with friends. + /// + PARTY_PRIVACY_FRIENDS = 0b1000000, + /// + /// Indicates that a user is playing an activity in a voice channel. + /// + PARTY_PRIVACY_VOICE_CHANNEL = 0b10000000, + /// + /// Indicates that a user is playing an activity in a voice channel. + /// + EMBEDDED = 0b10000000 } } diff --git a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs index 85fc0b8111..e60bd5031d 100644 --- a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs +++ b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs @@ -24,7 +24,8 @@ public enum ChannelType /// The channel is a private temporary thread channel under a text channel. PrivateThread = 12, /// The channel is a stage voice channel. - Stage = 13 - + Stage = 13, + /// The channel is a guild directory used in hub servers. (Unreleased) + GuildDirectory = 14 } } diff --git a/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs b/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs index a58112b289..93cda8d5b5 100644 --- a/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs +++ b/src/Discord.Net.Core/Entities/Roles/RoleProperties.cs @@ -50,6 +50,11 @@ public class RoleProperties /// This value may not be set if the role is an @everyone role. /// public Optional Hoist { get; set; } + + /// + /// Gets or sets the icon of the role. + /// + public Optional Icon { get; set; } /// /// Gets or sets whether or not this role can be mentioned. /// diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs index 58a797c5fc..947ff8521c 100644 --- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs @@ -25,6 +25,13 @@ public interface IGuildUser : IUser, IVoiceState /// string Nickname { get; } /// + /// Gets the guild specific avatar for this users. + /// + /// + /// The users guild avatar hash if they have one; otherwise . + /// + string GuildAvatarId { get; } + /// /// Gets the guild-level permissions for this user. /// /// @@ -96,6 +103,20 @@ public interface IGuildUser : IUser, IVoiceState /// ChannelPermissions GetPermissions(IGuildChannel channel); + /// + /// Gets the guild avatar URL for this user. + /// + /// + /// This property retrieves a URL for this guild user's guild specific avatar. In event that the user does not have a valid guild avatar + /// (i.e. their avatar identifier is not set), this method will return null. + /// + /// The format to return. + /// The size of the image to return in. This can be any power of two between 16 and 2048. + /// + /// + /// A string representing the user's avatar URL; null if the user does not have an avatar in place. + /// + string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128); /// /// Kicks this user from this guild. /// diff --git a/src/Discord.Net.Core/Entities/Users/UserProperties.cs b/src/Discord.Net.Core/Entities/Users/UserProperties.cs index 68232b2547..4cf4162a9d 100644 --- a/src/Discord.Net.Core/Entities/Users/UserProperties.cs +++ b/src/Discord.Net.Core/Entities/Users/UserProperties.cs @@ -61,9 +61,13 @@ public enum UserProperties /// Flag given to users that developed bots and early verified their accounts. /// EarlyVerifiedBotDeveloper = 1 << 17, - /// + /// /// Flag given to users that are discord certified moderators who has give discord's exam. /// DiscordCertifiedModerator = 1 << 18, + /// + /// Flag given to bots that use only outgoing webhooks, exclusively. + /// + BotHTTPInteractions = 1 << 19, } } diff --git a/src/Discord.Net.Rest/API/Common/GuildMember.cs b/src/Discord.Net.Rest/API/Common/GuildMember.cs index 53f4908bff..9b888e86ab 100644 --- a/src/Discord.Net.Rest/API/Common/GuildMember.cs +++ b/src/Discord.Net.Rest/API/Common/GuildMember.cs @@ -9,6 +9,8 @@ internal class GuildMember public User User { get; set; } [JsonProperty("nick")] public Optional Nick { get; set; } + [JsonProperty("avatar")] + public Optional Avatar { get; set; } [JsonProperty("roles")] public Optional Roles { get; set; } [JsonProperty("joined_at")] diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs index ce8c86fbf5..fbb9c3e482 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildRoleParams.cs @@ -13,6 +13,8 @@ internal class ModifyGuildRoleParams public Optional Color { get; set; } [JsonProperty("hoist")] public Optional Hoist { get; set; } + [JsonProperty("icon")] + public Optional Icon { get; set; } [JsonProperty("mentionable")] public Optional Mentionable { get; set; } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 6979d7030b..cd9ab9f3df 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -373,7 +373,9 @@ public async Task ModifyGuildChannelAsync(ulong channelId, Rest.ModifyG Preconditions.NotNull(args, nameof(args)); Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); Preconditions.NotNullOrWhitespace(args.Name, nameof(args.Name)); - Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); + + if(args.Name.IsSpecified) + Preconditions.LessThan(args.Name.Value.Length, 100, nameof(args.Name)); options = RequestOptions.CreateOrClone(options); diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 8b0659baf9..d90ba9adaf 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -102,7 +102,7 @@ public class RestGuild : RestEntity, IGuild, IUpdateable /// public string DiscoverySplashUrl => CDN.GetGuildDiscoverySplashUrl(Id, DiscoverySplashId); /// - public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId); + public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId, ImageFormat.Auto); /// /// Gets the built-in role containing all users in this guild. diff --git a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs index 8d525d4c3f..1211ec40b9 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs @@ -24,7 +24,8 @@ public static async Task ModifyAsync(IRole role, BaseDiscordClient client Hoist = args.Hoist, Mentionable = args.Mentionable, Name = args.Name, - Permissions = args.Permissions.IsSpecified ? args.Permissions.Value.RawValue.ToString() : Optional.Create() + Permissions = args.Permissions.IsSpecified ? args.Permissions.Value.RawValue.ToString() : Optional.Create(), + Icon = args.Icon.IsSpecified ? args.Icon.Value.ToModel() : Optional.Unspecified }; var model = await client.ApiClient.ModifyGuildRoleAsync(role.Guild.Id, role.Id, apiArgs, options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index 556e5e1249..2e184d32e7 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -21,6 +21,8 @@ public class RestGuildUser : RestUser, IGuildUser /// public string Nickname { get; private set; } + /// + public string GuildAvatarId { get; private set; } internal IGuild Guild { get; private set; } /// public bool IsDeafened { get; private set; } @@ -80,6 +82,8 @@ internal void Update(Model model) _joinedAtTicks = model.JoinedAt.Value.UtcTicks; if (model.Nick.IsSpecified) Nickname = model.Nick.Value; + if (model.Avatar.IsSpecified) + GuildAvatarId = model.Avatar.Value; if (model.Deaf.IsSpecified) IsDeafened = model.Deaf.Value; if (model.Mute.IsSpecified) @@ -156,6 +160,9 @@ public ChannelPermissions GetPermissions(IGuildChannel channel) var guildPerms = GuildPermissions; return new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, guildPerms.RawValue)); } + + public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) + => CDN.GetGuildUserAvatarUrl(Id, GuildId, GuildAvatarId, size, format); #endregion #region IGuildUser diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs index 561cd92eea..2cd19da410 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs @@ -54,6 +54,10 @@ IGuild IGuildUser.Guild /// string IGuildUser.Nickname => null; /// + string IGuildUser.GuildAvatarId => null; + /// + string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null; + /// bool? IGuildUser.IsPending => null; /// int IGuildUser.Hierarchy => 0; diff --git a/src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs new file mode 100644 index 0000000000..cb6fc5f40c --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/GuildJoinRequestDeleteEvent.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace Discord.API.Gateway +{ + internal class GuildJoinRequestDeleteEvent + { + [JsonProperty("user_id")] + public ulong UserId { get; set; } + [JsonProperty("guild_id")] + public ulong GuildId { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index b7bcfdf2e4..1c314bd485 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -335,6 +335,13 @@ public event Func GuildUpdated remove { _guildUpdatedEvent.Remove(value); } } internal readonly AsyncEvent> _guildUpdatedEvent = new AsyncEvent>(); + /// Fired when a user leaves without agreeing to the member screening + public event Func GuildJoinRequestDeleted + { + add { _guildJoinRequestDeletedEvent.Add(value); } + remove { _guildJoinRequestDeletedEvent.Remove(value); } + } + internal readonly AsyncEvent> _guildJoinRequestDeletedEvent = new AsyncEvent>(); #endregion #region Users diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 613864fdc8..4e2b6f324b 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -485,6 +485,7 @@ private void RegisterEvents(DiscordSocketClient client, bool isPrimary) client.GuildStickerCreated += (sticker) => _guildStickerCreated.InvokeAsync(sticker); client.GuildStickerDeleted += (sticker) => _guildStickerDeleted.InvokeAsync(sticker); client.GuildStickerUpdated += (before, after) => _guildStickerUpdated.InvokeAsync(before, after); + client.GuildJoinRequestDeleted += (userId, guildId) => _guildJoinRequestDeletedEvent.InvokeAsync(userId, guildId); } #endregion diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 264151e947..d2edd336a1 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -74,7 +74,7 @@ public partial class DiscordSocketClient : BaseSocketClient, IDiscordClient internal WebSocketProvider WebSocketProvider { get; private set; } internal bool AlwaysDownloadUsers { get; private set; } internal int? HandlerTimeout { get; private set; } - internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; + internal new DiscordSocketApiClient ApiClient => base.ApiClient; /// public override IReadOnlyCollection Guilds => State.Guilds; /// @@ -1004,6 +1004,14 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + case "GUILD_JOIN_REQUEST_DELETE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_JOIN_REQUEST_DELETE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + await TimedInvokeAsync(_guildJoinRequestDeletedEvent, nameof(GuildJoinRequestDeleted), data.UserId, data.GuildId).ConfigureAwait(false); + } + break; #endregion #region Channels diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 23712be66b..cbadb9b4e4 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -138,7 +138,7 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable /// public string DiscoverySplashUrl => CDN.GetGuildDiscoverySplashUrl(Id, DiscoverySplashId); /// - public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId); + public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId, ImageFormat.Auto); /// Indicates whether the client has all the members downloaded to the local guild cache. public bool HasAllMembers => MemberCount <= DownloadedMemberCount;// _downloaderPromise.Task.IsCompleted; /// Indicates whether the guild cache is synced to this guild. diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs index d0c44bab16..44aebf22de 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/Slash Commands/SocketAutocompleteInteractionData.cs @@ -60,14 +60,12 @@ private List GetOptions(API.AutocompleteInteractionDataOptio { var options = new List(); + options.Add(new AutocompleteOption(model.Type, model.Name, model.Value.GetValueOrDefault(null), model.Focused.GetValueOrDefault(false))); + if (model.Options.IsSpecified) { options.AddRange(model.Options.Value.SelectMany(GetOptions)); } - else if(model.Focused.IsSpecified) - { - options.Add(new AutocompleteOption(model.Type, model.Name, model.Value.GetValueOrDefault(null), model.Focused.Value)); - } return options; } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index 66d10fd3b0..de9193e35c 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -178,8 +178,8 @@ public override async Task FollowupAsync( /// public override async Task FollowupWithFileAsync( Stream fileStream, + string fileName, string text = null, - string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 8dd48891b2..314471b17f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -30,7 +30,8 @@ public class SocketGuildUser : SocketUser, IGuildUser public SocketGuild Guild { get; } /// public string Nickname { get; private set; } - + /// + public string GuildAvatarId { get; private set; } /// public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } } /// @@ -154,6 +155,8 @@ internal void Update(ClientState state, MemberModel model) _joinedAtTicks = model.JoinedAt.Value.UtcTicks; if (model.Nick.IsSpecified) Nickname = model.Nick.Value; + if (model.Avatar.IsSpecified) + GuildAvatarId = model.Avatar.Value; if (model.Roles.IsSpecified) UpdateRoles(model.Roles.Value); if (model.PremiumSince.IsSpecified) @@ -218,6 +221,8 @@ public Task RemoveRolesAsync(IEnumerable roles, RequestOptions options = /// public ChannelPermissions GetPermissions(IGuildChannel channel) => new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, GuildPermissions.RawValue)); + public string GetGuildAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) + => CDN.GetGuildUserAvatarUrl(Id, Guild.Id, GuildAvatarId, size, format); private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Guild)"; internal new SocketGuildUser Clone() => MemberwiseClone() as SocketGuildUser; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index c91921379b..42fb807a1f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -52,6 +52,9 @@ public override string AvatarId get => GuildUser.AvatarId; internal set => GuildUser.AvatarId = value; } + /// + public string GuildAvatarId + => GuildUser.GuildAvatarId; /// public override string BannerId @@ -205,6 +208,8 @@ internal void Update(Model model) /// IReadOnlyCollection IGuildUser.RoleIds => GuildUser.Roles.Select(x => x.Id).ToImmutableArray(); + string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => GuildUser.GetGuildAvatarUrl(format, size); + internal override SocketGlobalUser GlobalUser => GuildUser.GlobalUser; internal override SocketPresence Presence { get => GuildUser.Presence; set => GuildUser.Presence = value; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index d68414ebb1..7cc7d5a444 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -81,6 +81,10 @@ internal static SocketWebhookUser Create(SocketGuild guild, ClientState state, M /// string IGuildUser.Nickname => null; /// + string IGuildUser.GuildAvatarId => null; + /// + string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => null; + /// DateTimeOffset? IGuildUser.PremiumSince => null; /// bool? IGuildUser.IsPending => null; From 01718fac41c43e59d9458be6a4005323ae340f73 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 25 Oct 2021 12:46:38 -0300 Subject: [PATCH 441/494] Update GUILD_JOIN_REQUEST_DELETE event --- .../BaseSocketClient.Events.cs | 4 +- .../DiscordSocketClient.cs | 135 ++++++++++-------- 2 files changed, 80 insertions(+), 59 deletions(-) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 1c314bd485..531afad0e1 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -336,12 +336,12 @@ public event Func GuildUpdated } internal readonly AsyncEvent> _guildUpdatedEvent = new AsyncEvent>(); /// Fired when a user leaves without agreeing to the member screening - public event Func GuildJoinRequestDeleted + public event Func, SocketGuild, Task> GuildJoinRequestDeleted { add { _guildJoinRequestDeletedEvent.Add(value); } remove { _guildJoinRequestDeletedEvent.Remove(value); } } - internal readonly AsyncEvent> _guildJoinRequestDeletedEvent = new AsyncEvent>(); + internal readonly AsyncEvent, SocketGuild, Task>> _guildJoinRequestDeletedEvent = new AsyncEvent, SocketGuild, Task>>(); #endregion #region Users diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index d2edd336a1..07303873dc 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1004,12 +1004,57 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; - case "GUILD_JOIN_REQUEST_DELETE": + case "GUILD_STICKERS_UPDATE": { - await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_JOIN_REQUEST_DELETE)").ConfigureAwait(false); + await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_STICKERS_UPDATE)").ConfigureAwait(false); - var data = (payload as JToken).ToObject(_serializer); - await TimedInvokeAsync(_guildJoinRequestDeletedEvent, nameof(GuildJoinRequestDeleted), data.UserId, data.GuildId).ConfigureAwait(false); + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var newStickers = data.Stickers.Where(x => !guild.Stickers.Any(y => y.Id == x.Id)); + var deletedStickers = guild.Stickers.Where(x => !data.Stickers.Any(y => y.Id == x.Id)); + var updatedStickers = data.Stickers.Select(x => + { + var s = guild.Stickers.FirstOrDefault(y => y.Id == x.Id); + if (s == null) + return null; + + var e = s.Equals(x); + if (!e) + { + return (s, x) as (SocketCustomSticker Entity, API.Sticker Model)?; + } + else + { + return null; + } + }).Where(x => x.HasValue).Select(x => x.Value).ToArray(); + + foreach (var model in newStickers) + { + var entity = guild.AddSticker(model); + await TimedInvokeAsync(_guildStickerCreated, nameof(GuildStickerCreated), entity); + } + foreach (var sticker in deletedStickers) + { + var entity = guild.RemoveSticker(sticker.Id); + await TimedInvokeAsync(_guildStickerDeleted, nameof(GuildStickerDeleted), entity); + } + foreach (var entityModelPair in updatedStickers) + { + var before = entityModelPair.Entity.Clone(); + + entityModelPair.Entity.Update(entityModelPair.Model); + + await TimedInvokeAsync(_guildStickerUpdated, nameof(GuildStickerUpdated), before, entityModelPair.Entity); + } } break; #endregion @@ -1249,6 +1294,32 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + case "GUILD_JOIN_REQUEST_DELETE": + { + await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_JOIN_REQUEST_DELETE)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + var guild = State.GetGuild(data.GuildId); + + if (guild == null) + { + await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); + return; + } + + var user = guild.RemoveUser(data.UserId); + guild.MemberCount--; + + var cacheableUser = new Cacheable(user, data.UserId, user != null, () => Task.FromResult((SocketGuildUser)null)); + + await TimedInvokeAsync(_guildJoinRequestDeletedEvent, nameof(GuildJoinRequestDeleted), cacheableUser, guild).ConfigureAwait(false); + } + break; + #endregion + + #region DM Channels + case "CHANNEL_RECIPIENT_ADD": { await _gatewayLogger.DebugAsync("Received Dispatch (CHANNEL_RECIPIENT_ADD)").ConfigureAwait(false); @@ -1289,6 +1360,7 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; + #endregion #region Roles @@ -2439,7 +2511,9 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } break; + #endregion + #region Stage Channels case "STAGE_INSTANCE_CREATE" or "STAGE_INSTANCE_UPDATE" or "STAGE_INSTANCE_DELETE": { await _gatewayLogger.DebugAsync($"Received Dispatch ({type})").ConfigureAwait(false); @@ -2480,59 +2554,6 @@ private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string ty } } break; - case "GUILD_STICKERS_UPDATE": - { - await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_STICKERS_UPDATE)").ConfigureAwait(false); - - var data = (payload as JToken).ToObject(_serializer); - - var guild = State.GetGuild(data.GuildId); - - if (guild == null) - { - await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); - return; - } - - var newStickers = data.Stickers.Where(x => !guild.Stickers.Any(y => y.Id == x.Id)); - var deletedStickers = guild.Stickers.Where(x => !data.Stickers.Any(y => y.Id == x.Id)); - var updatedStickers = data.Stickers.Select(x => - { - var s = guild.Stickers.FirstOrDefault(y => y.Id == x.Id); - if (s == null) - return null; - - var e = s.Equals(x); - if (!e) - { - return (s, x) as (SocketCustomSticker Entity, API.Sticker Model)?; - } - else - { - return null; - } - }).Where(x => x.HasValue).Select(x => x.Value).ToArray(); - - foreach(var model in newStickers) - { - var entity = guild.AddSticker(model); - await TimedInvokeAsync(_guildStickerCreated, nameof(GuildStickerCreated), entity); - } - foreach(var sticker in deletedStickers) - { - var entity = guild.RemoveSticker(sticker.Id); - await TimedInvokeAsync(_guildStickerDeleted, nameof(GuildStickerDeleted), entity); - } - foreach(var entityModelPair in updatedStickers) - { - var before = entityModelPair.Entity.Clone(); - - entityModelPair.Entity.Update(entityModelPair.Model); - - await TimedInvokeAsync(_guildStickerUpdated, nameof(GuildStickerUpdated), before, entityModelPair.Entity); - } - } - break; #endregion #region Ignored (User only) From d0e3744151eb49cad911b09fff2f07430b3bc221 Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Tue, 26 Oct 2021 10:31:37 -0300 Subject: [PATCH 442/494] Update head.tmpl.partial --- docs/_template/light-dark-theme/partials/head.tmpl.partial | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_template/light-dark-theme/partials/head.tmpl.partial b/docs/_template/light-dark-theme/partials/head.tmpl.partial index c214e75488..5de762b668 100644 --- a/docs/_template/light-dark-theme/partials/head.tmpl.partial +++ b/docs/_template/light-dark-theme/partials/head.tmpl.partial @@ -10,7 +10,7 @@ - + From 244fcb9d1fbe9a2662f30afdca16638ff7962c58 Mon Sep 17 00:00:00 2001 From: Liege72 <65319395+Liege72@users.noreply.github.com> Date: Tue, 26 Oct 2021 20:54:57 -0400 Subject: [PATCH 443/494] 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 --- src/Discord.Net.Core/Entities/Users/IUser.cs | 23 +------------------ .../Entities/Users/SocketGlobalUser.cs | 2 -- .../Entities/Users/SocketGroupUser.cs | 4 ---- .../Entities/Users/SocketGuildUser.cs | 4 ---- .../Entities/Users/SocketSelfUser.cs | 4 ---- .../Entities/Users/SocketThreadUser.cs | 14 ----------- .../Entities/Users/SocketUnknownUser.cs | 6 ----- .../Entities/Users/SocketUser.cs | 18 --------------- .../Entities/Users/SocketWebhookUser.cs | 15 ------------ 9 files changed, 1 insertion(+), 89 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Users/IUser.cs b/src/Discord.Net.Core/Entities/Users/IUser.cs index f265bb938a..2f79450f35 100644 --- a/src/Discord.Net.Core/Entities/Users/IUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IUser.cs @@ -10,18 +10,7 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// /// Gets the identifier of this user's avatar. /// - string AvatarId { get; } - /// - /// Gets the identifier of this user's banner. - /// - string BannerId { get; } - /// - /// Gets the user's banner color. - /// - /// - /// A struct representing the accent color of this user's banner. - /// - Color? AccentColor { get; } + string AvatarId { get; } /// /// Gets the avatar URL for this user. /// @@ -46,16 +35,6 @@ public interface IUser : ISnowflakeEntity, IMentionable, IPresence /// string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128); /// - /// Gets the banner URL for this user. - /// - /// The format to return. - /// The size of the image to return in. This can be any power of two between 16 and 2048. - /// - /// - /// A string representing the user's avatar URL; null if the user does not have an banner in place. - /// - string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256); - /// /// Gets the default avatar URL for this user. /// /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs index b1bce5934d..3a1ad23b6d 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs @@ -12,8 +12,6 @@ internal class SocketGlobalUser : SocketUser public override string Username { get; internal set; } public override ushort DiscriminatorValue { get; internal set; } public override string AvatarId { get; internal set; } - public override string BannerId { get; internal set; } - public override Color? AccentColor { get; internal set; } internal override SocketPresence Presence { get; set; } public override bool IsWebhook => false; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs index ae72b5d47d..fe19a41ec7 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs @@ -30,10 +30,6 @@ public class SocketGroupUser : SocketUser, IGroupUser /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } /// - public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } - /// - public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } - /// internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 314471b17f..147456cb0e 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -40,10 +40,6 @@ public class SocketGuildUser : SocketUser, IGuildUser public override ushort DiscriminatorValue { get { return GlobalUser.DiscriminatorValue; } internal set { GlobalUser.DiscriminatorValue = value; } } /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } - /// - public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } - /// - public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } /// public GuildPermissions GuildPermissions => new GuildPermissions(Permissions.ResolveGuild(Guild, this)); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs index e821238eef..7b11257a3b 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs @@ -29,10 +29,6 @@ public class SocketSelfUser : SocketUser, ISelfUser /// public override string AvatarId { get { return GlobalUser.AvatarId; } internal set { GlobalUser.AvatarId = value; } } /// - public override string BannerId { get { return GlobalUser.BannerId; } internal set { GlobalUser.BannerId = value; } } - /// - public override Color? AccentColor { get { return GlobalUser.AccentColor; } internal set { GlobalUser.AccentColor = value; } } - /// internal override SocketPresence Presence { get { return GlobalUser.Presence; } set { GlobalUser.Presence = value; } } /// public UserProperties Flags { get; internal set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index 42fb807a1f..b2311dd7d9 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -56,20 +56,6 @@ public override string AvatarId public string GuildAvatarId => GuildUser.GuildAvatarId; - /// - public override string BannerId - { - get => GuildUser.BannerId; - internal set => GuildUser.BannerId = value; - } - - /// - public override Color? AccentColor - { - get => GuildUser.AccentColor; - internal set => GuildUser.AccentColor = value; - } - /// public override ushort DiscriminatorValue { diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs index 180e60a3ba..a15f7e7475 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs @@ -20,12 +20,6 @@ public class SocketUnknownUser : SocketUser /// public override string AvatarId { get; internal set; } - /// - public override string BannerId { get; internal set; } - - /// - public override Color? AccentColor { get; internal set; } - /// public override bool IsBot { get; internal set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index c50fbee4fb..025daf29ae 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -25,10 +25,6 @@ public abstract class SocketUser : SocketEntity, IUser /// public abstract string AvatarId { get; internal set; } /// - public abstract string BannerId { get; internal set; } - /// - public abstract Color? AccentColor { get; internal set; } - /// public abstract bool IsWebhook { get; } /// public UserProperties? PublicFlags { get; private set; } @@ -68,16 +64,6 @@ internal virtual bool Update(ClientState state, Model model) AvatarId = model.Avatar.Value; hasChanges = true; } - if (model.Banner.IsSpecified && model.Banner.Value != BannerId) - { - BannerId = model.Banner.Value; - hasChanges = true; - } - if (model.AccentColor.IsSpecified && model.AccentColor.Value != AccentColor?.RawValue) - { - AccentColor = model.AccentColor.Value; - hasChanges = true; - } if (model.Discriminator.IsSpecified) { var newVal = ushort.Parse(model.Discriminator.Value, NumberStyles.None, CultureInfo.InvariantCulture); @@ -113,10 +99,6 @@ public async Task CreateDMChannelAsync(RequestOptions options = null public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128) => CDN.GetUserAvatarUrl(Id, AvatarId, size, format); - /// - public string GetBannerUrl(ImageFormat format = ImageFormat.Auto, ushort size = 256) - => CDN.GetUserBannerUrl(Id, BannerId, size, format); - /// public string GetDefaultAvatarUrl() => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index 7cc7d5a444..bccfe1a29a 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -26,21 +26,6 @@ public class SocketWebhookUser : SocketUser, IWebhookUser /// public override string AvatarId { get; internal set; } - /// - /// Webhook users does not support banners. - public override string BannerId - { - get => throw new NotSupportedException("Webhook users does not support banners."); - internal set => throw new NotSupportedException("Webhook users does not support banners."); - } - - /// - /// Webhook users does not support accent colors. - public override Color? AccentColor - { - get => throw new NotSupportedException("Webhook users does not support accent colors."); - internal set => throw new NotSupportedException("Webhook users does not support accent colors."); - } /// public override bool IsBot { get; internal set; } From caaad5e4a082843f4a079234fab9c75da14013dd Mon Sep 17 00:00:00 2001 From: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com> Date: Wed, 27 Oct 2021 18:23:29 -0500 Subject: [PATCH 444/494] Support Guild Boost Progress Bars (#262) * Support Guild Boost Progress Bars * Update SocketChannel.cs * Fix non-optional and unnecessary values. * Spelling * Reordering and consistency. --- src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs | 4 ++++ src/Discord.Net.Core/Entities/Guilds/IGuild.cs | 7 +++++++ src/Discord.Net.Rest/API/Common/Guild.cs | 2 ++ src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs | 2 ++ src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs | 3 ++- src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs | 4 ++++ src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs | 7 ++++--- 7 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs b/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs index 981e1198c7..708ba4064b 100644 --- a/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs +++ b/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs @@ -108,5 +108,9 @@ public class GuildProperties /// the value of will be unused. /// public Optional PreferredCulture { get; set; } + /// + /// Gets or sets if the boost progress bar is enabled. + /// + public Optional IsBoostProgressBarEnabled { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 4a23336457..fe8fe43f07 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -339,6 +339,13 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// The preferred culture information of this guild. /// CultureInfo PreferredCulture { get; } + /// + /// Gets whether the guild has the boost progress bar enabled. + /// + /// + /// if the boost progress bar is enabled; otherwise . + /// + bool IsBoostProgressBarEnabled { get; } /// /// Modifies this guild. diff --git a/src/Discord.Net.Rest/API/Common/Guild.cs b/src/Discord.Net.Rest/API/Common/Guild.cs index fd8a0bdb57..39516f188c 100644 --- a/src/Discord.Net.Rest/API/Common/Guild.cs +++ b/src/Discord.Net.Rest/API/Common/Guild.cs @@ -81,5 +81,7 @@ internal class Guild public NsfwLevel NsfwLevel { get; set; } [JsonProperty("stickers")] public Sticker[] Stickers { get; set; } + [JsonProperty("premium_progress_bar_enabled")] + public Optional IsBoostProgressBarEnabled { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs index feda243028..c1a20cb830 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs @@ -35,5 +35,7 @@ internal class ModifyGuildParams public Optional SystemChannelFlags { get; set; } [JsonProperty("preferred_locale")] public string PreferredLocale { get; set; } + [JsonProperty("premium_progress_bar_enabled")] + public Optional IsBoostProgressBarEnabled { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 1fb4b774ae..51132d513e 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -36,7 +36,8 @@ public static async Task ModifyAsync(IGuild guild, BaseDiscordClient clie Banner = args.Banner.IsSpecified ? args.Banner.Value?.ToModel() : Optional.Create(), VerificationLevel = args.VerificationLevel, ExplicitContentFilter = args.ExplicitContentFilter, - SystemChannelFlags = args.SystemChannelFlags + SystemChannelFlags = args.SystemChannelFlags, + IsBoostProgressBarEnabled = args.IsBoostProgressBarEnabled }; if (args.AfkChannel.IsSpecified) diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index d90ba9adaf..4767647152 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -88,6 +88,8 @@ public class RestGuild : RestEntity, IGuild, IUpdateable public int? ApproximatePresenceCount { get; private set; } /// public NsfwLevel NsfwLevel { get; private set; } + /// + public bool IsBoostProgressBarEnabled { get; private set; } /// public CultureInfo PreferredCulture { get; private set; } @@ -170,6 +172,8 @@ internal void Update(Model model) ApproximateMemberCount = model.ApproximateMemberCount.Value; if (model.ApproximatePresenceCount.IsSpecified) ApproximatePresenceCount = model.ApproximatePresenceCount.Value; + if (model.IsBoostProgressBarEnabled.IsSpecified) + IsBoostProgressBarEnabled = model.IsBoostProgressBarEnabled.Value; if (model.Emojis != null) { diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 2f3ac4d904..0ab439ffd4 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -125,9 +125,10 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable public int? MaxVideoChannelUsers { get; private set; } /// public NsfwLevel NsfwLevel { get; private set; } - /// public CultureInfo PreferredCulture { get; private set; } + /// + public bool IsBoostProgressBarEnabled { get; private set; } /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -495,7 +496,8 @@ internal void Update(ClientState state, Model model) MaxVideoChannelUsers = model.MaxVideoChannelUsers.Value; PreferredLocale = model.PreferredLocale; PreferredCulture = PreferredLocale == null ? null : new CultureInfo(PreferredLocale); - + if (model.IsBoostProgressBarEnabled.IsSpecified) + IsBoostProgressBarEnabled = model.IsBoostProgressBarEnabled.Value; if (model.Emojis != null) { var emojis = ImmutableArray.CreateBuilder(model.Emojis.Length); @@ -1627,7 +1629,6 @@ internal async Task RepopulateAudioStreamsAsync() int? IGuild.ApproximatePresenceCount => null; /// IReadOnlyCollection IGuild.Stickers => Stickers; - /// async Task> IGuild.GetBansAsync(RequestOptions options) => await GetBansAsync(options).ConfigureAwait(false); From 9e4b085b26ee6d7a04d99c76132524f5e71d31a5 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Thu, 28 Oct 2021 16:06:11 -0300 Subject: [PATCH 445/494] Remove log for reconnect --- src/Discord.Net.WebSocket/ConnectionManager.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Discord.Net.WebSocket/ConnectionManager.cs b/src/Discord.Net.WebSocket/ConnectionManager.cs index 9a19f90f42..e444f359f6 100644 --- a/src/Discord.Net.WebSocket/ConnectionManager.cs +++ b/src/Discord.Net.WebSocket/ConnectionManager.cs @@ -185,11 +185,6 @@ public void Error(Exception ex) _readyPromise.TrySetException(ex); _connectionPromise.TrySetException(ex); _connectionCancelToken?.Cancel(); - - _ = Task.Run(async () => - { - await _logger.ErrorAsync($"Failed to start the connection: {ex}", ex); - }); } public void CriticalError(Exception ex) { From 650dd94fb31df8831bd0f2a14c7d1eaa0dd90ea1 Mon Sep 17 00:00:00 2001 From: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com> Date: Fri, 29 Oct 2021 13:01:55 -0500 Subject: [PATCH 446/494] Add missing flags to SystemChannelMessageDeny (#267) --- .../Entities/Guilds/GuildProperties.cs | 5 +++-- .../Entities/Guilds/SystemChannelMessageDeny.cs | 10 +++++++++- .../Extensions/GuildExtensions.cs | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs b/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs index 708ba4064b..d50b2ac383 100644 --- a/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs +++ b/src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs @@ -85,8 +85,9 @@ public class GuildProperties /// given that the has also been set. /// A value of will deny guild boost messages from being sent, and allow all /// other types of messages. - /// Refer to the extension methods and - /// to check if these system channel message types + /// Refer to the extension methods , + /// , , + /// and to check if these system channel message types /// are enabled, without the need to manipulate the logic of the flag. /// public Optional SystemChannelFlags { get; set; } diff --git a/src/Discord.Net.Core/Entities/Guilds/SystemChannelMessageDeny.cs b/src/Discord.Net.Core/Entities/Guilds/SystemChannelMessageDeny.cs index 3f69693d02..06de7b812e 100644 --- a/src/Discord.Net.Core/Entities/Guilds/SystemChannelMessageDeny.cs +++ b/src/Discord.Net.Core/Entities/Guilds/SystemChannelMessageDeny.cs @@ -17,6 +17,14 @@ public enum SystemChannelMessageDeny /// /// Deny the messages that are sent when a user boosts the guild. /// - GuildBoost = 0b10 + GuildBoost = 0b10, + /// + /// Deny the messages that are related to guild setup. + /// + GuildSetupTip = 0b100, + /// + /// Deny the reply with sticker button on welcome messages. + /// + WelcomeMessageReply = 0b1000 } } diff --git a/src/Discord.Net.Core/Extensions/GuildExtensions.cs b/src/Discord.Net.Core/Extensions/GuildExtensions.cs index 58b749cc4d..9dd8de82e7 100644 --- a/src/Discord.Net.Core/Extensions/GuildExtensions.cs +++ b/src/Discord.Net.Core/Extensions/GuildExtensions.cs @@ -20,5 +20,21 @@ public static bool GetWelcomeMessagesEnabled(this IGuild guild) /// A bool indicating if the guild boost messages are enabled in the system channel. public static bool GetGuildBoostMessagesEnabled(this IGuild guild) => !guild.SystemChannelFlags.HasFlag(SystemChannelMessageDeny.GuildBoost); + + /// + /// Gets if guild setup system messages are enabled. + /// + /// The guild to check. + /// A bool indicating if the guild setup messages are enabled in the system channel. + public static bool GetGuildSetupTipMessagesEnabled(this IGuild guild) + => !guild.SystemChannelFlags.HasFlag(SystemChannelMessageDeny.GuildSetupTip); + + /// + /// Gets if guild welcome messages have a reply with sticker button. + /// + /// The guild to check. + /// A bool indicating if the guild welcome messages have a reply with sticker button. + public static bool GetGuildWelcomeMessageReplyEnabled(this IGuild guild) + => !guild.SystemChannelFlags.HasFlag(SystemChannelMessageDeny.WelcomeMessageReply); } } From 3b57e1da34492b9babc2cd0a46dcdaee8abf7cc8 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 1 Nov 2021 14:30:03 -0300 Subject: [PATCH 447/494] Fix labs reference in analyzer project and provider project --- src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj | 1 - .../Discord.Net.Providers.WS4Net.csproj | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj index b28d9c2c12..feb7480d07 100644 --- a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj +++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj @@ -5,7 +5,6 @@ Discord.Analyzers A Discord.Net extension adding support for design-time analysis of the API usage. netstandard2.0;netstandard2.1 - Discord.Net.Labs.Analyzers ..\Discord.Net.Analyzers\Discord.Net.Analyzers.xml diff --git a/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj b/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj index ec7ee9b8f2..e143340e17 100644 --- a/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj +++ b/src/Discord.Net.Providers.WS4Net/Discord.Net.Providers.WS4Net.csproj @@ -3,9 +3,8 @@ Discord.Net.Providers.WS4Net Discord.Providers.WS4Net - An optional WebSocket client provider for Discord.Net Labs using WebSocket4Net + An optional WebSocket client provider for Discord.Net using WebSocket4Net netstandard2.0 - Discord.Net.Labs.Providers.WS4Net From 4a4f1bcb0c0689ecff6a60df72aab90d8abd40d2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 1 Nov 2021 15:04:40 -0300 Subject: [PATCH 448/494] Rename new activity flags --- .../Entities/Activities/ActivityProperties.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs b/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs index 587b21f03f..15a79dff67 100644 --- a/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs +++ b/src/Discord.Net.Core/Entities/Activities/ActivityProperties.cs @@ -37,14 +37,14 @@ public enum ActivityProperties /// /// Indicates that a user is playing an activity in a voice channel with friends. /// - PARTY_PRIVACY_FRIENDS = 0b1000000, + PartyPrivacyFriends = 0b1000000, /// /// Indicates that a user is playing an activity in a voice channel. /// - PARTY_PRIVACY_VOICE_CHANNEL = 0b10000000, + PartyPrivacyVoiceChannel = 0b10000000, /// /// Indicates that a user is playing an activity in a voice channel. /// - EMBEDDED = 0b10000000 + Embedded = 0b10000000 } } From bceeab2d0c05fa6fd5072acac92b8e1bf66571e4 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 1 Nov 2021 16:45:17 -0300 Subject: [PATCH 449/494] Guild feature revamp and smart gateway intent checks --- .../Entities/Guilds/GuildFeature.cs | 105 ++++++++++++++++++ .../Entities/Guilds/GuildFeatures.cs | 46 ++++++++ .../Entities/Guilds/IGuild.cs | 6 +- src/Discord.Net.Rest/API/Common/Guild.cs | 2 +- .../Entities/Channels/ThreadHelper.cs | 7 +- .../Entities/Guilds/RestGuild.cs | 11 +- .../Entities/Roles/RoleHelper.cs | 6 + .../Net/Converters/DiscordContractResolver.cs | 2 + .../Net/Converters/GuildFeaturesConverter.cs | 60 ++++++++++ .../DiscordSocketClient.cs | 14 +++ .../Entities/Guilds/SocketGuild.cs | 11 +- 11 files changed, 247 insertions(+), 23 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs create mode 100644 src/Discord.Net.Core/Entities/Guilds/GuildFeatures.cs create mode 100644 src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs b/src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs new file mode 100644 index 0000000000..e3c3252275 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Guilds/GuildFeature.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + [Flags] + public enum GuildFeature + { + /// + /// The guild has no features. + /// + None = 0, + /// + /// The guild has access to set an animated guild icon. + /// + AnimatedIcon = 1 << 0, + /// + /// The guild has access to set a guild banner image. + /// + Banner = 1 << 1, + /// + /// The guild has access to use commerce features (i.e. create store channels). + /// + Commerce = 1 << 2, + /// + /// The guild can enable welcome screen, Membership Screening, stage channels and discovery, and receives community updates. + /// + Community = 1 << 3, + /// + /// The guild is able to be discovered in the directory. + /// + Discoverable = 1 << 4, + /// + /// The guild is able to be featured in the directory. + /// + Featureable = 1 << 5, + /// + /// The guild has access to set an invite splash background. + /// + InviteSplash = 1 << 6, + /// + /// The guild has enabled Membership Screening. + /// + MemberVerificationGateEnabled = 1 << 7, + /// + /// The guild has enabled monetization. + /// + MonetizationEnabled = 1 << 8, + /// + /// The guild has increased custom sticker slots. + /// + MoreStickers = 1 << 9, + /// + /// The guild has access to create news channels. + /// + News = 1 << 10, + /// + /// The guild is partnered. + /// + Partnered = 1 << 11, + /// + /// The guild can be previewed before joining via Membership Screening or the directory. + /// + PreviewEnabled = 1 << 12, + /// + /// The guild has access to create private threads. + /// + PrivateThreads = 1 << 13, + /// + /// The guild is able to set role icons. + /// + RoleIcons = 1 << 14, + /// + /// The guild has access to the seven day archive time for threads. + /// + SevenDayThreadArchive = 1 << 15, + /// + /// The guild has access to the three day archive time for threads. + /// + ThreeDayThreadArchive = 1 << 16, + /// + /// The guild has enabled ticketed events. + /// + TicketedEventsEnabled = 1 << 17, + /// + /// The guild has access to set a vanity URL. + /// + VanityUrl = 1 << 18, + /// + /// The guild is verified. + /// + Verified = 1 << 19, + /// + /// The guild has access to set 384kbps bitrate in voice (previously VIP voice servers). + /// + VIPRegions = 1 << 20, + /// + /// The guild has enabled the welcome screen. + /// + WelcomeScreenEnabled = 1 << 21, + } +} diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildFeatures.cs b/src/Discord.Net.Core/Entities/Guilds/GuildFeatures.cs new file mode 100644 index 0000000000..699e47cf35 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Guilds/GuildFeatures.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public class GuildFeatures + { + /// + /// Gets the flags of recognized features for this guild. + /// + public GuildFeature Value { get; } + + /// + /// Gets a collection of experimental features for this guild. + /// + public IReadOnlyCollection Experimental { get; } + + + internal GuildFeatures(GuildFeature value, string[] experimental) + { + Value = value; + Experimental = experimental.ToImmutableArray(); + } + + public bool HasFeature(GuildFeature feature) + => Value.HasFlag(feature); + public bool HasFeature(string feature) + => Experimental.Contains(feature); + + internal void EnsureFeature(GuildFeature feature) + { + if (!HasFeature(feature)) + { + var vals = Enum.GetValues(typeof(GuildFeature)).Cast(); + + var missingValues = vals.Where(x => feature.HasFlag(x) && !Value.HasFlag(x)); + + throw new InvalidOperationException($"Missing required guild feature{(missingValues.Count() > 1 ? "s" : "")} {string.Join(", ", missingValues.Select(x => x.ToString()))} in order to execute this operation."); + } + } + } +} diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index fe8fe43f07..fa76cc360b 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -207,12 +207,12 @@ public interface IGuild : IDeletable, ISnowflakeEntity /// IReadOnlyCollection Stickers { get; } /// - /// Gets a collection of all extra features added to this guild. + /// Gets the features for this guild. /// /// - /// A read-only collection of enabled features in this guild. + /// A flags enum containing all the features for the guild. /// - IReadOnlyCollection Features { get; } + GuildFeatures Features { get; } /// /// Gets a collection of all roles in this guild. /// diff --git a/src/Discord.Net.Rest/API/Common/Guild.cs b/src/Discord.Net.Rest/API/Common/Guild.cs index 39516f188c..d550c54a0b 100644 --- a/src/Discord.Net.Rest/API/Common/Guild.cs +++ b/src/Discord.Net.Rest/API/Common/Guild.cs @@ -35,7 +35,7 @@ internal class Guild [JsonProperty("emojis")] public Emoji[] Emojis { get; set; } [JsonProperty("features")] - public string[] Features { get; set; } + public GuildFeatures Features { get; set; } [JsonProperty("mfa_level")] public MfaLevel MfaLevel { get; set; } [JsonProperty("application_id")] diff --git a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs index 69eb0d7681..4c2bec8e23 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs @@ -11,13 +11,14 @@ internal static class ThreadHelper public static async Task CreateThreadAsync(BaseDiscordClient client, ITextChannel channel, string name, ThreadType type = ThreadType.PublicThread, ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) { - if (autoArchiveDuration == ThreadArchiveDuration.OneWeek && !channel.Guild.Features.Contains("SEVEN_DAY_THREAD_ARCHIVE")) + var features = channel.Guild.Features; + if (autoArchiveDuration == ThreadArchiveDuration.OneWeek && !features.HasFeature(GuildFeature.SevenDayThreadArchive)) throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); - if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !channel.Guild.Features.Contains("THREE_DAY_THREAD_ARCHIVE")) + if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !features.HasFeature(GuildFeature.ThreeDayThreadArchive)) throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); - if (type == ThreadType.PrivateThread && !channel.Guild.Features.Contains("PRIVATE_THREADS")) + if (type == ThreadType.PrivateThread && !features.HasFeature(GuildFeature.PrivateThreads)) throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!", nameof(type)); var args = new StartThreadParams diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 4767647152..26dc8f3b7b 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -22,7 +22,6 @@ public class RestGuild : RestEntity, IGuild, IUpdateable private ImmutableDictionary _roles; private ImmutableArray _emotes; private ImmutableArray _stickers; - private ImmutableArray _features; /// public string Name { get; private set; } @@ -90,9 +89,10 @@ public class RestGuild : RestEntity, IGuild, IUpdateable public NsfwLevel NsfwLevel { get; private set; } /// public bool IsBoostProgressBarEnabled { get; private set; } - /// public CultureInfo PreferredCulture { get; private set; } + /// + public GuildFeatures Features { get; private set; } /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -118,8 +118,6 @@ public class RestGuild : RestEntity, IGuild, IUpdateable /// public IReadOnlyCollection Emotes => _emotes; public IReadOnlyCollection Stickers => _stickers; - /// - public IReadOnlyCollection Features => _features; internal RestGuild(BaseDiscordClient client, ulong id) : base(client, id) @@ -185,10 +183,7 @@ internal void Update(Model model) else _emotes = ImmutableArray.Create(); - if (model.Features != null) - _features = model.Features.ToImmutableArray(); - else - _features = ImmutableArray.Create(); + Features = model.Features; var roles = ImmutableDictionary.CreateBuilder(); if (model.Roles != null) diff --git a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs index 1211ec40b9..d8552f869d 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RoleHelper.cs @@ -18,6 +18,12 @@ public static async Task ModifyAsync(IRole role, BaseDiscordClient client { var args = new RoleProperties(); func(args); + + if (args.Icon.IsSpecified) + { + role.Guild.Features.EnsureFeature(GuildFeature.RoleIcons); + } + var apiArgs = new API.Rest.ModifyGuildRoleParams { Color = args.Color.IsSpecified ? args.Color.Value.RawValue : Optional.Create(), diff --git a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs index feea164f9f..6fe44bf4e9 100644 --- a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs +++ b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs @@ -87,6 +87,8 @@ private static JsonConverter GetConverter(JsonProperty property, PropertyInfo pr return MessageComponentConverter.Instance; if (type == typeof(API.Interaction)) return InteractionConverter.Instance; + if (type == typeof(GuildFeatures)) + return GuildFeaturesConverter.Instance; //Entities var typeInfo = type.GetTypeInfo(); diff --git a/src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs b/src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs new file mode 100644 index 0000000000..9f82b440b1 --- /dev/null +++ b/src/Discord.Net.Rest/Net/Converters/GuildFeaturesConverter.cs @@ -0,0 +1,60 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Discord.Net.Converters +{ + internal class GuildFeaturesConverter : JsonConverter + { + public static GuildFeaturesConverter Instance + => new GuildFeaturesConverter(); + + public override bool CanConvert(Type objectType) => true; + public override bool CanWrite => false; + public override bool CanRead => true; + + + private Regex _readRegex = new Regex(@"_(\w)"); + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var obj = JToken.Load(reader); + var arr = obj.ToObject(); + + GuildFeature features = GuildFeature.None; + List experimental = new(); + + foreach(var item in arr) + { + var name = _readRegex.Replace(item.ToLower(), (x) => + { + return x.Groups[1].Value.ToUpper(); + }); + + name = name[0].ToString().ToUpper() + new string(name.Skip(1).ToArray()); + + try + { + var result = (GuildFeature)Enum.Parse(typeof(GuildFeature), name); + + features |= result; + } + catch + { + experimental.Add(item); + } + } + + return new GuildFeatures(features, experimental.ToArray()); + } + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 07303873dc..66a614980f 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -572,6 +572,8 @@ public override async Task DownloadUsersAsync(IEnumerable guilds) { if (ConnectionState == ConnectionState.Connected) { + EnsureGatewayIntent(GatewayIntents.GuildMembers); + //Race condition leads to guilds being requested twice, probably okay await ProcessUserDownloadsAsync(guilds.Select(x => GetGuild(x.Id)).Where(x => x != null)).ConfigureAwait(false); } @@ -2717,6 +2719,18 @@ internal void RemoveDMChannels() channel.Recipient.GlobalUser.RemoveRef(this); } + internal void EnsureGatewayIntent(GatewayIntents intents) + { + if (!_gatewayIntents.HasFlag(intents)) + { + var vals = Enum.GetValues(typeof(GatewayIntents)).Cast(); + + var missingValues = vals.Where(x => intents.HasFlag(x) && !_gatewayIntents.HasFlag(x)); + + throw new InvalidOperationException($"Missing required gateway intent{(missingValues.Count() > 1 ? "s" : "")} {string.Join(", ", missingValues.Select(x => x.ToString()))} in order to execute this operation."); + } + } + private async Task GuildAvailableAsync(SocketGuild guild) { if (!guild.IsConnected) diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 0ab439ffd4..e190f9b23c 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -42,7 +42,6 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable private ConcurrentDictionary _stickers; private ImmutableArray _emotes; - private ImmutableArray _features; private AudioClient _audioClient; #pragma warning restore IDISP002, IDISP006 @@ -129,6 +128,8 @@ public class SocketGuild : SocketEntity, IGuild, IDisposable public CultureInfo PreferredCulture { get; private set; } /// public bool IsBoostProgressBarEnabled { get; private set; } + /// + public GuildFeatures Features { get; private set; } /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); @@ -333,8 +334,6 @@ public IReadOnlyCollection Channels /// public IReadOnlyCollection Stickers => _stickers.Select(x => x.Value).ToImmutableArray(); - /// - public IReadOnlyCollection Features => _features; /// /// Gets a collection of users in this guild. /// @@ -370,7 +369,6 @@ internal SocketGuild(DiscordSocketClient client, ulong id) { _audioLock = new SemaphoreSlim(1, 1); _emotes = ImmutableArray.Create(); - _features = ImmutableArray.Create(); } internal static SocketGuild Create(DiscordSocketClient discord, ClientState state, ExtendedModel model) { @@ -508,10 +506,7 @@ internal void Update(ClientState state, Model model) else _emotes = ImmutableArray.Create(); - if (model.Features != null) - _features = model.Features.ToImmutableArray(); - else - _features = ImmutableArray.Create(); + Features = model.Features; var roles = new ConcurrentDictionary(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.Roles.Length * 1.05)); if (model.Roles != null) From 4ceccbe9a3bf855778244ecc3ff85668388f33d2 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 1 Nov 2021 18:13:02 -0300 Subject: [PATCH 450/494] Get thread user implementation --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 14 +++++++++++++- .../Entities/Channels/ThreadHelper.cs | 6 +++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 48fafd090e..75a0118d31 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -525,7 +525,19 @@ public async Task ListThreadMembersAsync(ulong channelId, Reques var bucket = new BucketIds(channelId: channelId); - return await SendAsync("GET", () => $"channels/{channelId}/thread-members", bucket, options: options); + return await SendAsync("GET", () => $"channels/{channelId}/thread-members", bucket, options: options).ConfigureAwait(false); + } + + public async Task GetThreadMemberAsync(ulong channelId, ulong userId, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + Preconditions.NotEqual(userId, 0, nameof(userId)); + + options = RequestOptions.CreateOrClone(options); + + var bucket = new BucketIds(channelId: channelId); + + return await SendAsync("GET", () => $"channels/{channelId}/thread-members/{userId}", bucket, options: options).ConfigureAwait(false); } public async Task GetActiveThreadsAsync(ulong channelId, RequestOptions options = null) diff --git a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs index 4c2bec8e23..8537e887c3 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs @@ -63,6 +63,10 @@ public static async Task GetUsersAsync(IThreadChannel channel, } public static async Task GetUserAsync(ulong userId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) - => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userId); + { + var model = await client.ApiClient.GetThreadMemberAsync(channel.Id, userId, options).ConfigureAwait(false); + + return RestThreadUser.Create(client, channel.Guild, model, channel); + } } } From ef4aa6236332753eaa0001e458e6068cf687a73d Mon Sep 17 00:00:00 2001 From: KeylAmi Date: Wed, 3 Nov 2021 15:06:27 -0700 Subject: [PATCH 451/494] Amend creating slash command guide (#269) * Adding BotHTTPInteraction user flag * Added comments explaining the Global command create stipulations. --- .../slash-commands/02-creating-slash-commands.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md index 1abab1a258..9e35de285a 100644 --- a/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md +++ b/docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md @@ -79,6 +79,8 @@ public async Task Client_Ready() // With global commands we dont need the guild. await client.CreateGlobalApplicationCommandAsync(globalCommand.Build()); + // Using the ready event is a simple implementation for the sake of the example. Suitable for testing and development. + // For a production bot, it is recommended to only run the CreateGlobalApplicationCommandAsync() once for each command. } catch(ApplicationCommandException exception) { @@ -93,4 +95,4 @@ public async Task Client_Ready() ``` > [!NOTE] -> Slash 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 slash commands. +> Slash 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 slash commands. The global commands take up to an hour to register every time the CreateGlobalApplicationCommandAsync() is called for a given command. From 8439019f927f022b06744732a90e8c3e09f1b882 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 7 Nov 2021 01:06:23 -0400 Subject: [PATCH 452/494] Fix numeric type check for options --- .../ApplicationCommandOptionChoice.cs | 4 +-- .../Extensions/ObjectExtensions.cs | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/Discord.Net.Core/Extensions/ObjectExtensions.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs index 8b8b5a3aa6..9d85c917a6 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs @@ -34,8 +34,8 @@ public object Value get => _value; set { - if (value != null && value is not int && value is not string) - throw new ArgumentException("The value of a choice must be a string or int!"); + if (value != null && value is not string && !value.IsNumericType()) + throw new ArgumentException("The value of a choice must be a string or a numeric type!"); _value = value; } } diff --git a/src/Discord.Net.Core/Extensions/ObjectExtensions.cs b/src/Discord.Net.Core/Extensions/ObjectExtensions.cs new file mode 100644 index 0000000000..240fb47aa8 --- /dev/null +++ b/src/Discord.Net.Core/Extensions/ObjectExtensions.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + internal static class ObjectExtensions + { + public static bool IsNumericType(this object o) + { + switch (Type.GetTypeCode(o.GetType())) + { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Decimal: + case TypeCode.Double: + case TypeCode.Single: + return true; + default: + return false; + } + } + } +} From 8abc9b436016899fb7ef660d64924e8a26aa7c81 Mon Sep 17 00:00:00 2001 From: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com> Date: Sun, 7 Nov 2021 20:11:19 -0600 Subject: [PATCH 453/494] Add state checking to ConnectionManager.StartAsync (#272) --- src/Discord.Net.WebSocket/ConnectionManager.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Discord.Net.WebSocket/ConnectionManager.cs b/src/Discord.Net.WebSocket/ConnectionManager.cs index e444f359f6..f304d4ea84 100644 --- a/src/Discord.Net.WebSocket/ConnectionManager.cs +++ b/src/Discord.Net.WebSocket/ConnectionManager.cs @@ -57,6 +57,9 @@ internal ConnectionManager(SemaphoreSlim stateLock, Logger logger, int connectio public virtual async Task StartAsync() { + if (State != ConnectionState.Disconnected) + throw new InvalidOperationException("Cannot start an already running client."); + await AcquireConnectionLock().ConfigureAwait(false); var reconnectCancelToken = new CancellationTokenSource(); _reconnectCancelToken?.Dispose(); From c349643a175ee1d0ea08de1344b9c2e823124a76 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Sun, 7 Nov 2021 23:04:38 -0400 Subject: [PATCH 454/494] initial interface changes --- .../Entities/Channels/IMessageChannel.cs | 60 ++++++++++++++ .../Entities/Messages/FileAttachment.cs | 80 +++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 src/Discord.Net.Core/Entities/Messages/FileAttachment.cs diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index 95507d2976..8da7dba793 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -113,6 +113,66 @@ public interface IMessageChannel : IChannel /// contains the sent message. /// Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); + /// + /// Sends a file to this message channel with an optional caption. + /// + /// + /// This method sends a file as if you are uploading an attachment directly from your Discord client. + /// + /// If you wish to upload an image and have it embedded in a embed, + /// you may upload the file and refer to the file with "attachment://filename.ext" in the + /// . See the example section for its usage. + /// + /// + /// The attachment containing the file and description. + /// The message to be sent. + /// Whether the message should be read aloud by Discord or not. + /// The to be sent. + /// The options to be used when sending the request. + /// Whether the message attachment should be hidden as a spoiler. + /// + /// Specifies if notifications are sent for mentioned users and roles in the message . + /// If null, all mentioned roles and users will be notified. + /// + /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions. + /// A collection of stickers to send with the file. + /// A array of s to send with this response. Max 10. + /// + /// A task that represents an asynchronous send operation for delivering the message. The task result + /// contains the sent message. + /// + Task SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); + /// + /// Sends a collection of files to this message channel. + /// + /// + /// This method sends files as if you are uploading attachments directly from your Discord client. + /// + /// If you wish to upload an image and have it embedded in a embed, + /// you may upload the file and refer to the file with "attachment://filename.ext" in the + /// . See the example section for its usage. + /// + /// + /// A collection of attachments to upload. + /// The message to be sent. + /// Whether the message should be read aloud by Discord or not. + /// The to be sent. + /// The options to be used when sending the request. + /// Whether the message attachment should be hidden as a spoiler. + /// + /// Specifies if notifications are sent for mentioned users and roles in the message . + /// If null, all mentioned roles and users will be notified. + /// + /// The message references to be included. Used to reply to specific messages. + /// The message components to be included with this message. Used for interactions. + /// A collection of stickers to send with the file. + /// A array of s to send with this response. Max 10. + /// + /// A task that represents an asynchronous send operation for delivering the message. The task result + /// contains the sent message. + /// + Task SendFilesAsync(IEnumerable attachments, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Core/Entities/Messages/FileAttachment.cs b/src/Discord.Net.Core/Entities/Messages/FileAttachment.cs new file mode 100644 index 0000000000..d7b7b8155f --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/FileAttachment.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + public struct FileAttachment : IDisposable + { + public string FileName { get; set; } + public string Description { get; set; } + +#pragma warning disable IDISP008 + public Stream Stream { get; } +#pragma warning restore IDISP008 + + private bool _isDisposed; + + /// + /// Creates a file attachment from a stream. + /// + /// The stream to create the attachment from. + /// The name of the attachment. + /// The description of the attachment. + public FileAttachment(Stream stream, string fileName, string description = null) + { + _isDisposed = false; + FileName = fileName; + Description = description; + Stream = stream; + } + + /// + /// Create the file attachment from a file path. + /// + /// + /// This file path is NOT validated and is passed directly into a + /// . + /// + /// The path to the file. + /// + /// is a zero-length string, contains only white space, or contains one or more invalid + /// characters as defined by . + /// + /// is null. + /// + /// The specified path, file name, or both exceed the system-defined maximum length. For example, on + /// Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 + /// characters. + /// + /// is in an invalid format. + /// + /// The specified is invalid, (for example, it is on an unmapped drive). + /// + /// + /// specified a directory.-or- The caller does not have the required permission. + /// + /// The file specified in was not found. + /// + /// An I/O error occurred while opening the file. + public FileAttachment(string path, string description = null) + { + _isDisposed = false; + Stream = File.OpenRead(path); + FileName = Path.GetFileName(path); + Description = description; + } + + public void Dispose() + { + if (!_isDisposed) + { + Stream?.Dispose(); + _isDisposed = true; + } + } + } +} From fd28b615db81faa47f351e8d2742935074eaa382 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 9 Nov 2021 01:20:08 -0400 Subject: [PATCH 455/494] Multi file upload + attachment editing --- .../Entities/Channels/IMessageChannel.cs | 6 +- .../Entities/Messages/FileAttachment.cs | 7 +- .../Entities/Messages/MessageProperties.cs | 7 ++ src/Discord.Net.Rest/API/Common/Attachment.cs | 4 + .../API/Rest/UploadFileParams.cs | 41 ++++--- src/Discord.Net.Rest/DiscordRestApiClient.cs | 13 +++ .../Entities/Channels/ChannelHelper.cs | 21 +++- .../Entities/Channels/RestDMChannel.cs | 16 +++ .../Entities/Channels/RestGroupChannel.cs | 14 ++- .../Entities/Channels/RestTextChannel.cs | 19 ++++ .../Entities/Messages/MessageHelper.cs | 101 +++++------------- .../Entities/Channels/SocketDMChannel.cs | 15 +++ .../Entities/Channels/SocketGroupChannel.cs | 15 +++ .../Entities/Channels/SocketTextChannel.cs | 16 +++ .../MockedEntities/MockedDMChannel.cs | 2 + .../MockedEntities/MockedGroupChannel.cs | 3 + .../MockedEntities/MockedTextChannel.cs | 2 + 17 files changed, 206 insertions(+), 96 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs index 8da7dba793..87dfb34606 100644 --- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs @@ -129,7 +129,6 @@ public interface IMessageChannel : IChannel /// Whether the message should be read aloud by Discord or not. /// The to be sent. /// The options to be used when sending the request. - /// Whether the message attachment should be hidden as a spoiler. /// /// Specifies if notifications are sent for mentioned users and roles in the message . /// If null, all mentioned roles and users will be notified. @@ -142,7 +141,7 @@ public interface IMessageChannel : IChannel /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); + Task SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Sends a collection of files to this message channel. /// @@ -159,7 +158,6 @@ public interface IMessageChannel : IChannel /// Whether the message should be read aloud by Discord or not. /// The to be sent. /// The options to be used when sending the request. - /// Whether the message attachment should be hidden as a spoiler. /// /// Specifies if notifications are sent for mentioned users and roles in the message . /// If null, all mentioned roles and users will be notified. @@ -172,7 +170,7 @@ public interface IMessageChannel : IChannel /// A task that represents an asynchronous send operation for delivering the message. The task result /// contains the sent message. /// - Task SendFilesAsync(IEnumerable attachments, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); + Task SendFilesAsync(IEnumerable attachments, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null); /// /// Gets a message from this message channel. diff --git a/src/Discord.Net.Core/Entities/Messages/FileAttachment.cs b/src/Discord.Net.Core/Entities/Messages/FileAttachment.cs index d7b7b8155f..dc54378611 100644 --- a/src/Discord.Net.Core/Entities/Messages/FileAttachment.cs +++ b/src/Discord.Net.Core/Entities/Messages/FileAttachment.cs @@ -11,6 +11,7 @@ public struct FileAttachment : IDisposable { public string FileName { get; set; } public string Description { get; set; } + public bool IsSpoiler { get; set; } #pragma warning disable IDISP008 public Stream Stream { get; } @@ -24,12 +25,13 @@ public struct FileAttachment : IDisposable /// The stream to create the attachment from. /// The name of the attachment. /// The description of the attachment. - public FileAttachment(Stream stream, string fileName, string description = null) + public FileAttachment(Stream stream, string fileName, string description = null, bool isSpoiler = false) { _isDisposed = false; FileName = fileName; Description = description; Stream = stream; + IsSpoiler = isSpoiler; } /// @@ -60,12 +62,13 @@ public FileAttachment(Stream stream, string fileName, string description = null) /// The file specified in was not found. /// /// An I/O error occurred while opening the file. - public FileAttachment(string path, string description = null) + public FileAttachment(string path, string description = null, bool isSpoiler = false) { _isDisposed = false; Stream = File.OpenRead(path); FileName = Path.GetFileName(path); Description = description; + IsSpoiler = isSpoiler; } public void Dispose() diff --git a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs index abd09d8562..1a4eaff2d1 100644 --- a/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs +++ b/src/Discord.Net.Core/Entities/Messages/MessageProperties.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace Discord { /// @@ -48,5 +50,10 @@ public class MessageProperties /// Gets or sets the allowed mentions of the message. /// public Optional AllowedMentions { get; set; } + + /// + /// Gets or sets the attachments for the message. + /// + public Optional> Attachments { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/Attachment.cs b/src/Discord.Net.Rest/API/Common/Attachment.cs index 0d98fc3a4a..7970dc9a5c 100644 --- a/src/Discord.Net.Rest/API/Common/Attachment.cs +++ b/src/Discord.Net.Rest/API/Common/Attachment.cs @@ -8,6 +8,10 @@ internal class Attachment public ulong Id { get; set; } [JsonProperty("filename")] public string Filename { get; set; } + [JsonProperty("description")] + public Optional Description { get; set; } + [JsonProperty("content_type")] + public Optional ContentType { get; set; } [JsonProperty("size")] public int Size { get; set; } [JsonProperty("url")] diff --git a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs index 98fb0e7ca3..6340c3e389 100644 --- a/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs +++ b/src/Discord.Net.Rest/API/Rest/UploadFileParams.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; namespace Discord.API.Rest @@ -11,9 +12,8 @@ internal class UploadFileParams { private static JsonSerializer _serializer = new JsonSerializer { ContractResolver = new DiscordContractResolver() }; - public Stream File { get; } + public FileAttachment[] Files { get; } - public Optional Filename { get; set; } public Optional Content { get; set; } public Optional Nonce { get; set; } public Optional IsTTS { get; set; } @@ -21,22 +21,18 @@ internal class UploadFileParams public Optional AllowedMentions { get; set; } public Optional MessageReference { get; set; } public Optional MessageComponent { get; set; } + public Optional Flags { get; set; } public Optional Stickers { get; set; } - public bool IsSpoiler { get; set; } = false; - public UploadFileParams(Stream file) + public UploadFileParams(params Discord.FileAttachment[] attachments) { - File = file; + Files = attachments; } public IReadOnlyDictionary ToDictionary() { var d = new Dictionary(); - var filename = Filename.GetValueOrDefault("unknown.dat"); - if (IsSpoiler && !filename.StartsWith(AttachmentExtensions.SpoilerPrefix)) - filename = filename.Insert(0, AttachmentExtensions.SpoilerPrefix); - d["file"] = new MultipartFile(File, filename); - + var payload = new Dictionary(); if (Content.IsSpecified) payload["content"] = Content.Value; @@ -50,12 +46,33 @@ public IReadOnlyDictionary ToDictionary() payload["allowed_mentions"] = AllowedMentions.Value; if (MessageComponent.IsSpecified) payload["components"] = MessageComponent.Value; - if (IsSpoiler) - payload["hasSpoiler"] = IsSpoiler.ToString(); if (MessageReference.IsSpecified) payload["message_reference"] = MessageReference.Value; if (Stickers.IsSpecified) payload["sticker_ids"] = Stickers.Value; + if (Flags.IsSpecified) + payload["flags"] = Flags; + + List attachments = new(); + + for(int n = 0; n != Files.Length; n++) + { + var attachment = Files[n]; + + var filename = attachment.FileName ?? "unknown.dat"; + if (attachment.IsSpoiler && !filename.StartsWith(AttachmentExtensions.SpoilerPrefix)) + filename = filename.Insert(0, AttachmentExtensions.SpoilerPrefix); + d[$"files[{n}]"] = new MultipartFile(attachment.Stream, filename); + + attachments.Add(new + { + id = (ulong)n, + filename = filename, + description = attachment.Description ?? Optional.Unspecified + }); + } + + payload["attachments"] = attachments; var json = new StringBuilder(); using (var text = new StringWriter(json)) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 75a0118d31..ff150e6011 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -914,6 +914,19 @@ public async Task ModifyMessageAsync(ulong channelId, ulong messageId, var ids = new BucketIds(channelId: channelId); return await SendJsonAsync("PATCH", () => $"channels/{channelId}/messages/{messageId}", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); } + + public async Task ModifyMessageAsync(ulong channelId, ulong messageId, Rest.UploadFileParams args, RequestOptions options = null) + { + Preconditions.NotEqual(channelId, 0, nameof(channelId)); + Preconditions.NotEqual(messageId, 0, nameof(messageId)); + Preconditions.NotNull(args, nameof(args)); + if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize) + throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); + options = RequestOptions.CreateOrClone(options); + + var ids = new BucketIds(channelId: channelId); + return await SendMultipartAsync("PATCH", () => $"channels/{channelId}/messages/{messageId}", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); + } #endregion #region Stickers, Reactions, Crosspost, and Acks diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index d02e273de9..31f6a4d45f 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -343,8 +343,19 @@ public static async Task SendFileAsync(IMessageChannel channel, } /// Message content is too long, length must be less or equal to . - public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, + public static Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, Stream stream, string filename, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, bool isSpoiler, Embed[] embeds) + { + return SendFileAsync(channel, client, new FileAttachment(stream, filename, isSpoiler: isSpoiler), text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + } + + /// Message content is too long, length must be less or equal to . + public static Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client, + FileAttachment attachment, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, Embed[] embeds) + => SendFilesAsync(channel, client, new[] { attachment }, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + + public static async Task SendFilesAsync(IMessageChannel channel, BaseDiscordClient client, + IEnumerable attachments, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, RequestOptions options, Embed[] embeds) { embeds ??= Array.Empty(); if (embed != null) @@ -353,7 +364,11 @@ public static async Task SendFileAsync(IMessageChannel channel, Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed."); - Preconditions.NotNullOrEmpty(filename, nameof(filename), "File Name must not be empty or null"); + + foreach(var attachment in attachments) + { + Preconditions.NotNullOrEmpty(attachment.FileName, nameof(attachment.FileName), "File Name must not be empty or null"); + } // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) @@ -376,7 +391,7 @@ public static async Task SendFileAsync(IMessageChannel channel, Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed."); } - var args = new UploadFileParams(stream) { Filename = filename, Content = text, IsTTS = isTTS, Embeds = embeds.Any() ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, IsSpoiler = isSpoiler, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified }; + var args = new UploadFileParams(attachments.ToArray()) { Content = text, IsTTS = isTTS, Embeds = embeds.Any() ? embeds.Select(x => x.ToModel()).ToArray() : Optional.Unspecified, AllowedMentions = allowedMentions?.ToModel() ?? Optional.Unspecified, MessageReference = messageReference?.ToModel() ?? Optional.Unspecified, MessageComponent = component?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Optional.Unspecified, Stickers = stickers?.Any() ?? false ? stickers.Select(x => x.Id).ToArray() : Optional.Unspecified }; var model = await client.ApiClient.UploadFileAsync(channel.Id, args, options).ConfigureAwait(false); return RestUserMessage.Create(client, channel, client.CurrentUser, model); } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index 922f128b91..1b91c6e629 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -129,6 +129,16 @@ public Task SendFileAsync(string filePath, string text, bool is public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); + /// + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(FileAttachment attachment, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, attachment, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + + /// + /// Message content is too long, length must be less or equal to . + public Task SendFilesAsync(IEnumerable attachments, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFilesAsync(this, Discord, attachments, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); @@ -215,6 +225,12 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// + async Task IMessageChannel.SendFileAsync(FileAttachment attachment, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(attachment, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// + async Task IMessageChannel.SendFilesAsync(IEnumerable attachments, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFilesAsync(attachments, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index aa7291ca65..83ff3f558b 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -134,7 +134,14 @@ public Task SendFileAsync(string filePath, string text, bool is /// Message content is too long, length must be less or equal to . public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); - + /// + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(FileAttachment attachment, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, attachment, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + /// + /// Message content is too long, length must be less or equal to . + public Task SendFilesAsync(IEnumerable attachments, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFilesAsync(this, Discord, attachments, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// public Task TriggerTypingAsync(RequestOptions options = null) => ChannelHelper.TriggerTypingAsync(this, Discord, options); @@ -191,7 +198,10 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); - + async Task IMessageChannel.SendFileAsync(FileAttachment attachment, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(attachment, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + async Task IMessageChannel.SendFilesAsync(IEnumerable attachments, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFilesAsync(attachments, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index 6fb7de9843..38c64ea56f 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -139,6 +139,16 @@ public Task SendFileAsync(string filePath, string text, bool is public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); + /// + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(FileAttachment attachment, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, attachment, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + + /// + /// Message content is too long, length must be less or equal to . + public Task SendFilesAsync(IEnumerable attachments, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFilesAsync(this, Discord, attachments, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); @@ -325,6 +335,15 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t /// async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + + /// + async Task IMessageChannel.SendFileAsync(FileAttachment attachment, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(attachment, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + + /// + async Task IMessageChannel.SendFilesAsync(IEnumerable attachments, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFilesAsync(attachments, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 6b9e134c1c..309500c961 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -25,71 +25,9 @@ internal static class MessageHelper /// Only the author of a message may modify the message. /// Message content is too long, length must be less or equal to . - public static async Task ModifyAsync(IMessage msg, BaseDiscordClient client, Action func, + public static Task ModifyAsync(IMessage msg, BaseDiscordClient client, Action func, RequestOptions options) - { - var args = new MessageProperties(); - func(args); - - if (msg.Author.Id != client.CurrentUser.Id && (args.Content.IsSpecified || args.Embeds.IsSpecified || args.AllowedMentions.IsSpecified)) - throw new InvalidOperationException("Only the author of a message may modify the message content, embed, or allowed mentions."); - - var embed = args.Embed; - var embeds = args.Embeds; - - bool hasText = args.Content.IsSpecified ? !string.IsNullOrEmpty(args.Content.Value) : !string.IsNullOrEmpty(msg.Content); - bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0 || msg.Embeds.Any(); - - if (!hasText && !hasEmbeds) - Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); - - if (args.AllowedMentions.IsSpecified) - { - AllowedMentions allowedMentions = args.AllowedMentions.Value; - Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed."); - Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed."); - - // check that user flag and user Id list are exclusive, same with role flag and role Id list - if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) - { - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Users) && - allowedMentions.UserIds != null && allowedMentions.UserIds.Count > 0) - { - throw new ArgumentException("The Users flag is mutually exclusive with the list of User Ids.", nameof(allowedMentions)); - } - - if (allowedMentions.AllowedTypes.Value.HasFlag(AllowedMentionTypes.Roles) && - allowedMentions.RoleIds != null && allowedMentions.RoleIds.Count > 0) - { - throw new ArgumentException("The Roles flag is mutually exclusive with the list of Role Ids.", nameof(allowedMentions)); - } - } - } - - var apiEmbeds = embed.IsSpecified || embeds.IsSpecified ? new List() : null; - - if (embed.IsSpecified && embed.Value != null) - { - apiEmbeds.Add(embed.Value.ToModel()); - } - - if (embeds.IsSpecified && embeds.Value != null) - { - apiEmbeds.AddRange(embeds.Value.Select(x => x.ToModel())); - } - - Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); - - var apiArgs = new ModifyMessageParams - { - Content = args.Content, - Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, - Flags = args.Flags, - AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Unspecified, - }; - return await client.ApiClient.ModifyMessageAsync(msg.Channel.Id, msg.Id, apiArgs, options).ConfigureAwait(false); - } + => ModifyAsync(msg.Channel.Id, msg.Id, client, func, options); public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDiscordClient client, Action func, RequestOptions options) @@ -103,8 +41,9 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi bool hasText = args.Content.IsSpecified && string.IsNullOrEmpty(args.Content.Value); bool hasEmbeds = embed.IsSpecified && embed.Value != null || embeds.IsSpecified && embeds.Value?.Length > 0; bool hasComponents = args.Components.IsSpecified && args.Components.Value != null; + bool hasAttachments = args.Attachments.IsSpecified; - if (!hasComponents && !hasText && !hasEmbeds) + if (!hasComponents && !hasText && !hasEmbeds && !hasAttachments) Preconditions.NotNullOrEmpty(args.Content.IsSpecified ? args.Content.Value : string.Empty, nameof(args.Content)); if (args.AllowedMentions.IsSpecified) @@ -145,15 +84,31 @@ public static async Task ModifyAsync(ulong channelId, ulong msgId, BaseDi Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); - var apiArgs = new API.Rest.ModifyMessageParams + if(!args.Attachments.IsSpecified) + { + var apiArgs = new API.Rest.ModifyMessageParams + { + Content = args.Content, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, + Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), + Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, + }; + return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); + } + else { - Content = args.Content, - Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, - Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), - AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), - Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified, - }; - return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); + var apiArgs = new UploadFileParams(args.Attachments.Value.ToArray()) + { + Content = args.Content, + Embeds = apiEmbeds?.ToArray() ?? Optional.Unspecified, + Flags = args.Flags.IsSpecified ? args.Flags.Value : Optional.Create(), + AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional.Create(), + MessageComponent = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() ?? Array.Empty() : Optional.Unspecified + }; + + return await client.ApiClient.ModifyMessageAsync(channelId, msgId, apiArgs, options).ConfigureAwait(false); + } } public static Task DeleteAsync(IMessage msg, BaseDiscordClient client, RequestOptions options) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs index a298d352a8..ea00c9e03a 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs @@ -150,6 +150,15 @@ public Task SendFileAsync(string filePath, string text, bool is public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); /// + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(FileAttachment attachment, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, attachment, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + /// + /// Message content is too long, length must be less or equal to . + public Task SendFilesAsync(IEnumerable attachments, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFilesAsync(this, Discord, attachments, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + + /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) => ChannelHelper.DeleteMessageAsync(this, messageId, Discord, options); /// @@ -252,6 +261,12 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// + async Task IMessageChannel.SendFileAsync(FileAttachment attachment, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(attachment, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// + async Task IMessageChannel.SendFilesAsync(IEnumerable attachments, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFilesAsync(attachments, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index 2fd748faa6..7c9b4be477 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -183,6 +183,14 @@ public Task SendFileAsync(string filePath, string text, bool is /// Message content is too long, length must be less or equal to . public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); + /// + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(FileAttachment attachment, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, attachment, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + /// + /// Message content is too long, length must be less or equal to . + public Task SendFilesAsync(IEnumerable attachments, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFilesAsync(this, Discord, attachments, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); /// public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null) @@ -320,6 +328,13 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// + async Task IMessageChannel.SendFileAsync(FileAttachment attachment, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(attachment, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// + async Task IMessageChannel.SendFilesAsync(IEnumerable attachments, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFilesAsync(attachments, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + + /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs index dd94e7788d..a91271eb8e 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs @@ -223,6 +223,16 @@ public Task SendFileAsync(string filePath, string text, bool is public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, isSpoiler, embeds); + /// + /// Message content is too long, length must be less or equal to . + public Task SendFileAsync(FileAttachment attachment, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFileAsync(this, Discord, attachment, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + + /// + /// Message content is too long, length must be less or equal to . + public Task SendFilesAsync(IEnumerable attachments, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) + => ChannelHelper.SendFilesAsync(this, Discord, attachments, text, isTTS, embed, allowedMentions, messageReference, component, stickers, options, embeds); + /// public Task DeleteMessagesAsync(IEnumerable messages, RequestOptions options = null) => ChannelHelper.DeleteMessagesAsync(this, Discord, messages.Select(x => x.Id), options); @@ -377,6 +387,12 @@ async Task IMessageChannel.SendFileAsync(string filePath, string t async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options, bool isSpoiler, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendFileAsync(stream, filename, text, isTTS, embed, options, isSpoiler, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); /// + async Task IMessageChannel.SendFileAsync(FileAttachment attachment, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFileAsync(attachment, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// + async Task IMessageChannel.SendFilesAsync(IEnumerable attachments, string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) + => await SendFilesAsync(attachments, text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); + /// async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options, AllowedMentions allowedMentions, MessageReference messageReference, MessageComponent component, ISticker[] stickers, Embed[] embeds) => await SendMessageAsync(text, isTTS, embed, options, allowedMentions, messageReference, component, stickers, embeds).ConfigureAwait(false); #endregion diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs index c581867a3c..519bab4d99 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedDMChannel.cs @@ -86,5 +86,7 @@ public Task TriggerTypingAsync(RequestOptions options = null) public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); public Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); public Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); + public Task SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); + public Task SendFilesAsync(IEnumerable attachments, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); } } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs index 1c7c5544cd..6b134d92f0 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedGroupChannel.cs @@ -105,5 +105,8 @@ public Task TriggerTypingAsync(RequestOptions options = null) { throw new NotImplementedException(); } + + public Task SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); + public Task SendFilesAsync(IEnumerable attachments, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); } } diff --git a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs index 459b5a69e3..0e7bb73fbb 100644 --- a/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs +++ b/test/Discord.Net.Tests.Unit/MockedEntities/MockedTextChannel.cs @@ -212,5 +212,7 @@ IAsyncEnumerable> IChannel.GetUsersAsync(CacheMode mo } public Task CreateThreadAsync(string name, ThreadType type = ThreadType.PublicThread, ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) => throw new NotImplementedException(); + public Task SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); + public Task SendFilesAsync(IEnumerable attachments, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent component = null, ISticker[] stickers = null, Embed[] embeds = null) => throw new NotImplementedException(); } } From 69a6b4de6a501fee2b455e49ec944f8aa2defd27 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 9 Nov 2021 01:22:40 -0400 Subject: [PATCH 456/494] meta: bump versions --- Discord.Net.targets | 2 +- src/Discord.Net/Discord.Net.nuspec | 42 +++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Discord.Net.targets b/Discord.Net.targets index b60d61229e..a14ca40a34 100644 --- a/Discord.Net.targets +++ b/Discord.Net.targets @@ -1,6 +1,6 @@ - 3.1.7 + 3.2.0 latest Discord.Net Contributors discord;discordapp diff --git a/src/Discord.Net/Discord.Net.nuspec b/src/Discord.Net/Discord.Net.nuspec index 4597d5b444..c0137c1d6c 100644 --- a/src/Discord.Net/Discord.Net.nuspec +++ b/src/Discord.Net/Discord.Net.nuspec @@ -2,7 +2,7 @@ Discord.Net.Labs - 3.1.7$suffix$ + 3.2.0$suffix$ Discord.Net Labs Discord.Net Contributors quinchs @@ -14,32 +14,32 @@ https://raw.githubusercontent.com/Discord-Net-Labs/Discord.Net-Labs/release/3.x/docs/marketing/logo/PackageLogo.png - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + From a7896e0cf6732267bcd42018df627f089eff1b66 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 9 Nov 2021 01:38:07 -0400 Subject: [PATCH 457/494] Update CHANGELOG.md --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b83967caaa..b4dd2ffa4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,46 @@ # Changelog + +## [3.2.0] - 11/09/2021 + +### Added + +- Added `GetThreadMemberAsync` implementation. +- Added `GuildFeatures` to `IGuild`. +- 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 should help new people specify the correct intents locally. +- Added strong types to `GuildJoinRequestDeleted` events. +- Added support for GUILD_JOIN_REQUEST_DELETE event. +- Added BotHTTPInteraction user flag. +- Added support for animated guild banners. +- Added student hub guild directory channel. +- Added support Guild Boost Progress Bars +- Added missing values to SystemChannelMessageDeny. +- Added state checking to ConnectionManager.StartAsync + +### Fixed + +- Fixed numeric type check for slash command options. +- Fixed followup with file overwrite having incorrect parameter locations. +- Fixed non value type options not being included in autocomplete + +### Misc + +- Renamed `PARTY_PRIVACY_FRIENDS`, `PARTY_PRIVACY_VOICE_CHANNEL`, and `EMBEDDED` to `PartyPrivacyFriends`, `PartyPrivacyVoiceChannel`, and `Embedded` in `ActivityProperties`. +- Removed error log for gateway reconnects. +- Removed BannerId and AccentColor from socket users. + ## [3.1.7] - 10/20/2021 + ### Added + - Added `Icon` property when modifying roles. - Added `GuildAvatar` and `GetGuildAvatarUrl` to `IGuildUser`. ### Fixed + - Fixed `InvalidOperationException` in modify guild channel. ### Misc + - Revert received at time, confirmed by discord staff to be accurate ## [3.1.4 - 3.1.6] - 10/12/2021 From 85b9f4f96a29c56fdfc8ed22d2053541dddc0ff8 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Tue, 9 Nov 2021 01:39:52 -0400 Subject: [PATCH 458/494] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4dd2ffa4a..3db8fdb2c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ - Added support Guild Boost Progress Bars - Added missing values to SystemChannelMessageDeny. - Added state checking to ConnectionManager.StartAsync +- Added `SendFilesAsync` to channels. +- Added `Attachments` property to `MessageProperties` ### Fixed From 8e5e360103fbdc962e2f41878b3c862b2053d59a Mon Sep 17 00:00:00 2001 From: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com> Date: Wed, 10 Nov 2021 12:51:34 -0600 Subject: [PATCH 459/494] Support Min and Max values on ApplicationCommandOptions (#273) * Support Min and Max values on ApplicationCommandOptions * Support decimal min/max values * Docs imrpovments + use ToNullable --- .../Interactions/ApplicationCommandOption.cs | 11 ++++ .../Interactions/IApplicationCommandOption.cs | 10 +++ .../Slash Commands/SlashCommandBuilder.cs | 61 +++++++++++++++++-- .../API/Common/ApplicationCommandOption.cs | 10 +++ .../RestApplicationCommandOption.cs | 13 ++++ .../SocketApplicationCommandOption.cs | 18 ++++-- 6 files changed, 111 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index 828847791b..bf512e0ab9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -66,6 +66,17 @@ public string Description /// Gets or sets whether or not this option supports autocomplete. /// public bool Autocomplete { get; set; } + + /// + /// Gets or sets the smallest number value the user can input. + /// + public double? MinValue { get; set; } + + /// + /// Gets or sets the largest number value the user can input. + /// + public double? MaxValue { get; set; } + /// /// Gets or sets the choices for string and int types for the user to pick from. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs index a76abc68e9..cef5b1af90 100644 --- a/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs @@ -32,6 +32,16 @@ public interface IApplicationCommandOption /// bool? IsRequired { get; } + /// + /// The smallest number value the user can input. + /// + double? MinValue { get; } + + /// + /// The largest number value the user can input. + /// + double? MaxValue { get; } + /// /// Choices for string and int types for the user to pick from. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs index c42934bcf2..e6696bde46 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs @@ -155,10 +155,12 @@ public SlashCommandBuilder WithDefaultPermission(bool value) /// The options of the option to add. /// The allowed channel types for this option. /// The choices of this option. + /// The smallest number value the user can input. + /// The largest number value the user can input. /// The current builder. public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? required = null, bool? isDefault = null, bool isAutocomplete = false, List options = null, - List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? required = null, bool? isDefault = null, bool isAutocomplete = false, double? minValue = null, double? maxValue = null, + List options = null, List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -189,7 +191,9 @@ public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType t Type = type, Autocomplete = isAutocomplete, Choices = (choices ?? Array.Empty()).ToList(), - ChannelTypes = channelTypes + ChannelTypes = channelTypes, + MinValue = minValue, + MaxValue = maxValue, }; return AddOption(option); @@ -321,6 +325,16 @@ public string Description /// public bool Autocomplete { get; set; } + /// + /// Gets or sets the smallest number value the user can input. + /// + public double? MinValue { get; set; } + + /// + /// Gets or sets the largest number value the user can input. + /// + public double? MaxValue { get; set; } + /// /// Gets or sets the choices for string and int types for the user to pick from. /// @@ -343,6 +357,7 @@ public string Description public ApplicationCommandOptionProperties Build() { bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; + bool isIntType = Type == ApplicationCommandOptionType.Integer; if (isSubType && (Options == null || !Options.Any())) throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option"); @@ -350,6 +365,12 @@ public ApplicationCommandOptionProperties Build() if (!isSubType && Options != null && Options.Any() && Type != ApplicationCommandOptionType.SubCommand) throw new InvalidOperationException($"Cannot have options on {Type} type"); + if (isIntType && MinValue != null && MinValue % 1 != 0) + throw new InvalidOperationException("MinValue cannot have decimals on Integer command options."); + + if (isIntType && MaxValue != null && MaxValue % 1 != 0) + throw new InvalidOperationException("MaxValue cannot have decimals on Integer command options."); + return new ApplicationCommandOptionProperties { Name = Name, @@ -360,7 +381,9 @@ public ApplicationCommandOptionProperties Build() Options = Options?.Count > 0 ? Options.Select(x => x.Build()).ToList() : new List(), Choices = Choices, Autocomplete = Autocomplete, - ChannelTypes = ChannelTypes + ChannelTypes = ChannelTypes, + MinValue = MinValue, + MaxValue = MaxValue }; } @@ -376,10 +399,12 @@ public ApplicationCommandOptionProperties Build() /// The options of the option to add. /// The allowed channel types for this option. /// The choices of this option. + /// The smallest number value the user can input. + /// The largest number value the user can input. /// The current builder. public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, - string description, bool? required = null, bool isDefault = false, bool isAutocomplete = false, List options = null, - List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) + string description, bool? required = null, bool isDefault = false, bool isAutocomplete = false, double? minValue = null, double? maxValue = null, + List options = null, List channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) { // Make sure the name matches the requirements from discord Preconditions.NotNullOrEmpty(name, nameof(name)); @@ -407,6 +432,8 @@ public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOption Required = required, Default = isDefault, Autocomplete = isAutocomplete, + MinValue = minValue, + MaxValue = maxValue, Options = options, Type = type, Choices = (choices ?? Array.Empty()).ToList(), @@ -561,6 +588,28 @@ public SlashCommandOptionBuilder WithAutocomplete(bool value) return this; } + /// + /// Sets the current builders min value field. + /// + /// The value to set. + /// The current builder. + public SlashCommandOptionBuilder WithMinValue(double value) + { + MinValue = value; + return this; + } + + /// + /// Sets the current builders max value field. + /// + /// The value to set. + /// The current builder. + public SlashCommandOptionBuilder WithMaxValue(double value) + { + MaxValue = value; + return this; + } + /// /// Sets the current type of this builder. /// diff --git a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs index 67fce2bb55..b282f71bb9 100644 --- a/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs @@ -29,6 +29,12 @@ internal class ApplicationCommandOption [JsonProperty("autocomplete")] public Optional Autocomplete { get; set; } + [JsonProperty("min_value")] + public Optional MinValue { get; set; } + + [JsonProperty("max_value")] + public Optional MaxValue { get; set; } + [JsonProperty("channel_types")] public Optional ChannelTypes { get; set; } @@ -48,6 +54,8 @@ public ApplicationCommandOption(IApplicationCommandOption cmd) Required = cmd.IsRequired ?? Optional.Unspecified; Default = cmd.IsDefault ?? Optional.Unspecified; + MinValue = cmd.MinValue ?? Optional.Unspecified; + MaxValue = cmd.MaxValue ?? Optional.Unspecified; Name = cmd.Name; Type = cmd.Type; @@ -66,6 +74,8 @@ public ApplicationCommandOption(ApplicationCommandOptionProperties option) Required = option.Required ?? Optional.Unspecified; Default = option.Default ?? Optional.Unspecified; + MinValue = option.MinValue ?? Optional.Unspecified; + MaxValue = option.MaxValue ?? Optional.Unspecified; ChannelTypes = option.ChannelTypes?.ToArray() ?? Optional.Unspecified; diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs index 460ff872a0..3aa377a276 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandOption.cs @@ -26,6 +26,12 @@ public class RestApplicationCommandOption : IApplicationCommandOption /// public bool? IsRequired { get; private set; } + /// + public double? MinValue { get; private set; } + + /// + public double? MaxValue { get; private set; } + /// /// A collection of 's for this command. /// @@ -41,6 +47,7 @@ public class RestApplicationCommandOption : IApplicationCommandOption /// public IReadOnlyCollection ChannelTypes { get; private set; } + internal RestApplicationCommandOption() { } internal static RestApplicationCommandOption Create(Model model) @@ -62,6 +69,12 @@ internal void Update(Model model) if (model.Required.IsSpecified) IsRequired = model.Required.Value; + if (model.MinValue.IsSpecified) + MinValue = model.MinValue.Value; + + if (model.MaxValue.IsSpecified) + MaxValue = model.MaxValue.Value; + Options = model.Options.IsSpecified ? model.Options.Value.Select(Create).ToImmutableArray() : ImmutableArray.Create(); diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs index 8fd5f449c6..a19068d48b 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommandOption.cs @@ -25,6 +25,12 @@ public class SocketApplicationCommandOption : IApplicationCommandOption /// public bool? IsRequired { get; private set; } + /// + public double? MinValue { get; private set; } + + /// + public double? MaxValue { get; private set; } + /// /// Choices for string and int types for the user to pick from. /// @@ -54,13 +60,13 @@ internal void Update(Model model) Type = model.Type; Description = model.Description; - IsDefault = model.Default.IsSpecified - ? model.Default.Value - : null; + IsDefault = model.Default.ToNullable(); + + IsRequired = model.Required.ToNullable(); + + MinValue = model.MinValue.ToNullable(); - IsRequired = model.Required.IsSpecified - ? model.Required.Value - : null; + MaxValue = model.MaxValue.ToNullable(); Choices = model.Choices.IsSpecified ? model.Choices.Value.Select(SocketApplicationCommandChoice.Create).ToImmutableArray() From 14672e1229e9b30223582f403572377cc433f06e Mon Sep 17 00:00:00 2001 From: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> Date: Mon, 15 Nov 2021 02:39:53 +0100 Subject: [PATCH 460/494] Logomark, doc settings edit (#258) * Logomark, doc settings edit * Replace standard logo * Bumping docfx plugins to latest release * Bump version metadata * Logo svg fix --- .../DocFX.Plugin.DescriptionGenerator.dll | Bin 9728 -> 10240 bytes .../description-generator/plugins/LICENSE | 50 +++++++++------- docs/_template/last-modified/plugins/LICENSE | 56 +++++++++--------- .../plugins/LastModifiedPostProcessor.dll | Bin 12288 -> 12800 bytes .../last-modified/plugins/LibGit2Sharp.dll | Bin 424448 -> 433664 bytes .../plugins/LibGit2Sharp.dll.config | 4 +- .../plugins/lib/linux-arm/libgit2-6777db8.so | Bin 0 -> 968668 bytes .../lib/linux-arm64/libgit2-6777db8.so | Bin 0 -> 1278936 bytes .../lib/linux-musl-x64/libgit2-6777db8.so | Bin 0 -> 1498680 bytes .../plugins/lib/linux-x64/libgit2-6777db8.so | Bin 0 -> 1477315 bytes .../plugins/lib/osx/libgit2-6777db8.dylib | Bin 0 -> 2102976 bytes .../plugins/lib/win32/x64/git2-6777db8.dll | Bin 0 -> 1241088 bytes .../plugins/lib/win32/x64/git2-6777db8.pdb | Bin 0 -> 7540736 bytes .../plugins/lib/win32/x86/git2-6777db8.dll | Bin 0 -> 973312 bytes .../plugins/lib/win32/x86/git2-6777db8.pdb | Bin 0 -> 7548928 bytes docs/docfx.json | 4 +- docs/marketing/logo/SVG/Logomark Standard.svg | 45 ++++++++++++++ 17 files changed, 106 insertions(+), 53 deletions(-) create mode 100644 docs/_template/last-modified/plugins/lib/linux-arm/libgit2-6777db8.so create mode 100644 docs/_template/last-modified/plugins/lib/linux-arm64/libgit2-6777db8.so create mode 100644 docs/_template/last-modified/plugins/lib/linux-musl-x64/libgit2-6777db8.so create mode 100644 docs/_template/last-modified/plugins/lib/linux-x64/libgit2-6777db8.so create mode 100644 docs/_template/last-modified/plugins/lib/osx/libgit2-6777db8.dylib create mode 100644 docs/_template/last-modified/plugins/lib/win32/x64/git2-6777db8.dll create mode 100644 docs/_template/last-modified/plugins/lib/win32/x64/git2-6777db8.pdb create mode 100644 docs/_template/last-modified/plugins/lib/win32/x86/git2-6777db8.dll create mode 100644 docs/_template/last-modified/plugins/lib/win32/x86/git2-6777db8.pdb create mode 100644 docs/marketing/logo/SVG/Logomark Standard.svg diff --git a/docs/_template/description-generator/plugins/DocFX.Plugin.DescriptionGenerator.dll b/docs/_template/description-generator/plugins/DocFX.Plugin.DescriptionGenerator.dll index 095ea46efa86b1f84fd7c500f1bef165237705ed..6e8839796d557923be7980eecefc44a1045dcc0e 100644 GIT binary patch delta 3792 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 delta 3598 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 AegFUf diff --git a/docs/_template/description-generator/plugins/LICENSE b/docs/_template/description-generator/plugins/LICENSE index eb92c0a03f..8fcbc4d2df 100644 --- a/docs/_template/description-generator/plugins/LICENSE +++ b/docs/_template/description-generator/plugins/LICENSE @@ -1,21 +1,29 @@ -MIT License - -Copyright (c) 2018 Still Hsu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2018 Still Hsu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================================== + +Humanizer (https://github.com/Humanizr/Humanizer) +The MIT License (MIT) +Copyright (c) .NET Foundation and Contributors + +============================================================================== \ No newline at end of file diff --git a/docs/_template/last-modified/plugins/LICENSE b/docs/_template/last-modified/plugins/LICENSE index d74703f3d0..8fcbc4d2df 100644 --- a/docs/_template/last-modified/plugins/LICENSE +++ b/docs/_template/last-modified/plugins/LICENSE @@ -1,29 +1,29 @@ -MIT License - -Copyright (c) 2018 Still Hsu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -============================================================================== - -Humanizer (https://github.com/Humanizr/Humanizer) -The MIT License (MIT) -Copyright (c) .NET Foundation and Contributors - +MIT License + +Copyright (c) 2018 Still Hsu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================================== + +Humanizer (https://github.com/Humanizr/Humanizer) +The MIT License (MIT) +Copyright (c) .NET Foundation and Contributors + ============================================================================== \ No newline at end of file diff --git a/docs/_template/last-modified/plugins/LastModifiedPostProcessor.dll b/docs/_template/last-modified/plugins/LastModifiedPostProcessor.dll index ccb2b0e3718efef6eacea25b3f1a0a7afdbe0bd3..be36969c9608e529ab58bbed5aa49156d105980c 100644 GIT binary patch delta 4827 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 S$<>_yVccP-<`dRG+W0TZDjN|1 delta 4495 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 diff --git a/docs/_template/last-modified/plugins/LibGit2Sharp.dll b/docs/_template/last-modified/plugins/LibGit2Sharp.dll index 31651507274c76c4e538cd3078fb7c4f79daa7f6..5b3568103eee937dd9ca44c8f7d182bd423b1b32 100644 GIT binary patch literal 433664 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 C{V|#V literal 424448 zcmd44d4L>Mx&K{LRbAcFvm~9F^h_p@3Co0Hx+jDnAs`|MA|eR5U_gWbf)bGmU4WQQ z4+8>j2?Fkl2m!e+SKJjh#Qk0uh@hy50ln_~f?mCP$KU7soT~1gNl@>-?;r0#`aI`3 z+jE}toaa1et>aI<)(bq(3;FlAzj@vrxcWQXe*gZ@48eor9~<;O*!$Hz?&vx0t9v}- z`RAp}H#U;zHO_qD^0Uvp;DY3$wc;y(qRsaT-o}S|ytVHRy#z{Bz{vGA09!1IScpjYWL8g7L=soQeudK$%`My&fttvsgQuC@e zsj9^V1?M?5+AX)IDjCMqK~1(oHHD`X?6__Kh)Rwy0K}pkVSwiitqQ!qKqC!YNl)wd zqH+|p?kISnD=B>rsJ>#<`Z%a!xOvaO3m=Z}gQnKU9A>*>gAz^16KP@RX;g|S|~l@b@$|P;^tu@X3aF6CiH{k@#gb`i_zx3*d0x-w6NrGg{VVP zXnAsF22^KzV9C&`g7*@m#PfFBdL*4}qB{Kv1YkBgOYQswl5Cq8$xvr^P@@^@xgFG! z40TQiHI|{y?Vy%ssOPm&DaDp&R1MTrdK8`(9WawzXjH#HoK6pyDm#UvymljU+AMj| z#7Judd6*as6NbDf-VClanqi&-CIww??UrGVZ)0``Qzq4uz|;?oHjm-o{GE`WJ0mab zFFo8BWTEjl3$()hbe!gQ39lB@qsel7I3{Vi`fxwdo}6W}bbclS%0!{_GwGd|Nmz*D z4P`GH3M*l}06xWkpe93w>QGeMw-Q#O_yr0r`c30gQw*pS(|yP~VUQ_TqLFn&Q6;Jr z4*J@T{z_OcR>C2lUu5w#MZVh_159Lm+)ATcwgdpQ5ElJ}HG@Wks{md1|*~ zi5=4t7mz9d z`=lHrV6_%HIGm&dD?)N2XnBN8PLk&mzZv%6xez(^NiBqKzx#v2uLjh{S&WW({PV#rxR<3;Us77(}qhL+*v6h%3=JL@2!m?(5{)IVrC zEDQQaFfkRan0_}c77Wk!q>xrFN6FK1`nm_VA_?61w%F@k)*jy=sXQs20MBIxRniS6 z1BKR|l7S#Z0A3&gp!jlpy6D;lcKR+tC#FVLOn(YsHo72>GBKkN7x8K$7UGjh==-zL z`J_#sg(qFdPYc-%;capb=;3%Re5(7ylg=L`zfwV~eKDdOztDM_N|L}mbfBM{Y3ZKr ze9hBv{q&`ZNIiyD`Of|X_Afq=pZW^l;v^0A=I0PQxh+&nwn33xo_v&8MutT|*3M8w zq(WsTo5(MnrQ8WW@q5Voo76-!EMTksgyey6⩔2{OK~enp1#+l==uJ^J14AV%GbPu? z%aJ%sQf|B+Frm-a%Fz^jkHk-@14}EqdmlaRExStFSB%dhi>bk4<9&pW#b@JFlNKk> z%4l#sNR_O{FIJb34FgA1nVd(G0mr3I?06HA9i3TNliEbdg;ZARNJ1cWQsW zUzC!)8416nwXHnrX@8k){Q`Wwnt3qMqvW~dCaFXiocJkeJId{Iqqx!hL&jGVl5`Rgi4UK9aEI7@7kRy?wyco_035o~78IIpc zE>nXpC<+|2hbJ2ju_V5Pc8gIewFL1jZ$Y=(h;WH2C?mO=G&|rXfg8fcfuh>fX%Hs+ z)0+w|7IaAO9f>>~$efKCm69Flo{J+9{k0f?8iJ_66!~<+9%qL{wb4-ZRO}W7;y24p`HsSG_MAC%RZEsToNgBEK@N z4ZYpuLWk?~dwHdrqtWqg#`0G`Ka~8PES-`wA#7ZjgP4ixC2A`puCH-9L8&HcoBW8W z))mUgo3_yT;APoxUUk`*X-JK@mpvJ;JWBZE7gA5vvPT@AuQQ5%1Q% zQVS4vDMIVgbj3~XgrP19R*9k}&(R2zd(PQG^)IWeMfpd5e1D*C=h|vM9RzovwK@=_~y282>#nzM1D#HpZ7TLWlgO=ub4PMaf|dyem-u z9aNB%XfXUX4x?qfMeTeM(f?7tfg8}0jS`c+vr^h)c;JR_Y^{zU?}`%Fk5BXb)1B-} zm!a~!A?ON+Pbv(b6qo?k`$8-4q(X4gWMHybe*(t1)y?$Uhz*`6%_k&0F*76zC}zPu=yUCbElFA7Fmb@E#jL@iaWx6e^feU&I4DpU#&4~3eI?Y5|=LvAHnr^(s6 zCp|5nfVJuVR`ubbf}^K9k79MGWO=lSuawqRiu{lVYHFxdDYa{1c@(vFSBq0P++QqJ z<1)UI^pBcCD-#SbZcb!?^}|D`ceUMK!RAA#k*&vES&odEeL?eJa5f7qR?W&N`^EGU z_3Sq*U#Hhlb>4{bN!|oXT5H8fG{>dj zTPkOfPqYp3i{%$Br3tN7x=QsGt8qV`;^fI~Ly0k7s_7`z>~y~=Z+(C%#5Sl%FGrJ2 z4hyev!`~u&%i&R3>5Z-m#tXROF+?#wST<8Zd(OSi_`S5dC{=hs|e_ zsm+-Ups`QR5e9&GR*o}U+b$={>bDgYcKJ83H0OJ`HgQD z)ADf*cQ27hhNt8i8jwfG8!L=It}KH1lP-Dl)I7QYqFkp=zf05FLT^(2Z@u%@k`PIph$#Rv+ zWRQLkM0}4ZlD@l`_8ybWG+vLww6Qa2yj!45^|0}s9P8VFmi&!zm)zfl{ZQX4N^X+7 z)K4A~I=K~}*&73XZy0|~WfVseOxRk#UrHXq9|rN)as1=~jo)o@EGjZw@V*2+`kO<~ z%X4$Gi=Lp{z8Gu#96IM4Xty#g+T={QsS^X698VqNC*P&$z)e6uEP^#VcDdP-NAfMC zVX2$bjbW>3)}GPsCP}J5jlMT0#A0d1#FFo_lJ}9$cz(Fma9$nTbAhfpQifw%hp_IP zPuIRj@?#2hl`14yvb7bI5l9bsOKI2PGKPM9DBY7;rKVhU11B{mM?I{I5+`Wfk~6p< zZIS*8v0cdGvW>yUpD4l_V?c2H~*5`-vy5`!{#4zWb=7pZgLvy4u`D^ecu*eSev5PMpJ!_i;3jy!pPP^ zK>fIlVpheRHL7k!hI+!}2yz&X?+1hSOpe5tyd8dP<}xxIKLFk)F&TK<9AX~F2ArFB zjaY6>R<<$ycrZ&udIKdJ^tIpMG8?I+iLHbAtxvO_6*cwStqq=}OqqAo0v5++;INHymH8 zCSBBv|1!`;+$%{^E0r>cJjOvxePHf-Z*TH)qL-4Z2&?WtTyzAKsP7Kyn_LY#tY>5u zInms15eUXsB{M>WyE4TXfWZsoPA>${g|zIX<_E3*Kkxe^jhu{44v(_bGX|pfH?Z zz}NbGVCs@U;sG4(mr&3R{jqDUI5%8#{+H+(-vkU)p#&0+H+5ETe7dv*FmLzf*_| z>nykB+U4xZalf5Qrj##4k5)=Z=q<%Z3w?ANYLktq*V{On&Es>@Cq{t8z%7fZepZuS zYs5odG5fc_?I`!sv~J#BGMQt0qPuY`tXCfK7}8Qj@xDd%ZsuPZSbxG-`F9hz4|n0W z{lmUH9DiS3_a8?LT|^A7EXh*#;XXiF%O%r0^=3_xN6Rem4A+>4&#?R0hj|$$(?In? zG`^6jgNb7lu=PUsoQO{#D47B@>Fh5}e-<@i%i^B_n2k~?hF4PQi5Z2&LsAdJ{0#Ia zTR>O$U+pGln`naGYO)oa32_d$TfkQE(rXCcR5Ia5j~qu6ne3xS+QL4%a<57>UOoW% zNiL!NrdGHH%K6%$%ebO%M>3LzrO0iwo$jX6Av}9#TC9bU2_RF#@ zx}s)O)Ka30j(T2ZS72V|t#iwCxtLJxD3|JJGZZr0^WG81Il1`^a)UMMvB2q+6|m%K zKm6-)Uo{W^3~00c>u?6vmdUI)xgOYz zn^yxQuaU2Ssq@;lkCDwrh^bz7Gi|7d($^8XiCC8A^-6g*ySbiJbN|LR&JdwEQ`bzpn;^dY>Xl74;ZEu#vW%a~AN1z6n`m{YmVbqH% zcoTueQv6ebr|#3#+w#;HfkDMSXZ$tUAFLeO2%o;0=$fzE*016gJT$R~Lad~hne7&~ zzKGKGgQzLjc7`Lr^#$SFR;>%bfSZw?zCpxMT&?vyhWLLL>=_9)}FM-@(P z$)c%(ZI9TO+^P^};#LM3sr2M+LLQs#lh4qcLGl_cGd#hMUq%HrS!g^LnX*anZA6ZD zfS!DX8zeUp;&$M7PaYzfpJ1#OQshC4{e_JgvdWa5flr}* z{l>L9HfY?KgN4TXb8s+he4-5(>g8}SGWr(!g{~t4>^m{1T0#@XSBjJ?vSqE&7z>X= zY|BAg#T?u#;fP5rsk;RY13+xd5eBeg(L>C*H;aB@9%=xg98lSZcT5`Lgv@kNO z2JaIa@&%}%l~P|;3olZ&5j45U--stcvoJ%YS0M4y7XwQD$Dr|*yeWf3%x!Rh&54Bb z+rcY`)a=Y<6{J=+hc`NtN-HBspGBm}>$?KNP6=7!FkPoe`G)XFJStLXZMg25-vAIV z&JhNH*pwp-0Kpo9OJV>BmJl4m01&MlVE~Bf9AUsa(-oA?sfFLcs)P|i@b3jLbMUVP zFBgSOvWJJ`2?q`j2RX@fhu z%W{MPAYPs$49M3xZ49DW+!$nJg_yFO;5?hQj1PjM)+h6Fo7T{7`-yN`30r6`{4^HzBh71ICQH+bTQriEM)5VIMw*3-pT@#ZZK>Z>1?p_63F&-UM8Byzbb{m? zb9wkp)uIz5-;z8?_2>l2H<|~jUY#KMMqJRO8}G3SY!8toN->zm;A}@QnR#iw@>Hd< zoZ2}|`W`S^&m?lE(k#AP!lG-5EOmoHZ=;L!UU8Q4 z2Or{(Bu^j@KYkxHYYwtBdAtgwES0$m7nt?RX*Id&s&FK0U=>bRj9*2g&pQp~_Wi~@ zE)A5)!n2Hza2fy8`Cj{v^F^wQ@%rOV?Ne z^HUuy(YFAsoq6;!x2#QeQDS~o#}#AVIq40v+UNX1@&QSCFxdziKWR%!2cLXU!Su#( zX|k6}u|9A;JfZJZ!YyK7W6?l9l6Uoq!kj)aeJzS-yJDNQlYEG5r}lPc<}#9Z1$~&H zt}XNVDL+DR;0lhCJMirC{LZBJoR_+GceJmwjwX3KB&YqKA)7-@@lEu(U6wK7mG^UH zSYJN1)0dB+jQvceXT%!Q5w2hO(!Neb1@Sg=*2RR{qf2zIt9J7iWap85PFC!7U@p^< zcX(Ex;c}r~Dg^Nx$duzpvpwM%^?e)HP=3Bjx}C1-EW%)mfggo?*)*C1vgyb0PWY{l z$;Yoqi|!eZ=4V~8bUA9a z*!s0A3sG~r1I_@ZpHjZAuVIY1^DK?;LwAA+%|cD%k2%~I*{PYSk~{jS!;VogNDpUG z5ECXy&V-bS;rPi~KkRGt59Zq)vQkYa-U4q#+tO7%c3yLTXq>)_^4Vv$2urb9<6FhS zAo(=-D1M9fY8cj-pG2&P(H;xoA}4ppCv?=*&4Wp6f9YpPGqL?V8Pe|nggtK|v-GpT z@jlch`J6?-hHOW;Q4v0`2x!wh!sf0BHz>jv6oH{Gk8n;`gtscf7Zm~eT!a~QH(74~ z2HG~X4FK`)Il=%CU&;{%3CH^Sikw3HRmHyA_1mEZnjYS*faD&2w_vs{ zb+f~rvT3~uf|xYCSx%vKLq?vkB2#F&hG*V!F(ZN>U#uRrX8J8k6C~SJ^lIlzz9x@O zOVQQl-nh`Z#Iad>EZMpVlDKd271khTqw6(4zn28eyfW0QJE+kN^_n&+y^pvvDjwS0 z`Lld35wva;ni-GW6a9L)N zxZvPYYo%}GlqUw{;qyK4VJ zjzOq=$jN_WZ=%0a;08p&EgM7P;9QEV&$)iHoAX~7$KoXn`j zxuWtdkgd1E#*FPyI>h?#^KkXIQv_#|VdeiuZ4X?*$0=a$CVZ7hvX ztz22V$WN}OIF3?`tV>=Bq`lwrh#hL0sJcWqB;NtoS9_|TysRDf<$pi!o_{Bw$WA== z`9-6?U5Ph2(fqh+9TAn?+ESVBr0DY@L(IJ;XRZMtZp{$}++ z^kqT(xL)UfgYdaVtj2Fq?A_y=Kc>FDE=}V*bYw}iKl;yL0lmM5Ni!{ElE7o8ZYq#zgW1R?7 z^+K|eQl|DUBz4?+&AG`l8JU-^9PILq9k%L0V>Fgz^4!QU$R4}QBa?mi&_GTP4})?v}eh?kg6O=drp6n96RRl zA}@J}jHZrj{1!>bO}WPF7J3^kX7Vth)8A8Bx*ha=fZ6Cj_)UKx+>AnWE3_8>2q?Gq z{N%^@-u42iT^Y#3$$Oy4=G6N@#~SFU4i6XNcYwtWl)eP-yeVB~50$;jQfHH{ zR(8X~x)WMs{A1FRdl=WXRGS5vZsfT6EH7KegeN;Rg#|q z?y@Rd4z}*7Uw85$sMdN$x$#&ZD=k~En~(EqQyN>}?-z%oQl~bY3$eO{J9=02=2Z!? zJv9Duz>38iuUBC?i)$$qK|Fe{D@KH6tTUghor!>JI9e{4Gr1v`|r*>RKr^?93p zT5VRSj|I!tFYGBe;!6eB5`|z4Bnv*eH^PioEx`hjXzz#gVn%w&&a8-&y+=5@&q{B= zKx3YAkJ)r@k+t?(ewe`A=mNG|z+1ZlZgK(aXVJxP?h4rE0`9edTe<>nbpiKTz}wmZ z)K50tCAf#Q>xn*lpH>8i`=a`8gHe5SFtR!#c9B)O9;I9dkNO6~s5n@(PSsxs!cy`& zG9D<_hX|VxItu5aiXcH%Mn_XwZJHO7G)0fnmJn~PiBf{*4EavBNN?4uI-uO zs+qr&p^Xd55L?3-LN=Peo{M`Z{7Y}6f!G0UeH}RnSZ-bg`L!a80?Zt1F=jm1b7d~n zrg|o$reZniUQ}c|@Lwc0nEPeju4E2u!Ro>F{$l)Zxar&30o+92RGEiS=Hpc6+pWyT z4QTlI*Ce!SJn3(MTHl}mZ8W}PUe3Zh)6&gHFD5Vj#s5kvGg3h5Z%IF~eMYL~9e~sK zlVmpfS7r1&{Mv~i9AkV=_`BzYUokKI_Br7*8oD$_zM1oaREv6r-ch*Jt&+ZnxaBBp zalacgr1dSUOH)4fNab^fR&OA!>iAw|{RmX0f8eLZG}LyR^&m{EvcT5+}%_n&W< z(v1I`z$iXKRwCzc!wDvp1I#_spAUd}eufzo<}bpW52i)OMv-eBYN1Jn`qha<*};u4 zlzaPa6wfP_+&UAL7Qt#@ktx?Qaj(0q&_Fy(!pRP#b(AM4<6bgm9p&dFV;$vhinZGL z5>)D=tfS~IC1afTczDWvo+K1?EBi(pqp&JIP+S&WngTqSFXpw!@)vhCWnigzoRx-%-V+UV0gPgoII0B zdW&1hVH;f$`Z+>#MZAMvDD*i(Zx*`PRF2xHbGKny-xb!7#irn@-c+d-2MetoF20<2 zEx6W$LSU*aC(G7DF4S;M#YrD#*ls-xz!m139{bMLkI*nin<>CB%Z$B8W{{0WQJuv}my@ zt}NH^otB7!$+}Ahm68CqbQ?Rx&Ejv<+S!<#oJC8PcdQ&3ZEO%d9Wm_Psmi_WD%)7( z_J&UI#}#&|BEc+Nq{q((7va!Fe_1i4y4R)YSQ{d3NkgSK+c@ zH;wbV$__1*JG*op_@lK|ZxRu)w))Y-iwa*fKH9iVWWOJkF#Z>&SjTst zmg{cp9s3VOqmBFLvW!K@LnZ$0h8`c~IAce@XqE;KW3}cBy$#=VZR_*O!At+6)6T#A zwYR@`yJK|gR-~H+VW->gkZ$jX8(I){sE@W$DF;`|Gg6x9S~tAOPCK0P^yg4PWBD+( z(+*G2SOd5;86;V~zi~94!1V|VaJSc)@&qjmF4N!Uo||WMhca?QQ#=aqq~Wp3+%RW= z*@-8(;5O$BT$srQ;aLpItcd`m9~qw zzP;Ze5*$k~ZT1owh0PloGTmcZ@jk-1;|KACg*GoB)NWSB>rlb&7{k54FGqTBZU7y~Q>x_@3YC5)f@slMlYs9WK(~P3(1Ph@E6UTf> zMV?)573JKtmf%>Xb`0D}M>V|~BIEI0)LnlmSFo8S?V%DiiyBFW41po*5ThBQKSwOd z5ZiOam?36*$UNo#?%doK&(F;vx^i=fuH1x}QIm{pz22#||6oXB|5kd8F`Xs95k(O% zR4ayPCr<{@YZ=7D_=EI<&I!Nx@h}3Fq99vqK9jm1P200_c^86{a*nQ?E>X6O=ixMK zz2OXlN*JF*OUCD_4^2etXBcd_B@-V>ZjGlQ9gS1@(G}S83`#PrMZ@N%W6FskR_wMp zRG<=&T$sEKLnKALrS4mGGFTaW0wZU|YF96fM(H{qp#J5Dy=_>CLd8CeeTb)@nwiOE@Hwii|B-f8Q_V z7I%|H^!lk%bvS+%2`7E?`$-k7Va6ICrht5j*adGni`=%Er9L@kxlCR?t#+Zq{)X7@ zKHxNCAoEV1wNksdvEVQf!e1WyZPj*c2F8#L_H`pU2I=32iq9yU9evtvD7%c?e3QZ1a_g~fc790rN-V^Gm-1r&(s`)KOXICnviGYz`WIYv{ zk2RXx;x?aMZd7($D!IZJS)5YB%3*nhpV+{!2R1T}!4Oy0khkhcSJoy=k|^RT;8 zj%7PcZt&xqkkXN@my;BO>i|ODl01fA@{$bf37t=Y&Y-^70{dvo0||Bq)U;s9&fhi( zIz#BqnR`p--kP~@%iIH;jA(qnntYEV-}IAcK)tQU@l5XBwtgt5(Be*Iwl1JWraPr2 zneb%~a59o{^;8M$jAzueL`|iM??4v&e20oprHa57aGGE)NUG|mJD5|d<#@f=fW~Do zavIkF5DZ8TVE_n56^AeY1fz;W7=V%%VF{L-?f$_J&a}Jn-?u(NmFa?F!kop9&mvEm zX-ZKWV;#B=8-}&>_d$yhNVX$`hz$<8D>U2i@$*%k_<8)s=ZVu#^{0BP4_DI=wxNH{ zb2W6falS+rv>0{JAzJ%89=iC)oa!EtA{`po-v0DYV5u#1{TN_2`n1|%EnJ(JQAo^) z%*mgoa&j%WN${Ek2sc2JwYdFW@Co5%D+((w%l+`oR9O+ya+dc0BptDbVtD8M(yqGsv#H zpt+gS-YP;CwA}bJBKok*^94LIuQz1}-QCf6#p6Q#=Lw8ot482Bmf_qoeEhj~fcjdX zGqTbP+$p-4*ySia1XkKaFF*5+&SiRJ)Eivk^a#y!AJH)7TovLk z%lFiv@rPVwST&ti(KPeWl6)x6BHN+xJC#E6md}j}(?84Q>!&7PpObt&&g4rWjRTbr zBU~+LJU!1c>?)BtlWJCougvNkdRSN9iB@M_g)Y}FitH|EpSzsdUozvH2xfpU#MQrA zjAqa^P^&?W*>tiAAMcgf?`DOlh}sIbFsy5-E`iI|E(6<r)uj z=m|!E%+_*3bs0kC-k%uZ;5SCboJ+uqO-)4c6=XV(C7GNZ==C1v8SC=k1j=x4M6p#cvidh1!Nt0uZI<;&72rN^FFaQL`sY4h50{he<3;=<7>JSDP z9iiQml0D>CA3neyWK=uYamjLe19f9BZi^g$rv~{t4VApc!s5?Db8@Z0O|@!rjo{_p z3^LhlfjGn9*`DNj0&MQ|OpP0_H{Uc?xaLmCh2~D?OAeQ3mvg5NJAr);y@vxzW4AE~^+q>m`MLGdFRGUwL6KUHaj1Xmphh#)zjshe zGSrvasPqXWpAqqGy-zvPftzuk-p%6~I0C=9eZJ6d%42H*wtPU#U)~)mPbZWc9#?dS z%F_w$Pj961wAjsZipecBdUf+>YV7yyFFg+myi87@n*e*7=WV9hkM z6}8flu9eJ}9QCNJlwIU|iM7&A@{@_ zCgt=4q@ek9!6o^yV1M(~L~-j+$sLAiz64D2F&FyMPUt6G=#>h+(}ljQ6MB~my-J~< z0hT;4VRWr+00?xPLl^*p*_1;V0D>8hLl^*piH}1V0D_s1Ll^*pIgmpbAemYxnfjcF zSToHORx))ge52=^FL{bQyX^Ttb3Omf$kf6Y!Ul3#KnQRc|@-NK#(cFS#S`-Pj^ch zygX+s9>J_FI9DfE$H%|`KkjD?bn}h9;V;UvVgW4UT9A%rB*Vnf*#LHL%gJM8s&wmw z^`v{2+U48GgyxLDLMEMoA2kItReV6=vQG8=Gc}73$0i6Hg|XaRaq;3Il@rE`<*-*d ziktq3J*${!^E+kIBboBM9%%pwruPnE0Eqo_gaM`-v3G3UB#ghql%nj%s#XxW3LTqP z@J&<`(J;e;gH7p}k-KaSAln0SgaJ7hoISLX{G}TUb6?v-Qke*F>gE)xU)Mq8%zrBW zswQL#PM(c#%iEo7#>-V-PI8|HvZY|hPF==5lpq#xc^lI-AZEFv&;TgJ5_JdzKwy$M zgaIHhOB})g5Eu;(VE{ANNtF@v!esW&-XSA?%rcO^Y^{qn?&LhO-t zWqXFQ%}@5?&mRHAjByn*;OcC$IT9ZRIsW+S7P>lg3sx;OwY45};KL=IC9xycz|^mTz-@(1o1Y$ur549CwE z1GvQA4qX0O(T{XAY4rVQKey}dro3R%0H(u#&<7{!kT*3sF{8#=Zr z>*l13yc5oJ^DlKZJ^QE6qi{etIZss=%%RdY%n4wFZ=6%HbJ`WRBHe+}`?Yg*G!O3# zV9Dr-x#WE1cx)FYOkOAyeS6qJTGM?1ew+$Ff{WiJ`-3a-fjybdg8nKxV_)r{qE57y z`%4MeP27#M`d*C}K|{VpR!Y_r0Yjx^C-Sp>vh2mRPj_!#<#|5KmmX`*KrO=FQz@YOOYgCus5`pY3?>d$0CZeAL~$ z@xAlCv+r^EJHy6Win4{dLgP4rw!oAfQxh4SfK%bgMse~B|8#s#BZ=C{OTxzaooqXA zBP9)mZhDl^LXs+2w#u*rX)4<8TH5Z}YP;?Zb7fwGFlK*1Cov0C#q{YMBjokSE}>8M zMv6z=E0l$F|Bgt9>BkuqCJM=uNz?i%*7-!S^)orzthD~XX7%?$lv+RMH$DI{?w0rL zUA-f`qpos%)jUIMWT#1YJd9@GxbpAlVH4HX?{Q|M?@3#%M=db4w!0;3C~l$Q|EjyL z&r}raX0TCTD7!*#7|+OIQA^B4XTCs6ihkKL0L1w@!T=C2%n=5FxFAOup!KCH^|ZB% z_&=~={rLO*a?CSGH>(s)H7?RrG;&P4OK;&(lTTnjwF2wX7B~!Zg@dvBtPgMhFWGEy) ziY%e@Eh^(OI#DXhg*(w~!3=bZmUGR)sU%W3Mj@q@f~Ig%OaexXv3 zm~zZsTW$J3iPc5J&lHOIlqY5sqPMDRwl)jkovyNenU(cl1P6_u<@vMVuKKn90y?Xs zR+OWr5ET0>WsDe><72D>T8C!s&clMLbdlMWqsx#UW(>2;!uSW8Xcg-VxY8@$hw)YX zvfK11XAV|*)uUaXKD8^K_+fIf^pjWnoo|Y87#0mu_x;KEy*kBgJIs@B+9}2qF<7f0 zO4r9v^vyDj)#^(@gC}vFTF#zMl3Ffw-b>=ZWc$G+4on&o6@^2=Vq%%29=hL>yctgy z-4WOz9El%-{1rY6tFI&6WWn8;-Kp&M15Jgl^1`n2!mPY*9&-u(hZHbpF*s)1r2Bgg zuL!LEWA3!nBA)qGzp>0>R7=@DBKLpQgYR#5+6&cbv(263(cY~F2u24v$+3{OV)7Nv z7yla4=`?pkPKw}^V>T&k34Pc4@@--m&k-%k+sCEiy8){4t^$6g0NPdkjZSFm&2v^0 zM4Nj^hOMut&b>o0<*BOEeS1?-_631!=)#+_&{4l>=_J+J%6>vYwd&6J3&7I}6g`UB z8O`qK(~ImcXnZKIOE}HFcGsEzMyH#Ney=_UkLb(_vHk9t4ZT`c>*P%@=jxo9%!zJ-=RE6c*QE{*7 zS2y(64hu`C4D=Rx=YDm8-vvLI%A}Zf+D&%uyS&H#$O}!F zS;hJEXwQH>j7w2FWS*H^i;@VspWQWr6vSfA5xbG&j`j+EW==3)2v^Y9W_Q6VMVDGUK zj;1ZRz{d9|?c3)E#f0m<|L6_&1zvfH>;K$d@Rsi7;D3-W_k{m<`QF>L`587|nsbDm z=tr0$y8YO~FB7Z3SYK4#TBk#&C*U0lzk4~YSBiB4qJESu2MrZU@m+Y)JiOD6Zek6f zjKcXexQU_c4fm-ZGDR-(97Xn#t4hK08>p?|LoaP*X&byl8KzRQE#CA*${l#L`8+tSlhhCuK1u3TL!#XnWwkR7k_-q}>Y&6yZh_b-Iw@&0=@3d{0k^Trau z@!0K^Uq-vR<6^tcn3Isz#_c4?3Y$@UU4GkyvP7|zS8;SMun)Oa?c53nu0#vQy2nhO zw%wI5Sldpxro~Z%=AGmIbAmSgl@ST*?^ z@m*j1E#;#PDWBJ?oYGyEUJmhW>G8%rz<{3SeF=cBA7r1X+@rCU*sM6|d|iAcfo4=& z9`10xzPzfl8urQ9BC`4g`8h(6zwc4oDHeGoW|8SoKAc0nojtMCdnVVf@zU1{-cY-*&F1_F z8>QtLYv%N|Lj4%tZRqs0LRUvCBwT`xlB4+{PN&Zmy1HCpPLETE`x4Rrf862RxPF^A z{`tJWZSuB6uD?Ca4=~T~p#tek)l6Rja?AGy+1SHm!`oo8wkzJc$1$YLSRg_JE%J;X z+}>tl$k`m-zveTVt{Kw_vj{Y%MLJiQ<-05WIEd-YcS|f|Q*8`ep6Rx~m$hW!%jEk4 z=&hCu$q~@Sx3b38152N}Z)myZ&%U9>Sjhgrefnt&>rtHIv4(HG+B{Kft3x^oxF++M z(tQ=4QZ`V!(bM|QNc>}DIul&OyFTUcdYq`OIC(f)ci_HGd=`DN-a4N??tGxY-cB&v z>{Rpa z8g|#*snuQ7yb|^nxEB~-_7AI`*`+snOWSL%S9ynjKCioPXR^*W`D}mLC~Q>ozAw9R z8ZDX$V1adlzG9G6wO-KA&kDYK^)f^s+^}$c{4DZ{$slfA;ir2w810+upGj}O?3;61 zOC<-LJ3=3?$_ow~$L8Q1Ssv4uyF0Qtw^jI{n+YSE2qujB1h>?XYZX54X3_|@t5xJ{ z%cDO1))uesR+%GrbDD(@y|q(d2!sWlr#_u-I~0}XS`nr1-c0?uGG=DP(awy}i}+?o z^kGNz^3uE65q+5*QFh;gF*~9U>F&#(wd!?tNs;f(u%^;3-&qpb)TGkiu_W~3)=+83 z-h5fOh^?|a1K5M}-pOizHN3(*7i>-Y-hX@JyY=)#GVnd#^=IbrhrBypn8P=C-+i%z zIWs9bf|!F%TGP|{Zw5-OBeCCOBx>|dv}#eV4MoYz5t}}&UmGxa%OT1R6#j6|a&|Ue zRlM<4PG)64uy$vEZcQbykF(eNoqNrBx%Ki5Z2sm~7s1S17*?b{|>rwpaDxm5coD!;Lyi=f-Q*w@Ga`iU!-e%sz_9J4^lb zf+oO)>cdD+KK<>h4%GUKz3YNrzAMO6Sp&V}!>fNi+|N#0R)H|G3RFVJ0)MkOVSMNU zuQ_inGsFw_1oSpgMn^CbKLD9!29{S+$$XXQOYo!nJCiU>Z-e6K>a6x}Xd z+W^M+(*xeJQr7WDnS7lToX96!#1GoTeUrdw2;v`uoTB*I#dm6I%R1(dz@%F#%oh7E zMRMZ@m2%BAiwatGyGCKFoiBNnJZ#TuW@$F^1odlBzaV}X6lWR~Qgx2mvr&94X>Xh;FDW!XFu){aw3s?Wt(Rnd>u#-^`mEb953`l+%$_vTtydIiLy#w&Cl3b z{TaT4gTj%sOTFtdZn!*G-?g*kx_Jcs(*AsVi?hBka4*x@f~Y3>F8z4CavuwEN+E_e z8qH}1?I+p-YNi#Y!?|7fPwK+2f!c`~g~aS=)Uvq4QvJ*iSIJuF?rawdP2+Go5 zP~EV)62Fyzu>*#Kgy{{q9tj)7M<1WVFwE<4l5 zl^##)Iqt30j3Ci|@E<5dx`4qPl{3=%xQtD2dXQ#o{X4Lq{6YkdoKf!wT@d<{peIHh zA`;?GA;uh{D8#3P7+>fxC1E}z%rb}Q72+<7vfN?H!hG5=hdWH4FrO7>`3w{~WWSJ~ z1G(IzIu17=+!w$tqP=br6K>_F^(8PIiASWeYt&*ngT9<<{4CH8cKtGJ-w9!ac^m2X zfYJK9Y|Va7C>Fr*ENsh5(H`vxTNq_}y3Y4!k=omitKI06-bSvQI%g7@Eo-PW-K=@N ze_gKUM&NKaODzhuGvX})j_MKSCui+reTw~A2$otZHd0V^RNI?1#dOMqj zmcVubTK7;?G`)wI`c1JgnWgpXOQPvzLVaDK6V2^7qw8C8{N!(nuy-^)t_a^ygz4o1 z@9)GNb8*>D>om}}lsJmlwHrvpLyDYg%yAbQ$m(-VX0CKTK9+9-{U_4iVnIQNJKZzZ z?KK+TAiYQU|)_fSWj{(fvwiXQSJ2ta~+Vrw6Fox@1 zaQy>e-A_$qXK6W}(>bW5KIGOK_V*@EcDAnXE%T1s(6M_DAuQY_f)-O9=zPX3Q7ot@U+<**yb2 zjk=8N`|Y9B0rv{4HoSPeb&%iM%7y$+tz2C@xzV?mw{d`{S^3NabdRiS$tg|PtFGGb z$)0s>EUR!Qb* zXgMhNT-5E+rvuv|y5-gO=$cpCqnlqk7<)T4Y+*L%y+M0|+u=jY`og@>t`4yF%|zO% z4^+ZA@-v9PBS8J#p(a5?h2Hp&bdU+X`^gj2$$RCnrGx5#&TkBqtvvL0e8lo#aGhO?FE|av(W4X-L-Opbfhw4F`kjmIjYO$z~Q> zR(ETQK^yYhP$+2bd3rlK3I)tqobELM1QxhM7ytsZ-XRPCfqCu_27tfd>YQ=^;y1yVGEm7@4#c=>i#jND-*>QX0P6x@NNE2 zQ)82fp?LN1_J25=R6`-zCi9?M zdFJj=w6NgE=ZiHimuaoiaM2**lMRm}dixQFdBI!uhbh^4Q%1WNl0*6t+NV5N7*4Nc zH0nz~!SBRK>k%r?2JUtET7L%SA>-r@Vh-@BRk?fvu;74#-y5GzMne%_^mS0tXZ~q8 zcF5Y*lvb#eO0lPfHWtoYkiDaOfzp?EoL1>&tt=N)<6dUAruIhf+I@5QTJLQK zx;+KoOT6umcd*)Sg0`EX?Ycfo=hpVE>3r98q2qXY4#)Y(WX^GxHQTH!#yv2tzr?q^ ziU54%_C;{);5Q)Sr8p2j!&2>fk;7;pBNxr+BjWo{f9Ccx%eV7~10)8q8tn zKj36sf=9ciiFYw<@8K}7l%3u4y)kdiiEiu>4Oc(|{}@NCh1$JuymuwnZ@U{5d#~My zku@R@zN*3c`EsV3X`r{Ok$UI1QSbaFVz}&*XiehW-r#}W;TL!4!yfit^1r4pFv9vv zU4)h96IPl>n0p^3+cNKZALT%A?F&0}JqEh2gsy*%L)}$%?>K8Eu{Zu-G~R5QKjh^61{2i8fIf`xs<0kIcF`Z1GIsiu^&kul6KX_M( z_l=&tGrb*jW{+Kmate+1=FM=qwmR_Rlx+Hn%{}Q=i#Mzs)!w4>6`Om3i#HO^7v&ia z6G2h^%eKDizWsEy$}}CofEV{t;VO?}rCb)3?Njg`i%w$gpfb!m(>l^E;p^{i*8$hy zL9cb@`3*e8$D=MLuX@$Fl~9U1U9Rq4M>+U$M26^|29dDiuf@@nqRvT+kyDneSy;2X z8br8|kaF$N#uV(y$EhsAmX~*ir^cOxcjNWBkFxuCZNb!EeO=VtSNf{gxuXX>iSK&z zL~4E1MaXFED6oBUJTC@wX`@SbS!LR~%jGw6K>vvFj){FmwQr#JOud)EM^4mf(7lAC z1ND9V;m{N_t!EmvcQjoHA>~??CpS$?R?J%*adCHHmqZ&D`D3Me}lyv?4^d^*1eSmhNmX13TZtFn}v{O={=I zyd%(crH*$Bx~|k^)~};0H}-<$(-?*fNU^q9l`(*SW*sQ0QuTPfB+08 z7hu2>=-9EQ0c8FLWp0-TZ8oqIEv=7{6btv`atf_aC?j5)`!!7*#HTWfTi<5?!+VAG z{}IW7A1^c!7+JZ34`HnF<0{^Pz|Q>lCLg9qopfa#kU z`fFp2OAxobe@0tQMu;-Qv2-z$_oZ*skECdTq|8o}Tgf;6h3b=gFrYgg4DOBxW7`@} z)zXYBt5#JJclaetwzSvg$uc-FjHOdc?o@@T+ecJ4Q=!#_ zRdOanVfpxpX-Z;=mBa~w7Ktcom-9B^lost&<=tYrn0AMc2Im^@-kIyl=tyA)(Q=D*~ZXXLnmuuu2ON!lNZL&u_EGA zB0?W9aAWsb-ol2n1?);-#utMNjz<~4ES=4%;KP>rd}v>l*r`TkYNQ3~c8xA#G0&g( z0TV|{-5Wl94lPz@MoSwmR2?Hl3nsX?bv`Z2;Db%|=Fnn-owIl@L3i&=5cxWq_VK9ien*`U)&N$?fG_?@`gVTzJ3iut@_pr+c1MA!K%(gYdL*}c*C zU<$HBy=yH0cFM4EVNWJ|g{ivhldH)#NNyt4TyY32>(H)gNhr+A4HP1BOH51|qSQW? zp4zSS=wCy0cKzwzg3KoMdC_I>7tP_(S4DTmqc%*t87w=BedLT^r{tBG&#%Rev#3q3 zJM(u?{YW1wNsKX8K(z}lIGDUOzfc*kn%^eXtkQfPEvxKv=w!9tMLq6C)Z#qBBo8MC z!`|-uyE^`gSF!Tu3p;m&98=wg&N-%0uJ`)z^+9n$HfVgWAklRwd8#evH$x#F{-+zk zwZVwDAbY>d_XfQ^yUvLmOc~c&-MdI_-!gSI50jUpo@jqlDX1u?B9gC(P|-Y`+$T`& z^=|TGROy!QF5MT*uk{XB>#PG@Y#qMnRBFBK7qNmZ=jdYfJSOC(Z0q}T1Ig*o(F2w` zfo7hP9jP!)n{9BEdJ74gPrRA?8^ZGo!8+~AVn3|UhFDjJZ*;0-HKX}X+&AleVWX`p zcHMj&cgdQM4Ln;@a_?X6s{O1}72?JJbR$Z(Y>wRhUC}{rpX@D6N50k5-mT&~`1llvSo`l3kVRGtObuinF}=>azv}C5>CB~++2C~0vy~iMC{KP4 zl-5trlFP#dm$$-@I=63RtmxC$?cAbR$=U7bMm@mVTsAUVk;V8_BJJ3>GY@wS{(PFI zb8o5Z3$$5onlL8cv$k;k@?+l6S6#on!Z$JGYMqU7D|Sxd&Tkw`z4RAMGtqPxt@bm6 zWQnYgPhl!d%qXN`cO&S^wNA!T_&aCZRkEy#og;Mf0<(1iRo8c)|5b8mXDK?Y3b>D| zcSX{>WWAiB(r2TelWWJE!8Ej*TK972x+js1S6l!5L`Sx_=U|Y2n#{Oc{~4SqUUVhb z$#8oAxz!(2^*?LXS4ey&v2?to7N5-zPwaiZD|Pw>JpBx4I0I{u9B)ye&*|8)@#JmL zn|uWmxS9-*R#RAK@l0*t1C_EwhB)H;?}}cm9k!?#e@S4eQsPYD_ps^fW$j{NLzj0P z+$Bb=eU{>nB1v80OGr&g<*ASE7+h4Gt=@<7cgOr7=&J-Aa<(=?1{Vdh)qC4v_MWx% zy$^U#nMHZ>=d*)<>sXJ$Y{3Nym(AzhpJe5;`~D<%mmZ$mgh3i0pn4>+Jx)9NoqBPh z=Z1~H=1rqn3>~VL{6vM>-1tc%hQF>@JgpgIDl16#VY<;+Hkpf#`baIgM=Zd^FhSzp z_x-FUB;VvmJKF888N{O!JxpgOJ8gg?4)2D5m?eJAFXG#~J@4uEytnOP!sTv`wk>q^ zuRwce-fNJ>bUQRLytKZC>!yWVZoU^!(BNH5Xa7V^g?6}AXq>E?=|UoV5%(!&!Np0w zj;HkvVH~1$zrnN7H*xh^Z#n%oKdlG&(R4^rW%Pe1^DDai56WfpQ1O!Q%F{W+@mlpE z6W_MoX0v~k?a~r27)hr2u6?{#3l?1=e3FNZ+>y?h#VZavPVWE%qaRWUx`BT`dBhLP zx7vjz-;+o4m?IdpWG@+@n;jZ+b*4mr-P0}6&h37F?K{8Om-vc}D_~lU^Lp(N>txyE ze>&(>|t06A8RHv6@F83;w6YK z>%L<+d|i-lmi5LgF!@ZcOA$GLf2n|(U zxO700@GJ0k)+Ac}Lp`M1R36E%!6v`q2jY|6c53tUcHQRh%-Y5j8O%QH=F$jy4ZG2zDm%GSsYRoz-&$~O< zF2nHpiNe(MA|QU8+9vlLZVi=%9Dzqq>iG7)Q9I7Qii5z3VtpJ$?(|yPz#fh`2w*mv z5a)jjhbCqeq5~$icHD#K#$C~gs}L8Lnrn`u`Ntb+Cq8CIDXteMT~EJ6Ro7VPIM!Mv zW{)=S8ub=W<^421SXI!u@Z-trg;(>1tx*D9K8}HIVGG8oDtbE2ZHKqe#qINdPq!AwhOoduBXN)%&rsQ7 zNJ3_k69hBj2!5hqr3QYIUlgkAkzZ{v=psIXk0>&B!s9il)BL(&~1Pdx5Hm?p3b!A=b2JqsPG8^fTQ5ZeiN6 z52}o_paT{3B?X~=2@>sD&>98ZtDrs$5(!z*Aqskvf(jNSin5@`D(H6#iY!PK%7PA3 z(9aZ9v>@>{3tFq74=bo_L1J?jbg+Uxrl4L65=XP3Lltzlg8B(E+spU%g2y+QT!{na z5$=pF#6r`@x%;D1@(Yd)F$8@`Vo1A$`nIh17K<;oSp12=-UTFjc;N}KHNFE|rqBVC z-*janduc!N;3y}3Mf^izd3-`MfIj!YV1KF3;qX%W93&zcCa;lp`MwvEmOfM&q0Nk0 zBhC#jJfEV|WfYbCl^^D7Mzm04i(1vQn33V6@H3lm^WSPapHTg4c@|~ctzVY zz~2OIjwm+qf@X~)egnNDE2G}gm3_5^K}!2aeSBXuWkAzmN53fvE%M$aOC*1ShW;G` zLm?%GR^kp04;XJ{S9qSSVcOdV(u3~>b2H_+y11j}{^H4MnNJz0iHlobMyKvy&|_Z) z8>kM2wPV;)xNmkhG;hzT>y9@bxO9Dum1w5)_cYO_?l_h-Jp=Kua|@NiHoh6g3lH28 zT>SyRDUmNF3)M(F_Tb}QJAce;Ec=*ORUZrNu1m#x(aXF&#Jk)G>1aQU!ccoI)%b8a zlK3rIUWH5ie4WV5_@<(|bq2mEK&=t+fyg&>x?G9f{g6XRyN$HzK4wFNtwR`9vUovy zJP})u1>+JX(&Ly4u?8WOUpaX$!l1o?c4_e;l!XF2mYC@uh!S6b#+OF4@&5@bnfv|~ zEkKIUuHRN#)Z;uGKa44#(BsuCw5+9$G6~<89NVK31ET9h1d24PE31@k%0Q z3vtJYSk4KzBWA0=J2AKrAExZNvZ)kvOj_=YbepuA`&p#CZPm{?!)|}sIMbP@g`LOV zuz;8^V5Hhu+hVq0PjNj}Z2nJ}3(HRs%y3gq|IAN|X@x~Ou`9|+bEEu#C7rtcf02xozzK z=+&#d2emi9Tg;m^w`C@)4QJ-1Hq{eWB?>Lq@LC$UNtWGn=@Bd&{7h+r5)`uZZPCvW%#nio)Z2gH_1UL+hIvX7%E&AUS zqD26QTH8U5W~hVPsC1UNGolpzG(235FA(k6yu%}HkQbv2YklfgY|Xc+AEbXHWee74 z)57!+GS#DZPm*d6;=kP#_d`BzerXo*`Xma^j)k4wJ9;LyErmPghCu%X96#OCC-oJG)#YZh>p~6Ru z{Vj}Z!LMNvuEkIc%xB(2fv+qBWyx@4)7V2*QYdsmXy&9A`;&^zcRR}|ALlH$P?^f` zT_S){O7Jx-fwmZ@1fS1pNef}Hq<1Q5NlE#daJhwsHT0*1E(`tthAg1YISVVyY1Q8Vx5fxP2K?Gb_ z+))9=6)}RiEAAUE@%#Nx-P?V8GGKha?|r^JnXbC0PF0=SPn|k-s#9R*TmwHSaF@Wm zgj{LRW=ik}qMQz8ewB!JFYs&{H+#TeKX-T!&cbv*QZ1YFq&5-<6R+piqYLs-0^*4!mNgFZcF-~sO zzq3hOhPut-j;74n5U%KjquXv6L-6S3^pMHOkv$i66v;HZerbKUZ%V`eM_u3Nx<1@p z=}zkZWVfHdllp%eWeVRIc*o6zx4%n9V+kkqea;I9)V+T zk4)zByzF>Ru6xTCpS6E8y^+PVv(n4gj!wP)QN|>B4esiH%f#ogIM=<4&x3P;!S#J^ zjf!CYs*_%kZb}v0uUIOQu;zCXuKn&l&~^u9ZMzn!UP9ELbCAYXtQ? z&;oG30$#LtU?-P8zlsr)RGma3vH~$<#J(h0oWm2-1`}2Ea%-?>d{Kdn~trMXrJPMrR!512t90W z3uXtK4BC#w?({(JpqKeN*;DPcskPC03mL<7z&>}K?|^EPI%WER)mPJ&ye)QcL1vrX z48R{tX=DIiCgFPuUA@J`26i#A316I^$L>eWF_E_k-&LyiVng0+!uOTDIrtYafhXgd zUhiN|?x52>&5~N5l)TA4Yw0wt_4;G}u=Qw98x|VvepqPZ-{)>f%Y;o;c!WExOz&1B zYg?MHeKPg>Ya5?s-k1p|w8?ejh1y z`5QFT%h3n;l3;^_UT+e-lvGElaT>QUdJ2Vj8A-Y2{4`bqK~soaN4M~9#OxA|_Jd|% z`*e?zX5(ex_LkSr9#plL`y1TX;2UK*Vvk{l6Vd1e2I^>>XD%j0&d1YJo>lBEqS*(Y z`wq3#xDaTN?=89sx|lBLv?dd5oX%;xn^UX{+v(A^rwU^7sfxEiI=B4#-J9{O>zP%l zbu2-JyV4WJZ-Xyg-4o90%-*Gf1g`i#$$W%=41c}AUd~?yzy1k+IDZK9a5Tsf$AW3QU&skeIvued$p0lGM8ENHR+KPeX%JkJ?T8s)epUr$D}Lw_ zc3*_IKf~#z=n|aq!{O2FDC00Zh<&uu&tonbnox*Cy>}$qgl}x0z6tVCFyMhzOw^)V zA3Z|8_Qq|=_WMA-D#!)2sICABh(W z09ycT>{%2Z%ImBDpe4OB1QY5W2m7`|)-3)#w>OQG?Hd~NI{-VJzieBd#`i+PF2gnD z2>jwPX5c1rWEcouv!@$Zv_y?^7#9`zVwcX8OiA;81~`l+j(6vWSFZDgF&=$G`Hb#1 zQgklAaxJV?ysD2H7N0NOH#3o!eyC7h@;# ziti>@ce7=pIT*Sv58mrY#ec524;NtyaJdwy=yoqe9^ z`Td6}2R2iryrH$LP}?tM1%1KE;&s%vofo-lA&*<-W@k4HdY!<-qWHuyKN)x|ZlWD>-o(IclW^;9O{Uy|T7dKc8-@S{- zE(SEcBU(uR>EE61m?LyHsg2b;s?laZjWDbEQY7O-N$k;0Lk=umjWnV&G>EZB61ww9 zt$%$mGOao*9Nn=e9NRWQAM2`JFVY?(>5;+OnMfHWT|2;C<25z#K&S%qT0+(G<) zKsa-7%$%?8zKa`h2ht?EsN##C6k>hg-bv(HMXppL@xK+nP6i}nl&qPK*JHO#D}~W= z?c%L-=T=7g@_65D-j3pESi3`BFJie5FJt-lD%{IyGdqXWx%Wp&r;X1xeaF$+9+nu5 zEtp#6qT%qoM;V1EQ~iaRp~;ee&Eu9#k=`3wD@31Vx?jYY5WVB%^D*+tkCIh;O%G=} zz-Z{sr{0I-&1tToEanyf&>XR@@>?pRfB90_jgR0PKcao!JV^8Akm64$#32$Mi5Bs# z@hN_9YiRj6wCLQBmaua}o)RkbP8(d>I0_F3h&JkV758AS;$lOm!8jehLT@}u^b>7K za%OKM`F4C)m;RU+&n(<48b(_I&HH=2s^_~@{?>Rc)VR>-Sq(o{cBD(9-0UYD>!xOn z)P0YeV}cjRck*4f zq!vQEm)zMTpp+8u!Wz~rzQ|w#td7k-*3%L&D~_I;&Mk%9HqiA6qie5p{(7PM$lJVv z(iG)>FXc9U@_UJYkHv2m#!t~!iOkv;fEmH+gyToHcaMYBJ%(wSp$UaJEE0|A1d5~f zYsMBPT@E=&*j4*3BPJc%<=f(Aq_$cDyN5_S9#I!~ts<}Hhbf62iJE2lx`idPls+<3 zqxL4#ec<-n3Mmox6s|dY*)MoH-nZ42xvn?c(!{zE=8j`-{N&_5^5tbovt>s~XYEPA zesc7EXH!Pw%zR%Zy}&KIThy$v;A_Mia?aVZr^ts4F(!=RS|6UVtXN2Fy+xcH2h8GA^vY~{yM1dL-?!U*FTMyZocVT?c=ohNQSR#`tAS4x_*nVYdUw> zcm?jNqLSdPy7ntkYf{<7vZR54@3)`8urUov13Ft(}} z=G^@ds{6V^$yLkMzIcC{e7G3xqz>A_N`EJ9JA#=30j76Ywnb9oaNBNy@4&LcNde4Y zFxP(lj&~u(%=)=5c>~0FQ4vSIHx=E7Nv&&#w>IPSx8m%0DNuN=qWh4LMlRSe)%h=$ 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%0AO3@kU%RYsMV|-PZFpJT$I1)MilP35Tv7Ym zX?+v^g8Z3B$aNKVF8q}#o(ti7KOwi&KWV(oLVhh5t`O>DG|4v-!zXiL`T~9DRS1bQeQv9#Se({(Cz$>zb&=jCikv@p)W50WeOR!Qa7Wdg*!*t%K<4+8>PVfhKLgio z_>)=};~&uFRjW-f{t38l!)mn+v*1YMKda-=F6gPOJbsVmXLU8TF@Eo7bsIHX|Jab9 z)g#npmKQ!`d+*}@VdE83LjE-ypZA+u|9@otVZ1-=@9dEKYIEuWeHY!H`|1YjBHb0P zACZ>(>Na#3xPfqA-H(>x`dJY2Ks}0n7d!!cmKocR-_^_1#{T|Yy+h5~lYySUs~u~y z^=aozzEAO|+7ta}CgZwz^&ZbY90ZvpRM#_fNq z9-ub1|EYS6nr(kh)2HfHYL<`R74l4Vc$@4Gqkr*CtwqiHBZncL#!P?z;bh2jHP7UW zAurUgO}-uSmpaqr`ysE@SLjvHFMk;#Xce{S{ zJdafbRl7uO^d~g!3A2za!LMY6YMS*OQr_79x3vFJv+aK;^ewFmb-DFk612aecC9zs zw~(BFcI^xFOnC0|A;gEG{m`Dwm|wJOq15bp(LU5sOU5|6UN~vF)a-iEHPlHPk0#fP zuAw!xY1GE{)Y6*QA?t5kFKTJuP#f2WTG~ctee6>hKNea`+m8MkJOF$EeFN%mq@}iY z4E-G3K&Y*qLz8hzk(PI~E9g_;2Eseq9rUN=Bwk0mhxP_H5b9`8(4Su<@w(b;v>&*E zP*+pylJzgr-=^_;njPJS#_MTy(CyklFW9BN))?IjTm)`~j>sqTZ=khD=Ybmt4Ycm) znq5e|q1F#gez&24&`=wMX6?zlnk$;MC+}(_(1+oCj!E_+ z9okHrY{Wxgd@Xn$`T;l;yo#CTf1<$$n6Z8~(@s;f`k5HoT)U2ORzF*4zoFUqlor|} zYNI~3(46X%?KPf9wb1HP8}+k=Hk{hnUoA9mYNNerp+!=&_9Q*DrB=#pA>W&xH}HMU zsR7-e^!HkFLO;;x&tu~A+M>|bnrlP4eEj{U)|wwR__ z^>42=WEOI4kWUJ2ueG2q5eC8WUK#qa_7VDfxL;Wr+Cl37u2f+4#9GS`M`_zOAcP%#7pP zx@yzV?Dr$OYI9k6Z2!AzOQ?3+Sq?R zwWf{8{xs&-Q)@%b=GSLnPtBLQ+NZIzS?7)o_w$4KxjYhlO}X|^nUzk=%-p3wQ;@tRExtndA?W)@hp>XhJK-K zH2Hq$m)b6qpM(z4?wkB~=y2_o$qr%eT3A!Id@}zAVLn=-$t}W0Xp7P0`sgGCXyqoi z4-3?8P#5F-dqEofqyg-|Vu8KC7p%3SHjej5tv@pz&vGDiq&9?_U4OcUg=nGFRc!S0)6B|&94Qq@q9jBi=sC6f4r7N&G!HBuy`$x zy4-r^GU?wZXy2gspl733p_ilIJ4(jeCTQEKjqOR$exo*)m!LhOX3Gn6OVD0Z8|#;( zz15PeuQ7d+R+E}d?-iD$eNJtBKPy#pMU(pCJ}_1DqlWx<5pkOKij~LjBaG7I_u2mG z`~vPL!bWM%)Ki6<(EpezW@_`PS^q30EL&SkZPd4HZ3`=p<72Y5Yt+X2W@~q;+4`RJ z&DL7CV#|B&3fG&k9IZe4FyvDwhUIE=soCLzc&B+=dejyp~-)QeXCWO{5q^ygP+tO`-hg- z!>4KPCf5$1p=FxfIDD2i7u|9S=8a+8{du? zzQ=zWj(^hyn%$G3dq(5I6zCn9RZPdq2 z+S?t;_8I-9P1={##{Sx*xl^4TA)}#}eeyVUD&ew0lH*2k_jprAoT1RT*`9-PL z3*&76ZqfQ!#I1tX}dNa<4vGFa}u^|#TaMrJMGYBVZ07K{yVfqMtNAD9M_%N zDvUR#>$g+ejB!7@e!H}t7>}mww@WKSv+t|!*8ZY4_U~>@>dfjF+dsRt8r1n%|8{G& zFwW}B9<3q9S$)}~wZJ&5UwgH-7+(nWt&MRUL)r#Y{80E|P4D{e^e4lQXu;G*zVfJ+K+Wpw#qeWV zHpW?fJ+4ipX7%-Y_;GD2n$*|p;U~0()JFY0rFHH`_ZOZ|r?g(w2j61bcS`F+ZS3Du z+5nuM?cY<{P&C`0r!*I8qy0Fg`MeSLV{v`OI>--)pVC6nrQj#vxc`(tt))@3_id$! z)7sqs#Ls9;Om-5^XlqSQc0Q|ZH96a{Qrl0>wx`hXf_B^#w+L0*Ig_2hS4~cKzNA%~ zob7l;dq{1}@0#|~6t@UBG_gC`zifXvfoqtY?0i$JZF08bk6L4DV}5tE52#stG0(YL z>tveVBK)HDGT90Ixyi}SziPuw&UU<~`A{44f1rg>8}omt#Zw#k{zuw8YWUu827K=z z;;~jvU8J-8{}b&bn&tnWXcy5W|6eIS)o!3k{@+P>s@-MA`KPb?Op6U3jOCqw@z((+n!=*hP4?lQ7HueD~(c)fb9eN4^H{~i&4 zYkgVVvH|kh7U3VQ5Iq6x1U`c0S^FU9=h5u`U(l~n8`m#Ee@SiJ{|ma!~)UI_a8 z)W-G;dOK>izjB%idS7bRzvvfX(I+v}{*H5msJHoqZXdO4gsRU(Z-nO`JtD075|c+n zyrs*%$@FZzR7iw_ozv`&3pfZ_8pB-r!SsJq8|{;muJao(i>63^_L!xntDt0HF`X1>K{=X^RKBxVL`(38$`q9mg|9J{B7@iy~@s zp8^+0)P19TJszj!BN}j%@{1!HakKKx-YDOk$4U9ph?d->{N9KUxJmhw5g)x#z8#N~ z@)sjM<|gHDM0Db2%kTb1`5rt@%HNOZ#ZAgTj`)O|mGApT`F=c3%3C5o<0j?x$o|}{ z{D3#gJM%axUpsOTH!J@oH!0sRa_Af7hw(Tm-z?IFo0R`B(w&LEA<8e}cSY!k@DeoH@$<4~gyiq=u$4U8^$arp2J~=Xhn{9vc8|71Y zoRrUvOyefyiy||)S^4ZY%IEMnDL*wbkDHXA9XXbpt$)!Q<;U?jDeojq;HJxun8?kR z|IHiazvXdOelj;JU(C(QPkW>MbRH+=mq*UvCgs;f&g5q6Kj)3|b9tPU-x)cdo0Q)l zxqzE3f6*J|7xOqNedt-H^~J2d_g~k_NTt6Uq)Yne6(*=mHspO*X4o`7_+LPFG4-QhE~ z{O+*+X;Ig8Z))TEeNzwY&*J<3f#1cKuFp`%y16`Rk}V`tQ`$G#^?L^|NmK zoRl}Nw?FH(so{6MMfh4h#5 zudzJ&{R{tQ&-EGu$od$+fAKHbswGMhC?t|sq9)t5OTD8K?HT91)H0vL=A7tew?bG|wj@+bu>K0w+jq-JQoV0JP z2G!>#<@-c8;%4nz^Eb-3;Biv^^N-)>Cgq1jf56R_-X zL#@_9bo+7rhFa^s;U;gm)f?{mhWotX0dLs<4M&?iEqbVRG&4OObE1b?^QmEc4jhkZ z;EB{m{&~1{4YjfVU94MJdE6csYuOvFFj*exV!cWY?>|n3@3}_1S=)Tc&hHV>{;!R8 zw|b+mK)&-xw3l@<`Wx_>Xm9IjYU6zMu|9sobqAaGuaC6}HET~VNBdY?nS49i*V-TL z0qx%((Ic$B|0zGh8vBMz+4S`Hik`vr&!~<4;cs;uVqU(#waFWfq&C*y-#Y1y__Q}X z_l@cIy%GO!d*sjSAE}>~m_Tk)Kdmvr+^l|vS&#f@e&N=O)W-INTkpIPf5a@1@$nWR z+*)HOJAUN%mFvWWTN|6)I3~i{iMp8XuMc7(t=p)L`A1tj4Ws)@n0cIxr--%|QU4p? z!s1xJqOE0bxYFdFG0|4P;cR~IK>x)e#97^4iSq?-$af5miL>^1`_~>Z@z%PY%xQPv zd0OXA7ZApmJgX<5&iwz5pQK%M^dx?XHL@`>v)Xsh5FfD&$X^W zM<;7jH=O(5sf@}~LLTGaW%`zrap-?7#pYNP%YSXVF$k>kks zISQ=j(VxNG*TocA|1^1T%s8vl2r~a-!4=}=F%zuQ{FtrKKRX77ppYjNHz|hrrI<_ZrSQe~0m@O-BDI2zO%s^@x4&e8uF7nQ*`0T+FAR^gFy?67#Pg zzku&0#!TVyI2d1|#ZKe?1D+Svjh)F|Jw*_j#LnWrwS#yr_k$UN&@OfXcR@Aeb7B{9 z|L*~OKRtE{cMtIJ*cIG2N5lA+*p=M%;Q3!r>?-cHaQsqY*K_|hg7p74aNm9czo!wq zk$W=qZ@!8xT>9z|>!cmIcw4~ad@y&m3U zyBK?f+wmpbZ^a(v{uY+^TkLV}5wJg=$DZK+3dTp;i`)Tp{jYHEOo0AU+;#2&{?H$ayTM%n$GcD5kKD!3pB)zW6LA819~gnJkquXp2{a$oQhgckAdaZiTz zYa8E;`yV);dd9cpo(uJNaC~d-@@eqAHNFjZFtisT@$I<(t| zg#CLj-ix~*EdO!5H+OBQ|F7bGxTiqiu(Yx zuR#fM+~jwgauU+HU7$WqO~~e62h-0_$mMSQ0es&#A&f?SJ(W8yRI92zc=AK?lWWHeWrwI+`gf3|C%s^ z`+hmxwh&ys6TrUz2bKisQ)sv2KA6rezS8yNx2kLjy3GOXW zKWZhN;SPr5-6H8ccMaH{E=g6~Ked7PJ(I3+YcPMWq?_E&q5X|ay3M@@&YzT|JKSxr zLa!|87w&TvaD7dB!2LO_|E8oz+~;4x`wdBtxwRx{50aj9cZBo#Mv_p&xPExT@&7r= z!o42W=l3LuyB%!L%Osh5Zw5TCOxC%JVf&jV+qh@K`P(Mhk$a0PybqK7HuvPV&|gV@ zhdTrI=fLE;-0h*fM{<4cHgLTNPJWkrzAxn4lbdqaUkBfpNq&#JGwhE^$t}4XLw%T* z{64n@JU{tE?(blKtV(Xf{U{msXL4KaD%c;V<2rCZSq1wuxg&QZTu-W!yK?vM0ngu) zdvN!Oh5li3FYfiQzg{PQ!tD$FwHhgXxu;)-`_Lm5BPn% zl!4rp(7u0~GMGCV+RM%8#KZd5baW94QZA6L(_iE^$grsxW_W|&?DWTk9t)c#=M00P4;oxAyu&_1V(=3WK;yIUz^xJN+zkCa^Q?qDgkfLjHh zOc}@B1deCT)Ct^w=8)x0W;snfaF!uji$TEcyI7K~?4oyq+-^&D=uYy`$Kxkq@x_s~<9a$hKe>qqJ`?g!K>xcxKXc~|NxZa=twjZ0n4 z{RHaA{L~HH z4|32fp+td1enfo@>@3pB{xsRWK`jmEqy8+bSHfcX{_k!iMNxQ>6ow}Mk z5%zzlw7c8^+u?a>+Hc&!(B2MB`<;6ow4c6de{yGbguCn(kGPAL6F=s@a~HRjeOHtI5&0?wxqqM9q%W-B#5BRda0%4+ zrpXd_D3mWrQ@9(nhV~^*55;J-Np~eU2FQ3HMf5pTJRlxQ9V|IB8U0?r(n~@lUx0SpJMr zpK(uws8s)|v4%6Qm<;lI_9~dt& z%A4C8;`c|5;GPKinHQr1xZA_>_4HuwP-w5~riXHq@3u5a597{&^QBFC1ovEUr}Rkf zld!yA=~3KYmcaJL#&VZH`!^^(fqN`$k5_s!cRJL!kn}X}>%MUPO;6|UIsw|_^bGC~ zVg9MS}AJ(qjM-*A4W=W&u(Wo+gi3FWsZY~|kW1NARs8~4|w z{$*_EE}sbXFJmY70jPgHGWKvM!14byV=s3e?4KbS`?xb=p}(DRfLnm|4a_*my%WyQ zh>SAs5B`AX-x-IwJEg$*-HZzEZE${1&N#{4T(Af;Gfr`b!S*lAIL#eL+pBZjOToo0 zE^#l0`Bgbw=B|MHzdqv%_YOF}wq{)AZba+H4epW9-#wIZi+fpT_tsKYCVAnIaa8C);RV_rF|z&QEc zsdl4ZIox9w0_L*mKMW-EFA+Y5`)4wJFZ9<_nB&k-VwquLxPBKmX&eRjA27cuG+rz$ zq|39|mQYU>LSeQ;9V|A#AU1!JFYi6tVk<*eV7wz-C#@)+g)_uB)ESW)6=#jjIAHZPxl)0 zscmuuGs#c8jB&PYLzDb;y}^TRhtMQHU2pIZ+gUWpPuCkf)OG_+^3(ofhS?sYNq#zF zjEk*(B%42R(ik_}r)ZL|&KTovb4QbWb^aI+n-ImOC;8uR$9UV?qvyc!nLozQ=8cY6 zLmXiH3Qh9U%f1dqTLa6`JIqPmGDMeTF9a=d)uXZC+@Sf4(v% z#ukGn`R6-h;%&KTl7GHGCdoDx9ZsEUTZ1O~=%-`SZP(CwaDF;ujz+B@<`mE3B!3*1 zImwoYCi&y^%*nR#Xp(Qv&zxd&NMO^GeDc)H5?e1c$tN$$oMoGdCi&uxnR9Kc(d%IO zJ2U6ocB4tY_(0|Y+Zpr-h@Z&(-ge*Q-(nWqo}#s-kUz*=YI8^=%P$s0@YT#^wkAnz zeMr8!I&-DX6HW5X-PJX=5H!g*-_KlYi$#-s@w3czwufkvFRqof(bg=P&5z`Zn`V{T zx}ZtE_=Bt;Y|dzsFK(Z;)fS5;`QdI^+ikgMl0W_|Yo~1*`ua_{-e>K$RiR0~*eh$V zO-NzOBl+T>tbMl6&?G+`m9^jIfhPIk#H<50e>BMlkI6b{i$Rlo@K;%fY-7+QA6%Su z#5NgC^1)GAM{SGHBp*C8>zHi=n&g8QXI0qFph-S>P1Xt99W==YZ_YYtdxj?Y;Ha$A zHft(df07U0nRUii2Tk(9KKOFhMcdctVu)8~ zU9zn}lYH>QtSh#CXp)b8mUY#pr?KUe{BVuzTeeu-?!Bn#pX})!_L{i+uEQ>e%K}Zp=}zP`qy%Jjo9SxY`c`(!yo?H4glp3lDk-$Rq< z^K$NRd)-{NeDZwWp6g<-M3d+9@8-JOAEU|h`R2JE_ThPKdXhi>DA&tgh$i{tPjdb2 z8_*y-5LEf07@*kXvL=MYH_yczYI_<$ovG3(+h;JkdT0 z{pfp=KmOW24bAeylk9WREI<5>eJPsdhrhG0LzDdQ)!btHE;Pvp|CBq$eh0l6+QWyr z)9p@$Y<)?7xO&hmdpEQnT;E>h&aoGwNq)F#)&lz~bRLwq=Y4PAgC_ahdU=cOr_pov z3qq5;CH5v?vH5SOUTRN7lYDTSyk+(>G|B(=%v))%LX-S&&%8DEduWpX?U}dUE)=o( zk^FDZyiN96Xp*n)pSQ&xi6;5rLGpHc7MkRPgL8M-E6^nW>z=pM-hMorAIT4g=IyqJ zph-SBA#a~O5lzOkjLO?@Z#aQXPx8NG^A6ctqe;FvA@7L28=B;c6Y`GQKSz`N@HctK z>>+59|1HV;KYQ;2=he9Vk3W0w&u8v4pS|@#M}w(Gx(qedA;cL@D2+=gL?R6;GbrT}gCdtmL@qhGhyPm7T5Ipm-ZP&X&iVd-zt`*c z`&pOgvY*R(*7NNBS)XwoV~iKyHEl!2BaAT~Ja5`78I6oF{=012s~I~PWBhmZwAV6v zPp9%={CD28H!}J&#`y2NX-yf!8DspnOVOJd*9eCEUYYh*#v;ZT|GjPMrVKTM>|wlj z`?Sp&of%`i_v>lzWE3*S`0)4B-p#0CjPc(+fSVX&{5M?ue#TbD82`;E{vcyFV~qbE zH*IT1QVr#Y@!z(^+cMfQ#`tfC;_VsT8Dl&*r}(pslNe(>H(b0U4{I|5&jPzxU@!y%np-2H^jQ`Fn4oBuN z#`te(aYE#2#u)!yP@EKbkuk=9A1F?ayvZ2jzYB^}Bik5bymx7FS|sac${*vsPZvib z{TO4scTKSqxtKA=dtWZzFS3d;#(Uo@J|OY~V~qFyP~0|R--7mLsr%oD_hX6=iX5r& zJcaS!gpziV{){pHn^1B{q<}HTf7_I_kJK~9`0t@59V2fr#`tfylEWg~8DspnXGy2X z9>y5oJ-(!Kr1vbU55{-bUEeiQ#<&E^dumBe6WMnO4jQ?I%(j&5kF~)Pp zm-LG4V2ttH@g=<@-!sN|?)4>qjU>&c{4kz-eaTUggBW8x_xh5fBRPyQo?BAVCvps9 zjOWfMIVN%nV~pp{DLFQBHe-zE-c@p3WHe)p=PoSi8@ZV=#&buMoDf;a7~{DQm*hn{ z-%91dc<#!QlOy$vF`m1zWMCw14)HOb+rH?`NETy^=Z?H-P~;lM7|;Dn{@}<|#u(52 zOa9rB8pasUZ8v2|q=7NUbFZ5+H1YytjORKxo)dY4F~(;jWNb&ca#i^95k28 zgYnj55{5^PW=!$e3nM2nZdwcLPszwgK4Xl({#Q>30T#%HfBofcWe7~`=wmX<_zi2PVMe=4nr zsQGArmihq3-@MYQ$ayjN+0q%2r7`%k(%MMU9iIGwWwRm|F@9(%tj}e0BG)l~r2_8L zmd%T7(D+u>6V{8)S+_;r)R^M25b=(DNb>yq=C?;~zLV;^0@jnu%WjV>WxVW0@E^~g zA8FE<;=iX}a7W~0!aDw2SaxS5T!;F_>gLVh?~k}MlBF@pk1tyg8Lsgxl?v^DYuSB~ zTNvZ_RF{-J5cyE!M*cmgMUkI1o~L&0hw-Mx5$i6rPvyV*?0-h08q@m`&y>|i2FLJk zOIs2dsc~7-Scsoy40t#)Mq`O@KO89|dHws{FP1$VX?r)?pQFBq{lt4^&qNk!T&8Y@ z{68yO5!uA}jU}+(C|eb2y8z{9sh{9^tMZp4Yc(!b^MRjQ{#vB&9^!ui_;#}?@{z{! zzSvul9U9B~VsA&j&{&?&rpUiZpP$dB$nODs;JsdZ!1pU6*&2)eO_6RI%lluOBl*n7 z_sKrE;+@DapZ>d%%Y6FpMy_OidLL~|q?Y-I!+O`Y{JqGXG5GOz??)EJ;6utkh&;g< z-zUp1-x_%?1}C2XQDmdWa=(6CWQWF7|E}fRBEM_=LK6Kx{Pu|X53KJCNiX)m?-rbIBEbX6bx7V1SUsgq~-6cl8Yei4H zR}9W8?`kJVIMIGM2IrOk-CpL?KiPghM!&G)Wc%e9`D-gq zvEPotdFB1>tv>zJ?5|?l)W{ys*&x?&*wWQg}X^2$%QQ#6+LKhr)?V`~4|6=&Lq z#>m%IoMm^3!FlC_?Os0pA$DGj{{0n0?EW$Gk5mk`2gl&N@^kIsKK)_#m>B(K6~pXt zG4g9F&bM!f!FlDw?Q);~2zz#n{`!g$_8l?uZ&qAnFO0!?eP|5ME5F9>;?o~*9~Gm2VC8uG1dV0An_!<3z-MR-zZaYe=Q;f+ z*q1Tx2P+lg8#NYxV1hk8pg)`C+nKOGtDImjV0=m%;)!-W;}LBTPqG^rzp+2!YwgvH zKRE#LWP2Usg$E+O&fci8l>d5rGxPCH(C7PKZ-46JPqDvdKGx^($|?2_8cX?au&qVd z-eT_tJ5}RSRb`?44R#wJzsPRKe0)>!_VgmVkH%tes@=~gKh@4>`AZ>}BP*xc(_;9c z0XN!PGzNck8^muar`hK%#`4hj9Ln=c?6Dfl_Z&*>@yy5X&tBHQ#J-+!<3s2lmDh;^Me}5P+Q!DH3oj(2}_HO1|n*WI1c1djc z{$*!rT&m85{1;XJ%kJajKW67KKNs{DRX%2q&{*1|!5-_AZ?MO+{DJU%9;s}wr!YPN zp3ftdkJ}}TpMdA{NaYjubf5l{_H5?ke9~jkllC%=CBG-_#(?|=mhTPo;o+4}+D$(G zGJA_pf0_MRfd38ae+v3fR4%iBWV`_S&9jwH+3I0zuTq6KyPvIm+D_6~%JYmJ)mZw& zGj=A+9~FlCUzN|;**^YqJBRr+|1Y;s(^%{+x6cX4k6`(EFkh~(Ty9VD$*-`Beex^p zYL@Q;`M+7Y!oJfdztVotC%@8ugypfmTPj!DPcp{(ZmC>luVj2YJg+U4tL+Vp{{`#G zmdZ8uW{su%&)J`7EbZ}}{Uys+K>L1N`JDY7;~H46KCW!Ee`S0X*#Eflc{}_Fwzt@O z!FDtjdoS33(YRE-1>^1W$`|bRjORfA`n>W*y9?v(VDIzFwf0erGhw~^ymFm=0^=iK zz5BfKC3_&_of@yV&t`mSTjX!BFV6&bKkcA>XYAO zAJ2SzvoN)4lRe1C-)s+y;qO{0e@I^kh7FA*~@f7Pia2eJJ=bj zF+JZMRR=p)$KY?O4spr}C(Z1Q{!Es0i%&nxsf&>}RF<<)<5KlJJl~(IvYdLx_$JNI zRqdSypMD2tl~2EevzFyYh2Z|$@D9#8G)b-%ie10r~S-z6{E{ zKgf?_JP+pM{i_dmuJXxucCKUo1X%A4)!A7T!=HCxXJ@;{+x7QL2U=a7-x-sC+|4=g z8LaPi1O4MGlDj!w8KZw3J~GESfiU~SM>=OQCV%)y=WLco|M`mKBb{-K8=i&pF{8Uv zrLp+y-JJy*SEw)Nz$;7sFu_mcNJdg~rl8J)9p%p1%*%!}(p~QuQm0@675R zPU3Pbf2mps?Vnkl>qHoT5A$Vabx$W#V|jkPoNVT!e}3DLUQRCKD`CBv1$cNszJU4o z{7`-zKP6e#C#7 z@tNR{p#0|=Z%zK~3;e!%ALm=b#_W%X{}c0Rf7Hhbts?suErvxK!c#+@oNi(_Le!U%qpkPd?xIJIhZ5D}$=@oq>#Bh37Y@`gG@P z#z#Q?234QoT&(ddbiaeY+{VRA2{oHq}P)nP8ngI|A#uunLprL zd>?116Mc^4cfx)$t;c!J5W*~ffpZ=6as3%peSy=Xk>qLpxyV_|nDV>C$$Vb(S$~u> zD1a~2SlVlpbE(Fqiu|`x&XqoXfisEubrAOA9EF7xqA0>%}WIZHH__8#p# z<&z)ntY&%imkX;$JL?#uzg$>7#(9e|`pbpYW1aUIe+>Ppu=)yTyT)R_(D_zlsZXKv zGt1+8IH9`GF<-#;C{?%~PN=@pNzqv3uX6TdKK7R>)mJ%3X)N}yc24riU+tX6@|VMW zT3UUzGuX!;=bX>{!LYtmSC4b9^6|$z*D@dH$HObfJ2(3H6P$_|{w>uLoO^uyiO!+` zUdr!8o*OkgBxzQ(IX*e`Pa8Ib=M%lCr$^#1B1=V`_}VLaYnJ=Iy`lfThZ@;be$`mYcaxL6-fK@o-Q+kLmnsZfyjgjZ(~)70!Dse>TiF>#HlAPZ@uP z@sjFlXBT69^KgB2jq?lR+hG1&UwyL^-hk~{s?uQnU0*%hi7?K9^>=;sT<0&0U)K0` zrz7K2VEtWReW!B-RZ!abTR5@OyA&Q(tjhM-{kU9|LDPQxft~io&K(iQ9pP3M*;n9E+6%eoxa`0sDJv{ z&s(@B_AQz+l8`BSQG3tLdJv*S^+2y1DPt&`) z81)lpbayf8x0`WPK);X6NBvGSj&(8W=gv66#i*YZV$?r<#y}UN z{)ic81@zB$`KW)zjG-<@{fRTqbusFf&bT0;f1%4q{n{B9xfu29W{h$%>Mxx!CZJ#F z@=<@~jH_IX`fF#5b1~}o8GCI&f3nL*{kECcyBPJ~ub$#!)Xy9}HK2c^%SZi_bEml& z^-mvL;$q6bBA{RC@=^cqgR5PP`ftyuaWU!73h2*v`J_L`#iW0mi%GvOpnsRkNBwOx z7PuJoC(gLn#i-wI#{B{P2VFkux6NGaV$^@X`kyXF{mjuz0{RcTeANGP#!?rf{*N;n zT#Wj;)1MCLFL(K<-*fN^7gPQ#T}<^~6VQLoW>KAr&T#Wj8HTae@wFl}Cu4&h1tzM7Bf6Hvsw0_q%9W*BW`s{9Px)DG59MGSe zn8WQS>!o0N-ZN{CblVr(`|g^aF2?qLyrxe;|5%rg&uc|ZUl*hP^ED^9nDkF-(_5EE z?pO9}b8$?04b?ATUoe&L^_o*$duadNngK3G`+dfq5zs%=?|IBGFM*WPLr7ouYF^U*FA5^=1)E|823>TyRAv0@T zO!~J5^yj#I)E{x?JQt&WkC}J4nDp-n=-=z|QUBzb_qiDL2hDuI#iajGK)>GQqyDYA z54#xkN6mcH#i+k@2HqNot^ZRlU+16ujEhnK^s&#nnDSp8&|l;7QGfY}Mi-<0wKLbc znDk!>=)danQNMA-Mi--g*~~XxO#1Hz^tZTtD*yW~rt*L2V$$Ch(Er5cqyF6^K6Nqb z&z||Yi%I|Mfc`fwAN3c^{MN;&|KQBsE++jS1NuL?eAK^x#4j#J{l{ni?qbwmIwK6T zZ0z$(VodYL$0Jf)jQZI{dO~Q0{Ta~eALhD*~7)C|J}@0{VSiKI#|sJl4giAF4gU#iZXa zpnrdx+1@s5GeAMrF&e<+T{rzi)x)}8{M-L0=pYQTf|FIFnU5xr2 zYe%>k^?TM{63{Pj`KX^DhnV${!_epNvK8kdjyn?{UxG3p;*i>GKbKU4jS z0{T;3KI)%Qdy|V%|D4)V7n6QH#^PVqMPK&G*G1oC`5q7-n^s#F z{fO~*5TC29y({_)<4o|krq$jZwO%KGYAx_@t6dOHWqcl-Pv2I1PqYo=*C4)jckR8= zPK>7k-&XfUJ2Os!_~WA5h0(t<{ww%ri)!zWp2YZcm>Cw;J`g>V@ftY4SXBF9bg;(c z|Af_|XraauA6pz<$e7||i=&I)!179bY;knC##@v7?*xBxz~X2lVUCY2j;?1u#m5#$ zo0$I)#K*^he8(p8*C;-|IND8PDvzNSM|*2rs41i zeIlCnHr7YV|70|(ajAL<@_(kwlhHGM{AJN|nSU~re^>6Z=oBCS*=QN_?*sjmuFpnS z`uHoNFEalS(9i3+BKoe6zbd+o`Nu=~9_+d*dg!Lu@~w^@u5qba2Kq%kS4aQu<3AtG zXZ|k8e^1xvqm@4X3(=dIUkLgy^n4+@z{g(~eUSM>A^)elt&6Vq@z+P!#qgs!>!aIz z{8yqoWB5~ZUWq1cjxGP|QCs6uh4#PAc|CfhkNLJG#Iw{5ci{VQpG3RAM|k5>@Ske8NBc2;9CpHuwVy^W*O-1EZ+-1& z(He~_l3p_nxc{>=I*0L91$dsbGg`;E3GPcFUdZ^Za>Df*&r{prJo=5=ozWrhd-Z*{ z_N(YP!b#R_l;0J-o-yUOD_YF><5|S7j?sr-go@76SkCu$MHe&1`xYP7?h33Qg315+ zvi9HZdV%Z554GR97}t-?(LY7kXnQi>{~UeAm;cYvw>ZC!FhB1(_vh#bG5o}ve~Bi2 zfb}g_kDrbA(|(Qi)mX;UZ_$1lQ~8H=|1Els#**J}(MtmIV_E(InExX;{|4nXRA@0| zp-lCcPmx;c{U4ErRQlIQJwBydZu&0hBgo$uT>krjqnyZ%4j|#ZH%VG2K$LE<)gZvJaz|7nEmb%Y^?C zoA8{3fAB7n7kh|JcpmTY^Z9f$@=djL56K1bm{r72(*4m=2WlEppXZYNrr(Hv!Ahi- z>Z55$J)>z@Rco4{zU2J=+v8m7wJ-X}``~-q(ogn1f9}hk%olBQs2%(m78V}Ak}l8H zkDJR$zZN-JAA=3rp%d1JA?1j}%J>MHjj?%^Z5VTK;@MD2wRHmG?)MW+vf7NP4c$gTs~eohiq(a zC$`*Dj-XsTd#$ZkQ0}NQEQh5It?-v8L$`~i&gb?S4Za_a%W;}|?RN#sO$xN5lvCyr znfGP>rS;rfmt@^csi$)I^(<9AsHJp69S3_REZ62`NG(NnLhK)e)lFM4JwY8i0%@WW z`}-PCvR+a-y!E8R6KKa!y_iZpiJETuzU;^2%XlMda{UbU%S^7HhpGM+*FRo*$kmIN zZ@hFF7r)+x^|sWrnugRpnugVTno55#*k3Rd$qO}EFNiI+6E8jF+J9>fwflHp7l@i_ zU+HyIN$>dgh<^SJQd7OEsiof2)KIOp`!f5xE$1)gfq9MPBwwQ7H*k8qazxUJ8_Yjuy1!=r;Jfz#vREe8V-%|g0o9xK=7ymivCkOH4 zuy@6ILFNOQzxwKR&{Ah=>iN;fKS=WLvY!_$ui!ylP|j3Wy@S+p{TxZJ(EEe<>Ex$- z{*l-fx}Yc7|M+Ok#ZbTh)uUJ+k=qxQ`jTI6s7&zh(ZA^g>jJKi>tLS7^>I0`dor)S zI0f@J6t$Dd?G(h8t7o52<(;W1%sV~|`z=|AT1<~wpX2bQd_lYM(kVZ&8*Wz4l6R?o zVvlh1a{AN7o>#w?`CfifZ=x{%dQ-lBY`OkV%jw?pk>`hU`25gsXzBUMbBsriI+C8( z>6%(9hTc|(bIM}?N>i0HN+Mk)c546;h?!^Dk z{QEy1uMj^bxc?819~m$G^#0XS&&;ECp>l`S+=~z=sK6Sg5z^v_-8r=lN^N`DYP zIfzBipKhsJ3NfFMyY5`3{bA3qZteOd_IF;7_Dr@5>n+Dc#xKD1=Iep@!NGPBdEtwn zM$~lY=@((WLA&v&)b}%lY&ksFa_eU=d<;Py!MfRh= z!hDPUSmHmD9*omS{4tnL@lR6)(+R@?G{>pLuI%e2UE0sZWi*Zii=N=2bvUX`g?=f< zA*G+lbC&jz^M~O1MDRR9;?5jUhKEl-fMck4epD){Sny(zk&T9nOC2EjM_uS zMUaZz0XMZQ_ryb(ZmMr{ky@%T2WkBML(sn9KieKM-;*C?{b~PaU-8vK_RDGfHDA~M z(|X8r5B3v^rxR8P~VN{tnAq&+8abQ%Snii{>Ls4bc5a>TN22dZ?LRC?HSRY9?2%>*3iY z?8*Jvei-lh{d5G@TjFq*xXB(Ao&wD-F1Te zAUR)x{fsWJSAJR-LL5H~yY&#c;JP9CoO3JH_rKk~Qm^T}e-kR}=jy@Ke&T;`?o8#7 zbHat}uLk}5bM?8e`27%H;&WiXeEf8g>-i7LPy82ZpVr2o|9rgK`ikoPx2uqP@o;~- zJZDo~`4P#5w7=}df5qQOD@VTPPX_S`PZ3|_1(P3cx_kC{gQ1S@LFuxel<_X<2KRrY z=;u878Oc*R#7~YTEPjvd2UBNIy3k-eGl(T0@i!ZvkIlzWG)_&mk@NfdaN^Vc)KI6a zBTV~C@?){QIDXMD`{xzJM?FjrA4loL54n8IANiS3{#ZRJ*K<0KVrf45En-*nWL`jh zw19lHBk5$vP*RRZxIcb;3zbje12hjAit?lKU_TFHu_x=ke>`~pyvWHsce(bzJip`^ zKGzJcD-u7Yc(9>@ap7S6SL_Rw__KRX@*uU#L|)g$zQ_v|`TzF(AFSV>#bege^9t%y zd|K8&Lk)!c3D^VD_4tFYPHG%dqj)?vTtjwbT{>qZVex}H>ia2{x={Zh^{b$KSRMZp+D&lpY3)nCtuDWzmhD14 znDH3P`5)f5))W7Y_Fa~$tfKsa z`!9N~Cf^6L)O5XG!hMuWP~M9N1+m-*3eKy+c{7NmANl<EaHzCZuwGKJPnT`>(Jr2KcltczSfc4fn*@@A>FUvTx}4y~X~c7l-{Vpvonw(&Ds2o>FP|IMBKGPj<&$=k zc0wB4U!}d}o~4X4iP!kCrG8*PAl4q{EB8J{Ugk0JN2T9NzoC4+a|^-o*5`et|5^WT zav8PTdQB}A=JOXB2Qn^#{XdAs-y~|f@!{Hw(Y|-yNPZQZpESg#%eXg`^zWd(hxGZG zq28@TJ@Dh%PY{1x=1;<2T%FQA?B`pmJD(Ss?63IcE%h;vBe_Q`{X*h!GVW^2sXh(5 z|C;Iyw(G~i{jjNy(Q=l$M(=YBl~qIalY8|+9Bg0N_shA2_^rWoIj``a8yL!u;U4Zj z&Nake3&xuyUy18K^a<9(QXl;lX-J*F4XGE$*l{6Yk~7rt7yJ3aa|iL`gXw?toFd-2 zNbvlkGoKH?q1UhG=OFRYPt*1E`oEk9zOBcX*U#k~QmC|>v}3&UkXk)Y%RN4c&w5zK zgX{<9>wS{PCv0(Cw|ROn4kh!a-=64)6v>C(dy69XLm*$mmg{Hu<=`G(2|a&Fr+(>` zk8pFjpdR&4i|=E~KF^zHWnPhd2wU#`DVd+|;r+!Q!Fc~>0sBEgJ;{&yvBl?VUj3*Z z&C}_8G3Fi;zi%S#LH)+F6RaQcW#8$^NjiMc(K+HcV|LqM_F7Zd`eubqzxr5T_o`vb+Kf2yie7kwR!E)>i<9j8zo{L|10QhHK zy-YP-`w5on_8gU4*4@$f5SDu{@$xz6Tat^7_hB6I4W371(_3ms=?AiJmh*%|blfI> z{YlSo&qe$4d_vS)9|Vj4=Et7DK>2!lQjWc+Oa2l^gMAOzo7N*!^&C(41|NTg?hO_J z#di3k{UKia|EKBF{?w1X_uRw}3zk#bJ?Nj`!uv}Z4>F!<{RMyR2dcO5N35WBk@;Nw z_h&bdoX~yMPs&gGM2TC4+;vd+vM-hWq@>Gw9UB`6P5k9w7>tkNPjfo_ex1#DD_L&*J{7sQh9ox9pZbhVKs;M2SdA{ zp6SMyC652?V6rFU8!^sXa{o%kzwDQ&{^DO7s_1gE`{6&x&VAf(6RQdTo7Yw03%*kO z7lsl{_u{^HDEnE#GOr7k_LcVk zqxF>X%lV+JQ-ALM)Stbl{b%)>-}C#=%I~-5`6-6_LGN>$`vY9&mpY#4 z-M8|mx882vHCQjtU%l|(h~eHui|MVmOL0|$-ydpy`$?RL=>NQ4%kf@AwVdAi`nMb> zHdM>$t+z{YVM9rLxV8QANqv6>`mLs|Z&&dv{O`SceuzK4_4N?D=d7px=Eo4H)Z;C* z&vB8!aVVm#uh%d=-x!K$>-GL@zqa`v57E}=H-8be57E}^$$eW{AN)9e`)+5yO1^{f zD93SocBXO!G0A!FU5cEfw+_p_8H2ySA@9Wmu_yP=WGs)VQnVih=jQ(G!BB;QXTlcZ&`Oq&T`-Tmh=su zpgoA&X+JWg61m^S5R{-ro6P&L?4?`8=h^p?6;C$MMJYQ?FyWC|-}}g%ZaXe^}@bzmi@^d$4k!;I2x<;ICdn`L-mF&rke`GHy4S zSJUu)`z)yERMKC<^E^>g$2V~wBv|*4EN?#|aW>JD{i*>`ZL;<`{KP< zVL9NvJl(&g|CsK5&~Ny8>HRUtMNlp)q^9sXO#5a-Aw|14YroygZ}4cWAJ2nXVRiYr zh`oCoKR-))kHzXKSWgQ5_Vjax{LespkU!dy{O~zcXnkm($H~5wTiT-!=%IY^)yS87 zZO|UYh(n6*F^2gbV}d?sZ%JO-o$QD`q26=ry@2u&Ie9*WgXd^rbwLrzC%ET*qNmFb z<&|>*Nl$o{>`VPV!~O&9GFi8`p@Q|7?_5#3j001RFF`xr`LyI0n~v>3`Iu@l-YcX#~mt>{z_iNxD z)>zdR9|qs zHkOaiLB1o>Vmj1I)|qMgc^T?frq?h%kEzy&{4mak`AWQx>{{;k;UpjN`^cZ?_$!ZZ z)JHj?_^-t~upacC6f=wCIa#J!594uP7~41T)@?AY|-IQ@md@r3a zyf+Tx3iF}(wl_ZP^U;2Y*UPXwpT(1-xHrjRx#&K(sn*VK**?jK_GwqS} zzw!5Apns<7bw~0|P-Qh(?nHG>Ez%@)=1io?@VgO6Q(XU9>Ot~w&qvFLSU$}1p1&>f zQXaxyyXp6zv*a8E_H%llW6^gG+;q4f&g<8|bi7X9PqlcyHIy$Mp0lj?lK$dfsXfEG zf0?TD*;p@cKA`u4!s_A0nC{KfG@n?CzSrZ;$B8d`a@Y^%ABEUke525#rLUhgw;~MqQKCajJFSLg^o*v1GyquQ;)!!M7!C(h1$-L<=r^Rt9 zPhR{jIX^-@EQjb_%zlhu@izoZ{adnw?XA;mfdS+5uY0Kc`{K*}C(%cL2<`gPp}%Q=3&vF*uG1>a?-4bZ`yKX8&Gg~9)4DD4 z)X#85IBpHvv(!&_APuR%yoWTbx&uW!x_#kaQoeQDNp88OVJ(kx>tKGwem0r?HI&D8 zAp2pqFZ%%YW3u?19qXs}0U_0|p7QO<&qe18{K_emFZl=TXMkU&_ebDo(EF!Jt{;wN#6qufLMd??*w`ysbqNW7))HqWJuAjq)YyEA3DVMr^D{|R?t4mQ$EsO(l0|=4*9RbJc^PeC*Ohb z{9Y-i*rWHnOkO7~_dC9lzN#zLL)QIczeDRVFTIA;QVl@y`N;cXLQmB7HxyBR?-=@_ zoG1Cxq1-+kM-J;Ja=L%H*h{}nk4MH?GGEF0a7b;^>!x?l8||T8+An+S1C=wx7oUop8%a?^R_@9*D8$Z&{ zG9SwRlk&0X{y3CZuLH1-Nxgh>@O*Xu1i2RZ@SOBL3g*Y|52!txmkaBM<&E4#^^*K# z9+7e*U*u3yzQaQPxA@^qvrrcQ^U}pXyc6bg^ee?~i|JXYi~qs-KgtWu!hhp`oSvnD z#@eo=1EqZEdm<Bljq9$VZPEYgY^-ABOZVDYOJ5PpB8;7hsN-nJF#+2F%Z~qXJ7sAQAA_8fpZXo#r`3M3w{9PZ z{utDE+&ZKob<^8ull36~*mcTF7d}zkAL?>vnM&?kV!l|9Sib|YzTX0J!ZvI5v`FYlh(s6v$S;y;qF z>{IZ4hv4(Uaq&I-h2$T?ui1}9I|(|Dgz~gr%lyLoB4|H(kK`qNzGWz)raJ6c%11Dk z1MP^v5tOHN(KpolvoL>Cjr|s>V2anE9f}JDpGQb7fN_NLSeuV2zn0`s|8{K`z9+=- z04W!>m!O@+XdHO+PD|-no*UO=xxMxO3>cr7e!BL@ zJ%3B~$x5d~KVrVDPm+%FAnMaP=-H+D!1Kp+d1B_hOK~5OWvY=7FVy{FBT}!w2J3wm z-eUv#3x6Ux!uW6e&rmI5N&ll1@{#zmyuU5wr+S4{?<-^Th4-Lf{={}5e?Qm`-Z>!k z6N*#*QF#UX7b(|X^MUnG_PtbYQ{nq5n4hd$l&%|3x1YWbniaqxFZV=)RL=2dbOD_# zgWm^*_*KA<9>)Ej)*5 zxu=T#6YD8he}@zF|Ay-jq|1Fj?O$bK8vf_m5x)!d(GGoXh+9zpU=Tt3YQ`*XCv zC;KEg|65D?GTxozNKdGoo9O2NImx_<;|}wUUDt4YjEggG$~dJsvBZnvJz*|?OXD)w z4-m^bB=^|pKANfRVEahArdi&7wY}wo>piW*65kU$ru!bFv=6S&_@2+9-Km}GrV`zN z=VXw7y!%SBub_7H&f9bxI18S)e(w^_!}UEn_&zDeFXlglcEc(e_N{1No`{@Ub2abYyNq|)kBD6E6;wWnQ%ir) z=V;KcL{H@LoDBP$ymwB16MRnr=U-?i@{7FsoO>k6%lnODC-(d(wtZv!d2IUo+sMwi zPmqS#F9@?=kl=n-NbVofeF|^Ai{0_iyE##c$6$fBF9_UC!+#KRFL0EcK#ume}We757`2Kc#(J z{$4%!Wi{9y34Feg$ma{*`GK56(0N73<%?bM&+PNj4xO7|d1B95V#`Nza^Jy|584Zs zU-TsX#VMGdH{TNW$}RJnzK;NMb-aHQEcX*O{)~3ud_l)`q+eJ{(y4!$>ZX+_=fx|f z-`#UA=}YjSMvVmC;=^9+ll5?OI^zIEA7v`@3qNu zNe;||K`ieZ(|e;FH-vhLzQnr)2iGG!cffK@?BRdz7>~eyQ>ym?A^kf_vEP#udla{T z@7RL>h4*pj90AT(AYO?n^7}R-FY$HXeF0ea>Ak}Qj_;FS?X{OzAJLb2hRy@zT%fs} z%-^lc-<#(}Ugmd+%eR~!QbXrpeZBl8Us*3CPVr~Y55ykX@y;0}UL@s{a|Md$(>VZ^ zOXB}h4&jTQ%u6!=NF4shnN%-{uT%ZKxVOA7D)WlO$tgW37sOtCRP=mtba#AHC&m{5Xgu&g_e)gMJW`oW!*_ZVvrT+K2YXUOnV_ z`QpSN?@tf;?$OD6Bwl+-J;eVNeW3^PzA!jmWIXxP z4gQ{usm`yUaUu70gK~ZhzZ0bUrIgE~;@=R3?}zDlpGEO!=$An|;wMwO*T3X^dj=$KZbRQ|;G4oMa#SN2!mzmmS0s zM?UOWd>&E{FJ3HsSs#P(WtsOSo%)-1ZXw@^@TVI(KJ4XZQd}73$<+|YiQO+qdHv7d zTTkeoq?B9Iy?wIi)AMYeF8xR3q&^h?1-syPp`Rt|w#ZR^ynJOI626pI$7w;|7smxG zabU@hhouzI%=Nj?m|5A^zPTxPPzb{{%H#(?m4{ z&du;1=!cgfO;&GdnxfK|AWl_>YMQ2gJREVlI&?NtL)CtR)XRs?;S4_ShWTeP$!#nk zxzBZc1AeE0%R~BME>{AVE0N2U#N|p>19g5WT)tE;UmBMW%A?B%=kr?5D-V?ye%Dd+ zO|?o>xbLXz5#n}{-{th)Yn1obEsg!|KsJN7Owa{p~A-%*lslYb=f8u&i&aab-mH@ax=<&$`k#A(8BlDzyb(+%2h zlK3l}2WWo=zH9y!%9*O|45Z$7r=Ncxv7uy~$nP<{!Q=Lt(Y`0t@(Iq%_puEfvN?j$=Hzix@&vVB8+qRZ#qZ&C{hk5{IXIOoo#COfvrk`?>T_dH(VEB6q_wY!}o0eR7!} zg~ppdFJFgxUcU>$CEZ&; z{oe)fzM~}h1fSc!u&ish=y}CECzW(rzh!-u=NzQ8?t1U*NnAnZccH=Z$az*geo$V@ zC6x3`_AlUjr#w&ozm_h~L%!Q0?Qq72*uOl#MEoM6-utyA=dBO_Ej@Z~Q@%@LDY|zM zQs?q~vv+>{?{);s7qqkWL9BO3Jun|>nDaIGJyNecEz2eFd&h};{q72m_jteaP4x^b z{GIRC%He$$TCXYJSUrg^?Y-X3>qqwX{=F>Br?q}SYvfw0M?5`R7sD-nHxJA8XZ?;p zqla-VYOiGd+*^}B`40(k%fC1O2kq~TkNuX)L*M^tNuJs-)MEa)uC&I#YQ3Dlf1)1c z@BPkSZ2!da2K}~7z0P>=4epKKQvF4~rSZ^GeptSE={P@7`_jHER*vdrwX$8Cw{vjZ z?X8`#9rxvz?w#-NC$aXZf9|^;^4<^K3-RjXPxrSM=F`%1z;x<&LR-JiNIOY6{MdVc zk@{Ku{P*rp1^x8a*Xw`UF4b53KKk8B+#mkY{zT>U?2!K6zf+3+U+UMAAG|MqOXF4S z#p@@rel?EN)|3B{MbLwwZU69)#@(zssTHb>8W!b4)0>ZGIvx@A{`tQZ9TTXBO z9OFGVx*sn0Bnl37wqM8bCHpODCqHifyoDdH z|H%6_^gam0)%85%t)qMAH-GM=AK$;Aa|-X?tkk3B^wvKYdB2+K;oXCidIk4q@!DhI zJM?^|Tz=fVeTCnWJzR%dI&X-V9$Xh<|J(N{FX#If+YPA~wf(SbU*v=KB%RK=O-1K87T*^L#nlg%U+hXh z6)bX+9?NgxN$-YkR+52(xc}vED+*3*GM)^uyPwa@lhW8wj;QS*Q zzA2il=Bf;}AN~B|ou-DVGvIHox&Z8706G`I zzlVd)D9{`Q|1N<1CxX@_bw2#fRg={S_?xS)Q5Jb)a1b_#RcO z?p4wGsaP2I##B ze{ZQL;BT&aTdjaUr2UPzA$>DwysKVPpQ%^iuaB`qy{>iuUm2T~VVrJ+jki=7N||81 zui6=-Lz$4?1^$kMzhUq<3jQvKztQkF8UF5qzlHGk0Q{{r4uHRd;BT&a$v6c5HpAb1 z^{Y_KLX2G~Hhf(zG4)A=GcDMlyd4({W6%XIjj( zn&~X2^O-KzG)q0IsiB_Iw3AxLcq7wf1M{<0d!}8ChG&)Pt*+PDP`SpuFBSCB)oR7{ zSg%Ko$F4>?(nP(HMy}BXPA5kj*;;NA;730~evYh~Uu4fl({s&5xnuTmX z*E)KvQn#BSZFi}ers+!a7;7!8nlAw+`zKoCuTtt2bG7=RNU0{Xi!~d*VzLP++I!!O znnPbvY8UX|JXfiofFl0Y%w)S!P1CGwO$~L7h3$5`P3Agc^%tE%4sW#)+!$X<+Ewd=l@Hq;;pxniJ8PX30Y=4N)Ayb_JyU-?c zBI|XrE(*aHXF(3z<4mAi;4QkJxcx=|#`YT(D%SO~72$EAG1k}LDpeUO;(B(mdV}2U zP%g~R4Aq$LUxe*6#=7!rrCtX+mqR}9aX#OKPBijw0G}*8(%J?6H4ErL@D{@nK(AS; zR8OGT-Y15Ob^DwKbQI(_EIiD*;YsMv;bW}P@b$0Dm`)DQF&m(tjW*_Rz3Ld(Foqo1gD!uGvE0P*Gs&pu=UZ=%{R-Qm-V8%M4o;YFjeAc)JI%Kyj902x z!o7^|)%ci%Mz+6!^)_(-Sj_F##OaSR-op8A<9v6TC&JgfCKy)}9aSxY21fMg9cQ2B5Yn+~xrsbEKQKpT?N@(|Ek}?@*GtJR- zrPW`z zYIt660jBm_r}a818qd3vHd;@>a}OtXu}*`x6rAJ&&acqIely9KXk7yNU6H)eSfTs* zL<`5;xa1gYB41&h^`%$Js7(gN5_Z1u0EzcY~&B))r0SH^D9Hk6XAsw^%fv z?Be-;m$7az)IVjA(Ju??4KxkryOk-sS$_}P-Ocq0g;qnkl2b#W74IvxUus(D@I7e!8lrX^V-1D*Vn8ZApE0SKA#AU4$=M-#4tw--7?(UokL#aP$5?CO zt)G;%G1hax!+1{1VLQD;SvM(leA*7H4b0m>tx;D& zzfBtw`W1F%FQpB$a2|af(hrCEXcMGUyV3mDNg28y?SS-qU>qi=(ma%wo~+ZI^g_Qs0CovYjF>M-i8!jLTid^{-)E!*~wcD`I08bFpgv9JR`b@okW&7)r+2YVAEMM<>ABVwFmCQkU&!s+p!IFl5Xu>Y@(rObPb&3v zdPC@gCy4$u497{XWmcfxX0`Z2l>5m#7WkXe>q9(GhVo%o@NN5*FN;N^g=FoA(wlin~wEP zvx*p(v3>*lX=QAuhWTUkx}TCZhjAU#g-pBX@pNdYp7CmK$g_hH0H|p-`@n3*IZS(NI`6>V ziC==Bb#Ox8MCuQH6RBSPSgx<8X;!|b@J>Fb57%_1S-`lE@kGW&jLR6;FrLG>j`2dq z^^6-BFJ}zG?F2MDsx?iROci2JRd0 zIcTGS{?|PRjj=9)TP{x>l$J#OD5@#!|C4CG$>j8GPA9+fv;8tPf1s6hm7J>iMHFKjecRs`^ zG7FLtAiW>xk>57PS_uBv1(}7Me?P9zL@wV%E?*JzCvy4981LbIV-4duOzW5~)a?lS zWu^^GmoshTd>T2Q4XoFwX`0o8Onyw?Wa>}(%pVuJssQKb{A5}e`?_?*?br|V+5Qln ze^~WR#{T>JA;Xig|L%WiK{EB<0$r}TiG{j;qFn~r&Q;x4cs10VvqaBmgH~V zR;nnA;!M-Big}$GWZd$VQuDH^LnnZL-L(z%qdT+6ud2_Y{q&Pr+xR){WV<_cK1Tc9 zoZmK`4(lO5zdbA$N+JI|Ert4PG==(4NMl$RH6Cc?TK|Uj?wT=6{9L{M-Ppd-Ab%h; zh5XHI*2_-8)0BDbvr~wloq}IGxfAef5cim56l#BMso7{;0Q;~9+mEzT;a1~Q?T1;| zPCr516yqPyx6k2n^=8^v=Q9rCBjhJi{Ozmu{W#xzrbCzx*Yx0o0!^2iW32anfw)|U z!W5csCvv%mq+mb3wL=l77o|}D9Fju)EI)k?8|57~%xrVD zQs)4@5Ar?dusS_ogTHJ}hIML^vBSEq4*buk4irlP-*+Np^7W30Pi+@IU2jB!mW^}ib3 z{^OG8a61?1arAL=ot86HUFsJ%KzyiEU1~OrvsXJUWc^*naUVdO?{LE!4F2~Zpv6sK z|L}Uwf0wZy*84GsZ&o+ouhi9$PS3ef*DpP(LEC|NA=}Hhs684v-$wmhQ#v=MRziP! zFVvWt4*5qqZ(#Wv_Q!i`nx1rw-Vd(o+{F4#tlyN1UzdC@)Rg)F^zTY})0EC>X)h%!^-Py2^D~*B$^6W;`+%R)HJkY%?FXbM?NYyk-!-A@F7*cZTa&vc zTVJh(A9C)R!}>X_pObbxw9|uKd$WFD=J#cO-?Uv|e^1wb%+F_jej3iFcXu1&Vm#e` zv|E1KP_XxOx8W>bkVfONkmU-s-uK-mx)}9Ra|*RyG^dF5%2;m>%gxbx7v|Kt81*LR z%+Y#Na~85*J?kxJx#e2#wVXy5qu!33(w4!uR`hcyayO~jx?d`4qn#=7>B@o zI_C)T(+oAhcpc`ghmN50uiMggX}PD57{KxEG`17fbfroAldy`WlOLF)XnoC57;g+8 znaT2FtmUKdd?!1d&I5AN@i~jv<<^G>50- zSNqDl57*_nwfhh*e?dCU&%@KPYlwehO6$1;4mQLDB&5chi9Ggz=cxqkSmj2jDwJT>heTJP)|3 zM;Yf+luqk#l-Hq}bn-W9(rJCENhg0}j?Q;na$P#DyLIWbe%7Va`dgPy>u+5;t-A}g zd|}7BbXqs-)A8+vw|dm4A`2-I%@r*7K8do3y}#4Z6Nd%_ePclJWl$b|&yq z6x-Xb?%A?urhBrHod8J)AqfFl0x}^WAR_xFOC}@%B1<3%0s=BItO5eEDj*XB0-}N! zR0NR;K}7-43kWLc#K1*FMHCc8<$J5^^axz<|AXIopHru*tE;Q4t2;eCJw@97i8Y7d zdB5V;A$Z>CF=!B51hulSp>|Cp*)8}nETByYOJKvHP1yOiAuI*Cery)|tF0f~qv>8| zXy?b?W`0l)3x*zM3e>CRUeI#C(Q?0I5s3e&mATGh;NN74&_7r+D3kb7Mkx*ICuKq- zCBBvziPxVX@%o!cyoMBsuO(B{A9kCAeq-cQ06Ths`+^80KQYpEz(M^)0Wzx`ED(aPts9ln^yj1ZP{Hi z-?}|A-@3gr-@3PDzI7fsvz@|fwHgk~9T4$q{spbJZ?xL}&?3yhTV*t8tupX-S~cHp z;4O?a@H%4*eCwKMB~!HA$%f8|RA}X=Yw=lH+@&owS6gbKw$u_sSCm|C=m}kAco@3Q zFaWy2Fcj)GjD&7BjBY2hEr!=RVCxKH(emwD&ASW}+J&&ghAAj>N{gJ;)^*O{Ld2^@ zP8oTd&l>qwoHO#R@EUn9T`=t}liD@2mx#=nBD$_FPI@2oX2Gg_9k4?`*&zfqm zE$2+z;9u8jxT)2QPZbbhX5QMlX5PYuX5PXjX5PZ(W}drB%iXKxzOChYkgKpP%U^93 z)<)CzP;8N=4hyfrrTKF;f1!n!xB2n%VVXuk{n$7^UUGsTU)N+mzOK1ie4!R!qQ%c@ zk#kzat3|%iBHw9|AGOGJZP}ZCd@KI&<9(js&uebt&udQc=QX$R=ed3T`FaOxxkI(w z5nAqaEj~+&&(-{en!iLVvs^2)N~>X=Kd*m-Ki{Wre?IcJY2{zm%J0(3pU zv$QfUt;|9#vP6q4*CMO5^6LWl5wszIA3^Sbv(U`}=b_sI_;K-a06#8v1@PlyPXIqI z_6G3d;_U!_TzCS$h91$@cucGRW3B#ETK#9WR-Mz9>OjJUV?rT7|;fDrj~nM%k>N5H3S9m8mvKn?F=j>s9k$M)>Vu5(Bcmv zj=dSg`($7c-^QUq+BRyro3-3+L43W3wa5`I^08LKDJ^nVi=5NS{HVpRYw?>}{12^W z7R>832J?RN3+DY66wLe08qE969?bhKGMM*UOfc`agkaupO@ev9r3B}o%`Ji*(9Ga& z(AL2ZLfZxRfp!cY2z3NcK*_Gb!`drsN-*E*w>9+y^KCyI%(wAKFyD&E5FUvM;gN(8 zzST`a_*SQc@D{cR;VsMz;VqmH!t0r=m9NmsPuI%N(#pHE@^iKF3$^k~LbMq&M4KT) zv>7r)n;}E^7P&+C7HtmUTeK~N&o(cIjD_wB;Vs`2G7MX>H-vBL+aY`#Jt2G>4~Ot= zJQBjU@mRk>lw)-?&`TbB~5v@@|)p|jeX z*t*aspc_J6P6zbWl)$_Jik0(^y`&w;BLisWKaVYPZ zQ(Bp`TA6cNt{3aVj2+5*@|#fJli!6dL2W;V^8UOYx&r=9ZP`CUd2cW)?+v4s_lBR9 z_ePMF_eN_gufLs@Z%aoj-xjA9DbgYpR(@Ph*CMmDh)XLo*UHs#Su<`k@tL;AcJ#0D9hindLUt2fmK-+`Rp|(EI5w?L)r)?Ot z$TkW(&Q=JWU>gUWY@67@!j9R>;15-JYey)2?>H5{cZw9==i?OK!;`h#3N3fKmg~|Y zbG67qEwV%_zg#Q7PRre(<+`=p&06j@E%#-G?}c3o@2fouA4Pi=ev}HCvYB;6Ua8}_X;ha{FSK%Y!g2G3_HwqsKtySLUcBc3ys#o!9BI^E&5hxeM*QueXsm+BbCmvV&h?d=-Ix3@KDeZvId3? zMPz6gKbl5_@uSHZ#*e0=Fn%=63gi9b($+OsTi3!c-ZM+EMt^n;aewwP;{NQE)`paD z-p&@`yq%fhyq&GXdC7L+BXNG|82&ic_>dMa(n^lgN=`r|1fOrO>=3|ag|9=IRa$%< z;xgMF{#u6+<_YJ29URtba76O@yGHW*dqnbWe<+e~d*4XD?E@qEwhxWu+dd+aZ@V*+ zZ~M4N-nI#m{OFh*$&ZVQNPa}D(&Fp1IyY!_?$RQAw8&m9!lL-H#wfmCzbM|S(@}GA zra0e-$9qI`eJGme_KoJP8W_!cX=pTW+lXjBew@*K{1ip=Jw7g)w{}7_pGhW1^O>X~ zn$INDqxnoSE1J(Fu4q1!%#G$V$--!DBt-L>WO+27NmfPknPgowAA1|3`Ap)Deh2Nz ziqWnEp&@KZOf~v#dCbclWOg8CZhM)vPvC8?ZSq%JnSGGW{YCfx)i#;ovkUy?)DjFN zs_e^^JRQw0X-s0~RXm->LN#WyIE^{1uf{w!Ok*#WuWR{p)L70; zt9gAhS(e5swp-(3Fc0w>CarUUJJ23C(L?kSaqB|M$1NkapJlB}pmY*g$9k=EP})f> zAi9W^L^rXTSOfCqYbjkvX->YLdWv5FccXohEZUJsOaf0Lo=fRUVl}arSWlD;v^+5h zp))KOX&oB=E3))gXko>h#q1s(MvQ~L_3mn;&jj3OmF6iVfZ zxx_q>Z+8KuD~Z*_TH*zej~9bg)XT~1&7(9YPgjDxebvNTVm(o^Q9E?vvm{2@_HqFhRDkqK%P#dbP}a= zDV+!M^>zh$KNL{BlGp(9dO3MLjxbTLljtJ4i5{Yt*Z}hS89vM8?MWc!5(|ix#A>34 zSWEO09TBvCBLC(suh&hi0r_#|r8J8a`38`02PfZ-1d1ntyu5?bd6e&@w2SB_)=<8O z(sdxOmy_4)rFa9VZ8x5Q)3%%FAm)L5y_J-%Ce~2AmeO?~ueYAk_(GgkUm`IH0; z<#H)rK&&KIQGPY0Yl(HB)_%&br+5RUrD*Cuke5rObP}kokJ5RRHpGbSHpGhjB#Nn1j2Jg&^-|7scJgYND4|Piz3S{gNo^F9i91 zr~`StfzncAk)KG+CFX&=ypz%eL>JLbtO0pB52fqCLdm?!OX&tm~X6C8euCZM~E(XfDcE66-*opPMG) zc_2?0P`Z+6Xd(K&2ITo3kZ*^Vh_5wk=>(#K=p+^pD~Z*_8j#mltEXFvbakev&qMSQ z@%2`*9-@=zB1)|&pO{E=5Oax6Vgb=btRz+wYl-#529Wo!lr7eiOUwhcexr0D$jiAX z?IwDNULtEv?Ik*hPNIwGCf0zw-g-()ZN&14#9U$lu~N^!kJ?KtAXXBqiM7OfqSRI_ zhcm0z?@7cwVj;1LSVOEMHV~8Ai{%T6Rm3`C1JTfd)JARa^BIXebiB%v!f7VdC zj@Upnbf@KsdBj3u6|sis0eO9Ol=f1(fznbBY8S}cl}PC%O6O8KkJ1H{E~IoNrK|3s z)=!kKp>nm9uA_7V(a@8&hnPn!BvyjF{Z*8%A=Xm7j?(p%mL8<-Atn)}UK9tl>qJT? z5|b$IpmZ)VkK#^B7Z3|6?xJ)hv5MkuO4m@@L+Lt7dnw&OY4#Ac57fp7F^^bCtRmJB z>xd0RLvLE1=m7b3K^~k<7)OdvXlPNIugMXVzl22gv6cwLZIUjorVbP`=ex6Z+$ zyocx|vLPZa5fg}sL~EVkNPfSWB!YN+ZN_ ziNsuD0kM)e7v%jejimC#Tw(!H8b$fUdZLss;*QaRPNIwGCVGfoqN9+?6J10%v8YJ2 z%LVe|%T4qUy+l?l@)L*-qLWwz^6hg`+D)tl2S}aP)@$6f);Ly_bAWt(PNJLWA$o~y z9Icn=AUcUIqMPU;CX|Tf97HG4MdZIM#@n0lD3v2Ri7uj>=pi1SAeO5KdHbb_g6>j5 z57A3xlSMp%=pZ_YE~2|!lsgRac6FU0=mGh9yhO)rF~8!4S6Vzl=R%Qo5S>I9(M|La zy+pQ%>LEIaPNIwGCVGfoB72IKCpz@>Vrmc3Npuk_mxz4#QsUEs9-^1XmWg-*(Lr<) zT|_t0L-Z2aa;lf;CF1pBqW_2vVpov&zmw7~qML}(t&iMchSn6Fo#Pk?j@b5{M3v zuh&U*6FtPkAny+^r4!zwb`YIJ7tu}h5ZOLaK7r^adcdFAyQ?|*`n^QlWYy9MLGbQ0M?$|pLAPNIwGCVGfoBJ%{V2qT{egJBco$o9HFt6?bBs5*I9(XI0XvA^6Oit-+!m&lG%JBSXVljtJ4i5{Yth}Zjx?I1dcE~1<0 zIWEe1iFm=ESdQo*I*FbWRG!E_rt(DBCnD`8dWc>kUK}XuCw4t4jx)z8ihnBTAUcUI zqMPU;dWm>dp{SSWAUcUIqMPU;dWq~TEl+e1okSPWP4p0r=S2Hmpmw~0{J8cIy%cBX zseYn^=p?#`ZlZ_i{aP&Ny~yVcw#M}z&K7Gt8VlAWToL&$qMPU;dWp{Os2q{~K`z(`u?Xbn0Z)LW?N?`@g#KT-CLvg)9Yj~C zNGB+gR*!?|B)ar?n8V9}h@NPX&te6;W=Pul6MBoZ=V8A7BWoN3IoVpgPE*YL zI;V@YXSSesyM#A#V!K`vbP?S|57A3xJ489pzXZKR$8M2!5?w?uk?j%r4x*FjBD#ql zqL;{Cr{#!FqKoL+PwgN&-lldCT|_t0Lu6lzatTBi(M|Lay+qa^%DagkVgeqR;r-_z zI*Bf#o7nZ5*iV~@#-BvGh`84>Am?MhAvynsoq~M|I}7_9w$Fc9&h>yHIlsVe!V=XH zIq9&r>du@_usry^VSQ9{$6??|a3WX=&IEVEUWe_69fzI3GGBo8um;#=)vx2v;0>5$ zACY5#nP3)sV8=jMC@cx-WLO3)3)TkK7S{Fp!k-al?l>F% z0@&-YH(>{1S76^G?*{lM%n%;fF*tlgjtWbJt%X&?c8BlGsRiE+H+Os=JPtbn`vmEe z;2GFgu*%t)xfsEw!?P7cEVnR?S>tIy^A_OfE|aOMEbJ`?9&Ky$MfJ7 z#J-393SW)fnG*qvhQ&sX>zEulA}1A=g>-hLxnpPed5Cw1jfcM&wiLD+wiZ?ct3}x} z;CWa*miZobEi$m<4VWd$+%Y%`>j9&p&;&u#>@(PJQSWv<&@8ZHEv$Qrxnn;Vf5Y?c4*a`~jA1&{ID_~&aVBvV z5!0Pk?g`=?qKjBbe3Dp2oJ*WXoKIXpTu59*e2Tc3xP-Wr_%v}DaXE1XXvOxlknyf2 zFrC;{eoB5`PBaWL959?PG&Qy`I*db&6O1#BuNZe5-!^)U7mb&VH;sQ8157!lzNRUr zS*9w}TGK|;aZ|GSe)Bl<7V{3X+p@(H=C|4JlHd1!xBLS9WBr@^cku7;ztsPn|M&jm z19kD~ei(Q@@VmesK}A7ZgZ2cS54slgTTn`H%izhu+k)Q-z8xGH z(mJGl$mo#uA^So;4)KQk7~&t=ICNC#y3prC4}_i${UJ2O+Q>T9y21LI^{Ulu3%A{8 z>uf8sO|vbv?X!7ozuA})ro<`zlyS-|O{V}`CzR14RUSogRzQ=yqe#>qQ3l574OAJd6yDzLy*q34P;d8=wgdY$8 zEu2M!N5n@YM`T2_jp!E9FJg4Wu892+XCtOW&WfBD>5kkPc{K9-$n2<&Q9Yu@MNNrX z5%pYDP1Me)*Q0)j3TPD9D7{h7MuQtoYUFD4Qlnjs-fi@2BWrYc^!n)S(fgt=MgJ6S zjOi0IE@ny0`j`VTon!mO4vAe9`)us1v3p_<#GZ})F_y&z#Wjh`iF+V!aNMJDQ{tAy zZHs#~ZeLuV_?hvG|}KOhS4>`-HrNl7!NPc?pXXwj>-( zXqh-7u_UoHacbhh#Lp9dO-yP0Vq^cL$CJKH`YS1>$)G0BG?hl=W!Vt64{~8nqhOs=C$V*)L`rFeg|roA@z*{8wLkt`VRZ|C3F3}wx5 zRHovHY{9}=I-VTPz&AQuvsl)K#k007k#%N`@s{``ydl0R>x*(SVY-i@_YV{I>BZJY5f`W<+y{A*b2>$r*g1{;QVvyWgN z=479s1*g!0Pw{5?b7;kRR>Hny<5>e*a*>tcP3;xzTeRdVo6degOMYXs*ey1j-A0RK zX$~_;F1)q9k_F=Z^NKW=MM(2l6yCa?AT3~xr6u?->C-GtTE;S@<*b#of@R~q^qr+u ztP9@A-a}f0Z{n|Iy`^=yuk#!mC~aV)r01Daa%)6#af zUV4dbkX~lbORuo4(yMH{w41#wy}{m+-emiwz3d%nAM;52*&*p|_P*r7Ti_3|W71)~ zLF8R_PI`}Bl8&*<(nsv7bb?)zK4v$hPuOqLDRv8QpJ(zJd_(mt3&C63L*>s|xcmi6 zkk8?5+UHp_`Ae1}Uu4bkruP=|H!M@W%Mg%0^_P!G1LY5;!SZ!!sQjliOg72G zIb zU5xccddn=4{^ldRUk2%&nIhfyCDD$i=kT5r#7B$~?Py&5cY8)6uD7omf1?#5eTumB z9kD!L4{v{qO2MzNexA;p%-95Q`%=crz+q40`T=Z;;qe66aKd4g#FRs6xlxBEM4@1FNWTCb-R_cS)$QQyCCFNd#B@27`H ziFWS5->|&B-O*2+skn#7_uuxtg3msJK1BL4^wSP-%MrY%2GslII{M=v(hol?_EYsw zcrO#uE=pgd^zz%HeXmgYwHP0~{fQWNoXyc5&Ndh?AA$F_LvQcPxM#)3+Z^KW28o?P zx*d(%Ll_6=k)E0^>U$LZ%eU*wG`tTL^sK`BNI|{*FTBIp4@l#1)wuqQAn&K^hE>4dbT?U*Bo$M{p^&uN61| z>2}~OjJNy2v9IENdtlNEyx$QtJ;7LCFryvbZv;L+R@DCi_WKB=G3m20VEzjt{`P#q z=Wvb8w?i*K0_~W9a`B5qeq{!Z1Ek;iQKa>La%775pUHQ}ACn|D9p!z;ImZ1HNMGN8 z_a}ktHZk@TIAZ~0%fa_CKk)fx;4Z=cb-e1wtt5;3_3`M%xZvYNZ~w{BI1W)SfA2rv zPwlhC_VID?9O9hS;6RLzZJ@qA`t}wK!}}Hy--LSifK6$6eS7uteEjkC^6|&X#~-Jj z&)2gL%j@+XYbp9Gj_UuB(m9lVjncP=iuK=FPc7=<^&J5ZWs3Q6-%Pwm3F#icF?Je! z;RD9L0QtOF57yvb_9gHT;@^Qu+Zp=_eCctf5W&fBJmc5Bie!Mt8X6$98yW+U~7kCu;ynj9~6MUsV4q3#@D8KJjao+4n5xg`#~fY!@H*yj_Qo&-np(@4V*!!`-iEaX(iUbh2~kkAN2FuW1nDLqTIdnSI_6fa!dE)ngsdTpWz-g_{LehHxSIg zJbD`(g8gU0SbPP?8}Bdv3S`QzH*`Uup=-@W5aABXz5yRc1MPx0-I z#&UokIQYhw}+<&q|yJI88V{IbSXptfKjU#xAj3n_FW3 z3n%&!fBRj;^?uXmQ{KV4EkQkBueU$V_q;!NekzU^e%{o}>GkO8L(hu+D`C6& ze%7xW^nQ%pDB5|s8pk*4dvSIZ<7vDeB=YMGeq8AF@Z;wZl>1-v>Amxw zJ|F7y=KpWL)#u53=iUD`-zMU?b)r4P_b~P-sJBx;E>mz`<>O7ij@Dos8x6{kV_DXTf4|e0@y&<21#8EE4YrC8r?ns=*S$FYU< z8(=k<2JQw2gSB8Z&U?JRm|2V+M|%8zJaY^-IV|G8j}zOMiu%qYu8&jw`r$0*p9aL| z(<#h<5<5gYWhe{oJCz;7H=n6hGJ?;{1JR zeBM9!reIEqXkQqmhY&BJ-0!H@^M)u_g8t*%nRpV{bStsUBjUO#q*Rb!5Af?Lz8^G> z67`P$6ff98`A@N25V&?Xe)k6C`!@pA_k&W#SRB$H(Q&ikBlIEC{Igq5z1+rMaP5!u zAK1UVJtwh$IY;0+g420MFq7zLA+BfV(s7!>`C@$NuB%)2~1D^MiiA(9a9{-(UQ?{myy! z7aV6jQJ;Q2-vasky8k?Fm%bhPaj2KOu~Yng#{0d`9ql>&xfmCRh_4cx;W~q#hxC5e zuWR}8{O@MHpY(iwoDN34U$hnE$0bio*@B;AT=4V`ia$ggM& ze%^Wze-j{`zek*3dQTG98I!SpwRBCd_WNoz5$g8Fr+eqDM3a~0oCYmFF>Hk?oR zxa8;2w@|*-YLTyRN59)5{oMCr9;&z^?lY{wc;oflTQ2llF@E%NmyqV~2-efjB7OM( zNVi1&AKsDAxBFwH2VpsWKS{4=*Jb>@bVs>U_804+16JGY*8G2uipo91K4R_mA;ACQuo7 zhi&kiL1o+>R^g{XW!xnWgP#tSai=%}eg;%#nfQ?@nPuUQv&33KW!yiGh0pIj%i7&% zncauAN!nd#nYF{(WR{Ed$gCSnM*IP&j62Dx@OwaI+)Yk{{~#2<)QWZD-P2GRca<~X zKMa*wf2>nx1F$xk5A@aep}vIu>h|**L6I zW>c^>8F#gNK^I~TGFybZ*7zl0)(`7iiZw{=Y23S(*fQL?mT_-;82t568TYt{L*2NC zF0+@=3jSn6KKz%_3W>b}mGK*;h46PmWwr~g!0%E*W%e($LdFe|5=7pF%4{F*cuQ7V=RJRXN#dX&<8T^x-WzN zj=TIa?z*o;olIH@U&0-93HRVv!#ChAI>w~*EFvZ-#-y|!YLPY~;s?bDlr}+CsTvVG zRAyngzb>(GsEqseTi{1RW!%5t3cnFl#&ZkX;m1H_JWjF$ejHS0@wopk;V%Cx@KdCn z@Kd1}x6*6y)1Vl)(r)fsYb@&-jj9ckV_*qc=+@bUq{A?&j2=3cU_>I^7@W)99 z;FmyU_Na6a{&=X&CP}r>DN-G@4EOY9RxZ5{oh5w$oh==OJ|P{4&X-PLsRdAsF5Kmp z*di!Kmvj=kSUQc!5~$3UOJ|@fq|Xp}1}d|a(iiYoL1lc}a320fsEkh?zJk9Aim@lv z!>@+Q>;*Uk4cxIpG#K|{{kxGlZfx(pNGnf%S#&Q(mNl+P|okYWL3YGC0N-X?jD8`H&4?h)(aUv%| zGvp*hGNG8$`p_semPSDYEXK0a}3oVxOpkw83&~b8iXocJp zI#uokeN65RorX_&WHw#y2d$C^KQe5u~3XR!z=KcLNVS9JK-loG2RTX!B2%^jxy|qp9aO)GrSHz9f}cXcoW*z@D{X# zVL#$IP?>cy9Dsj6RA!wG2jM%QIFlM`;dg<`EYDB}zbh2yR>QmSAAn*^8s3NhAQb0Q z!w2vmg5n)yhNJNNLvbcG9EU#;Dzia`6YvK^F+L5SKr0L8XBOh3>TrR4VR#6440uB3|F9^8oq~~ zFC3)7z=G- zjEANh6QM1QNziO#Q)p{rGPI2`6?&gB4cgY24$U=YV7*D#5h&&#V|Vx?pqM?3J>fqF#q4411%EnJ#vAQ>!+#tqvzf*|@Ml4>-;Mp?KLN#l zHx7XBg39bk;~?mK;}Ap^Kyi*U4uii4igTQCIQ+#>nJqDngufJuGo3LX{t75Yg|Pts zN+?E!u@L@hsLa+Hi{Y<>Viq!vg;pC&pf4E5Lu-r^p_`4R&=-wUpsyIqp|2XJLU$Uc zL3bHvKwmS?g#ODo8~TQE4z%7_3B6#fg8por2fc1w0KH*c1pU>x7<${d6v|A?pk~tw zsK03?G{CeP8faPz4Kh6o4K=NYT1^|FHq$1kVycF!rW$CZX$v&Yv=!RKv>n>iv;*4A z^a?cDv=f?QdJURt+6`@PdL5c>dK22x^cFP3v>)2pbO74ZbP#>g-&6}7V5)--G`)-X zAk+Ks2Sa5x#Pk9Dp-@~8n~p*YOvj<4O(&q^OrJofm`*~=OsApcrZdnA(`V4BrZ1q6 zna)F}nZANfH`PODm>Qsun=V3Unl3?SnJz=e&vXlV!Sp9ucoB*j*mN8IB`B^dOt=(am!Y_>Fd5)qfno+QnV{dBEYKfJ z{?MzYK^G^8hKyjsHeht0{iYq1aZup0w_>{5@!X6aITp{0(S+3;LmX zKlG^i0Q8voAoRGo7W$F74tm1;F7#vb`_NC!A3)ETk3!Fyk3-LyPe2>YpFl5}Pom~; zpfbB`J`Mj{sLZaI&%pl85(Z60gbo(3Qe&522Hfwf;P7N2~D!xhNfC1 zBj!?z0ouZ1f@WDP(DoL8Xa`FmG{+JQ?Pv*wcCy%@_ghqGXG<8=VTpj|TB4v`EYZ-x zmRRTrOFZsqjfBce&%Fz6x6aA=)nB=oQ)A9~zU0R6~P2t8pbhJI`r z3q4~gfu6ODhn}-cgkG?eLcg(0fnK(hL%+35g|_pX26g()fEM`8gg)gr8@kwU4)kfi zO6W4bD(DKod1%iwP+VvFEr7oYiaRrYi{S5oqWyl0po1hm0t5MrUD9&GjHPEYpTcAG&ZiUVc+75jpXa}?^ z=oRSPpq)@9_%&$D;N8%S;Mbu8gWrS>4t@*zT=0JAhTsFx7lIE$HwV{3Uka{+z8w56 z^y}dFp%;QbfX)m#3bltGhlYoqfF_210!<1%3GE+x8ag2K40K@VXV5{RUqFY3o`((# z{R;X>XuZ)N_q($3^ym-JXjUZIZPB>vL(<3RR{F&lTticHzKH|B;GvM%Oq+?d`UyIA*hP zU+Q7#Y-ab%VJ__7Z1yB8f-YgQzhYa$jQ)1p3RdKQ#P|%G?4Qk6;en4M#?>q!Ae*gY z9iY##E&=VKqY&S~<|DF|B?M*T9$AavY}^am6@0|_9`nFI#=ZHJiOCU5IGUjz~X5X5-mSzo@pj2T{}r zxw5-a4)ldaouS(ryemiu6IZ}<;IW539KQ8HTYkCM^yK$MJ@2cu-PJQO8U z<#&*qDtnNdDj$yS2YnB@sqzsm_rvG`@Qf?k*anKuMKiq$X09)LzQPFQE66hDsBp$E79GDruv%MS4|wQ#vTUFP)IiN?z%* z^pkW;GRi@+U5=I8$oI<+%Y)@n@)$gw`nbGRenY-28w^o~e8XbHN<+0_r{N95X~R#3 z-wo}J8;x6x9~uvs-ZNb``J1igaPt!L26L>XgJrO#+_Knm-g3hd?U(L1z;C4Aqkhx; zp72}Xx7_a)zs~+${2%lm>ObB8HUAU-*ZnO4;Q@&OEdtsG^aM%7bPF%@2A$C^EQxaJS%xgC7YV6I>BIJ9vKZzk;s> z_YD~rvMuDb5KqW2A-6+9LnA{oLfeJrh7JrJA6gN*Ido5GUFfk;vo+1?u=cbLus&if zu+FqDvA$rfwSHl3u!h=t+CI1aXvD!SK(+uZD+4jEk5N zF*jma#Jdq6MSL0YbHpDJrpS=Uh{%M<)W}wmIgwo>dq)nA%#R!wsYWG5wTQ}(nicgy z)XAt3jaD`KsL|JrerRNl?j2nm{Y3OL(Wj!%M_XfJW2VQv6tg?#y_kQ;T!{H4#xK?u z+bA|Ewnc24*lw|RxWM?t__X-@ z;vMm0`)Mq|HgY zk~~SLlddGGP12flXj0gus>yRrUTAWp$)`;&HVJ52)AUx;tY*`jt!P%=>`=2WniV9^ zORi0pQxZ~cru0i4o?4h%mil;Vb?WZaW2tiU$mW}xzuEkHbN{qeY1`9k(~hQnn`USc z+ak3^PK!P*CbU@CVoi&eT6kL2x47LRG`(s1{pk;<7o|@~uT1|a{akut%e0o+Ejzc& z%IKO=m@zqHc7{7+TgI-8shNv2Ych9azLDw4{4n!s=B>=MtWH_IvMRC`XSuWXW_hyy zopm|u&#We`+O_K0YE-L=Rts9~X!TC3>o)odnxWy@QyeFsUZw>^M+xBTAgMca&@7(QoW@+I4FkMJ(rj^T4V9=l>&a#eWW z+pgoYe;&JPn^-8kYqo2T2=8axfAGl_&%I%*-zU6ZZ9m}CJ|6qcR`nm@-Llz!5Z<4* z4&>dod1r{2q+mkUmM|!c@rt?x{-GAB7jD?8Ik=JQksZ{w};IPE#-0P)`eOY+Dl_$yTqh#X~OrG0ManU#!pe&v#VuO@JDZ(3~^r7Au zrhGa=#D*)&X&ob#+cYBbl?}At3Y7P79^o|?Dh2pNmwUy^UyAU?DsO}fuSA(fx#N{E zRm3JL$0@f|nKfI)rYQU72(MfjMC+KUJWu;_n({TZZ-%mw_Wn#I`WLapY^5uCbCex4 ziYt}wwD+qN_gA9aJSCsDZGnkO-H~AWfplWl|yuF ztyZ>Eo7XD+sK=jGUZvdiN_?uQWuuZvV`G!@5P8+g3&TWijbc3_ye*2~dEssKdE0&7 z4kdDc$bCimb38cKx)BNvzQyP>>8xMwmezO#Nq4cT&w3HG^8Y708Lqtxdg5#^%QMz0DlR&7HqjaTET zClghPyd-rQwX~`FbD3BoSv^ZFO;vBaBw}gmI6C6f)vg^xEJN))L3ml}PHKI&`Uss3 z+Ni5P7rAZKQd&oQ^*DJss^gl-?WCTfW3{tdMn_Msnnrs%Pd!27w41txMoD*d2hFiP z)dy)idZ~}B7xnd4y_1F4M?FMdKeZUwx_nO$P~V~+8l>(XD`G>`z@LRTOx;4;J6yd+ zxg*t=XdmUPO}-Z83e=bATv4bFr&zJtp1iTDnYNn4da&y$b$g5Nb%oedK_2+8g z%~KctB)kRc4jN61)Zs%!Y_a<3Vc{)Re;{v}I&!9ntx!kMys=WfL4CSfT|gsoty)9J z(X;B~G=|oz@lT3nH>ydry_?kawIWunx@d_S^(~5RQ6H@mxm(q8+SA+BC)bGB4mE)4 zdqv$wv7PE*TH-bJ1nsTeY9{T=*VP8vmv5>^kBeH~Qln|V?N>WeEeF)qdb7B`++)ttMHDh7rqhRarLX;gm*%HjAqtP)PK=9IH|t# zi^x5#I%v*0qdI6EpQ&qTuYRExQMvPKG>zS_)Qt6F*?M&p)!d+_(L8xkJx;B^q#mWV zTvoSJTdt@(_lae{S0AC)UsW&PCt}ys?=yw>vzkPE@P_&!E%B?*`%V3TM)oarEFHgp zsz1^3dt2>It&;3d&^|ZV57P)U*>}(=w%FgHa{l(mX%7b4-=vy@?S1G-3AI0sr?B`@ zYqR4q9?etjPf;yl_OsMO5%wjtr=#p9I##3Y$EiMth;X z{mVy0xg2}jMZ)W3Z%)g0wh!$fV!8IR_QK1vFC?#n zJH-+O_Ww|;3hjMpWEb08(b~q^x6n~hV&64OEHU2xIPKqw_BJ$!mD+!$ex73I-won> zy4>F8BjHW8kEU|d>~9Sdu^INov_EFr-+M~LX4?3&w~)8iUPDVf zYd=Q&cfEZdjg5`=IO@|)_R(}!tG2(`My##IK8VK47W>n*j;;1L$=hx>wi4xb*x!6q z^Q05@_!4{^WE?|7R4?bYFHhW)Jc2?)Z##{~SMq{u2K@k{_#u z9fH+K{_L<6%-)5)CnexJ(+RlymdHMUeJCZdqf#oKUuwaQOZTylU?*T7!#;ui8+Ho^+au=bWbEDW|D;#%UU!aGHkao2KLGrkU&q*j3n%uxrvRJm0h! zPd6>bvrUWfWYY>f*YpgYYI+9GG_ArDO{?%c(>grO^cmVZ&gLz=p#{z(&GG z!SZ2FSOIJ_tPoZND~64MjfIVamB1c_jfYKuO@vK?mBJ>&rohTz<**8TuYM}*G1xTN zbl42ojjqmZVfvuH)kk;Y5{LjiOWPY>_WYNty@vTYe*jJoZJj1BRn5=sX zeBL6Tx7g<`^?A#D-U^?$(&w%Ad24;%vp#RV&)ewpHu=12pI77aw)niQK5x6v+u`$G z@p*6gybC_>KR)jp@{DY_L2S8^75KbDpI7Yj#`?SxpEus;P4s!CK5vT8EBAR*ecm*m zH^b-6^m(&=-W>Aqx;$TOgD>`@LF`L>-^AzrPPtY*_oVODu|98{@e_y3W`w85Hfu}p^TTH2O`M1LzZZS67qu84fG-+N zxF+NOw)t|m89&51hyVM|cq~wyWxg{uS1~bav7KSs840;xhl{h$cgE@nJd~s5>f7;) zZ;NjFygz*2Up`MZ=}Q=Wo}bSP@OeQ#FU03reV*d;>^?8t=S7-$|MA|4^u-#P^lfWo z(zmUVFE_@Q8{^B3G3i?#<0}{ED;MW07w0P%XVQBp&bLIS))q8{4YTOuV7Si<_S0jb zJ}<{#k9G2S)jsb{pVu=`FE`KUE%14ZeBQgkdbzq#-CJqZy)8bk*rxB9YMY+B+oq4T z-8Ox!ec&s1!sn%j=}Y8=>9y4Pyr^(Jw#etL^?9H9ysJJhKZ4iC_h5d6zHC8+z6T2; z^gUSM%PsWf7W#4vBlJC3=qp$3D_86*SL`cS9HH;QV&4+8wYIEfvkXPHjj$btg>oCC z+rQFy63@k*hrNXKMLb1@^R?+B8xM{*jWMn;z2V=+_>2`#4@hlLwvF)#!)UW4tudcu zYs_Wvi)_h$ouuBdHpV{E3eynjW53~2gWpqfr2l+ai?B%l7r`a4g|Ka~mtiOIEAL&x z-2P8vy?bRPV6VK1g;L*Z2d4~eqgfSX6vh=pP`Kl!#h}yN+qyK z*3;U$=2@{l)1%rj^lbCN@Wq}*=58pMf3>#K0=aW zqfW9Frt`4V=H2$N$E z2ggSJfbBXeJqdq@;XI3tDzddP7TJ0!N2SZL=h^SEMK&csGPS|@T4O#G8lHgtnsA*VJzvWbPU$1Ss&?vW=ExmzyZxF%_~d>`P*irB7Q{dXtFb+bxI%X^P}c*sYMaq z)KL+s%|}Ok*xVTrl{Q5Bw%M$R0kDmR!@&)H7|+=E!7XQ4_Js8ad^=;mrFr-wY=602 zosB2!Bm+Au$Kw4?ajQLW?=Q;FZt9*cvtfN!uHLM)Ud?7Zi>w7(Jo*fwIzxyjl?!8<@qnuy=9U*kWz%#YI@Zw(hJ< zElVqye680~f3I8Q z@-FT>wfyb@;j5vY=JhWwoLW|1@>uZ%47$=u#RH~}o>*EmbpnPl_OmFX4Z*vbEGoHY zH~DJL%I1Z;Of8up_P3VoIjN$!Y*N959wkM^yiwXn&~pB3)BiErN<^{gnuEQ5_aUW4 zeSNB>Fy00hPn=v@R!}yhzrIPLntPfqg4zga&D%baTPezWRx3_ZfJpq^1tNX#!v7r2%GPS)TP?hYN=wI=4=$KcqHP)F-qUIk{jcry z)s&TWpT6HQO^a!kVt->pMJ?De z&Edz_Xk_J=6-+BE#mq3NBEP%>ov1ZQE7GH2QqhFsZe?ZSjH$)`YyW9cZ3lHN88fDT zarx8<+Q`-7_qO>TgIVqVX^^+lqIYc2KbFeMY%dN0{Y0FlrSDy@i2hw!tA8v-QS^|O zO$UnZcR^1VPZEbNUniXzaNaD&4lmU9_dixEf~eIutI-nqV@lEAh2!$a(k}WRwIV#Q zthjh!DObKL5g1ZhHomB&?5hpNqpfp>?|KKx9#bccf1tGNp^`~@8^nA_4eF1%`Y}C+53bUp(fS5b5izAtE-f#? zeMF`{p5PbsknJ0a8RwChBE64NF!3ToGlcLw=YFdrFr z4-jfW*J5naL=1$#dqc0xH!igSN9A)TPo6MC_i;slVccy}MHz*9px+1d$jxGKG!D$- zmuC7AjZ5ph(zsH-D~&5n!e zYQa^YzCbqj{yvjw$vbyHF4=g|drn7M@bAvRHP2o3;}Yc`7Q$JZN6}221mW=k@_(Er z@2*i>;*K@8y?c!~8Qoo8OJhvleJyxzsdjfSg$entS}^q@&0DNF|2((;Kl0wCN7Ca; z8;gb@2(lm$1R)55Ac!1!K*{=85}V>h-%y;%x^|jXm8HrowK$hACo40nDyOqDOL^(; z(s*nNvoO5+V0h()7ls#J8OFd1{}Qjf_S%2J&vTwQ5%FHCNs02pu&Az#IB}0Sac*%U zUgQv}KSV!~p{-;pm$pbN>1k$bB|R})E9r@8bpVRGpPD=oS-MHyu zthbtw)l`88zk|FR^Z$A~-Lf3``uG`tZ=q*E-`o&Mprvijr`Iz`fuqfAxj=en90T3G z<$ON%n6V#fGbQjGETy-A4qF1D$KQ=sv$fTBJo^3p(Q3K9W6i78=>BB1THlQ3(-i>6 zqua~Lh@G9!Huq1a^E(44@#^VnbSDt2$uXY-h!m)$8`-f%jIm5N1RrBm_}w$+zt#AR z1z930#Bcv*^lpG+_ik{qOl<#fIDCPo0c6kL4J*{r|4%>uvzM!%MEkh z4u^*`=m_(B3~xTWUJRD+zx!A;>k<3y&@(9J)A@Uk!(e#!9}e28v2NPJ{*isC!QZ2q3JJEIvEti1 z>}4Q>b{AJZ^0z4EA??%YJ+$jB50AThgG!FUdnFPA>8f!cSp`s!1L=?+kq)5}=_&<*bd@-; zCKmi918u8n35FF9WUvb3va_GVF#Y5E>gW6HCo@rke{c9fwP8dvVMN0g&ka|S(QuiJaAS{rpf-^doBOcZ9HN!x zES{SyqX-wM;#@>_11!(`AKB)<7#x0-8bhd@R75L{Sv)p|@F8T1C*YCL%emekg}v!& zGrO9NVXFG=`#=AsFg3%5FA2oJYSkisVz%o~j6RSY40pSyo%7Fz`v=E^PB_}j3Ek8E zgVVwA$-%{Ww?F7AMI@#FY4>b+esCdJq9qq+`<(%3&Bg9XZ~x->pg-&$4)>mPPLB@u zt=^Q=D!4ec+LUB{>7MQ#U+fPgM;DO`NiqM z@VJ*6ugpmI=(KlU@6~<}>x20?e|p}T(+k9h~+ChrNqaRU!O1J3lx)I6pYuI~bn!hKHR#a-2WyoR@hzr=8=^ z`dutmEjdrCIz4>)1f%Ppb@mSGT&+EWCe9|TUN+ZlbN7n!hHf$a7^~MkJ*rn$uve@1 ztTX6x%y|n{APM;~7iFf{2-!5SUZrbG#3(yJM5%40&SBA>Bi!J#vjgqB+!s&V>-5XC zVi1klh8wRL$wD}Yb$pOZWeF<^JHh7;9&X{FT z%N3+MEmIPzo%SL;twn-Z2O=#@!1IH%UcWo&VM}yRAyDmh&db@>Y;Z#J6rCSnKSqH1 zm0G_z8xDFyl1R&5ul(S*gM)Kyis9hkE;Ynw( z_oP8NV>F;&B)~r=&Y$Pt4jnk5PpW08H zIZ)Kju>mx3CJtNa6Rhb;OltsqmeFUG78ZgEJHUz*@!Dz^DV8&K^BA=3ylm8#taBV2 z(Q13t3LbaC7drd3!^uS*{Vou(d-&O~b9{PnVhcdE z;{0G2C{N1XJHuE8-QH6eLJ#z=u?1K1w3f!q@cnDs$B7v?__6w$zVq!n+t(NQcVbL3rObU=u zSmTrx=@=BHG>Rk-=J7f-ulu=%Jf+wjgC_@Ga|PZ5$*wK{Hamn;=Zr;X4k>mSEf(;g zbF$k#y69b$c|=sX7SP~3gP0bVuhTsq_D)mX)@}=upC6FBRo0!xf`h}(#j(Je?L&-+ z1RQHGux*DZQ~QKsAcIP}Q3QkjwkTyn5LjIeMhkwTQJD zk(MfoplObck9|RM6ql_qe587P)uBl%#E3#N#WWs&mfMe1#-=@`q&~#vQ-XEb@cH1k z9hh2-dDd#IZi68jz+SN}R?Db~6F12nvPrH34S`yLklCZ+m#eUKjJfHCF&z$#l+xWnFW@v)jb32Sjj$&-C=J&9W5^IPT;a}J)Ib+4})wB z#?(_-xt~uhkp|!1)fJ2_gJmBMJd0}spRJbHtI@5hgpb5%wpd$aZIultYzwF7<7YfK z9$v!wi*s#*x*t&Q@}FQfKbdYu2FCbm5ZJV@EU8fNuV8i=-l_3e+tvPbj>h1V0Ned$ zyFTE!50@)}`#gT5jlXxb7KF7;U~w8wtXzt6q!|=#e#7P6W<8{-37#vcWw^XrD-%!k z;jD5ALN}$saR!4oV&_voN<+j)FdSc+nE=NJ$v_0_He7_8f5BnG8qc-)(2B z1S@<8JliTY*>oIe$Bqtb-cW$Qv!Wy1AQ*oo%88)vy~dqmKg?fi`->L zOBObmj=kv>+*|G1A&h~!4OpQ?i1;ZonXWh3$2|8^rCLk?#%O2Fp2YPf2ri0(aSb9C zuQnz`|ph=ukq3=iwFR1noVy92@3B z`v)%(;J7R>W$bozJsU&(y}ew{EnsqRKCN5t98DL~6_aMSvpG)fHus=g1h7W>b1XJb zrdyomVc=GI9d?BSN*rq8T+F)4U3@98so^co#Q;9PQ&OCt;d-Uo`_E=~=hLmKO%ZE% zqNXO+3nFD#kQgLl0>Z3&I{AoHe{chIo*?PtPv%3Mec|j32WAcg&Latb>5PI9Pzu9~ z5nz7|ZIpVknEh_cY|GW`8b2AU5J@Wn%8n?A_h^n^J6XZ+c0FA&iVngTbjC0j#>0en z;66s%YfLJlI5qSXX6$V}k3t4B4ik%txggSCZdc=JigNZ}@ZdN>`sAR~MT+ldyiYLe zGc4wC?=BmW_iF;dSGCNs^sKqG57{yzq7n!&3pcnJI{-IjgsJo=+Mlgbh8OaCOYx)G zCWV=wDETr$z(cSpHHIAX&QIsD?-yU<(R;Y1`xlK)gN zFA~e3le$ChWQ*ILwoq4i7sK{r-CRdx&73r)?Tr>Z{0*1)o9Ws@1#!7yisH_Kjd2@% zlu{E;R;Yw^E9Egx$UPG4yP7YrK}fu11=*C%qM{3JAS;nQU{=%l62{3^LUaX?qZ?DH60Kco<~hU87v_Yk-6}PeIr(QE^OG0TTEIcnH}bMQVrCGZ4RWVjp}9=SZmf0wRrv*)YzDl+dAH z_3x)C9v7q@KZFpuPQX1%-4KHkz$QDz*Z^D?y$KuWVm#kYFe3@d)$KN*-F1XHL1{dC~WJMMrujk&H= z54%mVzJrl@?l{RdsTu0Cnjza%0%@z&{n^ZVJ%eaw0ZK~Gr^homxF8XNN`%{tuVZB9 zfyxe@t?5C-Ip{*2VFxEr=k$9woifT=&H=kccxGtnq&R@qFayXx^oKwt!g5~#natnT zVrdE-SeZ%(ZmVUk7jVmtTS1fDji92mgSy0x8;=={vCJm4LB1VAQ?%;fl?x(>dc`Xy z(4oG}O%V-a-Epa}zT4QP%8rvfnCQRdkKRX7>NJ5dXSf-ycc;^Z`!Qn;;uQ%^0bQmb zFGAq7uIyu77>@YkQ7)7bMF+576##Q&+UeOc^>m2QPmkE9_Q)hQEu?Uc(gWi#X&p=- zjx_8W+s=HoB|{Gk_7&yTz~yK??QfAR&Yy5MkX-M0mTJ zgOje8^XG`DA^Ocj5;6aI$RhO(MS1!KGMvm_;%}UH2&57$X1|a1^ky2k{jSFRVfDTF zB&8@w?nn^XKYs^H{*6K$Lf|+A0G0U@y@?o{tPMhed#DVMb0G}aum znf!sURAK}YP7WnQdf93WEN`gZdU`GwTR~kE)Lr&L)P(XP&W#!~OY--+Vq0cka#$Xv zBq7wt@-`MI4KVo_gaXiXeY)K6HWb{o2*e6>bur2l4_-ol+TB{Fn1aT(P(*H4%NO0N z?gHBnMK{&x@e;7BRF4cxcGdS4dH0rg_peAk!;SG5 z%T-HX()E*;Zem+*Vf(mRzakTo<0Z4kFd_0zo3&!r+7q7Mz&vLczT4AfH)u~AjIK?^ zZBNxiLT!+nczY(>`Rz%*_uEsk``Z%+U}w$o`%SjSbe*lHcq8Bn`i`!;H8N;B4lqP zvwHCGZA+_t$Xw0Ln7G;P_I5AYm^zo2u*uG7sBO>RTSRLBcyhD07U~L>A1;~gnVq;k zoCo*$s9Cu{a6*N)*=%odI=#kGLsg*Oo#J#$F9tO5g%!5dQ@JHHt#RIli{*3L+MC@4VMs{1K724+u@lS+(5&bfn$5fk2F_hiA4t1cwGfbk>?9?(e!f3w=t$TKZO+%$EH{fOwDvYTeq~0 z>TrXprBCZ!JMzW+LW|%nr)D0ikln@AvY8Ssz^}*vS^{w#h7~ZORkH#oeK`NpJ)3gBgUij!hW&Gx|z;IQ^^&0u!d(!sqgP9ATy zLE4h5cJ@_E7Q5XK;hfg|w)D8N$)*hU+EPo*6}8d!Jf=Ogl!bE80@Xf?a@M*f12#oG zgleJ_(!eAlxqD?c>??5K#TpvgtMYxBJie3<*W=dMmeH8BeQ2H>IcaW7jo3=Dbs%>eV`HRs#NGuFZtK%iiQMl(ZYNQCqSKy}2Y$Q*6 zu;aBPp+~Yb%k12m$4uz2NPi0PDIM!$jIEW>RNd^EVJI(wHum05bAc!%cb-TP+Y-RTXONLxxD18;-l>TR={-oj@@45OI? zhqloDu3O3;j@BDs{fp6R@`_C0wvPO-%9Rj}*w^euU7=~_$i6Ag ziyJUp_GCIlnhHJy6M%i$2&Y-8;ps!a0^~G1`4G0ccU;)1nXl1u}B+CXw`#Q*rALPRW&mqv!iWuz5 zo?updI7z`fz#XLmxG8I)tP_r=IQ*x`#=goB#T&WsXnJor9NWRZ#gR{`@yad^lW+!R zNo)c>tamp0iEhdNW;|F4;*lrQ_Z%&jSy6*5IcQp!TaN5`gWs zv~~9iKxKv@HlJf8sC9Ou(~JbPlZ@a>E8NU(mNwiNx)tCF_6XmqSWFl=T`r2fgJ>Cp z&<@M1Ergq4ZRt|P?PCdW7p=8$^;wTsv&$*mMPdL-`5Zbm&ZW&|YGu~I{vAO?5NaG| zLbVohY+PFCl!4i~+BFNW6>NiFw&Z0U`_rot9#+e3`RQ>ZVbaJ6VxP+`Qs4I>5KG$1 z#?BzXF)$pwy#epc=LHP>0u!1%BbH7JW!lbc#1uQv_(5!n0JsU&M>okN4qD z09O>&#mR3%Z*)z$$OkhF-V%+AlT76{$2sPXj~VhC9GB%7@SiG@MCA;Q%3ub-*XUg5 zw;85Fl%es`+Q6R18qISurfvB`jtdzWD;X?hZORD+Ry*bA_BTZWvP(P&;4y6-ME}>} z)?|I0F?&W*fE>HaL9nps(9xg5yO9&9!|N0Uo8qjh0($Sz%{|Vu4hn*4Fg#+Ed<$s~ z9`xpW2ogq5j2O8pBdk$?;aYk5Bx!8u`HRu~+397{z z?%>IQEw=>-iRT{%^f2KWeN&klh`H3~l%t4J3r>xc=ONZo1%O^=s*jb#%ZjO_q}R$> zNkmuf&njHgXhnf4sfu)xqL%4dn$ldAHvqjMDgc`w9j9o1Vi*`Xr9ahF?88FfHq(~} zxh>L{{7hvtR2>y;phcqpaG2v^Ap>xb^oFL}pN*LQN;#JHWCnqo$&WD=$zBKv zbU6pM32Ls$Wf?OwsTWD z2fW@8?{g+d#f$aG>|-TxI*sPo37GxytD9 zk!or@cEO6_v6R!s(c~itRftrq=<^a{Dmsq42ac*% zaV1i8k~vik$Wc6ewcYArFeV<%!ZXq#rb9?e$2|~-3JX1Ec`64;{)nkW!Rl$RH3%MB zo&e)EM>Wn(>(z7L+7`Lhaj^{%=N-6$WXH#W8^XiPJT}uy1ysygnKSMtEvqLKHYbR^ z*Hd~nE5OP%ohkvGLo$47?YDosogfO;;+)>THukz~Ck?@-;DIC*Cx43>3pvCD4RB!6 z5`|A`wwWtTS_(-)5ptUpfwUm#466d6&Zf^0^46kok5qu8Q)mp|so69@yMiOs^4T=( z;zhbe3@3jW;ysTu@!p#r^=G)VE+g^LG-w=>;mx8`WWc*wbjY+?1qdlER*c8TK ze{?l9M2qorm#t!)tSau32=QIu75LeIjPH_e$1vW~-^`#0<51jldvmAD7wPCarb$KH z=YxJ&3$MZ!CPpw|hg+X@+7=T<{$r%$KBd}Yf>PAP_)>lk?c*+C1d1TV2=ZbN#0Ug& zT!4VOhSh-VBcUh8F-aUF>yHqUgcuZ?N}ie#dLBJw_lyz6SNl?lyJZXxK-6rg(^Z5N z+bBXv@2Ytq>OO^_naZ#c`nh%?v+^4ev7qb3Hm24YOZp?^C$NQB4!agSfzJ*`K$ntK z3`4(+k03_?hhS1xjN2ZM;Tz4T-UGHB1Wt?NMzHlYWGzg!ysWu(17uzMg|18wzpXv| zXm2i3vLS{ylMR9m*Sk{M6b4LGbu_~pa#vS6;WP+jDvIse#!>e0sO{>M2&zPmXmJQb zWhpq17JkT_hcz!EPOxNaoBBDl4v z`qda6S5ec>JXTy0b5N>V`Qak$DXUlo_>)y-p9nafJ)3s2tCP)R5#_*&sBwfMzP*z; zS%5AfPmXV_0nSqzOM+A3D*BM}BmMHAAo%Q2yi|p^|8S-~fN&C^eM2-a z0ALQr&@6Skn7y5H2r!51S$D)N!z*Bc&sl4*6yGAK3W)^v&v!@mn^>Lof9-zJK5@e7l zpDnKShLXWVgD{Oexg@%-uTpZk zvB9hvG?K*?hu|Rn<-J9&ji5NW*sz(np)Jg0b!?d8q!A)*f}`^4;?*?hT5DMDbYz$Gjo=@N$`F~-q%1szlU`1- zMs*)4136jlp$7R00%7c4)hE|xrUt?j#5h~n8(y&PCzTqRU)y1fsec-oyxqR7!N8KgsBw9&@Bk=DI_1}u(h;*nXLM5j>e_)bSumTIZO`Uo_OZUHfaRS_p0t3{)c6ZE=Fscb2lo*Ggj zuVP+v4))Bfo}%@gdIfKNTF6JqT}@*jz?o6u#-0S7d*4D zZj=^xZhO?zo|=o0cU{UAy2#2UYeFTsww-Jnd@u9b8aluZ)WRR1?H-gSuJu_wWMmj^p&t*k0e{LxhtA#Q7b!RW=?Ltdq-vcraU5X zP?7H4hlntNAdm}s0)2&W_xPqr+B@#s{-&Ui3;2qW4dQ#VIRR{LbZakuWLT~p(&3`W z9L>k9A6>ni@#87Em~4O$CP^Zwc0n|^pH4Iq#2d>|Z{qQ;B_Ax{5U_0#Id{4wj~|5wH*>D;#}T6oJTZ_KX-?=t~%q z5=`NnEzr~c=(%Vh$U3|r){I73%4m-4E%xF{48{jn;zKKgWdtAP2Uj9wfr&+Jl6B0@ zoClbIKvOECu>bN}e>ef{GjbeBJn#3Do05jb6e#vmE#L<=twB7Nb5ud=xxp*|!-HaS+~c`3EO8(nc$bk{ z9hQXC1G_)Ix=NGkV00ZBD?=utGk~n7ACL~_2xiy-*z;g~8=YF1^>RF&TMG81{Zfa$ zVp)z|YD(re>+i9ly{(qO@=Q48(*o1VhUK97(i1oB%em(8L_>j8nXda zXeluWmCZE_dXbvPn$1Fav(k{h0^mn799b-TiV#6lghL)z4s)U53&kj{=)D@^IdIN; z1q&(4JZ?OtIrcmlM0Y)a?#U~LR)k0B>oxRLB=IF2!lTX<$@)&@yi9pITJfXXXgxdH zfSg0vB^0h)ONa~>2C0Z490%dJ`)c+w#$gVt#GMU59xF~sV`iN`%7p5JO@KRvyVG6c|vK2@d!*A9YX6Cu8X_5aN^Fd$px}ReI~IE~zvrsz^8m zs|03;TfiE-99m!p;JsU%L_;K+im5Q(gY5w{8H>pjgG~X4hk$Rc@g9c-@!_`By(CnJ#pQ{71egT-1JFo|ghglYcFmR{ z#Re!y2f#%BQc)8A(Icsd7s`j+Jqfpyhc0EAepZw)~v6W<#$BsHGSN({`wxZ(H|7 zf}*sZ_ z!d?W%WAT11K9ZxWrQvB#Q(r7{m)|o76M}Yb&~$`dz#y{~v1@bpEdXo#h(-Y*>nNfi z-o`Vnesnjh+N3{4tVJ2eQgHxQlv5Mc1&foOm2vDhURd{Lc!X|Y*9u4>4FDP1Uv;+l zvjyG{v=Do4fv2#i;9T3nw5>oFurPL@2c;AkR7xSNhddUKmIX_I_KqVd3zBTcU_6Ic zg&2fCPhohOA`m835>rXpJY_dA!eW{MxDr_m;&lvBSQe~tyq{{3{uuk5YHLEVU^r3$ zA9>cACe+3{QYyl$MYRVYn=jb$U2lIL(l#Zh8f7ut`JD}$iPi)zMk6;dgKl2UI+{?d zU^N>HpC=!zG!r#Yfqb=;0u5^^5g}_(b(Y9bOJGGpm|B8Rrv_YAyDV%RfDIkcLEnZ! zrj%ob9yw|%)*Xp5$d)}&X~aAWZIS7nB{N0plc8m$!u{Y+saL>Zi#&QqyG&Ks5oR}?J^$*u*sBQ0Q4 znTlIX*Y@sfKuQ_Ur^Cx8d^;X;kd2fYkX?zV$(|LZj;D)jEL@`1F%G|l7{Y#xAy`zP z@p%UNGpHX*b_6hL3N}C8>m2>`Wgs37d~_;$4sxy;m8B8 z)C98$S;W4}a*YZ`&clZ1^dWjmAxnBtJ@ zDKn-x{b*8z4{4+bCpLE4yJoG`U>&>GQ7I*BZvt_uUE6>G-QNFBiDtHHK#l&uLYT7Y zp@I~(?`EVJR4sitBSBz=fZA6BazL_!qp+{9MSi|4XQ#QIC*58=DuU>HbXqEtFw-<^Ojjk)v`LwZ;ox?MFS*p}ax~2eWN?Og zAg;xiUcB6t&%jpdLBpclxsI5r4z|sAM=ECsnzcjQTZVCkCMzI_Sp$~3$kVVPG;aJY z{2*|{9B-@#l#ka$OH4_?+1<@TCC!R5ETO zj8tN@=uf9gj~B~qu%N2XU?bHxOe_NNX^r>C0p?^xx@Ykyizy5{IkMn}3ns#XGPT*g zcZMTh3hsVf?wf;61dWKZ(Q&qdfTyDbNJ5=zLocyb8WbA}d!-DkVtcHnDzn{-xd z{R4pWfj|8(P&MQ~2jF@{;aGwh2?sl}X#k*-Rrh*#5_01g1 zC8n$s_z+U*JS@ljYcGlORFK-n1aaPo9nMFW(>WfN)>l+w6iR;#MQeNc5geInPT(TI zI`BLKUO2!Ufc&4~O?pFE*>Hw@qh3hKhw*IN*)w_DdgI5&+R}UZiwHp zMa=rb5c?yms%OeEQESgdk;U_PcpDv`xlNeX!)e}Z!H{YpTy{9C1#_Ia;+CxgqE?0; z%^6_pBH6Cco zm0lK!FbbhLxe(2QG0K>8iOpA-nX>!0;{ZIR!plc=^)ev4)ApvO#wv9VXgI#1tv{7$dtcK^v?g@d@LQo1ZmPl# zuX7LSVng%M8H^GJwVg%B3O!4Q@xl(a<^c>ISc5}S+^ag2lz3H#t_m>5c!m~Kk`V|^ z(XXxL;ZGaL7i5`FuWFYa0z=#b4 zY+IXJB4iDw4Oa)=Y&Ur90awbawDbZ_rE+;-~ohNeXstzy>0?}+z1s zR?>vhSW|2&kQX7LO^R7&QghJy-td5L*SZJd}A?HNJ zqJqG=n@b7h)D^cafr#A6k>{XxiCCx0I)ttb8OB=n^i9M9h-FlD-1Tr?U~jc)%I9sl zYZ?+jB?H{DA#%nFwAS&=C@!&)Q%Jj&HQ|d1ReA=kbM;PoAaEaS2 zs}h7rVJTowqn2ENAYwrW#I52221&e(N{lVi%@?wWV=9Um8n#)+d)DgPt{v$YIiQa4 zS*4u89wea6FT>0SzKBCWf`noEL#&o7#w+thCa|R<*5&aOKkIow(|SFDB6&T*5Z{i4 ziaFKc4FOoP9O0f^>GP{_po2l$)*)MUumBR4@a0#EJp<^zIH@zU0P2E}Sw`8iwn336 zdD1pgu8hqTSq(c}24hn;w6+XP{K5?N((G*=Hpzow@6Y(A0B4D`DMcWiz&yb{_k4<% zCXgJ}LR}T&^Ln_dPg`UJbbFBHV8&-w7%o>(e&HC1ud!t?(34u7z5iIkUDiT6Jv%8! z6s6>g=-*vnykpg^6I+eCq!+JSe$^%k$v@isAG6 z8=iRqjUZ;vrt6$pr%lBZ4LQknfz0(8NLu3LC__ykhlbirDc<+Z*?qDzgoO9GO{BV+ zHiqGewA-AUA1TQ=nc>q^thn?LmfB)97KN^osX|u8&fxp4kAV_kAj+MrgbX*9?|OV+QgvVE3OC?2&A zmuU21!mVL{01vig7a?H|F@YbVwmD;j&C3O!FQJ%zy5wifVu+0lmMjauX9RqexTp}E zaRmw1M0}SCSq$l}mO+;;DNw<;D&7ILSiGjGupM2*>r2X8iU$T^je3e0RdMoCM9!d+ z!xGS(KWnfN9YSlcBMRC2EQEDB3TX+(mg+E+se>S+kR|70UZ?KQ*a+5u;Ul@!jx0Xo zq|6peyltAS)F(^C-5$PhEY>Tt6s`G5b}$6q4zVSa9w~K?d~<=9Mgv{!1x_Z?ZBl7Nw$H`=EJ)H-4%b~-EPMwVF2i0`6*gF8QsMgga8MC z{Sz+Po1t6$eJ^?DqdpDut(fE zDqZ6`kc-aP-M_MJJ{?p? zc(cjUK)LuXwT02R{c<0JIu>73vE5t)#gcqkS>0gw=+p^McRVzY%Qn`zv8g8UcIWVx zS5|QgyiDT$&2U7z@p3$!E{v?%OBmLN2a?$1L!QJ!K5LX|PXOwks@@6g7Gqq%`6oOL zQ-NUPJA~E_Vm8kF<{-I4J~vXzb#12rnMKW(vNlnZxF%N zz&>(g-&u#VN{Sn@q*JW)F&tq`3miKC1PE7tI45+mwP4dpb;6>o##p%x0G%Y7c$f-- zhsDi3b|t6A@r?t(eRG87N>30e@EDdBjd{#ywnsQ6B;1#}_-m+JnD_$UkHLjFol)Y9 z4t=#r;fJf&Pw*Bu03YL)!cG54=iN`HLtrW%ga>;D(N@CA{`(C$zO-4(Dm^}yqqrJ_ z>>oEHf3R$zL}Cb{%%kgTG(&0wwU^z0`{g65i1u--ZnUzHS?Vq}S06q- z7aKTro>58h@-3;iI2**LAL8U_`i1Ep&TJRt*Dk$JJn1O9VR>A3k8{}BaMc0_pSa*Vt2Faq=MCd3Z+X(Tc|9z`9q2!_gO@XWZBYkQElb^PWO5mvgJnD>*n< zfqla_1Xtvo7wLOE4&?R%u`rJ)hmkzgVa0Z@C!t=Z#y#DVx)1X@y$Q@xft}itg`;>? za;=Aky3nucHDMywHx+*_ACs4W!VYgLhu*}giMkMP;qNbR@x~4BVq?nIrs^WVkG`)0 zUMq(cZ*%`-I)?=_^h^%niz1Z#2*Fg?U6A-1N&)uvk+OEMNSpa1VA~a%6l$_{!Qm9U z0__gF)B`k)@USMEtj~BXz6v}ft|m~3ooLNhkiF`FZ)zWJYWCUMnlZn)4U(=+5(0oVqYJjPN;9g5%~NcZYKMvNq1DgOaZ zmNj3fqnFOsx~nJhx;Uf!Zblmw4g;c7Yh%1qn})YX}qS5hOvWKN1|= zJG2UpS+|P^GM5Rs34yk;6plzjya+VKgCAv*%#zdCqj8jS?8k}&2(1?O`{)C%98BVS zB0UTZZwbHy+2{~$JtCq>#EBHDEd}zT4rQZY#a7H2V(n!z7zm1eC=~ko|kz2KoT6YHY00r zu=MO|3yxvvPKI*4-330Bz-$wA3zu*~IL-gTL2&e za)h&Esv@>5jUndx$XqF5#*WofXj*~A9;R*c^LP4W zx{4*KO$#U*Xz3+jE)0)yfdjh|LBYeE9T;Rdi2#fu!u3{xq0toB#*Dm9e%FRWM!hk_TEJe~Wj zh`KkbW!0e=q+I*9s#R43(Jc_>2}pZ(z|7#?=-w{JAjr!u6ig6w(w>gD2oxXF7i=t! z<>xO+F@LE=(f-3Q=g$IE#dWWbV3JY(n)QH5j9{PW9Yk<{L?f?9DAFVX*D$K!hmME* zHF{yPI%6_cSh^W17`lLGFMnyoi9xsacX2p`<8@H)n81$2;9yzH4DEu(YKPKcnAOs^ zoxk){=f7%=%1eTP6dyhEIL2;=s0Wn>x&0mmN#7e*7fe?#ym^M+YI^wu!4 zlQ&LiCxkjA|74G_O5+%yPYoEU{Mu#7NmqB;KfwH znbFuh-3kzkPF5lw-N~Bb56B2ZcOys~7GkrutEil4YHel|m8bYkO2WfMv)k>hET_FI zJub7>)@)D0JUmbc>+9tqhybP7Jm#ZB9IhM~Yf94y-12n=JRiXu*PpIv zPi`cmN2Z^rbh+tMzXcBIlw*yfk3_e5 zyv7IkaI&fBcJaa#eDmZ`-=9W*nsvH=A~-BRL4{!(t}!aJ1=;x@04vO57KNWyXu`a;WC%-~ztb{D6!OGs?QoZ|ihUpL;7 zj7oaQbNLIDBl|PojCFuW$5OcC!`Bg(^wZ>r9he(i42{;n96~zT658O*e!iU)ZU?sO zn^3tYKu4P2+sS58P1o?b0I->cJA>8RgpxF@-5)GbN-z|D?8D(&e(f7OqFaIYV58!& zXvnWqXehR;6SY)KT_NjN9-Jd#Cn`=VRK_dXmmkcln2`lubvlONpsiH{fp#iQXoB9w zFR$CUZC^P6nv}ARVcVjrg>B)!L)m(&1h_ISUx1}!6cfl;!1!X zuI;=6atT6O1yad1L=gSrgdwIRmosF<7)+()2Du+n>acfBRfT;C8vf0A=u|wx!*&zO zxfew#KI!Pq+D+;RIl}RfB|&E41#5hSHsv&Ncx{r7wHf0$Q1z7YYPrTIUc6!iB)C$h zAc2o5hIx13E(Renvk8D@5d}ss;axVF(d3B(K0uD-t4&1Y6Lhgo>MV*LQc|`A&uJ03 zuki7|oCl6d3&pYlHN)_ILU@zV=TR2oRHL&Ky)9%8Iw@@*hrzY%AhjTCC9o>Hr?R;d zJnj{^N!{?^mzl1puUZ!ibJu#uBQl-;X?56kjGuQa>*3~as~>0yGriiv7PjNw;gwCf zl43;kT?zE!r*?w3^Ra%!KkyPP4mpy3<)hn=4~X!CC18H>IIeO=vku$xL7#OvfLj|} zE{;(>g%4atghkojqK7PLb{yIX(2@xk3J;b<8imOr6awyxMdin6KzQ1K5JbwSW3ZEP z1w@tD9S{XcF7XyFU+AIKDWFfOV%*9H+{udGSx-OyxPafa-||tIevzQ<1teK1da5gqYU*K$dGaB zdG-myHBv~0>p-5OajVJUoNEI1H|1#ysq5Kjy@rN4$(#WUe{2UMB`BIPOVCKUC|1Wq zJ+%Z8Lazh(1?VFEfCo*QaML-GX;GveYYt`*HN6MYxZ|j1P)CJ6SS?7Mqcwr0Fq!rw zq_-mRu@0p_`tx}E4=Rr?u5sH@KmvWDhb8W;QHs;2QIHfx^8G8*am@jLz3mMF5KIz9S0|4L?QHsB;uT^K}~z%#Ef+W*8M;mYE`-rxVBy z&Oo;C+=2A~VgfJo0Hy5psvURo-#JUKSQ`nzT}&Pd`|T91f09X(3+$SoxQk~z1#krq zdhSeJ9RLS4xAfF#VW!L`0sC@_n+R}!+uXR<=Ez2|6>|%Oj(+Rvj(CoCzlTlk_K34b zFvb!Tzi{p#BRH(z0fsRi0aZ_*pD?Cv*;6WTv;r_%<*5aCHJW0Z-4jW>K_)#4C9I61 z>+%usbN~`AN(}RqBokM`aqymtmKF~K^FXM+;bA0!9=e;PNf#s@65Tx$FI#)~7#@NbxX?oj$*pCG8T8_zvP1iF=z|x5L%49HBOV7W%@HJ;g#zBj zC5ufy-p(XSk9WYp!D$aA=eO6QmT{$QtMI8{TUch(YZ4_S6|~PnrOZAB31Iz9G43Th z<88*|mSSpJ1t2BI9zO|BHXBsUGUo27Agm;-7}~D!OedKh z?j=g$t3bvUi?6JJG08*{aoJfHIm8+#iidFdWHk`YNS9}K*g)i0S6A`mj%mb#94(P4 zLrZkZQ06s9l?-CW8YrV#&Q_v9v`e5X(Q+ow6!gr!fE^&WFn3*nEe?+dnDNG(PQfcU zx}zyJjgF|zwqZa&ht3d)%+wS_(bg~l#shUIP4}#ZV~Zw+WGUI7A%P=oO(;spj4`R_ zFTv0m=OCn(C5CwqOAXuS>D5#WnweFJa2?ccvTKqeED_+oJrq|=+r>wi;C;@IF|9*7 z;en*Hi4FB&91*%Q0J$I8%vg`d@z-KKNur|^c}FO*OV!#eMVhtfZ>=fetXaL{)8Q!6 zJ%eG1A_PPb9-4qwn75WyfMZaPa&n6(rxejltm_$DQkJdxdka#imh2Dtb$QPU!Mxsh zTM}At18X2I;nyl^fUUC)CW)tLuzE*Doyj(Ou)>H$Uw`{61DW-S6R(F`q^fpt& zE}ycIK9i3(-*c*(h>6H+UXsy=h=A)X$f#Vb*OnePnHgLpOKVe@elVSsAT#keAQ@?v zc7~P@m^?n`Q#|o2b}meM8XKj)%M;T`lT%C`vR6)^ReK%?o;kvSK$3(H1Fm`7qd}^O zbXXGq+WhoAyfG~xnu6mS4)_klJ}%g!dAl5fuU99)O$w=>v^PU?u6~~yL$X@={T^j7 z>C+=DX=a<^YL`aZgmO4y!C;EkRvovGC(L`gIw zy4Ay>&5KVF;IxMp1PB%|U9t@Y$5D_{?AesxRznU>qOR5%4U9oTaWkt($T7A@@A|2| zXJ!~5b$2M*5F=r`ST62wakDU_JBFc$gLiBw%dP&Aq7LzplfY_0moR_4X@ScU$ zhS4AhN)iG3ii+kPHyXgi?JGEjB{XYEHljA&+1TRnve6xwE~1*66y+kJZF7ZAsVRD( z%eqK7qF)P)PzVCG@H#_$dR7X>5G?+wQ29COC__da zt!`1H2=Jw^0FT_9!G-pc#AsC_|Bnh%FL8?%9p0VcY;_}xx06Y0Q*V|h5ND(Yg2mfV znd@8JO{E1Cc1Bc+6><{=u3%8|wH}E6j@|7A%Mb<{OfgtIn@VH4S)7bo+SiDRC|8eH zjB(bYbja5+q@u;!7&sNgBMY?W#A+exVbsZhR7r~w=?O6sk3nK=CC}d&L%XObM$jlu z20R63)fklDO^l=!1Pw40j&R)sv2GH}P|*~`c#IP>|Ayj5gQ%vq0#gw#Tzih30JCFU zn+WU?R9I(;j2D`F2 z*!QHgJq6Rs$1or1<1^10IaJW2?(}FVvr5SpyL#GNCefy4t#vjwrfn4 zaU_*C(?W_tV!*vubYi;hUDcpbR7h~%zwl^^Z0};kRJa(1rWHf%O9xjg`K0di8904}bDG=W zSolU>$xpE$4E~g+VobtNjF{-?DPWd$+0K?3qU-WSAqE<&Yyi3S(ppDfSlbJUO^r2E z+M_0+6cDWum!vFP_t1q9NjI{h97qMe{AfmD2ivrI1oP@aHcS;Ip0&7#Sy7p$!}Eir z;;hPJII1mTjxaVC#2g!{ONz8D8z74;3A8eG7mXteL_p-jy2b+*@+vzI?%^A*=0<7W zNo0TN(~mhR2_YGT^4b`kO$Hvqh)_h~Tkzgv;V3`lM(I3sJ9KuAkt7+G@feo)=cTBx z#IV_$ia3?tn3Tmr&#RZ*VvMeZG3dhO^ezI9+;+WZxRbI`c8n3OYC^GcwE_ul-eO(J|dutAkq30fqEv8~roY_SLG%PTsGW9(V7ig!77Q ze~zUl8Tu+sf$xY5}Hb9=>BjfPyaP{*v6b%^)~eo z^Xz*kbm}M)N`Yo+YIaOiBSlWFXJi<;X6eBzxPR-0TuyRy2y9CY z+#|=PCdY`z)jP7`{BGQMq!Q;dIy-BoT%_Ba&9oy}`tW!`<;Cj&aX8H`md3h>lPH+Z za3>XyFyIeYKnG4ZZ}KV7`@|E(DUsW#@QT(L3NK+{wyw&^36e(d1%0rJmlVk>DLIA1;-sbCIJ`D3jdVlUiB#0orvk+j%rb5< zp*$xZ;xh}H(Ue{&X4W=$tO+Tl6I_1lLoO8nnNMVYxr>h5?1~wB`o$D;ajGPd zx#e07mb7uUJ8*9g@aZ;afj6`cBP?)!M$3;p0NL-mVRCB4JP1H?H# zS2UYnE?)*d3%0jWrVf#1_uhz|huKMrjCe2X9*=cM5USi=>D>L5A#JHde`M z5VUWj$5h=IoZ3TQ^U*z>F>X3Uc(_OD*N8G+z97t`hM{c;s~b|a^_9QrGYbJNUKHtOjd!Kx;^C_+;KX}3Qzho{ z+<;aIrcO)Y4G>pw>{Ks7Ufc+)I`N`2Mb-E)FuVX9IKTyx6d5@bJU^bL@uH$BYS3Gz z{VBe`$y);jjLKn#ayMj=?s2f<-o2>A8|ff}6U zqA!PMC5Y70pLg^D4JX!V$f{!ADKB^(a3W?qMDUgCh}7 z($P616|Cs~{6l@#J@8FkAlI!A3vg*dd+>2!i; zFLdpW@++QGrwoq=EFMVco1c*~*+^n#m=F+bxbJ1NnQf#jrdU*YOw5^DL)Nb>EOZ zd-CI1S9_(GRk$Vu3x&P}Fu5sUNXigEzp4&Mx1Qou(-&-jL&rk@J zD8>xkH8u#sv-lgSBe4$p0w!I_-F1EI2@Wg8%X^~NF$}BW_ksU=6u$q@;pgFB!aL!g z!@Kx>GyE8##|Zr-Jo@H5%)%l}L-^@wSR(BvY!QEk&=uk<{B8gn;qRLv<$dc4rSM5Z zlv`Q(>(C2#h|f?4-;4<1^(lVGh)rU8`1U38jtqJe!nba%>@{2dHr`7K`1+gG7rwR= z!r#4(9!=9F7od)RIs2^r0q;O?4{~RG(!t>-vVXwG0_Z-i54=v+UU4U?I)E|wuJ`1^} z9pvmH|J&9M=Z@uk4cI2vYK*yMAFh#J_Mfx(BpifJ*vCBVp=II>TmKdQX;#BGy}#if zsy&2Hz2)6vG#n}OvA@+e-bAe&eY0=Xo`komakajK`iPr`Uq5QkQI0q)^W6NY7&o?c zV6SJGIbvdcM2>lwzwh|$l&cxuX~VQ0#<6Sb!5wuI`k1#VLgBS#b+fliOG zCFXIuIVs-IbAyRMvg3Ke{~cl@n+$GXl3K;MsNBLtR!$W+#mHhL4^<+-*aZ1r+H!qn z3&6=?dHr%JGtoFlUT$ml>c=4XZ`#HnNhfK36NHL=xk0Gx{~=-|fKTyvm59JT@-o*L zB}9IHg{32+b4#lCrxCP^F}80wHsmsEhHiwqA> z+5xV8yG2g!X%TiJB2i_ppbMX(1tCywnqL0eOr5?N_Zm=BOpCsdw=$p$Ah>@xyeZzMZYAdI*ZK2oh!nv z>nUxdfOU{sYqr6BzI6e{c?bdfqwwf82_O`Mhza2}GDh4zLA?@oM_4hIBn1s`R2e=A zPWYxoA_&H>v0qMtu&&=O#qRK78QXz4NAX~e+PV7Y_(uVboJD-fX}W}4GTj+^6#9F} zk;O+sg=cKHE^cxckW{KHF)w3RUc2zk9n{Pf4d0+}eh+m(zr;Yi;Yb|)9_!#9*o03l zkEez2lbfiWNj>d*oH>?jr2K@VCO4umvkAXJh;uQ8xHL_xZgc)EsR>LAqa*y~-XjK% zvFaU!u2GJwCc-ZvYJ*X5cUE_D7H!DQ@WKr8aLzbJ?qLc>oJX!acX#MZOmQ6fGP9ZG z1kw%miZd;dn=OPlNP#$l9i&O{58uf!^8XP=H;3Tzb#4ZA+BYAW#mLAFJNi2eLA;B^ z>21X7RZ}B#URI{(W|%`PpB?73P~Io`xUewGxAWL$pE#9XgLo(PAJ)o6!F|Dfh4^B*b&ylYj`CM(Ks$!Ni5*tQdsoG|$He7W&%Z}a8qA}wb2y>?vRCnejJ)L2i zNO#$v@U?#z!qFjMZo&}tB*h{^(S-1OApNJ9;3ob{R$NAu19opKw1SEXeGnB#0?nogW;kr@vF7tEz_~sf?I2O{+@M(1< zL_)89FNT=+OO58+Wn1ALa_wjMw?yx`waV0bPw<(dVkUNg6=gq2W{7KFsu!Q`+dR5{ zMbVp-k35;=fTJ%>J+JIlZJo_4ADhlH>H zefWDwaClSLC>duee2=)o*${4I78QPZjJdmxGesIezVED#^U1t4e`Yo#${IfZ-+qlr zCux8c8HHHbIU=hd;gX5MCpeQ-S7RvRQSs&?Hc2~E-vkn#8tHu#g0C;V>%r`vgvgwW ztcAm6Yb0>+{xire+6bTjTOUcJ)c>F9@_$vey*Pf8#&KoZr(BrB>5>58yo?ieg)&?= zw~e@UC`)}Vs*z)d*YA**T8wr(WbDuX>q7vX6>*-+3^P7qv zY}~ewa7lekq~ZtcKS||F;3!!or#q#-<R7E?I6uYxxsQHtP)EBx53B34iI5 zBu`YR?$N;ZtMCc_Qm*6~3rJa#HiDUuVS1kmAInK*>kWMG`w%t0vm;R)vDJRIR~tJw7R7SRqqUu zX}N435HY{YY(!d0lCL^!05^zw`@fG18Qv&42Prf-&<{CmZXWhTq?E)k8RWm~eLA=4 zNbv8q!!b<<1Jt8q3T{av4Tb%`Fmd1cE2ovC;l|7AiqOUo>FZpO@SVT0UXiop65(~K zB;G=o`CczaW{}VSBSnR51kmaWpGcZWD}?b9z8vPu!_{w^3Ml+gkXLTzDfep0b$(nJ z$$tVYfApG*+{8b0`L7+BszTJb(ram(Y)AU6w-1W+SMB9hyA&X*8g&7TJTUw~V(b)W zUBq!Ny%Ys5efSpRM2nYT?&VY~Miy>6<#o;#S-&V1_YTWb)Z)y`qHHg$p%C}_#Rk$a5U zdtKW@GjvVl{igI$j0ea`U0b6Mph%*RL~7Q3ZM}DylnkFXtP0xMk)@|3bi3%-9B@{u zb3p_ip$~3Jbyj%^7*~*UCsR~?+hHWw97fZ??nlrQj7oi&Ptv@kOI;*UrAFAtSVx8% zASQ49960hA4D}b`{qRBf5LVh>BJ~m*iyQX}_JE&bJN)aHuf8Op>UPkf zE{4fLa(aE&wQnoQ1?VakP=;aLy09UHgDPdFDUT<+KAGA+9DWns2bgH`V@&5aDaCP% zhG~_DQ_`vma8DQ1>r8C{;DliVswkOvW6oMRUW~Q2*C{ihu8fM{l@YEnC$d zyk=(VgXC{2aU3HJZRq>@9AWY{k{)i1dX3r?EX_4# zPL|f;Y$hy{@R&!bz73k%8ru9R^LU%|(y5N&32Gt1CKiOx|6{d-&Fpj$a7%cJDw+uI zNcF7jVO3HSb&Tn}j0pTVB0jzp#R>bgUFZMuz05Yp@T|Qq(oBjk5^boI=IM4jK9_=& zjLHYaB=(z4qkWtUwC4n`M0}N^Ia1XdPIJWK!}Be@O-@ zX7i9K3^m+`7lV=k%X6}I!oW$@=($Tc^1R=qnh@vT2213gTh~Uf_QGDd;8kkK1uUhL zvd6hC)NSXzw1Tns3yAWX8=kLRqR$**c&#iAx$gVTo#T3AfGSbSv;)N0+kD<0J|qir zc19Mpi+Q2KK~|`dt>xWcs!CLOhz_LjT%7tycL4W|@OC<`d^_f@lVlMQYVMRCH5(ujpXISM)gW#S ziWpg8WjPVrS4)!^!%y6PueKhZ`S6yu!7Flnod+S|TmJzEB0J$f<5BJR{x1B7@HhDP zCJ>L1A6p7etluczm@Y7Luqb}l`$9}yrBw^R+(RlEL*|&|w{q;sOv|yBo0J3wqx<}S z_NnJ`Q{E$$A_6=lmE_$^Q@9$Pm}O39$HX-iw>ZC3f*vS#CH2>gYNk zqPmyS_6hnX^O{>-U8o_lbA&{GZVPQsO3ft~0s{Z)6gdeM%_iqwhra?ueeqT~yLBrE zm+^n;m^j9+`h=>hWa?#8oQ!+`seR3fmV8FaRn5&>)N$>+Qm^N95>3=4UqEWPTzn1s z$LJ3+F#Es*x4%QpnEhlKITrx>I-z;W9YQfvq6{Fg@@3{NQZ8kN!btf1|8{Jy>RKeW zR8c90l0<4Ktg7_daw&)Nn;YeXv70Q%zr-~TuTGds&YY#}vV`+35r6t!s7Cdstxo5Y zj*poyvai4zJ7RF_6Q?QsOC5(7i9=c*JPHZWryV)^JMNo*sAl}+U(lXaMjM}eE?fV>4jvQjOPRYeS=W?!oJ zfev-*gZkCh2i8)b3@_*A*j$da$%aDf%su#kTUf$}^;*ht5~aBZalOirx+wRvGGE>) zdH$+>e{|h3gyhUB;TX+jmMleA~SP^6wB8%Zp0=7je}=tw2BsYqW) zrSgeqy*-plt^_Wrgx6dm5-$wjmaQ+wrXAEMNU0z@o5-rn+c6i-Eks?)9byx{=_CP> z)$w+fhy>*stZ=&nzPe9>N)g2me2H+GM);o7^ijJMN-FM6yM=(VF;RSrF4C;ZNp{NO zB7u{AO+eN(vaQ)ma2M8vFp^&OuF&aDvN7<#OgcWD?Iua_9W>8saI94mPnF(ka<%EHGO2B+o|SX#Lsn>Iya4Ht&=h094ClJeuY7W(y_ z>?zt$94%3XB7*)>exs9_7QgNEIeh*H2Xh1FNnxn;(c@ebGrU{GCJth3-4>p@{Kl1{ z2S2rKHBEfv0GU!>0(u}xoD^TImXzE_yydkh`OCG{LwuG6m7dNV3H8Xo!L;)~n%?G;2fr zOuZ=K5I-^-B3BwnJJ{5Df5T@>-6=D?ESYjp1 zK?d#`k_!!7bYfO!lzJc`kc&V$LVCs)Y5elD`DSW( zn`q;P!GUe)X`43?@^Q15Y5RzAsaS#FwAHFX-v;}QW} zXUc+rD1`{A@AJ(0d|%$9V{)ZuU&KMV7^Flj>&H@J>s%gEJ<>Pzf_o;{TJ5E3BTHd_ zxsc@JL=c`)WIUw+B-2o}&%{?T9F|v0LK~tfYiIvd(rZ(joCQxQt!bPGrg1bxU-l>a zh6~L(cFsCyS7$3+OpY@9lT%;iUY&sdGSyA%rdQwupuYU!o4&hgny6DciK*GZB9)MJ zNH4C=3TIpOhxfBg;me z@FCj$1?v0||H7}^`Y}b?W2@&q%Qr!so&*!L#J^ha4=jzXy^Fjb0beT>NnZF$ZN{} zr0k})JjD#MOAejnQ090MNGFY&G@$(hF85uOr_(v7%QvN675m*OYUc@DHtbRFq-dr) zKW#m#>vtq*R8yQ|QU@SelpR`#PtI)~oS*-znk*@U46j_-(yyr$=gGJvb*ZV6>SRhx znn`TPUEwlh>5-J&o|pJ8PjfkFJl%v6?p_=||KBO&HwlVJG_?bUIE!Lx)b+WVJ(Q9| zz}v8e(;!J!Lq7?L>~r7+SqW2TX6aB|tmUCHQqppXj8}Dhdi2+S%(ii|=420BXV1%v zc{%#G&4h4}YpuLoY2r-y^&Vy=Z=Hv|dIp%ks%$ba?9g%N0CP%<4SMz0U$(~5Mo^T0 z{RqP56YEv<1;L31`=}FZ3e&m*CGnoUdX-s_#4an@+SM#W7D@as5%JMaiL#DZ?*OqS zyOO1o5qaBe`O!PC&dWCP@#drNX}dfI1FABON1y+XJjEu0lD_TWtW$Ef7D)HOm`3t- zhZApx$h~Ci*nu-B$y66*iNHknbL63PGPljVG9>;gZG_MN`>#@*H!m`6q0LA0%8ktZ z^;PN)uMsctVi$(X6%9Y(1mV*_UpOh@JJo4YiSR>e4qUq(^z#~6rx+Ow#lG;3mtd_> z+wl7V*mn5#j^UB$W%$O9O+2q16L)cX^t}_*z*_1H8(!yq6SWpge|sOT(7H-;7`{up z7tH}XC{6T;s`}S?iiOu_vE1CnteuB7Csv9`LuN{K%^fnk=t~E4UUyubVCJJQ-ut2? zES2p#BHafNnTcw-wd9!o;U80qmn5S=_KwPtzfq_scY8%EW>qZr8U<=uJ~PX33s#%R zNxI7w^&QVJccZo(V-r{v|1GlvvS~^u(mOJnCmG-ZkpO8&O3Pvub#Z}lX#-jaiUrbg zbPm;4lei!y@H#vHv2~eD>+SF({4@WLr(}C|>ED?Q5te<-I--w5CtOt(o$XQ6;8xNj zSR{3Z@SmLmP8Lc+DUSf6owTQH@{?ph{_KYKHm#Jxl@6Q0C_euKcm5Z-@6=Tc?j?4o zl&~~$r4hEhaV`|OBPqNca8A$Tz%^B+fZ~UWSsu)sf{QEJj??q8f| zSFzJuaLz{Z&5>|);@5R$>oJ;9G~GgyE;iCZKDR1h_Wb0 zs!{E)OAa(wQKEAHV6^dvBa%6GOIwnYBAH+K;FflZ7k-19yTgUgJA>1ZA`B}VCe~MP zxDgjc07N`w(<71M#8H1?D$}?dvJT5~j;CTsBzIH;j=(<$u+a7Kw}XEd2n{hEX9nFz zY9H`juo+%cI zv7?=Yc}Y1qM-oCfH>}r@pDmOKtL6Dp#BPr^8}Atfe$GN$J8sZxZo057MYN`4;r~m> z{7YXy_MRJ(t4;z=Y$DyJdPdCSr9fe!wp4ikk10ttfD|tLorK(clUeK9q`O*4Zkc=z z-Bh`_s>*pA!rR0S_VzE)b9#i)W?b5c#U{h+#An*_eV6z%ifv`GpRAZItsITHdS92#;{R#yeSqUW zuKdp53R^2}qy~k}wIa z#fzN#{pKG5MZQuh%7&ZJyKsuSqN;c6xQ3#4@KzOX#}8I9HJM^J~s zJ=7&!$r_?ob2J1br(ZYraxE4-Yl>Hc*c2&~Ns;78CAe9E76LSulm6${n@;ba(#U>r zS|#;@(>ltT=&s|<6PNdvnxvmNJuE)CKBu)U<#@l91An;OAjxmx4i2v`S=SU~oy`5m zD4Q#3cViDG*O#8q=7zs}4euXR=UpFMM%hU8@V{GM(3I=`A43+eM`5AQkilpm2Jl< zZjm={-UsDPoA+1R%jr};-?=4>7E@uly&QzmZ+2`6ze*sxC9LdAg;C9gM+isXQ<&7m zM>Pr<5HMCCCm?}ysk~rdi!S(t7d)nT$j8Ll#53fQ#N!E|>6!2`6G_Yg5AfewDT%o5 zBa&~klw}uD$+&NH+2^Q?`G~P@qtxoz8+f2ExU%1eXZTX@-oV(<8ze}g4!9UbKY$Bq z!Qeu?oGAwhqIkKh92h)-RFi5~E_vLm9$7P{+UH`L-`zeu<%_6JdB98pFc0jmS`v9? z6Rb-YBSHOoDr~HEZ3!2jPWJ}ADalE13QYBDsopf- z=xeR8;Hvq^Ci~*J_BSLqI)ZdQKRB?tGwo7Ur=YT3zxO#l4mI-Jz&E5t#nu( z=myy!*uF&qrH{T&`YoN=ur}P&{#2p8r#)<3=<4bz)<)Dfx>V<$R5r+@2HUeG>p;B$ zKw7_3gm+u-09{y4_ZCv=tu*vkQ*wcA4bqt$_|^Qy_(3vt+82n$!`)n4E|qJB(uC4T z7Yxq1Pr8FrqW>{Dr5OjQI%R)8FNShsba8lL|=F~QiKU! zw*4p5K^ArL%9uEm&#Rou46Wh2E|laUL9N(jt%fI`2~w~;Xd`_w{%U(?IvR21Xy(${-ZWbEH$ zIQFRywGx1?en?8=-`tsj17SRbJX1$1j+m>atADAp6F01_7VG=N+RZJ+=sT%m^=bR2 zi}kT=0_kv|2Rb{#QziKD^;F)uVZ0Ad?3MSo()slL2x20J>xEJ6Nw#*yS>uwa3jtTS zH`vsf5k?`(BNM57ni{0?AMRAgBwJYBpA;2VXZS0|nc}$NQiZDfNm-1R!{`=%%R(AM z=#!80^ zE1w^rgzu$3Ao>B-?gQeKG5(;)`#&I)s_!bM@gZewmi(sEyEd)C~_@h#KL-t^qR zC5*f7!4Kf~#3nUw${c>58j`X`cQw|+>V!4OL<>^6)H^KMKpA;`)*Dza2`iVH8Y{2% z`jJUc7++W5Ye~QU0HAjC4E6!z15CycO5k1S zXmPza9kz;ST1h!7B1PNDfCxH`OQ*JrHZkLeszILd1{79?nEb7@Q~+5zI#Y~Qk?@nI z7@bECmeL(1XhSSE(B{YyvMlV%wt~5qH{J5uAaV|>+d6uKOb4jVGKkJoK{X`xzwDI-QDHpp{+#GKf3dPcUJbgDY(W_eviMB(M;9m{jDErxl%d_^EgPBfuT1j^roCWCR0wV z9);B!Zq*Z_ALO%mfmt)EIg;A_AYUqYA@qW0S&+z7N6vC~$)GWXnDmc}0~*O{XT#`H zuN3zPmLY#qlZ}g8gFyRgL;%kQ{TDNCJeC7q&5`Z`uaBfP!pUQXU>s_ zwN2@AthKoP%8uRP%zF%vcu0)+vvesuHRV|ncjv_|eHeK#X~-j4inAJP!y^pF0a}4E zHcO`P2!t2wS2RR39(%)1dNW4sC{E5f2T}1#KPx zC#t8#5;##k?bF8DFfN%5`(-Srv>CB&ZIC5pg zCt;eS0^dzDo_z!@nU)7YB$Xc zHY5!-(DFHj5RVIQ{f3jAVthq510S?Bd1!EFg^Z)*vBvK3*UrV{R7ttw<)p#J6Tus2 zgwUXnL`)2M?Wo)OZdBN9wAcEe8Y#M+RR4NX>FYL1|H#>p zUt`Qcb3~^!e?b+NPN-s_UY~HDxq0O zLDDSqfTtK_f^;sILyAhw`F#2|rayy5*RrQ0su2_&=8;U+cOyYmZ`n|{iRvn|6)4>j zR`;qS=8Kgr85V0!mOHz`_#y+;)iA!qAA}?Q443>hL=7}xmCE%Ja0y@HT4~A-^_@`q#E94iOYGOS~9hQOKoiT0l+so*Eo9NeJpTE?&>&dW!XZVP!X|q&ku)nJ&V2D~a#H5HWyHFVov4P)DeY7EfKHg>zeE23;p? z$>_D&R8tMzMIOMTqTb&Su;!M=HcB?F#V20ToIxs_TDG zG?>+JYT4Ve`f6=wOjaz5wr1fbUxpA1GlHNcWbw))`;tn>L*&d6-b@5N(r0H-Zv`+0 zF%%8mW^#Wk3D}Hf#Uni>4=I@-TgqM=ki@TvuyGAdTWl1Z;sTOX%x0gJ2}$s&o5HO* zrN*nueuXrtbfK2TP}!dh)s_8Xmv@sThRS|hJ8P`6s12P=mb|Na6F?$t+}w}Ih1Cmb zh7GuX1zayu9D05^mw;)U8y$A7#{x@5O}k@oEsna@Eqhr8h0fz%i-GN|Xp>WcI^? z=3?fA&I2Sm>mkmgTsM+j<`Lvt0x^&9Y)kN% z2S{VDhcx!)Pz4M8Wz*ua#v2-Bhj)xx5_|5F* zUdGLXo!w#Obtxeh%xY6%?Pjs|GRDgoA7wg{|464;t>r2vgw;x(p=gVznmdN4L%1 zf&S>Wz_LW-v8G?%0{bfGV3CIN`mEfj=Bk<19CY4C)#hCk+%MJ(#d;s56yv1_WS^Wj zi(r5RW)v7Fz|yUTVu26S_DP9cg_44k!+Ujoq5VEi}?KND6p2sZs{N=mOH zR*X=uhK=)5IdyMg1GfeA`m2v=u!!_mb*+!>_K&fN*5kbgh;=o;B)BoDtL!~8^xgxe z0>393HC!VhzEl8;9^J<~`Jf;J)OSCW^CAYvv zz}C!vV0m6r^i_Frh3aJkzpQn+<`Q0y#6JFHCX20!xv+}jUKdh^%BuSM!iZTBwPNLt z1xK4fU#n^&>D8>QpETye#+>g-jT?wy(_gF(ffsijq->D#I>>f|Y!`M`BAqR9O}QMT zSS=?WOM{xN_BAzxQ?p}Dbi|1RjT`q%Pu);&qAzP6cFz77qBWT*mAsN+-Mr7n1D9`M zugBcDk+#*z8(Pxz_E&>|kT2|$xT6!Rdn`DflrBx0RAb02l*AySnBA_J-3%Iegzh^j zHxbz_6!BB-+N@wKg#Q!a!hYt_Zt+FqMD&KzL~kUdt;slmS6OND#+f|Govxy@O-XA< zKWQ_LNcIfJl6cv;lSD5$ zOj?7|u-CW~R+rQtt4rc`{gNP+8Y+jGbQ4frGWom{)-O9ry|Z3Y2{`Q3Y{?0p6}oUn z8*Wl7wE(r!)-hPhu%xHey}=Ul)Xq%1)YJA<9_^E5_bHR@X|qkZ&U6nGMVokKm^Vdl zGAU!-H=AVvj2Y50f_1|b3V{{EVLb2lJ_z0g@3||?=4o%6TYiT@aDYX9&zk5PHZ(@x zPy|!y=nTb$3+D(Syiv_Di~$sXlBH&uwcJq4Ye-x;&(0OoI}M5G0&~Z05bGvLcR}&h zgr7-yV@(S8IxAslR1}%|k6L7n#e16qB)cs?B1yZ{u?@8KsdPs_IZ2x@c{*yP65VqU zWqXF*%cNo@+p8|2{+UH*2lF;IYV}a2745GXDn<$u1pJ4o;*aH-R$X^=+C~yX5ecFN zN;4KXF5tCn;St3Ai1K+dz|?Q+;+4-rvKy?8&}3np1R~B5s0wi5h}#iAf`DiOVCd8v zn0Q4uy^z`@%=@im{EIA78C*8c`UEzA@rh$!QzbUI8AzJo^l2utI7ahtP35=x3Q-LY zqDAUgwGlv0rxu*7Y)!ERg6hy{mUkLUGL+iN*r#(fY0X5*Bea{#w$WR8S_txk49U@H zGZ??>r3voJe!@0A;OSK`>6r#cd?gbSKFhT(o!O9Q;n1jo!*-WLU|ZGfvL^Xa5d-OThfS%qvmpNMgXau{^cKouqMEYBNyMg^3wuIa zW}XIT**AkiVaHV1B!TI&Cd0+?aB(7xUmVc1gPk49vqh%|b7eZji+MAUGza+=V$BMT zUj*LeVvCi(s%c96WtMOU1_lRYoi)!wq|>&B|B&XE!s%TBE5AmzVr5c#ps^3TO-0*; z=Ws`7hD9eGqsW$QtgPRXqF%fK^=k6QnyvRPE;EEI*q{9E@1snt-T6<@@DnOIo~fmR`0C@VX!w$h$U zW5f;KD>EP#0|pOHdzn?7a=|nSyatt!$ec zEXztPVq3ARd|CTW7}WX-9{mI!Yl)!UH9~*C$p;pa#6)AhgHskPxs&{JP1(pe77$W0 z58Re8a=B#eU)H=}umo8w3%|;^tRXytW$zQguRe?KQ?l+1OH#%`7jwN#t#?>DKa@5}ZytGjqT%Zi~oP~#jO#)z!1 zSgl{lxLVtnIef9cL?wTptqRw%JZHOIVLEigD7vk4Qx7eFpdWslxvB*|dGeY-9?%+$ z*>z2m)s7EZ0@|{Epo@Kcmq2<3gHnq&v36_5oLa-r`kVFL5t%|zr4icipOl=yzf$m| z>+9NT@g1#1u|v~pt92mS%5UK4Gy~#11u?5MwBtm{qtkbD(se*q$`+D#x2+egDd)sQ zb!RofcE_t#ZKsL>tC)sraJ(x_T&1Ry8NACd?6lS#(^HnlbJBw5+icPGIVU}oplumP zT-g(+Z;vCc$T>SBPsb}vESr#QSI$i?P2({CcFkD#`f$iIaGOV}FX#Q#2%kjnqT&*a zE|~4ep+juORjh8)%m|fW-AI<1DFz5JTBVKW!pbFAlVu&}GA*%84?N>)-)GaY#%r#9 z$DqYDc33^<;>S2?vL$?F*vte?aJ|=`JdnMB9>E6P>ZVg)X9#5E;dq4%J`^1L->n+B zAfh9jBgA2jq-EK>J{G*2lMo1y36gp(B8HZ+376_`K9a@U&{?Ziq0f0W}B|X zc#**zm+Z2c?UauOsbs3o`2e@hCnNb?NRX}eu7)@RXeTSLy{7P$J&FFlVXGOhJRQEW zS8FfrQseEmsP>f3cmif>$o5D4H%*o_XHRqPNfM>AsfKJHT*N%WVF4+sDP)V|7Wxo| z0OK$)Gc#GqTTT+X(*VrFG>qSD?cgzwTK4qC%QDC~dBj;jvLy$P1k-UC8R&N8#P;;C z={2C`a+=4rDK1`RXRHSb;#E#ua5{on+z|%Do_6hD8BklKK7!SCU|ApP?rhJwB;?V; zosg}B@tUo?v+4*+`8gJXKOG(+g8`TGO(-61Wso#_H#}m5tU(cY+Y>AbC&}d3zC1NU zLDM_i6;&14e$x-)3Y7SM%aPldMVhdVi9n_CT)I}FAZq@G0(0md#0QgVSRFpWoS{cc+;ABam}@s zeY?QuY)aY>(^F@@S=B&!B&H_Ey^T0bdSNs~w;ZB79+AFYJu;5im?mtu0e7Q*S##g5 zf2J2(rk9hsti$n2^34!-F?~KpUtwQo2}no_fH$H3N+sborMoUgzTDosPH{Sn10JKk zT9BaP39+w~fN^Zjh%M1NNu0|$`$^x``UHV z%TAc+(1{V2YtM0R26GrKpF+z^^(G1?`w#!C{a@%GSze5mf}tSDL_zR6SAIIuID|j{ z>=QeKOc12_zxV#_=RZ05CzW5B`jgs|Km5es*?FY0PyWHb`u=zC-#yFa}8dmkB|+4+sbJ>M)+BkwV7+NJY}i%8F7O{BtXpZ16V_XnqVgbE zbmvbgh39#oqE669Ece6ap8}ik?Bsv_8rn1=QTHhSMES!B+@7#=4yY&F)aXZpP~ zVbp79F4d!!N2LiS?oRQ27#hS4QKmQ3luCS4Ny0Ch#1~N_tV!#r6-D1pQtkw*H`SE> zG3uum-5vp=T8etns8`&kfs5aIckOZhS5Do7m5fXRQ%;p5Ds=B#Ev|Rq)H=c~NfKX& zNv-@2Q+XF;9ke7WSnLr)p2rnCACZ1QbEM=*ZDbVAWaa4gU{b{q{^v}ryfe>P|=@GJ)Qc647WC+UQV~1&2sW`dgK)4gmQZ2 zY>{)HocraJYg+IeVDi!_Kj#N~8_T-8A=_5Oyoj&y9@x${cckG)!e&q0p6Nir- zJ<$ZVU{B1?A3uEX#rf&&P7p9LZ{U=9u4D0{x67EfzBGOGlLvS0ntb%oqmS);{E?CA;nBypq{h>QXTNlK z4oruiKYVC%9(1X;tx=TvXnJek=eP4#?%u-(fAR4A!_Ur49-rIs*W=Ic ze0=oaqldl#%Aflnl%GC4JH2mme&*jDEfdL)?VAAi$KQ{8@8nCO^_gQ&&Q4DreR1yJ z1AAwxYd^?8aZlt4)&C&{^s#tZ*^R?yTu07Kes)XC>5i--F3DooNvEhrFrM>E0o;x3 zC~oT{j(s%_NZ8k{f{=DZNr&4y!Vyx9u~peF^uI%398dLzoMl1>_&3GB8UE=cM05wI zURIHy)zrxQxX$Z*c@mr|H|KmT4aC=VhvtlOFUa>ADK&v^15$ZQ5EaMq77#QS$NjA$ zBI0o?gBnK{6x@fyQZw1E%DK+LC1opaxET|!$E9i2#Q`N=ma~#DjFZ$1=y5 z(Xwz6$>M~PT~8`)CxL-fXVyU?6&jxr_#HV2M_9cs=k0{n$^Zx}Fe$9A$+@NANK#y7 z3>X(*DQVTNdA3eZD&3S~#f8eeXxCZ9X3mJtFiL#%suiXFbT;vs%vGKywyFZEK@w4U zRXId!>?kB#d?SgCuO+_9Hu>CPMJ3)VEO0%nHp^%T7VohftY~o%NW7$Vs@X)sHyqGX zE!1R{^Tt5iH4UTFS|QXrLURjsU2OG$pImAym(th(SL$!Gf1|RWppTzasglFWCE>m* z=b9X~LPZsgjN`Z9)-0jwsv>X8xr0;9C|Q&ssb&T1ZU+0zX9tnIkCRAEU!qlt)$Pi* zO-@ zbBEtZ4kp-17|)F=oMt&&>8UFxG)fL#@qGs{NKz{ZB~9m)UX410HRug%s#0xxx}%Hp zxp?cN?HyWOZ|mr3OLw4wS)7rxR}OV6E~qCiTqNEi>D^&%Le75R_0#elkTatUsOgYM zc5~!(3-ppAZ<0Nw(1M(r9Lq_vutvR#wR3XL%egG)ikz!*-ck};zF2!l&a#{poVt}i zM(n~RIb;hL$QCY;EnK)J=Pj$-s%n6ZJ+d z4%$hLB*1!HWz5ppsT8tQ4C~vK?{R!*M{SLh9H9Vk4Igt@NXQlz%hPITj@(x`%`MAWGRII&oC zY9`6YEk}iC<;>dxS@V9JKri`pj8gGfk}5)AVgyeHZ+E zGTx+HT8>djQEtGp+c-W^8wC|lU6w=Ti>KaFGFZ%|3Hfd$WmLx2VPn- zzDZh6@d{^Ij#{81iC9pb7xu_`+62i?VWJR}VqpTOI)zieA>V$ShHAesFXv@BZqO6$ zLkhkwXUTS(IQT=Scc;#P#x)V**S8aTd8tGi&z%cP2*p?>{otMVf}abfH*DP;&et!Ny4-o)A%~vhJ2kR%=Gz${0DSH*Eya10G7jAj(dU zd<=CB@!*w-Br7{Vgil?>S-7K^DZ{k6jm61LT!q5$W-R4G9rvX0vw+DNhl(94;iEuQ zvvY1(-)wB<*tg{H)4(PruW|xsxp;CjezOd#Q+WnhLfS3hV6%LVx17p>#yQl99u>iU zQX!Yz`MFE&I*nZJ)KT#=Ry}iWmXIL^4xG)0+lda#*)H3VL3YZl4HUNlOcl3@q5;nI zSYq~1MC}_{9b$bWj0>RWZ2z0~i3=oSkE#Gbce#}!defd>p&XP#f~7J>ddTMxW1tsM zg3y={<1(utnf8SsV+2MJ&a;Bf2PRQ(=Sg$AQ88(4@ySh*nuTIr)+9M`eA9Uc@Lg>W zXsi+=Sqf19*O8P|zQF(NW3gvn8?)N|j`1w|9S__G_EMo_#8+=HrBR~Vesd>sK{}jZ zt^>FehL-yKOSy7Kwm8FDJ6Eh>g z_fV38l58a7m@!i^)yNuX!o-ldn8Xf&#K#LAW!DSi>-0*_rg6n>O?wsjHaN?fEioxx z&clUf;DLafielU)dMsC845K^m)~5E3&Zt58NGf&6W}qw3{xqIuw~H2XNuS^z44ouK zp#by5)bg9l)LRs?i5M*;^4(^y)7UiG9t6?l8A!vz#{)rXbMsphCr~12xn?2}E{0Uz zGQq37Wkj3AGU?8hov`R)ICL>1t8uYj^Bz6Np^xOmzK9rD0dUC~ZB&fT(_!IxbiRAo zPA%$e+hBh4a7vA)04X=MqVoA+e+P{ia&-`eFAJ0p=c%2C7&39BLuuHtwN!(77duEg zGAK5m&kd(o^~1x-9+#JLb#S=Q%7_0os28rA;1D#EBO4H@*b`t9X zPM*NcMO}LKCGNz~o{h^+k^I=&Q>7q2<5AQI~UQd{qbEg=xdkV^;7`-W4TxY?L(eNn6zHH)$}ru9W70E%kjSqB48`>@U) zAUagc$aHluZ`zUK{Gccrwap;89sO|5fFuDXb-<%2mD)g=TR0cdS^7IQvN07ckF9f& z^nKE_(Jf)1gZs}W^dAjCtJfIxWRWnKI17Obi^xTEQ*L#|kL%uWugyq*K{iw^lk3tVx5D;993PxX=ooUm6f zTi~iocGUvcT;SR!B+te?7T=l*zgtOaYp$!B-9t4QCi-O7aVtd@&Kn@m(wg-Xt+441 zd=?>ZM~2Ca9pE!J|cjjh5#Sw<#@;q zGA!`roeE4l0)`v`L!_`wbB1R{h30gMG=N*Dbtlm7uc7$lPXZ7@0g)2LQI|TFMiXvB z$aR%-9^LsD%zb!1&~%s77zPO)^*pPdq)3}SVKlVU_RY4;in7Kzq2(ZKj7cU6=nZCF zHLg-MV-n_vrBq9yi8NsFF`03u_;^#zn4XfIjDF!s3mV5ufmvwLMK75g*14i4h9E02 zuhia;WE-z6Bk2^VnAB$UG6wGk2^L?Q(Dvnt1p3zns8BA>=Q=t#5#f}S_G2} zln2O{arq9odG`nV&ZQEd3-LmA5)(;8*2F?^vWv z%P@XhZdHmkte!O~bQTGwBRbiMKYm(8VrF88ha*UCu|bE=q*Vdo>nSswV{e#k6GpGA z35%5_V8Z2m7?$YX$~l0R?yQ2?k}epZfd&Q9M3-2zm7b2z8^-vIh^%b0qOm=b=y{)2 z!p#z>x!0^d0fG|_F_(db*l}i#=yt1{lt>KUl1%0cA#W*C1;_J<#cV{Gi>nJ=0aV8e zOuVcn@d8WSU{(U8l#dl7DL~p3!|JyM7B5R?Nx=BZ0bBlSHWsVmV4%f7KocTzW+18? zuvqT!E?MB53!HOhGuqY+Y`Tusbaw)pKB-5;$ZI9@Ni>y#!^&J@pjO7h%1n>93M~*; zFC_*eQ?bNg#7l$EQLt59dXWUzyL;|u7S(#~dNbfhyP6tJ|4F^Uw@|efU#tP?g8-?H)vUuG!BnJ8Q zCfnodoz4KFFh^BfnfhiZk@J=A!JnmMYu-f7g+ajg--)@L5kaISs#`PWE3i)GMNV#fx|U1;BlYmHS6sj2{@>qJ(_a|8`pW@Gs`LQ zEhVgudpz+)6`llDc!6-^YBRc!F4BStz!GQ-6e4|!+}8=zFm6oc>LZKfz2*dd&X z7SWWz(`*+RX>&ZsrkbzPG8`U#gT*7FycM=80|BE^28nbIduNuK-3{>rv%4wl6^%uD zc}GH6!PeFYPydiwMYyXoQe>@BHWk9`p%NXpfZZe(f{$Dure%Z1Y&-} zTN&mPvgoG9;rRp}^UWwlgLivsK2KnIfW&(^D0x?GF4q_E%pgjql|%Rf9>H@@`)Ia* z>YC6sWJj>6=xVfP0TaovdP@~ymob+kGZA=|N)VJ~u`+~o%jUu7;B+;a)JNbj%9K?J z*=w4)P>D*-y&M1mD+I`(MR$|i${0QXxGhCi8Ix`Rf=*za;?z4D1hE@XPB24Y7SwFr zUZoi%4OtlQ#(GFkyqM*5aRav!Sla3+(lREE&%&&EEv@q_t@F8#sw+Jz$BI%G@3kz> z-%21`(j|}_SPLs7fmVc-tQxpK)6A7I76q(Y%BKo8mU!K_IVhT*(j_Ggt2OQlZ3Gw- z$6bFI2Q7UPu3lh!ug2&pug}@)LlaIy8wHnkhW5E>ZOZZ=(*=kj+YIY$1(c4Kc*4ql z2Wa8gZ>d;{vj?V`5jFe8ehCIcqkZB)i0i;O*PAU#eb_l+I}$BDf#-r5Bwby4p^Ho5 zU0r@s!V4F*1&kD%dGEnuF(mzbM4oYqPg=FiH}@%86wa8eFsPfX@YRrR!##`Uu8uW= zBGXUkblZa3Td&4Pad0C`0$MC`VjJO;szGv2TLl}={2<7#h(Ri+sWK~+w%}$$5z9!` zL`Z@VW0j(e>(VFcOnz!Y%OUh`c?>VsPNzL?8@|jp6~3Hz`o4NKth^2>48?Ti*L&3I z?4=rRy@jtXF)nhZxVwJ37-s)YNGf6Y@(2F$X zLnt{dWk`nHTqjX$(d{nR(dqNP%iFwK?*OErke4c?4sroq%6wFhK4)Hy^O{^SAd>{W zd0i415-)`?lsO#FGPay*B*4npY}d;)qDwi0N_R3i@PXk8y1Eb37;l#-Ila;oKt zGEfsTz`Ct<5sM#4qk6;*Dud~G$xJzgXmJHh#~C+#z|A1C;HQ=6q_}u|hs@NC+B9)B zgUm9LSg`=xKc0gYkxL%Q7F4oTz}nl@EX$V2EjNtR7JE#*;yuj;r45H95{a%BgqA09 zss%=NT3k0!FX*2Hjt6s^J%n=?&in+b+?=m~0+n2GuK-tA^OKF49Jt84u8{r1|fEw zvSMGnr+89kz)2F(b1%VNefSe+n9x@)wFg1ymWV6Ygo=|NR`07Wa20%6-T{LsZg7Or z6}va_l_&`-SD;rNPBk-zKqq^E` zl8PWapp!N82IYFm#u0gn)r=7!zvv>Bd=AW!6y7M)fG(fuxmCNPp(%sy7gVIVL`xbb6@R=Y)!&ar5!L2t1~yf~JkoYk_q+s)nP@=MEyJi6s{Vs*G#6W+lo z%l2fUPs`X&iuCdg?{YJbtuke{Z5_?I#zaw7;*BC$C!f1*l-{i*sfcvsWdp%1)ssP2hPiAM3L%oh^T*sJ*Ra(QZ*k7N=p-Mws`rP zxU2ir*3o-mbzc)!dELW!KhM#C^u7)$pnDI4hFfeo^`z)MJW4?&>5aFuSx10*1xE(G zF;XsADJI^PatkZJvSOuI1{@4yDVue;@i>?^&Su!cr#w79FPo0HU0ytbnMPy^W#|l> zLApJJr|rH!pf=R9mpXd%o_rn~6?+r2wKRY;P-1j10njKd~Dj!A3$p3h#g0Sm>tAhaoO7RjhKgB`? zs*I}EW@HSi>$@k9_*hd-82a(z0gr~o#b)!=ZmP4@Zu;r6&ZVq<2yWUTMkb1;TwN#D zbL{HG)tBkV^2967LziJWW3wu{?6za-yBWiQi5qpEh%Bj>W)UdOF;qi*B0+@J&#>C$2}by`pd2|4;EO)&_Yj%BQI%;#?rbt zWU-XbB7_oz0HtGLD3Jw=A zquKYdMDz%E^Rt`0VdFJD|G-R}0_Ee&bt5ImLeQ9NYET6>v!nvj5C zbTG&@S($ghI&%zB(LY#vAm~bJ+KN-Q{+<$ZomNg(Kv}y|jH}$Jyj{R()W)bQ&tPIb zBzpF#7$!D)t)mfWVq@*t2-FG&VgT2anMkXhvihnA?pupCJ1*BEOU6+eOHWNDPpfIV zo;5<3hvn4l${Q}uqLL(Xl46lu@~!A_x2r^- z0!}I=*~~#FE~E}b{2j^Rb9z%qlHbF zlDvw)8zx+8bfL8dLnzLMi}T@P6fV9LF1}pqLkfj$0}yk^0c+Qw6fv&fc3t&?y#1*4 zY`&zP%?lsam1?&brdR=?s*22Z@oO&#On*UnSJm+PmxyW-cCvshJ0$g0>vk%66;Uub zp;Gif=S5ZA@r^ZZrOa&Cd?Td+4~%4?n;z#OmFC`o|*Ne-|_IQtKuC+(Npy# zl=*p$$?Di}3F;E5Y`=(7ON&4+(^;7o&X4H0 zo=#kSHLK_S6T#Xh2>({RR+9>nG7w7>nRlQKITYRMm)n$C`36h<#B@t-l$<0wQXs=5 zQIS><2g339xjf>B^wBmJZ6w?*>whTVN6D-%5JRdt{S&~Lr^Fi1B!L4hG6q;GHXaTL zuT_DiU?Xe;4vB*Gq57&6y(JD8WlvZa-Olgc>9u@o5=z*va((yR9xg7Fyhd#7QKYu& zJ^kCQd~skX$>w85J?cFUsjC@pL%DkIDT-HC+s5{uc0D2G`<=Z$Wa2KIkS7T-P7-cb z16`>xU4@SNHmf6PbSy`8{f;`ODSJAQbs;aK^+Z`(}4x@sZPqu7H~dVG*FBAq`y6XVinVv3X+QtQ_;=cq){v1xKT8O4 zL0_{ZGS6xr;@KEcMhr*cmh6wT*kyiD-4wWAqeC-&{b^sX5hr~r&dCtz4@e9eBfdT$ zY}25=%B<^Y2@2hVCY5>ZMQAl#JfE}{ngvPZ6s~e4^5MFXA_OHP#%L?=1w_V1(pHA; zN@o@E8IopH=3-+8mv+PT>5M*T4#<=E(V(iZm6sMS`C*ofB=eIV<>dM}{?TG(Ny^Fb z$&HXVO?vY%ebf>cqcg7Ucoxh{ zFLqLn<2a6C1UwF>>TI+FvGDP4PODqZx-MSyBLq(&Ccyr%UUP=6mN|_fUSHJLEL?vT z0>qOw29Yf)cz6{{~N8rC4{I*F!j*dS*1 zERx#jvtg%8!Xd#B#PdjB_>bM>Wmf*MHt(ay64sB2B~59d^&4X?O+V(5jCspo4CQCD zk%r5b=XGPHR<5vqIcM`Zc3#hF9i8c>+{M>A%3A81vvo=4?*UhevY>%!r7qe$Y+SHg z1~rMV=2HN$##v9`v^h1?vJF2zz|VXJ8TQKMkC*dl9bU$ zHU7F}il7$2Ou?jn870K3C{gzZovs#IQPn~zQ&gEnU{I0kfJ|RSy;YfMgl5_DuXRb_ z997gvPeBT~MM0BJlRLJc!XfaoWISSL=`5AfxnQv!Se_|3vt%8fPJq1lNg3p@GsFxm zIYd~Mylkv74{J9Ll1n^!_gi=D+ZiUCob%S7?OP^Cm4!k?8g2wh@)|&_)fmd7w@LvI zL>b+xiMQ-!)?@OhV>_!}0QzsJ*U@10RhJfikQdO!RvbtS4JKj8&0dN~KAnP9OtLKm#v8nC+q8-J)x^s)S4_bA}0 zM2J7F8W7Oft*>j5vzj3gyec!@QFN6C!p9LVz>agY>Q%AOe!a?3dsQS=enSNp9Mgx-;G)lqa+B*0}jdlma5@mk3c-ng3dy{k}dB*y!YM8gs9 zW5^(hDrv%Rvd@^JDmTtbw$)p83WL5t$b?Lx^?v%FD(q4v^1O`2EVzv~G?s32epc1!H{5p=%T}y#p2=O2 zg>Q1FUs*#SUHonIkV~lFL|!qrp;;~pH>|ltAL%xH`qe7J%GbCKwP-r?Q303qI%p68 z=DOFVR4mdYqaTRQvT%?^tqM{0S0A^wGhlrjo}p-Ov0Uaw29daxLnaX_*TRBae+x4TH0Cg0Mg0MN&%trny+);WhcrtW8?F57l;$reQ`tcBLd z&?;Wz8H@m{^$51*syAH|pOrDKW=}5JNCUCnD~0dW^jWrflV2mW^c+`g8T30pa1<8J@sgnQY&lg7h3tK;IPgJu3x$l>9+b4 zHZ&54^;b!YM4WdrvLK(;;Rdl1{*5iA>$OQSH)K{&jT>efg9Z_38UXTO`Z`Flx;^m> z;c>OUK`|J=Dh9RYDu|97vPxpaSd9|^=P*1E1d(3T{*N4`kBzI&@ zgz%}YH2vkH1g^g5K}dg#SSP4&X-_k0pSLpDgJY@@_KJAQ$E+THGXruhD>8IPp6WR~ zB&Adq5~Nb^V64GsODbCwiUbYomp{r6q&mU(I|pnS5caQ`>#<+frD`i5E42A!FrRk} z-8;5P!cTJ9M=$qU(jA42Ps)e06UmdeN#fSqyO#XnLc33%v2K?n-%8NP*!V!Mh_TJA z2E9~zFPo>v_9IWaeEgcNR`#1c{c5?ajZL$%D|K*F9*!g9c=wxQt~F zqN~5-LF%8PYe=2mrP}5}boXTs+U`N9h7}JQ_Ml;OqX&(6&#pG|<6TZ*36P!*>kIiZ%KV}f7=KJ4%GzOX1=)ubBHdAA6P|$pLq{1K z7x|#xbn0dxjI-`D)Kx}|f5KlL04n^7gO9t$DaSOIpd)tiLw2QgUC*%sjCeXy! z88-P7`E(64RCSUc5Y>Yv{Dx}=w+)9=<3@&^S9Rn=IEs#A+pPXF;V!X`idkqYq+9$F z#RectaV$Hu5^15-QkS&6t9>cfBxG6ATjkYa0dt+SdC;M@dSC%23!E6`p#r+8o`faL z)4WO#ktv?EfJyo|zyM7u4#WMZ<_=}B1zXuqTFz|gLyAZ#m>0#T4a`p-E5~UtG>>s$ z2Z&Mjb8{{e>k3A6iDO?{Q-P8~zeQCYyQ+OcQ>7Q(Ks7Ni8FF<4kkcRB@oKioIpQ?q zGEQ|8H_QPR7o2q;vt+p~9m#c<2n z$FQZ%6^!>>l;tWKAi3$M)W|qZKq_fenu5$5+VVc1V_kD98?xO@r{(~`ma&N+#NUXppRl_SGQEa4EsI$7>@MG<9b`-Kse zVJVt8y|}w`I41e7U{Qk9DWE1Z489r?%4RhbP@+yFwZu6HUk7XdECiYC=8YEfCMXLa zf3Ilp(Ep~9i=rot5hcOIQyuN0zIZB6yGKp(UdE%Ftq6P5grjnI9dDq)L4>Mnop|u2 zr%eVKgmwIZkz2_GQf*<0&JK8%$SXMV%A%d=z4!74Nrc;-7+0Det2}EF+~Zcb*bIl< z<`%>Wmr?);YnKeTi6R~7?b7-zZ(FQW>uNClGmty)qOVFX79#Z_|@9yi8l%MsT2mV3ikN$T1?v z^77&fU|ww5<{xA+guf$~2Ug@x2*H$`8HIT-MeYq;J(Pm`k^s>i15b2;$KB>geDQT9 z<#7$g$jC^FYEuqQDl7H|h*<8D_q@PdDTXXPaiGAIxgw_+30uhhYTW8d&Qq;vx%Z~Q z#4UA2UoiKgxmV1+WbS2iubO+UNoKdgwKZJb`BouTQx??)S!vIL@wD7HYRihb7^+uA zr7lO?$5#UzN-4Vcb~! z4!J#y%k5#ghM=;|;Cs!zW^m&oS7nvP8fEb^h>HgRa7Du0bLNUYMeeUAEv9hD!;ne% zcBk{@ySHH;GMljro4IBn-?dFf7>aLMn7Gvk=Ovch!$aPT%6L^sx${QNb+gSrn24gt zH8Bg=03$7@D=8P(M7UL&t7`IJH}~y?uF8Og*UY_z%LOiThpdn>YZ=a6D`HA6_ji1i zu$DvsYbgR?8@pCKo5XW5L?k?h$P03dgq*O);e@>^vuXr!@*NPT z;7L>MHh0L}vbo!>7JaT;xGL>#RcXdzXBErw#O|anI)p5;#(*<}utZCis3vs~P6*Bk z$gJ94e(XW~jeT^Feua6lZd=fklD9f#?u^{H2AJQxuyW9oS$w`LPLCCj&m2GYl@lq_>HY5@$ftN|X2-+3cn|rJks#Qa3bwo8LvzQc zfBo?ER{(#!^;q$a*~154;C17Nrk{Uw@{!R;gFu+{Mm4M8lqi?~el8UZ9eV8fT{|Ct zY}Z4N9-Q9!(8%M@Kl;$Ykqs9)On46tE`3xyTn{p;TwE+0B})V%?H?D&Zw z=uQQlpP%MM;}g@odYlSA`sA^>lgAIgFf(8N-8ajBPR1xo1%GWr{K4agkG^oCJUKgC zo}Za6A2B48N2kgs=BB5o%Ez8BdoFD+PnM7JM)a>wmw6JpeE7)R?DUc8qx1G`^!D=n zF_(Yx=;RCJqxQ3wd&e`=^JU@t?6ITAcCg@-3cA-55ClJ;3Lae#+41@5xnm~|&mTK} z@~M~Rr;pmJ*dO2hgbC{ zrjJj8L}_=@I3uaMo^V#$Cub&)zA$~lvUvaJp8w^;N2ip_i_rTDSf6QQIgj0=m?!mW zww{T8`tS+W>EpXU{o?Gb52zR(eczP|9^O!lW!iWA*h?fwM4vl&eDdg_ndc7AudCC; zL9ja&?D})_AvVt+exaG~xff=S9aNc*Qs`tVnDFnA|H8?i@!R6OoX>y%F-y?f`a$rC zR50+&^zo^KlSjX_1F`h|4Uyh4K6&CxCpJI4QZ2I7f zFT5~)+;_q4N5A~lAm~a3na}VhyP-W&|JeWbPygtpXU8`^(RuLg=br2M(>I2m`orb_ z`F}b7+dp2|^0mxkoAx~Nu|tJ#|C8^JZvW%(pZ#j*AN=9k(my)$>i@9mSJJ=n#j(Hn z+Fl%MV_ve(}qz zAHKYFe(xK9|G)jp*B*G~+;2Yjoz91kRK6l2PQ0@AH-gk>_er%)^6%xZbp$UT)9)F$ z|D>Drl>T4g-yah9hwI{$!Zm?>?!V7JJNE1^z55T3_xz*(^@)Gb@mt%M{@^!$S2&*h z`TcXpk9~3a(EN%0vrZxMto!k~{l^Y|asPVZ+V3^a{-e|LBadx}+A%kEFnIRqCmw$E zvA~xx`KP`N)#Ig^FZ|x+LqFY?`tZa5)As+SRfkW@U-ksv^%-54E(o5ZM~uzRes=Qk z(ZJropPt?^H9Kp0e)JqR|L<`iWsSy9KSUd8v$2;SOL#wA>7M4_#8OA_ z%}guTH#6w!;0wXC!E?Az1)sf{<1-w^PhUZ zP&!kh6*-1C1=h*nICu`*Z|;01ILhyk9J542fpU!#I|=jz@sq(k>5dU{|6Ry%odz7w z0zXd7(cp!9VESXd{7J2o|3~=k6L=65QZEC45`0Jaf12F$loA9V^us`9@+GC5pkquz z(JbHjV20dfa2%%m8N!M?%I~X`!8b>oelDg=InU$HlIkGo4wLTTV7sL)liJno*A3Gz zT5K8j2>JC}Laz_I8 zGMhNQ01n}9^Q9A1hnG$%bnAxXgpx5Ikcf8O}M z4_wEn(TkKizpnNlj6?PQ>%l|Rdt=_axxSv~Kg(a`Qu#k0bW#2jwDAe*dxYLH3)jnN gij6J5o(BDT*k9=Xq7F`>p}#-%7n%!yVJrXt055fRga7~l diff --git a/docs/_template/last-modified/plugins/LibGit2Sharp.dll.config b/docs/_template/last-modified/plugins/LibGit2Sharp.dll.config index 21a2b56017..c93e4cc223 100644 --- a/docs/_template/last-modified/plugins/LibGit2Sharp.dll.config +++ b/docs/_template/last-modified/plugins/LibGit2Sharp.dll.config @@ -1,4 +1,4 @@ - - + + diff --git a/docs/_template/last-modified/plugins/lib/linux-arm/libgit2-6777db8.so b/docs/_template/last-modified/plugins/lib/linux-arm/libgit2-6777db8.so new file mode 100644 index 0000000000000000000000000000000000000000..4324c2ad9987e147d014d8fd88cd6ab560ab5b8a GIT binary patch literal 968668 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

Vw#-ISroNRKbIB>s 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

uwkU~?bU{z;^F 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

Q$5xEFD! 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 E0hsd21ONa4 literal 0 HcmV?d00001 diff --git a/docs/_template/last-modified/plugins/lib/linux-arm64/libgit2-6777db8.so b/docs/_template/last-modified/plugins/lib/linux-arm64/libgit2-6777db8.so new file mode 100644 index 0000000000000000000000000000000000000000..a72d7419d8fecb74d30c44714c18c896bf354731 GIT binary patch literal 1278936 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%0A8ADD4V;@4FIc9tT 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థ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

Kr`;8TxxJ^iEr8ho$3`w#uZ-UB_T%l`k+Pc(Ob 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
Vd?rc?4oeS%oUJYGk-O`SkoJA~!KCblm_T$h8 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
%=C`^_8jJJ6V4ua`uQ4 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 z
&F;*YlH>TV(!k52akCNiHNB@QSrJtGUW9F3i2UdJ=d@6*r3{|tJ&d*zi!^KCId z_X%0w?*Dnq_f!G-|G!F-A4$0z>&o$1{Sqlrl;fw$A;Nn&-mJbRHTp4n^`p6kwD05_ zvb=}oxd)|%gf|j9sxO}?HIq9?c&4Z|CyL6EQnNMkkKs=@^Lf^5|3mT%v%I~w*vm&q z50*5A{Z`bUkNTr&7JYVO(Pe43Rq{2P2+vTyF7%x&uW&vufzXcprC$+0>y)ET`^dg6?a5$Q*GuAe>q9ATn|QT|b4cU0RC-XmF7@BO zU-D^D&uVW~X_|3oFqQFXFb;!paD8R49SpXE!FDj%4+h79!Es=492gu22FHQHabR#9 z7#s%%$AQ6dU~n8590&gYHV(Kp>!udxdu49b|8{ZRuu57YU9m=(zckea!FlDRGJ1G3 zp7M*Hrth`BXGG`qxIFoLYkZ^dR^Yle4RA1yMK9>`5bBI9{%NRo!?V4dER}K%7H2V$ax0JNJAL+KF=u5lG ze0X2rgnZ)IO&l-fN|DC6e?rTt@zFHRbsL=@NT>aM zRl3|u;+M6TRGV(>QvE>}9QD}VPoDBXDf8w*?LS}H_0ii040reTuIj#z-ZtFdYNxuk zlv9`MeJd62XHc%!nOCJ(-KyeNUm*D;h+~WSJZX)zeyivjq~6VVYTTx+Rq)s-Sudz> z@6b0lxAo1NtFT{#-%sE|tltr^lVv_e{8XO^#IskCyg#))M8=C>T0hDg1>w5=QeI69 z*Lh7%Rk+q?FhAv*k1p4FwbSB09?e&E!Bp2%uJdX~{R#3AeyV-dN8mcIX>@>cseMh= zA1&{S>)5(L(@wcAysG7y6Z>DDJfZ*P;Q{Qoj+ga&E|Pjvw=^v;_Ve_Havi!7;GOX5 zD)_4GYd&8z4aV8c2br^3*;cM&2kmRUr=FJb>8MwUi(c!kgXL;lm+O2cu)N6ny4EECqnj~oubXX$Nob0SG9}XZBZF~so8sAT<;6p)GdqIzoRxy*?U@?BxC2@@|K+` z*!fzo`HG!S+Ml=F>fLhHyT9EpAGZJ4sbqgqm)d!k8qz4sH7&Vic8c4PrzKm^y%Lilo<=d@`>ozW^cG9@I zZHw(=lLuq_<;Mh#t81egS2uPi?a=>qW9pmOpPh|vZ^yrV?9cM(-u8Cdq4saPZa!)k zx_UUwu40!ZZQ8K2CHuD&jYujql{=R6N)wuRYnMa$60PT7;LjP2rfo$d`*6VaaQB%+N;LZ#?)=gqBa?9vo;7{W`EYjbqD)%lg3rf zbeZO0o0Ya2wXtz=`XX&su%R^AW~Hs>Z9Kkcn{{!WVt;PZ_UfM4vHPyh z)L@&nL2xmOlK#(a*6M@jvusS=`K-6BjWPD`ntj%Bkqz=>d(P3Fy{@?N*QQl>p4Fx~ zt95DC>Z*28(`qYrzQgJ&c0Of)Zr&Yd6z$(7`_n0E|HxbJO*W0%KcdWMtbI2%?9ZL2 zjoY+he^GuVbopM)EeqN!S>~oFKlk_NrXiL@?a!qyc6-_1CiZ8K>GK!Z80=?%2if`6 z?D^G;tj3nv9AwYKu5VX3*|PP9oBT4n;tZ=l-tMT{KRD?nwqHKB8dsO< zae+I3leKNcp3kb-ovpY%?lM2H=e2D6s2pR@|L<+8wr(3~No!WuaAUKz zQL{X=y-jVEMy>st)7xLh{++k0>y)?iCdr&l^Y+iYO^sbIpRuX6=QK&nYBsG|ly^V- zcRp$Vu&JB!`g8M1`*Twgoj0>m!>m6UZfEoM=TdiUG{QRI+U5lN8*Pocwz;+aZD<9P z?7S_r*~SWI+4=iz!#>dls9<+e53?G(_;cs8-20@gBs$n;zx;UM;u^O}Xzal^B?Y*}V#V&tLCF!|a(qeZQZd4`1;fKtCU0^nH4MKGNuW`22h| zqwn+c^N`W^{`vXpM&Ebn=c873PD z4YO~r*Y_*-UNX#%&iY=vU z+ghB^=kuGx%tVvr{d0ajS1Niz7scV`9q%30y|C%q?2j=sd7q&2NBXs6Pa4nm`~OF)cm6A%YEOc@=~eIF zv8HmF|9yh5TkiD9GsMm^%)Jedohe|k+wj=wBl~mu=Gnq0!y|Uq@yNNt^OBft;KlO< zl$;SeY5arjd~fv17mD1w3D((vi+(W={$unBGVGGq7MdI2wVz17bxF)3c;O-e%iV#F zot}VqT_*fvcejY0UV!I{!V`xJmw1jgg}?(#hjTuS9s+b z;a7`!^A7rSk@`aaf%0pGyJIsqx$6wheg@9HL}q<>7CuAdW(#;7?ye=eX?u7BeuiK( zP3>PN`ECV21YS_i%?sMzYPaD(`fpkNs{6%gqwl3eZjQHlSMNpMPq_hcI0Ih2*4>pV z&tSOpQh4-w;St)u)=U0W3^=i!O6Zm61h42X&mH0)Keb$~0C)YPzjCz$`94a%%IA=; z`k7ka_TgUB^XQe2rx<^QXEqSMI~a6R8$LTLLbbn|jfab83tkktnE;P(BzD~W*KXPs z-Vqf(lXz+zikJK2leWwIio>@pA7Vbg9ntcZ0^@Ke`3Cuk@ScEP{Q3O$;vDqB?>JrM z`Ll96qOC&ge11E4lc)bYe;oVzy(o#Aj<=uR&OYzi`8=0=SNfxNmRo&a@zl5#1K+0_ zX~(m^^jcrR{e;LW^lHBv7{}C3t?cjDn-5?oV_RMCX(y|9?NIq#4i?pZJzzg&^=^Et zEtGt3!q}nk>|K8TEqL_*gu8ox+%yv&4{-My?!MxtacCs{{;Qu!?1*)(_tB}a{J8^BKO7JqqfS%qHgPc-^o zXSFYUg3y3 z^dWmuwlDh|tb%L1tp@CT)#_cpQ$AldlPk7&%|ILy=sO+||7$cjiJRRn|K49N&9@Zb z8t2+CrQK@%?!OBERj=>MR{b{y(ChoARi9afUj3{E{QSWH`tE>U{S4jjFW314*y#z_ zxqJY9rQ088%{Lmz_j+r`+s}k&*szIy+~Qxh0D$4wG9dwj%q z{?s3hkAB}z`8Tkm{1RIqZaN08-w&L`@!j{~`W?UVaLu>AgWrG6wV z-#DUgeJj94Ki0I~@V6h~<4pEn{_`Q{+H$$}sl4Px!I@2|aOj`aJZ`6ie3m9O1D z$@=vgpK5@+?St!IS+zs`mX*IH_Vf68AG`(M9IpOE{^j?lX7&A*%Y5JOr`k!s?YHy9 z0CpM|_GQOzzvlY6#-SA8lCRxg{ZZfg&Hz_^-eo^20Mu3an z)?*-UYA1Jd-*)l=uKMa7ed}uh{v7S0qWRK(8p{9cZ$JNn$KMyed7%Atz`>?%_5HP< z?}2_3cs{^C8o*EUfZxxptsOVcD}Tza z@1~vM^+!bC!FFLkcx;LAF@gQG#Gm~3wVfveT;mh`?#Q8(OTUvkTih{6!LuJqeJMXd z^&bn*q5q-k`L3$+^Hd+;?z14?_``Qv^OW~m)en{P5AGgWH{Ar+@3Br7%>L~-6V~sK z!0-0-D|rDD?VgB?@zm{?*~|#3!O(K!4PH%}BqWCs@5}x5{-Z zFZu~azyG84rFJ3#JGlY;?{F_k=rzs7Pvv^v?`n7tdfS}5N%MUwkgxKd0ADzOKb5Wh z{#40V`55ZA4zFz^`niF6?^?|t&({XX*ChP;{vG?uM6fT!W( z;a`Dw!ZnvI;61wvY0^%1f=Bic{&ApOY4?OquW4Va@2`C}+=;JV)1lZ`9%I>e;GqLV zUxA+nufpeZBJ4bPM~CQj9R3O1xD#l0%5Y&o+e0_Tup7gx3FQbBI;kLTHN&RdG{QS4o_vdH#IetIe*jKLcRQviqJ+d_;?FE}Rg@+gCf6jPuYhl0t2io(v{l%f>PSEw54zu=Me^fr)*Iy=>c;Gu>-|_re$&=U;ezIcu`Q^u)fF|-f*(2HWH%s7^TSC$G-V&^P)>t*439ctP4 z#GlZs_=EmB^qGe6s3hiYcz&4xhF9}2yy{M<+G!q}=jY++w}dD0^DTJcZQ*(NP+Ji$ zKH+!#_O(591>&%t)%VvPavO3&Lc+GOjTQU*U+`kPWWVa7+!==gKr8?9wT<Jn{?S1u3I%dVv2H-VX2vJX(`{)y{kHRDg$V@tr?e z_)PNM0^S4H-u?+~ChF^8F4x6VRUqPXzeI@Yd7f&ou1(0^Wq{c&_n` zZ|;xhgI3>f{kjXgy{6w_KLXcw_(ymgu9v(10x$H4oy8n4s6Uy2Kg#txC7SiJ0sQQC z7n*xb|0G}KxjC_!jpBqf4n1!5u3af# z4*xT}I$HE`_-pVcd^vFwe@2_qx_w~-%-80k;6`Q)|*a)#{yi+HNiAEPC;%ivic$RISb_l7N|Zu!46!#rXun&E_Uq3Rt`s1eYj~?KUzw*K#{rsK*>?im4+y9N#yZD=w@R^itSNm|H zI`FiZDK_Kc#@5|3;rVQ1mVA46!doarV;(37<;bCRpyq&l-00I9lyD z0`@nv`u^gXKSS)3t=XP@mCt2?+HW1`kLNxE*w38hx1Ywo@maFS)et*6>fIr6Fz|(6II}=Pc;vY9M){Yxzlxr@UZ*HCvF_s-5-{@m~7r%Yoo|+f^T>Z}+=8v25&H(@I0Od+F{q~>4Pvsln=Ns@2^mf?v zrqAG6xOx?yDDla|*>#cXJ|=f1&RMeQwUtodd%7xVxNChp25D>S69H!pRK;X z?L~X2J+a?wdKEvFFJQd=7+xA7`X=j4w1IN%wriyDDtv2rWdq@Q9%+T2-|&}rs@3=B zXQ#U%s@JqH_LWa#**7#_^aZ%avlWQvcdg#Vb2(hwRVTb1;1|HnbQ#~$*uM^*hR5Nz z!t-#o|4aDX02e>)@zDozoPrtiYfrzDYrYy!^R2K-z4RHY?=PNaJAXW196%r2(XW4P z0DZyTsMc%xr`5Z5qFl#;kKh&b%17HBA#Xf{>v8T@@JvGNFQGr~36Je6yaz7vvHNwq z`~B(ge6#1l0$laUJ^R+D0$k%C3&j5j>ra32ukGcxe>DCpF9i0hYXSQw4`9DK&2L}J zRXNblH4fDPSAF4-zV*cbSADUgZ+$7iRi8MzZ+$YrRi8hpZ+%yQt3ETkZ+&Ngi+-#L zecRuUP9Gr79cTFMpGQ3^57FVTfM?DYeUZMQ`NjkJ-Z((M<%|9K-j03cy4`sQ-b6o! ze3!u6aNR!s5pI4e_LVP#hu~`GZFnT0{{S8h@UVSRiR;%f_!Ruv5Z;38_!fs}E){qnzaql6GU+WwmXej;}AkBYvEUh6A-q`#eQ89$*|o)zT$YKhFw(l@13`V>t3tq?RDh9@r&9?1?(Jc?erHP{l2fpa~9=Nu3qKg`u*Ps zE6j)M_kgw3_rUf0z}l`Jg&V%ttNYar_=@lNV*fpO3cWsNHp*^@T|I{R-mmueZQ#)W zzw39R*Y5*Q#{P8l`u*Z*@MGX*>?l7M-hwYie*?U-jYOage^~AC-Qyy>4o}8KKaF1S~L z&axiA+ymF|Fvqa-2i5a^=8xfjQ@)RsYcl=Ca9&Hl54{-ucs<|6_n?dDcZ3`L&a}P% z%uNTu^}ExPXmC276awSPaaQjgr@+;J?O$Di{&l9OpJ0^7C0lb5yoz4=weV(u-wuzg zDc2=U!$Wg~Ydbsy-hfY`-JS%GoG1Dc z{p+XjYF@bB?_Gs=pD+9^;`6xbe$+r#fEC`=vtHMp2M5Vl;hlJ0x zr-Iz{s`szmE+6l&_g$lGui+beI@M1wDcTQsg&qBVxAFt5o&MTSukVz5t8`esYd^}x zTl>yYc%JW?>v($+yZ~4I&F~_8k&#KtJJD1F{c(xayZ)#=ietT z!Vco6>Q~q~#UFp+wyk}rIm#OQd;YBC$w0Y+*Ts$)z@PS>et(V|KwnMz^|P$rwJYVi zzj{8rj$ZeR=D|aIiJc^YD8p0mIQ#*44zACMyae_n3tGu!Q($gKUDZEc<3_WEy3mjwGVH?uZ1@*7rpNP zFM`Le5U%~G8(zFhcxAX4dL5oB3fJ@h@5AHQ32$rMyw&XeFtfEKh#ehgR`8(yhkpI| z&H8VL%^M_NifcBpdeep;M)FQgSX+j-D$(SZV~%4$anna z63+&_6TSsJb*t!;@Kdv*?}9%E-vxcCWhsWSE;cd9q*SVT+S?uJ{UjeVd zoABG-!A+T_@Ce*_aL5~W(L})Im2JSf4BPn>NisnJD6wx**^dKfS-4G z0(;yY;M%S#fqefnK)(5h{Px9;-QRN$684%j-$H+J9GY;?uVNxc!GlPU53m zZMD;eYu29);D6&$zn`PF=s(Wo$NYLNZ@TX1THcNTS3kSY^w;m&1LWKDjNkqyR`13i z<&!D!cJR=%q8|@W!lMCx06YQDpznYe;S1Pa91BmrAodIJGvW0Y@zd9y?REB-{Qhg) zdIDVI)(G&+v9Dau=iCF&z9RO+WK)Lc|0Y2DF6RqC$3v-sV zD|=brn>L3>;d*{s?IhsH&GB}8?r)rFZp;ZPR@hPfgxgtf+6NxqMD*GY)9@HPg#IXa z9Imftnhj5GCU(ZKe{umly@hanZ-ADoakjsI3AgWi3>;V9VC{HunkoAM9^dl}w?z6bt3ymF}6 zSppyPRcW6&_dv0o^!o35@bnDfy8pI4JaM@2663=Rc+WS5>vr%sc=8D0b;g-<;Nhc$ z$Kcng{fuzkzt#9h^ZvLkwEF(ypFTzGP+apM_LUb|@C3YxJ`eAKcb+PC613ZYz)Rm3 zuCFy5x~0T3JzKc$Cwv9ofKMTAJHaETi@rdI>*l^C_mTFCo4bC&y&jY!aIrc*WsZH zg=^fTJ&ZFQ+?S3wW|q~v=aQ6nU`N|eEzo|ROZMM>ibeb+gB<=S&jjq7E`R&H5`E?m zVrTY9F{JxNS=AHIJ3asH`=%}uJGx)=AiNOZ8i&gJsucT=dwP4{3p|DY8i&g5em|eF z`u_S+_62_&UbcF-T~q!R{(lJ1{6+M$=-1=yj*Zh-mkA%UnmDBX1n+;|*6RE7C(-u% zBX;cjQ3KnBova;qzEQc3lbUbi5`P@7vilMJ<=eJp=sjt^`9QvV4d8!nnBUHU1L%t* z{d)C3bgAF}!v?U^T+MIi2&?z@PvB!H+{y5EfNQ?#K)!jaciUg(5$veGGoZiR>idgx z!@a1X*HpwGA2h7t*8{y=!*VBrbue+!;H zM7W+${(7hWDN4($Lh zp6<6Z9d6DPK7;MlvG9)bgoh`cx+X7sV6I1XC+}@_*P2Ysq16=CGULR@u_aBb)^ecG+ zJ6ew|?10S~R^MMehL=dWR4;a{*X!9ldQECSF+bdk8gu>t_Iv)+m;JG(8L)Hl0Cvo? zemhrLz1u!2*YWuVco@C%yWml{j+2YwJ@7Q8dmbKpPV%k88}RZA!j}a0m%=xMeerqE z>idg-VKenmRvWsVluLOCYvbTW^b2UWF?iCwsK-uve3yimW5Q=J&Kw9gTMJ)?{cppY zaJ?@g3y;P{eGitUvDhT^^pop9kRG@RrZd zaV8NM2Y&DASMoINLGm4IqBr{6;UBENzjm0&`{ST?+GW3;=LfKp?&{l4@V!#63}C1G za=)FwTfOV=%JuwVXnW!LD@0!;4(r1sR|#M0YoB9H{tkb+wzvBJ;#0rL@6S~1E00lM z-+;H#Pl2BZkKZhIv|nEcPrzrOzZPDAkH`N-@bWEUXD<3D)c&o0uJu^E(_h|()%RE4 zSj}HvwUb-ux1+o}!2dab{mkQj`yULTH&6KWBX(f?hwC_|{uJ)=`?-$Q_gCJ^^M3oA zVqdw|?=J8j^tzVjYgY5;`?Ue`O*YhmROC0YuUy;7_uwh?;Xr$?xEHPTn)2v7UKjfs zpP#AyH-t}Oodxht_%yhb%bp+jm)}nvpKAerzqRA`e`@$M&Sz(==?VDxsMYsZFNqKR z`Th|<7<#cL(y_(CYh(LubgJuliG7+t1aXN`Py58~6IlyTt(c<|g>bXJ@Zs3G1|EVhfG>bo;3e!-;pwl4 zojm>M5Aga%!ZT#>20XEwaP5!p!Mogx>FlKbgm#p272t~l+vV^t{qf(x>Ro?PuEz^f zUlUAqeeFR~u&q4(N?s6bc7>-l5Pb@MAiMxqy|#x~z@HX;d2@`_yY`@b z8Vk;Wx6o@lnGZLeVn_J{@Gv}rotNM-<;3%!@ZFQ+>ei&$R>iQ#;S^Pk8`+BcPW!*yniz`@@w1?3lbiUybLihy4BvA7=`I z=Sd&5_TBXb<=TGKPA*{Q=>hyH{iJVyngKiUUHh-!e4#Hp6HO@)pI1HqSMr#z9w(Su zpdG&B=~r?s?_c3P=yTW^v$M3@^oG)&RUdhpj zKKFE(wd3v2Un_cjf8cTO@OqOlFf38mS?@#h3zdvVUU%B3w*agp{pG4e#1~0>P zyt)Nmg->QXGS*g{D_3)YJK=DYoVc6j;QCXu)iLcT77@@*nYzA&ob;Q*X`Yh-;?s1Cq*A24lVSNKM3!@pAX>K zKMF6yN7;IGaf{T2FNLoKZ$B-3A$$_N{H$<2AFJ)Q<2U~DzGTnS^jBW=L6R%X8hi7U*i+}?#VL)$;9DP zcqd%<$JW_J`d1~O-yGfu@SWk|&BY(JpModhS@Jzn?Zb2MQ{b^J#E$wi*Yf`QMGtz+ ztmu#3fjD0^fE^R_$Mc2(^r3)W>#-Hc_qGA-Bm#EswR$(cDfjo&iKaWSKk$&%yX)i1 zI|+pP6Yci5wiZiXG6(p}b#G6% zJNTn~7Uf!PH;GT|K(QZ!?-vsuhpYeN&?n)#KeG|Md63wdkDZ<1UDJinflr5r4i>K0 z{lBO74-sApocA+Ns3&6RRIB&SC&0NpWzK>};kwpE@Hl)e{Ly+z1?*qFXa8~TbT3rz zHC>DU%4e|b4tNc{jz7PKhYk}vI&M4zFTgXjw^!h;uZuoJeBOq)zad<=N1wv8hYK&^ z&l>hX!1aspH-*>X8^arL8(eRith__?o$%e@sc#8yz`qHP9Vt9MTD-a5*SyteTD<&+S1zT zZ`_EVCH_bhjM*MPmD_IaP5NA02YP$D&zq*BFTlscGw?E8x9_LHt8lG_x$tiI2H3d* z-h|6IZufiP$+N|OeSS^iVDI;v<1d%2H`>e&@P*jP!Jng@)ZpQZ#g2~i&%@K_34aPd z{|S%gg%79R--X96#18g{>>=%;@+0Be-$%jQ@Cf~49e5Fcy2)4Tz4K{}q%4S9eSh^{ zxGOFf))?etgP{O|hm(;lby z`0Zb{3OhHff@`@N0sFUFy%$gTa^iMByl08{Ga3GCc<52#+K--wSKxKucFjHq*X=Kt z`qLHQuX_2|_lQ2-x86MC=c2dwDFx#5SL;uIagHqY+j$%RmA8ED$G(4cCx85hC;PYG z{a3&JhrTOuR^ABQkCc4TZ-1=;?1%pCx4)j%yLwbUnQ>+-c%mixijip#coSYne>A-M zAJMlM_%zPhfS+ereSdK-t-hvY$iEk2U-_ay97+NE#R2Tc#`*2vjD6*uWCC{T1NhU7`|Z3mfW8&btN)cizW*A) zPHsDYzRRuNwL|3@+Rtix3GZS_=fO~1BG|OcZ6q85U$rF)X#dr&%LeQZNHRT zH@xXKKlBJr{5-+a zf1bOgedYT@t9NmZtSvhTgw0$CZ&SY!F>kJemyePyyXx;#{)U`So`e2Lc={CSD7s($ zlG<;Joi_S+;4%EsXnX*#j1v3$x}4D7uD@p9)xR!W&$F$ukHja+_uvSF`HJOU|9ZrpNU>AK``4Il z;q?yjQ;$3LRnC5t*2@v_%#p*y0{)x`@4Qv)JO|IitMjDZSF|g5neXAI@aIm;-Em@t z<44Sxs_HkEI7iXH0B_W#UZO)~!QbJD8s(Dg&HM1|WZ^aJjGiX(DR6ycI($QTl=iRn zzB|0VrPP<&>410KD(xzRolbaWp>R9vO*we@x5B5wFSFdW^B%r`q4jtp`W){!)_C3x zuf8VzWj1zd@CG|p+OA%J*LfbQK%oB$?|4w!$vo_|;gy>BIT=1~Ux{0i=Qp*TYzr^l zINVdl(eDoLSuX81OTBy(o-oocbUc|2ProtDvyj2gRq$@ct0;UvynUVcIi7M=)DGWO z$-;Z!rQ;>Smtf}~@LW>t@;;h$Uud>{=pN|9McykNMHzMwuwfC1em`8-C&~F5fu-(`4ZV&IeSNv(BKLFmbuJr3p_)%(q zq{MRu{A_ssPKoCj%5^oo_=2=6&G#;N*B^wJu=5*u>~x9qboig(Nw#20QtJS5>WpTUb4OM_ZUg{^jg#4Y+s$g@z!&c^WEtF#m1ygR(~gy`p@KLlQ$EETmF zejGe`ocN!EpAT=27jA>%O;^G5n@YJlB{Ba8?+CQd#qjtLtv6ChnL`EqB}ZG%p%ypijWF?n9h*O2hZ@?AS8hFC2HwH_+#Il6=Et za16Yg_%FcDx$w;U5}y*h0N3}NKSu^-c=j%7hbhL5Dm?bK*wOa?EIj;?@FMn`@Y)dn z`0x%qGeWptXBl>o#3$2|d?#UNZFv3`iT^Tq6y8x6$90@M0G_^C^z+dl4iCR75&D;y|jzuOJo zcu(wP(0^U+bKIo$as<3ObhM|ep+8#fd?@8@!+&78_nbc84beDXh`#4l{G@)bg;(Ad zpog!wss359uh$)_%HJI8<*4m&2|QC2`w9H{C%iO4$~%_|`xtJ{Ufom1(64id#5u%% zpw`P*;pNYy9WIyE%ntC{ZzSKTlxuIeeusSn?0*}c87>Bv!cT=qH(SFa8n++AOAkx@ zC!zlZJRjIUTnw)+9pfn{;m-qMNCEVtHc=zw6Tv7^qj_OdU$9!P?S<7-4w;a!*C&@SF>Fx7J?KM3T zhwtifdmWkm)hPVy*eSDJF2YZQXZDo-qWnB~M>pdG`fK1J>}b2X7vBDdzui6x@BUEu zH0(SN?_z(ri~9YC+TT~|QRDm>JiW1$cPe(q947Ipa-Jat-xQwbc&!TG4W5|9cuT&= z!IP^=zR#gQL;1DRvtsZo;2Dl1%J2p7%AL|rqwq!W&PT;g7yAQC;GvL=leRN^)6?)m zS%g{ays7qiFN%(bpTKMEKSa>4{dI{?>K9VpHukrMXRi@Ib-dk2`R~LZZO=!;BWYM z5A`F}H^q)_XD^4FEye#R`Q8EVeqY+*%#dXK8|Ax5Jx;-&m*Mpbg-@frL%t#9Z3M=* z2t4<5?2~T{-VqpA_kx>Uq{63T{}6bZ?`vy3kFnexFNXu$kyF&pRuUh*-{w+y_y39g z*_7+&aDC2Q``2Q4bt7q4i_t%Bxy!e`_Bf9aHuD$sVUBa>p?@15<9xz+c=&LMTRST8 z(ffQhwcOd)@5`wDspt!1q`yp)YB1A1{Y0bhWm5eS=u=Ci-WL+j)8O^}#m*G`xd7h1 zn)JJm(U;+E-a8sb{~LJvB+<{NejD&O*CRGSzZ{}V2jj^r(rzR04d5-Vr?lXc;dzeJlkgpt z7p1*Tg-?ekPotgFt~%hkXC+^KEo>*eduNGHk~q(Wo1H|j@xKCIULfUC{mt+?*C{6B z&qMGIw#!GtpM)pwAkMV6*Wj(wWSrFP%ctoA91)`l(dESq=}=UlQm?e@o(10jytqHH{hMTCs6bKZbQmt))Rkp|0ncq;`wK3 zw^{s|1W$h;7FzHmymXJ)X~GYOXRZ`G>Q5G4yh{SvAz?K?fp@GW{ko2w`Eb1tL97{b z8$A3i@ux|0 z%iZy&zW)|?%y-bI|1JfcOa+_@*ZV!9*qH;5u-(`G^5DJVPxD4GkRgLE^fk5%>dy`E zHsiVO|15&XUzdI{oqQjKhf^{x;ih>Bp831zYv`Ns?8XweJlq^5e&%+R_;+JyJlxza z0gmGTHt;;(k5+&7g;%#?e*^p9QT-E=Zwos=fJZrxIv@ST@b@P+C zl=5jZ{$#Pg6keu3hSC2Ep8B=KO^?$@eMjPueOk)f+E7;55N^007sJjJc;o*hZqLE@ zht~r8t4CPw&c|jimj05YV5gw(;W%3DoUL~DmAEa&{6`^cjA>XBQp}Wu6u=K(XV5Pk8BkzxulE=iyb}cclKb;5|D?hI-%2h@&a*eNyjj z#`%rlrY&*K8=1C)$2m@q!1sf<`A&iQc{sdyw)j5>{rBOWA4>nKlJ5oZ*dHYRbBWK@ z@a(=4e_6|zU&8ZoX(xH?KMGHCUR2w|3-H!+V!w+1EqG)fDQ}m!Yla>p@riPt>M8VV z!Mm1V^j~yrlr5NTQcw-M~KT8>Bj)%AQmN?A7 z{u%IiRQg>V-UTlnDD~R~FTpdMKhbzTsQUFKo<;O8!Q1pxZCCHYb6gkG_u#GeJ&9X4 z_Z@W(5kr&UdB!EpcPhNab$o3n2g1`&NqIHjqv6eyCH@`wnT1z4e>fg~KD@|#m}kK+ zhv$DL6>XF6F4vZb$HLMlJ6qgLl)j#F6Gs6<0tU^NXbz9`*rX% z$NM4jy%Ao#Y=lQ9!T$(v-sa!_{vBRp9Gi(hAHkFROSyEsUHdqRLz(OTOR>KtT<=3x zf2P4RM~VN_*OnF1@JK@XSAl#x;kk#TKWcm~f*bA!n@_&CTJH4=?z`xq!`zL&%Kd@b zu9m>t=Sh58*m(sz`rStL|9$iYj`u6*M;tG4=y^@zspDY;Ud>8*wf$^ix!e9m*+01n zI|+D;>n2v@P5WXecaQ83YkQah&#ou&S%{qz;1%v~(edg`cr|dI^}xCZYTDa zG7h}1{0Aab|A(F+<&6cdN3RRd1g<-84=;1wS)yUgftI^=-r{^RVKCoBU)X7N4<+z( zmfD#n<;t?cdGOplGX7|Mu7H=;7X5Vex5C4(2~Seq2jRuhvOl2vvCqI$?+y1X#5NN{ zO?cwBVyB4xAty?Fnp_Xf!PkQ4mr4DG$#)Vwwpi@z`Q+{4CGN+Vik*Yu9Y;z%&V!!{ zPv@jPYrp;}+>}On%30_az-xDiBVF+O;91V2hT#vx^EZqBDR?*Bd|!BvTplpb!(-eZ zQb4~H-l}jME#WZl!|VT)@l)eA;w1VP_a92BjhSef_tX}l z&%mRPi6aSVMrJnlbAkPnpQ7*J{BsmLC3xu9t9xVy{2tXW9PN?0wC6v;+wamI(7y^# z@nE-(Gsae&JFaQ|UhL@hYaMu3OB_#OXLERD2eJQ@Gz+skJh!H_w|V$;D7?mb@(%5H z@bXZJyvBJhJRRuoC3x#(v9Im+Zg_#~iIcJa8+exOg4XZT@Hp@N)AsN$c-KaByl1yDp5?c&|2jNZ8tV~_+eh#) zaqC3C_9+s#*cy`W6ymcbyv68;*Y`IbKpsiTVvR{65h%A z9F5QIaI>ql+a&({3Et#>p%ixh0gvA+LiMK&?_fVu^Br}nl(&cbKegT`z*C&BQ-8LC zS2vS*mdSU2cqjKw>3%{7Jhz|3Q~T+u@Z{W4o&}BP1!{-;oTp>|3V7{tDc5-T&*3HZ zAC%t-k6+|(KRxjFa}v+DXm5XqS6-2bm1%Dyvr@kq-XE_0Xe-Oz_){1q_9N8G0q`)_ z&C~dK5*6uA-u%>jS2J*!kd@K0I%)y1$gUaiRT>h{U4(Go5-r7+{Gd^n1Xo)5L!rKM#ht*&i5>o$tZ3$4a}>`($RrJJ}yl zJ3oepACY=rO1?jX>wDfbK8xT9`sqycHF%EmDq6qG;K`k(ek_2qEZ&v%<5HXy1-UqL99Wai5 z2|V*tsTZ~XB0Lg!KJg#$#<3E~DE5b)E^){nD(zN}Ti1Y_9vN5lKA(-?$+aY3F1MIn z;9>gd6#U!|UYQ^fi^0EZx!aCp+5g8K^8@td1(L6}hx6b)AIZ3<$BzYg2loT_VCYuQ z{zMbueSK1D`+>fn(z5%aaChapze;X8< z9A4$R{0#J?&XPFjdx{vg%va#qPo;&-M!zk*9Jrr$4|wGtJpwa;_G zE$mzjPg1|y9j;UPj;p_ecRVQLTOEBJ-u-i_-v#8`glE?meHVQ7 zIrOi)#ePk)HxuFd{`@HVE#L{ZYhulqsqpH7jBjGj%z&3~m+?W*dmIbb_nPLhpMyuZ z{;2KnVt9LRvC~1jy%Ao$Te$9DRp6z-b(W{#@e$JBpCaGa;o-V$PoE>6Z^NU%kowhn z9CD7tt@LY&Kn6Q&!cAJ@Fi*Or*-$y}Q8_X!E5zVEJij~*JA1;@YfB(C&IiMbJhx)q z^QL1|&;I93_!)5h&iIk=i!C2w-uW!~(OM8mu0r2fUHo6j(uMFIt{Zm1Yw+-V>V>#H z3$Gq1+bP{o`!_tveM$?kGyGhMXE84E*Zv-Xr+MBjhkhe?56?kNf=_|RIWHZ9e*<3G z-`~GZfk(L?n`$u^!m}BvKrTC(5KhQ|Z%i+Bm%#rx9J#O+`3 z%yClV-Snd&=Sh6R+}EV#T^HV_U+cKKH9YdDbd)^(B>|6d-A(Q63omegX&L_yh3j{a zwY;<7W^-vLZE@Gkfj9S+dasf1^~wXsU-!Z@PfNWlBi|+P;?>d~y5S9Yj`&OM7}J7R zxW24>SYF~*4qRW`6rPHS{UrAHf#+|R{yrUk7`*vosSrJW&%k3(N{(stKY)k0ucid= zg6GgLC2l2nnDfsX=X>DA=OmuOU$6hfm!9&kTePxHp3QxcjKbP``;jh3e1=$}fz(0bgUy*h)n})Ue z1!8F+nf8Rv`GX~CgdqimN$@CH22eR0}pvW#5(nr{TMzZ+s6=i1VTF_-P|O<&Nmmg7yuV?6%OXYo(` z`@@@9?#A;51&tEt9pIfmk^tniUBQ!q>(NJf_Q#qA+Y7>JPC*}GyQBT$NAU8P)jSvT z*uNfLnk@Yy4qpT}?}+6Y>qyC-fY)9XKkF3upYUYhy0Gbz@@9zVc=YSQ4fjPn1>X!F z<@qu@>rK1cKfL?KKV<)b0;kY-e^vZXpq~kkjFcK&j{ZW=&P3DZe(w{cFE?1)k;mEZQGGgr~Saypw#_xk%!Z+-5b8#NnI6>wlAc^*DDg zc+WWDOVA$ykMrGC?boNk+qTWQDTn@tYKQNScfh;gi9@BoG>BUXUc6JrffD_6k?M~W z{*)BM{N8fcze0ij^)&h>epYC2Z^A<_%l0J&|Bvdq9#_CmbFsuNyPY_q_ZzPR*YA7k zc6keUk?m9pJA1*q*l#bxkAz19+rqdDV~GS z{(Csw1opd*hj+oF>xJ$L)Nxdv04x7WH>j*E4ygyXlkOnvf{Wb7dT=aT9;x2gi>S95>GUhROZm56!`7=CSlyI#bz6y>*5g;<#j=bK>d)@*F5Z`-{p$#L z>Huj!5vozX+e>@z48tDf-rn{{C_syc9TJeLp<>Tk&%)CYQjQ6UCq9@IS)~ zn@D-N4Z{2jUN1>INunQW3+TqH(6Lf4+78!(_k35{r|ySu4=;=m9>vZ9@a%zNXFBzM z1l)`gy|$AR;1TX`*Z!D;huNQ>g#7}%BQRe50$zfvojc)G>bDy^zlNu7miW(vKcjZI zF((Xv2j20n)bAyfYvj))ZpkyHUNk;Yc;oxxNtXVyJG{vGhiTaFfOp&|^<}g3rW4`a z%cUPJBi}jjPTupW<-G`=c#L)^iMiSGC^ma1kD#yKEB_ZURC+{ixdb_O2mQzD&(h?Uy3E2Tsy_0p-J1R zv?cZeLC}*kGiNfVnK^TM&Y5IVxkN1zkW0{_!7oaLssRf|DHs$XT$BI>BM6Ox5^jE@ zR*2|V0~Yu`>sim*?|$ENhTmVme4umA^X_+F)?Rzv_S*ZXpYIdC^9CQ+Vd0-3t}of2 zFRJ{~3%tdUC*Ku*YNd~NrzYmY-zf;S6AHNH^ zLwG~@%0JM&i=JKKC$9H?zEJq9qx>VigE5b9629e0PJea3c#rVI6Fy%Ts@;>qizhlg z$5j766CdvXccY$ndp#?)E`AUK)97&SR_O)J`=!FS>xWHV6?70jw%O~6b+I$b*W|#w z@Y#nt9l~z;RpH03_WmDJ{YQka_^Q)0^w)9WYd-1qMEOq%Kc{tZrRw=_;U^y9{S10O z<_$jHuH=8{>q~?mevI_2vt#j0;Y)w&a{Hj_e~$2@#~qJ;P72?tb82HM-xt36YhHe% zI`m57DwO?sv&x@sc}K3-vp*Alj-RLUe<*y_yL=s8 zs&+pp{7`Kl^EC0{@qR<)clB)?MlL7mHs`8xGx*PF$2s;l6L z%5RzU@dh2tdBF_3TT+PyUAYv#a^~PvPUUUjG4=f9&sAe~@=w)8kJ7 zZu)CN_o7^{@;@$oRZSmVDLj6!aE;18Pxz_T-tIB=XP5A?PdVLYr8j>u%J230x>WTX z6278lSO1>yVz003Evn~U;rl=1bU0u5hlC%|xwD}2{Zapz*KJoN?|+^5=fmpHPYCb6%<1rX;kO9i{^Q=Co$Akg)GxWWT5bQb z@S_iU{UMirOZcqp(irdCg&(Z>Wgif}|HVGi81Fw2&jzZG-&Xl8ihD%)#~pS$9D1X# zqu|f~_^jc>|9)KMk4O$|(RjBBKfKoYC*;QSg&)wqPmF6`__>#RPl9fD2L88BpBEMW z?=8aDyv^wx^}I{?Df#t*e@yt~zj*zYUib@zpS;HDb6R*?_<`Cy{!-xI^?K%1{;=>P8>)2p zNR-!lkN)2;y!%#1VqKpTJ|@3rR`suVv(sT^O>R71`1n^{z(@U;2|pma=(y^+n)vy} z3w3{*;NsaTf9yV|-!?SAliGd&R z{=|4U2tQJjpVt!CV6s0Al`oVh@2wZbqVPlS_4WHI_2+=_@sIm>BX8|Z!cV>4@fg=p z;fF7BJ-bTuxsQ0(5q{2cb=1Hz9?cn?FKKl*N`&x%(&Vcw{ERtq1~dH)l_ z*9$*VlY3VQKlwCY7k8(6)JZ{r&N_c@gxf1KBIvF7EUg>R8w2!8%9@!@(N`+H8ev%8$H&Z(YDgiq}7`nNsQ z-`y?v3&M}o=ysRz?a%h|E7k5>g?G2PTwSex zzEAkUpYV3Ksondde#O043;!44V>LPUkl!Co=N}~gsN#V1SIqBIg&+Gj=jY&)XDw6D z^Hlz1ZGWUM{HWw@*c-nieD()?y!Wa9e zr~f4U%&$6~4~U)*`2**No#(vfyM(V4zUAYNFA4t<;j3zT^CzPo`Oz1tKi3Oi6Zgyr zpAvpx?|DSRUVW+XGavJIZ&CSQ6W;xt&xpTO6z_<7wpPo3RQS@9oeqc8|1St%bLhpe{#`SB$Ps*;C(>i*a@S}g`ShVbM6=H-tGf6O2Hcn^Qn%ZFb0e}zxT ze+fEYDSV6Uy;v{L6@FB|2fAPUa|dxXmi>9P${)GJ`R8sudyDWxHGO(i_-XCO?Ns@b z!e7#!uQMmzeVL&++*V%{&x}aM-{~@y@tsD*|<#k8&rPvUCt+~G~OBEXB2;! zRa5(gpL>aykMaJx@FP!fI)r{aBK%a%zJ0&&HMdJ{h|ljAzC->?0_@ZtM~pIqnlM7#eG^(ZeT#`O*1$A7`gZx=lu{SIFj z`)@g)^+#NBjqqblmosfiV{fB-k&9Zt@u#jTGwIEe_Hst!#i?I8pVmI$L1&lZ+rn2p!s+a9 zA-(yJoIX1hHwZuCV&O|QzxAhtpZHhr-~;Oa^M#K;_5$|gxEi=kc=vK|x6rum5Pt5> zj{EEs#cv2dCA)El#&wVIm6FfV{|^g4`xYPQJ)-}oqn?`G_$A>dwC{gJ^?y@%w-%o{ z|ESaFwB&sB^U1<@-sbIIuXZ;D{;N)hu=lPbuEw%IFI4&No16{@^sFO%zwEa)!e1i% z=u4e{f)9UH_)6_>27Wj3tU-PJh{~V(pz~YE$KYHxYg-!TKHz+TVCOMb6ouMT;a3&y?_|+Zs9AAtDmZ8ukd5aD+oS(b>PY? z`@G8kw(ymT2L^ra6@Fx+_kX|2-zWUs6MVc;{wsmYPFtz+#h*AG&iUG=kM@Pik7yI=$UdqDWkFN!j%XT>{>4#WSRLLB$o)bdg`FH`=x z%itZ=Qz+heKu!IU@WYZP6T;uTOg-;b`Bjo98b$H(Wy=4n%CGpY&&#D6?{|cs{^R&kGY2nAUPjQRzF9|;_xjLqL{#*F|-Coc6D*vc=i4F&Ry@!2u zsqjM2d91|0NUih&)z5h|qzehbE^Z5cd)if&tpN3G@G=c@eb|8Y9p zr$>+c#OQgMQTf?NImOPZ{667J^7}$R9uR(3_4_I-iZ=*9vc~PG2UX9X2;cED&iK)v zPYNHCT@m$vg?Krh`1I{%@W;Hz>A6Gu1()iDON1Z%p{m~hN#Wyj-k%q#{Bwn${!6Fx zg~DfrAFl1E|Dx~%%A*K6{Fd+)we|Qm;cL!wIzOO!{8Qme%46A~cK=5B&Wo%3{LjLV zZ}>sJ-Ddn3gJ7H7kZ`Yx?cEfZGN9G{FLq)j(+xpA3W^+ zjCx)!{7l>F8Ti|T@2uU!d`$StwXPq7KmS_zmY;C^wCMIPQC|5TuTuZNCH#;sBv=yu z*!OB3)$Ho02|xELpOwn zMEhdz6`eN=U#j`_*9kwUyupiAPfPepop+cP{>#G0*EwVEQ2nnXu0q+LyH&pU4WU`|-#&0) zqwIun;oT>SPc*J)3qN(9^X-FbcT)Ia?e|5ycM4zn8S#(me+zNFoc(#X$``Veok~UV z3E^9w>2yA+cm7HEn%eq$Q24P&c)JtQ`xkIO5plWud|jL`I$S1ve@#C8gzytrdOcxh zZWn%5_itRJdb-530qNr_ResBi>$S)ye5>&7we@>k_|Z$9&O1f_&n{E{nPu?*Sq5Ku z-1%XP=ytE_zgYO$DWCU{SI-cB;7G*l zzA1cX&+)jQ{4pPJx*gEDq4PzzA17W6{kux#SBRg(UYZtusFr`VB>aTruv4ihUMKuy z;d=0Hwe&~A*Zir|f4lI%5q_{1KYT#=S;dhKsQh^!^l^1{&i#$TA18drH@yDU!k;F5 z{OP_PLvBBVxC&)|Ua0a*cQ`*!Jj5UF6@FTAr?7Kg34B!E$ZJ*pi1N^aKEE$~mG;YG ze%~W}$7x3*Zu4p32NlPN@?R6aLihAeYYg8JeolVhlCyPj!G}b*XZpO{r*S<^_zL|l z#)Rs*hImF8eSDtEulb5Eh=ao0!k0wMz2=%Db~+PS&63O}Pb;R{v& z2ZR^OmkT=FFZ_7z+{ZVBAAO|zk7qRA^FHi!Sfl)h6RQ70;m4oj9gO-f5q|b>ggn$= z*d~19u+QuP)pM)x?eBE{2|Di;KKt79STgwP6~b57_T_(D_^K^l{vyreJ;Jxkzgw+# zKO+3l4|{(ea4}STS$Odwui#FV|3AVfYIeoL{!;XLpYzFfwfjWj6WXWPuX@IXpJ{u8 zXN2D@{Ll%n;E?d!gm)!x?-Kq};bY?4Rl?sW{N!y9BhnTAPT^;#eZE5ee?s`VpQ_H| z7l`ZS?9YFx{OPy)cu(os`G4hfSosqVBl4>A{K0DB`z7b6Req!J6WZ^)RQNXGE3|JF z^qGwMU-@vBT>3tL;dbJBIs5Z+m0$XI@8{>m&u_WDl;eU>Tz9+f{U{jy4R zoe;iM+b8{d;j6B7y&QD-hVY%W@(=&Gs;)i4R~+*BT_gOB!Vf6U(-r<<;b(8~`TC0RQ^F7bhSxtP{NIHi z{n_)0KpgSkici>hhyOi^_@jzLI-eE(?0Vr7isv8Hs}sTxzSrr$LinWcvD&%9Md7EF ze{w?fc}9f$DjJ@D-AKL7$Dp)#>cdwaef?t9r(M z$ye5cs(()S>|Ss8Vl{B5@IzhalLuYx6^De6*VfnXM|s^>uv7KCPx!G~{=nY~KX|j( ze~avsuM3}5ocyf%`CZ|M<+rZUn4j?1PPe5?d|pDnJ&kxq7=65c8N8u-_WzR8;Q`5k z_A=#PuJRK)=lden|0dx(6}MRu{!Za5mA|oC_+JShfBmD0#Jc!9;fIumyj|tb3Lm@V z0!Kuj^G-S)&ggvlg~BfqzPh$Ad71Fj;^)wVR|{Wyt@r0V)$_B$Pbe?qZ`GeWgrAgO zcBk;y2=DH3ITrH&4}?!l`n+GS@_#P;pz>a}2|p?PknEx>g`XCFe2dT5S>X@)8>hoL zuDu0#m6WU+iFMLOoubs1-7QUqYckfkE^o39Sl&|;j zJ6`^Dd8&@eIZ7>|4CehvOnj4 z%IS9WxX;T`J$n-Ite`$#s`4wo>E-X!dU?Szc^X?)e&;41?*ppmxxy!;*Mfgq!cXeH ziw9NycHxJlrzB>Imk0j8eSSBp{OgJ9OZMljDu3*coX^jx|Hp+NlpVW8?|e4OD-ZT! zt&9IH{9JAS^jpG@>Yk10=LMg3I-mMy?`P~^JVp45TAtVyz*lGej*mB}{MbXjpU_2* z^C!EAN2&7f9V&nFgWm38J^D4_`{%`18rM68@06U6{(n^X_L@KP1>pzf7o4a1|6TYQ z`OAT?zydV8`l#~gPN@7v!cW%Df2|chal-q5m&$JuzT)e?zUDNKHxXB%>`zPO$DZcv z>lQtGao|sKe81>$Q20sRPZjar!@^hAACYuK2zb3TqL}EkJs}mjcb$e13Dia^Lt(3lG~@% z?xgU8vfHD4Pxx`26OVa(weVH7{fi^SRcZF;&sBax>w3GMeM0!bTE6HPgfD%@=@5MN z9pQ)e`gkLL^4QNheNHI;xkmLrP53Fr<;I0yCH(j^z2+UlUnqS00iUVJ$LkPRq3qAM z-(c+y|9g$VQNA8z*>%it^Sclw-D ze)vwk`efnVn!R_4@a?kCZ&CTng|FEx`$72gg`d9Iaj-G}-7fs7@(N;JUM2j9e*Y`* zw?_TH;PZP(^}J8`iC^>jW54w?!e^DwFro5i1K0f?JB5G$DW}7V|8aUA5dNdWx9oR* z2z`B}@cr5czk7whaJ}$VzvXgir{q#Y_-dVRx?c6)A^b!wPWU?E-F+^Xj;s9Jg&%r} z%k8f44+-B=o3FnXzFPAeboi?96}5HxpzxJV=kwUdx%BUxJ||`O9#Xs42|w^wUyt_+ zpAmkrmRI?5;rkEzd~Fkb-XMHJ`!zwIcM3o9av$%0)&B|N`jY+mqRQ{w?ESw>a_?Kh z#~LG zL_In;I;-+;5WZ7+5nF`cD}0Ca(VXy42;Z*rJ3EAbRrsnGIo-mJdQkYek2=HNt@0Oq z&grmJW?+lc2q@y{Pu`D3z&eYFss9x!zx^vNmnIZvcw^L~yu0ArcL-m(-{t=rwfiCA z$0mHIPx!%aI-SGL{JijUx=$nY z{yE`?YIz7x{DRZx@b5eQFZ}@@+?eoFHT`&v@b0UAAU#p(VM+Lp$DII z+Uc=(XL_itaS@~vxy%Q#ZOi`HITFIO;#>N)%e zS}CgMlfqZZZi#jDMd7P!`t+>u)8c2JWi<39>(B7NA0+;$Vu$XriFv_unV{ z;7h%q6KeNU!Vll?awE}=_%I#*L*-X>eV{8v{~x0MLLKT))H5dhn9iqPq$+O|zDE0o z7Yd&gJ|TN=weXh;U;40*YlYhVP2wt){rN+cU#0lu-Fo(Z;l(-a)qy> z@ZG=XcJlD=q}XTU_PbYrK5S@1??LHLh2wKUWH0^)}6m#&v`6 zgX?`AJ*e_OFZ_)1VfG8}3m>oT*Zi{Zv$cEYUMu{_5$|~D{kI9<@mD@BU0YwgPx#6A zdq2ZY`>gO)wfvBO3B0!N@O@u(`ka{eah?1=AHXW%rxjnC)wnJZUew}p#bt~A-eq&` z$;)<4O+9_8x6toj)@=5sW;btq`dquSxb*a0oyE&GU$%B_`M=@k_C8A3pQ+xUy>_9v zc&V6b&doLUwwk*eGoAlGn(3gK?o_YUm|B?cw&z-Fr;3?&XSy-dUTRIxwK}^7v&F^J zMZ4cQ6PhEmjDUp#QsCOGR^Wu+YWK4w{q2bbD9Z{`MCq8>B^JVWzQnp*KyW1^UHzywP52 zbei+6ezEoD=iRb(V(o^p^@aDbVfD58{r1ehVo$3#>BU;T-a@Z2Xe|x;XlQ1pF_>BC z&0}Kv?fLdxv)4v<+nx3x|K4x!a#C*0(fL-hzu0RP?T!t+G2NPL4O)$Udm2QVY4p2u zsHE4LY+`Pv^Z|oyPS0S}@x9*~EOv9CgN`-kTfJSWh`qAVo{l%{Yr7LQV>(*B=AgaM zX@Hd%rt&#kAFp8Q=G%it1B}=lfbhLRf3P?+gI+ZnKfU#)#`V|Td`qKIOt&x<;DZ*( zGYBaf^eRw7NMuJz0a?wog13fYAtsc7S%Lu#$&X@!L1+vhY!R+YU^h~qS zT55p|m=z49W4#tubQijO7roa9upE(fMSNQC?Wm4ktJ|1wcR)w{Z7%tTvgPHO8-fPWZEp<{8{XwtY+0|Ga zwC7Sgn9b>Zc!8n?{gq$=Z)y2Vw!!RdzuNZV)O577r#aW2Mzv+jSTcR^RTNlqiQg{sV04rQ5ASM0vduRK z5IQY);?Z8?8tp;+H6|e!b{CV2ZAfH3!F#=CV~$*5Z#Kj* zj!&1kji`VG9<-;h_^ncXnd6tqIbWTHzc}eNMiB_aKBTJNu6)Cbe0YbkG3e6lKs#Z^ zrfm)(stoFO=ZvTMw*gMjC(LlOx6g#_pjkjoG`xW6E@+6|)9qeJYJUJBRx}3#a^zxv zwt?>r`wsHV&9$cRKE6OyL8O>WTI@_U8c=r|H*Vx>e1dLJA~&Go+PgaQkY@d&zW|v( zxvw$XM6FE_-P8-;nQB7MS=X&*erYu378Z6d+UkJ9&+!=}>f{_=#S62Go!zJs%NVlU zIJw_4Gp8{%-}Ptqp*w&KZr#3!#l)|uvCmJF5a|%zd~s?L^UbfU)4p084G;|NSTFjZ z1VnKc3x@F6JS=F(-J7ykw&UM@^!hy-=1dQplEWt2xgH4Z;qX z7U_HW3anu-Ojc07Sh%f#>ivU{wQu90*0u*6ntcHCZr%v(VkSv^!${)W_@?|BzUkT2 z90==ELmtv3LBux}CT}yY=(q2{3NmwLVbMrtoQA&TRUMcda-cmm;JlgT2NAUZj*RCO+9lLxtur9jwyVfd6! z<`*yqnL{+eAQ&OgO|!bZ&+Mr6g~mJ!%gf{pG_YAYXmp zRR4-GE-TWH#*Nd^cg(hEnbsx;YSW+xDoHZ=au|zuOz4+2*f+OR zwOW0W2rqW1LRBT9A)w!BcKfpngS_?zmRq^Z7CO^yTLX~Xv`4_h;TH`(!U&+s8tuZJ zr3TEiMN{c!i@3x!KLCa)SQ3I9Q{OhTxKaYHK}Tj-yE8Sn2odS)6fYQef;1)2htxyg zN?>G_6r7bt%*YgtD>$s;%6FGfsr}Z%Oy#khr{LqtGizex1AnPrw({KtZ$`FY6f0Gm z4ySqfAaUD#%ltzTA74zQdbYokb@^7(*_IRt0)7eaO*!^G6u z(yxvR?F2%>g<(S(wY$MDX0VGR>9i;kp-N&2l*9_e+*Am6pN9lyeN0%^gB%-Tfb_7+ z1T}d1*Xm?TFXj`L!0OZ{IA?+c+G+^?fP^z*;19GytJ#6QGXK{WKCA_ftHl{1~!Ki5Urknfx>!8()0$AlN zG2foH|L7MzAoY!odQZ33fn^`dt0sDD5`IR_I&FO zGpGHbcfze;%*mjM;oMT(3U%C{>a{01x;BC$dLPW-@ucp6Q7&4~jK@s(+8D19!=f|b z8H?4pSqrnw;tr#pz&bL2U!Gp&Rdb8|6|Wlh+q7BYR$eh6JuvgX-jT*qLL&^q4w^;U zhSoLHc}CSpqp9n7gn8jis=w6@`e;DKv2MGO#cKzx%O zbKIjIRvgS`Rq}&zj12{@7lMsu{$;p6?rz};rGz;?6^|eT$V%3Gy(JFq&n^xSj14m+T6x=Dy9&has6LM+LJ~SF#}ET9W+H^;9~zC` zyjeUR&9>Fhf*Y+;@z8_GU~Ds8rn=^S&tP^^n0h^ISHR}l%^@ZN5$gm2<)1JG_KxpOXHTCuD*Kfv$jrL-MIO>Yl{-U^~M{nzUkVlx7FaS z&$;oM>#y5-OXJ38-Qcg30%X(J_!XHv*)+CkJpa0GUFGSz^_P3^DL*_q;qe}uOLH#= zP}dON=sQDy3&7wHbBZ^)KOI30ER>F!`FkLCu$2PgxNgIyjq8iBg)oJ_!UAY?78bg7 zOwo@9sN1VQ14F`stW`p(KoX~VD|PsMrDtA8`sz!^qXQ5vt^PjPHS=XK#yQCr418q7 zn!ab5qS_5?oKcjFdMBP$-w@wg?9ZF4KK4BgY&2+zjn^6^DbmoO$7U&9x#`o^o*L$V zRDV=8mfpz65tADAYEYY@sT#Fon4{kF-f~f=K1VyXYN81;#WK&>{HS((#z#@oCcj2P zFFdN6N*}7VMXyJq5R?enMQ{jPLa>E5Y}#-+cZW@j*!Rur)>podkFCqUZyX!nSoyvV zf&cktd(MTaJ}JInLMjlG${x>5knw48a-{0kN+3@WB`Fg|=J#gxwt@&neH{u)3&OW`r zE)%UA#*5n*TZ`xzj4*60nx=J|$UBENs;VI0eQhlvDoD+ljh-t7av2db4`gY*tRIi) zd~FvY59n`Nx9RdAW%w7Wn_nBUT-_V1JV^qk^1i0hBlLM!y}G&~R;e-BK#m$OL-b+~ zyWiZ!PrgS5%uKs^|3;0}cjqC8X@)iCdW)z4yS9V5qQebI{CA;i<}EC$J+k<)3pZfY zOzwq!1^07TsL^UIVY`R%z#d{8(4E!C_%?%`NW?2AA%XB0L1AA{2q(E9^#EnY1)IUt zopyK8cD<_A_0X>ojg);D*~Ml1(8K0340zj2EH&+hE3hl)DpRx!{ps6yiuE_UZ9HC> zwk?er?9Vp#%J6N>$U?4y=DtO_p7!;Wb`3hOLjs+NzStp%o z^t9cl%dg-w>>4q7fPYiG*m>j^^@K{9d7*j5JwmG z*{fFp^1+Pm)M3^z-v(LsFeQ{qtB%qtQMn=4RGr&CsUg!`nK5N>{;v*o$h1vv}|_681~8-n!=2Dh$>=! zLx9l;oJt)v_vbwS<5k@Ipg63OX%=VY+q8-5wAmpuynd8 zNnHek5?L6Ls#kqvGrKT1ZS7Sbe6JULM z6Oi}?TlvIXwB)5wElo}SZOoX7ZbBtmL(C2V9b2nFu!Zi923o~iC|#;%u@Z6!%po$R zGonyX#TgI586+WbzXnZOhN)Gmc2GAya{FVrF{w!vb)D~C-xVWT?e?%uX!S;@ah*&Y zZm!vA(PuY8hMNlET41H4KiK*)D;WPx15_`p!w7=m$*vK7h>?GfN1kjk+=FdC~Z^Y&(1AB4C)h`G~XP+%8qg#5@^6Fw7gJbcjLTF z-H%(vQA(XuBFY)_EU zo=s$H$td{ittE?zo6E`_Jz6-{2SMx)<%bu6CI%UxiPd9^)*!5JHm*``&|6BGvdo~} zg?o=(K*LdQWG|uJCKdsb&27Vi`rVUt%OX%O(0J_BRI3duV3(~OWTDSkIF`5-F0-o? zYhWwfrZCCko$Nd478oQpYTKQa^Fj{vkp2tJP$q|AAJn#2JSR{UAy|t*7Ay&@s(HiE zC6W?KL?5V)h#7ehc<8nE$fKiZ2d!+K%_7SZMiX{DkUzAqGeAPNn2brRc!@#+Mj1Yu ziRjJPCs5v_QHve(4$30F#8DpeZt{@trP8*=ZROJg25J-P`^YAv`W8#GId@HHO2TXM z7wlxiP&KJ5Ac&d2wut((&2<=rEqwci{S|D7au*xtUf%teN|x88J2^3!u@Tk68p!_*KV) zU@G}{ZRFWkY^8t$KrZ&4U*f1oY<5;2Em}5ttY>2$kxp;&v9@PMKjfZe6X_=45-)+d zx4dE`bj~gyu{iGtt6Q3;C>zmGBxBTiL1AY}8SNg|BjlCNFm23huNBK5dC$P!AdGp{ zlurBr0(!OJvOo}h19~g_=_bGbS+&w_wvDSG_pPK6~(7;hzs^BLG!o!u$8b? zTmqIZV1m}t^TcPVaQ=+vFTf-tAKIdQdWZ|Mp3GN-Zu>~Mfy4qk5~E9Q8r2t_Nf9no z-_!M#o6>ir(%cxf)B#1rnY$2WQ8$zVw#B-z`>YLZ7>pGItKDeERuI+00=K1)TuMu3 z#KD&aY)LOZR!p|7nEqt8!Uoc%p-Qp`$lb+>7O>qEkGAj#OJV76-1pvt&Cms#C&&=n zK{m@1&-#`I31@^UR(OiN5_~KAO;f%WL!qJ1VMPANUOF~7cLu>?UI6I`7A)@Y2p?+E zCq`uYgK0`4Htip=kX@|CSI~^1izsW>6%hu5(B&wI7A%jy1T4=0F^>{}fmH>-Btvfj z=v3?R*StCGL2Ou$n809q($)p?&8CqyfloH%e%~Cf*wwH>DgQ*<4(Pd^E5iw}KJsIz z{{4fGId6$SF2Y4+a9XpOi6@ zt_46iSaKOl;pr|U&4W?(TB9?VW8No@1lgFd+s>6?3l}yDrwdUgoH0Yvj5}j4 zYCe~E!&XH4qLt3?F=&2)y$S)?n!{N>qp2-&@GMLU(Sn5-&hn%i9`XUVVsmABxU^Gc zs1j0f2zA!*P?=`{yO=Vhn3~6tu&!wv^V#?n>ZFC?^ScWipDuP05<-?G*OCQ73Sg59 z)1ZPKzS2&o8<&2(1kV+7u@3ID^7`&M&*gUDlF@ABeULIis zCzJ3wt$g@>*nF^@h98hFF!7){*f~T;y%cH87=|k)j6Y0A>=}(+?ur8p#1&wNfxtox zXapeDg4eR_CRaBw2Q?5h?T~f6ffH*ulIOsbomH8OFFe|#2PUa4GUH!ucbPT{*(5e^ zN(T)Vl^0BFuEAtG9z{m6XhE~+W#^(7HX@ZEMf!*i*;+T==I4gdB^zM&pfbt~&xTq- zv2}{hW{^mLPL>Hr*<&{B3f;L_mWy=}iJp~j&av6c98LB;7|RFM-ED)!e=#MNfCbsW zZ+n|ilD=s9eYOedlzpFeV*-k@LPTBCy1JoZ%AKPZY^TzY|1Ow650}rk?kUC~B z)ZxvW2%8c?m>y2Kxs_c^r!CRNN%(=5S&C*FjcabQ47ICo+=c_-ej40An^%TowFoEK zu@YlS=9{r542qr+VN*kRO52#q1R))S?ClM4VFyN?vZV~QV_|q?lG#f!8ND|%wSIj4 z`o_#W)Q+9;ZQQ}9U`V(swxIb{VF6=)v)J05E)HKY9Ku8Je#kkU_-1oRpJf`6eX-au z+Qzv|%b>&;Rw|cBjyIuFR#}J-n`ZLF`OpQu=?*{39?kgaLPTi$Ed;*}jWB>qVJDS0 z$*d|F*p};PrNM)UKZOgHI&BU%cv1mVE65Y1Fr;xL$i8A*u;EW_yU!3m?TL6j9=f+` zsL2jzZUptQ%ckSVS7G^IXMr4l6)l15F^3$;W_Oz)it+#!&J&rK_NHt)(Nby~6<9Vk zpN7@jU);rm*f=X^GZvdc9$5>Yfz{#d+ZPdKrzPxkWWE}R zJ2ea5^sN0ze{LAPgIQ9jJ?TDEMmAI0xwQtguH0{9lODOizz~jtkTbo&pn|=~0+!G~ ziIrxO@heOsZG#!a57Tk{=UQkwctzahT*Ru3mNe>latD3KsYUA*n~)sh>~mMljLdM< z$y~uai8sVN5vQRHV1;5+SoKI@Um!&OCpBDPh5>EubB@7Y_PLbJsTnqowy+=2L0mZq zV}_2gvfY7V4kzA5CN=6Za}iP&`$IO(7?+*rwz^#@azdSh+-0yw=8faR7d!6`fto}@ zl9mv)=2BWwi=>nbNSdLl7{vV{>OB+PvJcFSusVXCW?E9q?qZAxQ>-A~P*=$y)^*=V z=odFnJZs&yt+(JA@@4b9SA2c2bm|T$;#?rKKw=%{TH~K&(~2two*UnP$6S19JWJJq(1(41E7aGE7*uMk&4AxriYb20}UJ>@}*+66Ccf?+2& zP`F?r!0pZ_Ydz^PGrS=aAyl=^Wlw$2I;y4$DQ`*P`$k6SQXh(@*xA>puL}ksuKbbZ z+giPPOWsnpeuw1HlrP-O5(1A}N+|0Q3k?<)WxOOw&g2|x%BKh`$)?%&=*{Zk>l7zC zbr;d0a-G;h=k8cz57!QYCCnf-6CUOajx4f%tZQ>P!V)ogCOgPEiQH!`;fxQ&9psj8 zKk}Ftxk`bXvbWBGbcGB|gOU%MNQht{0( zeUR9#QI`WTTORoJ&YAe(`FV}TM7x!$@XTS4GWc&q;zy~$zf35^WCzl#_b-rM-8At$#YVX_J{B0#1CVa^}&su6U~#v zGkHx94Ig}(l>uKKwDXlIm_WPKono! zXjmM#felUR!Egu}I}0|Hye1jljJUZqxV7K9^{TC`Y@|rDD0bGP_{z2Jn%|e8=}8|A z7nB`;V9(9RF*WW>%`C4)Ckj~698>8^c1p8|3UVpw;$NaR5(lkIIa`_^AeSUO>$pJWmvCX2fM;88;;mqAbCI$LJKvzSB^u){xLOeRaP{s(MzN$nT|Z@vzWVXRr9&D zcwOu;y8{;)VQa1tF(bv92Me*jql(=F+10ip-S!Vdy0bV}@>DVo*>m8yWGlzV4OD( z%%zoV?K1SkT717<@5=WZ3XSq+HhQNl7!$Pz*SQU5tx3WjTFNaBdn9Ecex$%Mx7<35 zcCe|3BfoUc{TrjrUL7WIS8oBg{pfJ8^_NeQld6PZ=OjL&XyT&AZYE=6giGZIDmY8o zSt?JVbxR3027;fNI@ErH3|W^p+ZZU^inw9f8XPNZuJC)3Xt}147Tb>05uZJJvUtaW z8i^sbOK4=_!Zdwv7nhl}F~CMs(`Xgkuody4K7^k$kHv>|)e^YOTyMKm6=60mUK36b zRC}E7-KOHyD!uwvpGFE7h=hZ@?Jq>n@= zb9x$667^(PE)~0)5MFU&CLam70jJ36BxB-ud=}AI1{;)*gsmfbTkHfhkKcId%g;AY zjig*(G~Fb1(3Dc|?Qs?qZP;xG#K3-8NKuhEcDQYc8$N2xAulDXn31J1FHLOzzS2|q z8f&qB+aY^vtmMyRoEf*<;d6U8BqWPDyCwsQL$ksdPg%L~zEKK!7&2!}9wN>iE!tPf zR+fZCVuv8CGp0LmCUb5>Se4wx^IO;GE%u8$u1*FngSz70u0iaCm0VAJ18<^%uONbUyImR%eh)B8_=`F`Eakvy(`flUS0<4M@ z>urW?rQ1MvX|+P4vI4)oP|L+U z0dxV88@d@;58R0p$9d^$gd0;R>PV2I9^1_4DGD12`7WfdqCmDkz_(^y1J1UQ7ZaEG z8L!ycUrHfA6wDFCK~a;pFcl%YEzw#;L!2A$c{DJDM_PgwN6@{@US0tx-nde!s6J}eBWVN$WPQexYG5&A zlE{F#8-j&E-pCJzv5EjAQ4>Vujx=?cDvJ`K8}MftfG1%|PG@3-P3HDl01Mtb$2qyM zYoUKTQjKI&-+=Q6Wyd7{Y|aQKGNK!PY=v-0v4y>|z~lv?9pm5-^NqE;@FYe@QHCaecD89>yC^GX)Rd0I}oO_}ecka|6AVc_0#1*6gg#O-8khieK$ zlwX>BwwrPH-~_ltQNb{H{c2=^e%mpt8NrJtHe@$PMAlqPV=%tr_7gTpEE?p~P2BoP zM#hJ-ZaHyGZne4Q+q}3Oa*xH+%UGxUT$MPcMG3n{S;iQ07te%&B~VAlX%(5l4;Ep@ zxw9F>M46JGFW1Z_WCO^{i`-f9HBB|eLM1HHuDwf(G7Jm;+tpf^#)ZnmEC}B_=}S-R zOGUYv6ycask-1riF@$XM{UbAt_-b`ZI5Wga2BrL32EK!yHY9^%uVuAUDR6}BnCyY; zAe7c) zV-a(E6I+Bnxg*wdS`7GSr6v|gSc2{Uy7%h+t(AjO9WbCPyyX}Ma{Gb_OMKDn@ zzlxzsQ9>g-ks%3OTx^If2J~%G+2tNgmvw zLdJYzgG_d!NXiJY*g@P0vXtH*k2^Ymqpd%M+VqM?wyjg z;(e1lo~}`Hv#k}Jh|@ic*&ch&7ZNdS!VYG%{|7Db{vtuc7tY}jQ)Sni1xWOB9F?@e4F7IlS# zVJiYs3clQgmmO!RE^MaU>ExtMVh@x!R!7*BQVQn%x`K1UguiWug>)6~ouaIr-s9xU zHDV%>*nln`@`TN=mVXyUgnpdB8P}FBWM!5IVPtcOz=fEN>1yohxDtBKc1y0o9wTnQ z@ek;|^0BnR9%~#bEm8qE-8Q~*>$agiC*B9=>06~-tk@q$AwLmL3Q?mPb#k*%V-M%p zSPy;@vR}#tV4RF)?sZ_K7CJCKz`6h5$NaF%1uFlFhwoR_k13<5p-5 zBdX*&q`01+`ZV^7i<;P)nr3AgtCSW~(ta_eHv2Y(8kVg1P~wUkvY(h;jFz`D%`V`q zU-|1Nd^beDW<4xO$!!M6?66Fdp!uqIR<_Furu(>5!puNt_XzgW#14nVm0)Of@zq}Q z!~Lg9d?=oRYU;UUi%2H|$(ep_^h^E%BrWKk@^O+kn;Npx8Buwei}jW5rPZz&w~f=Z zP-YI=*V`6wP=PPhBp6OeBkR;h9WAD7ixe3%2hcsbv{aF+2nl6!DrHkpc%^hFow3xc z+>F@bc60#&7$`-Aox*{%1*$UslOwj-FBd|-c0Cu`$bm)T*DaSZ;H_XL^NcviTY~FHj=rO%o5l0egl^@o%MyaQ_GYsI(sk~ zESKU|oR1=cpY3eqOHH~Ztu~L}rtu^>l8{JlvYY{Hq*Op|QbO|CuXs5zErRZwK5^j{ zadKWrMY9mdufcjl?m{)(U_w-ZFjf{ujN28iJSau5t!?SxEaX&j(HGWNM$Ke5S2pd$ zRx)+2vOB|AS;nlQe(Vw$L9#7T3JUwq*BCBvYRtE>RxCziFUaWPL}BU2HkSzPYuszd z8pf*21D?K0vUF5AWYl3c$80HNIiv#PX9P)x%mQBt1@8 zSXw0?`79tm$$kQ=67A?Vu|>^S&3uSVsxm;G<<^y)6>crh5%Fau9h5|@Oq^T$6wIL? zO`rJ+hoxv1UD_@}RUEW*ER#UkMmX?ZkFh9i7PAs~ub-?YuQkMYax*KIMQ*{_lz)$j zGy}jl55yP7M9vn#uJLCm_#3%b}mQ>qe*RB z*Y#;8kN&@gL4I^zKm#eJU=+|+u({M0m9@j+n%HEwVl)gSmnMvxJ-+4=qvrO3Wel*I zFfzE?D|^6JC4ACu#DVx7Uy@}eF^(G@U|U3xA_;P4jb|Y{iIYUOWIGr?Lpsme zkqYajJVi4M{8CJ!W|P>-b=yWxfHw6I6rF;ANH90UcA@*wjCAJsL^BS7Yz_guJDV6j zNyNj9m%9KySD_}^Glg<2@!pu*8|3dnRk+!L(h=F{gux18+Hclj=_%YKbyIF8ON4-B zA`WKx)aJ*rAw4c53CWU!AdaAg%Q_4djFl!zb8J%sav*KroC*p{qmGZl$P3M8`-(_- z#YsbtUePis{eShrWEUCASS0jls*8FC^UO=)tXM^V@c<($)!8LQx8W>l70-W)=1O!x)gX)@aVG=Q|gOjAST zTZUJJJo`kg#-A5c2+DiU5v~4knhX%jC5l5%MRKl z3TaQ2C#3CZ?%=xxWhj@I)1_1!RtfBQ=ui-pL`G+cIE-YFW1Yfc^?dHqiIl}g70ILo z%%IYOY<_LX47ZrTPC2%QLOC#9+=v+V1M&oIk^20&67dWW$bmAq-NpNYZMa)fIOYYG zfYH01!X6a@F)C`!WS%DEr+cn!E3OeJCq>C~GNm6#1Q942Ll* z;V-9oEH~lMHAcB4YPW`V4hF!oz$#}==66Y3W#)(d9w;A6*79Tuvdx(8%?B|ZCYB>} zE2op3wsKJRBMFjod-3Z9tRy3$uN>PboLs=xv{4s3viKF-%IQ3=97JcbpGI)ApneZj zR1Zf8HCdu#5;JBExXYA6+Q~lWiDYYpK|qgDYOXzQHoX^{(3Zwzs52h2@TQEKB%k#c zU!c=HjLLF3U3%mn6D(X05rzx!@+5L{a`#yS<`C={VwtmNnbZ2cB{50EGF)< zepwQdyfi-%mpQZl13o%d~Qdp>^9;yTZF7Oia@m|D0W_$?Mz zuLp6$hnS0Lx5Bk$lW8C_YaR@s+))T7EfI!%cx3~GDQ=;}Aw`u|I^-!@w$U z0>T}oBA|&j{O&UA^C%uP z3XUs)d2yFlS{Ir>`ym|`%_b_Ob<7o~#Lag9oiAQ5%eQ0>X8F*yI482C&>`8!qF?Gm zx#gAeWNNIPW;d29s<6Z@#3gvw%#g*yMdeZV3!85AUzwcw zNn?3=9@~IW!0&E)XUiB51X@N;m}_z6bxHO~iu+rih^L&w%EoNTxm$db`@ zjky9$@?!Y59;=L;=&dA=5ep7}Cd|5WT$b%)cYsOo)~41n4_&g_Sh+h&(dZ!&JH=-n z4!lB`B)GSN)n=x>6o;vKt_E;~nT0Ht>>kg|_J$EenZ~&TH0d`1^)bB>_6jF3jXU-@ z7(;`$#g+<!?8B8V4FQG;S5@O6WO|>>uV?Z zeP7G!6V14rIBD()r;inhqpZsyv{qO{;RYJX+7L7$wMRQBT*`5KPp8$IwyQLpLo%gY zMh-dC#+r7%7(Y91a#i;(VS0RzLM~*PQ0fHoQ=DdN`CcIxE+4T{Mxnz3iV0()F3W^U zwkCQ11JPh19?AE11y$0>ASA*<%EC%^g^Ir;*=MbmvdHM@79Ct<9Tq32hedLexvK1j zNN?{p5E^o@Vt|A~_i%%!{L6!qHNbU5npO2j$r+Rly!OF#k#)AX1DXHN)nOs4KpnA7 zR;O%v_d`j_n#%$CsZ5+rYWi1hg*n{zjg=wgYY*8y&Inh|% z^>awRFw#8PPGeerL142mZJch7CS|~KcUYJ-4!o9+K&sN8aT4OkaBS^^iYXBuEEu8r z((tjC!!7eV}#X$%EvH}OUaMCxp0`e$p7V$P(J{iG3dv>yt|uPBtSPY}UDapn!(*~3anZ*ZaalyI5&V#uYQM4U1eMwaQWWU!S&1Qf;1>db2jqa@do z#$P5B*zHAJH*7Uh74#PHgW6@zRCc(ZE7FbbEaDiZYZFHXa5f)uCMG^Hr>sM5$C%jM z>f^hH7oAzXGNs%>LYM$P5v~jJfKHqx@Y{((vik)9_AVI}dR1e{W9qOdiN;H2#F%0y zSjNoivcWYEZW=-W+)}()obE-~J|va7)-c|TVqg!mxpcP0evi_6=F)i7IY^2;c#Gvh z$lUaBVPM{kXl9jFxiUp!LON?u-gVCzv`YZI9?9>z0&~F5=N()|{>XQjyv_C- z+??pF=dGYdm!xgN=R{P*1DZbfPPZ<8NSXb1Wm7ta`V}{E{4L1-U@;eo7!p(|!kfe> ztrTYpn<6uUu}Osczqy;G>%Z)TUYtx33u0gq42h_#85G7(Yy;Njk}=*;gEFzp?TM`A z&=!donz-M}l@N1MkQigPh|(6Q$vWd|^0B)L)(@ZQ(yxxm2VL#zg{iomzy%X+LjG_m zT?F=9J9yEpjJ3IY=s)?vk~M=dvLE?O&TI8%Lz{7h9=Ib5dLmI~Xh+sUB&Fdl$2d_w zWR_W9mT446b~4FaGCGEz9s4f5Mc@{(;E#>5zs8!#*s!D5Tvus9m8KM#XWA5@`2?te z_v!m8vT(Jw^FV3PE-mp~a3@C5T+4j(J)73}#tj?SU9n|stU2Bovws^~mp5?JzEKSZ zgTz5cqZ zwl>zUU3WQ4YNFG!XZDVGIy;6q+EhU}Ao+TB9ZI?8gT=U9F*<7Ve7iuSX4i}gmD#M0 zJL)j8WxwoaiTy+4!22>cP|O1g&9==vnR2LjO2sp>4Rwwy$o7}X0WM@jD3@ArXOvOq z4t|BwHk=_1Lt;B?vN^e8f<4y;Yew3_g&_mFrJ^%8$?Sss)#{$4QMTY8bDT^M{H?`xlvkWZwWj46_B%F9A66bf5IyBK5}o=MJ^=DV5kF` zx58;Hy>JWL;s3aOhLy83={}&uerXRbABoG3;25!W28yIX|4fVGhwEuM@WQCP|Ry;wf>nUE6!IZx1972{d-)TfkB*nxbC6`BO_saxG&Pk2yZn**E4{;8E)h-LTCEXorb@2zDDD%@HB?=7E zD{n8YHII*RA(Ep@6EIs}ang!iRUjpsnbHaIb(Z85MNGcE?$`Ms)M4@yf#kF&C6?i( zK`+)GkIF4IYG_Sm{2W2JjQOhz1^%@ihq4V>UMrjr z-7L}dXoQT4&A!F<^iW&i6XfS0GHE}(z?Xeivj(&73@@#Uqs;d`_&@3Ux|PKLlKxme zWfFCg1+XscASpSe(O9xs*}QS6$2tFm1gMJeOr&Lf&y^fC9(!B%$#n;0Dw!~rtI+{^ z-9(4yMN5E4CmQwYx4}oJoRG$z{BhmMO@2V6Q0r(3I^sb z_O|{yaINJf~ zXJ;yF#7fBw-Zef|%SnP|yk=?$)(VUHf_DjtbRGL8>ZzrsIdBLc-!W{+d3i?Si@pcs ztAj=!O>H5YWS`4(&w2@`1arn5Z!E{~ej+C4!0&)Q567l&LY0@zpSG8p=+#_>g zS6c$%o0cq>=;{d~#SG$|Q$yo0zKO#G&RaBEd<|w~&lR1gPX%%=Swf$?M39mq4p4X}%cU#}QIBMwhcFkSFz_Oh`oD>SRu zGo@S^5tOHCY!=pu(FmzpajqlOVh8s%%p!7TeRI|_yWT8olO;TA$Y&w;7wx=7%F+*? zLQ!#Uq_Q}qk%i*3=polTT2Dg5IxhWbtJgfr?q0C&2!Y`pONIsb!#rD*u zM;8`0T6XmX3u(w%-kT4nMn_i!IT|?LCI}H=%pc6l$YY??yz~uw?ISCKW%u$ zTCuu0p5(N!bhUApY^ugxGYSd|M+&7@w94#3qz9I@B!kK5pyaPK(z<~f%NBys%D@og z)~FfTLt_sXT z_KYzZX0TDz=Ly><9;(dU;^ZR$)WV5vuw*guI8%Ad$$62rXV!Vvf0{J3H7f!Ju_SEA zr8&^z7QZKc4u3vol?H)Xxb`B?teAlF`-93g9`;_cnb5L@jw>3WHnoYNIbAy7Z4)VF zX2r`TVSW-GN&@s+jAO|%a}yrI4!^uW%EQe9$M_9BcFmxHxy~ja0$^B@l6gO>N64eSuG$t*IR&HhvzQRTt&K_(l;#1u=eEVBv6z4`D!O!oTT@es`IH=50O=)&X|VC&CX3-lBqO{{Oemg84wxYT6%saAQz8YcT z*ir$v$xh~^n4iU%qZ0_B0)}<1_8Vnk{WsnWut?H%*e^moDtbmDzY*^2?6nv$DBluT@-7Fs{}N zi)SmC65THw8_@x2;9h)V{F$gVjbRWrwI8M}fY zb4sEUkuFzS4?YpjOUZ_+2@PkdED%%j4P^~CR+;ANaT!jSZ-1%}@cU3`1Z~`^resfw ztDFksqHMZ-!7sDZg10E=a1|b+#zMj>A!{}B!Eb*}|~xW*(lIC2K5%{fojLZ}&99j3i}rRU;`!}Z#s0r-J+ zls%!%U#*uEk;Rgv>-;j|H%W)wGb2+XUs1mjRZ6|g&lHhk`QR@0*6tB{(v(Y>b8c#} zt4Z%=?sv)1+2PW%ZG{stm+-lF#U4zEqs)*nip$li`{J2&uu0G9Zvw_N9pd+;K{>?c zvb^H5Z<58KTtvy3<#i3DfsLfsYvL499Mkfkf^YBm2v{)IEb@i< z-I5(D$8=jbE(JFQRu%_ba*2C_Lkk2In$ewXg1Q3FLgG~!hbT~zerXCrSxI_YYte1# zinNH6{7AHdyvIsYNXGe`Uix5=4TIjo zu;ig3=D+Y@zg$8(WQJk{4yx0Y$qT1hqJMI8Z6l}AO+P;yMvGRradT{w)ih-+Jd75D zWPhxWu}`217>b<353Yq%O2$jwaEYKhpi0)luX1&9&Keikz*n^&sZ=_7zMPCpaJV63 z2p68{kF{;egU{UB9MU!THx}NCU$~fT zU_SL^lWd8}s^+alF^}GBbNaI@0V*x|#xFH)+M@Qi;?QZSp})MS}V)1}I^Cewl*Vt!}M3NzT))csVCHyEp|%wkFf zXq;r;Xd-fErRHndrpLvgtIbfal@w*RikZ)xKMlyF6j?;nLdWKqQXzfw$22(^Mxr4wy4!tJFrD7#QRQB4~ zMR%i*Bc_Otc!~${`7<>T21u(MUb?E*%!r_)mMvXU(~rKM^O+0t&)7t>L6PsN$gGE~ zTOkd33ackw-|h@mVMn_oU})qSQya@riwB*3{Z?MVkBiz531DFM6Uyw2w?sSLM1yv2 zlO>io*sMWD*5-GQ+|QF-F~gqq(qcB|Did2x^=JGZk|^1Rv<9TYk%LEHhII++Ag>1# zhO{005^r2a%t^JBy$De!`@ynbE2D4XXIh3muw)~OpcoW2D`~N3$WK|zhCWAC^_w>)Yz#sl$y871(GQ%qmau|6HQhl76*RkoR#Es zmSim-R_xK-JxQGzT1o1Z$77mP_Os0uKCsTzBz72(*_>HNZ5X^Yiv7$~c^GxZ(rLQ9 zP6|{+&N6$ZRIb@}de&5_{yYgia@0(rGUm+Y%TkgKE__PZTCN!Fwq|pA6x-!>C$MUC z`mfX*k(~DBFU*ReWEe2du4>8gg+vdC83eCA>@qY-xwACvs(@nVkGb8HZ#|Txw2YN9 zNMasfx)_R93Takft;x(v!{eULa>lTalr_a_g=7pnm!c>1iKItZ%_1q|9BGTs)Eg_K zTg#Livl>SP|00TB`BfD0by{kY2xXuKQzxn%&yfvU-PSd*D_mh z@zax`Aw61`UB;fw0O~&STTHm9nM!Di(g^`G%|}oq?7nggtVr_0Z4-pGlV@8l3r0PY zfkLBav74@2EbA+Sb(KY9OT08mQn$GV*@fz=;8-JB$a0mqB|kaRJa-xEtI_O#yF@J$ z8`Wi59=}R~NmKb|DD$VADk2U52=vb8x9bKtf&Z@-4F6yToYmM!GN+RAD2pd~ zS8+Zo!Dbs*#8himhuf{FR@P4PDikS+4IlN|7Gq)B5t64XOU$y z=p&&AM`mV+t(bgaXI$YYu+qMsjyL9QP-|xO+w?>#8h@!O)h6X5p@*w$my=meNwISJ zb-1eT@;m4>PLst+o6^p$>5tAuY34V1w! zKB6AZf7oc=e(J%`d=wCkBeR>mk#hSY)Aposuy45r!RWOsUljl~T3968zt(MU?Zpfk zlAh}@Wc`-yaY@#M>t0@sR*^7K0+Tb{*xRg~B#Nh&DB=sO@-h|yejpxK{nhL$+>D)4 zrgGj7sQ@Wq_lgenUW+uGz$9Kk9n%WZ9-;q~v6c4tAd1tundtZeT>46vO`?hs*?gXt zg9^Z#d5Sg2Y3_pGX;`u#xqYbj&J$ou+_cge&V{K;JyxcUNVK}?0L(PyP^XQ9HS)Ab zC8|8k=DMOx>2l`86!p8+aD^3AO|r^lZqu-eISNglWS?F^h453#)6_#7cS&TV(=Qxr zF0)XF?fxaVC0jk#72M>KC70wHfFsA-qoQg~ej_QjvyC>e34;+Zvm-<7Mhutg=|_7@ zyETHv$swCsgfWU^N4li8ELmEd-VGB19Co=NR4d4{0}h29HaMMI3OHOA`TCM4o&KoqC7HEByB2+ZKKU!lqz@+n9b+ejfBSwM@uDK$qm z+r|t6B-WNcwt=dtyfHDE9aY8*@>p;-?g%B!aMcZs5%hx|cZV!HB0+y=NVGc#(KaDb z%9vHQYaM5=OBS@5&klkxIG~v*oy+_dYG?a0HC~)+zhxOS2xJ&)n~ZWN zSM)e64=e^FG`nu~89$gs24ezL?|`v1MA}>FfD>1*OF6_)^EE8jfMMb!kbJjd)F!ma zw-E>8sh!g6sNc_rSLkP}QPdt{t6Tubq{>VS?zPv;^<;$QNb^l5iB)fiQoQ0YW%FVV zkS(vASP*P!a|7!h#5JzXb#UHRnlo8SWK~E$&H{cvF8#P6>;FDzf4Gt#(FH_1P?BEQ7Aw zJ6NW;@=&`UzRY-Eti6z&Ox%D{{yY}FII+0hva@e~L3gi4cgsO$O?n2GcmTHyqHi2l zgf}R@%D!9v7M8~7v->0{18xxe&0%9Gw+h`O5(Sf}3Kn%XNd&ccY;-Kw9Ho$yQ8b4O z@Ama=ctb11L_m1;mB!tzZrfYww~<_PnEbAW`tnWgyh2b#Ln)nU0<6dur{yHtm4i%5 zY5eq_#!bp^+lpyM8Ujn_1aiL@BQH$rjc|ED2yt2U2bnav;o*e^Qs&3eJYYV476;9p50hVEsSq4USR-$Peo-U)Tt-=_Bzii@yH*)011|{v4N?~%C zabCQM{|!+UBVn3a=?42`RL^YXa%CiYQ1e|KV$p_AG+-k` zikEhDtSy#xKCnfhblb9xQWbDrIW_rGPDsGz4>HM+8&=A`7)zVgo3-VdbX`dW6A`d9 zc}$z_Rn3@mq+-Nv4|e08Ug1WBn+@sy7n{16rF zhKw|N+_ruz$(g0(8TF%uOhK(4bE+gRlv5vkUe@PX5@nvGR)F;Y3=iYUwuvl>yEEDX zP1>1WS#lYZ@Qj;RN#b(CaLsW1q;-VJ%@9nYHg+Y^bqFd1v6-x!R!BzNp~!&ZytYo$ zMwW?5lKm@d9lK zXiEL^LB`OS99@M~s!2rJlmJZ|Cv(W_gDH*jT$uTJ^^3yr4mf1Dq)B&;s$;9+*nMcspe>xcbVBuh&;G!KNwKA zartw4%Z-!r)9%XN@!EHKQWO0pqW_91BOBr4=g02VdVAZ?`5@y}L^ zo;$@jbZ0iuDSjA=s3?noAM@+9!19HhRgpw2CGU_c2G&z`nXy{(y(LB!x7!Bsh)W(s zrRu5aJfa3p2iM?-$b%h|8t~Lum`16tS6m-SYk~zlThj1oM zkrA+m0(PWjs@vzJq;$rjHi@DErGRY%@Mp`0ga>Dr3{p<63rJSaN<=1i26Hz%XK=T4 z^BehN|E21J)wX!^XtWQ=WIy&jm9R9kjEj;DmZ`m_hx{l=lcwur3m4J$oAy z%t6+s(dZ%y(r+7@y~q}g1s!<%at|63#11Y z9X8eCcipVF7LLFxCVQf%{GB0NT0H)VTUo8j%%VtcLaC5ZiECSyHFo#o0{J{AD z;!4XD7H4Ob!bS+Gf`N!A$5odm1dhw*y?NhvH%_DA!0k8l=KbEEo!vta^o;~nXN@eJ zuj2Kp{PUmkJNf%YdMW!P7EpdG=*s#|=no?I9?vAgpnUoeY43qes8g_0`Z9Vaguf`xhVP==XPX6z@ZBTa?;0Qr^UE@oc zt`P7E7|)O@GIZEyQ5~dbXvbMtRH6gRwmq2TMaz**Nk~GKY8}Q z27b=m+}5ylNUhKI_;H!W{711VF<@>koj0EP6n2W%8jcUL2>Au@)Ygm8+qqFJshbg> ztyz9*sr2|p0CF^LNBq*xh~J{d{&D>~;CY@^@YLF()x&&oy#0tDJvR?(oG)H~7G68# z`A#>-e5&cD#o>8*qg=SA9*RvnCZB*$?#Lers~wV0!Kb(Ig7|SP*O1S^XW*T+1MlAX z)9_U$`s^`();1t(TmLQGe%?3s&2u;tHq4)Nj88h|@r4JAgygB;BfgOv-^h_6dI88$ ze@1+(_{3*w6)nyd-e08eKL1=_%0y$a|7ykfYQ^|HZUA844{u3IYOHcB7W$EonX}{>P|^6(y*y2E8SckY0+YN*+J2 zlJ}s1>7K7e@$%NlbMaNZ7fH9`J!3w~kxNm2B-qjLp`=+}4p zF{8Q)UXcdVdon-1{XhS;fnx~r3s=5N4Vh70p|(+m3OJn}d5G>ND)*}0uo;ntC$b*h zk=-I|8xK@1Rd1ioDBrbYLAeZtFz^zizKF8ybE zsMJxBhQo2z)_rZ2?$Z8|t?aM$F0sDE3x>_!JtE1tJHoiDd_>nK1!a0iI}CetRMfm` zMg)0Al>?-3WOP)w5>%YoMk_~zQQK!kRiL8SB8({Gpv{Pse$~qfI)QN6fC3>z=KFV$wGmY|&r|Om}+n|T9WO>6FV)XA_vPW;jc=fL6 zD9@56tCk(Nmoyy5n|q9?vJsJuA{IO2J+Zruf>yJuHhA1o6cr!oD-}7QZUw_rs!AFA zIvXiDb7ObUEC;!K`N&y@BXVh-@m-8Uqfu?+9-~#+5=NPr*3PyzvOU!q6(~B|W{)-; z(fgu|s3AsVw^_#VX3+)lDfQ@KblH-#=n`eb&$oFSH9BpSompyTIftXl!3D+;4?P*X z(&MOTca$FMiK^r<>PAF$@p#JnBBSV?=*wk%Mp?VBoKeMy@{rAKt)rf?yX$w0azsZL zCOzXRTee)o{J`u)}#u58k&NW{3#aEqcn;YrqBHL?}!|+v@+o-$8vxMBh?uarR z`=Uu1BO372qr$>6QG>S|k&&&-?VmBCf5iSJvp(ulGTK;oB#Pooqlo(=z0ruD6E3q=7YebCED2iHwhcu0-P%d(29jbHtml1}y z{+zjy>z78as!*|q$7Amj6H#I#xuwTZrAmcpdqwhxiX|O}J)%Oya&q2i8`(OlVx=Fp zERC48)LypFEYaTW5k@Jy(Yt|&1v81BA(}-rhiER5NDGJ-5-lQHLPXMxHAF8Gy+rgf z(JMr2iPjOlMkLY(qSxhL{LdTs`%SuTA<8Fun`j5oPNLmJBE3(vNB(6Pd+EB5Xg|>b zqJu=A5*;BrO7sQMmqf>jP7sOoHPKn3Z;8Gq`jO~7(FLMQL|2J^CGr!A^gGcFqMJmw zh;9?zA^Mj{r2oV}5u)AgLHk!g15up9dPYP*GGuD5Oo9A1J|B(?M>8&s4uX7 zbnQm9C(W68oiJl-DO%zWwmPn)|y1IyxiN+D75{Z;X*L0#xqKQN~ zM7czhh$a(>lt@5dYkB7qMby$iS`hQw3n_0L?01-OmvXw6QWOvJ|hz82wguX z`U3YS==wF$H$>-%z9agc=m(gm$gufkhrATRXCF)MplSriA zbnQdbmuLX6LAW~UI+$n((NLmcM2`}w^f>)J68EF%8b_2sltknr8b_2$G@fVzQ96-G z8FbAgnn;vQltYwDlt(m$NTes}I*sTlA`h^cbe)aA=g{?8qIpE~i53ufiIx$Gw4AOh zh*skMMY{Tk))Ku&w1H?N(VIkDh(y|o>o&S>CwhzMZK8LG-X+>WB+@Rr?k0MlXb;hc zMEi&i5Pd@Q8PPGKuZWHlogg|%^fl2LqH{zdeMi?Hi7pUbB)UW-(q&wKrK_Ll8t#9m z>z_n7iEb0!A^MBxZ=!#R{v(PgVHhQdqKHZpl_9!|NTj>zO5LMTo~Q!ReMA+BDic*F z66pcD)*`AyRF9|uQ4^wOL?Sh(YfGXwL=OUMN7q=Q4n&=RJwjIpQBR^iME!^c5IKnk z6AdSNjOcNqkwhXrLDx}4V~7%n#u6nFsgz8APaw)9aua0}64 zkKgIGvRyNK$-)OW=KeAL-|-K3i0iX7_WQ11l^W6Xg{o@?m%KJI@0Gh^mriZpCH>6o zBZo5@oNu^j#Qd#~uAKPpvnTRzFKp0%!)Kl9e1G4l&PT8AuDbU6hd;N?ulL#mkDZ)7 zYSrPYe=Yf|b<&Wr$44&w`u&eud~s^j&W62Te)P>>?sA@8GswN?=~~TSvERxr_xirs z=jJ?CW8Rg^H(y)#_}}q+o;_OP`RC5`+_mu9J=>zzcG~;IgN=9fAJ-u@_Q27-zf72R z^v4mU{_<};^Kt&Usr#MZWxn&-%+9Yp^2Wu#3LZ|bn9#B4M$=Qf6QU0eFy z`sz1!=ij=72vYe^mL~F*WB#_S-k%&rOrREM4>d6La%ge*X47jbdi(+hMHU<2#dJ zMD|R6ZD_Z716@bl>2BMr}KqnFCTPH8N7N#+=)xue*C0v zo#(5M|FpxuwYn^M{k|&i_PAKRWS`W(f1divALn*8xmxYd4o^(mQS_SsMw59bYOdMv z*r=Xm>c$_bQbTdt=#|y4@Ql`(Iw#_U9H4 z973nv=nvO%N7Wpm?>)2#)R(jrx z&;5GjrxzPtShKa-I`=(uPJDfQ?mf0y|0XX=+PD0vw%yA7+;NKmtbtttZ;q?LYHs-wMh->Xz^y3>_TP?r%K-M1<&OJD! z%n$Wn`S|B9m%P2_%-$NYZ++6GTdlHZ|M*6S84KS`x@SfHyvE1=sI+d&lgEC!RAb1# zar-I``0Zwu^sGX1W+xO(fJEuZ(<-zhp_!qvBW9%wRn{vKOStKW`K zzP+*iJD(hhT~_hEocI6f^KhGcR$RS%*OrMFUN~~>c8?l9=kk#SRXXgbKYBs^x7Hl( zT;lYR9rvABwKt{W-t*slR59oF*bQA*bnS8C%Jyl|U8h!_RoLd!s9$=G|E~P#qmzam zY~SYQjpTzFgVP@0Ieo^iy`x>9jGT9U#G^&0f2d_UTW`&#_~XltEnV1n(d3u9+RHtW z{)s0$>*duIdsJ&yBeiqJnspUEUskc!(3HRbda7Be^@&f8jcKM=T|G=ZCiTbuU~t*)?xS3*cJ;*zEZPf<2xTTD7A6i>XJWIdvoQJU61Z9-)McO=x&*t zy89o${a&@oP3ONH_sgLgUp@TquP0p{qP*^3TCR>+T*lSC!^(&DIYxiFy~sb@`_p^l ze|xh;wO7;XTs)97^~vc)d)hA<>Mz;(_Qk`0#e19Q^z?NvIQ{JAqaR%Ez3Hoj+$-rn z-s$=L@kUR~SU>Tt_VpL-T=MUO+b%aRwdi)i+?yvpnw!@uwePBgDy@IpcItuZjiWZd zJL2iJbyD~KHtN0-TgvQTIQ^NwnjZNn|1tW`PyEsOSikw zFK*cAr;o0A^w!}om!(b{zO7Eg@@1P6zW;Pv$H+2$Z=TpuwqK=pmK>e+N6U&Av#Rvn z?|f?I`D2|s#uuKOnA2!M`|*3yJI9q69&vq0%7x1lW<2`AgyC`5W}d8G`j-cPf1~;* zM$@ZpJFXeqWzUfwadmwEG%q#u+Smy{KR@ZYgHOG3-e1(^Qrg$=-~Uj?r6%kCn6}}} zlJvm?BSxIqS}t|Pyl*bY|F`6!H(t5k!WqBszx{)@jA_*->GS9k)0#gp^67f^`}NH;a z!|keN=P!vl>%#Qv<)ZKEy7cEVj=a16v@IT5V&{{yO1*vawOVIeWvBmLcl@dJ=!xwjChpAp_JRKU+Bayo^U_!AFZ}lJsz2{fUia+y5tR={-}}|J=XyTn zpZ{#r-7%Z?d|htjn0AK`l)qSH9DKR|*#n=SsxslX@wOG!ZZvuBp(fA&{^fh!E_S%P zY0hU$?!LEbuVo4Gsns7}?R-A3+}5#<^{J;0K2^QOy-&5RR(sEr4_9%`t$!&4UBKJ(#~{&fxwc;n4$1GiMI+4k8H?|j>NO>F7aC!5T==pOLH){nA# zmf4aX6M6sc=|#_6`=j+|O&53BJ#xbP8Tntfz41@NL&KxKwci+Awq|bK#Y6Aew08A` z7q6CBSnA2SPv=zZ_UVU@rL5_@>hgE(=ekzEQMOI?p~7^F#YM1ik^+D4fKl|zEs#iXF zt=8I!uYUPg|McU|Dl^DBrCGP3CO(RC@jh`Ca?M{i~vf z{kdgK#P&CfI{qFr563?=BxTz}t*>wI zRCRoZ@4kQI#>4xYzn8fzYkS#a_5SPo*e^M=w)TGS+vZ2^tL`1z>`J?T-(T@n)hb_~ zng8E!@f|*1``tQY$%Kuan{;2bXi#3#<(4_q8xQ&L&-iA$QmU7~=j5I1>l-E7u6qxB zIBVt0^{(#vXb)XiZF*9@k1k}o(}xdE zDco53*!tei(owCq#NJpi^ns_BBrGO>-SOosO|JCUoF(IzPkW`+KR?bHa(iLo zd;69SJ$T~XYZquH|JmgqN8fxp`H7k@f77F?^Ys=tHh$D8r{l>RHx2*8_m?evui~T; zTPk!s(L6WzaHoGRo%*3pY}KBn_C5M*t6rD9bvONfC-43)Wgl78`NGEgM&>$RJ<(%P z`Il>WKO5@pvwM>5{Yn`>cYo^BCH)&GpN$!rxN?K5=Y&}$Hzh6lwNGj=a!z(Ve&ET%7Rb_U!2$7Iyvc{XPj**C(yNJFfqR zfj39rv>z{MUTNYOcc))fMS9Aj zuJ4t&n6&V~jms+vQY*LFytCyGSJIvTJd^nH!ZUMHr`+x8|MK40O|QR_SgmmF9}B!2 zw@&@*k?sfc7X3LWe}`S`rYvihIQ#rp?dv@H!ia<4j9i)h(ZQ$ZUMZhlcjdV%tB($QYsvV`bFLpA zD)F}cjlFA9|2}YG(ZWxcj5%3YzP^9U_3Lx~Xq(Vx$cx{%+2#7;)U1I^|7r7D?OrF= zwx8Sf;pSDRd=gV}yZ6G5`wHszJ@<7&xu4hUNVs`V=Rdb>&4_eue)FxTFGrQSaenUf zXZO}0F}U!#=;yzGsdeYwy=VL#Kl+Q0i~ij)|C8KXZzf;gaCq%A&vcHg_+-;+6Q@M( zn|P$b_4%7qAIW_+>-6B?4|yEZ3L2&EbJlF&eV||L^)0Xe`uG$528}uLS=5~^Z>P>( zGHFfWhZ9aNulrc<`Z))8v`m~B`O4}suZ)^J-j#RPhb60d$|OGjQRd>$Z*+TW>4-xU z$N&9eiJCJvW#(NPcdCEF<=-p2hHr8wm-y(?!NImC+Mk{{;(-Z66KZuF(yPqnuYS8{ zU4_Fxwk$bk$unmkzyDg##^3jJl&$%DyCbbubh}h?(%)ZhYq)sg@=qUna?Xp(7Cn9b zx0m`|8s6-=FZP#Qy?5CY=cBI}&O;Y!e!G2l#OCyigE~F!-`Zp1z}64ve>2d(F7sTK zdgVsddh@Y4{kP9>fA-$yrlsU0FU&uQZD_6@;+a@;4TWDHMDzO){Oj%w&0nu=Xnf;< z(0Izjq4AtDq47z5LgN)$g~mJA4vl{o6B@61PiTBp7`tVL;qOm2vxl(T_AvbW>xa%a zK8&6d!sv5XrO-CI3mn?L>MK>-3@c+k~mdcf;^M zI54!Fufp)3D;=7@B(<7Q`g9LtpD)7H%auBz<+#JNm+Ub0STBqnj)(CRDpp84{}IOD z^24;pZ`*~|zsmig@lV3YFI_G)|6R_|xDlqjFNBE$r^DF!k1+MVpl;}VCxnsHt7K^Y z24Twk)dQjVld6Tr?@(L~~LQgIp2hllNd%Ha>I~z z7!}5zqr=GA8K(WFkw26VVdt;I^a}|MLfiAPF!?5j@wX?!$e9!-?oA9Mzg8G~UZFCD z^1}*Y{3j!f|6d6cx9@HkTK|;Gm-gjke_h6isX`qtB|7^d(@7a0 zh(C)OAf*JV50Oexa1e65&z6z*t>wS8m)neS-x&4@j{O1w?x_} z<3<@Heh)c3B^>WFexwdh*vDC#?QoxbN_)SkFFWc>*`Z@|=wFZRus)Js*b3Z#h3$VA zyT4{R4Pdv1cE%mAbG>lxv~yg9ubhxiX=Df;gVuPANvZ{XB6=D@XvxttpCrDv)#`8Mf;hbhW9e{f}b1HSwm&# zHySg4j3?Osv*mcQj8Txw{JkM(CHx^KJy_1`)R2Xq-db$Q=fK~b%r0=-A&wj3Opr+V z@c*LUgXP?dd>vWA_=_^GmNE{tWdRUlynuW?$d|1_XNgc=8_Ju{*&1KSaR{}S>Rd14 zERslldqMw^>?dlUJ{RrIKAHKI-Lf69+pEmK5cW@kA9}_x=V>XO&bZ0(a~Z?)KFjF_ zL4Q_ZIr)1S7z6&U)R3j!CbB<_hMx8NGw%MA^W6ac(o}H4?^woi1_1B&2;_8UIR}78 zAYaE0=I5srr^#)E9OGlgRXzR;f3thpPsI5Vkvgb&_&ej`Y??@opuatuB|i)N5aPdY zILqI~?8Y~8-G=-`>qla`vOeCaEQhK?rV-G`c$91WMaXYYY6$)P@f>G{gZ~G}i4g-c zO6m;PVpXmd!E#EYA2HC6u=mp0pWZCrIgaJrLcRl4oNUH8myXW#G=n{h*gkcj&%4mm zzM3V^r}36ZH=w6u6_;0>B@!vF1tYA4;fX^lcgdK_y&-pDnGtz}| zM;^+j`kjV^NDUB+-nvi_@q??V5ZzmMf~gq+=VSx(ITY)@r}G*#Xz ztjP%Q|J?_AzQ_4)g8q}LGG6czOGrb$d6gM=zRftX$>e^Bao=aGk2vEe(pLi+kAIr` zi)R@&?jbd#pR8rO%?17~;)7!~%NOSWMe=q9|5GggZC2Nqj`5FCn;H(K7hvf1(9`=4 z%XwKorTE{0<>bH2{QH5o>IZxt>p2nlZ8D?K(|&~Y{0z8b5aW)S%&+3cJB=9kOyT<4 z2>$Wy8INDe`NjdC4g1^P;R10kbf%U3QRM4;j1-_G&bNtVSM8-K<6Rgw{%VMP+i<@B z!fp?AXT0bX+pP-lWW<5^IxOc5 z#Pi0$%d2*Mgzew}KE4t3PiFZ?fp2TUxZTE%oC5p>#6vs$MA><99q6-+? z+b~ANK+Yu2_j%w0AwNHv{YUjLa}j@RFL1u=!Jm$H;r@gz_AXb0(G31j)Q#=m1pG~? z{)PTtF_EOixzIUk6@MOOzv6%CY-n%j>0-gEf4{#a)ef5rb5;)d-Y%jc(bwss)% z7ffe6tbjfqv|k(McdRX)8E(P+F(p|-FW5P$7vn{PSfL^m?zEjhuE#!MKPf`3$ z;kRy#AJn+IFY>iR4w}0$rX9=oqFpROzWZPYJLU^yE}52ghdx**QTe_A{`|kW<&FUV ztftH#bCUf*eA^?^uKtWWhOyr&`~Qgk$n!VXS7~N9YGQn7Xmay%gT$dZFb4nIhn~`G;B0-N1X*V>ynx><{9b z3z1^$Gw$ig_(X<{{&wKd(+&Ix{Kt*)v(ob-#!LA{?8)`vSFN1lbKQ!@t<$8KC4B%n z@tT}g7(dvWu|E8-VYH|V{bSjG#5ZvwjX`_&ujdL;`h039xzUpR$xRC4w_z2;aDLwTK;@2h#)*OZaSH-0?(XAStX0e>qP&T`ba=oqOj+v7;KkMiex5Vsxh zbCyQmB-Lhqe**jA1nAR-+)v0U+Rm2w33y~z#tWZh|DOk00x<{m`yQc4j=kE|+U1o5OgUUKjlCd}eG0zv>Bp_U+_)|CnDhCc*yk zR~aC4$<($Q%W-P!VC@?+9+SrWjUhj|6ZDB>JQn!Zq=wMP){ylP-^qXF+#~uLxW@;e94jyeizg;8X z9k^Z$*ymPl#`BZdKC0h5N!iKz-Oc)oZ(T+56Pv&t3s`@c)7aFHaVOf*6lOPGft>hV zEaz_I`&SF_W4@!><5FT1@_lyZC-;*n7WH2EFZ*pa^w|dg@oD|Sd{yM04|2~#89eC+J&@+quWHHLMxjy6h*ta?b{z_DlVfen@56d#FX*2LJJ=Ih zPnJgVVdui(?4PT_pM~+WZztzi5q673{CAw?aw&Zpz;3>U!FYQI>*LVY3E$|5a$#Rj z^)Fr8F&>X`I5i)c%96sOzG5mf=PSU6pk8d+y3i=ttq68o3I6X9Zw>4>B?9-t&kMD6 z*DYi~>2G7$Zfc$3Ys??>pJu=ELQZxM=J(fSejoh&ILcMfob9s={EJ#Je^D8(@rC4< zB0Yol@CQHki%R2yi#`k4?d>B`#I6nvV?nS*T{7-sMl*_)8?ejY1yg`9Q z;7)D4+JUkYxbHB>ZB?$(;CFw_V=a%UaR*?T9CKtcRm|jbEBEzaJZY)J@1#uRi1Pn1@ogBGaq28IM6fMd41S`qde? zPhk5Dhn~+uPa~Bz*#`bCWN>N!JZ?bZw+%#k4*prxm+iKRVdEW)GxJxl#pa;iMfW7- z_!y_`WEzeBD87j6_btdTfqJo*XaCs+{&MhVC-yrQ1K;3a`OZYvM~zR!vaQJ1i}|A+ z{Otz3IB}o zv;7-GpU1nf9Dg?Juh!pYs`hw|@pa%|gLy&xCYHPo`gBqH*Je-VT%%&yT8Bxm4>{OB8Up@}eHeFW`*91 zITI1*ixB7Q0$+{x9wQdSDD?*ZBl>0U9QGgadmSPjMx60uUZd>a9Q|gDHvW7c{hIwF zmP6{v^l@|6(~WgG_C`8KfpK7=)}Kb9|1J8S?X24Mbc|18=0X#yCy}mDL4^OrU|x{K zun~pviTx(mAcc3Cs@7xvLhU@mZBk6gDQe6bo&x{;XvXvJV||qT571xaqrVsn{@&fe zkM(nUU8c7XHyoJnZv;L7@;zm_q;cf;BK3QS<#@hfzn#pmF{D4_m*94{kDHURf*eoi z?`h8b6Tn{@cC%-)-BdkpLp;e(>O517*f{1jy;oXPn zcazx#fBpvMtN?r^+N0CYdL9A3j{>jY_Z?*Zc4&{{H=YFU$HY;szjc5;4RIii(koDC zB>c7j{bN1Id5tBD+v9q98o;-2kuwvX!XDxuxk(eARrZ$mq^WBj=V z_~BNZuM_*Z`+@gEzQz}io6sl!O}0Zk@Or3se;n7ls>i+Lzmk6e*DvQn zzZK(Pyb$ArHZ0D_t;e|0g#D@#>T59U;Jd@^;xzJohdOQ{-`|k=BVf0~v5ea=j#6>2 zQBTIb_1O*-?qsTrIOa@XT>0mwM$GTaW;>jQLDy5f5&62c_0qvT7>~c7<;0@Em*M|@ z?2jvbMnNB68|GK%+$zHU_INgoi;FFPZ&T!3xQqp>`n6$P;g9FIv;cOi+?Dn5V_j6u z6MyT+xC8w@!iLcb_AjKLffVU``7ixWQa9%JZQ^=V_7~f8LLc9D)^i*3ZCIOeJI?E} zR`k0>kZ;3zJkEuF--s$g%4y2w8iagDkUW9=wQ*xh*uS6w8>R~Q_d|X`OP0Kj>@Ly( z#FL`^Y_T+kjStaIW3XRIVrBXh?a{04H;H3)LZAGdT;9##--7t;jAs3neP*M6oey#S z?gIZURbKIfpp+Cos5#3oM0vS4r}M_BFE`q?s;|$9LFi*(eMb3h<-Ux2Kj3_iA>Ym9 zc#jORn?WpKc7F-AT#fHr9Z_SpO1v~}zjKR1<*|RR> z#K*Be{|bHXp<)XCots$x5ZGZsW9Z{y`Kr91VO_$nopUyNFu$)g+usj;9;EOn~kr7qUtg3Lpy2?{)?zzuLF?{<2OJ0!5ExlQU0(Vb}(?xb{*tY z7{K!VV@M#Se}I>RJ~24I#M;ttW1=5-YwJjJYO@?W=B-Nq(kO4?Otw!g*ryB`MA*%P z^~15i&yv9f9*^;}I)_}gKI86KF7H+N=l$>#8`jx;(0{TWaem`#zUo%gSF;1ZYkCR&Q9SyiBIGOfZ-qWi z%tI+G%e2qIcmc*yoD2Q-F7%ASx?CUd529uw

S+NjLht{0nU7S5dGo7(eH0>r0o> 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%0DkJh$1c^A! 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%0DUb0+QBcm`N$V}_P%_3LpkCC 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

tau)Nw*si3(Ig7ca8iB}@ zu5>2z-E`;G^se2>c_89*?9CV~*{G zGR9|!Y0gf5B&B(F^50-5?;79n50rmRAphz&Uuen5zdHtIqC8mCuJUhxK-yW!Pv-5v zMgF~TC!yt^QU0Cs)$+=G>imP`6%6G6bn@@IK>pQlJ}716-|ahtQcnKOfzl`M?hcf` zT>c%u6Da-D%D?fihNlMV{Da`>A1nXj<@j3iFZKSf{HwT+uOt7ye(nF2e?z;Mf42-& zD9D$~zamFSKMiXGTJ-hh->=#7-e1!4|B3Q%Fj>Ra#TF z|E|srYB%z4FsN{@*6sz)|Bn2d-f~BV7O3OdK(!O3qJ@`jg`}*0$k9XGi>8iw9;>X)- z`me3_pYOP`inP3#5&DYQN_Owlcp7=HY$W;M#ewy~MUtP83A!s4Wwznu<>qVxL9)gN zm7-tukpV(s(*??>zspYz|G|NAfhdh+&@UBa^4w-Y_aS5pZgSye=Xr;D{?}HX!YVPAC2kjF7IZwzT5KWC{i`x=k5ljdAP&JHJ0WW4qdIZRdG%R4LGY328E)EhazDX{GUAedhY@T-XM^hl@Fue*cd0 zY`hqmp~yxflPX8ZnAfZe{?yZn-ox#Q zwr*sH=H_4$`qJGZGkxuLOehcz-Av*}%i$7`QZi_Rd1BM{&f4VYdNrYi;}B7I7)*>~ z9k66xqVUiwunQ(fk0ZsXsbXWv-KAdZiS$nA$7r7?OQ5uvIE5lmsq?rfr&>p9lUK6Z z&)IzGGO~_~K@{sm@i4BDi(KhWhF*p;*4h?>#u3x0Cs4gQ8DGbFE&9G)&!-DwoV-0# zxh6CaM#DgC1S@lT_y+??kAtZ}GqW{N?izxX5E!;zi>-xYbovBkcF|P5-1tA>^Qj(h zZD3h!PU=X~Aq^P~92WWHyV0SE;y?J%DEnwj5 z>IAI};DM!+aZS088Z(9stP{^D2JWg|4&4pPyd>HRg*RKHV)kXO`h z^AC^Xpye1wA&axAAwys74IqKF=bYqDlsGkb7E9Kbro*x+`Og6_Q4 b&?|AZOP|r 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ȖU+file>0Bt&xphfAwgQo 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�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%0Dnu5vB+j64e_5vMH2v^Fxak6{gD zsqtZ@C1*<3^WRbr^cM4nA@+pyBu<9s9E`LoQy+1v6YJi~qW#mB$;ybimFxa}C|Bg?bL7u{E6OY<$G-=; zId#2jVMB7<1J5~leo{)%<`MlB+=XM$<+Wp5++XI*B3o&QJ_E1nOV_<`MdjFCe;o;} z1yG|g^+sC^z$*){iAS${e-l+JGuTnEGncJtK^&jpF9D@CnTQH0btG;kp{4Pf}YWQL0%+5t@d$N}_k-Ypur*s(qi^h-Y zN0gR~Y+v{OI*>JY{b`9I`KOKw%(qPse2(u}&)==q2=BdMOJHB+U3o32*DG27V4*HD z2Sax1AfF}f-qv+*L~*U%Cr=C0>cFm~6w*=0pgjuh9|dIy+g7^~>JNr>6a$%LsgjSY zAKAH{zi(4mE!biRQ(tTZTL3$+?=kczu5;Eleh`&uKfGplt^0EZTc&ob20So9nb1;7 zcNW@~cH|~HFLSpuGiHvEIh25Z-`W{?wO+ZN-$SUpRIL_Y!aN>UIB{#Y&UEVXzr6z3b8c6JXO|Is4U= zA8ZP&=-v&hPxbxH#Alu5-(vRjoq^YU=eqZjApe0JS|6A^sfpg0Ao_bE8(FA5cHO%7 zV6+|F{r6;P@-Usm(GdA_iNo;gzG2-|lG>g#0}A%D=esGo3OeL-J0-x1ZZakFpq0n&SrspQhT+-XZ~iZht*y^U~^y_&c}{HUfqZ6clhHUyasMr_r7*Myk--LcR8!vzjHPV zuQM-Q_x_=n?O^pK{_jU6uXB$h?=ZG~82=se6LewoodKrm)O<-Z z@%9mCm^e8bH>h{|a{SK3M>$k%n^~(o2#=}T*YiG(a39omt~?F%k`*kPqbHk14QlTmnW8d&#UP|QXQw@ZKW zX~nWuO}>u7tM1Nqf6oGTx$Xqhz7N^#S;D#rdlK)O$KFhvC{AS+;|uuHh0~5hTvuH# zoWFX)h6#Iw!g$n2o5A*jT`$0nWmbofU)mtjL$wGae*1_!P25*0E|1b51uNUP?llX* zE*nbhF+Q#|KW7N5BW$0-Oy1;9LB1qWtV4@tQTc&pyJ(QLA%;a5@Vyno#?0X}(9Gs& zM8`A0-$pK^IRSoeFkS|7VRc%#?mKRE_O7aN&C!Q zfgIcZqoqM@#sHy=jO(iNIcP`UvhH0TtjxQdaJ2}q>Uu^&|DCyBfNt?PN8gs?IW zj1GdSo%KjQs=@Yw-7A2(z@12e@CNVxw^s0`!FBI5qDP*>=k)SQ(gEzkgZYFU7Zi6Q8GAf{iyXVcM0vTcVKP z!yDK@OT@2w`?`Psv8`7L&e!wx$`+2CGfeuSijDq@#A%E6XO|op`@GuS3C(~ne!b$i zf8Bdgz^_2hAy@cBf8@7V-UZ4Th+hMRy`sB}&YOeZ!MoSJ9|r9o)_G=&1tkmH9m>NA z;`9x#dtZ#ojP0lL`?IPaks0nep7V2n3y#i>V@gV|4}Oi+wBI|{y$?snBCGSP{oW#f zJtL=c_)m0KO!Kj_+0q;Ne>0S~@xQLUX$yXnmhwMMdK>Rs_wFyY{%iZDS>J!Zd+tmx z@cCuo*EhEAor&h(wlQ5b*jvorj19>KH$UTFsD)=M7suATZ{2%0@5p}-M_%^eEblOP zn&1Id#i^h4LpKK99XUFtOF4h@2w_>m%-W%N+)%NH8CqAI#~gJ1?_c*`pX0&y%N&nI z!j2F&mJ7Sm@E|wbtrE&d7P|Hitb2QNbg%SzsIIFXi+&_*N3?Ei+lK2J+wO>4{>@xU zeZ5!wK5X@i>HlCeU^zdKbjt|Xdm>Bw=IG{%d^>HvhY*<##(pGq4rXTmOX;3~$He{X z-urkDrEAWJ>)wo8!s(*9G$z&5ppU25<9A~zo7+RW)6lj;+jpL{d!b!~c20S*I$0Vh zI9knE$IL)^n1r_XZ_iEJ0qp{`S!h3_dSVSD7#AsH{;vLpBp1)C)T}=s4Us`x3Z)YOmA>^g%&g4>VwywPp*5IUSV6w&S!Kt z#ODfhuo?5GiQE3E|5@DQ#BKQd|5@Dh6Bs{d|NC)OciqIz5_jR;b*Fnf{=r>$+f&W( znugcDfBc{Kfiygp;W03`?ysYnJ94j*ZP=Q+!nX~TP9+!19D;`Fk!hoXxghO5wBcsV zvU>{q8vRwesS_TPpTUOby`)Dr==CN6>9T(DC+v?E#v^^ZA8ZM%MoJK!5ZIkAePupa zaiv?wn7Oq09f9BMH?Wg~GMvSZy$=27b`cnEejlh!lfQ4S$G^R1`+(JfQbO8a0TMHS z8F?GYTR*(^FRXiP#dh}r>NoKY`apOiaS(TgxUJt__v(uEAL70x7F7eZ^vDU~HhpK^ zKcj1Pj_m8Vhjp2BWz}Wa!w;={yMuHB9gS9%Z@)S5jj*m{GNX2FCC<#^x_@6QzvYJP z2FrqV^6t-965AN0+EQC9$`xlH;f>#2_wG?RkFZg&Ik0aT#FvjLu>S9@d!Hy)ZZv1| z66rOvn77onq%aF2)hL5hX=LEH_|NO!ok1E6{9pbg>gUM1*B>o2x@oA43%t^Dq}hRK zM@n+uM4W-|Q%~YUo#yUVQ&<;a2M9A|f4#!GOdpV~w3o1wAFTUl3T#`nRitmr&2-GZ zo(brxq2oA1xL>&BPJ6_rkh{YBE7(`>ns-Si&cJ^j{^~Qzf3UWSudhoJ2{Yx=z%5-? z_hjr{Xx|ppPtd1adC}cz`mQe080!PU-nYH*N*`tZc5c0>>szqq9lWrvq%ID^tL#UC z9mTv$_YkT6kAiOmzlC@9U2|fDO+DGG*%m%{juHrf0w+*S@cH6 zt{{9%ifg;sz;YY^Zj1g)JhkUh;*I=tJ->G(Y-j2C#h$P@n{ASIOPaoSXMg$rtva0O z$KaRSV;1Ju#vKufPlg$8H}kY^;tc=n{Nt#+qr};?wC?@8vmYKzn;UIyM>J>fx`=m} zc*{S>_EFm~FE3~tH1f~}Sw9Z<<+c=e2l@ukcj!Sw8}7bfr0ku^``{&cseKCTRmW|A z9ZFy=fvcXI3ENAU(P4~T?tAlT<%m(*n(79jmh)z+CT2$e!EX+Jd*H1{zMd(t%3rQ~ z-!0Z(?D(TQfA1+~M_Q8;Tkcidb*W&tGbvivIo8y7x4bBR`*wU?X6f7U+?V zXa^ex`%qLz*f}K{A(&Ij()%K*7CMATwH{vM@H%#adT_`=;sJleVmfZxzY+Sw(AWHi zwO|+h$3pZvOdK5h(p+A3UZw%{w{{&wST)#2Fum)MY}SL7gPjpz`XatAdZBhR7VC_X zpI+iE67N}xXZB^>Y{mk~&mdtL!iw&*vvtOa(bD9wyKz;Nk{YuvKs6pb=XSW zm?2RmUo4%H^?WaBNhLS9jX!RaN5MPBKL&l(^9l0RzOwEOp4)%Is!wV1iSBwfeL}L{ zi1TsZ>2>dTv`@NZeJ87#C&*i&O^9(;2e19`N}nn4(Q(GLROce9sbVIC{=FBo&>n|2 z*Y5_1e+X;|>?_eWw|R-wdGbXnTA`t^SqJbO9dffSGB3NO3|QTTNxvcAn@WD6-seBbwRBjxIkbI>#-v-v&HYLCNU-C#FG>%cAd zJw@&!r#-~Ksvdn;md*Q!hr#N=`oKP@_U_NmQ7r#(Ir|g;sP- z;61@u^iXR>e|T>NNvo`LvlQ?H8x@R4pR`4j95cuBtn z>jh?PQ#v(-WeNMC!tA`v%9Y(;a}Co1ObUni1iq9#@EW-=>%B(2BHsgjV|ZEF$kZ6L zi_mtL7fILFwf1-?FL(PUjZRcKj>B*1k=f#F=9V8`N4BIoG@=Bw0bUJHr~h4)^}fQp z>LhFjsiWT?HiO84#-?843_dFBEe3Id_M&+Lzf8OKw*S3vBZOK^=}i*1>f)^TPeI&x zdTbD|))48bPaYx8Byqk_tp4m6aHY=TTyvJacy;ireFpYNP1bw6^1%3I_h2Tpi8g=u zSAC}g+P%5ZfX&C^PJ$f@(Me|Kz?Q&nQCw;fub zt-LN0w(0R%@2v_$e*}5u#@V~_niMyM(Yt4$9fsDNr7&&Drk&ufMQ+^UWIGlHY*dE2 z2J#E-6UCQDSQFSZ*z*kH%SQ*;5wN4etbF9>&WB>{CHdG-oWUn#^ZQ|fHa2k*Tk^IG ziUHeSqXF5HJk}HUAaSdnn9bi&8kUa)=1DbkjDXzej+4+Ig5LPx+KbuAEE_w_WUfLS z3^bFGv!-XVKOvpqPJ5Zv=jOF3bAg7Qug6V8bJ~ ztP|bs${Uq)Ct2Pa+n8X!nQ(Q~n>M`3NWS9Oxy1T#{-kC~#-l^cskvgMG z+n>ey>65eG?UV(%?3YH=x`bq94`J=KS+7E2Jd)LYV69-!6<}qxts>0`UReY0ngx$Qj-@vJP%-BKS+cH^~%lqNvoKjZDdbw zX5yLh!{;b`o-IDHGSUC?_%gJG zf^|v9fM8a>{4um;6PbEy)_M1O4`EY;<@Ug<++jJr>-pE@bWc}B|2y~uvQ`iodUHRER$ z@oS$$eu+Q8dr9I}v*_K-YZG|+A7{N=gEk5HQjTE%is9Qu6>{7q?hawXtFdYj9-A)D zdVf;Pj<#d-cHQy+g>%^Di}0(e&w4Mq5a!5KLEDD=I&O=9c6Rp7=G)yhe@gkDo%JSQ zC0+&kh`gbXhNw5ZwRvr3>P_w3P5eE?H)lyB z`Q)RM-*->l<@z%1Gy=at%5gov#V=yZa0)gzAjs~ShxQZDe%wK;$;jOyvsgCP3Fzxz zK${dRD=SNUtut0sf8Db7`Rq4(Vb;5{Slr--)yRYk+3O+Q9^y{Dh`C2}e(aKC?N?3S z%k963YuTZ_rDC3|zYiv^6k6nKLG%{&`9sRz*1+a8H?^?agfAMZ+)IRYwpiUCw6R?i zz7E;InH*{1U>;oaXUzYIn;W|t;MV|_0n6=~4Yv_{HN?u!M`&5eaxZbxI~Z?y*CShG z0IVMD8|T&+9nxa|7TiJnV*ckFL8V-Aa8z9&Q;g$Tqg_tEJ zY0}S<{=S`AZ=2c_!O}M|nsw`yTrC(~{lGO%*!OMBQHqTvc5K?gCCi*7;JW2ju3hfu z|II?KbZa^M&7-2-25nbBOM0rSQPS+aI-B2%CTt3~b;qy;u&x-k1lAeDGGHBG zX?W{V8s#tW`Q_$l(wjA41JM1Ii0oc)*(s4pyL3S-w9C*wSgfwBE?_@xvekqy;)jpa~&H9h=YF80_|+Co%2f0yTA^BnKf`DUvDsWo5J=IwnW%Vd6zGQeW}JD ztaL{S+w{_`|DBw0y3M)Mk;o^tq&7PM?KHHiay^Q_2sQ^2BGNQVik z-{pMyhqe>ioUV|rp91RvGxKa4zl~W-MZ->`y1H_iP`w<1z90Hry(s@D!1};)`+5T# zfcE4YBJd;&CjH80=1ZZt;#Uh6=BK%ep885Au3`@z%TIh$SmX&kHu40HBe^3QiROOr{rrZHo+DL?!+?!hjGU8oIc zYrYlXH-YgFRBmQ}7Ie>#j_Iy>mf6?%Rj1b7Zq`}5;Z^;rpdP5>A-;Z4PV%k%4G>mO z*cH+8xzp)SKBZXkR9A=K)zD|hq`>BP>58j#o~+%?%uM8);a9bV^^MnLz3=ia-4odT zF&j{)voZbS_Aoj@dFq14F?j4PR*zO6ULhac{q8);q%`$44Zn@I<6DTRL4uf8wqW#VafB)*bQo6)C{@Lp&a?+V5egCWHK3HW76`;jSZNW2w&1sC@6qdY?OYo$FhT$A~} zDC^y!fzp=W%82F9%=OabGu`}mrTDZ~#o}E1|BmeWc(M0m03wYC{uRlPfD@IAL zY%c5lSI{Po`C3o1mxhf^*kng65clwB?K+Fb{UxyDV9($^q$80(`|Y$2g35PdzeD#0 z(b>Jj)=x~`nlrihtsrQjosG`&#up9y=%nN>hiXVhPUQbq!g6$J`C*$ zv^g6{I(7nV7)nXlo;z>4>+7TBt#FUct`z&%onmVCZC34KenJ{%UBdXBUyN<*fA1_! z9ySqP@=sasUwK!%3?;M~m|2Og9ALqt2e=EG1!zu1^NBnK_a4~38r+WJ$PeHA+3(D# z|J|_zq_O8f*54~yRL3X&-0v(Q|14X8BHOV78)0KR>o@RwK;c+y&ykM0pAKosiE`MpFa9hoCL_Qn2n6 z@iV^~#yLl`z74D|%J}^)OPqG%JVE?<()?}281DkRR)A?&^`Yj--irok#-NcIp+~aY z0yYX3mgg?85iqGuJ)-La8wShyFKfUC1Ab2xkx7#adD+vrJ(!P85!VI0=~7_Tc@uGmzmoN)f;>MEOS%N zfE4+<8dkULwHbH~e;u80?!0zXER`o8=C*&#oIvt=27cp*t)E2st-Km}1v|rg$i{Nl zM~_(&cbPlB{)1QRH?rR2g8UZ9H1`+iR{V%;q0}T>1&$yTpSLO9r6Er8GIRwp{cvqhf`ZJ0yP{^k5Uyt5Ik@CJJ zwL52NlyniLVK?&oZTxFdo7r7IqZhGcH+~WBA>?Hoc^SRPeT!CGO0qZt@A8MTUh3TK ztBK1E6$9It>TjtSF5Sf(gl{hPIAzhacQyQ%;Xe<5vp2`wPm^w!L#B?f@@vqagqiUM zf6%RF#J{?tnv=%d_D4c)mBdX;Q~9{y&? z%k+_~_nmXghi*&dOOnoXx2LW`WDv$ueN%KZ>FEQT^XlG2yi}x;K1#s>m(? z<3p8>TPB^>pJg3)DKZz{Y4>BurmF73Uk2@4d5^dME`9UR_}v1-C^WTD9dr_Rmbfod zT&gMd&+NM{SW-%fxHKL&eaC&iNfEd7AQC{l6b#sXSw+Af&a#zpD+K! zN1O@lO1;v>Uu}CB{s-V6^A)sV07$+2m5x=W@g)Oo$uF|rV|n*=oV1W{!&lx&{Sua2 zqftMs1rz;-sLjgVJ_U2xo8&wFPj^2wa+rqSUick6p7mbMyPy75^b9-CQXa>l+4#$> z|BXL02iM6qzmLrkR!P{dAilL>kWB7s>M$Rj!EW)7@EPCP3F6cf=eDRWaoH_8|1iJ^ zftib8p^<{I^Q&K3pN_D8u-XvT0Ja}24K~4hw7(=Y zGxop8u`AV=v&j@^o;V}K*&dBUdo$Au3cibhE>Klw?y*dqY2wT(jvdRbFV@~2rp*8n z@6HfPH^s!k4{{F=; zzTO^%|JZ*;*N!zFO@q&Xzc`SepziGcKz(g9k&R8JTFv*?j}v$C4_WUcYH%y}wobx! z#9%V{c6XhadBi?gY+?f1kUZ_(5#?vc3d@g$sf2caIyw?(xyDM_zv&XaaU7W-g`%ornE z)jjB!N1V=|PpAQ}2b%^nJ~LxKu^*oqVk?@tmGJf;{NiXIxAh$EL#)w$%~>!0TF*GV z_C4~n_ZsyT*Isz)nDeaLOC9_4NhW-R)y(fsz;B}Rbm2Wv{fV!lFnxoL(yM-}ZehR0 zMW-V=qYkVaEVrjZbWLDgA*=zc1FRG5e%?d&pP9F7OFYY*>d2&LJfFs9+)tcE;=D1? z3t>O0`SSNK!;!X{eQoo^sk!*H_xfVGgl~@PglWXLfF-OvW{BHUb^hte9Kt@1YP_v+KdeGm*v`7^vmb{t(BO`-nK4X>mB3%n$2)9{*j%<24? zCF}s$I9SeR*0{U~HU&1#d-!{6%Fi-kjgLh~1od*3xx8+l!q4w08yj@RtFf2<`MA@b z&WML}s!IoQh%Z^@R;jHj#+nOjQu#PY-2G2D?Tr;H zQ&<=G7jp^tI%nfcX|E@q_69Z-DU;P-+LM|5Im?ia8ZzUAbaFTR%Aa!Do5|1Xm?(wk zbvAG29=Z3p`5Bu+Wu1ZFp36^r?~B?fw$5$-=p9Mz=5=Imml+eY@H+79)82Towd!!* zmJ-Pqx*O2!hiE2mtuMnK{Ik>f{Y-9ufzf6h>5V%Kc9=VUM&R-PvG@M*b&mJ{_??_I zLMjW2pzNR`C_U&RC{8O)(~3HXXbBD~iXyBcC_B`mqlm4tnr?!MqAaGe&WfPRx~+(* z=&ZJEtLUb)%q*H8cD~Qo^?F|CKIhJT+VcMV^L;#elRnS=yk6Jq`t`bg-q(HI1rz$? z-Owj?;IBhIafwG-UKOwhWB<^x0y?e|9Wsi&7+n-fMCN{*;g)lf+lGsX)T6A+VLafa z*yWNovH;u=^n90gmE0yz$FZ{+$Pc$6*S4bqerBB9pE#FqSp7=Q)825J7p+Q7`7DO6 z&8PIoZ%^&d{rXaz?hy!l?r%G0e@PJO*#v!KC->`lj;8OPhEat)QIXY)iRNsMk+adB zK*sL-;(JZ{ZHjvBCDCh{^*FKb36L)@>yLjUwGHr#V?_28?cr}jX3Qb>y%73x%KPJO zsrvlw8>B!YSuBCPwc1&iGvD%AejJe?7I$@_RNcd)WeK`sbTj*P4LntcJeE zGx~Kd=(eBk-i3<1&~!P@Abd`0cL~2zXR@xudNcf+wGylp%+I_su^teF+iJKS4mr6b zFUEuG2De%Wzj}%T<;;7ECbY!jkgU6=oMu@9?=k3_73q)vgt~_H^N2MjqA9&R9$lF_ zx(a^R!0%)9n_NfH6k@T-t)ce4l3w^JJ+oiWqJTe%L)KN;-wJLwmdCI-VBm&T>6AD~ zqa23cF#J}Y)gPZgzihK$XUTh{(4FEXLvNEM1t{&$ozM|E+l`Zqn-+tc2ksL5mON(K zu*yF_3vrPdKB{7Q?sPkrgqY~+gufN=mm~gg3AYhkD>(BW7Vf2e+X8L_xNrEhZK{`k}I@1PCgx{Dl)jo0l9bPSD*kvyFN*$LM)Qva~F*6j<;eo%aV#-}fwY@VBC zT@8Caw_neNGvQ$ZE+3Sa@L+5bry|IVozWj(h2N6)`I&N*I9@Oo85o!3a|LA9Kqfiw zqu^G9+fV%A61lnHI+Nt0;1+;e3$8R>dd%9)sd**ycar^`5BVnNwA{>UI3Vesl}SAp zb2GwNIkP|Bu)MLADpK~qpKiVI^g??Gz z%)CvWa@?L=9bn_q4o-ldf=l}2nd!!N$u`)WDVw%@GE~P73!rPmW&QC_w_P@P-y>6A zi}%qr*^H;xL09aG{={?gVfio>b?-4xM!?R+HuGySf4CC!AN-a}xG~_G!P&iOlJ*jC zOTZnQF73(X-9$cn#*V5+Lhe*q-Z+!j-aJ2AR!}**&#v-Tqg$01rFB zSkK|w2)~`z_Ujp9Zd;1}QO>sO&hUN+qX^*@T!;0K+J5hMHspytj@2tbEcKy}fZkNNc@&d z@_FP9=pVuTT?oWuSi32!BCmMz88#|&p>p`0b6PVJ`Tl7#b5PMY2m03kq(6RH zsy@Fwl8xelif!my1$|o{?T`PS?ar{e?B;ny-Vt-sH4IGeNG!lEc)UNJpSu3zKBIE= zou1cwWMFodZ|jgK!)oX&f2v>4!ZBx*|HM=ivA=q_jeOdz`;tEk!R3JS%%}bG$DGl2 zsDFCQdXd<{2IyP!4AxVaKf~rGXg6g{h2dFQIy;c|cT7Fji=XX}2hx?B+y0heE}iDX zYx*pv7P`i?qRmWwhr!RLrsv^VOqz8KW9`z9v_s#bm;2+7<9AX&BD*$cCHfKMND$7O zAzSc@D?2|^jyJ)(uhLv&3?GF|{!Oyqwm*JiI-7FWf6svDU%&!j6`tXCX)X@15gvyQ zp!5!7m1H<_e~*mfa}YUM+*$61d6IpIp**ucG{9 zA>2L`b41zQrTh2r-z&>+almSUZgk&*vamG>wUs7uj4VYbCw#J05;Fv3%** z9Y@L%WndDjLrSboosv8cVS=#n4gYmPd2lW7p}HNWjz4F?Pxx2c??>Xf7=D&?^vC;C z1-OIM+9x(w3};|LQgU@xE=>S)@2Ku&e*`?8KhLqIqbq*7nDzLN~@SvisZY zhZDOkge)4{QT8H1X|tudYqgFdtV0e?epeszDH@Hh8u zjAv5AGh=-do_wq&xquL!v?DpUqQC9z*E5max+JRB zzmj+RQ{Ekjfg2A_>bYEEV~fCrz`ZI2>Q(AoG@SW#atcrvr3}`<&noztCVo)$?K|~j zak~+2y>R=fxZzZ{g_&h?&YQ^-SxT4G>C;Hfi&3{>{ICws2SwhrL+Ao=R*N)~rMVaD z56l)>t zfSV))%Guppca{693!I|(+W^`1kga50*vj|_pM#X0+1S+Qi6=H{yqTuROnVxRVZOSt zKe4CizD)Et_sZTyjy25~L!Kq39QSP6Q)%a7@L&2-f8tx>Y5ZU6@sAmlj@jGce-Zqz z#l3GIWM$5EKn@G?vF~#8 z-uWEpD*rp?ys5g}@ufTWJOlICk^Z_So3+@L(6#)Nem#>CYxa`usL*ClXb9(j!@A6r zz|?=p=5OwgU&uU4o{wQ|oz>qo^=5oB>JGH$kUvr6uXMk0J{J6J@FRuCW$Hh;S>WE> zwvEX*J`R&K4Yztd+jk*!ZThD>CYCzT3~nR19226J`3i8|;QEBacRUtmV!tfUt;7MO zNfXSnTpU81m~K`;ycd3#ev0*#)H3j^yRxGw@DKk&F!n3$Zg@WSOa7Z{_b3Of2q*f* zYPc1_&CKOZdv>N7&xyZ!xQ+GkCuv>;w+P(qST7828Mq2?$1|Uk*GDJIeq2+}aI{#4 zj7g;yCr{~4HQ%S)3?1d4x$UOphjS;^L%B{5&{z7O z{`i5Z_Tbka-~b6U?mpHamD{v`&{g!gYj47}f*S+Q+Jp2PtHA}qosZv%{_0}eOh7m~L z{A{yH2Akr%_Mr7`2s##j(I1yQluPC&`3-3Az{xnrnVFY=9um3`Ka0R`0Dt4Q=WS?l zvjPtW@)l%G%4^Ij%UcX=&YB_Y)J(E?^CD{sSnLfFL({~=*H7nwZ^B?v40J@kLy9EkVgx9|8vo)|poX+L4Z68CxVTM!&bJXewNP$Rfe;FhFo zkIlUAAXsP0{M3wxL}w@b&ppu1Bgv1A;A+9G#Ba2FW>MF!K|6ONyn|eMX#+-q%Lmse z@|icA1Dr(9SnvzLo3_F1$-l}pgGF#FhudPgx4i0XHUHpW?1R$x119J^Gj&Rv|@KFLZ5$u8M81)0!Q{m}~hc z!#;HAns5)sD@P(fwkKZEG)JvY&YkNw?w$+%OQ3(vQ3LUu?a^-zWAcgWWcgH1$?&c8 z`0ANo%1rq$#CqSjfp{I_U@s|~vEbK$x6c8^Uc=y4gZrNd;#DaBHO9RV^ewV`eO227h`g1%U4MJjvnxSi^*>ccb1$jb%uXij#{Ye+*$Wx z{&&nkJd!S--8MlU7wRAuHs_ft8GVvZm7?!hw@yj@m4Y z5oCKI`x4{h-?vNd{C#-Wjvh+#Xgzey`PM)@ciZbf^7*2`T>rIpQ%(}6qWdsjEg6Vc zXW<6%A6Cw0yn)wp16{~%?|4J^dCq~3@(Ba!zXO0TvdGutQd%~orvyPRgWnDC8(^Lc z8>gCi-bRmS9p`L>-`0}`QoggcMbdM!TSiiDBk#v})58V9jqz~f!3C2z$?tM-qrr_! z&2PVc1vZo&c-%j~&GcW|sm0JY6ds7rO4a9QZN((Z1N_<}>% zkX)Y7pZtu-te6$~6sUQoBYMJ(=>I1F-}Fe{FMyuqWdn&bA%t53ZerQrTAx}^`^0zK8ILl1sqpLi@FZ)0G^K=NzU z_mN-IQ|+Y)+yrp@b3QYy{+s!yIhyPdpZqdyqtxSC=ou9mh(DdK9!s6aY{*PFXCVH-R>Lw&q~9BEZsob6V>xszK6fC#fo%fI0Bub2TAQ@N zOMRlN&)<5XWBmC8@%Gg9TEBM1jDM&4kAKbjhvaK`5$y3|^fUM^m-Ka&;F`fbECkMX zP3-LmW?r5=7!?08$d0=IU4c*E444&uC<-EHZ{A})&oD=ki1H>P_KKzHbK|e?+zsPI46&@ zWlHGXEIl6Kk6w)VX~RI`T>WG}*w81Li*>Nl+;iOFt2ra468<9am!I0kyZe<;M>3ny z#$)uGctATj7mI-@%*5OaQi&+y)C%2McX7^@e!hV-s#Bgf;BW*i_N7qRoIi}gUI&CR z3J(vv5yolwon%w^Qp`=(qRd*^1jywq7|>^;_{QxyD7Vq@QVBi`{z~zW^1R9{Gh$~h z@=E%#xo~fU`_gpzg9Cnsy`F{|B=*q?zgc&?;|<|fgLA;`hTn1tw;tR`54RayfroQ` zgz;?>C*?j0TnOA0QRc1<;hb>vX$AOb61p|{J`QV_NEv&rfWLD1>q>2B-Mx!$-JXuM zp>IgD4O8$;qbBD{92P^@hIG>`_$?N{Zo1KSVuGe2n!Ftkxpv5z`U+9Oa&W7_C9h3Y zgIftsns&KFt`^)1kKCQ$T0PuiaLYa1a&QvA9HUM9+IDbD!G(lFdXwwu#kPvVN!s4c z^gl1P?RDD|x9`HSoEd@lw$iVPz6n^QTHiR3*k`45=# z=hv^VapNcYGB^A7)6?|*ALttS1N2+lPHUy?fB3{dt!6$ZeMixcF`s^LApSOfC)tL4 zKOGCttO>Be0ytMfHouAOhqQGQO#@)Yu(fb2g_~zDCt5;&=jKf8I-Tt?P}cqB@Vg9t z?L0>8sU6%>aI%~wm-Hv=z%_%jwrKgy;1`4crVy}aS=$%+te>d7T|*UTDc{lHCAj=0IQ3BLjMFVM_g)X>-u@(~BS%f}D9yXat@n?goTa{Sc>JJ6bS#CA@S_9qleekk zk>NU!QDT#upku;g198zOWse%+0eE5NsOhooqjnc;4R;pgi){PS^-`8PYuKmPu1nN<8HkaU4QY_ zg~AuRa2~__1G<{!x7qQc8`LG7(QvDO8qZOr19R;Hd*yiUkGmJLLiX1dW%)>~4 zstvhi<;GK9l}K}R(xluV;;|gM);~X>--klGDEn7~mnN1OOq<;anNdH(8bPXU_}Q#{ zbv5v?f4^rogGkzg7^E(JVIXl1SaRElf!q8MXCduAdpyU&Z#DdGg5NvvJ85i!w9n7V zye4UI0%x(sg^({_!RK}uUe3wG$5l|?(nl?W+dQ}(h~HA)GS(IwZ3n*y{C|aqjSh?7 zG{g_j8dGK#Wx4nOC#E9^176IteCbO^K7sIGbf0gC{vfzgaFNvV^UF_^pE++DE!nUk zt%>U#(f{*-_&(`$xox1l$5QWKH09>od@G@A^e+bDhe|o)S=@cH2j*UUQOT|a!LImi zK8!6A&s|KvBze6B{ztwvJg+4mMzx^7ftx*_SMs3#2t&uk_onY73f9@Ktpo?Dp@$=>=)eCr7MTmiL#=5EF1^>Pd(WRMkANI__v~hCK(a`X5 zFIqY&lWyo3|GRXJrw7GKfchB(npj^e4 zYoTMsn*;It@jGcA$s%Rjg1AeaUIN*Iw+7;`rCWP-ZP|RYCe4eFX0M9WtLseszxV^}F_HW~OY~zOd-8cYZhpwFn}s;?BF(7o)Vy%Aek^{b z9d2^`Ui2*H|9>2a|2x%=+;M7UT%q_+ERyxcsgz%kr`EBx!685fAY{O7Q~_}78>d#U=|I_##?=(}kv`o!j<(6{I# zxBrs0y}95T!Ci{q@=fmKzU2n&*FCKRgED+Q8>g4g&uR!Pl=6?_Z#n#}5nZYI=Gv;8 z)~R`6bk!w@tY;{O@1#Eihv6ID*@ow%a?kAiT0I$WH^R?4_({8di8M;jA!CQc@D<_7UYxb?JL4bj zI)?vRgE>hnc}xi3x+idCE9x)&Ux53haSO_xYg2fi>sE8NYGT#ijOR+>&-r9P&yR8Y zNW9~NbyM8SK18$r1GxgonSJH19Lf*h;G>+_%p%BzAa}6D1D9~iz*T^gbjl@d*D7%J z;I0({eI(P1`DyYV22A~Ate+SHpC$vX1N$`eLlqf*br?|*TUiHPp-=JrSmK5&ioZ?ZM*nLdab^+wCO5vx z_1b(eqhxsFQJ#y3I6geu4hf^;1?*2i81Lb?*yC2iNO!(odF}=2!jQDJB8;qFw>=eZ zH8>}U3xQh?ZU}K{$M2+aL|w~Vl9Tw2mP@!h!F7U*Nf@|@; z`0XGJbatmFIsxqWOaM?l+#^%cCv#D)gesq@;+ke?0t8$=#yX544OCL#%&fVAXUK^x|ikUdspamm#gPfaBOQZqcM3d>5{npdzSm4obJypWbM)--s&n*0w_aBqjO3(!IU5P7E z7DXt%Ach_VSa8h8f+Gw8%aBE79u{h(|C#V}^gqyhjp%jzAFOF6@5hnz*Hb#6QheMg zg^)BafUYIbRVBJkmo(QW_Czm*TQ}V7^ODyn= zSQzR`@K>-B>qB2+-h|&tX+wLN+_z!?o{|!+ZtU!BDG@evBMB?# z7kJ(Z|B|;}+s08}v~A6s@sRC?Y&&IXPj24ebZk3*h&33741H^lI?!;1AfIJ?(gIy2iJI!JD2_;4pk-Y}SHD zA)K)jA=!tIZf z#}9a^&3|G(#hi1r8oIi32NV17lgC?UVDQnB96p|wq2=Q*lgma4>KvL&okhsB5zQ~a!5-i7OHSupJ`j?!mSf- zc1=&hSO9J*T!&UGz;~RsC{fiuLxNU%&hvwkbWxnM;F*l6xb5~{g6Bb$=u-Si1aM1(Jv!C@Vl0Nlgk8W zz{lPqbfd@4#Kb^8x|fgJMR4m)k{5ej z25vLBo20#W+d@e^9{Nh%!mtI6;dnT&gKT)e!Nl1S$?=x9w#^f7crjzWk+0x+>HdT9 zowGprl^<4Z`EC@}kTU~2`Op1L`AM9sp>IuaP|u6RN-55Xnu=7G=9Zhffc;)bF^)Kq zG%tW`#eswIJ@H#E$)hFUW`H|R2n?NYE-AcBGJBL)!fhVhL{2Wzu@>9{57!ND5x7H) z6ygN@99%27lhTb%WS)gx9b)5&u}NtzhBzq;^rbQzNMVrjDD+ppiuH|y-2C54JwW-% zd-ubq8fcAw!iDZ%pDP+#4K_anvKjR$fSYX@2aW~??Ba=nmyU*z0zv)iug`N7z*lhVt`P|xJW3ixj<8jMSv zB%Jy9rgRQ|mf)`wZj0b%<~Yzjti8vx`WjEwmhu+68~Fy>d-y$t?Lu<9d75++e@bpR zOLHasF#K#hY%sA`X})AL4DD*fNOVTwKI-tn__O#eX-(ECW21|bRibW-pGEM~2tP}| zf}b_;GxCV^evsy1VhqMH&=CAAfS;Wuy>5BQy5>49eKQp{Hd(Y9{ngmP#F$>}eFC`I zNt{Gi?4S~S6uf!P>gttNBw+_)=kw^_?p>2UqY>OJ_;t^!zzg^GteR8tnKCYziR>!K zE{5z|_^o-HB>O_D>?X)gIC9&1C0?U`h4u-uHeSLNftv%)K64dr0=U`W%zjb1$6o~8 zB5=>(_f~9MR`EO|D4kO_!hhCLgYhrue=B`Q6}s}D`*t1}M@ac>fUcF$mE2C1gZ~_S zC-@(3PZ(j@`R3C>p*Bi=3wK~WWZa;>Tjy8b?G%g6tE)L?tDj6Q#dM z>ETTqBxPUnYmCRB&+d^h?LW9J;Ee6!ToU=XsMzT&@ZqEV<{H@VV3#Z)CwdzpI~TIH z4-sxDxLR=59;?Bv1UCm9mi&#KG4D{vhONuVuDHyV_)6JKyey+%D+6(bZ*EFcX!5II z4f@k#2IKQ_FLvykUl_-wngM^y zp`-lR!T3>GzgHZVlv)7X9e2=V!X_->-q&X1Fa7w-g!|KLT6R=&ur@7MzCz4p*=gp?i+cE* zcLL@!sqsZFqY~1a7?0GSrI77}?DNB9Z%N3?LoCV5PRPzWanSpnr}Iz-FXt7YVL+EA z8#`f8zs-#Nnx7fiCj<3W@@Ett%!W=HOni@NSpK;4YRR9oeDeo;HKWiKg|1mA z55_-Ct*7oB-Cd`X(`9e))m5I0L4{A-hkjhzw$%uu`;@_WeHL!~%F~Un`9|;aTbZ|2 zLdB@H*k4*Y7@sMPkYC+LOas%fRGw1#Pt6TfXXMSs{`HIUW>3tEo}D-Qg1p*k=C_W` z=0I=3l)*T*=or1pW1-BSX;ET@2t(Cbc}3V)SZxB(_GlUWE-W96@3!r|5ZKp~88~Vu z-yAdTo3x)>ps)H&%uU5^k;as`{2>t+OvC0UZYJfT(c~jLJV&leIN;_sJ6eXi2>xcg ziS@*@2jkyo9{RU;nEnNhLTPv#6a@RZY)g(-o6X74Cw93UI=56|{GDn`?wVP$Euo1= zGJK3izjd?)y2j2JjGw-3n=$7D%<+G&BU2C)xAM23uNw84`N=xt#?7@sd8u3;Li@%| z>iZ(-ie5OV-;PLW%L4mlBw9orv$sQb)g`XqD z4=&+y-p2SjI;h`7B{v#e0XS(d_vA$XE;)B?CwK>l2oE&E%H5&67U7H)7DVM>+5XvEZi_^rKoFut6&HmtpJ?ZTAh z%>m!cH~Rp>h|8!>w70Vc^;;LH8^iiS=#z7U!_viiO&2vx;xq#~DlQw0*QUnF&mM4c ze@5VXU{#wU-?GuVnUmA-Ng^ygg5@qugC)AB;@)O=d* zHQKD8pOVTo0sfZ4Uj+W_*p=nsK4(JR!n2JZz&gMsHaeJjyZGM-|DEu^Q>txYeSo$# z14X&YV_U`=)RxEm9_tacgZkbO^oh-vfLjjE?wb{^0^Bliwr+&LMZqlvXVxa%b{2L$ zAIE)#WR&jCOYQn6{DiJ^>yGGN25u}k`%I}G+$wNI;5IN_!|dK|bHrFL_AM@q1P9=N zB?r$=A$*=5{P4#irN)Lz-bH_OeX0$G5vK_F)!^Q@kjaVjtg!F*QvZ6E829I|LwVhR_B6HL zy5ki$PvvmAz)$?g66SmmQ~uC5>L!lI-13L*$+tH`nLkY~e+>9c`r)S&ex649lE$*r z(5By(s2q?LyJ&}O<;`4cz`bzmz}0%VP2d)Sv+c3u-4M71;4YD}!hC{dg>7dGacrG^ zE*$t~hToInDfsk~P9We}$0!x=!TxW-^B4&PX=Pcs?MG@G6}WmUc_;0~66jle7se10 zfZMlWju%BX*oh-P5R5Gk_Rgdq{+tCED~Uf`lGaV&MuHo$?Q%8kahexVjGaiimUQ8H z)!l5%+;YXVe}g~z`u%}YW9BCLdoa%VI3*89QXAji28d1;*@wz{CFIlEm}p<T@l!231qoIpmGd{CgrWcUnf2*-kO1@e?Aj{ge@*c7)#o)u8@rYUE6VO(QQl3_pJN3V%rku zP0+V+)u8wNOFw-w(w5i_e@6w4#8Tfefu6}+@kf-$%UGX6cuDI&u$PP6nFyRB_^XHP z63E_|ZanMeAzp+H=wS&+vuBWE+9(NbH2&5?=bBds;~RyTD{C6qHh^73lBr_jnA9(czyGf+MPA0j^|=>z3~G$+28lGM53EQHbeJ3O09 zwNvB^*D90CvO6=)$L;i)d@FQqTsNrubdtx=!Hdx+;-vtLn#*Ofk{~p$A z)7h&VzKj!Po5b+4FU!SH)!$+zZ_Ba3vld~PF$?Zxd|C}|cGqD1XQ|<)vpG3xa`i9+DzWS=r9&5c5EG6eBSC}@DLcQf#7CYUpUqAT!zz_@inZatW8{B6ST z-ki%tF`6c$KpZD}90Pw7WoJTJxlz%MIeRsdG~v%k-+wS}NwsUYeBJb!?<1X^H2Rl_{-MEm2f~sv9M=EHd&jckjt(Sg)N);3$)vpS43kk_ zSJp~hD;zay7Kel*-x!p+WSg$sdO0nYBF5UvzlD>(ZcP{t=Sz-<6$`T{((WSr3E zRj2d?(r(`g*>1=_gx^vQ^X1_Tc4K7D&dU)yTMGB+$f3kHa{bq1VOv{q(-K>FOpYHq-;!i9c<0-R~P!5p_Cfuq(#)6^vtaRFLH)1_u-y!{G0mi}dZ7R9O${*ay;dZ+a z$?ZjJP+m!*BD1B|)Sqg|FN3@cf#s61dM&u6;G~>noGoXa$?pZ=mw=bykX$0W1l(ee ztne$qH+p!fM{B_^0DlaAi*B4pl7p#|xk~WwX1GgyM#&-)+Ohj&;>>TAn0??l=Vg9& zVBN^PqKlL2ky)QD`UvC4Lx-6 zyOni;zyl-g7;kEdj%CoXBs>(~A`hHR8|-;M#`Nc>$@hT+@9%DPxD{ROax-+yID065 zUuwJSjtN}5ln+S+zVx3jm@Jhto6v*usUFfj>$n##0&XL?J%IQ#59f^gSR-xH~I*iDi@m1myNN#}+IU&KV64i| zBF-T$2q}L%?-vrEB(~E1m%Lxk`?q=T9IgI8=KX(&-#AkFBDx>S`v~t(;(a~u&*c3w z-e1o9TZoOs$BC>&Q0Xv@{&X7c|bR`hGQU+{j&`eXU! z5c7$95lNNE}DJlz2QbOq@bIi+DcqV&av=ZxgR09!tEHXw&7z?r-UAD$B`o za_|>9+TM@A_&X=*KHCZ6Ki54A?)gsa2$h#vm$)b2#~l2ZaEF`YWY~MT%f!}X_dYWN z_xbkT#xr=G=DXa>`>Kg|QRXNgOL9K|?)EIx7~P%gRW2jLaSp(rb-#uDJw)5yH1YmX z;&a4b5Z@$zK(ziOe#zJE_cMNvjyJTOvs#(^>E2EEEIQcv>SDTEd5cJbxmwb=Te-G0 z?$-b6H15{_x-{z{qiK=6!U7&K&RLedh;uCTV>tKK3B(j`ZuipTPUy@;;v% zUjExedpT2M*h%-;2{O4JejTz&<@erKXRTe7|A5#{{D}Au;-|#Vi37w}wx~WE(qi)6 zM`-%vybm3z_gRc@FYkBdeeGCvf12{0WAy%6-UkoS``xTO@Au|?gyGqEq{ICv|2YN_ zB2zI=@YNxB#J3B2#8dpPM{+)H^s zK=<;bdvU*!_k(n=NV*sIrM&-=?oTD%i+hCka5ni-$$L1NYli3kHqU*v=RTTrFZyTk zUVh6p+jBq1bAMgZz4)o~+~4B4k0srU{yUTI#s31{+xovS>0aC);Js~snv(9t{bAng z>Z9X4!h2i09_PJ0wv=mG(!Kb9HtAm6pXa?S!O8Wa=l-Rnd-4Bj(!I#9=KWgYI^u`K zO~lWL14QvFSJn^J-bWJmB<@E%ka!63aN;;(F)>UmC!R@cJWyBMB8S_RHx1YRJNh4P zdm-tI%v8B&$O|WB6+T1xS3JBEQU1*&UfTH9>B_%PUN|YEAo+gsqFegR*jXxXc?s8# z7ahs`Uy{O=7Cdae6p6<-+ zjb`;90-tC;i>%moXQj&Tnugyei5FYXKUd|)kQW^i&)##CAD4zdk-X>-`OplNx87Jlqj`O*9Z>BsczQeKtex%01Z!+?ToUhXzqzJZC2f7ZYNM9dfB&b) z@HJAA<|6i?mA7c0De8twI&J)$YJO`9Zt;ccp z)>~(bIV{BGOMa^kb{x?j(tB$~^2}2%i+blc7}s4Zziqx?oM`SpvxF7=e}#8zI=$-p znBUpQX~26C3yH*3v4hw}>>>6Mvrl07#6n^* zv5Z(ntRdDB8;DKB7GfK*gV;svA@&ioPh|MSLSiwoj95jiA=VKah)u*6VjHo8*hTCi z_7SruFnnSmv6xs!tRmJB>xd1+CSnV*jo3l#BK8pbh}kDGd}1N7m{>-vBGwS=hz-Oh zVhgd2*g@a9*^5|6 zEGCu_tB5tkI${H{iP%DHBX$tGh&{wUVs@D6Cl(TmiDkqpVhyp5*g$L|wh-Hh9mFnT z53!G!J(1xP3yHh;_sUViU22*hcIib`g7s zeZ=fChEFUc78A>eRm2)%9kGGfL~J3p5j%)o#2#WFF?$NbCl(TmiDkqpVhyp5*g$L| zwh-Hh9mFnT53!G!UC!`{g~VcF8L^63L#!h<5SxfC#5Q6Fv5VM4>?3ARW%$HGVllCd zSVgQM))5-vBGwS=hz-OhVhgd2*g@-vBGwS=hz-Oh zVhgd2*g@h;_sUViU22*hcIib`g7seZ=fD7(TI(SWGM+E@BU{kCsVi~cDSVOEMHV~VLEyOlr2eFITL+m4FS228IA+eZPMyw*%5bKBy#3o`3 zv5nY4>>~CM`-s`+GJIkov6xs!tRmJB>xd1+CSnV*jo3l#BK8pbh}kn3KCzHkOe`Z- z5o?Hb#0Fv$v4z-1>>zd#dx(9+?3oOoSV$};mJzFnHN-k%1F?zNLTn>;5W9#y#6Dv7 zc?_ReNGv9n5vzzb#5!UFv5DA1Y$J9MyNEr+K4SLy44+s?EGCu_tB5tkI${H{iP%DH zBX$tGh&{wUVs(=vi;%z74OO_darit~<{n))NzQx*V)810+cNuzWI?`rAlo zF1yb`QboS{oz-W3+IzdcdQQi%cCZzL{$Qr&HM887O6JNd}6RQGJUuO}aTD%E{gy4RDR{dB7P?sVTm zzVVq<_kFB8`DM#f-4CGqA;e|Rrn-m87d@wZglN+@neM&hi+-Bwzntzf$S?4?SI~V8 z`Cx0R{|MbzlJ}z};W{i$E7ye)6LFUO`Y|22Jr6nkAUWIl?H z=j^}Y{Zopa%N4CZi{WRLZ(OC=`YPqtD%Mh8gyC3!38er0PL+>sP|Rnz!Qbh9<8z7$ zfBez9OnEPMlJ6xt)aUhY^To@z-=a^_(z!RzQ+L~*c>UY^ZTYuyf^6%;^4t15?T!mN zCjIW3Uo=NQI&DkW_ZJL)IyEZ;j@Er!?PCj{<33OP>jJfh$9C4|wwrnXGVjkLE+W3Q zi^@ry{H{OHJ#HgJp^ww>J@p#CSN?&={Q3W;(esxy{Ojb~7@x(vYW#;h@|(!#^ZCD( zZ_e9#diUV-bDJ028qK7W-=E=HJ@&b>y|-xXYb5tqZmYaK#gMQQtIvy8|6bH@{ab!N zPq>!9ob8Uix48UGEyr~EV)a|J@ku9d^&UT8^;&-zKRPnZ9~`?EF70!?pL~egtpKHz}+Gj&8!TK|$OLI>aE|EjEiAt|0&9 z_cpH#NCfdGh_VQW@h6CUkHzqZ{f4ora0@^HJ#Gx86wAzXVu-Ud3tSEad%)p6@K^u| zy%Y`&tr9N6IJJM#AH+pXm5QIe^+ zY`#jLg*rBNN8Wz@Ho@kr*r?4{Y16~l;(a!@F&~6K+y;+9`*$k-zy~Mc^IDns4ZpD< z9Hku2f)}`jf!(-m#&2n3f>Hd59Q=ggzx^Pf$S2*m!`;cG`z1gtFEYa8&k3tc3=qS8 z4EOR|ctN?B%U~wm@kNN09eX=$ES-f3i*+0=D8W$iHUF#gaI2^Xh8`Cs&Yv@_X2o0Vaq) zLCL#`_&W%HnA6AZKpvFg?=;-+g!R?$K?Z4dPQyCve(-QLxP7yn*hYA)g#6_gsN(0a z^(=XUfIJ$rBX7Tc-r9T>wDSU4zo~_dU_Gl9gRKzeUC#Ab*MfbtUV`=iNhrGzIAC`a z#f-A;jwrT6u3Oq>=x7HYJqCy(4MKmr$m1`H-!XW%R}A+~n0LS!e#U?f{KcX`=o6VR zxOQMWsF?iWcPxw_K)GV}PwvC`lPgR)bK}bJHWjjP8^fQV%#B7M0%Dtc;V&0T#Ws(` z-vJO9gL|aeISPVvaNh>Qz7iSKh(W4sMTYaR^(;B(2_nHAHv9G41IgDA{^YXuDs9KU z+LrFfTbTSr{2he9uhP~^zIxXO_5=shp0FctzkWYv^HtE=tF$L*2YRo>Ul>hJ?T)tg zE4Q_hpXgi61$#G_oNd6d)ef6QUZ5M2e&{Q;2R2^?ZNAF5@p|q5ci1fQ;_HkLBtO0D z1N(qOJJ7zvX4O`M$d9jTvo>Fo?G^o%Jm1=3v&aLn)fn-sjAi*uIymh5_ z{Q7^H15-{t^@L#2#5uKBTyt5l_^9zmg$`5j1Tq2lV%z$d7Mr({#=QS z-JJaFbFu?@`{f;yw+B{HoZ-w_U^AT}amyIY+ZF%H?lKnd2XWX~1ztsFV^5~=RUx_ni`Z>Xg zX9tft>e!H^iRlw{5|N}!-UpM*QZ~uIVL93a&tW-QIg9Gs^=}jR9{t;-eLIbRtH%!m zD2K)rt5B%`O46RUnCvfrm1lb{V=ABJ*z*!o`4Ne86;t`_L_J95cXGO!u2eq9>GZtk zEbakWmA+_r0s`1|X7e>wPc9y!NNJ@Nyb+&xZkI!=o>g{a6^%KBX z2a0_8e5b^h-^~g8@(9!CT*m;uj9|~TbVHSVz=+Q0J?wyk70W;P#Zy+?hF^iiX_%>Q zfnldys(ZkZ8T;@nV0OCt@jS%S;}npQljo9B&2s*os5jPGo(*Q;#943t%N#euC;v^0 zgmR4Bom!4^94J0RF|1t5!Dqs*vMx!rt7+sz9{vLI*Lrwq1TvEH-)g&qd=AS+TXigW zQqO-pdX`W=Ncj-%8cp|B`~U8~Nrdlvu(J>;UrNIm*AOYMgQ8^YJiLu1S=a zW1d8R^jhV=t>8#Dns95CxSx9J$lG?~0rHE;Kfw0na`F;i(NlY!>M3A>y@T5f2j6TT z)b`{ub#^|aeB(_@*z|r*K5~olugF3Ku3eB0(Vrhv{wi6Nz;%0#>Tez?Pjwxq$^47+ zY9TM-b`P-~Q*X{UsV8=~63?Hf9*(4ZIrUJza|-#D1FA>rm0Z)Te)2ae?NpO5p&st( zbLLq2T#aWX@?x)Y{lMz^QsZ+3Hw!%i-p}5agO_~U!t#o!8s`=A z%>%Nl8_#fFM6J!{G}@H zj3w_3$!>kRTac+pC(bIrewb0PVQ$Ui~;YV!FRT7rwI|NG=y zGnMCYU``u(CrkNLnclVJLpv+~KK1_rykB}hNyC4chR;PfetP6P!N&dvG~&NKRRcZ} zys2M%sa-wB_!N^5?w!h?LOw!yeY+FqP?HaP__M+L#pfc**N#^GS~`w%Ir*rEzc!7Y z@1)`HPQyQxhF_kBm-fRi{%@w?KTN~_GYy}CVZNXKJn&Lp-EX3T;5u41`QzH3eDFQx zcO^eIjh++I@RQT<=ceIn((rTB@G zSsH!-yu`ot090697s3wY>TY1YJBINI8rswr@3&9`WN zHXGJ)z6;(j{`VVs^t08P4~3Nfk>x9yKO7IVkdKm&QT_$+e)?Zd!~dFkVi%_Bf0w*N z-sn@%XK*U$U5a;XE`2k_4E5{b5-1#Og=VS<8S#hEq|Tz^_0KB>Y=>lF9$F22}%ct z>jXCR*BklWoY*|Ilb~^RoEZ7AhrgeE)WiSS@KDP5$X+M8S}Z>&HJ&e!x8JjiF(2B= z+wbF5s2b-@@P2mn`tkn!duil1rQv(QOa62ZY5u&ya0ke@N=J{2!x3j!)B}^B{AznM z+lRx+H}9ee%4fR9gZGR7iIk7+rGgi*-Iz+gyFhu#FS)A08@s(h^HcxDx>_3jH&Rdg z;i@NUv|wKw`QQ=C+h-?_q|x&X{I5e4(mw zwvg{8Z)eUK7{H6XGehNVdh^K#$+MYs_9fqZp2`&XzmxnNEb<$>BL6AFy`J)&SF8LX9RJ@&-nm72J05NzA0^o(-CTz3kSuLtj^XFm0W{-=6aeVxVR!yf);upBpBJ%lJ z%47ewxo#pK9HIR2xbM^u6SB`~g_@k(&_9E4z|6+4K`Iv{lkbEO~ zc`shB82R?7YM4v@N94noD8HETf0}&vEXt$Zlje(^jXyp(U_JDT1g_1BVbC4Ue3oaL-{ zzgPL=$lsqv|BtQy^(t@s9r+BHgxgGhCiVQ9yz>W@zmfcU@-g!2>NxUwG82FD$168q?-32Urs*uXXSrJekS?QM&;+TeqBjE{1@fF$N1ku zzLWepl>Z)hncubFruGn`{36P?_o$vJgq;%6M3HROB$u6(Y7 z^8tD1UrN|?eMY{$SNTV&KQmwRvsNbNxQ?fuQRJgvDq-901If33p}bvZK8bv=U-=fJ z4eN{KJIU|MaIYZWD-(ZQkC4BKeB+SvZ&T0RA-+<0v_F%h)aX0~zi=$#;5q6s?hWMyMVue*pQAhd-8l)Wc6F-$*{na4#d@OCC?o z%ylFA{A>;PN%D7-Zzn&V`SUP&Cnq(YaxAJ}{;Z;WWM`FMO8vjHdUjEM67_ed(eoMQ zYxh<8T*~i+$6k`pvHg^{<+~sG$Y|wlevTvGxlbxzLB83;UrN5#!_O!0Fg{l?T}#M^ zJ@U_!&-d_a$afZKe2$@>56QQax9#B;@P7Fmr+kd*g_)UaBqrvj-6Q{Jj-&P_Un>h) zxVp$61l~{oVU)Mu!Jce0M$ zli4oBx} zI~=8+Hu6F8m~NPBwUv*te`k8%CExxXiyz>9OV7@$<$MOyXrZd`Y$5iO#YYT<#DjsfAkKO-$?%ZZFEhV3Sr}Eda zyj~{X*q}Uf&-p$1Ru8`kyo|@9kBv8aZTWsd-g#VkM9y4UXpsHVn-5;%AC?7MTz_M` z7fK@^w(>tw`3sCMJcq?*L($Vr{yFlMl#e{3@|(zCWA!vE{|xyU`CjtZF#ZpMm--uN z)10y6wo0C$seq=GYa-5`4Ib~ z>apv4r;zX6p!}mu*SX*&UCVx<>9Xzc#guRVv&#RPm3GAZI`h@9V$4}DYl6&j4wl}68>!Ha!5PpBQ*{^DP0H5$CJXITKpmB)NIoP6X2<=-Gbo_uhE@|RHm#5DS+Q9l24m4_La z>k{%I@<_S4ZX+Kduf81Te)3WBGzaGq^0nljrJk3-%YK*`_pwCD|CaK>>8jb<&mYN$ zJp8BR!{qJyPYxz@l5bJ+pD=&+As>sV{&yL!95x{G5%PzUKiTS$2MV~ZWIKEgc)#+x zkn-JEs{F5*5x0af-yhFZ- zdLrbdVlOLIe-xIu~tN9bv)5>@rN3{CY4n^z`EW*#k+kJ?Ciz&@}1=^-D^QofM+{~z+9os?feJ=u8hA^F@( z{s62m%M~Qwe4NU^uCx;ZFa6`Rx3vAY_FPWB%)?(qev*g3g?v7FG=t{4n|z2ora9(% zh4i?{9kGV+}s{^#KR?Cmx1lHTr{G+j)t^CtOT@^<~?Z{%aQsQh=B&;8_`Ta~|_ z8L~ey4)XxpNJ9``ro_ zyK@J5`+W@CKKz(`h~K$5f%<<&zLxy{4B*$`rJZc{w0j>=zLDSiu=@W;zSYC8eM8f0 zzYlUC!yUc9@(#c6aT57s$lLFRSbjSB80E8AF4vH^-~ad(_1sQA`co~heJKC9)gvdN z;F5#B<$B%f;de^*Wj_3gy!~!Ti;6pOtG`|KSpEQX=u*D+yD8fH;2lBo_B$u`dBJq@ z_WLT&u^=xaZ@;thABKCo<@wzdtN+L3?e|pd^W2}4Z~V2!^Dd^Vlf3O(0{lBDqen5MQLn*(Oe3(49bvl11-<+lL zc3paaeD?_D`=}>3sPXU4R(>Mwp@@8FXXUS=J%`CR@1p#k8x z1m?qiw%hH`#l{- z$2pXIC%>~}`|Fd*cazspu$_Q>FZl-@y>0?8?N~S4u_*cb!TZH$3H5Z|rJAp0gjS@H zeLP^#jVcKcjl$hRe{MTtwKfd`E#d&sjJx2s1u~Y2=Sh!ygY` z@;UrZjSq&w=9*4EO1_Z%#pD~w+j6;qe78rwfqcGf%)k|8Jf9?AD;qO#%?ucDeg zQ2r5?%M|jlla=phxEEOd6y=A=&$WD5`7-9i0`i>`mACo)IQeL)@|BF|%jDaqDSr^_ z*YC;qRw#cG`G0};v!5?1@5sg*T(-P+K}C@K$tQ2epQFh~$lGH(ytU6&le}$bPOlYET) zW7IQ;d`LD*;o3z04)VHH^0xi|AdQ}n((s?A;lBhg<q9I5tn#0;f%qJ} z#6SNdjlUf)1rF1E?tMw+?^QLFV5+ny#l{7=H1;3-W&a{b~4ShTC|c79fk) zSxLT`ylww~PrmmcmH(Le@G<%BgO!)}=;Zn@`B0(qr;y+Ea4nbGBIVy_`HmwWk&TGB zUM4@0eEwMFAEBMkAm18N{>g0P&AEzv^f={*D1R$>zx=t!%9pCVwUdX*_mY1@)jLm- zZ=bC4i$p@z^e<%48 z@~s~JO!DC~RDK2JuP5(BQu+JIx08R7@p+7V>@1a!FulJZ-&v`=-S6}c`QCF<`H#ux zpPR~mNj@|qmEUcw=0jwr@@pCH81lht&QDE{yU6MxIxF&<;?#D3^(+oh8v^ZJ__E?K9^Iz`FWLp zjq&*n`Pvth=k{^uFXW@IDlhK|$o0Q8`bQio`L?IClJiH3JN0O%{o?Zt$ougHY4~6o z{!sAJKeqR1Ja^S-Iwz9v^zhTcOMB?>yPS5N^8)aG@u{Jn{65t$?_JAvBl*x5${$KQ zxrcnTU-{K4?)*57{wLD#t<=+e^hl#&SL#_szLos97@v2^_a3A2r%?VM#6?- zRz9r!t>k}V1oj_3b^$w?Co$4b0Dj$cLU% z-o7s|9=!A~&1}z07@x`D{qpUMH2jP-{Kepn-LBPeSzOLl9V*TKY?QZV%U%a0S-Y=d%rJl}1RR2xX(@s88sQg^=Z(Dit2eMxO ziM%s5RZlN?iBD~T#>CFwt0tq`Q^&rPJR;Qo2M#o+lN^;TzNqT7nAGMTm7dg|80i*UGg#VFH!$Pz7SB|GrPc6SEU&{DjX!Kxz?9&?mX7blk-hO}H*01}> zcT$h#pCNC*XP-|!Z<6n&{Qivphvf60)b!f7%Rp9;dp_=lI&;5UVop*p!#n!+FRIEs_VK;WMU|5P^4Nb8@RIE=;mfb9@Y>8Va zikgQ7yHT+}HFoT=>$9!B>)IP?Y|pOoiSq26EL65AT za$mU>c0LpM8qVFU*3K)m2V864o|>;hR-qnnaW!`b{;$h zw|SU8%(E5#qw?!u|JBHMeyMy*>^DEeep7DmeYy?#h`dYAe-1_dIpN*;^Ht=teN~=h z-Hf8g={%I$fdMey8e%74V3zl^V;+~$q@OS$-ROs%E-dfLyI z<$kC;`?nT(-(JPHqz6R*EFVr(ydRN?dE{M_%3HtiuIYhq zi#^}K<8WKQ>n%Tgd1Wi)SBDoW_-6281s?{FG^;&Lq`Rl-hf7$7&p+TUqw;bXK1a)s z?&2id13$e7KCcIUrSQ8-;Fr`#pL1b$S))9xwkVqL**yH`@!SL%eKAnS-*$&|0L1hoj(WmARj}2c9y1V z_Jbe2j0*FZx!zITR2A3-2(lm!i(^g;1|M6a9a<(4xaE2>dNP3 zXDc`P$KhGH>3>CdcYfPdZmhcFAEGBeNA>Sdx(ng%MCCMxZe#k32;9>B8~G^w zcH(4}oz*{`C#jwj(Z4A?b+Yo);3MHB_#pHo;L*7%e-7=^;lh2p7xfQd%7^JIHw9iA zq`W`+XTT%K+qmw;c=!G}g>+-5Yq~O=2%n4K8MsVSgwM_J0{m3?qwx3{s;8QKy&)t$Y@GzJX`XQGN&fcX%wP+}77t-G%yiu5z2dS_d9KPx%b&*$UoqzVZ*? zW8wJ=l+UD{Kf?51s@&EqkA`P2S3Vy-r@~`bD(^3G=|2|;_w87oc1*hI@VNu|#C(;% z3I99{j~0~k+93BbJaf15S;&70&)=r}SnTPwtNO>?tlYo<(SQ2FOa8%j`D}yy0O8%$ zqm7U+-j95^O7{6~rurifC|?&o68RW>ZTPHQ_gP27GjQt{j)!OAHjj5Y zyc2#f`MLxidr@Mp8y@LYzBlFd0zCDq@^i80eR$z@;l3Pm->97jJN+CA zFTqzPzjbi;oyyOKA0xaw{n;M)={@lC(VtyOdxY1Wey)M1R#qi{PLryFFUEcJ-@Ry zJmO!7A)lMVUuoyy9q>DQ>4^#O>~1R0X;&+}yL@Gk&mXSx2V>{SJ;>*f@2pe#@z`@Y zJUT`BP6X)PJ?Qyz%kJ%YxCi-Xd*JW&z&{oq%Ih?>XALU$LU`dq<D3S$>TAt+2c5 zuZOP-&n(o6wI=#EhNl|TpMJdSKZD`1lU0wkW8>lZ0jj4r6X^S!o|jaQS|#iL@aR`6 z&$c-?7v4EQd*q8WS$6|Ge~tR{4|oSW`wFZ$&^ffv3~OSbE+7c7ED zXDP46KP!x-zQ3pC#kK&q9z42>I_7!O9S)E8R{s>ylYkc+RsJIQEaMB74I1`D&uQ@d z5arJzf35KYmI;!5;J3rwfhsSz58?A1JadKSs}K2o51u+p`DMs|3oraj?YDU7HBS8y zJ3$@!HS&GorDIjkA@D7XU#|H*hjwNJyo2`^Zif6G@YHk52C@fy5_lV4c_(Coh)-r--ADxVvWzZsr+SpB&I{<#m{dAizDkNivU+@2b5a$6lf z-@^0Mixc2|WuWNWx6bR;4>Al3pY`CSHnr2nGckC4mfE=-^5fvKqWZZ7z7IUrsFIei zqu@pAg{JP@9Fs5g2^#$S?)~Q)c*psg-^uC@_o#4xzaQuQ7&cCR4f)6nwcPfFmf*R6 ztDUyLV%a^^4|z7KKds5Sb>Z$eO>j1RBs{@;O{?Guc+9`>P(B0U)8N^+m0SED1J4i- z=7)KvhjJmi?n=`WSMn|T3-HqS>Vd=HkHhm@YQ1QpLF|Ml<|^0OBzYg8>5pkUwmf=% zgh!{Uew+VUalHCJe~W53WLv#pHQ_$4qUUIN+4BNh!8@cE^PdG|cqBY=p{Bcqs&RXv z{|&$3C?A>=*I@b&TOn{>|Ka`#kDa0MX7*nMkJJ8KjG|lMnIT$p#|CZA-EVwF^|Owa z<^NK_9q*m6`t=dKI8O6bLxKGcPyI_XdMWzX+*AFN^DicqkHyt?@HpcQx&=2Hp5pxm z&!GQ6c=TS)=?3lbZyzE&*SP}xIOIENC;O4#i;a)gcsK(2JK)7pYUiKW`64`ZiGuAJc)el# zGfgp%o`vud{qkt|s(Y&+3XF456WCs(mv{k#9f-Nm$82v;eMQ)*-U#O&6t{4i>?V$CAY`L*;$GBoL`VWM6_Ym)Bl6= zDZTZ?3Gi6O`1xFu=RGY`&@&(Iw$=PT3BSkmFb=f-^aXe+qw-Wc_qFj}T8?aYc7MSW zW7W^MqQBn+>enUePn%ba!lSIG+c<3(c#b&V9z7G_+0WGvf8&S4g@^mNqtF1Kf_&!y zZHK==&z$qr9`}hx$o9yeht)LFylH(8F+d%c?!4A8#G}Ux^sz| zsql_3)c%?9%i+0;m2U&T8}43H`)?rK7vY&<>d%45e{T9WSNToh3*pgiHNO$~O8cpQ zG6!p%*tlg2czz4j(~SJi@Z$EGueIU(n4U}3{;AkG86KtHO+>yG9^rwK>)|KC<84}h zPlcZkPvB>Z=PThU{~}`f#E`!Y9_2j%li{zxb2HTs*TKJl7k^OAdrE=PSk=Pr##BsXZEv&V496v?rVP z4;rpU&kx9_uF)35?o(Elfrr1pi?u7ac5FR(?k)9mHF}1_JL&h|gpV_M*2n4Y+@U7_ zs0P}8_~&SNb|dxkNc^9L=lwr^lFu{fzZ9OK9$7nZtMPr*{%y24-E;8xJ{k{Cqvw5i zXRFF@4llvoR%(xx%OCLQGn%6>v4712)o<~Naat9;#Qn<|$WMS5r>TB!pIqAXTtGX9 zJ+t8%|Bs*KGYLJH3-|rzA@rMM*WG0D{sr3dsX_ihcwvz0`4-2$0FPa(HSWD|mE6a} zJGfsv4gNDc`;rEJ3ck!i>WAWUT3%a|ZWP`zQSB+xpll5<4A+Pqik^}1{P|j5$H6C< zo{v@D=DViAGwfHn75U>#5A|*xcn)5er+%IbzZ{+@svnle{yX7W`Y(G9@oCf3SM}_L zo_9??uly7A`~=VMq5fZp{ED)0=IdSdQ4RbF@O9y_8S1w|@Gar)a@BJwd@Q`QNaOQJ z_@VIJZW?dz!0X|Wz0}VGX~$-p{ApTHn<76Co?-s54t@(fK|5^i$zAXi_1D^ym*CO2 zv>mX0AfLiJ7_aVt{%_%>X0@{hzU(3Dx6GO9=WpSw!z0_N{jzN!d^Uxb{?v4LgpY)0 z&r|)kz$d{wUQzid{y7RBzo@G{v*EdmG=A2i+|L#6=POp=|HW86y~^~kAI$Rm7~FlX zlB2NaKc;`S>YqwG+2>H=hw`=db^yG1pZe!V^lSr5w5cB+K+ha_j{8I%P09Wcc;^vnkL~}w4W5{;aXt$>AB7jVPuv*(5j;9malr)-qL{k`V~1s4d>tNxmDr$igDeV@EqgD)zQDLaNpj>KhT!S%5i7pGmKBN z$nOVFaetAAA7S#0W2eE};hiHjUsvJJv*E=$E%y}iSHcUEv>ZF(51RZYUE7Tp;F&!& zkk@I~3*Iz7Q`?if(9`Q5>bKGiEw8PxXAR*#o}nR`RD^G{}1FxnI6h_IPw$V ziBr|i0q}$2g)g+crl68$QLWtL7oos{alRy zFNqrWI`S#n;Y&F2F+6^=TCyj+Wb%yDtY2I1aP?>58TJ21$ZrUbovaqF2_FVeu?{sK zzPIUlTI;Fp|2Z7qv8MWe7wTySo|vsQaWs0erk{DO82lX5|BmW^5dU8f&oE#yKimnA zf28@k7d?-{vyZ5MHiEwbk0Ed6vcTk7$FcsRWPBH`7gitthUa-se0}r}kO^L2-{Z`` z)xx)iXBMbE7U#RbJ73f|lx{kF#>4ZkY5QjLtB0BVL0Vsq!Ous*qhG1t7NKVrJjVUe z6Yx`nhv!N8|A`6sImoBBQ9XJ1)yCgY&)9P}55VKh2aZMldE;#8dmcOAhG))I@EY=8 z!ef_f{QLp`3tnJc`l=SQTT=!Y-p|Dwv|U;rz7srGu?{s6o_}Bc{{s3a!?S6P&%5DA z8;_~~tz71so?p~IUz6@-@Cfr}MfA)U?%RP875(ph$d_JHJr^PWl<8r;pacE}JoTMM z?4R)O;8Dg2m&1P(?%XOa&OQ*Z>zh=+b$+4otaoSfoEkh|vEDHlp25ypDB9KdZyJYI zUnaw2PW^24 zUQ6m|Rk zi4%LD&jLw5Om1^*b{ zalWQI5B{rh)^jJrSC${X+#|IAXTvv!$603|2j2xA7c;r_N{5~4K?kso*@nhv)5FW;j74hGJeC`g7TZ{9zgS?EdSbtBE?q|qn&({FA z=h;`RQ9on{s{d_Y)>`n~BN}fX_EJTI;gO2<=<#sJehlpm<^8De;>k*EpVBnpzFnPP zF}^w(`CP5~$HqVN;H3@JPPIz@9~V5uybbPjcf%d?kXB!wg~zwn`nv_~(ucK)KL z^7}nJ#y*^r@MoV|^;;+ZpXDd`X7DWgH^yo>x?ym~eeNjacNOmaa4P)^$-4cJPh{23 zxtwT%7dBWXXuy0o-Q<~1wsFyE@aW^cgZvxlxgMTpo~npFcM9+2R(IJm%=3EUS>y}< z?AktjXx#s!Sozp^;5T?~8ErRas~Xo|DzdM4Irdo{4Br%9cwyN4fMq=lsCjZOwLGnT5Z-aNful38GD}My;s4rIT@4-u( zsl!%B&nG5-pYmGry9l1E*vGYsWZc)s6!U&_(6bplww|`zJN3~MJHR_fsGs-I?77|H zg+&U+lHa81!9VMuKLd{*r~0j3%EBYu=jM?=AMW7V+BkO$yyFKguTzolfR{>Y=R|lX zJj*)cPVgc;GD9JG{8F){B#=7f+g=<5m7<40<1)=Y1?M!GC~fn3vuh{mV~N zKXfu5csP7Lcx(kN#{uZs(d2*BxP1$ICc+c5G+!@L@9Iqt^I%c*Plp%QUn!6U=(zx1 ztk@@WH$3v1Dz^7UykzqJA70C6H%;Ds0FSb7aE)-*xj*2J=QW;&_is=?WLO`uavunf zuB-ax^6=Re9$BObUJjoK&$A!Q#&3=A;@PUl#sen__x($@qJOyz`Dj+#nFs0EZZ&zv z$rOuw9{B|KmD^#@+ijxf75R44KV`+Bc^LZV!m|yGLy*7HRLGdhB@z9(!2jt-bmN9{o)D+UWTcUVK~mNYY)s$(OIN`u<9gj|%tw zSLP^ff2=<42G6t4#OnK@@WOkl-`+cVRM5YMTe~8D+K_h(Rokctij1o* z-2w0j4v-gkg-6Gzyw#U8 zP5+l_h|SksYVynv+=rgq;RW`U{Rn@;(l z?0?msQJh#aL;XEf%h&v~IXuC<3d?hp!gPq*hN8r_gui;`9ado!J595E)KhET-Uwgw3ffp<0quSt!J=KuU z$?y5_EP4i^=O)unJ97g3et3j+w7cQY!&9efJ+=0K0X#RTUy%F<@?XQ_uWCDN`;`8M zmo``aJo2ly(2iZLaWxt~5Z+m(`YoQv!i$Utw3KCk2Rt=a<75T=PzNu)sr~*w@EPz- zAFbCrlI|HMzd-G={~wfxckZC}$YJ>0BR_ncG_fBW_3mlpqs-5bMgDDgg#Q=wB>WqA z2j#L6+_mB#*8BbmUl|^)S9@-PuMdycX?d-o&4Jqnp50F4m&7MEt(I(ZerRH4!HuYO}3$3R%{@f5=`dJ;*LWW}||FqhFpSsVDgS&0i&u0Hb zc&?Ym+s5drgLhV}vmayf%(rhse$RyG57u(A{`5w8iG4n!k$(W5Wt_GX{8@Npb@jki zIOrpI#|4_-DDsQo3HI|x*VYruO2g&bu_F8EtX}waZy)DVi3hb-o-;+h;{;9jSoH4+ z&+&ZXdhmb1^X$8O6Tck|FV0mx)yQYzQTB(_!!IyB#DliF@;o=Z<6AGp2|8Wh<8)Jo~rC?Y;Q(VYoX^19=+!MU($tVJ!?{|Wc^ z7sZPE(~V~+k5u&6Lxg+(ba0<8mxs^p@a$*mXH7-s0pO{BtNqqrG@3l?batOU51!dg z%XeAqztK2xwJqsB3@`E=H`Us`0nfAVB`iD2HJ`vc9@hw;kDfn`KcnS10lu~j2z`D# z-_;zw1|JA7oU8mE>f;!Ag88UH$R7&NRrsd`9%J3p;`s!4^c`*Yn$dG5Jo}3B`{574 zGrOz*Z6DEl#&hcb3z7c@o?~6?TzKzUn%@}faT~+egC}0qbnX6SJUq+$01rm~aCmf< z`m=-k{T6r!`&IfQf41qNJ<(L;d02SvWcBmb`1x*lk#V)HTXn!=>`T;M%(*w=ovgnf zL%Iuu`}$bq{XFC0-yk2kNaOG};_!d)DEn|uMSgiv=;Oq_u9hEw{ATdXdm3-{y#G++ z>=(86Z8SXJs*yYn{RhBf3ze7fLlZo~JbxAPb4*Xg{+~lfcQW2s6aH`E z-ak41-yhj>3y_bE)O>Bji67za1MQE@p5D@Nc>iQuwH)m|Cu_rV%!3Uk-K|ajG*!F^ zzKh8--x7!K50CTQ_at}&yu|#&&hXjr)HwD0CGb<>#m_Wg=g|?~3@=oSPacKG*iYMt zp4Z^H-?ctkfBgl#lXbw+$S;ByV_Ggx!XvZQZxLR+QA4?J0#B8+oo8E~8wt;|Uh@um z_Jc#L75f=hK92gudk@UcwT&0mG5Q9TGVemNbBb|f%UdDgX zc(?&R4Icek^|TS^C&D`)Q2A~3%bf$yWmMkQ#jb&ucn`_C=zkENn5YhJNB;tNN5%6v z-<$kq8lN&e4xipK5#j4syjl%;dVum(;R)^&H$i?Ac)sF!gyHZK^V_z*vp+nV)qM4( zfv$mfl3(jbX24?=z(yeZSW4}=Xb=s8eiA&vz6BeP)x#q^53&OCC&7!{zwAo6Ujpx7zy0>e z7vOPTg!9Vkdg3W~k$-qKhjRP?p6aLhy<5dy37+GDTEyMj|5X1ZKGirm343-n-cRp0 zKiBTf?FrA&4jhL5!{EjDHE!>K*TV}u@3R{G1mhKPayC50cx*T1uY*U*av%7oulc-*%x8s=WUD= z$Q!Pq7mO6{+xh>!GZYQ_H4gdMP_1A6dMiH|p5uLAhjUdUyn}rsAH$D>cRr>yj%3}1 zrib+`i_a_I`7<<5o<+|c@WjsQxAovp!84a>eHlRjeF~4PtMg z^7`d{)XdXH;cE!@?RjC8=GWq3Te!PI^{)sD~LiG|As$@R(Cq&L(L zvCq23!$Q-;bGyyx?{hNaEB1fJ;M)lI{*17{)Y9D%9_2ZsSCHS^Re9XxlC%Fji9Pk8a!4H_{U`jPo7?ss7<}COlEG z|K}QbVV3rc8zTQ8yp#EG&7E^E!aJBxv-`CL@FM$Xte^cF9$ThQ(7Yw_v%F+5jEiXB zYBhUqBY5s*EteejYy*$4qb2)2dUh~gu`gm@c#-{__THYP$ye<2%)nj6^K>T}XWz&O z?76}CPHLyk|33)N{H)xbqkjorV4d!K^eli!d0y;L_#$}eNcH?K@W`q7ZTj+o{D~j7 zgm+flCys&VSSK<&kAP?YP&;ir-wcnjUwS*zoeOu{s{9Pnz1s8;SJuwl4$s}$H)wc7 zzud#7pZ)Vz-=BvUCTWE`Nt1E!z!N-wH(A5oErdtwR|xvQz|H|u(R^Ix7pMZ$KM)?- zRO4p`daB?V-cw3-cL{jvGbO*E|4?`*>kFuH_3#+)1+w{v(PoFc?KOLv76pk(a*M?_~SN@f{$!!TQF)z9t0kJbY!ut3m^zQ>t z?Wuma8lHj|@6mpL1Nba>Jf({Nf}aj|74ONp8J_)F^*@Px2RwGJwyS#)i2s47*oSQK zzYyLzSLLmr>VGEwc~JG+`cxF2|5CZlKUBd}+;?w}J>!J?I60N^n3kGz2O(czJ#+^0 z4e%HntX{zW8Su`E_dcBtFELJ_d2pASJoC3}p?|(`U%#Ri>j-z7o(lOV;RW_h+53Xt zhDRAkS^Mw>+uAuqg{J>6B^#`)1}!TC72hr;#;S(i#D9Ny_BHJQ%|Bbg^UP!H zg8Vpm>@oGg>F^`qsdqHpoAAR-li#;*Ahv&L9=!OI#{X#K3-Ac*hNr_{f|sUihW-ox z7+x5xak3oc_%qxw&tQJ*ceeT=R`EWW&EOr}cU;K@L*NEz~jC921}-5Pc1yV zg68Wy_;l01iTdYK_{s2SMDz6n_FoK7^wNBNgZwS<_=Q@J*3>WeEWCJ`>aqP-ADVvl z@tQvu!DFl|?Tr3a&Qbs5*axe*aBd@bC;Mk?pVd%!Y=nBo%4HvT_QF+y<}1-(Z+hsD ztlW=>=YQ)LB*)_Di{Me-!#NN=x0#+v>YqjMr;IZ%WbHr^o^RLw*ZlAuJpQHnZ8GuP zTLyliA7@-~9pl4Q;f0?xKrScUwN0MqF0Fsr5+37z5H)TXJj?y5jbjgnM_y1#TQ|wT zGd!=fE$N;QPyI^+!Q$!;;j2k~kMknxx5!sV;9Okx^(^vHUERh zc#o@<%Zf4)8q%Gvkt1OiK5N6X4=NvnBVzCf`yS0dra z;hO$^;Hg=v=Mn5VQU=)F<*UxpeOdihq+E`J7jDzIos6Dy;F&Mf{%_&)O`i9SjHaD@ z6rNA2ewGj2r!pbaojvdG**$;L^lz(rCX(*g@Yo+3I5)vx+`M}|%gTV+`@i$Ru5rFL zJokqB?M939z)@QEH5_@zeAH*08xPNJpz(GGdJcsbc;DC2$RA~#{@Ui>PJqV_*8E!e zo(IqHymKvju7~G%4rp)qz3}*aEk_CO@OcHELJ!5|zJTX>G1VT(FMmPz{#++;*?)4i z_ESwL+76!KzR&dU2JgH;?Xi6A4=;VEfp7Ub#`M=}x#(YcPYXQyoyMW*xfY({ABkU& z{~v%y(pv6Uz~40em#RJ2lHV^)|B70#?}z^kFJixzvU4k5sBsm&Pxah@{`KM6itDVGcaTKE@KdE`dkRRC_js-)WqEnAYz+3(xR8f<~irpTcub zsfSk~9+tgW{Zn{O%h%??HiCDYss8zjbVtGSx2Qd~9-IaR|p1VN(_9XJ3!xNJZox~_8|W}^3jU+^K;X~dWZS>H+T&HoBlN}Q~zY1Q9JL^ zYT&kk=NBoc!sIx-u&Vm48Nc-ps5XNA`O-<`-se*69Zpb&l$+4*4Fa1 z_GdmkOaC6>(#PQu>ctlDFX5eksh(Ei;cs|>2g+~9pw<7S{>f4AW|QAd;Mw1`hT6V` zUEopTc0JPFA6|G*Ymmjy9X-^eHsm|zshut8nG27%Ykk}bei1y9)p9g{-Vb+=X}Z@S z{~|m?duZ+F0(h!X<*%YXE`(?KzZ)mwx3%SlI*c2~tGva@V0i98wZ!^`G4L4oK_-7N zJaVhX$zi0MfhU$%KW`5|!Q>y&p6hM$m4nAORS(CJzaemh%D!$xzR3UayqR+^n|@wM zQ-FVE@*iuCtbOith58}7v!=U0^6SInynogFynEnfhVXM=BqsN zjPtGBFEl+jtGw~s;BKL|V;kb1C*eiz)3?T+_u++IHDA}jzlP_ye>DBS!eiCiZmfoU zL?)C%oJ3X6$M7xSCDw(*Lm6<66D*FA;5AI%mUF0(dX=K`aYh&;{7>w7hJ*cL+RnueK+)->D8> z;`zkE_~AHsoc}Lo{=CBETU5_2PCs|R^DUb0xs>~p@aTNi@H_h73tX=)|N9B@`8lfR zKni#fyu|YkX3xr3sXyZzX*t@ysV(5Kig+FgcN=Q|UPI!0!*fG4U5k?=;l;g_+=P6K z@F>5_zfKAAqZTmz3XZnXIMH$2A#$z{D%&-3sI|Ch)7@E$ytR{Qm@ zbN_=!UsMvuw0>8s-%{+CCd}Oifg@D*wKeit>X*rnh8JgO`&q>`2lt>SiF}0jAk9R+ z9iGC@Jo(MR^EYTtXCr?lJo|~p;b+L-56@hz<#jmnFT&$<)c@wU&rSXyCC{Mecety# z?_Tj5^;_{*t#A*Ze*<{oBGq$BZ#{A89^KdL9g%m8f7B}H_J^mi$Lwr?cO0RfxAy0h zz%ioi>m1}uj1PI;kGlpQS*dF~`5-*Ii?+jZTNggB!!tbBVD@|hPgKmS{0c7+S6krE z$hGRXLPh&L5blocI?fprcv*({xtGZ^pJ4VJ4$p0*acJX>7I^6xjR$G2!{-cmc1KND z78}Cn7I@@OEs>L#QT{Bv@Q3n46uTnaz0%d6f5THdt3S_2e%0%UpEs3n3f~sqFn zq33y%e@^{;GUfh$;AMvJ^Wz@)59mpqxm=L6_OSQ$>bC^%Wqn26=hlR~jnzNrYw^3y z;n8N*qko;-8J-=e^*4h(6X5wxw4Jo|mlQlPQS@-t0;fA#$R@N?iD`>6ah_yeZ@ z4wb(h|8$!EwKQF`^E-Hn`5fcF!;8HC3OBg^H>iIc@5$MibO*xYytg(2-wB>$-qQ3> z3>=}duf7uS-Hm4^o1T#xS6^|>EO>E(`k@{^4<0*}6scd=_mJ-GJ@7}+6X89~FQdN` zo@YO#mCG0K6z{(!Ox(gA^#6f;g7L#h^shEw{oJv=)>B^V= z%JLpR)ANj$ppBDT;FA>ydV?zxU-Qj-l2k@lhn0vS22&YN)O}nN6nrSR}30rB=9!8^LEu=3;&7EYn;029qBR_ALw{z*wzmP9Htd<;!$er-~G|ktU@J^H8RQbir>xplTpQZecm6R`g zv-&6gYS(^qb$IlCjh_e6zdby~{ImII3_QcUobgHU>`p5L4Ym%|WP1Lo`X5FAN$|*? zYUgD5Re^I*_B9{*!b6(ke>wLgJc~V6PdiP%Vx03WJi|KF7U)^_7W~6~u9eXS@C5gp z)-H`SzP#FR{dfW%T~7JR#6y$mXa3*z7iHlw)ow#HNA(T# zTh4t2k5rV)O?!85Pw(6C=Q66t+Of6Zxhd-B^|5D5cw~^)7yawpD0uNl&6kZ=4}vGA zsQ*91&K8q@e&s+q;b*`LC-ey<2fq>C!8q3H%ulq_)6ehT=w;;>95!)@I5@S zo!Xz~nm>)Nr{!+XO|Nvj`YoDL|FDee)`7dPR}C5_qGwx^pP>)3G)8XzE^}{sElaX&4={n52MymOM4m(4#M0*?*Q^0oWi zM&m#0K-<=5PlIRw*|ol33h!Y2X7d2|!Q*Rcx)I9dd3fP%Ew6L2^CNha_m;=t-@!{K zs6Q_=AKlq~`K}eX?4zsLA2P59`B)Ep1bT|3t5NFQM0h9j0|T(97M@CKiCDR0;n8i? zZ=;aE44!yGB^%(k!*k4sMBz`vi?663Z2td!c%J9HI+6b`JoT-%C+!%t;$0d)38(eQ z_VY*K9Vv|;jdtg%0!L}t*RIIN4pGVPIk&HI#%Y>sdA|zWy{h()q94h?;}z}j@$eG& z-G`z7Yo)#QJ69}jmTpW9pWYwv$}9Ui+-`=jO2^CdjbecX1W`)A-~4&di< zcXyxex`E68S-4B{8$o^`JhDLJzXabAUc~_ZrUoh|Up<6YxtuE|$xzNVok zZ~9s98v@@$I_TB-UH)}H@`<}t|2mv}(bDa!_4;%$WVYaCiU$KZwgG~RAT{}_|6h@XkZSr=Xp`J>=5#^G7`KjE%I&w22| zZW_sNBY$Jy9F%=^m>$**Ex&KUqjNN0=JU_s3HB2v(beZ(^-qR%(pTW?!3&J%wG^Bi z3Xif+!}wTuoc6@hodnNE)t|efzXsm9NXunI_$<@UzTds!XTc-vH{KF{13bn3NDOEPPG=7}M)gt8Ihes;bBfbb6p|YU7=LF6{+1EVeQ@?4x#*?p`Ob_?( zHcogI9=TOLKM!4B!lT54YIE*)cwrfh+s6p#)n!57`z^bz+Hd7J2p+#u%Q4M7@E-8a zx3wPafSrd2UX~$#)*>IP7+0SN&mXK7+P@W?$yU6cO@D9fLR*r|mODP?& z9Ehz)8?RD5C&5pKcg|715$(xU@W_AF|8q&;p1{i-z|V(z;Lo9__>>07Q0hey-cd0Q z`5hi-9AfjdeIF(cFH}QDW9R0^Cu@G~eJne|BlEQduz9Mz;PD?deiosp+T_>O_~G9k zxK?F^T>I;F*3}U&di)t;w&c`MO1m-%W>iaz91&a;FB4(z34{ z@+I~YHgWE1c>X@sum*AUZ{g9h>+Ri%E`>+# zR>xmPJ-rj2ze&sG9ps;fXDaIN`*62{*7q5Dnfu!KFUo7s;~rB#xb2i*Ndd1BxCt%! zUKjc7XIfvZpBe~Hu+Qgx%6B9@hy0uHJ>f;}n+}E_1dm;$e)tyNYJ45_Kd*ImCmQFz zcmqtm7#`vI3mY$84KGl>X8%3#&iB<}x1;ANc*h&+pRIf8i4WmL_KjP;_|bU9b9sFp zS3l>!*8XJz<-5U--Ph|ik*kVc;#M(CtgwVKyNkZKkxz#ObR=Hfv0Ax|4)an z`ULS=F%H=pUgCXU$0Hv%&N%Hy_(AZ@VQRRQS2H~NqVngFKUR2uewTmEK|afTyT#Ro z#)+T3xabCWVRh{nYT*yTJO9#pbP@bnc#3%v(^E9gx~lcp3*m{1_3P!IRKF!=tN;H( ze-vKec{hvy9pD|zhm1#lUwDRg<9c{4Jjb}V7Cs%Gk83%;1wYMr#kl%Hcn8lPC6T`! zo;yY3{CDE#N#oUezcY)t{Qw?kAEx!!znDDF6Pe#m+`RjG*Y_#)TY>v8i=U0*CDxV1 z?cp;Vo>)QcwDx%dJiDDn$f?NJz$4tBE(@Pw@~nefT+K8674`9Y)5CssjUwkBf#*Na zc)Jk)yb(Bwm3_U3eCMy4;u)O#2A<`46D!Bx;kj!xzt+!2p6=eCYXvUPZ}Nf@v$F~w zUDPL}D9vE_><-V}torRfvDV}-Rgay%jLIJmFEPJ*1$r)oCpt6^uYuoSde}F+9Qv1+G;YxwK{&sEGz z>;aDx&w7<}hnb!&HCjr%uc?3R`R=>nrKHBsi^x9< z&oe)4dfqX9fXe5Q{{2;pzX{&KI9a37xrg9|+f>68RVc*>r>4E7Z=%;d9}R_aM!NUl}+DWnTs4V-@qy55wbAHNOvV&HKh_53O8E@GQ?& zrIBCm1@%Mc3tC@B;?E7?#pktN*mEnR;n@b2FQDgelV|+7HT(z}nAyD>D15aepMPHK zi|t!J1zw_Ftd2bw!BbDDKdt`W3h&@PQCmOfI!wM|-Qg9}zsX9$j;|^APmS~bVVV94 zpP%5_?bOa`@P03<---h@#kb*`z++db-_FAR5rHFA_O&na8P=7oz8ukmeA@IMqw!|) zv*C$hnyyTzhtE8C>1ws}RQL_>4(@}jj2<*SCC#rKhR;jz4D(A{!QX`!c&>aE_;>K! zGiuKk@Ks(?zqzd1Z{;-*9%UYKI`X@j{MH)DYf@f^nfx@3!vo>X@Hl=j|C|bs(eKYk ze{Z?*x4eVG*S~^%Inm$OTe`HXnhWRdwRAsUIS88nUxIg5+z);P&+XAS$lJWZLU?9% z&96Prvi!^V?EuY@#nn22FKy>`$Y-(B_W8u&v5Iws6g+;VmdJd@S0}}Aj{F%U)w)52<_-E+Jv5q#HOaBWmQ6IJSb8cW`_vP6474=)}EiI|( z*uMe1#EtB_=-(dhF4jo4*w`DMJyQK|v;H^@Q!0OelCIkX8OO>^7;Y&tI7rdKaMJ_sPbpSqwo^tl|j!? zc$VkB?fqcm;VH)LHb3(Zc)nuZtQnrksUP}KU?;&N6>)e8yu`k{Rk8Cy8I9`PQ4o$yZ-UVK~iuMOV;-pT#%MzpIF;8DgiLolHZo+@g7??iqUJl03`+kNqc zaL4n5?dZALID!hgaay6|@BB584v7-o^9aykF=m{Tpfp}D)z-C;F*f~ z`C53C@x#IB&%z@W^RyQRzI48BGX1=FVma)82%ckK+`81eS9{R&UJv|x^u)88-)+$U zH@x#E?FToeyjGV6s=NBNUf{A{t6AHJdhEGleE0Ihk?-L7nhVJKICyb0ZLzN<-9zDV z=1De0zRA*Epm93`J_jC~sCw-E3>TaHD3yPl{N7>ukJ9|+(eoHQ@u$|u8OXmO-0xq? z@!oR8-Mh%A*k?GJ6W_vP?C-U4!bV zry!rGcpmu*c!qiS`RKVHUgSLhY=dx*_n`kdZQ`Ywq1>c#8Xx+2}a{o++pXdtSZ?p5r;S0`ha=(V1#zfBLD*Ob_cpwx8s- zz`3~W>ptW=hG@wSCUD;|{XFk~E7$yNoPDHu_*zBvPvL6y=WFmrRbCG;#mrK6@T8DVda`v0aYFjZf~r|EPV(B}b3jW6udeV6QQY zrEAkI=_&QCZRwU|TVt}Op}8sDDk^H5lT#X+Cs#KlYulPzT9ei7GhIz{W2Pb9maZK% zY=;q5&Ywuu*Ut1uLtR}26sWw?xKQmq1kZzjNHr3UOVNEqtn_JSg{&#CzbxT`AeN)<{ zXJ)EJc1Cl{wAM^@P1;RKw^fFHO)<}Z9eHigNFn+R!hE` zGd0b%>DECRF?!HYSKZ#$oM~>AJWRHXw#Y$itC*Xvt(jWgB3HII)FvmVlj+8cWMOiP z&%CRdny#6aOt;olXVR{=eoDR9fYT&TQ_?eCYx`t%PO`bqJEhi*IpE+)W5y2}5*y~! zj-*dJ-P&4TH!Fyz#eF6$r|M@Wo1}nS-Sl+JWc{TyxF^|IooRLHmKKSKw)D)lR{{y^>l>LnNTP4#W%$F22K)Z0VLX=A#&wY??n z>YKbjlA=)pG1*#QD}Jm?wq_bcNlSWiwG>|sKP0W{+B%6GJ8n(4wP(sflbD)pOt(x~ zEaER|uCKK#{9%2QX-=k_ybVbo0JZfJMCIi=*sk&MRozzK+?1?tXlSk}m#H!tDV@gp zwq#PmySi<0;z8bpn4dgLawp}KZjtP0Esy|^f^Cq1G1A;rC%)pSwyrvvo|%^P#79z_ zn|#%UxlD5=Tq|M04~exv20QyzrRkufC7nq&);Ed4@?AYs&(*azNbRa?wlt+uE&drA zi^aAbCAnKtZ$k!r@psKYQ+kH4tfoS;Th-oHH^Pov(sdH>O^cIgZELA-nv!g9t8ZAG zj)6bBb8c`5pOj#Bxgut+C0OqNVYbV9n@8~wk^);2vD5|g;B^NK}UewmpjJbXl%@bHm~ z6^ZFxToEFn?KS3R|RQOHP*RI8C~S zwwCH-LkJ8no+M_J*Dm4Sb~m}bUYgvXM;ha{`kJIvD`{&TN0YlA*6K;2!67D9+eJY* z(Bvko9mn{f7Qa+CN!udjSL;huS_qFanFb%>;X5gD!7nNA>Xuo)A#AI5(&i^sz;`{q z*OT_iT2VbA{kp4eYYXw|V?mCS{#e}8&>+2aIFQa&8W`!b>)M-YlF31XW5b6H50`~A zVn%2!lhP~IPibmQH%aAcZI0zU*ZGo~+#r2}Trjo0X_}~%?p~TiAJ?tv>Xw?R$(qKDp7TF4Z89uLAKflhD;$c( z*6?ex42onl6E3WoEF~BYgHC_w(@2WLBpq)>t9U|&Eg2WOr{)&vKbs`@{FgXa8t6Lh zpoef}jaTFvXGtF{T~0NXsqH~6HYU$uDU#Zj8jp0NxUZOx0X#4pK^UsERm zFKt47OhQl#kQGkOO8U=NrjhS^Jz4sr>7g1ob@+78kvpaulngyC47ii=m=6l?UJT) z@DRD%(cvxrl6ofHdRiiSa#@o)cxY^R`QfmUgUxztFu6Vqs+athd$6|VnwEw-SH{xK z4dsV^Fj985wYpB4u&!4$G*1!FNV}#b*lLMmtON_bTwJw7Mtv!A!m{N(skJF)*ZBTp zi3WcZoG^>Zu7wnEdsFC*Q5n!uptVVEE2cKLm1|E*ZCz4Jn`J=btB`a8VW1;b!0w8c zIwd)fUNKqk^j0Y;Vb<4;T_j|1-^BQ?zNx06U0PUC zpfKY}$@;CwYkijlz zD^lw&-^iEe!UqSq%;}I24k2KyJbhj7nkz}iNVqYOZ2QrE#)72Pwab)?zj+Ts79F+u zS%MIkRt1(g%ZSV$NGw)}CChAFELdhiIa{jK7oY4}@)fw}%PQTr_`>o6TMWAv?P6RW z1dE}s0u~?AoOx%+mvk!W>LwYw>4ERg^=BCII^QRYWayeRjruLav2ffZt$vH2G73Uc zE^UKiuCcayR_mYUHeU{LOwG^fd?_QuH~tk?OQB;Re!lHp0ZMJ~|8wsf@#NG%T% zjrFxn^;4#{IqAZsd)GOW8R_&ixrn2-`o{Dzeju(VTQljJ`sxO!3F+4x!!OYE+t*oVl3V zEMzd*k9g~)TlPcqI@HkRgw#Vf67nO%3&s>OIFb6MwoFMk`Qd5^3!im6mRUuA|Dnza zlT}HX^^*~bpW$pvOVD`fC38=5%T+EL1~UEzYsqM!YVZy+L+Y=xO26cwJhhD6_xrK5 zp7jUP_h>-qaIWlxxKDyI+ zk+PFI7wsDw8SvC({8T`ll+NOjdR0tDq?x3@wQP{78o4bA&F$b371*htq(EvWOUe47 zKjG%HC4nY4m&vw<)}-V;1dSLi+_bhTYf74*E6;SpRYPODG=Fxr*C`VqKDBVxO=+pl z_`vhi8+`d0Y6bGkhf0_s^#Y5JWe&lPrLhwKPYE+nUc1)7!HdsJFlWsFc8yj=Mn+=m~nGT(xbcD^3yv`si)zgSWXtPl-EWi=VOVU-&$z0>gb_@QeHbxhA|3VQ2V z9yud*Fdl9LrExHu8=I$dTLIFBx%^65PVw_*NguE3h&?Ba9d}4_+#!>allC7sZp^4L zY)H9y4*m?)&UHW>Rv3UqkbkENOSDs$^QT>~QeNk>!U~ z!@HcVk~z+hhtTZkq>4^i`LgyMMVoa0GTRp_h|IfX{DiH)yOt%aX&MQ`bT+`IWTcuk z`CE(W(rC%DjWn%;V>=8R>TD<`C9U<-fGl1#XDS(UH%akpOXWFzHwaXNNv|s5SWn5Rw zWKl1)P2F8%=ek~@YnifWLS5aVLSxAO;_OI&H#IcBVL7Ru1wCosx=Rq%QY*VXZL?_I zU1}ZQ>&Q?&B5Xw^W)~KL<%4J>oha+m=XOQ*}?P*TUo3|jOWKk(@SWF{mn zt-c>N`mse=cn%ed$Q_LC#?~o1tGr}3L8p6l-mS4(*2$$8YnsJ%v9iW=$Z&Ubd%9f= zlA)XI7VsUhj$YYgS4hFcEX24Ta8u9w;X3hD!Pu{r+0 z4`gHvTi=vvmtlphpSM;|2@<;cCbE8@*r-RLqiWS#k#Zacamj|3c2OW(G}`12F)X~w z-{y=TEX(+8I^#uIZEOoGW!$XzLrGqzQq$>~vZfX0BU@z3MS9V$r{$VGAs-ery^N#JqdwOhh^I+&+FH39t{V!_8Py8PFYPz#bC zNw3l^_xBz$D(&&K&bst?nn?5;mUK?fcLJ17*A% zYn^t}THe|Ym0OE20V1;{eoI$_boJcO4s&f&y&GlkLg?6ofNZ@Hona1AGNAW0esZ;C zns!L-O)_$kAw{c9=}j^FWFkv5BokrfjcHZ6B~?RZ)l9tLrwL|MH%xQwvXjGinliv^ zu33B(0>xuLhc6BGP%TRxyZQ-qwMq6qiG86kS>fTRy(yHQpGg%fTV-K*$=zOTh%DrV z$u21oo%FK##HE0Dii`$AjQUAD6O@sn?&Ij@Ot4*Vijk^FMH)Q6Iij0Ob&5;cSy?3T z>rOg3qBhz_h^`h(pD(2+d(jk!KE1WMy+xMcb>glIQK8VGNLFc31y1#wX~K|3I~%`U zg>J`h>7ZRyqB_XF-^gc@q4AW#rtC4XO@dud`SNUTsP*Y}J@NltAPdwCmi^`|Oh!}p zCv+7g>>%u3Kveot<)kmxkTYouXrC%l3Q^b9Vjcc^-*(64h6V4bPh|Jrtfgf=t(26R zGpX=hF7|m9i-Xr>VZTYX0ffkqdw$s!A-4~0USeups|II%+5GCr9Y*f3B=ASdp)X^f z_pl$-U+!y&)K{6Kl0@4E$;ihi)zD!&RD=X^~}1Z$DF%QsO!k3X6R{w_>x7JC?rK+EeHE(Mr(h zU`+ll&LCEJgJp6|&P?gX2Fv;Xb4oXEENy{Z8qVudn+laB%y!=;X_uYT#({*(czKS? zaEKE*t|(venCyn@#{A&KrR6nM>HF&&y1A%}P32+KW099zTYdp+vzh@3Uisl;*iX!R zCigqC->cT)pw{#hzuUoYsHm4kf1RBdIh`v=%FUqP0PDluM_yT%E=vH5cNz|kRSoHK zIAmCt!=b)bE>=m7*n~7g+AXP^(#y$S1{qJtMqpV+Efc42lkt))?215`{u%DKW7p9{ zg?;jVF5Ta%h6Tbfit%beA&Jm_sEBmF;s)t_F~U#Z$Z~)m*0SdZ?PW4;^%=RpmqkUN zs_3=NSdwnFR07%K?iV^jm#({#mxxH;BHdjuswQ189sd+xcVzQ>ou8j&E+y0K*R*S< zN|z+N;xc|TSH72x`G=6OObSSIFNLmlw<^?umo)B@z_cD-Alsze48S{ANGj`=dbG9shVoc#fj1Li?@5J|fyf z7Q+wi=z=}Is`^k@2?Qk=!)9bV^p#0+on>16Kq0K+ElD`o5!P$VTsLCG zU?=M)5&`0_V0}1PYLc_;ln)o2g>3u(mGS6M5^@2Gn~c`u3yYAz z-d$go*m&i&18MTtxy{V+%$zfxGuN$LfCO<9(a^e}go+fDri)U!K}vukMImm`Bxz>?SERu}qt;zj9f%`Z&4Qn=}M-f6cHOaJ#5Zpo$Sqd z{-zN}*FGB0wlWJ7T&58rpw?O)X;U5-?LRqu!|2hF;6jj+&53UIlkN86h~t;o4t9KUV&9Cac{9o;o) zIC$nNWs5A{IXQny&l48sE5z|wUx{nf&cjjDrG<~tr71#M#L5&eahK)^?w#FS01Di8 zmdvP`#+zyIJnj&W;Hh5{{G~)dK;i&ygJSgvYk=xT)C{c8Q6QyO ztgO#MFs^TLatG|y!`4LKIOoosCv~BXOnE>_&A5#(nT?hOA~LCT&T`3MUHQf4xr0jk zw1*n6)d=Bxzx$+S!4>5Vt@;+RBl0?FTYn#*gysUrgUu?({jt=|U8Ghq*>Ni%z$8~4 z(|D|bt=vu3Fr*I6Gp(*4okBW| z>kAv&&ri|~1q)Ox`a%ks$_myF#iurSMfko@ovC~s4n=zt^T*f}gJ=nLK+?otD&u5+ z_4XY32nGhSAN$P(+5I72z!p778I`We;fHgf?c9DbY5u(RW@1MMR z1OHKzH}W<#_>*L$;(!3X*b@Uig)(u~&V5GXqa#u`e57}L`yUJ&;a$BV@#K1e z2q_#Q@ZyT~4j8EZghh!eE3i1uH#m6%AmdLy=OT$c*avTPkw?7ti0_=dDVq_r_Jj@u z+R@ax;%?&$h)NuqK-GDQB(j}CN*^X3@ci)4bqfp0J;YHFF8KVrci#TO=TAQV+Lu1_ z!TaCQ-ZW469e4T+C?co6JcDb5AehMK$+ie)46WL$JZY<@GDSDFhszK4vHP<-%rv_2HAi>*LE89|#lQy1aOKetGdN z7DT*XNJ0hb^Dv)x6LWm~$Tpi3R$)m5HIqhNQcuEOIz$g>%Ep^NyiUxmk)k&wy5pKM zc;uVJ1;C~_E+;^VU_Hl#klsn%3ux7Gs^rD^wg7Ez!7~&?oa63jRQv=Y$c{`v-~F-F zhg}%jI1M4bns)LMoQDH9{^3LhZh_#gLq>nT91~^k_oWnO6eGq*#>qm)Y4g1xh>>iXRQzQ00i*GmSO3f*3qEsn0oBtwW5id| zx|;H&RCr??U-u(2fOt|ng7rKiVsb0@yVf}uhA1a&lm>9#{A9dOAY^xs0KEv`@HzclR6VJ+z{^T&yTjr=38q8Wg;ZsjVcQ(9iX$LnfR=dKP?JoO9O=w{)Wq zpaBy4RgwO;SUvlzmzU4fNhcko=1IWRcw$IB#{>{vlNRQ5AUBXNsPqT#Skm;iDAJ-u z`o$|l$h+IMqIl_Src$_rmj{JIaz%LY0*Cj2Kr}MzL1<3U2NtI(D@b#>!Vex=aMqt{ zW{Jz5nd;;|5Dho>`!_p~+$n}-&q5ObP%XcDQwNv4&@rTn2Y}dtNvknt$sAhw1f#VS ztD2`*FnEAc-Pf`dX|+7n&2Uw=Ip~(F>Rm^Ro*Nq?_3T*!46zvC1Gzfo?|sAwIhsJc zewaODga&1$lqpL9b4*Xn`gQn+MowOVd@N^|txW?}v;r@YT8_sdsYTE&DUP@2l3=CY zTmymF7|R+__N9=7qs1sOWwM6ePzjJAvFmG5RK-R@Hv9e$QVp;h?FADM&UC0t)T72xYitQSSwEXAlv(?(h$=2lq*-6oS&SaLX%%zI963 zK^8(Qez=uG5j+&^%rb%EG~`%AtOaJ7Vh|m4{tZsN!F*t%GfyVUYJFoOJG{O;eT-8z z^psTl@c9ik^;>6op3sOm#zrqBFs*EsNGMwFJ$MqO@ZE2coF0=BZRn2;vo$6|KZzr< zVd-$7ufituM~ZUZ2Z`T)hvhkZc@II+_Fp5Vz@-KYsxw zr&s}$tq$>Fzl6z4WR#E}T*l(Z*kb=R(1_YboIHJn({+|=J{-=*QUpmLo62Cxx&+ZE zJ{a!VQ!xEA*;g(|@?bH0Nujz?GLe1h#xz-Gyj~AYjUXT_%QvvR?*a@+!}91GP*3DW zXs(N2YgfKRdCVSDbrHvul|jE~P+3-FJ_*fCZsQIlXNi;C-aaMUpnlACNoo=QfdL;F zkI$GQ+n!6Mw*+5HVHzUER!&k`i?v{wX3ZpGscjG!rl~=#WGQ)}5af(0?6j;Blx*1W z)D$E*oNTTN)?u5Fj7&rXLryPY)H~$(A%?wwP)C#>lS<}%asB}KORt4rkY`jrGc=^U zg?K6*1EbI0B8!DR$s9S7)K%_EN~_-M!D1*5WiJE1sXBoS0*Dg{5qN(PH|gr`P(}j&6lLk) z8a-rpOcn%DGyDwAj(+~7k>gzUoyzmA=1AHFXK7y^G;KmxJ#e=82U zjvz=z3K=ERL^F>E$hMzz{$(T*CDc`@tsn%=OHy$>X9P#jYzf7T56Zc{c>-T1tjZ9H zlMf6*utli1HUYqa0M{?XaDQTD6V|wT-WpERDZ_!JTxD7e?ek%%u7ZsWr(lDbDJtU4 zB_#+?BnD1fO9q`XC77%n>8uflDstCn*_NfSSmW}j6p7(OO^uWo_eg4%wjo;8Sw-7N zmjMHIf!H;vee)yMQ{tdYvxudtx2MNXyM27+Md%sgIwcb1uTaK9?gNL@ttf4Du%;K8 zD-5m_iDpR=Er4Sx?kPX2OirZV zX5_+6sLu^N4u2c0RZ)eb+p%;wG~V76*s@rmwZ9*NbhX2(;!6f^MXiW*1QlSeYbG3B zmK10P%A^WhJvULmWxKf9qSvI(-Wi;rpXb6y9^1gf7zoMO-mE|2bs0FfuaW5=5aa;i zPgtQ*qCOWs}~YbZ|-T_n$@?%TFm(Qv_BG{RF8!Oy&*mkqb)56iO3%|T_*lf$T5^qTE0$TFhh9}?EHrP+W!{jtd@pB_1^r^6p5a&Rndfu_jP~zk{AH^nP;@!`q8A$OQM|};HiGLFR(S3pH$&5A9m0$8j zK{g_TotJbd36Eu=CG?_CHQ+d$214EtLYhW6y$n*BJsP)+O^(Fnn>O*Bhb=Va*qW{6 zZ}lQ=%E4N*m9r-rgoeGtaCJ|ih*`*1Z3jSrONJG!c{;wR^V`3SD~kQmux>g>Qo^#O_?Zcd;E?M$VG`fEFTEEnWR!vp|JK3UXJc9kd?I44F>=m}#^eXam^`3sye*`9_9eg1%Uvq!6%Qj0Vx zm_#}lJR}&(7|uy)nxJJ~Y#JY?>+Y^e$T%DXN6P3$x-Vrs4|Mf-Aw5(Pd5X%m$LAO# zJ+Im4zOPq@ZX?{B8vC$9^#xa*Ev@&B*Ck`PG#)Yy#Y$+&5+)ITLVu*PBGZM5qTPvm zR@bn7q>)8d_?WXfln*HDzT?J4=JHKi)az~z)kd0yrCaFRc>o;>L4$=QcB!C6#1};l z*^PZr51Q}~YxXe( z4Y&mCsf|Y3YM?V*n&PIzZI?Bnz;ZS?$ArRkFa>9t$i_Z~1IfXVkKA&VEMo(w*BlU# zI>23WyAJ0g90mA6jcWzo5jco_7_xYHxvbfQd^qJdW^QU zrvS>t6VQW+COKTXTVTbpF|q(PfN!Q`?>@ z{-R1?3=dfV5}bxP=(aj940hc^fCtz}kcb?fr@gS-LsI6w7pUFP0NQ=~FmzdJ$Lv2Mb={Fi+015XPel5+C(2a+Pf!x24?@ zEYJ{b%MocJN+byRa-4E%a@`1%DZf%Bq48E&OBuhmL2P>H+=Z?Q77t+SE&g|M`0Cfc z`QDele)#5BzVh*xaSYR!-uwEO9p;oKtCEh6*cQmS6xu}7>zNEsek?%dAdTfoQUs!G z7iH9ezjV=ap4!}Y4A{i692B1?o;co07;9y%1O#JMrqy2jFCvp^8TJ0rDJqwaLY-ak zzmZe>`Q$?3bjC=Fm3WF zT?T#!e$}{a8l72syD}l~14qme`vr} zBaWfiD5fY`X1ZYj3&Pg|J}_GHKDi~_XYPqgQi~8xCK0B-MA^#I1dA z#Z1Tio)rXSa6&0m5X|l;K17iu|4(-X6LMRgpoJOdqwbPm*WZjD!THsadWo(^he*)| zOo`WFFd2u%B*jMP4aP-Ng_MJ$^q9AbUqB(K@_fsHDZ$TPqa9`fzrV^7$?zU4%=B_m z1UPIJKG|givWlqM&Lp^|ZJ`Yg@z}H6QDF9bbaR*;A z6RbDvpfpx#78Yf$n*7j#27NL3#f=jhpJ>j zXq9edr^x*f4mjJH+7Eh$-vMy42uMoezA_rOFCXe#K+bA3H%sMmk^Nbg$^e$C(srO0 z>mHWX;7u}H;6vABtDrlm@OioTtk`G{aw7K>A1-?M@&*wg;}SGRDWI#~z9fUcxx5sk zVkGzVCdp?yXsJrp?DRrNJGLBySeGc#(xaWPN?`*LFJcCV!ZmnkmLQBZBWQDJmxKC@88dNe4&MIgnVndgO|3aWas$L3=Tb>C5z7 zHCZdfC>d~d%kl}m9pE=51r!yF$NE;0A2x~L+*?JB)YeAXgVQHbpC(q>7qPjjw7|!$ z5rPGik>)OOr&>mn^DL%|W89K$CGB^J|a?Asy>79WXZ3Bh5V zaBj`fIXK=l$J)h>Ke!m$^bM1T9|l|?DW-uAfa<@-hP~z-1)NIKc9nqmp;6E%LGUFU zp@W`47@eMg=yhSNM%{SI5X`!%jTchnx)kEqSqoF<*fMa{1_{-ILW26~Q!S>WLm*tS zhYqzp-OsZ_{+hOM&!fR2mp`wC}g4u%6w7GCxbJ6BVL%qgf*m|`XX+>HE;1~lf zX3w8HuN0zc$dd-K-=)HGLO^UGg$^A3Dsy-SB1+!q3w2zj#kYyk2L&|VD1edRL=p{K zn>1~)$Su;m+&ndOvK*U@2#C&Cuy(1D$W{b9)m=>x!E6zc(bafLA}3S+2)e;+k#LXb z3{-rJ4-KiiZAk-2O?Tsg=ZmI+1>w)9`v@QHTmTz}r`i@*bZL(Tc;g`qIwB}j3Of>w zQEI*IbC*Y??pDCHEK0A8z>*b14_)WL#)B~~63H%M7V|J!1UThdK=%Pn;j?my^Et^~ z1lu`P7HNnK#4poYj98fQ0aR_F)BA^ghBVw#6Otu4)e8bW%qTM0 zv7(cLQ&zEoB!qcGcOHwcPyxywH{M?y*p4Ud=RAVb?H2(bUz10v3e%IxOTU)m|&~86jrd z8#<;6rv0k!BeS~QE(;5iZ4+7@j$-pjRqrhY-Dd}3iK zi&60NN(@eON#Hicm~YLeuUR`iDvkA(D=20~%0nqcqV(Fuq2Cn~L~$D810 zX+o%oip17o0ZUpIM);*N!vF9+MFlLXhKreyQ1j3ort2HP1F})|@ zW|V_=ccnj97~EN1%jcFj7PD(lQa(+<)sziP*Mp)#tB5@zYF>G^@NOFlp0MXeMI<|s z<oAnM(n}CV(2*uDt7Dp7XQ(;S+F@6f49$Szh%)>@7 z+IG>LQS90Ba^sW>>nxu1@el<|?wuKNy4bnX;$(ND#uBBT5fw1SB3sB?vhZ~5LM86= zf$%zE<@)mSg2x@iQ5eDgcwj=K#cH$+4^jU1H{L(E;*7&)BB>=vXt~c?aBR6Y$)gig z)LH2jM`b8Wu1`2qoIJ#ig)OdQiDF4T-CtJZ;KCKWXq4B9PU_KN3`QBN3cHn&ogU0~ zRU;G17!Z<$K_*g&g-X=vh_&o?2jDCper-%cM%^&Q?!q0}5hOB;j+n)C>m>thTP!;T zMG91kBR`<@d2<#g$!%?}(7e60lOP5sj5H*A7kI2CUX8FAp}ukHM){QF5guxY z0rR95(6dj?9DQWhnj;^Wl}0a-ClKkQBkPzKwnf)+C^SX+U|cJJ^Aacf@C7lbph&^a zqmnvi!*x3Dy)>9DhjmRsVbB0ZSxkEp7=2UEByUhJg$v6dZ9VrQ2CFO=TMG5z3ANjT z9(z-G!?G9AbeZ1#qLu3GmV-+4d1<{txR=h)6-d+(&l)4faJEMDc3lk(yMYl}1dS*P zYk%ExPOS9pc&oGe3XNs&2)nK}g>ruwkrOLkrVz*Wl|-mq+{Az;{ddGbV`f^!X5Sd; z!R3@6U%o(o-iK%Kz>KvvQ8G5`BFWlZv`EVg;Act-u zPC&@lJ4X(9NWCU?lXZ!!1P(sJhZU-Ncgx3BuArHMFe*T(xOEGYP_@8~#nT-U2Qnfh zE_`{7MEC{tFu%83dI3>#GAq2VP5JOL*=zHLS-VUu*q|w2H2kHi1uLA_$MZGk`7=BN z)uaj>8{xzbv_sdi)4k2M#~y+f0nuz#Z!|IZ9D^^4U~Qyc==X;4;l zo!vl`P=JE)@p+>hsJzw{QoFNYHGndGFhy6AF0RncmElzfJUoKfDSw1F%Qc`JUTBsmdw(Kuz?{ zK)!B9w3qC_EOMu&FiP%tQdU$portkNm}Ex6i3U;6151#@`LOtKyGXLGV4HEFdAe!K zs0xkBeW-Zqk{wco0H;XMt_&Y)7BD<;uzp!QYLl{nuJ$WrM`G2&b2%)XNC@Ro5}QBl zV|+%0^@l(1m{4kI@U0w}IB3x+YeT42+mWu<6Kf!~EWkul#i$|DY3*4?VVy1GVyh93 z6^B`o_2@Cqoe{|bOHn0xDmieUJXl&n1nQlR^s+Uv48%6^`5+D)CK-Muqz~&`oTy}X zZIRXnxDg(apbSf;y!q*A0Ld;sLz;ELL+Wgeg%w&Hyv|T~7YJ#@DeCu>xIO8R zc+e1ix=;(ah{`?IrZpm_)0wwYThiHecA1EfwJL=j>({Snxzt`SfB>7=02rg~Al(!b zPQUGLkH)*7EgH)jjGd@S2@H`Q6lxIT1S{wwrBylW><%>ZxR2x&Jhp@)u~~93L}&w8 zBQ0#SUbIfsQyW0T!lFryMVC!R%F&Knx=W+Nm9)$w!!}huSuK|W(>L*`!Qrsc&h^1d zqW1YEIds(~tk^`QOll94zc-Y{w1Yy@#ZiCBABK=w^A7#Za5GX>`oN^xm78Cc(LB!= zl&EJRCi$c;_yRZtSWeR-+-W_=_tj)M0Qr;%-y}%FUv2HEH9=Qa!P4dvvXNkIJ5Vqw z+E>jKX|*0%W`}AAIuI>_$YS|LM>a7L%1d%KbHnuolrl1#^P-@qYbv5m_Iv}Q)d@7lTY>W=(b!rz%!r5 zP7fC6nZX{@{H0KUMzn68;534vjJKVL8cKXA@CSY8a&{d)$zEm&)|Of-WUMZ9D(L0}Q@F3^xn@NY(CeIflfrsF2Ps;_RyT9|dadC_&C^&J%z5^<@wZS)c^HeA zIIzeai8gbojU=?%I98gp1_&>Vjo1u-#k~m{1TaGcPACw`E&73-r0vzU9af7qJt+cx zfZP|30rF%D4XfyU06*U=A()3Z2`E*G0=IVZP|>G|r(T@mpmOMw+h-fubG#a#lUQ3& zoBq)4Ivn8at@tY|@_5hyIcJ2xC8$bY4HJNmqMbJ9yr|TpCOd&eDD#8NF41f+G`j9fZ>5>Y}3`&n1wJN zHppOAqS$LH<${pC)xzSO(3ZSx6=-%YEr}X7;NAx(Lb^~C!?kt2mheYQNjChBy8tQ; zBhA~wMe?bn@pFaM5T;$xHR*k!7fKyY34>E8E6v8-wVLj*2%LZ-W0lpWu^YU4Qg!h} z#k2=(0I9)bu@E8asqe_J*x^Q<=(*)pPI($E5yY2F1HBedtT0FRc-kgUBfr zT$TfJX4vhH@A@e~%b4nt$)##~5oKDHNfr;o0pe)$4M}$}u#U0^d`sNamd+u(xNh1` zg2f${5JXQq%7Ir)47Oc}5J(xf@9v12(!eFBLIfy*1YN-KZ0#tvSSBl>D(z9Ex??;t z3N#m{pjk;^BL4cEU%ENqyI62HnEt5N>RrO|NLWm>J2s5HL{g?leSZ0pvBTa9*^_fv z+~y>|P;=qpAh(BaR(0YbvPobQ2MTjm1fRnmAp#f-^x*?>T6k%4rq-wM-`pTI#{jN? z4|U>2HHrDMCI2#0{2-P@8sTRa%1z+KXVF1wT*Me%DzbvpJLt81Xt@KM17(}bDvNGw zSqoq+3&5-fZ1s+>Z)s2hZR-yY zA7B85#IqoPpu>^a0OFoMfBWo;CkOa|f6mQLLrLtYIhq&DJ!LYA34o?i^oOb^ydz&h z4@+Iw9+T34tssu3;nFy=oOZRHy;Y6w)h#w*U_R=!Il{~^2RiCb46H>sj74(@{a~pI z2CyQ4%M2e!iFRr@kOi`k)LA*5jnJ7kuvwA5kKya8Ei^w*iQ!H0jsz^ zbCzZQj0pltIK0uKJ8)l{t%4tol}$CCcpD(iH<2)Um1G1<5q@UepBh(bjR$;{pZf#J z$0gMgVzEucYE|GG9!im@Qb@ZQ%P#5>0Vbr4iC}^19;3pW+d`w40gHH*H`s1IvQie% zWM4ryvG@iC2m0)9qG_mDSix^=EziKcA5A!`->7<_7YpF7Q^K8Egy}5OCc#(9bcnf~ zyeD}V7cm!75|hsCaB|H!j`>2P06iLKzfvD5u1A?>Y;YY!L7`v$58K>*`~B)xN3QLi z9cp&Pb%3eP1Dc+>(26({0KQ8(IKq!;Ml-fdfde-5XsUzhA%qMKJ=k&*5@}7u%e_F5 z1qTVgzUtH z&RRB$2_U)LVc(>q@))b#%2iDjEGdCOG^atAWk^RHv|$?hv`4p`2&=avmd;ctue_#p zumKooNz)}wN^_;9t;RkYe@w6g`O9b7%6sKQ+Eg7aB^t_BO`DFM%Z=UyB$*u)bQXoK zb&ITyBr13X-V|3o*r@$C%Bv=^F)w1C&-~$azzhEisl<9`Jui=G;Q`v&R<8*}sF@&^ znhrYDhdFyte#&S9=YG&GleFWC;qaq8orMX|xImCj=X%F&hdc7Hr4wD6p=xBmL_1Tj zW4#nKCNa%=a&0>l%eW=PY9wv3UHch5W?OBrPT}Sc+n~c@RS&H3_A^R@9dC~h5LD7? ztb*`YXEYqO&$_PsO-UIdy0vU1T`pEfuh2ghb8EE}%glDrPiS!i{9PPgpT>k7)HI25 zzpN1(<=4s;y_D%d9bi@-pfc%*q@^$y^%ukWgCmJ7PManeZ98SF8L|`(Dr&=1eZA{Q zjFfq^5{U~cvQHWupa_y9V_=3lbYHjw;DyX-`X=z3q`c;Vx%Ln%Ik(Zvrl!j9?2zXT zQC*OwryHrMJBuqyLOPBjkXmaGY4aUS^Rl~;Dt^SIgnVp-4J|-qdT~3 z#f>y!IiQ%o&*QKGSVv=kgz1BN^9PT^(ueJT>N<)2O~7eQ%BF@|w%lk!f(<~}f|xLG zy<=?b#Q#yeYiMjWfEi9{q8_9x_TP&wtAtpU>V#btoC?Zyo&gA5orF8`<`lDZz*@g#9W8vr7S&mRyfPwX}>I(-ItS>_i_xs2sH=Lvn4J_R-0K6kr zw|O>+tn;()A}k{4&6p$F7`wx-m{^k1JmMiNy&pQc}_C+ zJE{3Frj<*$eDUlxih5Ejy5J8*#*O}JQ-RLTOXlbXJ@hiB=*FiS-{8v$tSPJtQQ~@v zjyX=RLF7if@aR{ZVS_sNy#Ze3B zc)KsRF$PeUpJgFVz%mrY@eUl(V(6GE)}>?~X138x(f~Cj%{cVzz=abLCkU0=cBnWf zr@5k!Ymq{D=v(b|^LdW5{`Up*LG zAMdg#bpV>NSDY|T%LM)!E48U1GnEo3=vDv#dKP$yjq3i)ZCYc#OfbxCAJwLrPY!Jf zwk#IYmoqyvA5V%{G8@wci5Gd|iafhQ8+>^PkLiP!TSHu{)-F3i#k|%#GkDIPqK)`T zIDXs#pOHSnhr^6J+Pe_6h`E;kxuRD!y}j`dYTbx@^B@VEB@8+;R!}e+Nk+!oFhrz) zjbv?~5hK5vF?z0p3bzTz(jEY|`oQOxf%Oxj3NQno&3codd+$^#BYreJ3C&8T zYaY?X)a(otGk+IHYZOYa5-f|UBXN6wp0I>+2=H?k zv&Hxr<_P@WYF=&r~5Yvpa1{ghxl&tV$gbl@i zmzPaJKV-T=BB2g~!>KGb=+i@UUdg_xfEJLrrs4Abtkr7blev?(*FkJ2x2%Hl;_TA) zwv$XK(w&wv73^*#zmz8>smh6uzC6VzLO0+WIf1q;g&Ecv8Oy=wUS%`^xN1X={EcFm#w6qzl2JSrM(rklF3~)d9f9)l z>1k>PliDe)3Q~{?1-U$K3spuh7(rw0MQr(US%6h>S*4LK@k!!HIHV<)m$tdx-kM7( zjhf4HGk4V*3n%;Fy-`#3B;wOmO0cxd)IE^`jlFV((8;!(6gnzW2J9ZirtV$*&lKf-~w_81AR0}?+!>o{P(%EdY|jtq@X8@nX1!=?4cq5 zMz6I1(p=Aa(Jdi6994t6JnWqC*3uL+WH6!=ev7UwMc|QJ76g~F3q~n-Zr4XgYVyh4 zIjEbPVPSbGi;xX%lG!*whbxOeJF+L87AF+h!YLn8;hJ_up;~DtF;XV{)Nht)k6x79 zRGPGbT1>FgUZuHWQ0NopTHowf7(0*;wgE(y((61#p0%?1#WN zTfJ+pv~#X*Ke^0?(@?4+aoCPXjw0Zi5Tq=ny%wc;VcgeztU7GUwVHWAmpKz@Jn`Vl zt}VoZrKPdeQSTK&jh$lNB{*&rLW<%CPnWkmn46M<9Jjtcww9tGF&M0D6SLRzoC=7! z(ft^%8;Qc^R;rx5$DYNbh#}x08*R2H1ec9JmqilA%ZXTt0H&2!z`)tXr`NZ5V(l+2 z!d*NfhJaJKrfRU{ViX+t1LqFkl>1VOjz;$ixHXzb5-!RKCGWPQ`W-q}M+onyid|}I z7Q?K_qE8hwD0EhCrp~!3-_z!WDoqTl{w9TzbA)Cl#d;mRGQ`8c&UkZ1o=x(HJa4NRJ@BO?`GMB&MB@-Hi+GI!>BFBLb{B+1&^aKJ zayopBYpfvgN1+!cruRK5AkWiiJr)QN6X>BoD^u zV!}x3Q+!+d?bA9vT|$d2vo@74ZB#tJ^%4gY4lYK1;q(cN8ZFNhapZu<_CAIit+1`^ zqpVEty^b~qQBdP;mh!AqjyR-c$A62D0ab>J4!eRbPcvbNnB(jwq_EukML8xXQks&k zd{Ae!HC<5HRMBphoKG(gSC&(+Dq8aKtJ~`lK^yu`li6%QTINSy^Jd@>R_iZKRX06p zl1*=-MZoL)F?Ti4gzGQ>)l7s z;=mS@J+&1yJXSbE>`+$L)Cr-GM5}YjYQMjdfSTUUU7mDB@=-*554gp>KFVN`?zHii z<`8UNKI?GZ7T)$BB$O1>*4|AGsabPrT#mKL;Mo#a)3jaR$g2bcW7F-TO<%&XT={?_ z2w@mC?;RtgJj9OS*r`&O6^PWl7krWsK9WXJBNU3$#e?{~Py%a{hzT-}MBN6A#N!d3 zNEP+fk40s>FEkCIM)sW)5NJREIY%Lc0H6Sv#-cshUuLzWBj@I0aU{e@kLZN~=u%g* z!g`BfnX?tRY;mmN40{rUOe%a|LDtMgN2r)2OPZ)}XWeNBQ1S%I>NJKE zB9Cz14I?e+2v=CHlC)`TqS31`Z&M{aXR-pgNJ>6d=jZi}ib5ITW*#13~rhXD`J3N~Y8o9{6& zLQ7g`)b_Aj1C6rcHsp28mz)7N^i-kIM7Ct_)5r7!Jr<_c1vCR*fzZaW7fY^qQ@aGM zHkO#91zH+VWtha8l#oU}(sALP!)4o|8f<{zj!o}i4fUo#$Z{KL;Vq$U#O|Dj3IAUG z)T-m`BzMrEAYWSL%|cbkG0>!K>O0slG3pt%9s2^c47(ij8{9|z)Zm+wU1EM!aNB5g z_*3>#g+7k@*PBIJ^(`hj_Ig60E0^7qW^>&a@&;xW){P^|dBFP$AF$E;i$j!LN&M_6 zK$GBu$H=TGL)3@oUIs}BdT(&1QN*#7pAx@Zgn9wr)b}-P58lPAE*@yDI+-VySj$Ng zUh$;pwYNB0U7#)Z{vbB8EKbM(utKFJDBX=zGMp@8lhz4T`y+GE5#H2USxj1(yP&{w z0%D!YzJRZ%v&Nt;*bSL+T;pxv6_hP-iX@Cwk^9AppbSf)6`p1u1-~t*7zTGFjUtP0 zE?mBAY0d~Qbs@fTaI6fG=u>9ye%q_da0B0Eo-b83XV58 zO~EULoqdUqznGSHVg6~=Pnm2_%SXYO7~SxQUrqS-Zs7kG6KUke6abwlw%ik&_3I-# zKuv{N5IkM>w0xV91(F_1{mCZwx)YRZ58R5@MRIIpv?K<_2OiczgJA}0OWY;G3!to1 zvSiy43zlt+=Dtif0jf%^4ME4<&?`=n)2o6VeEQ*7n(sI|*10_-L^MUt4klasQ?6|A zqHlL_atOtu8tgAokTHrnnm5u$%zK7$O*F7-7yl;RZljg%>8;-a&SHMO@3Q)CgPc zM&ioA3MCj@2t)6VE<^QqB$VWKLU7AXEgFw{p=`sVq~E9Q-Yeb|LTCb2s#kpm62krT z^CDkbgXVe#jw!#$oK%nMIbpxbCQN!RBHidHPJV`e0A2NCz;a+3?>d#f4c$R6G77Z5 ziqEmbT23WriQG;Wj@FabMfe)prp1nzruihPASzjAuq1$mm+1QB9>S$Ke;L1EQ~f@w zzaCz{yeCuj-o@K%ymq2r1TpXN(?Yz+U(fJit9zW}$vyme?;*bHc#lV3oZN$oy~0a3 zva#=7@)Iru6~7hQS10$lhyND6`{%poc*q7E25mL$=~HYJ(cP1KD5*jlY|Fzsa1RAN z$YsmzV<);)#Zf&vI|Hcd3AKCujfK{qX@2tm{qOIfhd=(4Ke_oc>FKwA&VSVJAN`WA z>-o>;z54n4_~S3(zk2?!*&+Vb??=Dk>pzPhc3tg%(YH^21;2b&?SJpBAJp&Rqr8}( zOs{W#9)JBg{8#PY{art*-ygl>>w3N)|DUA&dw%WYC;!KP)bEe~(Q5zK@#nt%hq%W% z{dvE3@;hJf4D0tV=YIX{=l=m7%=Ukf_VxR}f4N%v_pju#e!sbE|Ks2A2=$xgcPBOf z`u!KX_9utTFu#xg)h~2g{!!!BO`>izUymnRo#U-kJlVDX;y?atdQiW={j1vsq?P&a6I^hF8viH%#_j9(;(u<(->>Iiraftx|9p%HT&;R=YUp=q!3oaj{?Ogx&f8h4t|3TXO2XFabwXfg* zh}*OM$q(KBO+H(AN@ZbDb z?f>??iN6Dm{{1iG-hA~_zwhzCKX2mif?M7GG5)AN>mGl9nD!scoA`VG?*F*s9-I7O z+W$RXjDP#~{|nFd_xSqH|2NP7Ka95gbN}ui=iVNEzn%7{Kc#*3^Kc9W# z;K#Pb`?LKI)Be-Hk2|fQ`lMRf6kzYY}xerElMR8==ghdJw^&BwF z82_y8%&nnQuN^wmBWA`U(_eix|1wJw#OURl8v`!VO<|ExI#|u<+_e zK0f82MtM45-01#D5_KL31srmI_6(UN72u*k4*BRtX`Hn&Td zQPfr4SvoWPRVjr2XE(wl!ktD`zc8C&>(*y}Sf4o&-en2S+P-T~Yzph#Z;p?w6A^AW zofmE0HkR)u>o>faeRHoun+m;X*zDcHVvUEwj1r~7x-lNuV?2!=>F9?rw8s$GE zg~KBwx)!41JZCg>h8fi}jfm1z6k8bC;+V~tXN&OpcGw=RV|3jVQKS$(F^Fc91*$tE za+?*4?B?7QR=7sEkK_iZ+;d!puVh58$OyydH(Zgc%GQc;Ewb%)lr#)y=~{N1*Vy)G zk>alUVKpM_myeupl!~w$#vG%Rb4JY~#p`s>EKL3}*yz`*aQ9w@@oI_42;cGsYgc}0 zFKjr!Z0s{4iid^Q3tQ%j^0hf=1e!fpq0R_rPDE6AW|8pzHA@@5BIS$OU$c>tbGCK! z&2>_fDiuE0aE7m_F}|~rZPcr7JZv;8UdSlsXzprdBimD*QGp^OZT3jR8F@Iuh!|{y zcb#i|*(fp)6<>=UMiwtTmo5=T)B>BoUcIl3;&Y13Dd}{UKeosi?4u`R*Z7=e?arcO zeG!j3jhbN*oqfJinc)%iPUMYZnMQGYW=W&G5#b}7+nPr_Yxmaf8sUtL%#MB5SG;)1 zy8UcpoxQ`1<@Li3H=S?1ni*ALzHNTEv$Ko`5l$ns^!$3=e7@!626ktJ;XE8k${1l0 zWy6g~(JuWZBLflPE;WsGuvj&2`e@`(wAw>b{eG@ z7mFCQ+XxSDUh>H7;r+snET4O{bKywiwUZGPzv_jR3HL`jn}ylQO~OhSk16jmjLx$i z6`l5ChTR_KTwxSDJjW>PUldu|*JxAup=9dtT9I~p4Z~O5F^7DqblKA3MtNUYcx7_1 zaHlWc79QrTALi^FZq%}qla*{)>V20z+*Zga>8tLY6R~crFRY9)ENo7Za9>?=_ei6g zs}UL7H@CbIR=#++&4`Hb*$O#VcX5UXoRpmr7B==;WT22irtv!s-<+;t5f2#=U5#*? z-B!m4_#Fqk7q1r)8RnYZwa}WdE@2L%UIeuSA88s^x@7pA8dT@@Ghv3m_PqJwn^r`w zEnT*|&u8!K2rIOW+|uVPU%qsty)5}d*}_i49#%SR6*+IDjcgrJ_R&i_SA@-7VK3f$ zu4wP}Fr$dw=v7C=f|*3Kh$tiSXv3IGB+`7M7l;-TEg@P?w3=uQ(ORN)MC*w*5WPaA z8vjQ6`!yn!HsgO?h& zY7^BZYDA<`Q~d3qYcmVp0)Mx{wKZMa6Llc!1gtZzUFh14s5?;)U_I&Di-_8+(Fa&x zx(+0A5e*_5O!OqtQ$!<(o+cVYBvKSzqlv~6#SnRjM2e?t0?`DbBqA@-M50upG$N7G z={kvMGSO6`X+$%LW)aOMnn(0J(E_5yL`#X55s9>%t}BRE6RjtDiRfjbjYOM?wh)Q5 z71wQaeS_#tqTNJq6YV8BKqS&Zy1qyB0nuTiBSc4uJ|a3sB+_xZo*+7f`_Jimmgp;@ zuZb=aeM|HmQ4Y}$M3;%K5M3h@={jA1A^MFd7uYRaf2ZqRqI*R5i5?J%^cP+KCi(~W z|B7q4d_;XS_3uPQh>8O%iR;63wc+nlbS*L@uJiL@EuVzn{eYaJr5n8ch^M6ipOEJ&Jlf0B+^B?eou6X=rYldL?T_m^#)ykA^H{fH|ctt=y#&KM1K(7 zBf3xYC(&O-{}BC0WY9pf5K&>GqC_GUqiac`hlm~~dW49&OQQ@?IU2 z4iga_<|3tg$g|l1!(B+FF>jo9RHKO5*6-G{Zr9_(*&$R8Fbm6&^pC;GwzVrOq zAL}k1zHrx*Yij&Z=IN{li|cg!?AL?kH{SlB|CUcWTyK?CYjfqN&OP_^+D|L|wfwK< zv4h7RJlf>*vm+OOeg5fvb#Ih#UF^N#$v4&y^d6d3t??^c4nOy8_4{ch=RH;Bg^eTr zj{5b+z0HT7|E$oGg%^74irCoUz~WmE$G7?Lv;F-PCwnmzj{GJ>ah67e%zQo_|D@WUVrQS$|AQbJ@ehBN_P)Wy0v0&#s{A- zeRX4l0Y?*W+e@!1^xEUMwmp)${LM9e%SAktY`;74z5CB>dF`#|Q>Tp|GiS`{(Y;Ge zT9v+b?)DB9{lmX0RzGffwO4<&?PzTMy8*Xet6Hh)=l{g&Lj4PL19N4rr^J>8>NZO71G zrgzD?``yKeLHiE)#FN@I>(TA^y8oglpB`7HQP|2I*^Qnk z{YcBYU#vRzce`8d`n|9%z39&9t(%?h=9N?LOxV?I)z!?Um$!f0a&WP0ov-;X*M8+A zQNB6k-?>}?r{dDMs*Gl#4x~F~3Rm1DQUu~lE33rn{_nuzd z=jMX=^=lTsSFGWkM>@RKA|+P8O?5fxuWcW^mjf! z+2-AUdOy+P;nlxBw14Ns``xQ#UVZW8>GJLN)^@EL85q5&_FL;e>saW^weQD&eR6M^ zBW2ScJo^5R-*oAI_Ls3+x~$$kJ+jL)<>qF$I1%x4&+*@v8vWU%p?BhrC4bzu#l1m^ zBlgXlz5o5uo{vYqaC`WZuSb2kGUuyH)od4Qtv|hDas8!}U+!WrIV$O6Us`JEQ!C4E zSXZ`t)gkeJcT8UYTBSx+68@Ues7Tb!q$W{~Z(Q3PGi_|v2bmphJ8QHU=RP^|Lh_=P zYo9tXbF90?hYR;Kd-SI>7cO1+aQ(l}Ea=m5&7PtEEo&iUx2uTJLtu_-b&>)8o+PMztM*=5d_lM@baj`!c_ zbo8BVZ|~YVtb1e6-!GB>t&13aX?cl`g)cYT*5}I-7gpY`GCASbr{<6QWPXpm?~EAg z8Z&+J&aXeJdNupOmuqt_8ta~$Tw!qPmzx`%tbQf+i(WfR4;k@mk6rh@`>#L#?&EcS zIF-4lRnf(*dwj8`%jxA0{rp?iK36C7Dt3KC@~ZIKX*GjX6Dqq z`eFK^w#$cH`Sh=-TZKD5$m|yQYTk~|-dol5WFG)Z5di{&bfA(1NWxY|eYc1Wk zeDlP&+BPb(^ud2E-@Fl+fA8$k`BR!D^jRBSzWL2J&sVNgf9A#-359pOGyMIVPnRjQ zv)GZvGoS4^tFLX#*b7x2`F&KU?jz3I>UB?P)c&7U8+$e{+WJag_t4R^K3o6f{ZG%V zOqf3G&0X!oi`58QwQ@)F4=4KEJG-}d-$(Z}DSI{b#n0y6nZD-7(-rz0adm7TmHq9+ z^m>chjz5&t(Oqa**zLjbS8hz0{p5QShPiLeY5Dv1O6MvS{rO{~;jhj^C%d<9zkaN{ zM&>__iwwE7;m6#ZNehq7h?#JGN#|>cU%&g<+IsV9oAH1Cw)LN@?;addxkj@y*@iV+Pv|@%U!+s@7iOLk9_gw!X7ieDmijY?t&FMUw_o8=FE8lC%QjpO~d zU-;mce&wsSdVc4v0Xv89`L5&oHbvJRN$XMUT!Xn+C-%RzYiE)p{IP>GbDq6*r}>?K zq8~pva>BdGS!Y^(+HhItVG-Zi?+z+nHKXRTA>&{Awa_E4Z(O&y$h7&h(#v)|@xfE^ z>-(&|@qOF*o^{)cw@5oad7W!m`>zgn=pNTL`gC@ku%)|(y|Qf4g&u!>|8m5N%ay}6 z^ypghjBCNH8nyoYykq4F8%~e-Wb~Yv@XW(GYl}9&GQR#ln~gIaEC1x~`FXEin~xvM z`fld2F?HIO%>J<9p}CJPnLgs;iTKO62NqepzxC(}zkIy8+Qx~mp82a^(wDAZ{N+18 zmmFreMx__}di3pz3)Yo=I`jUb2J?3N9$nHV`^ef;ntb@`uGtBjKl^^=i^n?L935|OH@4H8eXpj@zj39^)6-84uG;Ft?#2h6yR&7< z_J7~~A!oz(zZXw*%~^J%ZQZGhTq|#XF#hqu@ozrf{Pyk+6~?#w{)g>%pE%O^K+4M0 z-NjGW`mfJZKc~;#)$71_jZc=TMM+rOdKuls+To>Szb59Y3!7~OkJ zP4~d@2{pUy+Whi}1#R~CS{=19DfZ$&M_jdzUP}}HpSxRj((s+7+n;Tmp7Cjia>cU`{B!O6r6Px) z{LRtxn!je73O#DR{`;R(9_w7Z)6$Mtwv`!~v82?7DxF_F+ui@k5P$E3lWgxkntZ)q z{kV%;JUu2X`K?(8$HOex51BI@ZYq4Wr z(@Vc3x&C=JCVuKeo>vxMnAdN^`)wBax9zH!z46ZLTVIKJ=C4lOj!jwm$H4f9b~Y@& zet5|$o#N`u4L`ek(!KE|dcJr1&#c!sy?c52bVt`2>+kI^_so=)tz(Y1+yB~gKYr2n z*f%5Bq#ivstLBq04zIE1+ww2`QYvlTXG7mwK0f7J&!xu;y=~wA{`!Q!KU_ZMT=tcv zi%*oQoxAg;A6o2h72RTR?C0m_{(gJjodGNUX|cI_&$Aob&Tn<;}cfMcr@rmRAeyLE^IXhCOT)Xjm zInS`yy>W$(UOP6(HmdFTA<@;oo;bX6`@ubn-T30>!>^V8^m5a}^Oiq*al~V{der~n zcI%VPdOC|&UETFs;Yoj=d9&`aiK|XLK5gE$VT~64c=P4H*+&YmdwJ#3Sy>0ecD%oG z)Q^$B7_Jjns(zPrbzp~Cxx2bg9MJrUjVa%j-~G*i+^pH&Pu_THUccHUpRRUbN5dj= zlJ`ISk9HM|Y_)(0KC!l1I-hr1^~oP!P%eKwzG?pWb3OCN9}LJJ@6#-Qycm@(KRt)E z${&CEk^FH__55+MW}Kh=$pzq#5pE~a)4FQ3qoad#zpi5b@_#9sKfa|#{`g#4lVO2qyT@rRDhfk z-SgMyp_=*Q{R*(dCk6Q1lmhfATYx|BEWl3+7f@efUnM_#HYvb9&1juDKYqvK`Qtwq zP~OK2@T>I&_`?cn7y0E|y#Re07a)Is|NP|`)FAVdFZQ7F!&epHpQQ`1^A`o^^H>4( z{zd`v8x&C9)av=`InR+l{zIeuaT0IXiS*Xj3-FVEP4n01Z~^W8UIF&MUVuOBEx?{L3gG{zWB&RSEx=C( z6kwlPb@P|AxPW}$F2J6d1>p4yhz}_R_`|XS;y_{nejZnVKg=mWPT2zD+lT_>j3Pbl zM0$FxWd3&hj~Mgw^W_D!_v!`s&-?=V_>T!YvoCu3W(cn3y^b=B;;2ws|&y<6rg`&vQMcz+VDAn z{N%?LASaoGlr~Bj{;|cRwAPT>g8mSA=GhVwAvcie&*F^R7Dvc?avPcIO8F%W?}dlt zz1Zs)X{3zvB@Fx9EMM%oi}aTC+Y(0B4*G*q2JmNP{3&7B+7y*InNg-6yF$-#EdN>H zJ*q&@;XHjf27I}UlO+sCZ&H|20`M(WncuOI`7ea?gMaEU?i|l0ElT}?NP#wt8$DT1 zDyB?rVK>J;)-wwFyQH6!&E8}AR2-SEI#`Z>G&vq6%1)*;kne*0PQXjcxLU%<-pBct z0e%Sf&t1g!SN4f+4Eg`Eo!>yYz6752A>&+|wBOx``Ez$O-URwLsf6;*VLMZplIeJD z@KKB$X75u~O%x|B?_F-wXr`MNp|3_>G(NBmplblxgo2wVs*Kvl8 z5+qjO-V-cem3J597#S?*UGP^$Jw~-;JypKbNev;#7sK`>^UCDy27P8Rr#Pn}(oev% z7ckDXNqe@9!GD9>>~HFf%_$1RLeH$PxV$2MiS!-(-<};Rr#tlV4+zB%Ku#v)ur+8On1XHTeCGS% zy*OWcIM=(c5a)Yej^D_Ce&cctN4+eBeO$25bY?f!qdhwMv;N9%Sx%O3bYuBrP%jJN zpWg1wDb6#Aw5u8P@v|Ip9z&!AYOumS{)+5B?ZCfh0OP(|)DcsfE&oqvSSm0c$Yl9r zfImhCk^V4^@&3SDmuK9*j&aU~&c;yy5&Vwd*iSwLzn5+Wp0kDd}NScfe(e>W=&xJ#VGGh;DIMtekJfHb%CC>SVJvt6RYxHLMxeqa(4Lq|E z^f|!gt;ynzxo9srr@35QYQqp=R@#3q=a>uoG)KO6C-aLlJ|b-ef6i>??+SbY2^4ZN z5x3d9=s&9&4tx4A?ik7T6z7aYdINr*yO}vvf48d~^GB^_oWg}n zugGyb#hHn$&ojukFv{hd#r)#jo=6A#v7Ep&obU4t8&$|$LQnfbwsQ>do$$lJ_uMnW z9L5FclevcFuLb|9E-c4ahxIwk7vnnmBgZ_>cQW{&Y{&f0C%GNH47?iZJ##nf^9As_ z{lPzz<)}DtsvhG}PqO{zg1-aoob@F0vot#Q+7^2D<9t)VUlwu#5iI94>^7ns^ZRFV zfqnOsRY9iO~MDTBf9inElo|RCp;Z$&;r(-hX#o<>w(H|MPj8k_nQ#G`&+~u6( zI3-_=qZ+dPmjI7-vizK>+;5gbz7K=nb&bpQG5D7cV18!}=D!1dw!nX~weivn$nk}9 zzULuFeDNX5<(tYitHy_y;O9ma_5@WgYf&y2;+XQ2XE094UC8oTTf=Ar|M9}l9mw|^ z@CVj2zmhYtKkJiyhU>Qu_`_U`8w0G^EqOO^PnO=#;JixD?+X0ZIJ;7>=sS>4#Ll-=evWH~vnu$~Wd zHbw&cC->J-{}Js{y@R`wTAVQ{We8DMh)m zf8!D@q38wA5^&p!k$^MCxtti{zDwdZqFJ1 z$6?F(bO6h-)n+}(&18BAaoanTB`ZI<+MD?^8?Zi)BIB*l-`<+_{}^%th#Q%hr#AvV z8}`qg#&YO&ncCK4`BBB$p4Wk&A@ziPY_*vm>Kn~EGoD?R+po&^cf@C}HvU|M{@NJL z^?MWY{~&uy`Qo4{C2_W2qyXZu>t!xz3d6=_83XPsyJe~o+{bSv!O$2e2P;k}TbrOA)Ryw$+?;aA9sR(3=GUIF-pmMq`7 zhV`fJSf;cdjOSuLqVRvHAkuF&{U;*doTFS{Tnh4+*35653-!+nu!A4-2r7QA=JkOC~5cpqi2t9XkzT(>(kv>O1n}zijrGM!TkiU!Tw_^h_t8y<3=Usr)j24o1njc1lP+I1l&gOe?yBK;>^Fa zLot@G`s?={jOSwAgQ{DmUY!}we3bov9PldD8MoV5j-|qWI}7=SCcn6i`Ta#%5vXItpne_2*l%mXZ<9!@kRQ<2WAE7+&%wH= zTKAq=2lz0StjaYCequ*ES_nOVugv^W!#F;-K)hN<;a%iw@5AL90RENr7|-m-dX5JF z3ltb7|6ay-LjPsG8F!T8{z81?CDMPWFK=I#PvJtQvZ${B=KF1d*Kx2MqcQWVe(gI_ zTiU-THwfj=EgLiLugHGRxzl$$@Hd;2>vsa=2PgmvIS#B}Z3W(i+*Qh7$(FnX{8k^v zonu%s=R)5h_60tU@w(vegg6jYll{LO@YSd<@6)0F@FT{1eyrQ8db|LB+i2#Wi+0@_ z?Zt(8lj1)@%}40(T+Q|=2m2R8y*v7Fy$|8X#tR*pKkE#)yB=&N<2l&byMp!a3H{yh z^PHtz??3ZnBN5|0m$p7Om<%HHu|39&w;^XG;&9+?&bJ8k{EqYz{4NB%r6_Mp)MI8D zRO$6es}Z(#nb;IH14`R$n3 zsCL(O0OOfxcSE87T6$gTX=6F$W-<*`^^X2mt^0kAdW_Qg#|&yXLQc*qwvTGRTM$2^ zvRVJPP+!B*uCq5WzZxe5U>^hfAa$Y72Z&d`^4xx7;3qk?IbSFJ%z#LrgTF5oT>nvREb9+k94Mm1-b>#NVqEPT#mHZfvle#9h8;%0 z&cCBwWTAiIQW(ZiOtn9f4{*$GxCwD?WZbv`f6Z$NJ9qh$ff0kw# zGhjEz{N_b!Xglg4>t)re35%=r=QOl5bHOC;w016{CFx(7x2Z z&wO$WSzc{?^-dGy`whq2b%-ZJ5r1qexL#T#-$&~+zyB%bSM`{Ia(S`e#HBC{H`-TL zCVS>nXfMCfRkjPQJ#IjG?Z>&iYTow_>d}RIRB^j}U+9DJiNec5z7OO1bm-rk6chQ{ zv0tF{Khlu#+^o=YO=`(_U^UxW$*)fpD&*wiT)}bJe-h+mzszzXP~Pxv%uQVI6?7lPQJN6Z|fW57z=;-HdT#5i72~iGCaL&^CtK?+EY@f_?l;*gid= ze;meX{(T%*6Tn{|cCg=KIcmIQNBi|_>rQ15H?lFFROe?_l3Aqw!??UXQ7;|9Z`a~X zd-T^1^w)EsPX^+ZS6ff$OpYPs+g7ojEx`Xd%H>1+{~GvBlq-OFrRt~N0d9MQ{eh}O zCO_Fp$j{W~=^r;`+=qEtBKTYMVBDU-E%6%g35cI|tnY0AF1`^L@&hd*CBj}rzX?*C zaU15F6~O-!;)Vn3;aqEUmZ~xH`>_u~-G@wHk|PQE4)jOVJ;^kRIz)kI_hboA!XLiC zJjgMC{YvzsBJG0yJ`C6wFl=1Jc+xS0JzV|v#5(w`^A6X`Z1DGmKN!z3KZ%uTk?NJ~F>TyDU4W_6aZOyN$H>mjbk<|x-T#2*9mM?3iK{g^*@3fC96 z4#N=hRAC=q8`kqh$eBX70(W8j$xo@@hd$2nEJ5w#?}mS7Vn0Ihuj1%ah3IT!d2;6C6KHf4IdDa!jA*RMK1)&u4BUSM3= z!G^dIg>_EqR%F^(o8@G}KL-Opg8s|U_MJyk!xVP2V_z}@{84=v&(ZepveDiHSeNb# z{>n|d?96XSo{&X8#{#yP%Z)=>SnNb@S-|APHN@eim49OE%n zu7A;9a>}zN=OI6f!i%tf;0o7lEbyPvUpQmgZexKz*NypISSRP`M8CNMI|OjfY6AGD zVcu#y%lw z5iTNrMs4SMtO0%E5%)5+d0A_;)2J6&pPk@uk9L}Um;F}l%S?m(%oL836}WiDEsR65 zvCq2+avIcPJq^u2OCVp{a?bY~@K0&L{C=z(^HVyni1reAg!5JBot{EF^(Jz8#cxcB z)Rb<8eF87C!J;Hezo`WO2?W^DJ_i01;Kd4ISz~m8p8hD2SWY}?6>>w*3iO#d0Q#ff zN7yjpl>P5>hR4A_tt<0qxmZuN@BA(NBx()oIS2U;tIqsRoa1G!=y!XRe4Nwc+N9qI zB7@6%{FO(H~TdOY2S`E#CT|KEyyy}%t$G5##_^+10c&Os@^ z&7nU;zCNt;)AU@Xvs4`dj~dSPuKchX-3r_l#`syj82@x;Jb-=h=OCvn36%0LvE_fp zc%vx|umv7K`=T%|Q#7#&+|i8%tN3i7okm5l1)c`~64*0WvuAV2u@~Wb`LqzfPzC<% zTgLL$`t#=coNtbHUiv=tcWCFFJD^=hon`qKp-)%z%l3oZe%GVCPf~!A%kfqI| ze}El~r`gV`-uv}~{Hd(Z4#+vt6XnwOyZ1GM{y0xt8T?7`bK4R&z}vv*lD@(|cAO7k ztI|1AvY){Hzix37rGZ|H3c-0Z_a#{^A*EJIgGFTI6pHA`iS3nl;y?w+d1I> zuovS7&M&dG>31d3k2|#Wr32L=2lG}{u1>WX50qg&2lB-@OokHq+OV$chCanGe)eJf zJQRLwhkblw*q)c5XVdyDCll*z(}8ccBVTQuX9nustIaRIL%a&$dzopFQ-%V9&@;-# ze!BzsfJYhkY3rO5Q14m5yP#Z;)c`;C8SA55|4@Yr`F_ktNIjXBcV#?x5PP7q=Mngu zD~IhMetS@)s-2iW>u1(e?YB-qyEC#F9}In}QU@pU^`bv|jl~$rrAa(i)AGt z--+{n)a}YN5aSb9PmVu(flo#}44mM6bK!>8^$N~fahY|7}(AM^-tjYF`oDP*b{1@eovvj8yL^b2fqj9@_xkm zVi;$%f_%rvEdM6tbRxGAcFQirHFXDa2EqTcwR!z-uzwEh-wblj!_SQioUa;JT&y5{Fz67B)3UH`X_wseJF4)jDEJk*jZ6cnx<$Ec zJ!!x|X_Wjw{e~zhAaDcY>X(3*!aO1u<6G92elwR|7yK^FrzV5HY8T)b->P~qfqKur z!FD(Y{!P#)N83lZq}tsEmhdthV@}<7{(5?FF(plZYk5ZnD1oaI~r13rlVvsX$P!(lX^0VW5WXXVIHl<8!P)V zZlrTh@elZ)Xb3rrI9{o9>93<*I5B^D1N^Tb-r6va9<1cRK3?%*4y6)^W8a})vukm9 zObyQ0-kmM*0p#?p3H>KCJ{@>ZYOtbQ#s;>4vRi94UfoR3C@lv6SgJn3A85j!qvj)` zyA*iNt6VSVq31-DHwWX)agehd?a_*p1mEI%9Tv}&Edt!j5TZ+Q=L zw!wdVI8UO=I}`O4Nagx^0(#mgkP7{?u|9JNa(;sUM`7Om9`L^PncqH~>qWJTMX;w0 z>z0+l-?bg{2L`c!&H{d&%qa5pV*iwehH1HCSjpWH*{i}7SS@X3&q zDGm-%av|>Zpyn+2?U@{()p@+x;18T)e|s5@xS|*Hd$n~2`n^*r#|i)ED8avdE96K0 z%NdSD+?ZI8`CWt9&z1f|;U~^6Ea3|5a|-Rnd6gAu4>`7$EGGx&iZ`RYqq{Qh=*{Il z13C0>IY>QoJFtg*47_A*#*N3=55;d}ivM-+`kC{YEz8Z6?mOir-omsd5kI&rW2!T|~Y~@Xsjt z=RjsRYQfJl(Y`tZ|DZq1@oW8cS@?4R{e{w}Y?uzx6HBFv?$)*N1k;-bL%i zXumnXvE8VcGTE9izv~RQ$JM}7$^C?!z#+yt7y2!9_=5xIbGX#>o7luA_%ktnCijr( ztco)+>_1b1$0H8-_ptnHz_XrUIZ+#!AJt>btIK%q7u+sXJ=%c#kS}{3{aXeDnBReZ zT-hyv`pw$T@_$EtRe=5N`2J4mUmS9>aUNdz|2(QtY3DhQNX-`_<1TjOi|^mny4*3W z_j=cHjdVl4brCmQh#PDT`i__smiEMcI(5e~{fK#)ALlVtdB?YB{;Xs!*JAK*q<}Bv z*s-6h{NX@1#$7mfJqY}F(T_W{eq4ONBIIP@dnK*~`i>QHqOjkw7IKEdKeG?A=csmi zu?6y7$bR?}>~Ic#n*)DS`%n(}XVw>Nnf;J2jwuR#a>W5QO3woS4Stn*m-&Byq7NX) zhyCBv;2(f^l8JGJvgg;2p}c-Z&V&Cb>MIB50M)#*BicnyceekR;O~t%8R*1vwj+b1 zc9!qJIy`kZGVQO;xEJ4-iFE;yRv?b~uiq?bCvy>J3PH|~HJCpK z-}jXS-l`wuU_D3aa~S=Rfpe`;-?%~p17UwhdkTz{RNVNfDR7K8_Q|L8yZETzDDk81 zl)eXESH(B{t_U?ZnO4I7nM*jwZ-D=eaefZwcghd9p}l0`9HaQRBSaFvr7!gK<97y> z{wKlj!1+}*E^_r^{!E-}Qv4sGeR;L@miE<{-?fMB@Hp~q0RQx@WB(Mt&o5G(o%sWE zipqQSI|H-fS4IZs_z^NrL;TEqn*C~+e2e}a4CUuI$KDrs0_w}rjV*H!^;;8q23}`9 zS3ys){~+w+9M1B;fSd(A8Mpt-?e{z2AJOZAKL_W!m3`KrUVJxM&J6IcLVUKJWqq0; z-w(RO4mgj!3;a#GG46PV^HtwncBU{Z>#^>`k~0$ayazjb(Ld63Tc*mWM;q4PP659M ze~7xv_CE&u97KDux8oA2-*fmA`WOpYAAGK0h-s0~$A@~M>XYdZDIjp$X14S5DDQIA zZ}v2nuj2VHutQcdm+LCzyxf}QWa4|A(rEB?(0^s#V>^?2G97!I`J>+9xXQWEzo$bD zS?H5_lJRON?;i~rx5IzfOX=UxfZcNNdk6|&lyY*NN}o zs5mk`)13Kz*k}KgtH<~a{u#je`KMu@D(E*eZ?oZVp&q++MZVoxLnr*O4mChgt}L8e zd!F6h=!|i!eJR_&5b(tg=Fh?Rv*n@Z-;|G#lbyx(=>zQHX5lMWGE$r;aJaiuH)*1fn{gmxCjM


{qH@dcbbEb6EnJOQutF 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≪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 fgj35`SE>;qy*5a`Y`-S=Yh* zgq)_*JA`Xgf{5BwT_j7|a$obA`at8m}k{$FZ z2w#e})W9=uD?S#7&0rOnhdp1R6i!$kxVk^NEoo1iGIeE5whUF3{{5m=DbUpMg920yU+^w5q>8G zqK+V&Om+-#VwdKEhF{e&M6~#QIK4}dYL2|X*7Q19RJP&NDYvvdCcp91{#Yuv6h5c# zXp!FuBvae9{K!8Z^>rKOaiug+9&rtnU#^lYtcf+?aL?Z&|B9;NlA(G<)kyiud#U`A zyIg)H@Xvi@5R-riuNI!ICXpjG%@@1`X1cYCH;b$w_N#L^(-?l`TKasU)pTY)@S22z1W6LU2~d0tk6y3cLBiQ*`Ty_NN9=aZY{7gCDy@ejz|;NU5J?2?u06xqG@bCxp7SzQ(b%SG9LZS z^VaesQ|B=TFE*eh`9T(Zu|SI#?*BC3{HNU8YD$Pzg`7~VNJ5#EkNqSCxE1{)uhUx$ zyg5V1>x9x!5#yQJ;%r_Ot zFzfM)+;}MyLx@;C#2=0C9LXB4D$Ig@rIRu%)sLkL^fK_+&Li~@xxA{d<9##kk}mf- zRyR+X22U-UZACUPy~>)b#;;k_kUdA#^=O5#<9K%6=8}w8M11S})~x6;B)eUIEI^Ck zfZfW{b%wwfQ~X|$)78z-%d4JHyK#!#Jm#G3c3~9_#;IA zewO-g@DTs~$7Be1d99`|nH{~D0BSC@LOb8uB#b~!7us_9MzmcQsRET(a__=E2}%Yk z@&mq&h$nK^a47@yiOqB>tS&4Z>I7*!dAL~t$trvY+{rZy{1!Ej8Sal&v0pW2B(Ecz z$COsbhT*wKVyU_nfDYboq+UAuG_d@mn-=nO`$+Ju*G-~oSmD>t73^L_bH?Xe3l8)9 z?tPM6L=pR`zT$~`9VADe1HsVOiGWO{uUtVU6}md1zXlWq$HmuCST{T`YDNixBi=PUVf$YFNZY+ix`W_LC5Yc<{o`*y?{ zlw=59`Wvefnim4{$21t1b|c?1Rs1Wo#E}vj^|1*cxKM5ys>!-NQZbuT!SRdC;P#>N(gBGz1U-dZ^9;FrNS7~ zxuqd0n57lXLkCbH{-nyIYk3DP`RD?VQJ8z>CZOFmk>Mme z19yfXjzMEU=)#0Tb#Zcj1k%gUjtj!&9j)eMxD3CYX4NZ7U^06MsIwK zJoadF2c*^bC*If4$F}#VAy)(ua_k-d^j*tF?^7j;BRhlW`WEJoXlk= z{FY7{c|X^w4~%KalqT!${`3k606FQ&N%Zemn1_C4ctRJIZHK3HNyGuAG4e7nF5PTlI_ZKF5KV_Qwf}U&r>aj0P7iIA(tx{E5W`@YD$9Jyzeo+15 zdQHEMesLLm&FB}yD5~zKAwnNE<$KbrSM$tNdVTmzSi*vSe&0N;BSf}R+CO?;E0C3bBeJ1AZJhVrH2TperAxG0dghzwV zQfW`~l@kui`zC0eM0IGgEZ6wYA%9Q&Edyrye80NH;BU0XUog+bUG$G+{SMrnMq?e^ z6-sMgfy|QouQGmf*^ud3e?_nQw~lo9O>+YRS@gYrc5F3~Hte=-S>dg0CKe2~9$9UL zb18Zd2Gp8t#~^9P52YPO|EK=S=6N#Wm80h^2oGK)EnTqNq5~) z+qbLk!@!8O7)xu{TCr}7E#a;M=7lb_(U6wWjr=$$O~6@UEWwY|GoX&8#L$#|l#i}eEO@d=V`)wOF>E}iDg*P5hfh+up-&q&2OGe+RP3Ep12u$&}N$$~-LyIBHF&=3doL+%oObhWb*QlhaX0341<%i(_K zP*`2dDCmzI;XoEnK*(}w51CSG5p$=ksYH)Zk7#D@G-p_{gRFlt)Gzpmixb+70MiPR zgJdQrj+xE;byh~Q5Nza?kjDrO(8s!IoH=#_{W-+ukfB3^R{Tw}+NV6AEv7F2W6O~` z<^xLp`D1!*);#JCECc@7^J__K4&1@P_IYp0BS$=;pxEmpmfLafv&~4>dpAnDp?uzC z^<@TXoqdYosIeUX>{nKjE(_Osx$s$Rv4Da1I-0;~<*o#T0MWr<$ygd#mM%U`Mmfi< zOxLO?JTNg9$0f%C-8DmPmbHD7Ce>$<+JB{p!Au!vKv7Sfrn`&c^L6dLDB=UyFFZs{ zqHurah?qnnHA%3VehSBj0n_;IQ#FZZ3UPbZihrkGt?*GDiHvfFdBP#}JtNx_{XN`v z+K2M%G`T-bPLS45m^=TqzcT^i6fPB{^@o7dm>4wks6dU6fg52*yfv#Hb5gl3CF?8s z$IgYdV0U=Qj8IoTyH4C0Ir~IOT}`JSK0zXUB2PW5ySIK%x-4Q?Q|J-uJ2dI78L^b@ z!avDn+L^RfQ(v0BL!10$(qjn$clq`yhCRkI|0@}eXVC%Saa_k7;F z*Ae*Cn)eUZCMe0Uey}bwvyVe8eUxWMkI9G%sfULBa7V}sL0WSr$@<0-&Q^Gdyith= zdi5^>?^rJh!mWEKHzK}T9lK!~w>xH(%?|cO`zmXyw}3q|z>S$iK?d%~npoAfk|RDL z9O~kxyeE*BEJ`Df@Ef0SYY5lNzTwvTGEc)*WJBOgA_m2s+CXipiLQzlxVjIrK(y^( z?r1*?&{NB`@DTNAddaHXHk@I^fdB^&NwV(zAJ;8weJho3yrco#NY@+adQOO| zpPGEAG!m~le4&2eGQDGfq1t=Z9@2%;k{rg9x&kjm?hqPA5X2Ayghqrtg zZatk-hVks*9?K?ZY>oBuC_MYJe=Tp}k31FD%U*&YKfjnE!p)yxB4f0`S;#xHY?fap z+pGX#FT-7@)x^dFw6C>bBihQ7EH9kD&K0ts7O1=J8?P(R)gmTThBY!88wP2uB z>047bAmD2yK!`N6Zi~48MQ^1p8Fply8o0eD3G5p#{koBr=Qurz=b|NzWIZDd?t&g_ z;Qo+*rZYHfjc!o$ks;zrBWod7GRV?F4hu!5p@WKmi0lzH6oar{6GRkmDMDql&edgw z*GVpSDOWMsEaeuHsD8~K7rGHt?^xl-QQ=d-l%abkN;hJUVbrzXb@YA~4q_oz^U;x9 zPUc?>1Jz;7@eJbLgP1XM$C`v<@G-&%A_}!NKp2Oinm|gA31Qr20jy+4cw3)Pm&LWg z1%mM1Xes4Ki)6*e`a}`I(l<@mr<7}31r8_4!Nl@PZg=4x?;)xDSC;}+iT?ZYylX`;d z{?czX80-XeY%q~G{4ilQ5@^cd!I)bti>!Ek))BeJeBecojEE2K;hL(Q*|k?Isaq#!7b9@6OmaxNPWl`rLzpnF>BY3@>P z?cSu9Rf3#wmpufp7_r+MhAzj(~8&;$e32$(Ef|1jjpx%{?sr(#FA5G2#KZk+?@O;hB?_)Nl zQgAvyAHoV#^Yax!ho2{iH_6ZUz#3hC{ze+@ZV}r35Qgp2?mXPr4^F#U-08WTpxsNw zxVvBmoPJCug|Z;Swoh|%m&4^`@;h?VAKRs#fKUSZLd%0uxe?2b{FMELgaBUg0Cl#@J(USCiElEqL$wmEb$UwnF%B*nMhDN>CG!p$5l|z{0L6nZh?V@%clsBql z0HyaU4WN{&KqPA$E;f+C^rJTWb6YEoG?NK9lDR=5Y%gII92k#+^j1f}q zEB^Fu=iKio7uf|}sl^8^H-U0;au7^z0h4Bc%KDX;mYvDDN{Wb{=5nf3eQoFa&fvJy zja4q1;a%OwN(TsHf~itAPtMK9upsQd%&FfK#bI+97(@EO%we9d0bBR*?)Z7Z+ zzx}bNq^8>~yLP|7dB7rMY3wh^cy0{|cxZKZ-I|W8r1>{n3x4UL`Lr|3X*RlaLt)z| zIk~TTcKAo%fZLOXWyL!|i=bLIlt~7h+pw`aa$X71I>gV;3Smw5wE9$Sd z=KO~*Wk0tXee(MYtLfkTYK%?J)FMFq#p73Gv$k&qoJ2a-*l|@rea+EKxj;8?3 zY{%Xe7S75Gol)Jp55p;m7!8qpZSvvYj z-4TRE{>(?X%1cI6f)hyHZ2gH;tiT2?ou&Vqw7IsG7vMxLADKXewsGsN;e;jnC#;%` z`EMZk#Tclv-c94cqETy8op5lWV-^LeYX!BL71$v-Himtzrs(pNRZkn6tt?J$))mL` zi+*+Saq)}(Pv4yMH&#uW#oHUUJl>i^ccOoUMjpSQuk`FrzEbLVQ) zi@b)vObZZu04t&Jh!$$%*-lKITPa~TSLUyXipyv@#bs&;R}wIMDdM-Nxzh0#tu)@E zm3R}L0dZ(=(V90QfyH`%2m^4k4l6PSJ)M3%;Pi`jBP4XnpR zYT_nhq~=F&AT=*vD^e4FD8`wgz;G#B$X!#~Hacnh-u7!+nK9aq&xB{p%7@?w`a|E~ zI^TtgYc)+gj^>8ASa8mnA3{!oSB{3vJ5%#r+Vl3!ucoXa2a-qZ`eHb?!Wq1&=bDOTeeOb2>}Q~iRBX{Mm?XR<@lWi^FRZ)At!SAcZN2mwY{$+_WRp=+DEd0@bI zr#^sSMgB?mvAGCG)4Qj$@;Pff?{bkD2_`|Ulc+Ueg{o@-xIVGO$@>vY^!7+YQ*wLb zhgP(nVPajav2I1KBCDpP=K05()YpF%>{xhtMUF1G}f>z-_4VQuixRXCu6g! zMP0!Pt~b2Xd*Z(+m=C=9LBTz?-pVAbDhJlT)!{ur8QSUip$m&haNXsh?jkNlq&QFW zt;n}1oIK?cD4M4P{p=PFP6L;zm)Q&J)xH3DlqEvP@z6(~F`Zry`sgzNpnp=EZ-vl~ zHSY-r%)3gCgnTbB(d&AHxh4T-fq*G z_3-xt!`kHcy}`^&fcfe71rz;IZ!mTOOaWko(_oA>oaWcWT2x>12mRc)=5_)wxzZE! zY+WIHJpS$x8|`?YuSXX07=ovfh^4)(-_3)|^6In8qAjwxW=wrtk~1s6?mcn$x&f_3 z%fJg^qQLD)gL}-u;N~RY<^Xq5Sv0sH73`*tzXIoxG&pY^nbtmTj}0-^kuZtY;9x>e zb-N!Uv$VS?_(9qH;3nA(`3c|XcgO2kYU7oXF}3#%>CjE@uXdqWkpc?H-pT;^Wpa20 zK(gw(H?-YVKyzFr9rRG3$gw@)>L^yhGBply;o2|4?fuF!>j%s}5T!F#^hqfVT){4E zOsvX(lq3ctykW5Jl(k@I_&{DA{udH)Wvz%-D=f!7^gVBp{l%IAO35pwWNbypYQ26l zV?E+sJGRy)z)qXhcpfa%<*tY(F)E%aMcA9u0-^C(-g@rs_9IOVBOr}g|4WzmFbQ33 zRtp2x%$zpge7!nW8qIp&VeC5)48qu#QN*qK5RCm%hq13bL3hYM`oV=j7Q|TbXiAM* zn7n*MDqH{ULD+gMjji9p_$Ar;b-eXp>r+UQz8#%b6QfW=O^}wzdSevn1FQR*sisxS zD%6;jeu6`zSRSQy-(z%sjy$z`I=utQyNbMerw5+MPS1Nv;!8_aPxI@dQ4jdmg5Fg{ z?>KZ-&+7cis-jo)tg6PTsxqxA#9~9Qs$iMoKYxf`Ri#x$UO9%8)~l@~NUz@GH`yzy z8gP)RqR)}*5LInHT(IEw3Kl%KXH^YORX3zn#aKP0i>8hhthf5mRo#?U6?u>8S=9ii zDsRuK&N)a`(f4sFK18qj^r$NOEP2xq_>dHqJ7w?Vp$AWhN|Gp1uN)@G`61zegeR;u zEQw1inIz$9WHL7)T+Z&O<|cI;)J3Gq4M!o^QH?BzfAyLWznFn+ueIRDOuKfmw$$kJ zgd}R)$u9gstf$@(A6YTQ$RX%+bh$wY{Av%ELg$dbB6oEKezEr~u|3~d3)aisPWs?a zT}k+JPxt`t`MX8>EHH(>qd@QtyOs-zSgbDY>w5VKrz>tPN|&%>rOQ* z%%*9yoJZD%O;hDDZhr7iafVr1sJDmLt-`-Sygl!eB>u^BNFMk{Xs3ttFTnzIoCbMO zSG?@XExteEd><>{Z`9v^llVS+zdni+S==f|m-MmTNG*LaCo}^@Nx*R?=p3!LqElF% z%6&)C^}!z!uccwgOhy$rio@@tA0n!N z*cZRBn{RO93G5)Az(#fH^LkJsG6E83?P2+~BBz19)K;{RDrcK}L**pItu2Va-q5jQNG6sWO+XqoMU_P! zLY+LqSjeOS&l#%nMOp>X7tyBwp@oSdj9#hL3?fCCAY~Ke)d^DO&RKV!O1DBlTb?#w z|FKABpPq^Fze1d5_F0iXw9%I1z%Uc2t1T}>En2`cBP<|v*sY<9HHBE=!+F3mNkor3 z&DS2m==z9V@MN`}P6$8JS$kwL@#^bt`7nr6tlzkqBZ1geT8c?_u-9|D(sGO+;@9eyrx{fj!7sSxkxgFuE1( z3mcJH{lzvzzgX?dtK(A$9B_{b9I)WWjQ>qWfzZ(**0En$9`bSSu#%Oj6FNXoKj}*% zjtKTC_zLsuxA*H10%6`N;(==X+OwNTsvrVOSq1xIBdcq_sUS2Nft)_e)Zq|tToHI$ z{6)4G$?})a70Aajrpz>|k$>pRI85`pb4iw@OK$2rj&WpG|qKows-S+`9U36QKpYDag;wRqrN5psb^n=OoKRxw5 zJ9;B~7#h1%pe5bWD@ak*BENi}Tj6VA;u5Z^%3s>2&Qh1~+QK7uVDRL!-p`d^cztXo z6KpE&6{|%R%BnD#3A_`ZlsC2WJtP{Y>~6L1A3SZ5r(HamFf`%&q$#6WT+QP_FgCKY zJdaDgL%f12Ve2?-atywHAb1pIf$P<3B`@nJbtw<7{fUX+&S!B|Lj6y8$652fc$X^Q z*(f(#WN<=e)lLc0Pxh=ia zI}i~@nlwV>2|KXJiz$CmWDFbdxxzGEs8ex`;T;yd;Y(XZ4u2M%68t~Ynd_jgmjhq~DL zX&_lJi@szvF5+{ji~XOgNNv#`XwaX|_n`j7rpH)afIW}%1mIkfUHv2^p2`h6-+T=( za-Dv`VmnB~lbE;~9{IXokgDcekxu2GL)`3txu?Qd$!kL@M!v zb!NQHE|A4&vGsay^B6h;p2{h;L7h!0yV+Ze`wX7`x8%TN zOXCv`hz>$r$o3N+KG3Z`#v3|?kN<m0MuJ~{S%p|UKrsu}u&9RJJsI*;MU=fWKOQ#Z;g3xAJp z_4CIxOA%GbADeQEY**X0CgN6gY@V!i*)O}1y?Zfq5#s#DaM!U36%Ex7qmM9kYhLvL z`TojgUE-AxKSHCTc?ptXYV9x1KOh(?50y4q_qO6s1k?w}$4s z^@wx6%A-ZHhd-uVdsIoBptWib9n!H3t;Ty$0;~l@IFu6!=W^7QSd>Kfl7?{aHu@j# zBEjOZ9r@+wjug*3D>7Gq!yS!)jA|0a6AN@Jas~A!4hQ_=M29G44 zOtDI~<9VlTmqv=VJUG1VYSwT%AYrTSLH5yn#OWp9dbwbb*d_Hwu@(J0!UknugcRd4 z3$68O9@VSw3GJFw>Jo%j65Bs4mUhTir@YD}xx`2YFT;p0Pqfu>OmkekRH24q6k)q| zhu#RU9q^bNXh1tx&FrVGL*+tJPb1fAYL~gQ3ZrhdXJrS+-EpzKFc*wCQqc)DU`72D z4*1&Y{=Rxu0US43+-Yifo7QzH9B`+Hb!_8ovyF$XwPBhltuv z(-C@_RKso|U~XGnyE>*7h`X<=v}etu3QLFf-|#iV6g@qg&L|e}{b` z9=cQ9`|+Pux2_{S^bO+c$@jt0yRY!dBzLkUT!qyftiXtdF~{@&2^0)<{Q`;*FRW14 z|M1iXN8~6I+`{<$F4kxnQ;b8|iF$o*Rbs(kdJ?l+2vTTS-2@GBBttMHYJ;$o)^;zX z%~;<@rq~iShYo1-E!3+mbNrTra#l~WmVQYBCaPyy0wH5wil@pA!gyJc_WgWu!oS!o z4pi4BF#$z%)Ce{#iI)d9Q+RGJugP#x`(#P~E`PKW%HOF_Fcp2ylo`sqXy|WAuK7}s zoy_Qb5XCWfk(27jB=(A5$3;Ey>>;$3^&~BkUOAQm{Vu(OhKkhd2q9=l8}n$P7T7wR z$8ydl$d==3eBtQ1gkaqW`bv-DmLuM=;#-m9^97%dGY3`@tSX-(E`XCX4oY+9w9|Nu zr>=#@7znNCI+EGl;p!WPH5E|wdFk!Zq_SRe4@f;yxZN%xlhue4VO_3eH-jCBLdBj>KR0b=M`cXM9KnR=9V1Q_cwc=^T)jRm?@=? zWx7+!AFH^BC}w&-`Q_G?d0`g2?%ZhLIT4s6_O?v25wF|6Jq;%(FgmR6XjEM*GGVbG z!5B%)OB+ZzpOlnNKFq5$K)Amcn`E%8raMWs7eUC*p7A|eJae{5gL6i$(28EeyE>X{ zzTNdhJbTw2y=ZypKA^d@+d^u1o+Px|B)1SJ z$Ht02!MpCm`PixxL`okJU-S5;J=Ag#7bzn(96n`_cD%wGkK#@3g)IhR@26z?DMquT z>sSqMJ!#fQn)(_`t>6j!^F9*%GI>Rj+9El>*D>*I zym9+z1&?CRF>#KbUYz5m{r_`JoWSbyq9C21ZrSUkAR%ca- z?X*zUI(#*pw-Gix(}P(fizi$J^%7Tgz9VB0p_Ep3MEes}8nYp|ycVR$KlOK5Ns5&3 z@wG271gGsr2<5N~6MYa)s@5P0(|b3P<^TL3lz*{M{ys)!dJEJkT-b@D zn_>pG<6eR}h(jpzYj)Rzw1}I@_tG2;P9Yf-D=Jcxw|w(<6>B`+3iMm#1-{v}cRJC5 zOrRBXX@si?pR>uU@r9Zox`Z0RI>xVE&qbrz24WI80VUl|td#7(N11H#vfoq0gtlcH zHpDZ|M6%K_L2U6UQojdJ?PuI^K;*b8Wq8C0y?XiHq5%+r_)+v$Nma-EndRGhbuI$Jwd|`DxT$%O8T(jRx% z%?SA3t^0s0i->SGLm#BDJS9yZ)yv7mO*dZ>iU+8!hu*BZh+; z@!~#GS0Mr`cowilU=13JZ0kF=)O%!|cGEGIyDfE_I(}=0ak+ZsX+2HrzDP)r;IZyr zXnn8XQmt@)L7tjRF+@P$a4$)JCiLgZ6Or=zpvHv1>g*fmq-H0SB(_U8uS_|SKk7-W zDa1*fYBe_V6uPAwt~pyj9l&JRz!Qqf0nHPxlNUk0Fx$RVT>h_P)e{es=+SPFsuR{J zTJ9_VB+UsOO8)@nfFb@#)>Fo3#KbzL$D<|k4w+a2nvlsQq+nAnLL`sg@i1~-SclF47>A~{8 z%)*kqSNF(!`oZ$H8Mx>4$eVevypv6P`}N5Cwy3v`j>n?F^zAMK_x(^R9`y3&XDQk3 z=F726ROYD3f?ZcL&&5LzX@NrY*+QWNk)J2ZR7DF08TqP^7w4?Jx=2i1=G?q$g6%oy zRIn6v$(u1H2utEo)_3|*t7j|&h4ua!w<)kSDy^kfBqODn&Qd2wWe7dRvvYdneN(I> zNeq|~`xkkgbEN7`lw~ZDs{Scme&wuGtXPqI4p#o327?cz<<%HGAtiePgLl5JLH|$h z>|cp>KB0p<2!G3DKfibOUwi=|H@hr9XYGL2xT6Pj9RSec_W(jTpeE zJwnSDn>&bbIOa|L?`Im+*fda9Utu2J*(ei00sB7%OF5E7=`T}Jqz3bAv`v9$ORkq<;&9(5*HvE#6} z+xDzuiBYIdWKd#D3F{bOiqOix-x(BG(_dTqw~FY zYkHUd(lg)ZNPw0A3(U>)uxItD=I^9`Rsd$&MVL~t{49iu;=_q z_hiqn(|fX1+UU+wSHU?=+8NJYla`liIX;!jZV&&68S$$6Eix|6IvkMtmh%S~O=&QK zQ(OR|qiJBW3B ztnmJ?tlw7@AB~&U?^}y_P^a9h;kVzCijLqy7qD(x2@EUg?$)BOGCf(yQ53dgdB9AF zCq#Brh{Rei9FI|M?=OL$|&Joj`9(TgYKIk0qd`&Q&L@$3Z~@-o;LBg9X&XRW_`i=V5x%Vj0CobSz51!g@P^OUqM^|vXD z&8P5(-1V2c6#jPNtlxB>Z0m2$RbKO8JzsUKPT`@*6zgomJS1^@1-AUKcplQq-d4wB zCF^Cn3>3$^AjtM!0uj}Bp|&NyA)CI z6(1IUARo007TL)T{go%*+0oYu{!ouNhi09${j1)@n#Pc7q#Dt2xAksnC;La zw9dPJM{fC&U(&hA@R|?Wr|3Mv!|m`gJLQH>y}l#sNU~zFV<%74Up*$LliN+vni@yEh|v%FH1Z z#6_XhZL1f4BPhC+KMtKdd9D%wxkH1WC zb*1!jq+HyUqfyj;6En-f#7M!!pB+pTrC>r1tU$*@z{J!POeDucfR?A=LwrR6`i8jl zus}BGxL)6bT}ajJXDzSv?YX@Sto)E5-^{Hq{IO;Jw(Z0Go@M@Z-x6?Qvt7F>;OSuB zI_{_nT@!N{Q&7Rwq8QlCr`rIP->5Z(6ecJK3!Be&GKUVl*=}Bz`wdspc zt7Dt1W6P^Ytmw#XsTuKAjqj5g`QzfF%H)Q#>#2Yaw$t81+Uu=ev0NyQIcz<(#J-P9 zPXe{uYDRo+`!>oZRpF1~x1EyNFtlTYGY&PLF9NZhG}pQRys+L1#107L!wls2#k(md z5G#^jOe%%^c$J(pqgfqued}%y$P^hC;eMz|o>f|Waa`eIC^jchTX0wNWp{ZiMr^3y zKwhC;+i_8R)RBQ0_fKzYzY4Nh?j6oOuZ&L4PcLT*lxJw%q|6upBpdq^Qv&s`I`)>H z6O#h5e_tG1Lk+|2sN7EQS9cEBv8^bs?aynXo;fbi>@AjM8nO3RHk?5$%;_zd(KCoj z#hHyQ9J5&KTRPKpPTj8m_)o=7MvN~VaKvA ziU)S)%p4!y;VId)Zbu+KYKH*lW-sqBfAhp)-jW@@B{Q?Je%Edzic&VrW1Ag&qy2#p z?g26HQ1%^jY|pDWq1*8q&+bpQ zJGMCOr*T)^BnJD8Zj#Em!tnO%UHYo^PbMq~`ha90>hz>Q{M5UIBEE$pUcFc-&40?} z8L%LFsXa-9<<+%y8G+g_F*)L*AMkwI-Z4wY#XFJ?R5CO!Q*iljPx>>hdzZ->k$%9K zlk_Mf)RQ8M3`PEntePu36e;&iK|*8g<}yQ(SPvUcg(BJI!2(ug$g#CIITqNScgS1+ z4jHWlQw+ZZ5;tMbyj+N}CLVN%5zL%^V+p3>V^cA3L3QmpP^Lz}HbKC)nHmAZ9Rx5g zMF}KKZxQ;u1>W6pzoE}94g%c%Q%TzmDdU4Y6#`Ds@0a@ZJKqy|WqkdUUMXj4`zIpi zAaKB62YA;Fn43^pE3}`C?5)NrI35)(1N9e!eF+^&9LQjZ|<&Z zZ$FDNC7Ymc2^3SF(f%cVVNex;!0(%T&oLSfu9)`heexJ&Ay`n{S#hZ+v+gafeAd}I z-Vr~@_`hUlaZx$BN?M6!!fnrA+D}-~FiG4E zZAE{^1JUxW=tLf>n+FsVKG$sft2-bRY2WlcD>BN1C&bpq)>XvbY1>Ocl)l+p__*OS z`@Zs=vOZGmLhJdmTq^eV%qV^6l`;HTX7Ct&6ajDoc71k{u_faP0pGbSCwKxkhF8Se5-ke1mM5$6N_)KJoy$DIt4Zk^UMS5D`$ z%$~X0L%ni6mJ>WG4OI606cmKJuH;TRnwh|bV67;4Y+4cfz73zHAxtvm_pH3NC|S9K z*y;H5#pEEg0k^>!gjQ+6N8oH|atu@r+01@Y$&QY5p%Z_2|CPb3?D%;`?-|ctpb0!OOrWk3sNrn@9)Cbz$r!rp z3G#&04A6isdoyg@;oso{#KrC#EG^3mR@5I=7OgwS&-Olxiq_1SN9)ya+6sbI^}BiK z3J-WN(TPYj{I#rKu${6wqNi)WXToafV&a+eQc0^mq<#%)g2sH zme+7bS^pUqm-VZws`jnZaOwvL5N!16Koa#w>xLer#k4p0Qfj+W+n(fh(_4ferZ70h zUoM-wK$e7ZPP@DAgwCn~gdkzPF+8?=&wB{fp(X1}TBpaR45!B#dVK&Bb=%|F$%2QQ z#r4U}@k?S$tmjQ$v#@CKPZ8DV|&uumJCq+Vr$z{&CWZUu6{`_hl?rE~$HxocH0@o}e|Tx8pFjr!SA6O_8jb!OK;0|i|DiSFHV6jvwZ|O8YhMqo zvUBxMzh?z-d$&jKLE>D~m@M(8RMJJMhj8U!Bdg3~HEjcc`cO}N<{wSci(prFqSHuz zH+G_quPNSYSwY&s>A>$kPi6Zy%phn4C-~mb#<9-e@aoa^sJ5+oxOPgw%8+2+9(^OJ zeFR~w-`0LqS(W#k}E%NE0&Yqxl7uwehz^QcZ{5Z{3mRj89%YN_Be0ES)*Wk zHPM3Stbj9N9SRn6QVT4scEj4f9VTJSwM>2d>A1P)9?~o-V-gFU@Jh&VkV{E z_iBYTzFjYH!W|y#`SRjw&$947oF|xfn8LrTi5;k*zDp}hc1Zi5luAK8 zsEykab*XYhw zz(7c3skJD@)`D9-9WN*QkLf*E_qTv7iCa%3_rv7IAL6#+QON1JVkGnXx~)6Am=tB4 z8SGD=DM7$e*u~N;ms_b{N+o)}YktAEOf^NP>G|a1Lle2gx7?@?#{7#M;_s!e;25s6 zoB2Zfez8KvqX4(;_XMAK{`Ec|X~!?6?1fosI|f*3i%2?$NYqBs^f6?KKIF{n6e5GH zQc7fN!A@GoZvIGf0pk%exf?Lh^~mU|3ab)B6`0XcWZW*1&)h{(VLjCj2Bpm9l#!`S zp3ENeasAWIe7s+p`rqcG?OQV=n?*>&WH|>mtlBp=CpeBJR>uG{k7YgvIq;z8;_eh4 z)q5^#7A13WBWv-thP76`beHwtk2MLix0d-a&y00b$D5pE?AF9a_9?F z!9qA`Mi03{R!_&DI1d|MmI*Xqa(bzZfbeU`i&sAD^u~akSaRse$v3gsqXQ|%_SmA; z;*=r_i}03VT1V!rUu9vZH$O9I^F;Xn0r|0&d~a>f+VCkr%X3C$b)2U8odYjW?9p34 zoS)M-?U8XS&~gg0oO)?nxpa3zvbUUy;4bm#Ryg6p23qTC8qYJBEub-5UjgWp*MzGeF`lxwYfQ5hsp(++O$al<>0nvQqTxmi35#$K(%?dt?ZR{T?pyKRO zAVRXxid+IuPw*#$Oa2~ee3Tp@O41K+K)3V-D+y3CZp>TtJ4UM27sBcoe|Ev$l;iZ;^TE| zPcULR+DtM?IZ6EnW}@kBVsX~@8uKBC9CP4#)ekg09?>5UisNUPmf+ZmTtpM1t*Iz3 zCB^Uo-Qw?}f3;7SPpJQo;OcoC$=DS&-$E+S*^wyY45bUc6GnznS^Ip<`Mbx z-{Ie%4u5_x`1fQ@gCcYl=e6>+?jv=M^j*_Enz{aU+XJOLjVY?@Py-K{k9MczRO(|| zA?@wizqHd$ z*h5Q7oEsgyhg-eP_P610&@ksyboMu_hBE4hhQKbg^`LroLVn_(&}!GsAtnIuQw44Qun*qbrJY ztndjMH6rhzPp>DH#&@XG`B=fu_PL^DBqMPPNg`il~6MiNzC|FV2w!=?Fb@R>|^EDk*K-`eTb}kL(d< z2_w8`xyYqkn#bi}1Y`%UI`$#k1%cS-?Im<7ymxEHZX#A*F~w zW4sBoLvydO&nnZnBPfQne)clyovSn??FRtyz32kzXlvp9@#On6Ep$@d2r^yxatQ6g zS1Y5Pb$OMM9d+1Y{Naytf^#Xi?h>}iucr;#I%`EfmgdAK;6vJJuMiYwtSB!(RsTSk ze2Y!U3Em)!(V`XQ74n@F6pe|jRAUn+$iqk;rpiMp57VeH`17z`kr|tMtvXyciVCtH zUnK3%#LmAUkKp8Y~1T`p>L(^r(+y7Cp}6P(|v&hIq&MTgS-d`0=S@~StogfDAj z{i6OPm2|crxdnNEvXHMnU?R|jmAWb!2X!lTwbx&Mz>yDP-#MHdPfkr3#X|yEn{Yrw zFMCit`#<0xTY(u*4jcL<*7O$7Y%%f3ylSdFkBBB4{MAhJGqG|Ywg(U z`cvH}Uy9v{PjKKLW%=G|_(ZZ1eDOaWPY|z+`W6D`xQ+$Hi2JNB3S^AfY!!Vx8}`!Z zrS3-cn<;8@ez<$ktmz)PL$g!}aJic`B;LM_X`DDFKgLFmBqzf3H=jD?&# z#ckrWc??zE!zG&lTerC5jX*rFMFuaP_j`U~1;sTOPFD~?%!x1#crFs2{+k2c9gi3~ z$o_D$4CMuS3#vtPt=OK}+u=_U{M*Z8+&{9#o&Mofm{jwv%3ZNtp?~LhE-7*zb2^ul z>qohfE~BV(Id)u~Co}XZSe^*$sbtB_+6|}9_7}3CvDyLxaka7!XU8ti4~~$JMT>+> z3KLq<9{rExf$NBykJgdPf6A~yx3xffIxE~YWfuE@*{4BU%|yuxFLS>8&3>ZGgt6_1 zw|eQ+8hiHk#{^@|Cs(q&4+pEt7o_;xb_@u2c`Anx`TfI?e|B5QD{d(y;DfxCge4*L zcoM`M5XufQt$6|LkX3uu&HgY1$ne%2tD>z^E)m$%Dtw{Bs#wW5Rm9pg``hA~%hamN zt&DV95xJHNbQVw!Bjb*e9sb!{1c((~&6hw7ff6V#giE#0x#R$z@w^boY<;}qe=;gY z>*-z$0}HLbq+jcVUl!LzvH;cFVg zK63Euj75TaJMQi8kC&Yj?X>K!SgF4`kms$84;{#jT~_sm*aR<~FTm?4YD?36pVa>k zJ7IwlTUpuJ>)N^HN?J*v=dR59;nS`9){Ek0AC;`Cj;$1b`s%hVY>ut`@O7m?iCsGw|Q z<7~bWWbAK$`x`G3@?fFdfY8BK9ej|%)-t(nQAP7v&Eq(R`?kJuJ!R~bN7#5wRuf2s z0&I8}gcy4_1S8~JVY4OQ>}p~&UIn;m(n%ckr%@Uc9&jlX9sJc_D=AM<#@(?j(u&>PNBa%wokQs9VE0n7^)$=BX+o;nB|BFP&#;zZ`QXN`HjV3B<74d>_I z1xJh*0w>r{T4F^JJ>3fhj^^j2{h;nPjRpN4+r3bDV*=w=BgERRv7T!+jxn%K3H~fT zc0-w`{tAkpyNL4$hW=9U#D_B$5y>R^!O)>jCyrM#T~e&bZ@^Ue^`iLL2g{BUR)07< zZcBAj()atV1xJ>&b}q>Zma-#I5Wnex>EQ#l^&_Uw{^qre;PL#7^aPJ--If{NdR*NR zBDiMdbhGtF-^~0fY1JMBiS_^V@T~ld;E(w^EF*Z4h8|njsxmvc7*7SQuEOYuM3uXocrtB#x{ zJ1A`83@EmuqnMC(xU4wCio8p4Yr!mz^{mIE{RdVgghw$?r&^I8kt<%c9ofws*1Kl% zP$U(W^^<@W)>w{_%9c&D7megi`6?@xjGFj>%o+}1NA3m|3$ILE_s`DxS6)U=R_V2xYT-4Zee7_yh4%GB%?r@ErUna^{dzZ>kB$ zOA#?nK3QoMrD1cp;7h&83=lnNdiZwaeB?i9@H`&I<9Z(PFf=2aprP?XLt5Rew4Sdl zh);lqx@xV)mqGvZ^IoIebNXo{OU=LW1T|UFhj_5Vw?nznKk%sW;k0XRCHIV^AYeT1 zUm6E_iJl1#IxCNy6+A0|Tq_L3wgg5Hr=iuOlx}=TI--{wU@%}+ZVBKMm>+1qrnpqw zdp$M2Z>`9!x;wXfR3?Rz_6)J%*;w+qz+;WxOKjF`eiKNcBsell_#XHlbBALtWT; zK7%6d<{D-krzlZdJOp`Zvzl_?Yj$`q84kb_^*OBf1s9sW5ORYwoK3*-7M79gX^BKb zkLm14#b%?fmluE+!)nanZ&`mU@@M(Q#jqSzx`k(uQ@*@1GecdjhZBCmINtqF zJ&qD$L_qGt#W=JNG9z-19`4ti$|9G`@QIJH;8LS$u+vcCBl#LlPtYLH1VTVdj|r8P zK)@4pH^CItTHa(legRtac=Y3eI?j6KEWyo@n5SCI_%qI-+mFmxQRx+|S#y^$aKbBM zYg^khA1mS}XBw|riazp8q&Z4Bd}Sz)k9q3`!bniFhO7#Im?w^BGRSjlUf zbv`XJ^r`Fp++j(k8X`GVfy>A8Y2qktk+mWcrbie@n{v zGd8HvbCk(iE(l^0n%O9XW6KN;1oJRCaS@tywUxbj-$O7tYjFHDEeKhy&_i7akI4J-Ks2!|TLB!k$7sW8bLEL~AZ z#^nE*ui=#kEE;r z`C!IT=&K5Fn!e^@5Y*o%C%(tWtS!rJxG>xy#C`Jg*yV>QpZRF?ozTA1t;i1nU@{It z2<6AUp?JlZwbRf0ENgnKGT&jRRG;B5SPXvCxdY5se zaW4EbtY{-tMD@k$W%H>*X5s`ag(m$3^_P_NiB@#7Nk3lQm7adSNk2~2r=&AGe$H!X zpKV2dZxB$VCXr(7PW$qLhoNa$kub+TH5T90!x=0dzUN)8MQj_P&mKrer^hB8CR2t5 zZ=?VKE&=6e4p46xW`YAezSj_t(FR`U&5TogTxaN;!3{r6=q|Y# zniT4Iurk6$y;VHMHimwdk!7!_%t4dx4zDZ7J+X#tV0hSzbAqAV4~ED7{kRfHZ@sl(rQJMWH7pA=;BMAUC0sO5 zuF^HZAC+ZWk#Z&S* zA(N1PV3H2zlP;8N3K@EK%Du)Q>7m))30v*p&1sKLd<#<38S%$xS}G#&`O3r6XVqa= z<1Y%R=~i?qUujZ*RZp@*S2Dk?rYjQV`sq11DOryB z*N65{E?1qOD5uf-Ii@qxbJR&G>CC^kO?qE7Fg^Wclio*lastuRFGK|bUAnR&XP__3 zT#Wn@q{!$*jv*zT&I^Uk?}20)&wUfE$UNYN_Epxs3$$+;XB43jw22&dZ^^pv(>Yrw~~yW0G&@D`IU1WvNK7K zu&0OWm9Iw0x6_?(Mf_%{CcX*#iX5N`fGbfJnXCnMS@Fr9P*>l%ld>AvS~}bJxQK<- z5*0a8r6n?o_s6?ZvJP^y4o=B>x|{Wd)T{&Dtot8JLOsIGdRJ=Jd^hWdDOtaTU2Dz1 zHZ^NMH|ye*tRJ~qOUWv7r0iGRGKq{RSzi`h2#e&JfVFccWvasD_j_97-txJXnab;? z-GKeV(<({3z!y{4Ql*+L4<4+}Fc10aB=eA^7E=MipK`)}^oN@_Gv9%AyezrU)QmP)|dwLJDX`L}ns0qZW(7Hk^ z*+o}~2IXPjgcd7$orW+tM}3H#*5s~U+Tjql`X^5^<3#&CMbEg=x*f(sVwQH|$#tk1 zm*kUcb*K!-dZxaXw`i+S9*|FGv%`vfC~0YH>nYy>ImtQe9mqxCD?{DS8z3$9Tl0{w zVm#>17fYX|^9@?Y`ps55q%%l;;&2w}r&;M=EKr@+n0^lVj@Bgm*)AA^g^bj#$^_dDPwd)eZ^HNE^7Z_=melT?G~x1x{mKvxE;qogYd)^?{;%rLr{ zyvgN<5}hj4^-C*K0g)|a0m)mf->TH}@)DA^TDl12P>rdw#=Pp~ObB(!f5cLVAN ze;t;H!G-D(bcZr;ixqhr&W$5u^tYl+?7Nuz?0F!|kt)Q4mNsf5q~>UBnPf+JAUGsI zEwOms+b-Fes_S@QpChepFOi0JRJRa-hp96F$g&-A&kCQ6?dKC8K=umj0ZMB7Oo;5A#^{S z*|l4TZE%PDC=FpW)+1R%rD+Xye!+N-x{`V+c9xpVgEk!@^;ysClVVtt5MB!()LV9qI+{Ld zS=c?x;50_G-S@DxXJu&tqHULfnxS$5=H^7-G&zGQImOFgkN5{5(#?sL)#RL%lJizK z=fB9QmkLkv;7}6his}8N9P8yZVKtHirS>nE5SDtS#7l0vUp{JM$dUYQE!^m z|BtzM0gtLW7ydKJgaioe*kZ-jYN)AY#I{6j%M@&9lNp%731R`|98uG1BR$&6Wde9X z!95{a-A>CnYOAg7v8O$~Y0t5>1-v#1O27*OLB&fgpyF&I2wEWtLcZU-)}G0Pi?!$Z z&iDWGJY?2hd+l|3*Lz#*pH+Cb>l|#q zuE`nd-J)}_c3o$3hIn&z4y@`blQY=6Oy|HLXXbK}CQ;Iy-xudtJAO)5^J_F`UqnPQ?OIZ^+c=HH1BdY&d0!k%2q$$Cp?({p>f{FXtzyer z0%PQ?a~U^Iv+kF;6?P_aKz!(%P5N)_VBVa}d~)ND;Tfu%km$A!X`w?j`gCSz61yFa z*j${rqQXrEUhLa$_%o+eZM7$+p1|?bZrxpCckZ;EH%^PHeQcn;K!ua7m1lh}+T>YH z`Wm*S-KP_O3HCs5zG|hPAf@4}?M1nzC;kokxp04QX?G;`5+AWg`f+I5d@eGM6x>!q zKhqayeU;;VeQ6H{pKqYu+mDi6WIrf7;F>jiZTQVO z*pl@an!8$eya2QftVr4(SU}DPShC`@VKCnbG&lW@8eX}Z|}q+yPb<%hLEYR zX3t?Nw}2Pf;+*B<>sNL45eD~3>4Ee|&o>xXZml|>t4mjLlf(mYet*pd_WCu zWbX$W)cHeBULOx|A3?9Py_j2hGV@>va&Qj+yc6ymhVzt-)Cn#;dV&h}FEEm(Jm`6x-=-@lX#j&70Fk1O0KF?^*sy5XDRQGVW?Qs zuQy&grx9~M(@zSr}}GR)j?P|%xA!N)XdeTqjhkQR9(Ntu}&YAu&jaWpc@N;jL- zO&GdO>O2m=ODYq8WoZvSY7IOHl(rvS+QVdCY)V~frRzv}@1Ty;|5XcyXQl?cf2EDw zUc#>#!GkjHXDMPDhF!{~K}_9eX`I8tf8>?-u7F7+EFB~4hIH(5D=jewOc(#fr0AmX zHuC7=MUrx|)jZM1I8UDJxA^d-Kc`B6lH?1Y!%qXn?B)rdX#Av39!9x4fO_`{v^BO5 zC!gf|1E*V4f5p>=^XZ(R|FU@C7`bU*jHHEl`#2iL4u5aJzK9d%64~TE9g~AK1+InB z>aDDBpd7uVp9TEIWSHgnnTT<5;LdX9HZ@9g!L5W#Oc3V)XXH9U*FH;Np+xw(#lNZ2SNlzgzKM5Whxt|J$;bxHqcy zc-zh(7t>VARyp~hHBzi?TV;H3TTW)y{%ydv4F-Th^oNvf_?lU?vAzcYR+k`yyR~@PJgd1aERaY_w%RrKwV%DZ)&^w zb3;#E;BR$-_ed@{m<+s87kGo@`R~UAU5UVMlG6_*0xu;3f8oO$`sxCk>H@p!0_#X5 z1Fa;G&(ei;$rAoB2U2CPI5&JOi1QN3EC6@`VQ+?92QqHW;{ki_9;0m(|B8uBj&05ts}h_r}|IV86Qai=QPFSa3J&gB1m zj?%VQlK2K&X#euAwep|;#=}3q$DgmsWqebZ??e1f?6y{3&vftM6K?UCa*&xP_kCtx zPyAcVISGla9q6i)NqSk|d}ArRcoFlDARv zWQOU%^$-&CEhY4P$H&i*`94?X8=~1O_epolgo)xLLk)0)=2m%?jUNyS3C1(glDD1L ztkmg=%#2d)v$Xa2RQg~JhXipBa6siq^f{Us1${L2AJ}ew2U73xaHjxCyysz;MmrY6 zuAWooGT=?o!YvJ_Vg0k&OCT8X`T}exp*F6j1c$;s3M5r){Gm5@{BZf)rDaQDY%mi} z*R+y)KHk>-)p*;U%6Qw`mDZ~LFuf_b+r`^@EN**=t0%R;(GExghC=WA`BI=Q5n7j2 zZFOp0()w>iFb?6&Q7e2({`w<@JMDr`5hxapC6p!Atb1^;@HnoC4sA>X_JS9Q%nHHk z)QChT(HCFVBkvcMB{FKb=80L&6PNYw=nE7jtlEw7%q^M}mi6iv)yI&c3NHVy)~uC-`8T$SRH7 zE;+DK0&=AYkZ3hVBWr8Se=RXjB_hi z+0`u^r8(aX4v|xJY+SOFu}SFT*MU??@*KGgv>aukaqk5xI28DlCzkc#%v#j=bc6YB zX#aOF9_PCu1HR)kDOb?s2%22+_u6}Qe|sSHDLFOvNrZk{`H&rZU}-K%<1mGZ)D=5ZnNxKB)I{|{k|A&-5)-}Uwq)+ zB78p!^b0Z*hNyL!dwaosJDgoOB$l~z5WTlUFQ1>edx!+MOW`~ z(6}-|Of9CH7&~-B;^OS>x}JET*2-@c$HraDuG2VbmB$huvG{z#e+=@7)$lM~mA9ol zmJ*20e;mXk#-PXj$1)zvtft@cD5yo7aywKgHVz}x_sC3!4_eEc{K5eWGn(r(3eX=) zqbS^1-TknDFs^!%p`K*s&xZjsF)z2O7njr$`SL9h)O*$a_fyMFg!o(olLo?EB2^|O z)jDsT{A@Mr4bcRn;k`tGv?j0B0Uo02Da>}B9I4hY@48k0(0EzbvRrbIUO(raO1*Cu z^fBmNT<}!lB?_L3z41I1#3vO0eom8VqoqFE=e#x2y>?pE)pz=2?hqVOSynwkiEl~# zD1Y7MJ}fvGb#Iu1b{>p{Ua&)b@LOjFkV(3y>oasQ!gHo24h<1-35s7Ib#D`lvz)*3 zH%8Q&Cb`N7igq733wvKI&>mH~gq;bV?Q|Dg%U4j)z0F|zCH1Z=&r$c`TlopSqc&!) zmsM4;L^(^zAvs}u=eC-T=%_yRu;g@Iup%?Dxbsb$Xn&`lKZ{%HbnzO{>xRYAQQa_k z^C?HeCMVt6xoAb7X_&04;|=PhiJ1u>!^2zYzBzrx3kRtVjsgFdy{xyCL0ZijTPrUDqWep`jbo&31dr>PB&$4S@VTqH#3ZIm~qr!PUkOeb4xtt#hMyXV7CDoxplkOo!W z_y$upS8ej^<>Po}3OBT@=WD*p*{43>d(glRyq(8{CNYu_AHW&MTyxrW4)IqP)VlWy zO1Q4faXj!$Je*xHD<0ZqKVnGi?f9}@&9AIUJK`lb)XUMv9jq;~w^w7zRrl(;oX1Dz z7E~;C6HsVnb@se5^ z5Ipb5o-6eSj#WQZ$J8Mv!TUIM=Fi9Y#4|4H-po;MF86f_o>)Bs_>?BX9SLg^%iCbJ zYnRiVvs8Q6Ck_1*Yt|iVHPwLu+*#yah!eB~=60QPfs*^JDyQ{K;x2}>R`X_PCF(w) z$!^R8GO?j2)boE9Yj%_qG=a4fp&GU$4wGR`?%_-QVu4A3Zs?R=9NcUt|@*$m(!9gJ|t=7 z$@>GFcs|T&V)uN?Pal0?Bl>kq^aNzfm^ydKIL@wSPo?*D?!{a<8mqFy?NN?qaO0BI zbeSGLZm+v#n%t6T_`SHhpgw9%dM{q0#~M=yq9HODb6%u3`^6Bm;|@&*t{WK*&8y;f zbTaU;z(fZ70F^|6bka?XjB+MHC+MwyP$5>C5H`*~$w z87(#Qn847D9Y>!t936LUpHwR_jwb^rBm);R$f42#m42%#9Oz-~<|cB6B9}pM0YH^EgNJ?vB^n?M z*X!Y39HDyLYlp&p`5+garngg+{T0Pej$inAHdmKKKN1L00pMwp(q@F{Ug6s`X{+ZK zl*N@!16v&kDg{kFKCXb^wLW-&v!SR|4CS1d+d$~Mmq7+T;a(NtEaPtzC|T)y!S8tZ z0jXOm)(JyvaaZG6X4;t`^T@W|5@zEeAuh9F1b=7;@S%OGBfOC`H^XUre7MJ&)YDHt zGo}8L1@$lpp&(evU$b}pioAek#c}r&arf$R;#%=h94^>xAMMswvA;g4oj?qpxu++5|WU8 z7s@iUddoRqlf!mfy%qA3nP6qY{bEcZB&Qk))scPS(;}f-6YeA*>mT5Yy1-ZJ0ykBf z8S*O05&bppUI(*nPpS<-a0H8Qod<@W0}T*##7{|6#R(e zaUw;hm2<$kT<(yQtr;14O>4mjxzHh#QXE#<6&>o7*Zh`+N0}Dnb1C6kk z1*4;(tE-ZsMu_1u>7E z{;BJ?3HK%@2b;{=>=xXR5^7St_XVnDHzCN6%*T=PYa~Le0?uSu2k)14Yi(!wM`20^ zTrl{0_kpDh80AX6aQY3i(7^&mIqTfX+r>3|Pj_zRy-}`E9c*&vTC2u3?Qc-$Ue};1 zQzOuo)TYqB&&tAt(`?I6m-?N1_)2SjV#RbHs9>ra#@r^#jFZKo;^9g%)IQeG4Qj*% zJQwlIl0)f|EkTPFcP}9yBxneIYH-rd)*utZQP@5-wtpAu%#>~=ij1|2Lj%D|DY0%a zC1N$3U8kJdqOL2Q@IipNE$m1y0CsyUv@SZ{ZI!pm0I2zQbko)y{<(BmW1OA2uFt?H z=`NTXb+4YK9+oPT?iGuXHW*;9t|#(rPMiI)KuW|=c~`Ju1%YP)szzsa?9~g-+X0qM zrA4t(Z`bUNj@qi$8lVzcKZUkB2yHcZQ-cyswF#|P+G%_^ilsCtk2f54-uEreL&_D(92Y)Co$7Bs0kO5Ez_!W$(G>9 zWRAAb)qt6x{FE3Zjb}jc&NC~6E$|Zoe}$HU-9THU;a$`ysM7o= zUK>>R`H$>2`*O3PZ5JUHZxLGzKH{GvAi$^lpbUCa>|G!LrM)cd)qJV+5WFWf{}KV8 zs?IU6k5&l-YebrpM*p0ebdLEV>xG41e@k#y>os})tlsli z80By%;m-d1Wj%&Jmk9sVt2&f#f2o|AOwib1v8$1}bBF3-5uC$gN-fUw=ZQQCe}+3x zX;9;u_Pe*;BUA1O=QVU95?9@}TK+oBZc*x#@wc_|yFhdDo&rw(B0b3?((+C)86I)V zQ~VktF^J^sf}d;pk7lA}hZ@E_EVU9&uPqQIV7c>lF`iNtTo6&n3`PuseV@Ei7<`_6 z`wSjc&1(LsVeki}#41cK!Et#8pX2U&2vPUP!ZD)my~2&6nR=go?abE>n?VW(u`{)S zScr=P3gI2bWFX(pkID)q69>W*h8refn7%Ip51g*e6cn0EXq)SdK|*yPEn(YX#x?=A z9YA&=ubVcTMjL-tn~8qBFGlbg=hw6${|cb5+qIeoYwqm|_g3vfe@}Av7R-A?Kl5IB zPXQs+70{oAox1C%!o6o2`pdKLwVc=!=&|^6=TwR5rs+2LjgC{mWi2B z)T(MXi5y>_UZ0uV&)8oU^fQb-s!sXPoZU*lCsk@0>*!H~6LG37@#iAyPNR!RvP&Tp z+b4nML&64O1EbM(2JmAEHYr-L><0@cmSD-kiP3+oW^v3uHo6;fGU#q5NTan^t=V;& zF6KMg5im1G#YM)pA|3X7>s?F}dH()3{Qbn4oXwACnuX2x^Y>}gn^Up0tUWe!eUbUg zGuI<0_Yqvvk2SgJ|I$1khQtja$cPSEM!$Wsuru=N0!v_L1gzKWtS+%aeI`)iA{z<`%94YS3{P8j6j@9&6S}G8CNS{2NA^MO$Mtqvi zh_*Dn-shO8K>dXEK^jv(8_}M3#~DOke%=i7XGs@@cmx?YSD>#_`f|(YFY1(_<-m!q;<%ee1CG| zQB7wdnQc=!bxTr|4{3+wJ^jg?pbWH&#*I&?=~qH!L_#Lj=|l*$)wjnM&L~klFJF^h zuTjHls-zdRtEUNLWPnFmuSYSwsl(YHy(&_rwjP^h;mlc%1ZMN_D3&=9VStHkan1Ug z{ZMB-Goq+LRZPzA9!8|bjwYER`IqQul1|A#a%F@%NzLB-Fgx8JZyBjPJit_)%WkDc z*Aor84v)JRj6>|FO5@|hsUiLGO>tD)i=x;mmq%eu23u35plaji-DT1V_xCbN_rhtJ zvj&Bq!{%Mb<$kpUBTRi!jmgP+@qb_%Q%^I6sSc<2s#LqvJ1_O9nYG53x*q6XPt~+` zJ*n+FyHgLUU09*zGP}_8@sfG<*%gGR@A~<``)FqB(d1OwW6)t7I+P%KgW^JmxZvrl z@bd702=ilFptbFe+R*~UctZqM1xWYMX^BO7U#>TSB{dVKr)$@2ml~IIs ztX%BfHGSDXydv}bwoG+LEGboG|N3uKKnG+6>-z@^Tv`M!4sh|qg7wa`((_<4IjoM8 z_Uicq91m<&v9YVqq_(cx1y28$#&6iqm*5-!6Bt-6`kosdyvx8M@82rG5Sa93|KsJO z;PEVHf8y>X;{?mG-#{db<7^?R+BvQx6i|ry?+(F`eueWm+2}iOY#WOvn@RdcWN7mt^9-)uA{1q%4kl)~ab(Oj>!cR+pBS`xTUgdY;Q`CLre6IZ?g^XY9O2Y-#@(dWgW@n)gV zFQt_#kK@aY9+=sr+BS@G87pisRuXF&A04ERk~hXaV=1{7JeTRb5(JgMLHr+TmAh zYw9cN#m;SNU*J`cQkg=d_I7S-7~C|L53;v|%IZbC^ROLyrSTy)Ddt13Lfro<#C@wU zy=D+$MQT|N3ofKU!wT;^{H#W&?DHc0Iqv)?;m>u#pA*8L`{8f1FXeQfnfi>=9ZP-6 z=}x3R>2zO`8tHUjmHMdDJufx8HN>x; z%6ekbSH)egEjtL8yAtsP4(t`ydX&s4z{x>?bm*ED?)4fUMuQLFBa?lqO!mn#*&~>2 z!ACvYjT;RZ@!Q7)DY+T8CHr;MaxRptZ*J` z;kDJcSEBr3#BbYkGX1QepTp&7q3LR%JCARF9z^l3NAmpMzE}f7&?lh|`PU+9{q3m1 zT@Jy$ECe@R-)~#EC)_Wu2u`lv6WlT!^z5LhYNb~5x(cMTvt%TDME_O>ya^-67;%jP z*{t-_C8zkj(_l6dmdO)Gu1ZmzCeZ`{_B>oZkZ$2OP4 zP;OfX#KdNoJ`JkGxea}i9GLFhm$}swZmIULYU`U(T&~(Pac;sp#I@Ge@^A97?7hB3 zoi^iX>T4|Ps7->@M_XPcZ8vyrlfa(T6ZM0L5 zUA=!4R#Yw;!wrvQOSBV7=%Fa}KVLR|swj zXcrq?W%ZN;?JW$_(DQNEm<3(V+i*T;scGzM2BMfg3{)}~2h3iEz*sM;{f(1!g#fCx zaj8IYF`9U+R*V5!d3XXLpp}P5bOPn!0i8g3 z_$`T?*qBe+yNf>t-dwA2f*j%dn6>gN(Qy|MfnXe?Bx6!>RQy%tmKk}%1%jtjc*0k? zB$>JO1VON_hW?U^1r+&`LPzox)ZYnh%TuX-n&3YT(odiEpUU)8h$mVQFF1MK_|Zgo z-@@VYZGgwr3h|Uqg!Vlqtw%!}!fVw7_kcXs^0UD%V*z5xs;4$H32zW>(KRj)IYO*H z%I*hmnsJX9ak23SiwPT^+o!|2J6<2j=SY^nG3Voz-jwUd$vn*(JcCq2>&(uMK`?*s zC&pwMxX0W^SSXte0T>6yOCfW;ar-;YHVMU+%beX%Zq}s|0ndD=S+rbQ=1w1L3_|$l z{*?1am}5p`sjAoRE*Xwa$ax{PV6wg)$vb5D>0`Io$C36fPi8h6Q={zr2I`h(}q z2e=m2`X87VEh7R6_uHWA+u5BhLds&YE!c2-+-h0??{;fh)!bCdLZf!9tl$tv$Q-Yi z5Gb;alYoa`f}pfP;(H=h4wa_9js}mSFT{6nxnz|zPBkjL==4V}Vn_EKVnb6PhX30c z$5G>Ri&KkIN5c21ZC6ljY};1KDG2)Fw4N3h?D#vF;crO9P+-_u`+tC0{-XEMXZreN zs(?a$M{T*Ri)Gdpf)x2#E8HSzqJTlM^i_b%dx}419W6RWcF$I#NeG+tm5k;e^PYNz zs=V(De8mrmJrVqnc8Z(Dw@a{(fYf#DRN`hKzid=)vstYtLkqA%Phy?{2&6T=$`h9= zAHR%0liu#srtE4e!itS0`$q9%T7o6Jv8pbFN!w~VpV=+g?wr6QNMqJxxJYQfC|f;_ zXQAxEXI~_ua9yBbBr>7AE^rmKHH@}HQ>pDLD!YJDIZF9Us$Eu^qCpH%Km^V z#EYyv5x@&35tv#f3Hn6m5}~P7a|Kw4e+`E2NmV*r(Gh~~4B@xFY9lUt=fTN7grIwr zi7U{*1_-*JF=BsG^9mRn0VdX@fdlX?7{x{`Vg4wlG6->s3ruAYH!%iAV>P|32a(@L zews)3w#Pvc&P`h1ds<7%()%OU_u6!F(EUpvYUQmJYu9%g=I0RSKG}|_r#*uV1@jmU z?GG+&B5?sF8c-K;)jpqv4G`cqJUG!d|#Jj$Fs9Fg*q$ z^8z3?qJNNAL|;jidIwBSnYYIzioG{XBIvzh5+zH=qzwgBKB5<4|zX69)5$ZgJfP z#KaYHEDUAn-gSHc@ejf!a2v_E^RPJoVSAS75q5Y>>PGy|#v4~GL`01U%=E{oyHFmY zZsbh5+`KZf`%s^8L!%084?h=_Pqe)rtPA`N@gA)%R!%Efq=VJUdD}X0O1I90u@u%AXo{kbT_l4Ed^GS94GL^;x6{Z#1&7= zVY@^)I-C)oLh<~Fb@T{*LR?e|iNwdXT2@-TGuaXpZTb)N&VbR|;n!zBA`5a)WVGh< z?rm@pr0flgIq>72KTU093mXrw$?*WUPOioDo6KBvxM01g{maMNYOfty7v2|TXTh4h zj|c<}YHZ^URGztN12u_ndS)ITYHPT(B@ueJE;IeGZqN9aAMbnbJM_y~Vaj|j@G@Z*v51Uqb`-A(fa_5jB8>gI`&?gw`JcQ3WF_rP<4b%EI)9G=D zqskJfnETMJAN*8e$v(i76x6YC{CXxq8 zLWq423chf|ktbH7*MA@26sizvW+A+<+-jadF{ig2p)BPyGpf6t-ZJ81ny-oRAmPGn zr;lqJLOS(+c}#7y(pT~jmEAC5iVsB~;kdhGn!X&dZzFw)t2LNuq>$_aiRgXkUT)sO zNfQNnbVsCIOz`oJhz4&|MP}Gqn^*C%pd`M!Qg=BXcVbSXVl{VKW>TMW(O!#G?JS(f zF($StZRNHzlLm8~;=m5&vh*(6v`gJ4rizDvT2bH3i1x-^GEF~X8n2hE2Mp2l=guWp zJLu8ipofBdNzujF#Wi!1M>;{z*qM7kyb`4nR}v^+^->mhxp?N>J1EK10^H3nkx6rI zn9Ed5Gs(pyO^kw86Bh>-_O(sk+S+(I9w~8HkMOOi(%bi9iF1}jsLT=PySQ@2)~eZY ziajT$SkV8{oQZ8r3d8OI->jVd_P{IpCgHK`y>e)C1sbZxL1Jz4Cl zBeZ>WxLGJS-tX)2Zf#|L&!!_*sR!uqmv+SbEggTyN7Yv8#n0j)jl=XdM%U04dKskm zTl7u_mxJ|Xw{pE1au!@b$4yF&+0yG6Bg6SHI~k#O4i)TVd}7`IA9gYZI#r4u!E6i= zo_hJje9F|ZcDh~GMjexf)a0n2~f};{*0;Tw;stKMwX3 zS%wd1N=M1ajV>?yWD?k)g;@5x@R!vT>+^QOf=y~0DStkjHfsjNJt7e2(l5hl+TaIH z4}3-_(4GOO(TV|hO9{hk{x*QijFf!CWh7ju5&w>SjQF>jPu8D7Tf!BN;0Rxkcftc8 zCry!$6)lyV97pJg$f3nNW9W#?kYJ8-S0cqaBD4B#=4YvJ0iC}zO-jF7Dx`1T3h}e9 z{)cE^ll)^v5$VeSy6@0V$od6c{`+KqmZ5ba`%xw-WdAWq3WFXdi6h8ft1BIjC`R({ zAEx|ML_cHiN8^RBAKaMN4?ZltKlHyx@7c$WqW2RU8R&v_pN2 z26{d5MTfDdnQ`x3s1DM8P@W4&Ti^SUTiv{?xd0YqPI+{;p$5ADl-G_Z|Iz6~yuHl|nxb4}(WLwKj07M|Fkm4FJ|zbfuU&ydun_s4YtJ@{drm?!bI?kAZu zzTZsR`*;3;{F-&M_*xmPj%RKNB)H!=&{DGct4yxPVH}@6T>Qa0xV~_0(8&hX#qWEc z|Sn2;3_ACKiwpi((lg>=)X7jQeeOVMg5tRjUGBtxKN7i%xH1(~A zx<64U3sdtnwsTNZ)sE}j*%3KKgqWH$PR*T=RQ2e^Q7S~>MdZiu8zI+-s1E;x3@qd? zxFSkJjXyT;PfW;rH9g+-UErk0-1X;o*Jv%z`>$OEn*Z_tcIWaam ziS|8~-5q8+=`MnOuox{CByh`eBeXjvm4EfCz^7wUg>;hNi2Q2ZKV7|)BYR0=KDgh@tCZ z^gq7~+QKmfu6L^*4izcSd7?btxr25Rfh{^9r98aJdOtd92TlHf=Kfi?X|0-43}JOL zuH`?bt8DE3N?%pn*Vicw=f8oq^je0{mC4h>uM^`@7hTnz^^fi&5LF<~0rFi<7( zVZ3u&rVcym<4(^oZi_)Nm9J(Ne8o4;6O~7Q#y3&!mXrI$cW|3#oB%$!9SkWIkP@!a z*ONvixOmAO}xF`(5N1xy#Vr=q6TXqVp~1&}mlldg_&dyaH~<-48WJ>K)iJ?L9B+(TTl5y#7xbA~ z_6*Xaq?4J_iQh3m6YLgvY2bMh1yS(ab{AI2w%m=t1LxUApOvnb(fk0Q2qqqd7G{1E zo8IEyZCg#MV6qARE1t3GNmPJ0I*|*(JZ;gF9O;2AJ&-@lda<*+#2cwQQlvb2JB=4+ zo>ohe$@01}F~irKo>Q%6;rMpPa#8)|pO|bg=U!TF04z6Wd~mNTAt&4Yo_r5U*{;Se zf`Wf$(XgV7&55-)xlx>smC!MChpFL>;G>kr|Mroo!c*pFU`Gopx<=>Z89^|n1+X(t zs#)*!euQ$jPLgs9InMh7`BH+BM3UG;#=-OCO_Gdw4a1nU7-TAX=%Z2yW;Z9Hbhr&R zB<3VCIw>JBVUG3LMR7(59beBE%xLDCW6kKZtOJSH650i&qj=p|JyzNtEpfARL}8_W z2TmA!-A0N7SGYfH36?BhRLU3S@&ysDc!8A&h--dPvsr&u^Ro9tX(#Wm_;5NLm|TnpIXi5V^j|6}%@ZG0&wexS#BKbU@bqj}G*o3CRhi>Zd$R{Cwo z&1clt$U(lp;@8$SOOKz8!5gFDgE7?`Q*RI#p)>9p8HWNA3-5?olZZ<3RxI>(G}PsX z$T%T;h!cRns9wqpbE0^5Ec8~sB?(!N15@L#kI_H&gc?_fl$ho%&+A3Dd)b79`<;S` zwbf-2^-`SMA($^KeK~`Ps)MWg#;4jCT|1e0kLtdM>6W&6e@*Z?8(7G@t?ROzPJ2!OIBJ zmsy9QjXLIt4zokILOzd5|KyL?A&wuJ(na4ICc5MoqmEJeIbKv;CVCibZ7L4-_jLPW<`rNtW|KFeS?_# zPK1Coc}~kEvPdJ_y=k_IPJ@zzk3vjcbfuNPM|vqL+7c2zsw%He5fuWpFb-j$7G8;3 zI0inLqhpP);=f?H4SFFmOd@9mo+Ezwf)IGPMR+UgWH^yg_ogw~G54Y?g@t#mWQH1n zdYyVpLx7<_L*#C)$wouZcbgOVj;&F7ZY=ZzUnUCl*Jnl`jzOL~UMpDntJb2ShlTV}`w+VMBQw zx0!ll*Y^vidyVQ=&tf{*3x|jF)JE0D$eD2RKtdgpBvZQjo5v!n>sVW=Htz*!5Pd;( z)0nGuQ^FzkYa*iJFRqg_%Ix6OF%<=hJ~K+x@xUgt;bDi@Tgwlk48`O?kVK(sWHGUx zITf}39Z~Cv=!!;hJv?Vq___HPbS>8FykoBuWW}L8>On(G=(R%Uj=I3}{gqMRYq~bp z2b;sY7LEpL4@ALU!5Fx>0o?}1B|XudLLy89eri*L(`POE0#xGOp;e~NJuw&09M-{8 zQ1~)A#b~CeHI&hcdtj4yG8Dw8m7Mp4FiD+YrB|_Dh-RkX^9HLvLyOsKs^_x)yb-9y z)P}Av`1=`@10MP_$))nBE~7HyroqJdrh%8gm^3CYfk__(lzoq&-6{q7hnoXd&;svvjQ_nbE^7;HVe`s$`D zQ#XbWE%+z3wQKA@0KYAKb2=@d!yKjfS?Q0!EMQ<)cKs1n(PO|CI%Iclv*AUtQQKlA zlj?<8(g)j}IsupX@YIOfU|SQP2(68V*ILdm83-(R$v2KgP@~!R7TT=WGo)a}z*%@P zb$VBzmer{}*eGw56*A$^9)olDB{~Vuv@g-Nr_9-Yv(q*-^gQmygt|6I?0nSoaWk+F zT8lzu&2kQY1qTM#2EzNe%Hi%Mf~Sppe9ZOc(^iz56Vz_?7opcGqv!2cPr?$IbJUi4 z0y;f!EzbxB98eoWFT?{|RWGBS9e&c9yeYIP^gK~}X2&z}%6Ryxc;@`dh;>^>oY+LS zwMELGwbFO+rPFI!%Wst`UZ`2mR(spqL7VW}ct^ZzT^lUtT9UxK*3ICc(^eS`KfA~y zf~0yO8tO;})^XU6kicAcEincl7vC~&V4vVl& zeohIyx#X}K`?H@Dboxrk!L#poeh%kR29d*6t(=zCH4k$7%E%dngMyz^=Jb`5Qm#Y zXCfj9!m9q2Ph7n!sxeZq%4)h)*K^SXwZS``ny5x?B93r5l2yl76&=i4xfs)08}~D` zMp~}xYwYsmR2ggwXW(b%pX-gLjsbe)yu4gyEGKA15+)4))oiW@xItyl2$ze}wYhLy zpIK?Pt2ve2RXqCSYN*xAlPxESVnw`TE9TZy*E5nFj?~5q! z$6SpB<+7yfr(C(GL@KZ~h5rpAC&urxo3uqj*ui4W4pMauw)5DX$cLiFBrIh4WyfM6 zZ*U=(;T~)1)ZZv}$ECvvp}$AhBlaOt8v9KhD=97tnpuYH-EqAL7blE*VS#gUx@5r; zJX;c$+2fRQrgR$BA6>0nHkNSpLLJRO#A01$5^Rg5zOGrW6%?)XMufd+rE_gp+qM#! zKWY;}_Gjay1!4nA|1zb6j@e2NcWw>b|LGIkbm}v4?6l&~aw=wM{Ayb962S7zHj3}U zf)QEP-CBRWr2l*>@l52jGgl?$cZ^25lQBwuo_Mz7k}T&4n3xP?ZFkCzNkVs_DYUqg zt77i_Xq`J{PMv%G+|b(3iV2T952ET-E)T$K!<~Y`Hd?*Hb|+2{tMdI4>eKz&EW7hH zJ97z=>T%w#<84Hc=gz2lx2-EkRx3}hx4jljxD%m69-dC9r^F(SyxkXiF|M8u$EP)P}b0C7~z9?O&z}My0IIoq#kxYHc!{ zDYJcb@t{Gx-Sdouvvjb1DrO}xM zu&j!~cLCi!0*%aB-|sqI^w#}r0M?tl;;^6EFSlSZSsGqXpPxDFSKP?~+r1Qtv+A3G zODYTP+P|ifW6!Ty*2=E%a|=(UFOAZd&YetDGO!n=toajYmeM(5x=FnREbZ@AG_c)P z5+C_-CEzDcetb-_`hGjS!CEeM7qE|T!LzGd7gWaF|H!gYqkYs%Sh&H6?&B~*lic3R zP}YHhgz{Q#hhMgqKOy7Ge5;Zu&WUg~k(pCzTeq!^hdpHe6L$F?D?OD?IR}yUF%q_V zHOgx4@tWOs+n%6cW4X<3AyGw0+M4|$`a?FV2{(J(92_0TfF2D~WYJFdtm>%ZJ6pXX z_d12%O3J5o0YZb}R5kt--o9a_*NZ-FtsKRvf>_HLT>oO8zaGFM8f$4lANZA@Q_SH4 za?l6v@N-IV*CYph!0~f}oJk-DePEuSQ|cTVL=O7E<$lf}=TI3r=mT|rPMLG4oSZT% zJ>Jj3b#E{^I6j8_9Q^o(kTcjypXBEZaSjb7hf9P?{hXoBp$c-)a^3~(jOyzZ>`stV zK?F-bXP9$nI61?(BaIxaF~c#T+bvUvYZ%vMq9X&$b27BulU)SS6W*vwO}9HHYU76Y zQ>2c;bD^22rWsEH&#Zt}zb%`R{p{ck!w%pJ+@68L=Y0l2mbY(UEnaXjn^0;IQf8u- zGG2s=`t37cxc12RRlL{zG+pc(O#c#GhoL-c<;k|wRRUU-*v`RXyJe)c@}C&jEZNri zdT}B%3tjGtzD1klV8SBa`Nd`tfBOaS5kLfCDy4QyywCd&)Q1(+hze6eCPlkSsOk`( z9p?8izkU32na{!EMK4gJm6i*gbRSIHP1l<`1AI=&C0dC_ys!S&mo-AdS7D z7sv3NBael@{b16#nu;}Pe1pXQlr*C5xrR2>U&fqOjp&Cel7a2e1c8VQGUW*(hot=k zkwemcg2*9hKSAV>w4WeyNZL;jIV9~Th#Zpk6NDhC%wRu3JnHB46U4oKPCr51<>&Mh zM6;jMPY{iMPCr3hK~4cdc;_%d!ZKmpl_KEan=nmp3ko0ec3&Y&!?6y{PArv?@I)>CNl98Vxf2A$lcY}ZENCT zZf>%E&{qBw+OojJISj+Un-su(T0DBiEMlmg8dl@r_%b~H+Td_!jb`?;c{A3ZU(5E$(rO&29QBpUOwXF-QKdmQJRqsXUcC2U$AKD^Fb@PlKIL%*$0Q<1 zx>Y1We(TGu&vNk=jyeusaMr&d{(w8bJoCM$Td7a>c{x{HV);IhT|FXM;u_=lv&x^J-?I)s!)$&z<&Gw<)b|`2&Pn6o3D2oztCz`|yf*-SvV-X(WAv*q> z<4nNv+?j{z5!|xlQng;vMb)<}qw1S10XL_XX@4M{Z35xo5GF71+Gk4R<3DaST|$D; zC;2W}%?Zi*yHjI4y=7_!M)&cjruKgu9}56$^f&v!E3um0UYoWCfk!zwc-_W6B&vM+ z_oOvAwADyXMCFMVu=xI8+X1uohdz&l_J=-~1m`o@L^acHrCZ4nH!t;G4kxt(-(;Q5 zJp~%ym6zGMColhyby@yrU%H6n&x zL=3wyUTA!+`2)X(J47^hh^rMVXdtDJ30 zPst@+zk%<{{OResr0YliTwT(&q931_4_*4mV~bd-a8qoR_&(zX#`lT$bGbzqHtk^FC00D3! zIs5HrN6N>1e4KY|tH4Q7>k|^?F!NnsL0H7b#G;W11u<=v zr=G2I&%m=Af4*TTo??LIOyja%*}hjB@h>J9l@p`JWw>8_8()k|XUR@gkZa~O!Dntd zn8^G|yfFy|TP=2lk?eutq4}tB#^m&IBGZT^58oj&4f*R}C!BQstQKb7cwr5$WPURz z{@d3Id@=LuW9J}h&A$UQ9iC?$t1=eXBdW2|WES;t<7IV#{p-y6T$T2m)_{WaOoZOu zAJHXeR1@`g(P1fwWsZWCxq>g_C?y3KEdL6ikGV0qMZrp6O@ljS=V@O$fqG~-?|sL3i!l!*FrTaEJVKS{__OUcUWrwCcKF=| zU)EhHr3>oCu1cSO>%0Rvh9{iI#n2h8#-8vtle!J31UePoH~$s&RF1#`e-c^Ixh?dr zP*~Ou5U-#yV9x*#aEE~9@byd7LVy)~5uURlnL*%dUU7$2% zg?@Sg$CTs1M^{D7$ELnyDCMdWAWCqqu@?l1{}&ZLmA{)MiF}jJ@<9VrQ98*UqME6J_6iEOA4_ zPt8Byt6_3i_|q_>x=+0b~yl5@&Vk#I^A_A)%&&xom;aIKp(68KL@C>XT5 zbQYU-XGOII>koXuoAUF-^VMqpIgjVnkz80I_{>6^hf=Q$0~!VatOWY%d~GhOSp^>5qEOy0oYZ&8my*6DOli@$rAb3LRaBd4QA_TGFf z*?SZ12m)0JPq0>M*?aS`WbaJBpzwWNu-MMroEN;A^GD`{^jUtv4Y`6PdCBXnsmcpq zcLWHGDck6kD~h^V}a9s{8I9m(D!Y(tgxs5u)Q77gv6|aJbnULbngl2TlfIP~@=rz+V>C6J)r+2-7iGsZHd~a3sO-mwxnq4&M>M>Z z7!7OWLaMdw4r}w(ja)p~rhWXlDP?wbQuaL~vCx6+eVn`!>lUZkC7U2IOm|tHsGJ)=HEg?ZDfH481^4 z;*SBrKsoY#Aaoo#+F#KuzoIqab&J-kS4H^{$2DvDCe~BN5A9dby75DM5B$o^EknDR zpxgY6Y4alxlZ?Yhr<3~IMR52sL+dxs`T9-UpT#c;aZFUn^=en(Ab3&c?6}!!9~$Kv zP27W;hckTq@wxU6TO*DMy*Svb0wdxfCP$tX75mzsY-%+EmsGj0Q zm+P+H0z1?=p2*y2G{L;mmCTd|r*VW~V!-iAY-`mBL<{QcZnl87m2tVL(sP9mR9ZW7 zSk4GjGwz4#{e?dx;#AioK0ilFz9#2n7@B4$zXxEt`9rXr4e z86Cu*`Kvsb?~psRG?kVN{8vkoN$}DXL65-qk2qONs_^&^t<5f9CfjncDzu4u?^i|` z82r`ZU2bN(Z50PdYbW^1fU1pn7gCP%X3%n+m`-lvZ1qkw{HieGa`?@=p?7Rz_o|ur zUQNTD?S**e;!6D3xFyuOt-XAcl|F$!>)noW5?n8g&jGQ!+q@t*$f{@C-qikVm4fYh zQyZgbd!-#-H$N-BGrb|bc$j1s3ONCuk`9VR14SXVMokye_FQm1DS8SGxm>VirKVMrr`&FkAu zMw!z?kihHNyLL(7~tVNTC*GT612s|U1)+nzwnL;`s*34&+wOmr-_&u9i~r6st&Fm7)J zK9W8?`t#>4g^O$Zm8fr`{jqpumVfsrJlGto;lGWyH?_sD1yfoIev$+w=*GGJMSuI54b@b=E zk4iP%{JAL_>J0Q!4QhS_PAJ*T3*618*z-O&PIR8dN385_kh)f|6v{+U&FF+-YPISS z%~iQe*lW_%rpM0$5-rZPc)>IrE?R9gWZD^jBvh@#_(DhC|#?(yCbjg5k`J~iUDnMQoL zE;}erSJv`6oa;=xLb&XR1F4ZwH4B>rhvloHYB6gJv$h~6PqyME>IA1i8SD_3RLRvA z?hWN)A39IgiDK*l6)&A-HGQ1M3Ko>!5S~{!JMlJ-)l0X|*Zpt2(tAb2$nYEbjVos6 z#!A9x!Vid7DjRFu738!B;^FR=DeTSa3lwwfh4aU0rzRq!O*3a&ciMdyMKG&lCy!g{ zpTO=Ii8n^0S42lhei%mK+iQGN%|Jtqe#)6>po_L0BNaBBjfwFw*2%wv0CE%c+piAO zwy&eH>yzABB=fG?z_613#r8Y&CBeLCuCJcLaumZpeFnYc+>xz^g6k1}(f}ehYOmdy zWnIc)$qL-~uLBY%uq?f>IGPELi-y;*D4imVfObA`UHXn$ml9!U0@a*E6&K?ibu%ZB zf@OAitF=5xElB0Y2fYSChfHZ{WSB&c(q<3;SWL`67GumHNDDa@b148IIhWNWOnkM- zDsL}Cm-+2KX7egJ``aT{`qQ+NgWZki9t+9E7gJ@OZI;sw@BEK~^43?5RsK&>{wZ4> z@M=MPNfEb(xt5%7;zpX8Ta0q{C9QIN7XpHH4HJ0jjGOtSA8^Oi%R+154cZ*{I9Q{0 z!7cjGgo>RVB~Di{x{=Yroc0oLI@~fpty^>q0+dHli8#qgT%O-!U|Pgk9K$y@g3vYl zIq7LTy&pxF`=in2-t@J5eT)-!FjgEuF{A!TG(FjR*Uq4$<-ljG|G=j<5GGX93JS^0 zWba@l!>LQwtJ+v-BH-m9|C6(i1<9-N3>9pR=`mMh*Y@og26 zCAy2O=R|v1x0v}B!+^GqiXIcigb+uUv6@D}s=Z#2+K0P8K@c4}ocCXbMHMcmCeb7c zh&LZ3;^3wCB}h|#Ul+Nj5$)5GBjx~z*ZT_fgAYM?;y4E%RL|MY%B~zU%*8D8ZB;jJ z(ZzamK*CpXnZ2>)!nRLY_J+vk>`*!{#|1{l@x3#B$GQvisz154=4EGFan0`1^E4O` z`JTY zAAZojoyo`m?}u;Z;BXn!u0QgA1!2jT$3a#sUxKZy5sI|8^ikOQCI*86*y>Q!@9}w` z8hb2keUxtGO6>gnu}b`y5@t*+T#Rkndkl`?fAxj?^;iA&-mZ22q;Ao2^frnnTuo7| zrCJ0MnV5FRt`hxowC|1`)9%>*h+=bdR|jPbIcJ9*IkNk`{vKR;L=VhK`qy?carymE z*+0}ekvM7hhd#W3ZQk_~!L7h6B#2w~3j9Hq?a^B+hfiCyC+^Od{oqtc?{{t@oH4FH z3t%C{J=~PrJrmDvlma7vxnsI(+kpLTf4>Z$(wm77G|Jrn@o^n@5G|k}*k^^=T=(OQ zsOJb3w``a0O7CflUUR2Ma4qTKMjjLxv?{LRqJo}}4C14GDM1H`WZf!)x*fi_^%D%qFk+;0UHUo}lG`18`WI8;-c;WwI7&jL2 zq;J;%%*Win9Y6_%{!s-^DvLh8e_~~E3UldvBCB^yiVJ{b>Z3&k{yP1xIwP-)yTMP7 zrjTAx;hvCd{D`~e272#ci=16uer5ceQ}nk)<`XT($wgPhqlfkeAlZf}M<%qA@f*>} z<^8hW=^D>o5sZ>RSFvfpL-N!nXNOo+B>WY-WWAh=k4>|dKSjaJ_1(mHXbDym8-?>! zW#*_^X8zumB<5!}DcZbB=P=m|DNJ6mvumWu9w|{fmtStOOR#=awY^;;6%(UTpyY5N zX5Q*3!RGDNL9)A8DYWAK++CvDtRJ+Z(xh8c=Z1S1jAi$*2Oaa=pjhT3<1jq#pnN2~ zKlO|ehwF9W#?G8Rq>q2HM<8&ByW?#x<+H0Wy$q&LoC(wcvbsKw{pJ#VF#`3*kJ#thLkq%3Efxjp`cc**oibKW#m z%R(J{`FKCx4`!X|oXhw!*p_s!9xc(Fr@Sasa7ATJD>uT7W)ftXKGlKjTe~-?)0*{wER**oQ|yw0&@SFYy%= z-0F>|RCddc4;gyPq2!147o1X_`Mq`rKt6nYS&!`Crb_Tg;B-w*D+Z<8<*ukm0X=AP zGeq&Oab(($|C&1$id`?aElRjJZd)u25_b&$HCvRn%nx+Sh=W%lC8EZqo)=M6;PSEw zHbCSvD_sK3Bv^rnKh&L|fQ`&GoI`&>PEqI1KAhO3e5;lI3psJO#NLk!uX-C*QCA8E zlUoZ4dbWphwgIY$ENmO(Kx1_7Zmx2{|Q9Rr}pP(`g=Wr?ujU?|PaL@0t7UQEzrxdns{OCDj*~h?Ls){q#Wh>z-oMTr*`NIU5Q=hZ z9pg_b?ym5qCIl&AjNwzFDyIwZS(|hdnI$G3+aC_tEwLi+O_Oa8FD zS-t;|8P7jlU!i>Y6!&QicfL`1P+z#F$Lma~41SQmkI+F!t2oOZ>5()*qLt_TNelgb z7fp;`@m(=@5h1*C*@*`^<3vVq@`{zs-i zaG3u|fAD`XuELq`Y7d~$x_Dc6aY5@1E9{GFAlPRMjth=x+MHye`imr6P`Ac0Wj`%= zB8e@zgoO3bIj>71b)v=>?h=QmH#pJc(}8gNqCM8CWVH^Q@e8-8LDaQdS#UJKLb7ZC zdsxUMy_58J{ruNSFYwblNdM7KZzKH^Km97{KltfaNdMSRzeM^!{q$DSzwpz~lm0J1 zy@m7-{q$zitNipv()al34MmMp5^kC3Wtho>1e{x26j>Vy1RB)bVqP4Xxwu%CFTdyz zR)biC9!C^-d>P*cHu|)RMbPebn0jVZZ?N@BZney6EVOa)dizoNT+^>EurU^B&A+{O zGBG5{j#h7uh1wV2t&>|~0sTY(8(uu`KP}ZyTg{Wz@*V2eIWOgMX6JHV$>mJR<-D59 z8JEl1mdiOKm$M_6Ga{GsdM>9pm$NgMBi9Y<*0Z^sSIHr5vwPMe`(mk&aJqu)bHZ%@ z$Ub!qzcQQ+HS3e8Y_~RmfqNRj#k~!Lz9gc3wE7)MZI;yEB(+6S`z7_fq`D=wRZ_i@ zdP!36OX?L#9hTIq4JueIiEWZqEU6um3QFpANeznTZDXh^|<&S-e>e+az$UhHKw}kP#5CF zT6J!%wQ4N`4bP~)ebJ~e!?2oDG&x2FMA=7h(FxW{>W@-5%0W^c+esfp4tWGa=p_F8 z_RiOo*O^sqYAbN$j2?DW5ql&4E!x5Xm4AlB<`*}J9Hh2OK%a!?9lr2DDrTP0+hB<^FL&YBeE zRL`B3a~eaZ#N(s7Ii!0J{=GcoSRCag!M(JYt;>w~5r;CRyE~*-!rh5G<^SRBUErgt zuKw={1PBm3@qz{~b*!-sUTRXIk_t5g3Czeu(~3$fR%{e$y-}HwPz6F~A~}wuv|ii# zsBLYf^;%0oP%+^aplSiDMST>-3uhb=ym3>>`~B^GW+p*>-sk^*-uKN%nSJ)zXJ6J@ zd#$zCUVH5f+${Rc&~+$eH@!nnNZxuy8`GuVs;l|HN!&zMw-R$q3G{hN3>#Wkv(rgT zFePHKXNG>LI?nM+^e&Y6cFz*W`X!1BCCYl1IM6TAr%>X3h|O7?Z$;5?Lg{El-$IFJ zdX{+BFVU}1;;%hRm{1wiQBo+;*0Y4`*U`UFVoJ{vikGW?3@DVS>sg}SFEOxCLjLpJ z#&WD*qO?##Ot)JJ%`~+#s8B*XyxmG{=20aMD3o}zXNjjwiCBe02_Lue+cLNfC03RV z#XaKT^R+v&D%q&cZMFHOcj~iO$j!f zp2@@@O&trRfzZ;)(}^qDv6{ z%)7hk%QCFr{(Xqt$&L@qYRUfR=zIsNfJ*4zp6dsKK)sMa?&1q_d$S?t=SpOUgyO`$ zV(0pk{agukLmG*FeVpqL^m8Tl``EI5o$EhR>(nd7V5_Z{#q|q*u2hG$Hn+sNezBh` z<>CRG+uylfr{YwD)DM|_=)-_(<|ya&Kzs&I1F!k1p0)(y7x7ej&DnZ-D-a*g)1Yfc z>FJ$7d^k^>q}O>8mheA&&GDY@Jp{I24 zAp2jTr;rAL>}?^PRSjg*p=COWkog&sIJ8VvXD&2JwU(Jc(x)8V$du_Y>V0j1Jdr}B zd4xVQ3rs2yTBgpJXwIQ!>R(2&%|px7rA$AQR4>gn?4f1qV1~%n6i^>C@0g^zmr;<{ zkhw)CvtG%kL_3*RO$~xaW~nKlA!HsQY4oH_!t9LGAL3sug<|s|k)6d?_Ijd>!a7Mm zq#f@C&i)n+AyCg-#Oj&*MnbPT`Z1;3KBoHlp)`@woW+;_xo^#yS^ev3ICip!wlHZp z=`!#ZZCaJO*<6Y2EWSfG9iN#lotM2XKRGJ*ZoCEvko_C=gcu!lMIH71U*>E3Nv<35 zRVG~F8w^VWy{!X?(1i|X(OTftJJHcsn?`jtTbvs=X)?L*5)a1MJqqg=oy%FHmqfTS zu>`_70EOI_qc{PxCD&qlHx#$24RmV0I_2Cn5Ny}G|KXemAh@s$K-IZ>rVPAUBWp-c z10FLfr?}>EOj~Jh3#xHn2C9;tpxQfHpvsNWj@Vf|Z=ZqCCMFj?D^7YC$VN4|=QFYi ziCsx-7ht>D#}|P*D#2N<5^z;r=)m{s+j+v(9Tr!I(1Ce5Ty=z=|C9~{)PZ|676M@6 zCE|DErmcXgJ{|fTtXBey_IkIoLDAMMnbh^)9d*xQ*z@$|Xmg|GI1C|YF>GA_ctxu> ztJS);(xP0WLpu`Q0iox2gG|@-gQiUdPU~?@8*5J$CP8oLaZMahy5t6aopdDyx(Ng9 zW4i}9H%ndvoOucnZmAt)viJaj&P~7dAs67Kh5_`-EabW)@E3Ggj(Pdsoz_LCjmLMl6bQMHyeKt=tL%cLiDy*tL zZgVYTfOT#jB6fwZ9w=Um@|)=B73$xSpM19d7E`~#-1p1C{6~v}dy4;m1GDWPep1d& zeKn&KnF0TAgSr0~!8{YCg7p9=F{acFG~BVM04eiq_H=XlO;6?vb~1{-QQ$|w^A1sF zxBB3Ic?tqcrp|f}RNbr_4-y`cpt*dCm>PBc+kF(->63X4=h1{W(0||W3-6clUhN4* zJ=@EpI@eg{Pf&#HxH&^hYM$;`?l~Iy36ErcV$G8`dLVO)=IGHa{EL`5@}@d>1q3y| zR~_MP{^_KDPEok)5fU|#^ksx>d<|C>af`5f73@ob!nFUt6g71UoB5KNenapnW%XtV$roT?&E+$|!bx#?c2l(OCJ-TOtRqr@w@sZ=lI*UpN8js@!1W-7A(sSR$9i{0d zV)df`9u-JGARRrLu6US!UygJA&}|{2{iNqnDI+_vBAU7ssmb9KGYp2%pmkPm91;nP z<(L91xrj-9sV4RPmX%b%O71t(+3l!DTn&9A^t|N3ar?;wA_At5s%9fQb>ss?UYQe3 zANR*^3<}hrQ2Jn=n3kJVFC3-H!?DuNG?U8xt~hsC7wJWqIb6dx_b8| z1JX0nC*Dx+u5=b(0LcD3RP&6JmOmY|cZumm9#~(Vp1<-*&Iw-J%}u^?PV2 z$99k2wBqbNI(1}9-sIBT!0m?>g92kun3SfM9U*j-nzg{}6({{8p%`$~=gAQ~Mu1BW zje-wo>~CQv+4cpA+P}`986rtI=%<$az~sPgg5hP`J?EE~(IbDJIE%0Eg=Vo-^9TQH zU)c7!`o9k0f25N#;RD_;?t0+_7e@o9YnbkDI`y-4-wHA$P zzxSIYBo<#0c>e98mqPvD-S6!p$>RB-6mTv&jsV9UnSP~93iD>pJLq8gn&5OR*$Bh(vocswNW?Bd*9w}$I1fwyPuox@q6&^Y-s42_=%Q?r&>$$qUdL#Bqlq)qf z=OLndg_~A~n_kqSH+whZUg>_MmG7E5oGur-6ERb@Z`e(^_efJ`Drwp#N5Dhu!WjpHdSKT>TUDY`_<3>WDV2 zb8j@YrHc=unmOb6XO;|f;iesRsaqFokm06vsT*%rD$?{aM0@1j(WW=B;|=@s6r94Z zeh{Z-Eo(f^i z$@6_d4hShjxzVN-;iknJYPu1ffIYs_MIzL@460mHW<0mVgzuCY^l^8g!H=`JXiD#1 zvJW516t~puELwP~Xijd)fZ+Y6vfS=O%e0 zC=~TVq;18amW~Y=Bkrr&k%rE{0*)VFJ;h0`XD(SVn%>p14!Su*UbJa>sHS7~%Ksx! z{?*?13n&c~f#=85@8UcR2L=~LnpTZ{qK(z>Y29RPWTX+t5e&&bk~>#3bO4 zsm2nnd4y{Qqp7JSsi|eDTH=VzyBCD(kK}?v^3g)_aX&d_v>Q9HSLz<|*7WqEx%+gt znsf6F%xoMgO(=m9(xUHZ)9SG)%QYIBUW#oAwyscqkCcQsGG|{N1bA7pVcpf zZwb!!oN52Q&)Ao{r{k)l;_&M*^hnsei(H?HfrYC+zFc2Od4>!FcQ~v^I@xmGECHny4FVstFGo>;zeD$c27go8hv?IzF+P3#qKY>xZl3m^@SHV*%v$adl8>W{h#cg zc`=zE@1J=VnIG++`CT$U+&}X;GC$Zqvy99g-81opM^5yD{OrI&*lR!xRAS)Ii^PML zUWDkIWmY6kGdOmV?=zUF`^qxW0)%&?DF*-N%x>%q>V;0vY_hVFGj-Q_XQqqiLShr; z+MTUg6+4RG%80wUVd&-t?zwOtc{N&ekEjlp?OKSK)8nmcv_H}|NP(P`Oo?1*UYmfzb*f|dH!qud5d{|F#r6P zd44$m{Em4R$FSdf=J~Pw^SkDGVgC6&^Smhk{Jwb>o3Y>TFwaZ#&mWrSC-cuA7p*U9 z$D+NmOQYlHUlcTlo7ifLy1R(pd3~{tI2eD^rsZs=)NM-toPC2>-KOfDmJhpYHe`r( z(SHZXN)HRfw{KwQ_f+|&L~A9DZfslh#T#-_x2(-Fv3rnn^8hB1+kx4~T7A;t-u{Bg8Z9`$ z=iK}-^|Y>?eK0;TWxe`Ew6U*_({wW@N;Kr@_ZdK~k_Ch1LE zan1e>IE$W8ZMAJ9i&6#{OSJSI+QC9T{LvKm76HXg2}+s2Fk5m6D2ojzGTm$p7c!8Z z=fmf$N@uY#P0+b19gpbSl7z8e;P7Piwy!Mzg_^9Tnwomhz9oGsv-88Q^NkX#3kYwz zkIpL`*m;$ly86K153q~W(Z+)7?+LV(Vo^Siu4C;=>;9Y>*j$W3xwdWCf!3aEA+h24 z-RU!cgqd474?Na9-7~)Nf?= zeP2?^SA)l*L=(^0T+-oPTzr@BS?d&N{&Sw816w)K(&ctDwrm4=&^qoE{JHI5^R&-9Cf;9aUrCRfVw)w-u|;CI%a zoyDnj@L`74Y= zqsF(ESnPIuxAd*qJ*$K$=SlgOpsQc^nEYaXWFFRPd>vmgK2Emf$G6cRA6PU(1T2o= z)YX*46MF#&`gsDp^R(PPU1^_o+NbO6(`x&4seSs;KK;Nxt+P)j+o$*K(|G%&upzWC z**?8%pFUy-nD#c>r%L>b9rlY?cTf3i9FtnNg*#1W83MxY7KvSQ za)P)sk(a;;?JVfeY2C+wbE=c&-|X+rIRferK-5K<-)Qf|@O6ChGk?}oB2jE!%{CTA z!i#k;uamO5@@q5a>M2)VUIK|H*3fKm%7_~$xt7)yULe^{Lfrl4>zQNedXzzSTzm<~ z#)}nCzL;}6IfpO9NL}iWnt7J3I5!0uZ(aJ=ieih>EzO>gJc!Hwosx)C+$SWgq8L@8 z$Vo}V|3OgJb(55JE_d;CJl_>chd=Rap#!!{&Q0s-FwJql)Bl&vmFAlJCCw$?XGdzM zyW{`)@KR4m+*|3l=lOlpp9chcDnd3dkM)WG+$&;t;5&c z=pz018C}GF9hGT}BNqr*w2<-0-s#9*-L-fvvNxxN9AI0ob6>&)J=8S+5!R(1J(ztm z)DUtOjqEjNp0oJLe7nzYg&O+rqj-)aOtVC)z&B)u{LJ|L|tT09=(&6Qs$3cay?XwU6f^Wq*A#KYI-Q%Ihdy z-^6eg+n;qOX)59m0@k1xd)QPv)-wdaJ(5IT?UF$QC@`T}gPJ7o!b{_3q zUKDetBrMBd#=b%eMswfrZg^A+V~)QX#!fDWbY8UHvYV_&i{c~Tm?abq#J|M}yu%Cn zyVd$zpd)*?lB%Adg0Z)a8t;ZCX1>8vDLsqRxnofGy4<~*HPXY4uBbVsDdek;Xxd+Z zS6+Wj-BKX54bOKOHOtIHi@waaK|uN(RPE{9=DAT*NLz-~Ja)e~M<=k9FkI)rX zYQxtQ@TZ#Vw{y};|ZSTybNRVa5&Fj5o#B#*zYZ*Zv1KHP%>s{{ckm0i9} zGA;Xr@v+J-G)`67hm1p2_Rq!#D|^o}2qBQY)A&Hsd+$+LdgX3=*O2@oS)Qp8sJD4+0 zq}&Sw1`!XXxJvIdWpTDBp*C!xHFhKU)^=wRVOQsK=iA)X+5^k3HFC(^$R~GbvKM9l zseJ+3JZO*>lS%S8efXC^FU|<&&*Pev15@v<+N!|N-7>!yFJIB^ysW#+d1P;9_4Lnu zxfLc3LHNfyt7Yp8Cq{*TU&Zw3YtD$!-l!U$GyjHJ7=09X$IHSv{=0pSAs;QC!%Ka> zW|J%j`y64D9AWBHZj(WhgKd(7OnnZr$tseLO>&&6PpM7TlI%~?9!aTVil;{{xtI2h zzc73`^E<2=-NwU-uX1nP3?0R7kD;xsEce%C7$Zu&@BKv4!btfqYT+gC*#NT}Vh2`l zJ7k)Avo9;!_Wu33<7Z#d zpNDhb73x#}=Ux64Y_Mfo$oP+sx9?XkGTzOGm`XWGK)*+t%}pW7P1jjmMI zN!uS>`FYps;&LFQlgB`@MfBx;I+>DW>F_S}iT&d9vvthQ+jyy7?BM$02Lm1#jaO)aQ0&*L?w=ocZa2tX<)n)iVwS zS-UtbJU(tm!bv}HKi?Zq{a?V>chsopAp4R*S7E*|pJWCIyBuZdbCpR!(djq@16g^AU$jBo%>Rb^Fsq zi|F!(1bYXJ*QUVSt*n{>ti?{av>>iXuu(vzu(!5l)RyrQ-;Q(OIrSOuu(q>zGkj;!#;i?;C;cQ@r# z2l0_7H1D#n&JUeyyXo$uhn>Wb({lV1)6LKX+)$ppt4cBI?Xdlh6L-h7wIcS@?md6s zI}0lmJzu4sZ;z%gYxHJ;c+%?mV=#`@V+uY05smRG)HQ*7;01^=BVt2Zx5Wt({I&C4 z&)jYh`f+X^JZ1X3mGfcNV(>X9PBGNyx106U030cIpWl92V*~>39e2i3Xz5#fuD_tjTFinTzSucvNcmRTj-s) zOsT}m$^!Dt$$jx<6}*Sn+07P}tE~Q(^M4?Ei5WXU;+Eide0yhQfquPj!*4LMv>lJI zBO;$SnrGF@@mlY8aT38#ys1+%n=UWcnL7#mfVcW8GxSwXTQOfV*>3x7cYx+TNe_;f zc86yd`->Vfr@dFG%5G%8&pXH>i8>$UodN0WMsFna?nCtF=c`kFj;E;x0d{P2paGEP zX2JlPf}XkvCZ{&Wj)?sPYP!?_GU}eBVT-5O0zEAygoy`|dG0yAp{ z3NxLdt`~{3Qp;)KaH6>ujn*&+pC1bwxrqcW3|ShvZ1DA(!5oV&0>Ov}R$G#~kl#31g3aAH<%AXX1!T)M;-dJjd>R%?!G3$+{_ zzg3Ebk5BZ!(2sX*G83$p`K9@HfR9E4nMOnC zdR_G7oj?R~>813;yKssCb8VUT=V_+OuG>wOBUB~9Q|wRJ{McHcvGXrbMMh14s^*91 zzPE{XlI`-Fg0oJjKvCpqy^i44>IiN)cB(U!E3ciQ+-B+wy7?9LxciOFi+sR9kHiq*DmYYwJ*gCxh?M=X@Z(1kxL8H8@^y@(#-uF@Az z!tue!i2Wuy_#lb^M-zjwC46>wKl9l=dhAR>B9&A}cLK}JXLvVX zc!N0|l)YKynGHe3`C@EDOhEKS-96YDyxw)a0$f#=Du#jA(>%~5L1-GnLY)o#eEQV+ z>YPsVF|eBZo(DX*>8zqL?2d%#M1e&5@`~URt@nig5@t~yxHwW!G{E~P`~b@qJysf6 zlJLnDS(eMGRf0E-Fc$rqMZfoKBibSHCs%7w_g*~^Xg6P6{YthpH{LMUmIW z)yoLrH>A*2Q&%+W8SWYAWwQ{}>PfoK!e5J(%$m6LH|BZxXT^g861DVbqO-XE@+kQv-UJ=;@J{+W3> zt@c%`yqeh6SerdxazZFkHJY^(l`x0v@b84+%T<)=|C;w)JH2sNQ%!tfBvs#>7ymxPisyFo|&lO#bld$;@vGyuFrXSuiQih+Ub zZwpOF(rL{Z_25L#FxW`sZHlL@rkDc@4V);}W{R;AVlIYL&|j*`+k>sj|KtJxlk)Is z7R=mBtE}{>yLuT8d=zCFVCHA}x)aT1Q00*ZTccLnQoDBBQV)q=YcK`!oy&&}sXwiu zA7<<2=cam#lyLgS3Ym@!XEXx>*g;CdUq_wVTS}kd+r(^9DOfFpePczrd4Q@l*eaAa zY^Kar)(zP?^PQW{K>Zei$|Lx%l!l8ef6+s+9wcGC@7&i965i$AefdCBw#=&_M_-kA zH;|_VIbFeYs$h|)r8O6w#As@cavHy~p|=@OcrF}W{Wc@3$hGUwQgMAMEc;uDN%?FA zhReqHLc;*z(_QNmyCK}MfHRVMvf^GU!+PK(PhyOblx05=?pIO1Vzxg-B9i*Y>v~Qf z(!xA{kwp`C2a{3#3i8fbbWR}gZm?zV*JiNix-rsp$Q{w5yluWdb#xbA6YA!Ce(q z`YK&_l!5d-vwqcaiGJpFvZ9jLoH`W~ovOQ;rbXOm8?=9jw?mSkD8NjY-4}Zz#Sz&G zD@T#RL3GWa_tANhw($`We9R&>uQ^Gbg^t#I{oRVTm0afL*q>D`hli(`6*m`f_ z#duz1zC*RS@h1)BtG8h*%iIQoP-TfHO(u+_l#*eF)+p*V>vRiCR{Y^qF^e~FZTQx- zpf~vm5L9!Q`E1?Nz;vCPG@~x&u?W1vlZ3&ymGuCks{!Y4{YYp)j<3`)-Dw+|1 z)JR+2v1m#_w$*AjwvJ4T$W`SKhblL8x%W@XWnTn;2Yqhvr#RgLN!sU$ppgqub~^6& zVZGTwJ@Qpmqc?NH=UtgocuO~&-a{wJ}EOGS8;Z>#zC?WkaZSq5EH#6wb9XzfpNmP%T`4$q z6YRh{lq#-ZG32zKO^L+rV&PL9DM}cNTH6CgQ^g(aeA>YDL}OoPt~o*F-=ziQ2(SF< zevlR;)MAEfM<1kUVmIr5+jXb)bjZvW{T%xtM{FuM1EHd=Z_`w+oU$6DV6jD+JTUkP z+(`l$CWqZ4QPQ`2>5r{$(CM_jD`8F(>rLq!EABPFe%Ld3P*978LG?cHowlW#AnCgd zAtC~`w`DhTjrbEYPTQ#_%(XBC1{)&PjeoN#P->qp|YsZQDUk z7@ybjKncW~wa1Ieh8}1soSs$5>kmop~Cg=4m$9^eD-o%(iv)W}XdP>oQ_=aMAOLD04-JJFQ&?tZ_2 zAoG3l7__xt2_nh+{8F|?Z_W1p&`Z2d^<~<4CpvukRq-O9WHN*DU!+IP+hZ7!qE6EZ z6F{yYpKV9eql!(T9#h5(_+PZcIlNn#8)_%VKWy|^V{*p6F!w#HC$;B{cTD_gfW}Pf zs$8NrmuSo-zLYt%=`DX^8uM*Z`nu#mAT~Ubf)DZ(N!7A!fxnOd%9iX&gCV=zBOO#) zRfvVv3U#GR?Oa>!wCO%CSwOb zLPhhFy5MORLNdlyV z?ixBO%O%QliJ%hfD2X!ShzBego#XuSNLyH;OW_$to)DS(q%Aik07;_?3QKnfxi;Zc;YArdxWwpZ0rV=F8aBq4;J))TK?s^SIF!aI<4(A6i!>a zjM-$7_fPM|{lxPOE564R5aMSUo0K?q+YNr^G;eAlGpPdj`T0kfe4|*HS>f{qO$<#DGi|D*1GQ-6WV2`L zn}l5SMyx2%U=>QRjY&btPMG=asEQQ!B^`C(SJy zgqg6l`Ng?)0V^oGZD;xmKasKT{*i{CT>V%$W!I1)cXJ){vrg885#H|q)^zJ?J}nQK zYKyLsjM@3+ApSMzGQJp2G9XC6l|BGCV8WkwWVC$07~sPaymL_^?NpBXsYY+KNm(p= z@kKBrIx`;-cvE>mOOoa!63=T+PU}r-YVJx+lOAeQZJu7L31<1e_u@iBEScvJTYi6h zdb01&{fB-3aN&I(68IMi2p_!yOZkpCOnT76ADUUcgdaPn#}@f>I&&T+IP787BhWC} zHzS=1}GBKFFe~!jqrLg~R<#{0#{6yl_2hD05Thbg@ z0rxhz9XLU+mfhmE<%u_Nr-u`m_;9~G0Q@S9bn;n%QvJ$;lKI5gZ(6~kuCp##D|V{e zRPE}5iU5`OPr5}Ths{`Fq{3kZEEP10Cu#ZC91f+=EkXv~+EMee zbJub$){`6JHzN>w-UQ8Hh`r6~3%F6UI9}lIMVTXb^yw4QsDdk;=&d`%sJbU+@6&u| zysd2%hQ>^cMZX>ei67lrS8OVB|LI>l$9kAn;-^*b^veobiz(V!H>?)O1Sq+HN92%t z_+|0xbDcA;V@uS{C-haJq{ z=p*#IO;m!XK%eWXbcUbZQ#c}71yQG*smhV@q*nh-&I>m01#vK@^u4@iLwyNmU5Uch zSEBC1iWVMZ>kev)33&Q5akzV;;CX|B#xFGPBEDkG&xZ(`w-})oR62v`#N?8EgVM+271)|$@~9{ znh)`7R**(p^VQU>D%fg$$Ghb15~i=y_8z1PgI_&V?+n`*bUW2|!%+@Boq5QI-O>s} z_>$t~-d|6#NIMp!Ic>kA!ky>monYsmaJ<)0ES;0ID%38w|yCdUv1ZvuUR-!7BjuS*1`R{e#&d zOaibq+r9!|-Lykt3tRVs+fD1 z*_n&F4;tk%uNX=_N;e0+58kve|2+c@^KosMl56;~WyH6L(_mWELLohPF)IQi;&yq@ zR29^|zf#tOWsjx?Xj)ywcuN^?Zm8X`)_rEd1X}n~e}?GxRQtnhp7ezwo^)=0h#|Tu zOtM}+)%1;}zjsndE*87I5I$vkPCgMB5YOjijfx;}T3Z-CkASJ>ynSWxM&r|J=a zBR6^312lRbI*Y{uVZ<_+Ur;{dRe^Za1gw3x!be-0i?H)&MV`zHfHM53Qw9aR|1vu# zof*-ssn<} zz2*hD1GWP71_jz5 z09yOrtupU@to>+^HSoBHlbac909zaI-fS@TiHzJFy%%|~ zJwi?VJm_tau=PQ8}!ijA-l&gf! zV@vaxC~lk@2D{(oy*ya%OR*OtsdHK1vI81PU&D(%-mlKq1dBgqR-@c9aN4=Gk<^(Z zv{O>d)mIqL%v#lDgN9zi9wFRsC_T+E#*J8j?NblVIH{s}#>;9a=mpOj2 zzq>lAw9u}<_(5M(qom}@9V2=`P)k2|N?1Za)3EUq1>MN~904_YcN_CNln`~=bbW5%h!K+6>fOXOi%CeeKc7SxWhKi8IjCUwKy}1v zq``f^!F`+Ene1V<9q=&Wq0dB;iqi!MgAzKr9PGDm&}TK{o5IfRMx7DOq+Df4zU z8p>oT4E>8T&w(-!Q}9B6eWe}Z?o+UJh2#x; zjBSinSfIDumrH2=TIZKn@(u{ALPk7+E#P$Nj_iSKMKXVvSIPq*c^X&K8Iatx86n=nh+sn-r|j!Q<(srFX#_= z2C{ipTG8NkMBFvpytC1Bkqj(1b#SHDw}0YH*x;_REZUmhwvv+BkohGK8#I>~$`dc)E*v)bmON*L} z5XC84b8W42{W_l5%N!vJt2#3^Y&Tbpmw9i!VD@-6>A}2_Pvdq@ylXto)no^`!WaL$ zcSBwOR$lBOZ}J!*sqtx^g%cxa_8wBcK1=P@uXxXJ+Dp4)69cj1t$k7(1yXbsmQh1$ z?5XKas+gGL=Zz6NElRv=B+op!=mP5R$(htRQuf99<~T;dT!n!O z!;rU#^&r+AL~EZTE`y)87*q|upW2p*7R^D895Y?zB(EpWuFx^=r6-1kw5vH-Zo)9!k4k*L1O9$eqtXCaBP}tb?|C24yU7xkUOm#XAcg$r_fHB zxz6eQd^?Hel0f{eaO!l%e)P|n_ednH4*A`WAU(!2vDOf2_KDQE@|v;bSC`K~l8cMX z#`3>9^Bry^_xl6n(981c3)8=D&zz6>CMEDMUiK)zNM-j0&^PO~(tyE=fizD2C*AVX zs=(Q~Gd(L}bg#LrdZ+i9G5cE7-mL~lYMMBVAw&M&KtxJOpxh$=Tu z3#ZI{G~ycCVzUNm81Syh_F}}FapATF*2sQkgUh?07=?j@O|s;*zNcO%=1gW%EGCI> z{|8fbuCIEVnIDnVd78e|9z$3R*?tS3Hl}tu zSE`)Nv>mzJ;0#P1W-v7e5i|#+{99%B$AoqzqCu8@U9mC)Tn5;W1EL(!)_rw8z591(!c#Ql zt-l>yx|1z(9UrH{HLG@fd3G@ ztj!((ygBgdu3`MO)9XQzfp*W%%z4!|{UWXurC$ndRG-r9;vC;i&#Cn0)eYnz8p;49 z(P{S!jm6#^v;f{<*M~Rg340SME_(GgU)xXnnz4|ExaCB#hm>XkeskIWcK&dP9B;Rx z)nwMJi+>;{Q!8kJ%p6IFF6??;70ew0p8f$`rcSBi+6Vi+@4qiLCx>XAZme@xAZ)|H zP|BP*o2Iz@K`=`AR?8k@SR7Bw4dbEStcQz{Yk3cy5mW)?r2Ev+ZU|Qd>BcQ8#$SHP zg$nB=Ut^NNs`-F&m{qmDAk~`-ym%8ea?jciFRqxTvwE+7ESnLoS#1>*K(h-P-Av-R z)_ZiUtY3O*eeRU^Or@ZR(q$H7JH3%Zb7kJtNR2uc{w8IV!nfGVVo8?Qxm@PAdMDi` zCafx@40Es87Bxl`C??9*fAXV(@n@a5o0%5XHJ%# z3?h8yJI8qQIBoLbj-+S%4EQ(Pi@qb2=v$=0Om1+m91(JVTq{eVw!OT)EKZQ*liBpq zJ}whBHXxMh7jmz^Q7uE@I$-7`&3!RoaYW>_RWvkQa0D7f1$;~#lM7tstU%rXC- zTDV>a$Pl5(U2gXRzspXz6&4HOFVXZxAklg~8OSki??1;0P0dZrw*~a`xWEo#BL`~n zK4}!u?LI;D0cUFt8T?7zZ>O9k$-__T&2H$f4)18DV9@*L37AY8QFiS7uHKmW$Uazk zFH{zpS~4e)KR@v)(@g3~;?v&TQDzeCbm%&^aN3e$B)x3DT9e{)R73B8;9@j?qtD$L zDO!~|FW;WEW0!apn3+t$8%<5aKYo$DQ78k*c$IGrF7Yh*9e)Ldt)=F@@U~9IrBVnW@0xM z#X>@RL#%KW3RLFo15&>fvDNf-lE;#@GhxWb*pT9va8tHC9E`*5qk*f>(H88q#9o+` zqt98U202|Njqdavn)=PBXjDP(Z|u2-(@zMNOAp~64eKOLaJ>b0rQTIYQs}!>`WsRt z+>Pe8>4SuJ4bf2QNK1p)(r#){EuvL*dXGM1np-IrSf2T-5D7K^MX!Qt zu*`c*Tuu||4pp5JZ_x&(?V!}$syuUHmlfi6lnsG7?zs>ZtO7Fo)??9$Y*!y)w4tv@k&*`hqvctmZ zvx*+?BP-L!*kN-1?I`Mar%#b$P%is^7ncZUKU$&abS;dF^`t49KeVhcXF9YzHQWiZ zgar9VFxtj2w}v>&4x-X>`t_ytGJZ}w)lV+iGA=e4x3&!7q1G5Cl&VsyEb|m?Xr5pV zW8K^3J$Qml4fbeBL+{z;q12f{_g@{``z5v(?d&M7br$`{Nsgn|#JXPC?ss-DJn23)t8$DCkZ_q7hO4ZzwKzt z&myVsd7FNqTGS>7N{!c7LBEv0VKDQL{QUQxINm@5NC+YYXtaJv8TAS@?ekiDRQVr6 zfGwgIEjmO&xdqde_o749bgVV|nw@`;(E<*qy&wNImv(y(e_wCyv0MAG_kdA=fJG_U z*?VlWUTdyk_D&u5EWp!W59c5NRZPi4;A?__)A}30B(e2-(-rP&)pPHr^3-KPH)A1D zyK|LbVc+opMB+hfJqV@h4V~+*6XK|1) ztrt;NP@LMmV&9+1Yci^qg=0r%IzfUlnmWK&K&En!8SpZC`e>`E0xQn3OO`ca+vMrpdE|u`2Cz#*VLVeJl2@5N82d z*Moq0z58)6sofn@X;!2;WQosGGVER!jBo7pk8Xp@9OGc71jvT#NtAZauBGG4GYVc} zHMPGoINv@3?!5DkrE8sI%K4B5%b1{kWf4IRYyIjUeg@3iQpyF038#j%Tw4@~AK)zN zop}Azk;gm92u-INg6^7-yQahI8=CuiZC^P3>#XqWgIu5EwEm)4;(~hlDBZZLWiMA7 zzC>#ynH?MSdn{L}^DCqH3wj=4J=aGLa+2R=jWF_jC#mcFMjjJCGPJ8bfX3w{KP4lS zSc8>pg=vYp_5J%~6C69j{j15rv`YkQj1ChlUWq#DEL-2QhxXUfPGT<|Xjg+LJIVRf zn%K*Ddf~Jx%r3%d%cm`S`#Z_AcoKYN{fp`@bts-=I3nZv5{#SF<}8Z#X1B7o ztA(hAX8goC$a1@pJGc9{2nWazsWfd`R;_rlOK6H`^DqY<-5FX0;u(*O& z5hSP^`l#37@3(9zBpQOj%&pp6F!P0W$SF4WM_)^Bv}OfY3y=^2L6MoCDh+Kg6wUq; zLq*-{X08svYR6tghKNdeeG{@gB1eNFOKe0fwhBwC-RTng>B`(-J~k6pOBI91b4q&R zsC5!=gOtI8*F7hg8O@uPxA7_YiFQTOqk`*71IBv|ynOU$r*%Bp%w=G+ zqOZ6H(f(`;Vq??I@Psu6-P}JCjEx+5a;z?~=lIysi9M&s4o~bk zf6DyW!POfJvp>Ev^H_C%#xG+Syqns%X#)(vqPJYK~%%J`_vHa(jvBEn50pN%VQ;pp9Il|N0)GTwKq1^ z`JomrG&GF3UOceYP_f~+2d78x8VS4GOIC~6owk1(T6c1}0RDaOH7sYd55|JkIksHF zJd#qVhq1vrXIXD*J;_OK;sa90z*=nzX8jhh5AAH<9J`(iUQGR3GEiz1T$2>Fn*~Zv z-oRGasp;6#Csee)u82kd*z$U3SwA`(J2GS?!Zio;c`!CemBjz$(_^&e(*_q89-T{) z7K^=3Q<<~!-jJV}sZ3wlR9ebFLM^A$`p;_Ey0hGt+i& zZ}mXDgFbUwZxL^I7WD&+QTJ0?XTB_kM1WCjJXksK2UVCi$Chb&u&yT=RFd_*0X`!* zP9Mb&%pO(HPc*Otgl?5Fueb5-T7y1vbI+e=a+xyz0VomWL)w|h`Dj3i*FV>7 z0KnQw>guc_e?Yb7(`^#_V0i)S2|xyF=93Rv(B zeCcQeXaJcKi}4wmNX_QyL4#N0<+Cq3bgvhhn!_u2+rqcdQs($Vf97(Dz>={DC-B*@ z%HQeV-&!Z1xg7~Y|9*{e<~IMzyuosYlzZh$Cn*@2NKCXs5{~dn7S+}Em#(@mM^4jr zb7G~bLMItg!`AOG2EM^}y)AaK-CKCFp`zHo+~pnb9?c?~6RLwZb6o*zRcKYzVhATs zH9yeSw?sf5!C+U9Mnmhyxcv&9of+vkB6|8%BI>78HL?$KnkwOnoEonUsY^!lBs{RdP{`rA3yh(NelFhEXNC$6@z z1ONx#$(;Q*E^y6_hSnnKb6I+@H~zkt#GYqg4c9Qxiw=iVU}HTjz5A_-$xq9 zq3H5v*tgN7_Mqvk{2t$gI`w`h#yty-sTLX&4OI=|zFA98=bHT&Fq0a&e!tzW-2Mwt zxTisW2VdBF%q}hP7dw7T6Z?&yuP@?jYk$;XlEjzC|DjwB<(3$S*Yw~%%fGn8E30?w zgN)3s9q@!lp7@r8o!+O$EMlBudjTCt#6apLQRW6SSzCk`pJ(s%h=B&pQGVvXyT6a5 z#$hKLUQYXlG;ck^tY2F%p&q@9rX~lCw3n~lOzNfZZ#xRxZwsHx8Qu<}7X|p(^~=7( zvR?80xJV?bon3+~G6zlfNZ9%5vcAF>cp-72u(jjr@LTmhebT{vk=q;C+}>kvzz?*z z!bytT_c|2(k}=Hul-rG&h1(PX=%+hf*%%dlGk+XHE$S7f!c2l zvQsuf5{W2G?|P&9nEjbm&HagDm@SRdXUvrgae zY;KFU`jw}ERaf?@?(69ZY)~5Ohm%}DU(7DzPuLPd>=nO^e~aU@xc{}fy(7~bky^~@h}Zx> zP9Asgkku7b++M$)Dzyl7*=N_fJ3?Ua(CVT<=+RTv zM(i$sT%7)-ju2PqO>xiLr-ozmBu{Ny#9MYS_)K3L z^!`C&C!*Qiyi|jUH>(k+Rm7z_;}h{T(pYvb*HGfsJD2y0AClNo6z}J+{h>@g|YK#Y*qF@J@OOpnr>!)Gki(o|g0d?wryV-0-R z1RGIkVno@jmJzc77t79cpDV*vfu-MM4ngx0Y=OZ9X_n9Gy;wPr@6ph?hm0aQ)gG?%2{hJa6QIv={3yX=T`8y{ z?k0tM$}qi5m$T>34YR}RpDb{=1za2|$U&f8nGR${cm9?;k3}#)eB$!vZta@0vaXC=i{imTG6jp z7mZ$B*QfI2Xu57VMcK8-b*j^wq0%gtBkmQ}Ce+=TB(bI|`(Brf;cZ1m+G&@F{y)9d;hPQI| z3C2OMrn}9%w_h;=8>QP@Cz%Z_Hj<@-u|ews;Bpr8 zbtrynx21qjXPf%*1-sJgAZ_fyGoRB)Cq&Xe4vJp)n$32n?boJn^@YA|xYqy?8&~YG zR70(Fd5??TdhZB3e;YP{_zJO~>-+Ee{TWSvs<&a3<|xchnMvM;BXrW?t;{4I^7Ldj z1sl@ig7`6LmkYZ@#v10Fx^`&OP>^@~JgF^C+sD9Ar?WVETABF>)lLnr74`a)UVvEp zGSgPl#jHD1W2RC_WLCw;hRjO57kl#wysbpYtI{Q9Wz1%`?@sA(#npnbvJHn_Vw6&uW(+EiP!6=dRR_zFa9zq@2-%Gm~wx zXDH^YR-q^9beA_&g<*?9uj?g7qT3+t7vHj9{I>9g_xTFkGH)WEW1~}m$NaN#Bb>^d zg!@&X2tzqt80g#=y@T&D*po3~*~2CWK~trKlx6_@PB;wv&OgSw~AnlZ-XZo-!Ka!o>cllG$X_K^7p-39bYt=Bry%cWdTR`gBS&>oVF8wJ3YmqHNhe3bb&>@?IK@QD1E# zd!*Rv58w;icdQ&+@;suPNZ4jds6VG)d}IU67WS`%D=nDCh(Q+HNbWBDiesE?u*wN& zHh8k!@kj&uW-g?e#WMU9@3XrsSupSL$KWIX1!fel?C$>bbgR3I!Z{&n?%;i7fA;pmojwxnzMq=*yVN{=)*O;%ty{0%bhX0yF!0?cw{~u*yH{O zt3Q4wAiW1EqARTv5pzLwy`mEKSK zh-X|o(fgqi@&)A-1e?;$GyWN2YESk$SaL?v_OOHZmL5`1nv|b7q-16-RTW>+YAln=?|Om zX)~J1oi@ER%-N7!JGpaq-SqbtP@WVCI?N7F%bpXQq)4EeJ+qTyLqKad*H!F#h5Ey( z)FyR1#afPCVs_1XKcKZFEGz8dbaj_7m%ePWbo`*9VY^2@csi2JhP_bmpfc~+qs(?W z=sKJ3vKAol-Zk9jI3817aYr~^y1}2%uzVed`5DnUYu3cKt7knno$S2fW;oNYbaROp zMu|gOC+E|baOxJ@--PL9>f1W!!7-fPzo2*9sdBfIU<=#y*$U(I;5DC0uyc+>+wbpt zGmkVqC7h7$X%!qq#@_Bdr5(SYqjUXC_qq4G3KoCL64)QVPnZs*2S4^GB5EpGJxsmW zaW7PNbJtv8H|eZxq!bvD0e=YkY9sY6J%cPr?Q&{i0m0fZg5nxhSd>3%p#IYB?I8nU zGG@$}sv82C3Mg9gwt$=TU>yjxDDjRnV{}^2l)RAli{#4dWJXheH`S&`ZLDGYAT=9? zbY3mLmEMMc7{%;~-Wn40MK6r|8WQRgX|k?CNoFs4L7pE#KY~L>ZihxcVohLa1v)_! z`Zn$qlbL~ad+7)U3Nw*l0^Uc5TZ5Y1mw)6hCi zm*{|X`OKg{vAXIufA9wxyoLj<*f5wHL2Xr)`EDLF;2~SR%jk!@yt=)0V|<{L1O{88 z!6sG)(PaF1idvTa+wlDI)YxLAc{p_?;l};odiE&DXz8h%H7g>x0}IGb@@tR)R-4l< z3(oi&HFjSH`TQdFExE4O!cezIPq?fY3Raz34b$x zFqtYVQj8vPQiR4D0KMrv9lwYM3lj>lC6!ON{zUu(bM!UeUqT_|rqEE+QFAqn>4=dK z?rRa^AP5`Y8-o=XI1__zBrKJuKdUqS*r#8uN7tC(hut?k(S_!|H^Q)$8!KMtqp+)> zpy~T6WR1NT#+>)Qm%EFOy8H`RV*297jt&~rH@pBOTTOgBdsvkScIZjDfV?)!-My5` zMY&sG(+t)Iqawdj>Bnt8)62?y@)4d^7a(1$v}UDuK#}2`t=}o8%bc4u%0e8IhApce zvC75;J+Po8HXyO4m=DcUF)qoxU4YdQM;1RfOxgLAWsa~24!gyy2yEw#EkO_Wn%DA= zOa6}{itNTLCV_^s2HNdc1sT<^q?{5q1J0f2e(v!?~Jxl5>Kc?rr2q8 z6QS_BisD6uzSN>5OMs4V7~6DRMa*gYhbd*g@m|`A4xX~H0*6RUwTXR+GUH5 zTGD+U9L8c~l1UF<^H&J7mNJIZt7C)~6>&y5ppd+!k7m>#^&O{X!>I>Un~V#Cc*Gy! zxUK;q=eAXmB72`V8xw|q*St+U3(&*Niy-vc`6zr^LWpt_Qi>Uy&}}?d?l+r@VI28& ziZNx%N-*B6d={N2nCl6{E~0A{cHov-T?68Ghv3MM7G-a@ay7B0mygZN(U3g$!lti> z(+|9^CQR5I_NKObFP4aI7$BhgI-TJDM}xoA-)+Hzm(U`_yxp6G@|r8TTVTo|ru99W08Sw`U7T9>mt!E9VK4l#df3b^K9U4Wlh{-@clS3nJOa6q+f7Z>dMiEnoS};UZO%k4>-tQZ zm}{=ld<7dw3`Xwr_s!nD*n!kq_U`Wbr6p-DJ9nm&VpAi7xKP+rJ;5W@iuYJ*J<|b93 z+nI{}q#DD&md~M%`OP|K7!4H)hUQCTsePnKx6S`I{T4Wf{{k*A&=AvpSIeBDlJ7}b#X?vFy}`p4*2G+hB2 z39oArN)A}*(FHS`Mid}10?U{ zhqf7sWaL;F1vW+!NN*z>$1>54T$C?_)=H_dwMsD6$A*QCVUrk8V*{)*ECozo z8E$C$3lr?~@JUs9CWxz}&fAFf@zq2HXi%b&gkgf)jOKV9U*y=}oqx0oYt}S6>cZhw zNP1jY?l#`7WjaWN-x#?i-t{~gem2>}D<-cp)HZIicjgCTdNEo{&zb1e@+3yb#N6i{ zT*`{5=7MHt-VgyAv$#aUHUTL0loeJMZL+Jk33JTrW=vEXWjRH^F5?v8JXx5590~;V zMsc7j^bm1(cxP=>g9O@!XSze+kD`s9{L#={_N~19VUYo7b{h?{n_j3T9d&HQ2@#^9 z2@y(sN;oB-Ho8U+A}-1x2^a*LAc=Ak(3XUms~8xN2MI_7@*rW*FoFam0(p?A6>Fbh zjxil#^ihnCiIo#=B;518g=7pos+9@t7UZ+@6>%v|`t zoFGxFvtwq!R9j;0XR`bhHm-c{z;bWZb}3O?jhbM#JlI}Y;hp@s#78qXoqqb-HAflx z^acXsT%83=uvD*VwV9rN%n|~+Ne=zx_rA3$chG-Dj5DH>ffbXCP3g|w0;$Y6p)(2)Ek5&4Q z$J3kCwdLMYqcU>o*c(LL7pE5V^?ldt#y*Mt7%OWZ@7IPbu@AfE0}RKH@&PsdP&N4m z+w6l{t#(_l=IuFRMdg}rsYg6Btb(H@K2tg!T#nZ<`Y*a8zR1C_`)t(3W_PiSWyKZQ zgDpNAQdg9iatBi`)H16w5Pz>BH7kgNTWmPvDf8BW0IrmR>{ffrNEJ z7Kal3P_c9#iCr{>#+{~Pv@K?EYs7IUhlj4$9Gr^9TFIg{D$dAq>xvsI+Eu#d6DKjr z)EuYgovOJnqBRp9idWS_69_&sbc3SV86}=9K`>JEf06bk@KIIg|9>V61O;yt(5O_S z#tN>W(k6mBBZ~pkCmDuxcQ-G* z))7=DB4S~g7(i72@J3CGm#|Y21hERra0?*P@VrB!$^v#jYK2Z1b4V?S2XD*wk|ds4KQr#SMkblwN5DnI(M-vxjP zhjtrPB^W|f0^xk6&O#2;VfJm(TSlVOAbN&@lHNN8JH|-^;0Ql@`Q5#*F7Ex%!T{@i z3mpRK{?GmQTJNw3zfz@4nj(EpxRV6L>-iN8fE!-^xbC*)vFr}s4M#xU!ZyST<&!{lVBR7`so9;@|aLmn@;RsNE0YCX`qq0T{M9c#3%RtQM7j`Y98mu$7} z5!6a+L9LW2TqNa{j5Xh!teag&Z>LJFM_FxRR>S>!s8S3A$&8Kn4>U}>QxBmbj#oV{ zS{OmSKnX~t>CuVCFv6+7th=o{Tj!=8P#j{NHdc{#tRa!b1(qLu&u`F~<+uC)%_W+Q zb)`f~n2iA`!BkQrrDjOUc(XXd6bLLOQfg)>Q(y<^Vq8EKILSnv3N*QOje#)Aus?P>}| zH-I&1L3_CA=)oKMtT`EKi)-PW{1CIQXHF1uk8MeUPLB zO)w(pbgR7PC6+zJyP?5h)BljsQd2JzfJ)G4RZY}2cvpEb5-c`NmF9&6lqhac9|OGr zgSBxUd}Msm8P34XC4}`)q&h>>E2)Wb?n&Dgx)b!U`)jSCXq7c$QN*w6vvJjl^v z6>SK4CrBJNLm@M74P*us1Fqt&k&LvChk}wfATMd>ctZzik0+4j3D5z%gSY|xNmjnfik{Bb3W(rZxSp$T6;FlJY?UMq5sH$RFiaZF&JaNtPTj=! zs0ZKnuA6tJz!&~%trUL^-3B%6#(X#BehhW36m@MKP}dmmhTQ-x2s3V1O{POED5jXi z;&RRm_hUG-<%3~@z_YVIlvEIc(O*iuT13-kE%&7}iPK&>+rXh+MrR+`nioQ5h^osE zdSaIz+NcXLwytoik;TDA%8=E3EDqXmk8SM4D96@4gn(&ikS>ZQ7l7CDyElJ z{vV`h6OTf3_RuIr}WT0V<^&hAtrB@8W#Q0Ypm+o2L178z`~?w>FTFx?WeeUN~vb<<)oqycF z={k04c9B146-{V~XNi9S{s7Fry;S1&_Lx(G7W*&JCDR>MO_A;x%e-6FkUgh1?zPQB z8P-Pfr-<3}yc?d7Zk*rm)Sa1xv%h?FC-JoW(3k!TpHwA0CS2x2XnL*x+FCDL-9dg} zEUq2r97W5-Tay%TYTzVKQ1L=2iV`&{p@f<7>@ag=;nDA1bQ-Cf4n9)RI&zoxI5@OL ztg-$}?}i)s_NdI2U*VSNB3=i#ox(7)n;UU&?7F?`lre|>cvSYZuXyUF z!)h^v;@KfMdKwncZl4JkD`tLI0|LF7P(1T^F?(lz67fwo^5I$?X*~mQ1CUD0`&&>a z&6Q-7sk542xSQ8HT=nJ0u`TU`zCOjG^JALO z^~4Gps)^2Iv=8PG|O)wSjLYffa0&xhOsfy)1+hCb~ z0HdlpQ8u0+7JP_PXRCezp)&S_P>iP1w@B|MpCIR|islrk2MtZ(Eh9p4vJ1LY?O!af zo!(Qy6#t>u#1Eudfg2ioi%RlO*X`~S`?Wi@i~j@rkWzr7g*SfMzIDX}*C`^Gk#1u( zGuo^wIw+`rx?buo?Rr^wO=Yw6K3Eu$x9B#z4{{{)o%|a57n+=-wC0ZQ@LX_K-c^p!Wsl}R2vcZEJ4L!i)p+_UEtO9@n%alm!&}YOT&8y}C|=$9^|X2!Yq_$2H`{0RHd((u-9_Ai zAx~sUybL~_gjopy6rP^?lJ(L@Pyy21B08Q>5jTU=cMp+t z27k4}u-!&O<|@DbZQ(HivL{EW`Ini+h`Q$-je=RonSmm!VSc#$)-YunM)<)=x+8n8PXoYX}SR zfA=ff3X&AhFKmLxB}c3;jOVvUpVy=}W!Dud>|u$v5|Ch}vT%lJflhI#@JF*FAMZ}J zzpoaKrBP0VMF4^?*)bo)ZWTVF3iS*PVS_*Mb>rr33rtDZ5wQ8&YiH9dO@5VVMCcDm z*;u*6wawiSjl71t+_kgyFo#+M9%=cQMsN=2nXm`o`)UeM_HBNw=6VDtJ#D+q%F%-MG?MB+UeT_q#9ZU~FcJn$xQo4L+NB?RpTzJe(aA1WN>(iQ4({1nAms^8+}O7W4KHH&Kfe}AG~UFpArignu=8V{fM zCjG&zeXw1j2+R@tSWuaM`Y!!PRKM`iRy08BVxC7e#Z!0@?A)W9PO9e0+$u(ycjLCW z2G{}v`FxP_Nc-g0H)2}g_#r1hEzov)EpWVMiUZQ91a<^qW8Ei33on@m;PKiP_4Pe8 zk-`E~w8PboyJ#D~ezpHwzLtaEUqB(My?|;hJpH6-*X($%90`6(O#py)O}N&eo?zuk=ue}m-LBb z_5;*5@j~DgFmavgw83v;dwk(Z^_*M{Xcg>+u15SX6rde4-EDnBipR6%wSX%9)53k! z+e@DS=GK=ql~*C97x_7^ZTHX;KZ?L+3J-|q4rY{B)%Z`oVGnjmS*` zv&b8B1Yjm|X8_cdIMRBs;s)V7YWX5hwh;_vB~Bt^D5a+CZzL+caIAgnoVQzZz@73{ zXREFrM_;bD@9Py?-GOkjuoOGh`3vTo`_ zRr;sDE!q@?nWK#h|0pUBA65AmQoG&Jb`@=#gHJ1d`?U}Q{Kdn@?PI#J=j!Nz5)Xdk<_m;aD_DVh zh-_5hZfZV*A(jC)8te?LN!(#z-r>4kf$;dkj6TARC zyPzj7bm1(6OxL<^)=#!z7lWGnZ$~vN(*wKeXT@`;+LVHH7obR67|aXP$s>2E>W3YWv0jkKGKdf z%e(icOv@8odVd=6+SgHcGWW2WV5fQw;yyjTt2wA&bFu@RJW!LL^0(q9uvMRg#X^AF znue?(fx}GbrM7FzO*5_Gpr#xf=IZ~Qo~yZyEk1I1#D8X)W*Umc*uB~+;PApD#|EFI z|Jh3`HymS_HAS=fEFEUdbX@We8P6 z`AnYx-(GK3e2qvK8atetxv26dQ!`C^G-;%EVzjGORWSI66S*^m5$Pdaci4KgJ4O9h zQYf>WxN!meMkdEQsUM1k`TsyL_rP*KHvufCVzyD;lLpIpKFxVy4!ZYybH)vi)r}vX zzEidb@%M?cV@Jlv96gephh^i?0eR@oZs)QxRhG=wso8I=s_()GnzlBwLT%Rel-QE- zbxe9m;Yb7Yxd8fYi7Jj@*HU~8)Vq3jzS==wN!aXS3^+Tln}? z8kFZb%G$pu$kzYAL%`PY%}@BocuO-5Cqt0mo0Wus72AF=pi5U-xX(kY%hGpoo%QIu z7LPEP+Dzc?O>HJ{kE1q|w5sh_VH_GOh7J^^s{{%-{O97=#$2dj-c2INU@4STSRkH2DSYp`j7KxA-h zCfopgrtR4uJqV~RyyiLXHJb0ayzo{9*Dl>`?{j{8{h4Dul;KZXxd1>KJovuRBUCH^t_2E9-?^5 z-m@5zFRWqMvnHxRhL9ehmi$4cEmTbFXKd|M4vmRgk9+#ta;%C^9|0{DpDIUm+iY&PnM0;hDiSR@p3d@&N< z0o`0E!$YmnXrOwa|dhhWp(Um=LVEWOsB=zEOM7TzMgWE=Hc6zs?6k*Ki- zy6`_T&$HLAJf}1(TXWBn^+Bd~uXQ_6Rh+RYwt+22IuGm3d9nb!wh6p(`AE)iSL|k} zaRBi zkYjY|wWfOHQ{of^j5{uf8?I$BMQtN_k34kcnG(*)eR|aLn0cZ!I|scY zEc4oTrb!K-P;9OGOPkJDJXwZFfe}v9W*`pzIt}Q68RrXP^hDQFbS;dS)tZp)e4SHJ}BjRPtuv3Rtxh(_of?g)q5|qt=jnP@z1x?6}$@Fg>K3?Bj_`(iuhTOA4j7It!;dk<2EV6GdWNz5icHlw*aZT~u z-*}{(`wp9XmCF-EC4rsp5J6fNEk&F-2??Q|jxQ~E{ua+6%XWT>$?^*oM;y)O*QiGB z)k;#8SzjQAK6pfT-c;vnC|%;OdaN= zP13c{YJ%UnD5x#Hi!f`FFpK>JPWxax!$$u}2!b(+Hr|$oB3kw5y<8js>saV3SoWgb z`IJ)fvKfms9YvD0mtOLtBh3nXe&4W9qExu&-*qip+W)Hc2jjc4yZqVsA!xqqx2C6? zTebJ)IJ`ByELSFRwj=$wJAjDO^9Bb>-fsVt z2g_^CYNl0)8Jp960E|EpM8!C36Q(C_w%R_h3G-T~8;*p*669xi!nM3nb1EfGjOTT8 zl6&m|{@u;HV*HzGt-GkRV*FF8TN5pP@Q(y5@Al%~nJ7i#X*1QHF$y7{lUEg8Uu!6w zn8KC^60@-SXgXsvWdREZg|^nV=$d~T&J;hkK(z_^Ts)@mZ;Hb|T1E2thZ{-i;IK;n zY^fTCfb~#;_*#$rsImgb%WRRpOhLWIjR;lmtIuXE(scGovev^7!P+`HqEka`M^<)~ z)%Gbo*VWS1A$cJh=m7J@Hh#enbYJqMS}cSdLyez)gyR@Fjne!&Nn^f%cJzR>a1+Je z@!h{(6Y||Ukg}&g!hci#yZzbte|pcQ2=PC7IgarB!q?*1$XFfV<$f<{lrWa+oos63U%B&RVSFCS$#JD6!c2@HHL$rL%-6j?)lW0 z2N*Z4wCU@?)oeLw6EM}CZte~il>4-H-U)_IqfeyPz~&+~3WLu`Y4utc3qJXZGjMvv zv-ie%hGsTTLK=N8k$p!;EaWRz*%ky0^nAsq?y|~16`-TNJ=NS4&uO`H(1jf55lCx} z-;#eesyU#9IT~YgOG;`=9-Tvf=1C|BuU;iW$Vv=SR=!%BU%u30S~@bk#6(keEFP3~{=U{UC()}bIkwg3EB^Y0 zKzxoO-b|%W<{UtJpv;A_9<({*I3h^KC^-I;zkyKN=&xq|5M}qAfE9e`KX3lk=84}T zhLn}t$UliTH{0sEghzO8ddS^tdqA}tLgvQSCZ)N3?EeEtl<{NO4b$(hM9&d1EJT{* z@LqGyA5Z^qlNl;EYzA$54Hfebs?c}K2f_K2V1cBD4(a~3$JE5#}T|Jh-V&URA~ zdN|V1-0ZY1MJQ42guR~z3z?1erTuVRd+lSOh+ZDHz3%cAd(mH=SZo6HBXM%$VaAW8 ziUasbzyu_f0Bw1~7}&6HNKb>-hkna^^}E~P0Vi|Z>k6s2<+X*!0=}>Xc<);Wq5j_9 zwOC8}(JxGK`r5~iZ(M#w$TyS^8_He7d)UiaR?LaMlT=15pl~5&3`OlYqsg;my@j-0 z|M_6(izmSDDr-So=`pQ?* zV%v!i&TL}`ndRU>-F4fDgyhVj^1s1WKYye31GtnSaio?L48Dxv$eC(%4#H^hYpDwH2i> z>G8`9I{9LopM5Sc)kNx*KZj&#ZdRI^q+)x$@Y}!3MbKjp7gj#p_x@g5Eq=cbNLGA5 z2Ccv79yZR7R(2lT0vOf=8>_(Ha{u@_*5~S?WGB!M__2vOVtPqd$5}=kfGB&!O_u-P z%XKD49Qp@xB#1Qkm4sXNc_)u&HORY4;n^(^zlHBdTwE-_iLK31JAD{ zFL(r3I%r6>ILVZsLi?{|DA*x6FS-G})3smNKX&lrjn%5#=oc^2JT;H?n-@w^OPyxp zI@R3Y2dRZgCjZk19lg&_O`K)iFTXDnXg!&&!P8fZtbEbyf7)JS5bQcnxYCRdWk=#AsZv^!-c2luGv-4 zt6=&MGixA6Ya_fRuB4*y$@d^Y47?u8{vn#9OuG*A77M4XRbu{A%p&uTKm*icw2#q? z`4sU3GsoF^*(mp2mR7a6ZYDV{z>l!iB(CbgP{i;>Rvn^AO7R5$6C(BL#2@!o;c&^UrnJO8g$1=#INCSXX3U{pZn-GP198T@&-;0!JK^UnOwgjdE zu1fzvq?1(Az3q3Mzq|c*`#bSVuPYJ4x6xRUk>>Ou0MJ`m*Fzy6g9=C55JqPmFv5_H z_fr8c>$;zQ^yohlGIg2HBi^;Yrj^X+94PS>UNbCq_PN^=4ybdrls!DpyV^9KplN(hOWAh-D!KVQw~C%K-9%CCe)Z!x zXoK~*$KWDjLOq#f?LgOF{tLctNAFnjB46#$2Y)IS0Xj9d0^0zU!cO*}G~fr{DyFNj z>v;_WE{S^$%lxrD{r#C5W-7z}evHVq{$?lWO}^rCYi#J*{Lma&crjPB`lPAJR0b|y zG!+fMhVmglqmxJ2ccWuPr71a%lE$%Elo1dH1D?zm zjSk^{hrTZw$KE~T&=J?vd5ErL}PbS#~>LfII8cc~l-_C;cxjCWyUk{@)Ncw+XvIDJJ zkAvTvrL7g%ft|*v+7-DL&o^$J%-`pN`tqZHcOEkW_1A>48)AbvP+>#s00Z{4=-2wg z^=x-p;=jJHV^4cqjpCjJqs`*2lLlI!_K(C#NG%Fw-uh8=q_(%c_U!`t5x+Z#rnQu` zu5bI_)#Q0WlebtEt~Gg0CRmfJ{8yR8pt;-U2F=MYq0F;UteE$74NsbciRjLc5<-n^ zIb?r4rh4am8>H03z2NT%`O3$(sQE%E@DrR1YT>X-EfIOGdj{iRZisbR=f7@zpgAfq zv{*yt!`tY`o|boOQP=m)ADjnLvB#k#6pixQB7c=;S?xOY{aLouxduyN^QIv@{RkJZ z$4>iQ=ReA?a>346B(&OszXIHQCW|k;9}q(9aU7hGiAMJOi*bV8YI3yY@(8~3vhbA~ zXck>(ou5SmWT4r7cxfldyZ(><=v-H?q5KI{A0rpTW7i#&_OMlL* z`YB`xVX*R)eN}wif9C~?pr!LMONjn?sH&_pG-Une{sbgf zl~`WXx<2|;e)MH-{1Ckuq<=hTU1(a4Qnz66MF%Vusl4>^QF^KQFt`olE5|B+XY=5$ z|EmWdod2240?t=rQZ9}p>YH_WxCZFYt`^a4^fxVYz>5SFSz}RJXtPk_z>r(EzbcqO z5W^t|IffLi%ObLLT}KGCC?h>?_rORBp&7e<0+Gvaz?}q{QBsos14r+YlR| zbx}SelLb1iq~$UHz|)1BKFLX)!>8YCS%c)Nm#bLohyM5IvL=-IJ!@yj;hSTI<>P4R zn{slN)%(~N;E?|j69zc@pRGy%IOOyHxKMHj0QvueWz+RHN|YE{d~5(W`Ro5tg`hx2 z$kzO2lqnC&Xevi_JSI%_TPW4_x4!bCSJ9N^@CnE&uhp6FJ4XIZca?tu>JKB-l4Z$X zg<&Lgf=|5X9|&aw$?pR#ycp!4e#n>>Z*?a234haP%FX&ZSGHU@Jixy`^2;JTJg{bd4E+-cL15)WMziRJN35Lx}c}zY)YDhfh{s$ z_qm$xu=iM`KaqVNDrfXFMh%SaEl6EG`JIDr+sY6qnrp)C-}W;!ZG{XtjejNtL0Mi67l10e;&w8+p7IZ| zOWU90i3u=0aDfH@k6%TRdqD%v{?(0)?1fHnTpK&NkuC1T3z$j#S*UVmIPlq|M)rCC zr&1{}(_{DQS3ZS`-@k(&(wPob;dFc#^FWN&NS4Agu##=gb`X!tANu&eIIFLMC&&%X z>T4Yd5rTrPck{^juEpY@q5tzVNkEqeUW6Xi9N#p;NaF7ag_g?0Wf^qX09ey{IL z33x+$#ttXaiI`TmJAFq-1bpb<;ZUmWKtoJPw~?W4#{Arc$A~2UfW!dU%prK&SS_P> zKciUva`NZ$_vF^_Upkj(QxO=Zn>$?uW{FTO;bWFo4|Mv(m%C+6> z%Ehzq_}9y;mmhlgPR`9>{sc+4MSIz#vBuz}TRF(4g*p~@-}QHZJwwieRp(0TB;I9U zFn$}cX8qr=*P(dS-2C!owOs$b=Qf&UWXzAz}{0gc6#S;5{h$$DVOy(}D3y5lC&&2Cu3(9dMHufzy zHF02P?9NC>gj8eH1VLjGWspX(QCdq`g!-PKJ=qi_FnqQ^1*k| z&tLeia4@BN>Br754x=cUVg-#$%O36=VAtREC0nK0tEb~4$=4);A^qe<+{N?J2s?v% zr=Gb)?@h^B*6lAu0@_W2-Crbv;!#QPs9KM_2iB8Jd6#$uM<83uO49guS#pSzaL;Rf zM>wL)&2YQ-S*#RsmeVBpW++T2+}ScF*R8#E{zNLLkwn>H)*A9-L4p9s$FYACWoN(% zUAaW|j4FS+7?)N@;Z~^>RHI>N<7l+RzK7qvE4AIfny)!EAyIZD`@y%@37TYuo6gL4 zMWXEob87jKRd}$8X1}^B{Zz6H146r-t%Gfv6!x4RvADcWjJ)qECehD@gDBwNKHI#5 zjJwY&r*3acch(xuRbAujhdx?CS)LE&(Hpg4NVZ(N3yJ4Rn%Y5t*#}gmV zAH3DH@!p)$vFx>#y><10V?lstxMC~H{uC*jJZswbM|I2hl&)#Hy!7kzPA!+0b-UfQ z-X}1mlCkSjDbWEN^YZ0~#OoK6(3A>TWgYc&*MXB~Wnay__XS5XSEhd0vU%s!fefrU zf4Mu8dytMXzIj2*W{xjgM#ix9sh!E6s4-6HZrOZIYGKRfU8l`g##c7$zT5eE|5*J} z@AtvEIS|w5rKw-gx5v`0>SO7XQFF?Vy{2#p0}t@edjGZ8b_S2E-@&>R-?@9QEyk-) z7TN(3QNYMCCApJ<(cv7F^Cr?oPDB<@R_UqKuSMNKv zJ9P?>ON#zCmrWbeav5;jrscBIuT#yT{>u3=Hs52{rE9HRX=*Ly9!tMVxhK=Bm-H7( zJXjXmC*ipj;PqvZuhUlZ^h1{Pm)SR0e}ek#eRq2HlKvvb2TQ~6TP`c>PXA&_f2sWs zmM@$|Dc(_GeV+ggwPGx!Ru^O z<+L|j#%z^-5TTsq5WKrXcxM_1M!M$r^29RLhlK=0*%N^p@2y}3s7J9!(d?h7$BuFy^J6Px*_Vj?PLr(onkt;O zTQj3djdCILUH{y)lOPq|P9`7-=jA(_IPIXyyY?P*5_Ljs) zEQLJd-Vy7&T6^Kq*!p(rbg@0Q|1d2Tqv-(KyvY%%odo%cTHR;MoZR{Ce7B3gfZywRW#Dx1Ei^Ndfd2%b-Ih_k{;~sY zg$pFhS1i?o5Vp5Ed;~QtFYx_VxYIy;ij{lbf%cc~Bfsp{&|~srS_7!BOy~vbaMUvZlH6~Nl2G@PHdmDC!95V*QJ~bn#oRd+6d7ZbTPH(kVA9Q~1o$t4PpmJ03~E|n!If@KdE>2A*uFLU3pn!e{;TqVqOI?+6V$D; z#U$`?d?;V>)^hbA5E^{f*FR2v;pO4#QtGE*2>Mitb&A6|XN*HjGn)a*t*+tQR8js? z)Bylv$W=eJaw<$>mH*Bi(o~zT61h3$?QB`VW5g{lsG3Tmoiemdm`*VFaFeo7qjlp| zUK{IoPnniryt`Zf0|;izMs;+(*-QWa6~9Eg%=+RIHltmgea2^WG?Tz}(Gh`2Hu_?C zi_T^eyZ#;TO|^6j8PL%N;%+cGZxv3n_~#4-bjwpuFJv$u&`(A!@ABzDPrO*@eL|@j z&*W_SYWks4|MG*5e&K);^lr|`jn_Yu+Am%|z4FpSLIph9zHez<+IDWRRBbgRun<4x z=WcR5!3NvwNA=JCADe-<13kU#?~b3rFKp>ht&3$WFr(w;>Bq*hpAx8ALET?>r&v-t zTspxrCKw4GuYWalP@KuVG#c~f6NUeNJhH@pNWuhlTvNxS_MK1vlmC*IZ@qGxwgP+w zIhJC>f*fmv91N=K-Xi$KP7vR77?`@ifK=Q~(jFFd^LW?Is-kW-sGC#GQ}z?r%z;5O zuGg|7R>%VT){XF+Klu-@Z4VT{a8)rhc-Xo3%+E0 z%+$(h)~~0rJQ@BW-{@ELyZhCHKmKoL6~lE_>?GKJLMozW_KAD{?Eb|!zC)j1j=wNxm+|aUBuav8ATyID z@sTJ)?|6<;Wj{G8fAEg7R?UVLwtCk_DTDExh%Ahcct1$*pC3ConXkC+7%d&V20eIl z4r=h`Ok^X{!ZI$7hR!<6v+FbOmUZ~0o$r=sRv%9P%1hc~Up8cy#WHVs9e#PN^Q}^7 zb-?2I*&FnBWCQN{%$mca9Uu0KdUG~340we%?Xj=y%yK~S(A7-?>EE#tsx8f|F3Y@oc<1VJDmyUN zeo*!~o|dbz0qf(p(TCDl`#2qBlNVRYtR5RYDvd23S9WM3v#>mwU6I&F>G5$I#mEEd z_*f9jTH?QW!CgVX@PDx5Z5g0Vcpj??_hP15F?R-Rnu%R{mJ?Z!~0I1Be5jnF0oG;dOWvGhh4p!W`aHv) zq$;e_qv&+=rL+f9H&m37-|(iR29{vW4=ZhKUFl`VG6~7-*;V5fmwz9jIr^0&dv%+5 zld<%wfQ1Je=pDcI@4epm`!`=YerloDLA4y4KFfJwC;!%vXbEp^NyqX+8-CdnV7Iuu zAFO>50Upi_FmtLw8&8TNOtb*uM>jlGrYK%8V`4nQYULNH1CXFuJ@ELLjsZ9l&7 z9(ZcRlI&8w=;p<~b=g<#170jH{^DT1aMkHERcBw#RSSGdU&hvTzTXdqG~$Is{l+Aq{lzE~f^en)=I{pYjppP4ff_^&25u7*L89qa6>c<1|KN;gT*Y6-L_FLCXQ-SZ->-Bf zr<;9HBw8e>l=Socaq|hzjME-!(HZt>89c1ikA=zz%B!<$uL`*}Ucp*B(3(jf z!g(01e_i((V1--M?h?;mLEghJ_e?*>t_#ri<7sSzR5m-J4In-io%|6}0~MW<%wZ+) zL@d0TuZJ9#@a8XwZD@!^s!}%q_wpaaz4_~Ta7m=fYrPDxXO`AHx|gOf^Gr>4@!S`A zBuy*2;lu34Xh(Pd$(?>>WPQh`iV>R{vaf^(1IBNoIm?+-xz zDnBBh+J57>_Ja>7>`0xx_Kd&vbta#N7tNN1Xb1cnRwF2Gu{zcJy^~jSZnjx{M4(IN zF2bZZfvNp9Q>)MnQ*Pzf57cn@LXE#iJMC&&s55o+7K&^{9-D(nXmNDF&hS}H+c%J> zr?y#tYx?w8PL@`{#vJnz$uJ|&;ryGs5LZF{J}EFoqG=7Ulevlb`7YGvR##qGVzbXD zv#-QQJV!RkCgMt$bONF7dEf=ysF9U~BjM~EO^#aW^CpA5yzj!`Y`NM-6lqgI!6#7wB=%2|~{Ad9)nj7QX88_=DTV_hC z`Auf5)p}nmZ4e=BsY#V#BdR3N@zf8!5yZfFBiPOEjbJyiH{$l%7K(c#?y?YQZ^V7I zv+dp;>*9@Y$$;Z|muL}VM)4_V)E13M>_DY_-u#kDO5kQi*?$^wLvXLUv2Ye5VsU@E zdpz4)m!~*Ssu{P!u5r%q0GVC{&hSSv>Cw~I{f^&!*}b^Dy5v+_6maufWUtEuGL;3g zi8Nlm1Aew?ungPA1pT8S$47jH-Q!HE^19{X<#|ITpd-+2T7PT>C;L+bGC$yHOI zv6`#G^$7Uc`yEVGk>4lK2gg^jGbXn~GTWi!vzxzn#38BD?$p4pz3u%W15492cCI$7 zk?D^{JuRB^5=#^HOQ+X-vTzpfQ}2KK`)RA=V{kTRkFA>eiWCm>KP8n_*)!iUBTZ)e zCn1j{dA9iFR$hs1;#rQ?VC|d_U>*3c7)ok?B+_0QLH#n;f%Aig6^|zLcxAm1j^R3u z+u+3Ph6&9art5`1`pyaQ%;89!Pn{bE zWtv3?hR8O1`n5-oXAp-rSXddA)_* zHZB8ln~u>OsU;_strJ~N&{fpCVHOW#Pqer`W4BKk~;B=dlBgb6{j?YG*f5=8L#1zdhyHxJmg3FwsvxrR6&9*~lOMZ>-Gi<3lUqOr^Z z04kOXFT*c6IbM(E;LUti6T<;#!@W$WE>Z9IpNt_I*h_x+s#&)dkb$wW^(1X7d5wb#C93p#lePfLwKj z^Lyoozw)Y3ADppBh#1Nsf-n3hd1oy^-(wyJ$Fr4=gkJ2G&)JO{Ci>FBwf?Rx?BtMg zgpQ?+zjm;bn`Z`*9@Ou|b#*V=GM97%G-CQkSY<46kQZ6wg6!N$As9YkbdBY#4D!0oTxU}5h)n=6%IjNNsfPH8ifkX=0t&WpEO=+S;FeDw!Kt>$PrAG1hLqR>ft@WmdN#y`7Watj}V> zMxu2Gr9NpKwS4>`sj)Z~Hi5ZNyLA}e2A_XtX9Z(n=q>p@mhIg`@x>N&=euSlts8VlM!?y2Dm5OixYCtpYUp-1QBZj zAW#d#>1Sd3O!0gFu`7TKFZ$?b_O69iAi+(Hn*J8H)m+We9w>-|+z`0R#LA!oCimQ5 zm_j+nIzvxETTDq6(T-6~x5f|-p!IO-GQRKwE|S@2VE4VX3f~Y>18e=?<7-!qz10c( zAf|z}g)a>WnB3?6cF>qCEzG96>ii_Oy`S;9{VBxHy=p8unSBbuWcUF>J7qW_Dlpve z53@@)1TOLq;!^zv)f)-gn6B=&?E-p$q@$M8TynrBuhki-jU^3r%hKDL9O5Kx;eTCY zN$L|#R_jor6dFgZJhJYDJ;ca~v=j0mR;TXcA9ne-1HYHwsHv4|Ekc~6)*BIimo7<0 z-b$Q}k@f;k!#JA39CH-8*Z!qc?6Xd62`^Vf6tvXY)67|zStGk$68`2wG zG_vU0zoC6woi1z$wvFh4qyxPVVNs)ai2B`xrqF{Lz_kIq-i_=HeG~|ZW7M`##!4}ApU`I!mH&8kWNf!RjTZUU$ zhwhB}&^zCz7(m*`vYae@!s<*`VT&Bmoxg;rp|8uQeXr&78rCPZHc1*kv{~t#z51$5 zwDDESkG!C3!Q@$CybbGO&#FH3Ym4ytIilrE{{MlkG$BYrpOX00I8oN zYo32t_&6Olw={LOto*5{!|(}z7mQn+@yAN(H_mZ%KD8%BuiURBIpUe*h`0RfapTij zc5=Xp{KHzg%aJkm3ZZ13IGpV^a4ua?lJ)OtMq_7m}x7fA6rnEF?>DR^3`cBzam$=d#&=|u+Y2K+!NNSs=aOnJ@r4CD!d|yvVOhSx*vT^prBd42BjKd zREey@Fb}TPQH-2h2f3O1OSin!u+jUg3a7x4q!-*teFm?>Kj2k8{I~}|)88lp4w1+d z3IH^~z#jmJQEa;ffEYz#x^YMJx}N&HnaYdMr_SSh>wH=7{xi_$> zs@-+&I{CPShJQCk=e1uHmeZ$&D|qYZ%D?kcc8KlYd;d%BflJpf-FwwBC8(oP{S>AM z%!Sor={@{d<>EoPh_w}#drfsqpYn$X???A}KZrZlmwM49^~MCLqFeVV2L)RxA35(eaI-)X1)VV4eCmeRb8&->wdx)IBg>>n@>xx z;3*5z3%pjHSL4k;A%gS$lt@GVs5fIRpP%5(6dS?C`}DDA5Bx<_9hioa+44G~s-NB7%XO%TiSv2PIu| z0=&pqyl|hzly%+Z{7qy030KgG+_-3b{D%DMmZMFA1FQ=CL=sWgR>|rNIHKBJ| z(j{8B1xKD-Pa_5P8XGaYz=!V7RoWhjaDvV-ZQqH5&)K*|MiFqey z$A6u9H$o&FUTi#&|7uoC&CRSMRT2=t-$kY$Cr%Cho?2fb*d#hgEqzYbA?)D-$yCOgOr|>uCUW%E2|GvT8hw+KdEbm<}iJh3tUtAeb z1)u zXR(t_u*ibJX`~pg{LgEwz0BHECTEY_e!Y%AX*u+lKRp1AorUacuxW3!ji=B}GP}MH z=|o9l^yEoH7{n0D$8*PEmknGt?WJV?8ax=?{td`dum`NKI7kKRD+d1IfRbx2rSn)Y z{>AFQxY)}QQjbj7KIT1g%=VL6TW`IdCt^@u>w#RUuCuO0kWV)$AiW7NY3Tb}3tsyf z;@N=cS&rV(^Mh47VWnHZ3ZaF+ep&_YPdYPZu0%khbM4k_BkP~^j$G}(#5-II-nABf z1Z78iC|k!9Lfjkx2C3_c6**BpS5;j&J*<9z@N4Bb6yCcQXShzp{Ljc=?^M)rH?&I3vc%DyE2Jel1wB(&ykedc^PevQEE0Qxp#7dCrs zO9hzh6942CQv29Dmre=(Z>GyYHhU*bRI zzXktMK12Lh0q~!Z_Tqo)e}n&*eJlQ33q|;^P-5Y~N^gn(Q~v}0^X~s2{=f1c@c)|s zjQ>~tpYi{$9{ewSC;rd=f5!ipzls0A<9~<$)bStjp9;Sl|9@YM|3r)T;6F6|pYY$` z68|aR2mdM12mf0Ree`TFJ2gJoxY#Rg{81MhvJxK-bAH!feu*I`0wpy-x=JLqGnO={ z^_o0NE<3}*S>d{;QGM5H?z`SC*4J7NO?+2-oj>o>-dS6;$NH9Q@2CH}_Fg;dJH~gM zYj1QgzK^H$jIY9aud#iFv<=5*`bjuG#zju&C~Q*t^KLyX+7pXT?^qb}qSK!XzkS#A z=Fsm5Px|%$h&AY76VuCy&fsV>PC0SyiI)*28U|Ms5n{)B%w|e%YtQ z_tTaZ2srF2U$Gj3;*^%?yf?}va7X*QxpNiy{``3Uu@VF`Ia5w8%)MqSOa;eZwHCMs z-`-{4ULBpc%6)sE`?hOA&>r@5YH!M2Y2_}DQhk;p^VU$Dvm3j96ZQ+<-F+(g2hLDe z@dx97eHFoQ8ikFC&#w_XN0T8jz@yjUcw?daD^r{;7Z+hQJJJNZ+1NhOp-uGeL`~(; zAD+xkL9jGer3U93tM_zgrL0C1v1K!zm9j%Dcarm*y2DLoY%bw_s>arC?qU2fPV_4J z@aB%r)%`m*_0O!1G|BxGD5BW~Y;m+hU(7-yys1aI$gEyBVAGbp zQIuC^0VCbue{@z@)gxAhSN=uRMR+_l5Ybwed28c<1?}9uRhd500#B&qP*qYBR&rlZ zN%J&mEH(bV-&#R2zR}}HDC9Ju`-7_*|4yzF`N!SKsBC|qdX=4qa7zb)_ZxMnRglhY z%lw;yzADkCByXEL=EM}L*xYu$HZ8B_7cCgn!K&mflRvX<`p8)JGtLXw zklUVyM!nVnATnnH_cJKGhb@}G<`%yD53np9Lx(gUZ8VWx&4dhxApotEmf+F9^}2d8 zS6FG|>Yx^v9}??5e{6T=^UCQbxj?uV-`cpq9Aa&M=6e!@3y)8%VpIB|0bdXKFX#RC zEJb*2cdE6_qG)L5^xC;65>wH{Xw$@;9v$UeunFk$93k1{s3+TRG;^3mS6K1f3LKJ&#qPc{IXFS*e!3N1dXQIG5M@rN)=LgmFA6HzldqM=ke% z2$NBt2j=3H^+#8_IQIl5OpUn6!MUSron&F7*j}RJVt`H2azJKLJOo&<4w^fTC~@gM(2>4?1c z^Z9t55F27sXwIy2!;I`+>$zZg@4Iz=ig$c-OGn{o-t@vRo;yx+2%KSmp`T#mnO3;n zqXF2SE0BHfQNHZ9)h2%^>NJY{ppCGMIt}MjbpudT`G4jWPRqB=Rx077sJmte;pQA# zGMmvY^%_6Ute!JZ4`+O?M_%Ky!q)1O;bAU5u>R{8 zz=5c_snyDQ)uvGC?8lD=)zA1^l{I8Hc#Y3w-gOPc+(WPNmHHRFwlT7&@}~?pumCR> zZ~fEH(Ku3515jCh>V$iCrp-ZNm>UNesbgPf`M<@$aBoU=@5X$j+*Q~j;JU_L!;a*_ipZ_Z&B}NHVOTKE^yFU)IZ)ZBz+}(1PzQBV2a(m0FFX#=S8V G>(3P1myE^=wUY>xWX?#mF6q6`oq9S><to0dm5hH1>UBQD<9UEr;8qAEO;K0}0qn=X~NggdY%^;O#7-$vpPcqZM zz&}go|1^n@#aQzgX=F-(A3F~@j&q8L@SMO(u4B2WaKijj$f)ZY zu9tExP1(vcR}dDK-iawye~WS#h4ZSA8H-0?0o%TCGn6*BL~4}3_IQ-ly3+I*|9D)- zlV|np3$}z&k1nUNf}&JHd1rIQvKMUsq3NaSW7oAv&V6@sxgh1c0q3=zNB-CC$rkn# zu8Qm%*#SBa^0SGVLvRqj=={#!%vKu8ZHK|JkecFW51C~NMkZsgPM&eag(cDScDc6O zD1#!raYbfzsm{*bU{6|7sPkXzepEN7L+s!^GV#LbBjuB25logr5TsSgonCi$rBSul zxT%TYp@T+trU}CqGS4F^c!#n zp6(!}WbS7Gr-z*ke4#Hpxo?4ECljH)*oGsk*_x;Qw;MAWc1bnjxJ`O$qW&2)_IdKYDv=5-r2K&5)ts~LYPaAS+LZ9w54#j?fDIwP~N)Q)0 z-y9EK`)shc;h?|U5rDB7@0Kv$)IKOW%3}kC=~$>DEy|4_=X20l`qqZrxkUFgk^_6j zdoosIGrG+j#Yu3GnT*nDl8#sUWhWYs{F4gJmc}BEk~@01d{hK3Zpcj}8e&yL?uvbT zIfm42fKk#062LsT9jV)x*YGSXTK52qxH+%kLzdqM`n$3o;fz!1^sttJ2>H1&4bwYj z(`2N&g|B_h7Pp3_m^aV(PuwSqBZfiTzPA*|d}ak-nr6>+OK?3rH?9UTil>|y8jXzu zsgwDnsf8TdqY$)#ercmSv`dj|C{WTbA@5N0gKxBb15KR+GIdNvRv?HpzW~oMxej=n8~)#@sv&!q z%`B@0rWY=N1-hxL%KBdG&dhfH#BwcZ%=EbSk2qf$V+&oAw`gH28c5Dd+QZqnLgf0(+v$`lqc>4BpL6|^X;A)CGMN-@ zEu7v3L0V{X#OCZne@qhz|5&XU!a;sWH@sWyjpYI+{HGye!f)A19c!SGZG*MC!r{CR z*Fm~Ya6q|CE8DZ|i;u%Ep06Tdw_6WnH<;gXGOa%!j6e6cb`6xJjy-zFuFwjfcXU8y zPh&lSmMnpW^<6`K4d6&a_GQxxzkQkta7KgHKAcyeMnn&VuV|M_UmUD4_0+f@H5SIY zSL=dTvN#y-cIx~S+TZXrjM&Nbmjf@V&Zu}^W_5Esw^Qy0>MvHD8fwoU)#2DDY&@D- z6Y2B^A!xD-{6TFp?qgY0)$N49xre3Bz;(j=iL6LN)uWz{nTDZ-uxx1=cv6k%iHfc_ z^PPC~>-@6%ntd(g-VM2j#pL`1kzY_#Bd1_7m(r_dTv4rWQ%WfXK|ImHGymE@utS@Q zT2~lhKCyy_N{RgX1$O$;v|t{f^7D%nzCWsPW>Iqy<4WePpwkZPcOc&q+{?vb1 zq-x6JlndPtenP!!-jzA%x=C}e(I1%9KH5q z5CO>`LgrBumqHJn!0OP?xqy%0edD5ziyB=-xj^3|IDiXV$(z7Mot~V+MN}7)1RVd$ zd7w$IO_hWC*7tSx);iWbp_+9)uXO{kl5CJn9JP}4e^o48e#ApJ>+>tQ?DQ+pW@4GQ z$>IPj(^ReV?}zPV7htor-N~mY@#&vuSG0D_T_X@QF3T<}EyR2{|*Z!JgP(_z^7wWkIncev1L;gB;VpI01(2``!QfBQWr#BW^ zKVZhF4s=Ry<~^Xisgk!>6{(WJ_|PWDqPVx!O5eyus}B{S;ZWxGQ0Ia1xeT?Y(m-qK zk9f)Ucbcfz+D?hEf1wWA&vej!WO7Gij7ta2zA$;l8mXY4O9j1>PDvY`&3V^cYEMn8 z&qd~~MC|c$X41Q*Gq$0zIzild-3zIHnWd3fmaTCohDvLL*SOl;c0cB;ksS?f=Z^GR zZ|6g+>NDZLLSq8Q9T_z7DR0D_(j;xf9l&mjXp-uhvg;96aW$!Ft&8OvQ8XYqF3fSq z=4q!7doypO*17y&(yJ3c%kAB;sT99XFAn+6RQzsDNb~n%-OItlh3Q%%a*%DO6nXF7 zpzm;_Ng+2P{`pjVJI2vQLh9$K^l__t4)KP}q-5fIUMS(+hkj=4>^S@AE-TbZ zr^Unz#RkrP1+f>e?QeV+g2uot%|rHBX7yKUhh;(6uCq^`pt#fW?!y7hUe^^}N5gA~JMN$JYotczs!1i}H{ylbQ=OvxYKa$&*z0R&Q;(Xg0gK}-e0EpK z7C>%3SFTSgE^cK5JjX&lx>tqnhfc2`8H;4+le^iM?D#7u5GKRUvdPN*~$ zF~>ED+{|VA1V;wecsI*o=q)T4bf|`r`1uIciDz{{?O0etBJ-rafLCh~QT?CA z9p;x#JTqP4lz6^vQZOdgKU-@j1UHk|(iHORc&=qB-yM}3=DXYs4_2#Gu0 zFTG5rnwLEcv~%9AEBTVDc#CrJcx?xRK%X3p?s((`mnEF?!8)Z)^3r7fA)AJZO_Ysi z+YDm4Mijb-PZ2y2kincx@miI+R?$cUoED>AG<&VnP`?4Zfe#9*p&};u98JlEwdc!= z*TNHxwMG;(#s7sEehw5_Yzano)c4wj@3kJjtqO)85TXf+tz8WzQ|6{i{F z5hYh8*IU)U7OKZ{_XzvhgyCH~VjIl>ITuHNRz@y+#T&~tL#O<;Wu?gOXo*wT6~AuU zrk#EEUIVRgFcigE-A=@E;tH`-X{eEsc zy2QbaJPl=@Ex_=#XpSmsjL;@jnV#AL-^woNe1BKmzirxkRg8>nQvq5mKv zNz75wq#@^ynODXP9l7hZ$#sWGL2hOB31Ep{1i6t%WXtaf?l~8=Um`>IBd9HQRTa6r z++Ec~?yhuKQ9Qip>zq@>cA2|{G2YC-!9FzwvsJ6;wzc*_E>p+E^S9fTS;#u;xw>m; z5k6-gx3?uJcH3|QC%aAYOs?}Au=$~Y)qnvaNL6ZFlfZ1Paz#<_HPeZRriT@;^Bu>% zyDEJSTxoDWDGGx&!(P}KgZ4gJPo9)n2y?-&;ctxKsho@Fp}R1UI!$iKEEu79&3wge z*APeX|Iv0P@KIJ*|4$&nDBwf|jjh&HV+(F1YAO-b2?UvF(6ors;zH|ETJ@F642Gf@ zO(Klr)YM{YtyNmJwRNuxpon1ytrk%brHWdWJ46AO0%A4)@9*5_nVA6X`~J6llzE=} z-1XdZ&vwr}7u>C+1QZ3r0~O1>15|xGTNk4(TmtrQU0f7tEd-tDkS7};Lwy#-+k}UD zE#TKJoE+lF*qOb==ii{hc1ea1l(BQEj&;)Irk-a?Rogf^2C;yMRd*Bw-FGL`@yxd= zm*vNl=MsuZ1G43Z1m*YfJd3Q(mK;xG3`=VKEd=! zxoq^eSL`0{(T5CuXVkFMjG83U?H=R>d9L+v(r6X-)=owGi%kDE1k}QWxuRX=`kgbs z0DLX;`uxmV?=rB{BNox7Q5<#USl4Y}hTo8a;C#;RzHI{i-Vi)orIKkQ$)Ax1hKdEx zvR=`zwvju)E8JPTQnzZICs%eCi@*ns;ktL4`8U27dP0zb%EY3p-&I%mCYvIrD*$}h?PN9({?OB+B-9i2Ob8pm11T&dr z5{<^vo(EW123^JZ7MU8-kK4{sz=cFJ(rsFjTG!=SJ@+Q7)f|D%K)20x3{mBgwkyPTt4d(lM3WFP%(BHV0%>j3?X` z@^wa9<(akX0{gf7LC-_Nr3>FzV%u4f5j#e~RmNyHs4<7xudobv!t5t0D9qNjrN?Y$ zJj87DUQjwK6c;+)Bq z7@}$jW&&7NcKrr~#NCM2Whgd+!OUo2$1Bjc{tGa+?@adz3l4EY9O&IeTNf5x7b{$j z@20oryMLMsj@S#Wsye?zfvqND#$C^kW^&A20){dI==Z)tV~o7n%yH2ai2cERio zBnh)C`2Fu__Hvjr1Uu7=>JmcsO;%vlD%QT~gOcd3e9fcZ_sHep94w8DOsQ7xEzadq zE}W6udDehS-PVUNq1)WFb|hC4t&oPnA`BK2?g$oa0mTcHvV* zx<=UX{oaX7rIND%ws_S$g|I7k_+`ecCZqHc%@yX5E9P}w&!|!}x)0PS&3zdPH2+iMco`jK;o}mo!7%Db>*9~3bl~*uZ4qN5 zt+yc#)Tg)>Y^j?c73AYnZM>@?AnY(>nYcz`;8I?Rht-hu8^|JOV>_$rQZV>vTi0nG-yGGptXv|;wm0#{SF!Qwa9;Mla+N;@&n9-aYAc=9`!XZ#E-JuU}&&} z*hVGw%SJ$jkX4Ion@5!u$|_wLCwd~_X^xdC084yGQ1q|yDu0=hoy1pQr25c`7VlNt zjIo2_7%RG$|4`Q#P+L6_)%I3(d)C)1ju%lmrwsOHC9S z!a)(Oy5$I4OScXNc-V$MMiY~!nZSY#DM2_`!y(bATE{kmbK?%zf}u|gsTAypp?sUD zMPRMcNf*mGX6E3458Ca&sTec(C7z-OMV_o7e003FYSqv|a%a;Saa?qwgSRJ+jy%~5 zdGQV6YM=tO)z~}+HV%uqBwYmTQcG9;CK#37$|77V%?!{AX=&1xHcx7|JYBu)1h;({aXSm_NmrMCvQzPgReYi9#(n18hSbF%?$C;Y z#J7QW5FgMZYnPjOlC6{@J%HbgA9F_PqJIY254D{j&Bsd~Z+KePxmuW{&W~3Y($(+K zc>vwbdUK3AP)i5U(ldj}hy5?JS#rlkv=_()XS1I=bPy&4Tc4RZ zs6-|Txp3=F4JPV3!P^9ua;SnASibg86If>dBNSL3{D=+|h-!pV&uXL)_e)<1F>O$~ ztez9aAtP<)(bv>ZWypFNlEbJjqpGS7q#ySKsuCAHku2V7{kr<|o1u`lbFu8?YpOE$ zpsc!0?}`{w+r=-SrAlG?Hsq>15j;!=MYHyYWO0&cp(l%@j7yox{~$W~OrJZA{mi%vF*tDaiL`Cg6nnoH zHlp4c5t$vYII1CaznL(Os1oMuL`XTbmKnYTH*1U{vm&jBkdSln+4R5X;`5?RRAnN} z=G!y;Rdr0wyg?F_d^f&5o9mK!zCCZx$olr2Eu!_Ge0zv5L0_?rUG_I&;%@wPE|UdC zw$pTR(~Gr~)Qpzn?D#No^%gj4=H$H2FDY{i_QYY3Q%BFWbW@ z^Xs~=G~Oq0)w$tZx+zcK#{q)b>7Hk9q+H`%bkbKLA#)X7g4>jTwSY)bRULz0O7vOU zau1mby`(-<(AQ{_<^f+Lg1*r=_f};H?{Dy`9cjhSSMfg_ z4-wMo;`aaO;&liJtya8?SL+K5O@2c&pb)l;$bP6x4Pe^5zfv&+HGd_=#)B?wV`(F> zCpVgm?!Ns&p^xohCxJpcP2fNrY5k@ZdccgUf#WbYtW-=i6`rN4gDOZBWjxAa71ape zT!~9<`Wm*v-*+E32oKG5ShKWWATF(>)0wUO!xYp}WNM?Fuxv9=a)KLzDb%B#?WNM~ zadexoY1U~d#_gTZqh)l?<5RkN0XCGR{GhT~t|Ck52Q`SMv`^gKV=Y(#Z`uwcj$X4 zq1ad^hHWer$+fEvB%TLD_z}k6iz>Uygk$j+HFcsCN#uUhD zux($$+z{HKY%W_q9hFE>vA|3rjtZ( z2Ct+KfeCe<%VS%YrRq^mp|SMTvF`qHY+IzCmUH4$q%jf>#$gL3j~j$lUzF_tbv^yG zW=gxE%H#G6zI{$Yj7=VCO@OQqs>C+mRV*7wciYjxV`;Wnsa$o_D;)RiPtQu$pZjFp z9@f^8W{`Z`KB$~BBLH2G4awaFp;3SKAP?IT)V#H|ViXORQ&SxocMK>jh-={XGPuxs z)~=q#%cVKXlP8v%S)nA2lC{t8%!;x6rrKtaPollX4pl)KiX}gm1TM7X3?xrN%9f73 zC@R!*4>8rUG%SwHI9*jywM{;i7|uYU$2X*JvI?+OU@mc;zsnXW%eLwTuZ|w*G*m4( zo1P!^vRUt>Yc<6WK|d=d;3C>vOo>`bJV*81&T~WRo{Cu%lyu*^3Hz5+$s3TCWAwvn zqEn4XG16~;c5k*bDK*088+O02^HaGAcuOpqaX*}(179{wIq6DL9Up^MGz(xdEE7nx zm0&7JA%1n&N=sDv7IqtGL0Hu?S2gl>x-Ho$QYP;5kL5hx%HUx)EpycZ@83W&2v=8Z z$Tel0JO)|8Ag!3@NZTgf1omcOG-%d3m92CXtTJ$IB996?vaqwl^9@b4Wz?zAAwMpQ zw4A2gEHo|NSZWw*Xptj`;qi5;Xc1acj3{Y+8q%@y82-;Csm79Izlv0;oA*tj^pr8z##cZ8m)NUOr`Abol~ z$*N5$`g1=t(f#RWWgn+!vI`9EA^4A83PeCCp+qb39%e&zBB)8ygvK_Y>PnZ;EAsnh! zkzO67|JJ7qA1wXgAia(BhVGW?Z7ry#K79`3%iC+gD>e>xidI zjL{BL8iSi<7#`Amza#~AlHK0@5SDKP3R!$`L(I?4%RU%2MC5a`Y8 z;(f%^fKDPB%mS9s-}hveph02gQVuWjQ@FL+#FI&&;IHhiMU$MGK@=J!D!F0c8M z*G9N`i(+q5ODz{wlzxe+vNYm`+@Vp-G~ygf-MCUCoajd30$ma#lJ_y z<|sOc`wR<~K(-)QtsZ38V$u8`gG`WBmx8YNNn0JcezKq;{rM0iPQjsX_^G8YDZ6y? z?VUQASQ&Qmte}&!!l||Y`%e1!bm4l)q_BqBd_HarCzeJ&fojCk5*Q{U@Os%SS%yt7 zb0;eVNkbi3u3>{n+=%_Oq+225O47Pkj*xvgZi_aMYNXR#NCE=>a^Xi|Gt2rrB)Io5 zBl-K6$@BB zn=JAzEU&}M5N#j(NJH`q+zC5NO|M4&()zj)X^*{!2MZ9kY<)GPDp+3{jzn=g>nq>* zanr@XHE>4Iv_GFEBH*ah`%eW0QBZy!dfk1^bBED`NZShagUn)}^(^eMNW`od=~YHJ z^b6nmkJ3jd2S|j_pD{I_UG&KRBiUodT8z3?U89)UsNChohGTTke$DGgqmg9Uf6(HX zx4=W!DVX@xRI zTHrqh(=y)F^?>w=9%_P48{#S8$JnRC9{;<};#?N$3ZD8=LD$MG;hP>yJz(s{;*w}F ztAWf{Iq0{lw)yH_U4!g!-{wf$7{0lc2yK~0EqMkt(GTi*_?Zw9d{ zTYI8tBT5;waPC=lxZsxpNqjkK*}v;)aq5&XUt{7Pih_wwL3%5PN%5+#Um1}n5&N|K4<+*=1wQ#c<5t?J_0dWAcUcF^v*3txX)7N!q+Wx zL-MAIa%E5;BKAgTq|ge0$B zEI)&~M}Z8uT64>gRuSnPbXtyrQJEGnYv7x!Y#2EX2#K5Ku-qLSP`LHh;^P&9D!b>A z)>pt>Xn`QBt}PKFBZr9eyY2lXir-|GWK{V1g9IW@JkUw{_mPX;=4s@i^rm*}NOrF; z5s(BF?Ufp^(#4}3P?2au69&qg22bVgol*gSk-J!sHo%?C6Vn{a>~GRa9liG;u&tan z>zg`JMW()-3-3!1WyAcT|fGnCi`=-Ak2EJ{jbc1Ua z1M*w`EadiTvX4rgAlK!ga^|opXIc=M3-;l_BIiC^WjT<Ljk7`q_)s-m-&fp;hyxu8usWwYY^2G=wrdYtO8w5>at7+ z8~TBCI)f=>1rZxZ@{6~{oyw!P#g)mwduD}Y%G%*7l+)~Qfz&EHTq=e=4y8R+=}to+ z!Q!?w^K&|sstv;h&XTydMatn7CZY#}xt9ZQ!kMEPg`novOwZaehE3599@}KVMV(7eDZkZ z`Y?UsOIPMc{?o!$InBElA2s!2KCT{e>vLY9xe`8QWB~B;*f_mvFkU}*>-w-H{eE4N z(zajM%ma;&d_^sUr}5qIRu*!~5VM0P6&c6kaeY+XNmhF^BPeja_Y-Qo$UM4^X#rg| z0t20xf1+}HcC}CL9VTn(%nb7C`IWJ%To+(Xnelwq`tM@$Gkb3! zFTEA)V`*=lvYiyy3=1GzTMP#rk*rzD5zLaByiLsMHv-^u@B8+AXJ`UAha4+}x3R0t zBuIt0V*W zKAXfSVLV1=#6h0pZZZQbq9n~mT0dq9K(cS)3uw5{$}FOXJ#zhD1mOdgZYC!WoiTI- z-EATLh_vd6QKm%FbN>FPzpKDUtl^Y`UCc)qUGAVE&e)PjtFCv(-6=5{m!lD_cpB_w z3H0hUK)j`856mza@NvCP!yFaEt^Ot{*NSBND{`PU>z)HK&hmC|urG0c*k3W}I0+rx zcbAKwAA=oo1TBghKpeqk?K07{xiyEuJ7I47siG3MOs^btYxA?LlX6nUzXvsN_w$Xe z24V){wka^l3rcF|(Q&+|$Ygc_Mrhq)|J`jRo{TtBf~(b@gnIoUiJKJ6Os zEEiE|21C$TXLcy^51Y-Uf|DM~!-vN3VQly?K75!EK1|d@q;#%>y0n+25_0@f*IjrbogalQZ_vj9&B1~cpyZ|!vm!A zHwEHKO0$1`q{dsDT*B38l&dsYxOeIL2wX^#?=ypQVE11WF8@<8R7{KX3q;0B3=k)}7BCwRY@6nTtjt*LR z9VR=F7dr8yzvi&=y%ix=DzGCTAJ6-^Jp1t{>PI(xM1>~O#a7mDV9(}AH&Brq%MRQ5 zCtzI5mxbECD5?Nc6#1@5zdoA()`jdLzZy%vKd0T&B;x8~j!4@t{8LflyySwaRa^ve zAJ>4~n>gjZ9*M*5D@;Uafper}0wa)GJ8DIwJdOU?p0(&WNH!lyNDxzcUXHt6us%-cI{PRX7 z{}x2|uUA-}S1mHM1r4i9E(&fV&hsy+t7u~A!I}KsuXvA_KjsjnF$7w8`!09V8uVi&wr48^WYRq?A@l zDJ|y?7!iJiVhe_M7K$j{w`J^jwk74>44x|8EA}+B!cAqhD=-F^Ea&;0{gFO1zanql z_Rtszo(G8oU8{98(mDpfW(F8^o5@_@)|Jp0eTOJ4oIg-0ubFyVeWhk6x$xPql7}kl~s^*FJJvRoFvtbl{bUzDquzdfW zLLJN@fw@cawk0ue7&$HT zApI8A#?tf5r3l}%QyFnRibga2@zw*ZGXjJD6v6=x?v-&R$a+H{_2C+G-)|Xc0}UQI zHcBazV~Z->%IOj#bxvi*2onuMaf=G)K1s%>Bo(+l|KYta$o4hs{0<#|EMX=0V(n} zo)JUcnZs=%KE zElbVa|8@wbq~HFa5AKH7q))MW(@=uWuSk9h=FUJ^JD&v!nSq3+i_ce^5SWl(h3)gH zCg_e(#eMwuJ?Ptd_td_jAkc0T0U2^<2ey)OcN3VWndnEu_!7rbcT{K@K{^f!w%>&V zkPfZ3ZluGnPlKVK=LKtnK`dthWWHlGM9y)VFLve&GG~ev;&!7MG7gGT`qSl%CSCo+ zY~!7#l>P~E+AF31rBSE*p5pWDcr4@t)0IOY@!N;#;&)Eq#5VIFRLE?T7_a$BI*&a7 z%hpI;#YDQJDd9hJ+si#_-#$of%022RvQlj=vy2`+5ERTbSpy!ID+wP2wP0d@ki&m- zB_(OlJK}1svp%a(%2cr&IUvzS++`?K74Dd9}wqL1s;% za&i~!`wi()CGID^vbm*io8%>$_3N%I*88|MNMuTXySRvTWaQvp2zU1lhP1m2 zK$9Rxi{;>cC4$fSq~u*BWiI6(H@&C!cAEhdnDW6|egu*o!P?zLUMVp^*H!cheg_A? zL-iYJTgksUIcB+~Nv`#B%y0ZtQR3qNAjhZ+|5tJhLW{@mUF4bMZsnO}G?*DDl;2gJ zIfG=AXRcaexPI)TAs#=Aw(9XXrlOL&GMA$0=E*ae-{?J;kP-gmz1Jeye1;#Xk6so_ zzNjdKY_=6&b`n$y!34fmM(4Wo!NFll)E*?)3dJkk8-MZI*l$%LeXg{O>cgM#D85m$ zG9t`+H~pugbWNlAcwqJ;79ADz0}eV6(7vD!*W6OL%EtaDSSCt<%|gjQZq@7G#<3?Du%@0t*3*;O7Iy zwtNtCv-gw_%$VMo#?!^4hZ7%H^#viF;5p5KxN<(;*>urF&@!%!EEw&sYGaeyX zB#)(9?G}Z=frwr)MR1ACkaR0XMh3VR=8#dzj|e;^QSSk)fzaFJBKP}Zu|+7t3dkh} zfQ#+qodk%rh_pzGtUv+aE3ABpkO{j!cpl$Kl{4kf!Gt8&sc&}6`Xict{;xUeZlq3n ze{hFQ?Rmjn&jravawk~TE_z++eo2A0bxj{AE!|E3u=}k?C6`HrUL&Y}VVL!T4{j-A z_C^gZxlPE>=stvPK*hUGl<-lVStxeMI1TN_syhPX`0&BNsI7}e#)iyzN|PU2Q?;>u zqkMQayKT@DlbZ3(6ubIn4-J}Q|J;v3RKU%y7clYCaHV?=G!mS?Q=~D)Q70BR`N+uG z(X*~ps?^A7;!T;!U#m@>T7<>pC4D%cQ0*m_1hV#WYDzBZeA3%Zix0KIna0hWHzc3a zn08u0r0g_YEhm#D8@9W{oP-CYy*2?tOkUH!}&~ zljYlN^|_yI{alcH1zZ?TkDo>UE_j-Kb#R2{+}~hpowIksw;%!|LDHdKbE_z!1^mjG z(Oz9!D>v8l0~M7LLjZG>42UP$>n&OznJt#POI_-|0L^CW|S7~y?RdLWk6y2bmX&O6=D&T zsJ81RwOT|5*^HHe?%brl)0ku-{pq+ED|Mws*#?i*zyb9lk=Vx%iHD}m@E=fmIGRq=I; zwNmmVbPrdd!>8eJVs)x*#q2 z$oKDX!(GM_*O;QN2Q(u2x`1HZAj&9+uX8{TO@n*SvN0y=w_#-}=mUC>PA#PS?vH^l z(?ECInP%ZQh%T_~{ia4D{07NM<#<1t$m9C$@}*E;KzVJaTPN$56C; z_lZ!nI~_9Fvb`rp;3aI-EnzSRg~-liEIAI&30a#U@aSQpf8g|m9{3Ze+x;WBCx#(h zh$R)Wm(A*CW#M<0e#v?tzxoR{ugneQ5uarFI`oZv%fmFDR|e1SPBTPdR%O^Gn;b0^ z1@UL8RA5S#>`~lHj=ox0^#TBzuH``7X>^}$)1r&acm*_yrD6Z#5shXd3_3Ny-TP1F ziKU?`Rx`{pGUG=oK;F_YubXDs*!Z?Dl3YIc_HtYr{O%+oi6?(r8lGW`vX9U*VUuvMEz6 zed}#J;w(J@yOs^U_1jbiZh@PnZq?_$XC-cV@HD{951uOBZdYTNh2 zpARl|=lfnHwWLeh5-zDFB@{%QBuaQg>WM{27rU3^g`Z0gG%T3RL4XKSp~9+E{B z@k6mE)^q>L#c)qzBYa)ta>Z-Kn7`L*)L(u^ci2S><;g|RBdkdq9xHS$#&4TmCVI11NbI;0Q=D^A4@W~Ul{HKyu15- zfERYR5Ab;BYyVzXxYD{e8!e+Ai7q7HN?R^w6O8Zvto5&1(ita^?Z=Vd^>a!4tuF4 zU&b!G`t8<_WxI;BeWB8d+&^S^^h&OF;;Ci(9+4YXTe@mm5x)#-xvT>O>56URLiFuD zuKJ!^@}cO=)Jg^vjV&7yG{lFd9d?uK9BT#Eyz* z@uT)xQL)au!uIG{kp%n(pf3oQcb;hdrrBCdGqrPwD3=GfYfkZpaSm7O(D8Bu01pGg z2PSJ1NK-`N*uXE{1Kalm(D6r}QjC8{{JS#3mQ!bK*Zv+8CPZ2lS%U`G%J`DkAl%;d z2^y697mT{7sza>$eifkA(pb$GksFSn>gH>^_VOEQBteuXf35kHy%MGEo%?%wLA20{ zy$IyfvY6v7A0)Q;UjBp@)yrPiOU|Ftv4)!WBGaGH19%BPgIUde-8$d@n{7P)?;iX}JA#f;0?`@6qbYgRBhyh+nI(_dF= z*EM@oPfv{jirKW}vDIzdY^a+2m$Ccm=cxqkODd~-_I{4mcaOjB$N3}pkagd{(k8D3 zz!7PCiwA&{Q5;4O7YTz1$M4Tw>HAoxKBl?Qb0FSw3?e(q;S(cmZ&N&T1k682-|7+B zawDFeAV=qKp({`Q+3KtQRL073x|^Nv@sZXIHk7_^(bmrMeb7mUV9ANJl6lsI>Sjt8 zJoT=x?;h&I;!*k@MY|w@z%la}jk@8iNZR%BRYoLV@Y}Wl-5M~W)o2qV#he*w>jkz~ zeQ3df;s+bPTgab=z@`6(8$a)=9|B623J`moaIegDAUtX*zUsU7 zT@BUG%riv2>2l@3fN6j2n-I*@5M4jNY`7O4mJK&q0=wigNP%h&J#9jJn|zjLbwXsc zImqoUaVkU%N}S2sE)f}@bg}Mh6$N}$6?CV7-rq)iACpuJS3@@wBVqlJqbefT?@LV? ztzW;+wTe)tET`N1k|K#Qzj=nwoR8rjYtBgGb804aI#sWTe|Hy>IMV$E|GI|sNuA%Y z(bjgIv&(RU!RFD$orfKT2K9sfVJbf9_d!J=6@2H8EEQbSAVUF7h!nD@d4*PFlI5qt+$7#n}MV+)8v2rf#|1agy~PWhfgD-o@Q?Xq| z5N8|tg~&+3+N}cFtnd6u+f&!{m#<6`B~AL;TyY3j*VPMOOzxQBj8K951FEec+i09v z`!nutjh)6|PPoBSB-nr4?0$Wr0ljsjxMI5a&lQ6Tba6ZKcIS}x2J8vVn|K(%M0+p zb1TMY?j|wIuQfH5%9dFS@?O%Ol@Ib7$_fh4{yMuvzU*rBa>9?ah=Er#bu=VH$IEbV zS}4JD;4hFJcy`s?sfI&&!MbSV!Nv+J)G#&G?mA66J1=`eiJ@%QExwN?yNNjHFJAu0 z45e2_2f}Fbt;<<*ozJz4-c|zZ2MpF6+ZE)cBi&;o;MgB+A@scOhHVn{jh}*0vHt#@ zDDNNckrfFL!3T95PjIE58Eun=RoNgqU$bwTf8iu`o%8@aUPkcst{_vyu;kS<=s zt%e*z(F)qqa}R|g(#S^K(){x*gtEBH}0Oa%)FG^i1>U$F9As5Ks@OA8t_bXk?&2I~5t| zy^SLSXWE&m$iO?ylOQti9&pm8i z;E3VO_s)fjConY;mMJJJWo|c5fuEWt^J!DWp{jw!2 zoUY6-^~vwkOI7tFlDbM589sS^G}0I(go5>}9<=Nj6uII1 zbX8Q$z>kV-+A0AK=vH{$dXr+slKJk^Z3g575mqPYUXHn{(8+< zz)r^e57~*gU)E;%Nh<@-((i`!@yJ&MTJx1=Sx4(HvaExlm|S&(aJHGk3K`qZZ?5nE z6SkpyU+|yRx~{dg44h2d5w947jaPKx4d@NdwlE8=p03DyF2xEPuk~-a6+q*=S0^d*Lk}Bdy=K7{yVzf zADX+0+ke5zci?=QMHvo+js0E+Wwh4;7i?%x5Qu_P<9Wx@_Rk#-hUg=X)Vp8 zii}e|$@PAg-CoE+nNpH$Uh?Bz=E$rX%W+=t=kiL(7iS$qaLBubn&|finrPM z>yplKx%D3s9wU5So^3SSl@UA$=?pD2*{@~``;%YlaG+cBFBH<6HzKWRQ00u&)gR{M z;XtJ2PRtGN%%Eo<8CePBx*>l1=gPL+@|A@P(?K`VGkF)0_9D0bb%7;M()=Hbw4MgF zJP(_{43TygV+rgH(8V&|3Nl6)k!J&Xl-Ej@C~f{(9#IP9*~>)T|E~zsPVy}Mdzw1^ zKt-cMdG=8u1!7JOoD7fX-OIDyJ|J|}#D%jPX~jif$l>KxM3JrTmVcPM`a=lCAX%V2 zGkMx91zUfel~=bJ#KcgLS0~Uf54V8cy%MggtlS)h-eoQzU)Z({rt?v&CQq)tm^L+< zBi{_Do?o90HJ^ucubv#9?rl~Ca92o9(LF+ed%7pt^{AklcPl;J6G1Hx(pCm(a1Srf z9^^kj_ijBaOZPUr`#2AhlV>-(*ho+J-T;CUU83;&s&($$xBfeM_JFJN<=Ov4_eQPz z@8sEDT;phdD%_uktb}unmuHI)-9M{`?hMNVXL(qz|GT8xb>1GCQH)bo{>J`V`CC0s z3H!ZN`&;G-_*=4jAHJT^%|+rOrns?mQ2QHsg&S%TeNnUukbBOzv&g;PJwGfTx!1c(*;>*dcF-FEshr`t$+vjaeo={l zrCeTXwNpG+&m~b>8k4%KmPXEP?y9vOtK}zXaT9N_dhm^eiC6CxC}{6!xi@U>g-9Bu z>Hgo|Z;;Nz=j;<0BsC@ZO2of2Qn-6GfygLFy}_2PD%ph`2Jr9boT>J*^r?_l(fN{! ze#DG>Z&h~2!R}@{T~M_mlYB4Fz5t>J&ZrpCw}qQoZi&(2^=K3BM%h_f7HiiERFlY9 zr#m^9)}EI+MK#%9cK^-155ub5v|KgAsb-w7qiO|}P(!Bc-CfGZQX|K+}-VPv32qu z-}VVr)L~yaJ9N5~$7MOo{O*0cepzD8!G25aA&C=KYPuG)Y^ZFyEiMnmZ)z%V`(b>J zJc;w^yO5~lqWa|ft*a8>$jIhk_@q<*I=I}tV=s0wYWG|$4K4EIeyywGqe+XO9GSnd z<%>PzYg)c2kH3^2u@xVd$tx7*WnWG&#;=-RPGKSQ?WeFk%ck5m*Ul4x`ps`L^5pQs zp?k$kutpm`>H93%L8MZ)soR`W28|ftl+r;3Pt_sDu`b)NfU!OB5oe3I|0l?qIfRTM zymX`Aw%EXr-7w7Co#;4kGQ`Zc$iWaVY47~y&iKQA36|E>bkRD2s;|J5oiEpko(Oy* zPhyFP@6$eXFZDb=R?wjDTdF<`hdH)a7EOM&^F5niU{Xp$?BOmd?7Rj2%AkHE#o~9QM{FBfH2K45 z^B3ibn}htZfotbpV6f@`quT@50@M zJqvq_`A4&mY&ClSeDRc0k!6@q%p7~pLi>REM02JWF&`9_2kcZucaKXNgl-nR^m!Kq zRr%Ns-lLf6g58!S5~6u7#}e^I@H~L$XZ5T=;A8Xvc{@o~ z;_vS5S5gy=!7cN6V;(D1`fbX*GQ>{M+d=05_m7}CWoM$Yq z??Zi&IaXD5fReGAm7|hx#JuIjj9Qa^!hA>%)_j?+;SGRU{b9Ne$Ea=7A0FZXwqh#m zFSoEaGvva-k(LVK0(aJ*p6+)~L;9$8yOktjiN4?BoU>F%&B`lp(KK6yX04E`t5~jY zf=%O7NI-4KS}Y>dk0!<4_o9F=86@azpf;#l{p}1QjYogs*gU^Fw_>7I;!VtO{I8p( zYQ6gta}{i>-(+rRc{}SR*l}P@YpE@yX2E@?NEFoPx%_v3*&7i}6YdUr88HH;*+&b) zx_p-8k?K0K==;A8&*}GrgESYUm4|Zf@%{rS{a}5bD9~}DL;-2*RCFOGZ^;3=T|JAB zGz?N7@bjF7TR1xa=fGP9 zKa^V}v90d4mm~#$I4b!s0(()qp@tBuoWHH!KGPJ6SIB2t>?33Z9s7|X@p|SKvT8pg ztN&%uC8z&2@2dZK>#!$UGEB{4s&i=S4O51o;IR-Z`z^bl@g}><5am`r!Y{oY>1yK; zb!1NmTO@=QXa~ehS=&sB?g1*h=Y@s4p*Y8xgzF2t8_@MKSAR}1=40*>%?oO;`LZcx zHlLL;ATub)Q>@t}r987wkaC<%f22e+8*l*Egf+TD-X$$vU5TxZ7^V;<;sFx}+Y42j z7?vu(@nzax$cym{cO;83Pkv!Lc*s?QB_NN4BKCVShQE^dedv#5hhN4dSBusswYA}H zN7xkKV=t8(GPN_ZP)jRw=$qD=5p*WGk?yea3f$3jXWV&n09cnX$%3pjl6=`5>bx^= zsX*_VvF(HC3Djh;6L0eLMa1FT&-yKFEp6$?3)k@vro!aEWCZ8B1SU7+Cf;yBl6Gm?0M=<}+a@ z-XhKA51$c-4$fl*TlE!O%Lmh_Gtzq-DJDgsZPrUYf)kmUHi+=4VPq$ zsGUc*h`*EEUB9gPHVl+qZpHG?yL?{T#@k6=3grdcqL%E`kX!;X+3dT$vDd0cz4(@q=2-sC8QbK}~KAb!UX0Ov;F=DrC<15r-a$QCXQpuNrANCmacCzlJtbG2|1_36pXsSaalPM-s} znA6_9G^fW`5Y;`L({E(7n-t26eqJfE(fx`dn%78Mn;Ol{?FM%)kj&0)M1A*j`z!!j zb92tjWK(-HZjzbTMR&9MOhbCAqTB!_9EBU`-jTEgtS1NK>0$%a&1Q%UC$qtLLo~lhvLzD!G_bdE5bFK8|Cvv^^ls=HxHKM|pPJTn~fQVbM~kUa(6?YBWqO zbK7L=#SnqEADAeTZ`RIb$|RDCl(EU{#%_edN=YV#1_48o~s;Yc}lAA$9fBeacId{$2c9C3ZgVjPAHJ(6uH zklUufodMnIe2EpE#Sbt4Z=EleDq8-++$2lRl!2BHny9!=6{7_Z>9${mIeB{XQx@*& z{##NSIYK_!|JsA>S?Kf7NX3>iHhdVbhb~-PgWbb#OQuU5#Lh1JMPQ5EOj#Tj+-B5j zn;34HlCN@oI$jYA?DX4QZLPP{>sWy9Zj&@*xda9ik!63cPj)>cU)8F04TOO$>HJ=> z{t&tvZI|Q-GIe*a!kN>GO94_;IcC%ykMvYOMzZEB)Md_8 zzs=nf^_{ao1t8AY82)DCubd$yLV1*hejk$*t+5sHeRnp`PrexOovpkN0qRwSesUYL zlG77cWhJLg-V-E#qNboxgB%|;B4J6b*-)+Btc-LJ^uo&z>lSKl6!#08Fj=0iYLYaO z*=e(hY=1_CM&>&r0Tf^gP889=m$6-xtrrq`%6HA z$hMwjz@NZ*I9&KutDWIoFFJaCrN0Snn#^RZ+~Vywn#hiSS}ZbRflirhCX3k_)Q4jS z!P7ahwgaVz_lAKRN2RYQbVJBPvs-;(H%~?6cpC)FhddE`O z6I$Ke)SZ9F*w{~FRINuJz+Tv}nW6 z(K~_(mD&9VnUA@P0DpMSlA8VJ6q&8r?KpZb8tCjD>JQ9)EOkMNHnur~{ZV}o2uNsd z@+czZ0a6nWA;cpc{z@#l2c2B{1yh!MRag%pCL`ph^HcH5+Ow-V>X+%41L7vQVo&&r~omzI} z$g}DLxgmKu3HKD+UXsj;S;Ir7b(&jvthKDYcjY2 ze+Xc>^`aM6ER1}3rj`SIP)?cxxQeG{{O7Vp#6_)B!=X{=b?Pt|okv9Qz5k=?m1p~>zAhQOX@BvU*VpX{QV(atYeLDEmY#(&eTbG=*V|bq zz;kPydx_61w-aSm9m1bcsiFn7LmJB>b<53NxMoY@gO<;_;=hPp_>oK-HA^QIjY=K$ zk=j-({oXLC-vDN`b4zVx!H5E^vw-pD^XVFxs+*oh>rq!D3-aSx>#u)yjF^e&GV0mR z`xD>|r!=mubT5A-Q%v`1OBer^!a2Y~CxmF;|JdfiW;cEGWMxZD9l+FrLq-zQQ!CxI zR_6!_e9&0)A=dstL;AleL%NpyB$RjZkN`|$#T~^4!PEi75o4xF>{#Anz59*X&EBMf|u ze>K=litn2xf!X>fIhZ3ayI(V3u{Glh*~+obHB&9n^6Tb}aNS^~Qcc|_V0Y^#t#xB7 zWS4cLeJ#FPbbirB?KBXJl zbE(I^$bvl#_onTghwYN5TCOcANOV%8fn+SW+>k!}>}~KYyWfQo4v;afp~g)f&Jl>3 zB|xuyQqgItqc(;$2WWjQIy)$x_$#C}L}w9A45XcNsI-tu+hgge#NU2}C79;4RB~g@l)@AdR!^gw)#}eo8&J%I}wGW#7sH%hTgt`cTXby?GP=?Ej^87dikaSaF^vM%4r+^Oai1pOlvdM=o)Haka@8z>A zv+pcl7Pn75m(=WfI?Je~*;mS2cA#m9%_71v{kVAj)?TKCluz+Ak6$+A{2bX^nfOp- zuPJun3fpv8e$`24k#V2=#YBq3Bw3c4E-b6m`)(Y-gY+I}wt0B8LB{VL0yAv*6@Tk| zCWpVV)U$Vw4@slQ=lsxby7zcjj2~`SXk;phG?qO|9aBgq#|#&^xui z1?15D6IZ>?LcMj3hWa#Jz!8)~K1G%^-~V)V>RNEKoP4!i2y`9n6roM3*s^FDKNKHZ z%C*_CWqMJnYb^eccC-sBdYxp`*G< zLN9P9K4}wusyD=8_8vIeM~lBsd1Z!W5F?UX2tXvO!qaomz*hmF5$v<5y5!0{n#O&! zk219i%N>8HWqZH)pXl+!O;XJK{KEP7q|;9^!Cl}9_=uCaa6;nncg8~|`fzFCJz4th zGtSJuGoXJ4Pz~mF5xDv@YkG8g62Yw}*fpk+AHkmKpM_?R)!vatvv`v;_aA^ZBwzZVR@=eb}@B8?pT1 z5wRK|X&a;5?^ryv!EZF{Y?2Jz!jZ1gQEy7T%M#xM6o!W~PhuW4DI7%pRxBj}VuJ*T zSFM@^7OJgM-)g&7tA_aVZa#9EB=O^8Eoey%^bcbbnlwX;nw+Ob#L^_U{~J@TgDq1KEFCnmVTl?WRUDdP7Y| z!o?u5#2*47z_y!z8mJWX`mu=t-wQ04uUbCTL`3-y`Mvedo-ZEqNb;sia37Xzw>m#Jyo=D6v?%z7{iDU_8nfH zK&?`Tdq=I=H>cz}+#|2UrLqAu(*T;nvf8f3au}RL`sSFv%nolDfvP$P-AR;Ewtz*x z-p5X{de6wK_s>@_oIe1aM@eK~PSnZWN}`|4pYJ4Jo`uWU5&{d>CtsRdPF5D7>GNX( z!x_f*mJcfP+&5TA^a_<|!Jk0B1G2mEi9JIaw8-5HSMYd#;i}B? zC-ma^9cLD~z=zoYNZ;2F;jA$4W?HFE_?4$4Xkt>+(6FzNqMPVnFPmU$h=Bu%E%OnU z%63caIjPirf(a8Gi-e!U{WT7R>Jl=lA|MjV%;On)7*F1;RRoGtwj0HGCfGJD{bMgjuS(_0sw(!65F*ei( zB)I3{YppMLd0x2{movdj!~FlDf7X*kzi$1rRkq7|S|<*ju0AENl?!Rby?ww< zUEoP*Z;{Z%%OZQlA!WSQ4{q%F0cAY%GDh}DH~oy8Qhdnu(U4;3fVhF%hNcJS0HQO2 z=(x-YPhc7F>)XD+n*H9i+wZfp-^bYZ4Ucy(|0{h@R}bMM&A2kE2i1$l5uXIK9+%m$ zmIyRKduGg}Q%2WVwL|`*%uSQTUc@?n%q=yg1&Wnl8F{i7u4UsHk2c{0d9-CAUVS}C z??3d!#7D83HIw=@|FrAe`1=9h8psr_=e{-*VX(sOhcIv_*bv-Wh5x|Obk<0gCqSQ6 zt?K-1mLG)cyXAu@gkYPKxr2CLL10aU)B(^W+i0k?2Nr3$JLeB-P1|vA>LX}Tt|=dn zxgO!Gb*3eP6#gRH`bT}tieD)i0t)pYQ&MjlI-xY|1H<3D6{n`}nEdmxZfg`@w(;+U z&8~m*XD1Rj0s!<}nT*#Jd;yrV*q@mzJUHO*%_Jn@3laV4u*oL(8>lYGirh>ooP$ zmAR&-g-xlThp(^yRmmh`y)ROZ{WuZ403WCi27f|b&9G9e&go&?D!HP*WdUJDR&WH9 zoynGtvbvh+_Qb|i4~+dX`zL$BG1UU=6HPL2tY7>vpUOf%LinJ*BTgE6Yk=F_Kg4Y% zKT2^(zU{X_-N6rV2=SmV!_kj!~>Me}Xe46mW1Kx}X~`Gtkf#8S9$C0>b%KHj|tBQl6V z`73%rO@xhG7Y-eiIIlz-6sjbN2G{f5v%Eh zXF_={Zsy2p{DQj3lh<$`Pgi_QtmchLjqa;3q5344v$XRYtY`PU377@LQbn_BXN=H+ zs=^UrksolTFMeKqs@JH<{0+ml7L6}S{H?aR>*&Oua*=$+<|keJ>$lZ;Z6J69M!I@( z9u%Iwkl8@%4i<724MIGt`7jRoud86UaIt)W;}1rjj1|Jq?j_1W=RxjB-#?xBqL260 z&KRlt;5fh*KZ=euMCNDc*o2bAn&!`rjNbpt1el1WE5 z4?znZUYIyIb0Ud({6*&#niQ+)P|HlmWUag<_p@yUyeMmQEa~2 z*In;Va&Z@7i7Un$EU5q);C5sHvn7;jbbh-cH@~BeJ$>$-r=+n_ZOm7TaA?(X-Drt> z{F!Wp^|=ZcwePNc$!^MjdV99~p8s8Wg%)90-P-?DGL0Y53M_}gfOg;hjNO#K2!a`u zPv(~o(Xp%nqqmG4l?|yg%C+a{>0f=S&jQI0aFTiij1}=cQuQ(zz)8G?1L1{`C4SP} z-n1-ZEB=V|HNI~Q!=5{k_P{R;IwH@yzct;z;CAsqfcddiHD74Aw@LR?$~zlE{4wjAXpgr6CPqHvhvIF8f$j66GCTWF(uTkm2R%v3Ml;LVmCm}K41@^d4h4RO+^9-d1n2{g^ zQJz`x&>w*r>FTeZ>6K@z()FcKMgcg&@yL|A)jLtxW`)Mj+F<)CFsnnXPpM75kfYc5 zR|NF>YazYvzZ1Pq46IiTW=?(+R^9qVc54Lt^Zr7PYC zfz#b(dUO0}^ISzp?Q#c;c0xqJD7S!RC)DV+?_}@_tR(@qG*hkCVj=Bk;U=K5wumc? zybm5l+T>c&Ok9bA#543JkqYiZXlWvb-k&hHsri#36ZjQho#Si4R)ERogNgD6F2Hsn z4dvD<5Ue%(I#3o60m_Ko;KNSvOMJIJHKrRrj98loyK;^KG2I7vk|t36a;7Ly(=Y+1 z+}-zQ+iEEVID!2^i=!kLQnXIaJ1`ZTI6laJS=I#MEhgPwO{te5~g$1L@2rk=gMRXuFMC0(G_oYyvOA zUYlFb{{jEy_nyC|!T*D=TVrD!9Sv~~fAj#`Yo1EWX*gZI`uoWFiVDcA#4W#AT~!5qM@LnYR$db*>>g$dF{4YTa`XWbT-AYr zC0y^&|8(CIA&p)`@y>;CUVlv^tNPQ`Nc&i{Ds|6^Sof0WX8d83)>yiR(|E_{uFwN5``ylGu1aSmZnlP z7`+(Sn%qUd7T6H&>HaTtYy)w{lqC7MaE7#*MzJ!u2M+WN&DXomP!v$P1lYzP_XhVP zM7R2y#oE8S9QC131-iyXA{n>VRU8s&`+$-hBrQWdaWAqn%ANwJRF?*NxSL86Mj)@N z?2%JJBCU#3O*o6mSJ$Ub4)m5QN)j)kwsM@?@CfFS^X*dAa$9;vG`JO%g`Y;HxwopDy!TrO^_dG61~& z59bnQS1!_U8=#0>-#g6j!%gPugG_M0WPNh`+`b0k?w4UDei}>3#%I%qhKD~a9Yl12 zkMIE8qF7FtSsqx3brl167@&tr9_SKi#RGm%pcN0clwv%@lmZGw8}%@jhp~DX&%=0Q z2~CTV9P#UW^LS7J2j5dMyqHz-s4<~&05O#DkBMElN+!Am?-W<9;KHYa@Ban(UHCHN zq8}KG1=wwD*g|eO1Sz;fB5Gu3k=q^}I*l>0fi!MQl<0W%na$&yp^5Apu7#9tu>U%32OyzCv9%#v~*0 zzBFJv>E1qQ9o{<94k^9IdR=!5<5}=tvF5ncmKNs|3h}B!Qa{9xYra5NE*4WSw>gaq zXvP@V7{;~U-FJ`go9)ZH6M56P07zS^XDw?>eNiX86hb$EYifkX+0*qQcjwyNc#MZp zXFrkUKVxqUB3CD;TP?}ye^+J6>F@dkk{%C=VeNpoPnynY%X>p{oti+e`?R3 zdz`?|y+1T=(vWw0V4wEzoBwu<45a^@uT7EB8cNWKNNZo_?5S^A$?5`1#)wCy43foS z$)1r`o9Waw6zGb7?Wq%e&Nb|8<#G)#iL@@^Luy37xviF={}W`$K_EH2AFhCSR^*yq z62C^!S4?CapxotvfEJy?WU@i| zL3yIK^jMWzI-(38f#WEgSX!UF9Hq6_j$GM^{o@hpn{ITTF;8$wjbkM161_WX+GDA&3dbR(oT-J* z3^iND6lcwE$+`#=<8E3-$S|Zw)+di4Et`^^fA4a+n&|`oX*QNR&)Pb=bA;zl@^lXI zUaO?rpoRAbHzYr4o?6DrIWGPZ?w({1uwL!bM=PP0>3}Ig*4NDWl3Ut!VSIkPk-&@^ z_#A^f|5N|dYfIfD1J!?9zpMWWmCRqi=2My*N3edw-bo5Oydn9amTyDq@`CtEpFbGL z!W_LZ0>WYghwyKf;jp{^IrAT&^2TvmPYvm#>*{a^lf>qXKr$-f|!xRTl!t&DahIJ zjhXwpR*daIP~Q~{Upbh<4?v2Cjyto z0dmsq=2Mn~)24QOFv>F{F`ET+xArXDTHChbQ2g+6O)@*-vh)6`gcHxP)a>nhsdMb# z;)|i*XV~HAe77Et{Q*hor~DO9vI;(fO99G31Y7#Z{~9nqC8U%LfQuvtw$3 zdUkOB5W+^Ik6BVs<>+4(DqwbEe_yXZw!pSe0O!!Eat!ur5(0P#{V)Iz4zrEy)F5UEIPWRem~O zFf?<~4df|S5I+rMjdH9MOZTA8lMF9vkwd}WN^CCdH4YgQn{+s#1+Yx_Ln-3~Li+fX zl6&kd#aJkfnYO2_XqUNe?Jbgj8Y%{7U57B8Cw|1Lj%HU(I9^&FjD=Kp?(Fl+;C9@m zr*t&1+)Iz<{;}SDIxqbA+gKW-B_dJPt!7qi8%*=Hco>KgnCZdok(Td9Gw-Nnw)eM9 zoHyJfr1!<=E$0+R`XXA{6;z~%A?JH3;2tOQ8)BdPX_C>U`(FDjOqnat2ayq5zH8|t zAaGyev3_%&r0A{cGf9WYYJTiKpgvF~oYCBKdi(nwu@c(7jsWfMpZhcJzu{Mq%2{o| zjVPEqu~@ZyfZ`X_a>6OpqJ#ccO9G%x?5!*-$YR@(=v!!w)`S1W+MCBmRo(yp8AxQn z;Ef8JD(X~Yg$f#!XdU&1nStDnqiL(%w3fEEAMNT^ z1XN7ef=d$iVH1nb8fOCYCG1@0`ncDc>1n@Zzubu& zXu!W-eu2`)yMSnXq7)F#T1<|=lPRI5GX2Jvg*}o%Ac|?7?Kk=8#vP^`gEyQfoOsi7 zl`(z32JO4b{)1k)eKtWC0P7-?d5d#c@9vyu2|^A~eXWnN8+c=GyrF{L4FYQ>_Q}`l z97?5`PvA_D2i%|@$Ce8%aNWqD#Q^t#!3_{q(}n&&@Vn9Gg-33n2Lqu@Knn-XNi!#Z zqM^js5pHmbZHPpG46t9L6aEoQmaOTo%waZ(dBq3kJd4+tfZ+QDu#e>V- zNsf&ZHcr)uji@Llp+G-rwt;*L&0*{G;CIi3-xXmn`;>f~i$&1mEbh$HSA)KiVj(+c zL+%k*Q=^^Dbc6K+pC}m$Sq5S`pm%JbkCpsX5Q^VC3FUypqkEP=bz`mi){iwTC_bk= zsjG+5sZC2y@GR2*v@C!yyq&1FX!PMs!QzW3sGyG2HIaFSeZsy<4_rmB=5^Rc=PWuG zN#E*o>cIpThE`&*!T-8T&oR`AoVZOmWu&JozDgHpMRwI?l+4ct9d1SL%n=D({;Zf zK`N7HoTD@lO#(BL)L9x1LQYbxnJWy|vwl!S3u?>hcxJG2qz6u>eD=ii?C zg1rCtZcmVCwwJpr;$?JrLk%=5YL@`H)OYKn>HAF#BGg&N99^xpMdt!~FiL8+TW3MS zOn=8(K7vX0#?MiNBCH#veqLhTiktUI4FRdJvV zb;V@uTa&aIO>!=_L>|uNuC6ZWS^Br1R@OS)>=z!J5ryU(He>cO4JN<;V%Krkt zv1$>g6aX1h<;Z8uC7n@Q@eW{K>!WyDG|?P{@0yyZlVNkzg;VYHsmwWi77Lg`Dlq%t zKVckly*lr|t->`}d-<5h*=H5`%vZ;Fd}v1JD@*wuPPzO8nfO&hlhRLjYT%fV>__M6 z$^Ow#)#%r@8U@p+aOw&1V9tJ5RS=Ef9iX_Gpl6Tc+=O81=wdtHu zUXmBSxVaf!rL*=EVN_gA>d%0!nAyc&mtN$JLO`wJ;4Y8@9M}^XG(DJ^;E}Av*Mvpb zbv-@#E>;w3oqFfetKCaQ_aj|vu`{lB|OAoY;J7K*8dAIUpuQmtrdY72C<{ye4VfL zT#c)z*(^wY!-65dP5N~n+pWF3xjr>^2-<J&xV83iQMgH8CwL?N;)89h;Gb+g6bhQ0sf_Dg}7<;L;7Fr$q z1;A*E+O3n!T%mmDJ&Xde$$ckCWXS|&F4SIc>UTN+_(t~};thrGE1EU8xB4ErAS3q- zGQ0SS@>1s!H*y~F%-xw&3;De`Y3I^$Z+~qi^3Mk6oer1P@Q!>6 zq)+zh8r*gUCj5sgxDU1F0sIfd4l^va>K(Odx9fzZmzi0R!CGvhTz=hTaboyi5SIh{ z5hv-Esw?mdzjs=SIa@zuvHkW*+9e)Gz)D=Ac}$O($d`o`#yT{3OO)MS{cv~tqWFK3 z$t&C6aPC7j(y>%42Q4!31=Dr&DacyNNq;-mACzXxeoxvgG-SLDK}F_#Z;PQh7`6Js z!XH8jPlXQ)FE0w$k&sALhDR(Rv>trxwocTZ+~YLZVlmOc!b%pkV^Cy6x6PI};T3|W zT=sqA-S-9u(HW_3>Owcg*5i-eC*1uRY$dX=^K;>A`exj-uK)YOzd zCNRrfh_2P}!jbOv z`3WKhYl=K;zwCT}qj;>=p;EgY(|*elxdE}mF1lD5(seISfvuR5IgS7i9zJ?H^8$W* zN4HwEYq#i*OYI!kwP5qnJ9uo|ai$5Y!!l@av)?(N$XBp&J}tk)*|!mw#H8oASPwdy z+yDxhILz|b9ov4(vGQ;Ggl96*tJCRKapE#Ia#5i_khLc5Hldl~0qo_i_wfZ; zr>w_0&7>fc@H{^1dvZ=wNpLx*j}S5p=fpW%k7si0wU=LHJD$QG1XMqUQYyQs0PpNO zd)Nb@2cFCj|9CRv3X4s!66{Ot)3d^GkZ0*JHJ&}EOS>RS=#hNE@n_xwu~B@1TGRtg z3bd&}e^UTsm0O_7N^FG_QO+uIHkRak(R?rDthN&Ky`0tLY*Nk^?3Zq}Kio4jB!ht5 zrrH3RLnYO6%>v&G)ef~1-}G`0C8xWQxpf}N_h{Z{U+)6D-s6k%j7dXhwPk!HSWZ%xk z4hhCr_?&6bbyjU;baNQbh^FtpDOVZ$b)7thiq%KFU724q7=D}7C8gsjM=3O*O*alk zyVDL+z_n1rd(^X}Y~SYiGL?MUUa0hVsHWT}4XId>a$U6;F4hK%(IaRi;oePc5rAg6 z1U+~i@@7wUpcKBKNt9zK)kb~P7!8je7q;S;8RAA4Q@1s_-K?RTA6m&-4BsupHpEeF zj|FLRXRfEo3>GbWq2>TJhgCCdl4|A_dN99OGquxYgT6!QcS-eu|D^hAst>99kXyZb z=g>Z@4_L{W?6&#d6WZn9_r8kin^b+1Tm99BtnIUU?#5IcQG))N;5d}2`qwR-Zy@id zg+{f|=(gZWmHTX=%1VBl7V_2O9rdpU;8tHt_4TTrdwK=_r@_T90l(i$5+1lvJ*Tt3 zym|~%O>C-@i+gWwt(HSZAmG4?xuz6E&kO_NBXgOf-JdJ@F}R!gHcvvX%wOD;2lDT` z^AG2O3INk&`aRF)L3nK*&NmNjO_}T5@;#;)?{X}r!9z?5-Usr)`}F+#x83*0^Y4E) z?~u%EA3dQggIGZQ*!cM{g%4nIQ-&=~j7G^|UH&1NljNj$QBO<$aVE0!dP0tq`-tcC z&C{K6H;HGcuvA$g%#YzyunX)dA4BaU_7_DzxZ2bi$ zy{t}iy(q*?J=IAD=SH=i`jeiO>3(En!$oMbJnlnJcWN0)Sh~u)aHxQL;c0>?D7S(p zJs}~Ks78r5{5uU3nO`0-FF0;R1VW-|)MgTUF4wFeHwT<8L|c+N)anpIr_%H2OgQz| zpYkI&XJ}6VX25X_r>AV2Nl7)A>-L6#7=w@o6n|tGuHLxBZ2e|Mv7I4KEE*fYA-az(X z5S;M{e+1-SOR@oi^BPa_U0+ynHWF$an-dHOOD*+>`&Q@mW7*+7-uEoYC_N? zJ*75BnGa^X8JvpM{w7XPd*1C_E95MLMbAE$zpvao44^Pvvp;qia*3%UQS$~Lm@WbX zJS4C^R@22W#2E(``t_8)w}xxn_<{!qT)pB~8kfWAB=Qxvm$2vIG_s43GC(TW{-mkI zAoTSn8=>Ai^uV9un+vY`o3?PAPi4|in#%>n{rDf=pD$M8t8DX%^lxlXaEaHzjbiC++*`v@e){=jO}qL1V-3d&X&;QxFU5xHrIQ!uoxy?ub7@+(IuwhsfKB-M zim{+$*Nd=S%9KP=s0Ezgoh9?+8s|t$DOC^X4fpt)Xy!vc_-vildroGRhaZ?oqy8NGh7A%9>QIQ6|DUCfuoJ zY|84C?NSijgsDlx3jlLejP>Y-wwcPkk~mnw^@%?ImX1WYbkfkQ*ta98Cu>Boh|O=v zBWJ2K{HXmwv;BFCy(W7^Cx*oKaOy|O6;795&jt5lYpq1JhNRp2Qp^elm+mcN0B4Xu~Mw(u#b>0?qgYG^Lvv&cT=Zqk7prGLarJ`VZRE<-m~k@TDrl znajNVtWi#n%w8rUWk#fJ#Q@@HtvW+T{8GA*FTm2%UR}?-8C>Rnq}^b$o1*F4Yvu_q z>A`PpGUrQNt#J+z%cVwtS|juLjnKs^%`fi{=sOjJ_3{ueJlFHMfJdkEppvx|uU02E;M4Hjg?o3ooNJgu;sxnPeCH(T03R*D8S$>4A1N^(1y{}zR+ zyGBL&(eB7DQzRIFG3T64v6B1^h!ky!rhY5ri{d_9<$U*M&5xNC!|N_nMKGbQ7~sd6_^ zfNPs4#;s$~b(hJ#f@&DSZU0*`0=iwC3YhzL+B5Kf0r*d;7yR85yl`;IVZfJ*mROK= ze>$}Qf9G0#zpvE3V)Qp|q$5`Yw+m3o_-jDm+`dfxwK|s3Rx~};F!XJn1$~9p@i#u_ zrHNm?DI_JR)uRRyFSWV&sgZ+o&e>p@2$V22~iK)ghBL zOC4V>D}kkqGAvW4)&xg48I1grnx~SfM@!`wxn2&1d?Y^|rS-c!$Xn653&Wx-d++lswi+sH2~?gwwvS5ME&FY)~L zi#aX7`wGo^;`#m8IcBcA?=EYDY5R>ZhzwEN*zTM;GhAnwGhW|QfcXaRSrpE7&x|VK zxQ%@c>E&qB@Q2VyokMsI#y{tv)i0^o^`BAiwm5&BlW(>)kH>Gm2KuD#@w(s)plt(h zV|9Dax$q4^v+cjNZ3SQ_uM)PoE^PSYd!f+kOPJ?8owO3#KHLr^X(M}xyFLe&^!;zg z8hon#h za)P~00n8~&WBW&373TL1(zuQams~GsaE3o%-L)jXc6a|(9b*Hfn)6LB!3v~r_TvF? z^eU9&n_5|1Xv{fIEn|W6H_{<*%Ug%BFk&_6%1@B~UKBlDH@JBZJ^5t_J)I*r?Wu1j z#?~a1;8x;F)|96R|KF30B0M4of_v$$918B@7ln9d_8@m3Qd+x7i``Pxh-W;F_!ZOu zIbDRe^PU>%0%O9#AmG0>eHCVH&f$hT|YRA?8(jUqM zDTF_Pwf!Ysa@|6RUiFW~)1i}4bmQYX;^kkK92&3^9|9~64NM=|+auYj%sF}XuG}KW z(C)emsE3_W=0$NbaS7B`;$c&yV!#?<)jla^kz8VytOB9$Gw!qISo6v7b9{v&RXosZ z9@)Vwj@V`%Yk53d5gdt*$m6M8yvkz}kN2{N@EGRtK=*MHkH34xe4WhW6VP}vTTht3i}Ogjmwpj4 z@xcjT2|&&JATJDfz9DMd&0e&(lmF4Z^4tF=e|)d}-}*QC&)F;guz!>Pn7#7vIO<>b z|I-nBj`x{=m0uEuP!3z>3^uS0&aM}<9l_%tVBEIY(yn~TaFMt$I!CSo{&6pqfJ>i< zR+pMd$yG*>d^VF}ic0yx^N39#vJ|vG1GdL87NhGmjZVfP0g+scN_t97mGoYzbi2@& z75qrKE3GYS8-~xqbe2mKDG~d9&xMFQ@)z=lp=r)v$qeJ7azE#hK29!dd79#afB9bb zQ_3Sxc>U*lK_vMb=(dx8CZsfhJss%$?Rn45KrdC#K?FQEgX5ipuwUb9hm(Q$fxY|; zK6wGuCz&a_Q;Ha;r^vN~MX*_+{@6&uAl2ewC_wb26b50Sll z`iheEjFs;rQ*J2GA0?B!ffYu&kD@@ms5bbjnR>!~6a{K`A4P%c+`OVdr@3E6c5+fD z*keU@Mjc?95M6rE{R#y-vS?-JOgnaqZ~RRK3X!w3?|c0Bn+19#{4o{_SWyEIvEag@ zYUhSav|Vk_1y>M_&Po`08x18b_WL<;q2Zqxc-_?FQ7^i58ttO)^0Madk4IMG8I=1s zbOt*Ph+uKG=1-*HSjFAB81T05I6C%m`;IBCYpuoHpv4_r_{h56kKxo2Z(MAspwski zI)Jo;GH~Ey`Zny1C|WF2UAZsVF^&s*^VPOK=<*lA75f>63IBxxCOtn z-$m5SW-j;E(o7nvFN?fhQS&qP!E^pR(qLpE@vl4_8>wDN%-E$ zz-MZq_hyG1I@7-6nARJc?e1Xz?qK|VU#u;tz(6~ugskQj#h81?0I1ei!VRzAxc|s! z;MJyBcX#_%dg)XLklzhA?3^*AFrU`^3As=@xGmVey?n+=?K=Xo5i9zXX){VNHTX;K z7~OhTvE9}VQnODM*Go9Qkr>Q7TOU^`@!ukZrxF`nx^whfnZwtYm!7xK=gb9s%ky)b z?;g)dT*ZWNU8QG#TrErymu7;sV0VB<-d?ko-pJ(8CY5qKFH!VbuA0@m*gZ8K+4x0W zYKCgpy~CYs6uRA*8l(~{Gf0@f2;Lmnp6>jVTR2gwt|hO}O3dhQya6x@MB=joAo91R z%TBwxHg!vDsO~44ZgF=cJY*UPaWfPztGt&>_0nZtTotE_Z^W-a(+uO}>L!tF>j3*P3yFh@{%wfIii8CY#wl$ zfp8=>lS72FhAwcP=~#)sF?!aG*0Gha=mJa^ zXRR3NqWPwpx?igrEnpU{8%D-j%&MaAy8N2ZBL-iCT&^5Kr-bWkpUBkD-1oJ(+KkVW?T}qpJ_>r2S65M`0Y^k z_H^Ah_{porHXh3ALLNdpT+8@fDB#W!d*1-HG3~b; zljGwAG@b@rBBO-3T2U^g$$D2x{pN@6t#@srQinx>>LfKppNUh=<;&8ptm4?DK@b%Q z8!T~pJ~Akgcp572t(#^XK01yv1C&7i*AH}6tk5+n=R#Q(%+iqLx5G%u9Mh+nd<&Tm z`RK~+6_4D-`Mwq9-zZ}kKx&Vr!!pv6(O=m2u2#@i9-TRpwbw7R=AXw-xk*9&(qnX& z_GaD5ooU~Bw3R#tL|uHe%E6PYzYz4Ymm6c%#_+JW!n3iO=Vn=V4idQ3$&ozB!FwC` z0Iss;en!ElZ!Ku}g*DgF3n3Avm3fBKJB9_&$R;Zt@TlX~yov0I(b`j!@_St2m z1uX*p2RYeyWFig(zl7o4b<=H7`pg%m(j4z(ezcm zh4<+LaUkfO*=F4ivOcZExzuWup7Y3qilezKJ!xC}PHNr4NLA|weg!4?Z7z(4A#>`G z~5^rc5KJ{uM+Q>~Kuc*0f^{ZOtm zqqtq#XW?p?jjw4cl5u%&HPui`6AnjUE&PU&()kA2tn18_0CjZ!y{A&)(=l`qnuc!N3 z+^lOTL5#xyy;ib6KrL3X+--C-Kh5_0`F4LoJ=r<=_5Z^=S^t<7HRULA)t@h=k$D1n z1*#)SXV@!?$g{#_2z-*V0%1}KdIyG?xR=aF0k_uDka@{_O;`ze`k=#CZA#Uj)BSGA z9)F&@J}LspDFhKHtl!)DE{k%ak%y7J3d`BkWZk{O`4Q?14nwe-V{whHlPZNDl5eEs zKA0GpsAUPl{FrIdork|IHq_OYOM*eIi2ZSx;Z#fg;v(2uDlm_lw-Ia<{~86|Z8~$V z)GdHE5T3f#Ih2uQ+R(aq6BQ(Ac)Bja*dPJh`N>bzW;~8FIo5JW1)BGNa4M z=#Jo?3&4!$_bBp|TV%(P#ftA%e&paP22*B2a=N3idqRvBCV?UEHQsc^^mOS)u?y^W zo2>quc7dfC!cg;tk{PsTxnf0Gd69o`yT?&xz6mIb<5^0t82pry&TT({QGd869=o|t z$>(xjQJyYCdbBVNGg7Sdhew%8`{lD^;rfjVEEmk#jaKmMuJ7Qv^ldzSL-t*0PA#Sf zFQD||c>qSr6C);{&}A@I6M` zu`Bp45H7o_H=T#!k&UUsoJVstYp1$jB?Eu1)?6*z!|vB6z8Y55*2%ewo81hOfot8z zOT&fxOqP1`tuA#-kV;)T4}a?7BK<7t-^^Jl=Wx58x~O9;&z>J;^-eRdL1rDPJE#nrHtrOSoVN zbS5q|bnU2cDrq=mvIV4lV~ucWP!l&LjCc7hz9Z9AIzON4o$!M?xi=qG(=^++A}NJU zXn~OM#tT_huC z?}Kv8Sfc8&ba^)iAR=%uoF7k53y&NeoN0sLcw8CjHIohsJ`KQ;Azad3q4VJyBX`>(4d(5w;hb$ycl*uKE?i z*pqb95v#dpDNwxtsGQPe*|{E^>FCxo)lp9AQ`GybW~*^WqF>DPhCv=Yn*#c6|tuF(brfB*N^=4>4T{USx5D7 zHme5Ul~-VIp$2tJ{c^9Ad!KF2tIvf)ADgiINw!1bkl$nivavz*`jNh|fg@j{sw$ss zrAzt>!kKPU1Nf(GbsAjqQ9h{|4J7lsd^%smx|d~6H(%Vl!!zf2c@ZwlGXKL%XZy{* zX;$)7=BNGUKJfb^c=GzchD@qhkTJLDWxi_aYUf?x+X9~Fhy74R3G5QfiupjA!rTac zQ_d(sp2SkK&ek~N%-22!C9TAtysx!NS{{n zdrsd!;G&yqDNmoZE55UjHCO9Z!bFN}lH*^#%(y6EPH^4;2VHqIb}426ovwRziwR9k ze7MFM)wkLCV4}&yEvWP;6|R0tYjF1aWn0V2X74C#M`%ivX?;Pni|6ajp+M3g!pBT8 z_tB{7>9j}JDsj3$SL5hs&26S=Fm+xzEBBE@**>QZ`f=FzT5f%3kN|aN8soc#$GiJH z(nokqG4S|q@Ytu(CEle8-JF;h#PGCLNCPpCkAMQ5i*v>OyLFBECG^=_&jMORp`31Y zdoWrB)q#q$+zxbxeXDY7Q|I}`E~)a^!8G+ypI9aL_L$bYP!WR&tsL?%fc^Fdcjs7( z!#T`eGa859*pXBk-&jG>na3cQ4&_d<{SyRt_13KcV`c>io~JXWzn{7N)j10HJ9XAl z=c@P)MtdB?V8T3KR(zyI@%{?cc)FUd!fc*`$>S+9z71t_Eq39;IvHT?Udw{K~-j}Dojs;nKV1$ zZs*KqgR~vG9bVgQl`{~z(L4$7CXF>H6}w26#GS8TGy|y#iQPFR>ZSzUQsdd3Gry)y zI(Ri5Bx`=8QTmu6GEJTif<#rB3|T$+x)toF3TCSU@Y&m_Hak@j7p0RUNXdN1t^b2T zd({6i$E}U~X1+c*Le$;unAD_iMPRZivABtz8&=)Bhp?H1rcnqv>4E2~#&q3xB!Q(* z-yfO5W!*Un^(Q?70! zDYB72`vzcyQ#9%E%|woh@7~{03uZ5@BjxHs@ZBKE~KhB_!p~L#UA#2j1$;XYP!;M z&j4_z&jvQuTx6}X^xV7n5X3r3ldT74RtsvuK_)X5y^@~1X!b5Q`->z&UvBI70P!tf ziS=!^UkP$vnTtn^l`)vQx?JkS2guek^|&(>^(-wJl`>N74q=D* zW}cLrQ=f^Z2c@Z$5T5Vv7ag`b?8`)Eca@zuuq@KB@|L3+cF?|oJ6X=EjFkuN;2=Yr z#I|rxv*9CQVz-)k>gm?{&vtuwn;yR~zJ16{irzfP-k#y0Fe^m+e(u;=&!xv-E;wb- zrshhU_*IMjT;?}?Eb{-s3tBk$At$Xxm~BkpLWu;}g|IyN&M}dLrQ*=3cxDcQC*!PH z&kz8@y)KXREK$$ukFpX+0h9J!BW@YfzU#!>E^gm-+O*ErQ^N5tsx1=%G!p+}v^94l zwaFs=QpAdInbGz}>(1BJvVEPu*}e`a^fTjy;TakowiP3UnlCXldT`09M@>;M#_t^3 z0>(n5FkBE~3Hjam3{r#(I^-}4rS-R1&F|2Uan{^rR3TTJdNziH1I~J z6SNE-*oKy>*JsK6Dk_Qz#q<*2fD3%Rp-DcDDF0O?mKiX!B9JegAQQq8qXdL*l zU!wmZZWr9bXpG~yU{YfDu0>btddW+gXH< zM6Mc>I%iPwCGG`*0lY}e3v&r6;i?L_UZ?+Qh8~$aEXx|kRi(}!WS=wW)|arP@|%6u z;62v>;t-IXpBh(bkFQjS4j0~gws)D^-UPS3?6(suuxZ_jK0C;9h$`|(-+{ck(EXRN;xBtV}dT<8(!EDp;I&F!xXmv8-ZKgWJa zKeP1&;{D$Oe*L?Cdj0$5KKfT>`gfo@_W#ho-*{`#AKnv=6aW9|Uuu>=nQQwh02Ivj z*}-pKY^A~tx$_mg0DmRP0wwnNddLTB`ADtxrf~X6 zV*?D^qYzYymejth3CATA({f{hH0X$mY=+*W6m;HWRq^Zg;@5u^AK}$aUMsPUE+pRO z=sse7`!1qGOy@y#)X5rCBE&SD_AKwI;WfxLwWblQ^V9*>%d|>{dEQHXHtN#Z-es7k zPK8Bj-*r54Ce)pgU5v=tdL#{ucXlv+A>_x$QfnMugUV7ZPnU7l{Ki_Y*J@p-nr6)BJ4XZ1Ib)g7tl&9?J&a1DzRxsr1Knf|z~iu& zW-vU}&4}7xQi9IXidG&~HQqR#5s)$FmemkHsEM?(-2 zi~NO@di7=#lV0sU>3~nqt^JJHkxOUP0z$#~7#EWK2!i|wEc^%<$-B(zu{z!qKLv#5 z@zI)Jm7ef&`;LJ#2bo}c;g{EMThT8-Lh@s8{xLb!GUeF!R`@1Zi$ir~y`gbFf9n>e zxtw@#WYdIOa}Q@*3a7`i*=|45nzJeYJ@F}1#5bmI2ZBT>b-(FqGvOU=r_E-N5I*f#3b)szqI; zxc%YYxcw((soDo_6GEj)=i6$)Y4xxQ6xX3lD;Zz}d3i{yJ98>bfV=)oMh(i}T>D{h znd-uzc4nf?x#&dGf7ZsUV^X6YXc*NQyU_GN{kM{TB#&96(j=(Td>2q zf|4FY?X?J0Hw-!fXOqhTQTN*N#M{wS<9@O0?RS~QGp)tLPYu>@YW;y3zQ#7jnm@d@ zDY2>b1G8>_orh-#hRP4_^CpT0u9o6CC4&CXuK zf&}42aWXfU;x7Kk9|l|>3H-zGj%SE>EN42!lTEf36Q`{k>!cW+gD_CS4;wF}w-{08 z>r~Up64atY1hQ3(CiI%AAk8HT$^QZxy5Dob($9uYxpT>9Lk%GacW>+y-nP#C5Qo=Z zZT*E~VCC)19iALZ)8$_=KwW_eT2m?VE~<)Sx&V?Mytx8d%3Ay>SOr;bJi57l8$lQi zH{XARi&5e^$D}G3jA^KRC>9;t8)_{Bq57K@`ZRk9H=M@#D6-=4bf|UbfshvC`k@Qvf{TP~Q0Uo3DdSFYeSf`mMR2V6F|P-R<7PQ{%c9c8-uDhH<#ax|A*iTE~H(xmXj9 zAil;C$Tui$gyC3(ZtY`AJL9DhfcB~sw6}fd04sTqvc;G07jAH@#Af;)PLMA0CgT}sQhUx z2zPREnZNbFVG#PXPX7-v1|LX+E)}#QbYTyfaxDBz>yNXKyYl!_uqKyTLOQ+LgPY2{ z4+Mf{XUY!n=p+KRyA4Is=lcx5RNk7++$T`QcQspcexTX+*7pw#0HHDA^i8e+=v;yH zCm?7BbPjCTTjBW53M=_%q2cz?i16S-CdmpGzu8VMr;kzN$Sv_g`dDzWAz76eo|TSY z&ogApb-8rIPk4xvigJVmZX- zF*CS4)Zh#|xNNM<8>6_kJM?;cjm9djZYz`>k-H}TsZW`Yrw-+6&@ai-_30#JSX<-N zCUp^&3hH_RNCR>XINk-hUX15s*!E>ouCqacZ&c4{Q5-giI0^Fk&KV+grC~GgH&YsCXQfIvWUTROx@5&&R99yG-+PPgs0X`V7NqeJyBoQ<0a~2Df#I z*NP2dwNGF(gqshA#s2@1@rVkv*AswE<_i=GOvNDNo>iJBAq`*4GXDiV%<~&aBiVr^ z{38Ca5TY=Crc}SGH*}7#ymceAO}+_dTH>ehuDgavP3WRf*?gv{hN+qYQ*{!05$CzD zX#kQJo==VXX~U?F*y$cS63&YYA;~DHgDPWJD#_18QzP1uMkn@Rv;8qmOtcmcIW<)O zLF->MAdi`T|l{;{l38 zQupre0qy}jnPKsCbiJGG&$4Ib`KrF|H~_+P$UO@h8auedlQybGzSLXJQ2L4tV3AU~d$-h;1?$(e-kTp9yws3dNZW^5 zV$ZA!9}gXu-R(I zH^FlD==aWWgX#BNmIwWo;^*^CZ(whb|4wis%nDJPN@su-z z$!QZmox!}JIO3eJ)e5|zY z{JtI>AK$z5U9TP~5pnRyhetMCQenSJSMsb`7ykRI(6SY3gY2T6$!EOkEPEkeaktf1 ziiks`fVyR+?;}a-D)&8eC$B*Efqufl)2Dt84hr$ZV5}ehk~ii!YJUMjW-s#O@0*V) zna@!VX+gRCeGw0LDjtH4tcA?Hwbj{5L3V0-8qePE!e@kG%sn)C z2v#M%$RJK`wkBZCn?jubSrpG5Va*v%t?`{8PlmSB6E26vFv#;3uR6{zLp=kn4?&?d z-*9?UgsaRDh6ZGPt3%NoOSYRI@ET&yRgJM?{F3GhJIaC5n`%cf=X#2p%EB6b2OLbh z+5Ync%TO-^ofU>-5Na66rz`GeF`BimwF#COF?PCYsRkU9+NucTx|U1w=u)%2nZqDZ z&=W)TpIV6qCfXVGRWn0;eZeKm#HZrBYVaF+HUNT*I6jyWfIOlJ{aSyi<_!d*^l7aO>Lfpn1JMz*JsJQ{?Ua~x0b`2un>chdnt z^m86rQ2J7UuSw9V@>UvaR)E${K3}cUx3C1O2hni4aF*`a+qutW*?2V_518|y2D|L% zm~U^jr_ajSt68A&uFAIFJU;w^bdW1STWUqrc)5I+M-4U7itINT++}m|oe-Q^@QNON z@S3w<^D58GCM~`b0(2!0=`s06z2RiO!&ehV0<6_Unk_1i3oKKkYjC$TgA@euRLP<)V%w`T3n+)2 zTh9o^F9OgiY0orU>h$zHbO9#-K4W#d@>P<`hOPFkyz&ic_0h4J_46QK3-fDr%;i;D zH+TI=>&Az|`dKXrWFPD2CWFfR-0kncNtpUdkR~%l)P4^H%g7?rc)XSPG4b6q%lRie z@SdfnAzSQKD#WKR0bYcp65yT2YXYA2V%2{I|03Rk;XSOoorTC>}R@5jc8`AJR zWqE~vhJS|Kp4SVx^&~9Ft(EvWP;#aoVU}B-qg;zX)isywn^!mBcD`7_c4C{}sZIBq18iQI2nGSW6%uP*bQTz4@ zv&@>D@NowOC|igf7h@9ewTY%GSK$;OiP}?h_?|^OFl>n} z+j(u6!k0=#Yi}Ob&03rUlT4soV>+g(p?o@*-vGap`K{*n@(Qzqv7~5mb6;uA%2# zn$BOnjWq=B^=Q#jtid)ItBrR7q%9Y2SYpkUE*G+8FYR{r>&}+jZ?W+NP+p%MO%HiB zK+6lu`Dgl?J=o(vSxXA=G=sIrA|trfU5Y-CHQFj zo|CbZ=sJ)p2^6^HuaOzFYSH&iuDWYK8<6)nG!gaSfXNjCDm60M4z&`Bbr(%v8VKns zRQp+7RY5J2V55k)G#&FXkd35=R60KtLy!M6?Jn#xwGXza-RSzvfjb?IR?QsIv8j~m z15XQ@DDq!p>+4=uj<3VuteBk6OhX4GeNDllvxY=2_k=ns8$NhIC)N;G9f?TJ-k z`zWH;SI5gc3AOT8B%ZCJl)cTGD{o6{{&)Y*b~51;{+<1g?)Cmq{}=TBsrwkT|IS0O zJ9B8L|7*(f*_e|@+4{Qq&|vrb{^tIxLnl{0td!mm*OHUb6nstD^mW@l^KRc~-W~hQ zyK|p;cahiY09{c_pPP>Cs}Eo7v)obrVygmUVCGXYb(jR`!6xdeE&X6XO}g=Ci9>KjAHGpI;RVa&1!f zmB6JM3TiXoGS`#S z<$p>17KyI2GW0c^>i19a6Y_UD$qjNc&O0URzez_};i6bdI){uXf(Z%~O+3m9FmZT( z&x2_++%Trfn#+~axXyH0bI0)T&^wWaZfowTJZhBHVWcd~OGkYAu~7HFBnFHGN+ipS6t4bt-&AeJD#-+t1%&6-dD3KYLX822{-Jr;-@loxNc=D zrH_p7v}TUts4l?)LTPkZ>C=A=anaQkxKsu^D)%F(QqIn>e!Djv+JEKA<$nn`yk{?; z*%NMn+yVc3YtCwDrohN%4__GXI)>I7qxRNj`-Op$#nkO;i(zxw3LxfK7*epXw~I)DEq_Dah4o;+x-y^0bl z4q{Vi;x=lb5P6;@l@HtZ&aq?f96QOO3aE(uyQpXH9G~x9#}|9&*u7Vdb8xCvKR)uC zMG#Dndr#cRCF9ehW&~Gn4r5{CqSPa_IB?k78gA%e1&6G0G2+}e^jP1^f?lkz?dOSb zy=az6$nIVEnE5<-^~X>yymRG?1(M+f&vzDTcr+{8`kt(oE%po4NcHt#!hm4m9mwM`+I>Yxo1%6t+Xa_+m0+@okuTh*MmkD&L0=?r4L3^ojl_O3=nV;AJF4mFx|47 zMpl)s&1U-zLf?j@tw{%SpY=7 zaU^Jenezg2v%AA1ZRLywYh=za*qNb>08#v0e%u@f8)ahMZz%pWV3(WvofK!3;d3-f zg^*Z)_?OFMO61KbCO{qTi!`i?g~I7EM6Nj~Vy_Oy-=CFu>87)cSt|RrqC6!!Zq1(r zTsb4KZdUN+b@A?gE&W%MxhC4s)w+fe#7jmX$=_uc;yNtY39k^ft=OCRu~QHGWlwy= ztVGvMC%P>SanFm7p?<}Qq5k)&KidCAvQ$PJmb9+P-skQ|_BRY|_YNQy<-NjveL87I zh|S=W;>XTA2geu=nW6eFH<8V?b5~P?EzyX5RIwYFQP)@aQ~^!EqN>g>0WQx*Xha09CE)@LIPD`Jm?)02f`9EAwFNY>~f znc+v4k_HQ=2{cF?>Hj+OV?`T2-2*Q8Yg>s^M39L`btW=udX{gIA<*f%HR}t!DiO4< z0C;0ol-GmQ%`X27mmg_(Z^k6Z)xpv9)xPG$OKtycC4S2C6dPyFU#AfE4Qs92lYDAv z_}rR%i%CQ1T}SxaiD_)yEyFfAbB>g=@zNIG2h=z7A^us(vsDDjos94xknFKL>|OLi4XkFttD6=D66@PQ3xIq?8pU_0sB6Xi8IT5T$0!C`qBkrCk4oK^uo) zEA&PObaXbU34);N<bgIYd9a!OBE$$e!#(C196f&3mmy@kvN$OVH3PH5 zmQjMPh4$p!Z?sa-U?gb2y(+%8Z(|?sXW^nZn1owlx%}~U<*`eg%MPI?dkNhcqX>ca z7Fr*X+U<&>eshqwiH@sSE5{?w=`UsYHTz3TbkoBGZ4FTJh)ss-;44z*+`zGn_)2qx zp{dO2tJ)34OO0-y=r30-x2sh44zFx~%06vMp6ZpHJFOGRD0RM{&11h|t57;|Zl*GI zJ}0>B7lysou$tgrd&P6i>z_D|Pj|k(d4M^DuWLMhN}o!|vwOV;L;U(-iZB{Ual-Vj zrSUd@pP+SDkMXSqX^9$*Sdxp4$HF)Ya*l4Z!_;$frFVhFc%}=*m}=h_{KM(i0YnVB zB53Z?dnzK!nK`D2P?OKlCn4(o?bG6a8qTt#r5YdYkB69dcR_Ie4<0{xM2H;C8LDdQo{Rjny zbNpduXEVWZ5{4Qy`C)CqI(VvJ!)r5J8aV+ctz48NWM3S{!7k3q74*|oXC>#D5AEbB z%P4jW^X}Ye?9A%ax9Ai+Y34doxPRxo{#s1f!GqS_T$%+neSl`op$JL;RnE_7Bbq+; z*Aw7UknOPh^A%!*oXKQFb+bZqS$ysGQ2(tR&3RJOPSf*)H6khgOFSiPSrb4feYc3;$Mtd5*Ar)3z*AkZXRlW#?~q)$M{L9cRJn7 zwdU2!NRCv!TcpcV78?)x3i*sv<=bavLB^75ME$}-ENL!5m7rbEMU2NW7&_}}< zyKyk<=_sPY`yJiOx1!-x}6`L;7wkG`YVd%<5Kle zUnA+;Xaff==cvJM=)NBsc89fWL=B<(UK26=MU5g+*fejFiYvAeBeBcV$MP=bd3q`7A- z`-Gtl4^CPhhT-%dYvxfz-?pkOe~w*aLR5GBu7ZU0z^@aldt|SPh9Fm#iI?k=Wizse z$gQ<-DV|3)sU}E|aT9^ha4H4}kE06SxB@T0N@vtC&3exHxW7x8McKml>MmL=NJ_&2d!U2A5;%4n9pMa?T{`FV2z&S&B3{;|9?mV4R;Kxq1oL zG#J<5uJzodT!nWQv>RY)9@)%etmb+hdtRsRj5Jjd{cLmo%+^B5>@p)RWC>|Pb&D3LpXs{GKJ;j87%b{( zlA}&p?qIXVxnW`<_!vp;7qRI0-iJ;sqCb88l-1`3b83QI{h!JFqo(%q+{#$f%#Pw zf*okI5?YsLIn97AFiVN30M;GHnQB~f%#<}afnf0cVIDkJ_3gd-N zu5eEMswhIxUSf58%y*EY9=WH*ZY{GjLHpXupxx|7CBV7TZmvQVVLd)Rz;(MoV_Nsd zivG{W*IC``D*CSiFyjMAD&xEbepeTkSRW9;?eDa3$_>gYzSLcUTvgJr^~UmWsuBm` z$1ez|GO9|RRn=M^5BiO(Ys2!HZ$N2Ap=`HGfOa7rofeGGQfT6h0`JI8to;`IV;%iy zLXPsP>;Ei|EdjTK(`LVa)b9SP>19j6INqhsu9oWjcT}JfH9<%O#(6)CpOx<9s~g`H zyf`B@930r}Tr}348trIzi=1crjG5(qOLw|=2&Uq;oTZlvIohU})~9u6D#($M+XN&x z&U`Q}S3Xu$dHe&6H;Xc(qaSWWxfIx>h;r2~{mFEq(PEN}qBHZP5L4Hvfl_iZadT!q zH`|YUsf+f4CWC`s1#3uj4r85AMXk?Vr@4jd@Q0v=;IUHU#RBZir4+x7y)tP|S_n-*XR4rOxB=WBasd{@*Q}saa z7AQlk@BI%Q+SJ?ACsq-6`b_&R=8jCC2l{;a+t~ir;|EN$EyZUkBj!>+6o3bGlv^ID zZ%G}H-&p)=tchH*5cs{;FlL@hYcdV^gS{)%J!TPmh?Z?5RSJHFoP zUSH9F>ojCC2t>4|Mus~no3Iz(@f>iG@H*5GXnc$v1;knR4H2HUBdy1q0}ljReOLbIQ~XFCfR5dNt_fXq%!X?&dDmpLEeW8#g8$KT3zIAZ*DWoRLYLKuPkQptIS zXyk)`J(Up}O~dB3T%t(p*Mw~0p7CDx@dj4Bo6KRm z9{@*PwiJ;fJ#fN1X5*;+b8+K%;z@7g$iAU{FY^a=r(}Fz)}NAYh&5|Ha-ZGUv-!1e zo8}+>Q?dER(&j_#qUJsU7qg6m+3b%Wp!yOVa>X%5rDH3%!qBDqh0cm}I1W;2gei`n!lVT(~j=m$~ zKz3GO2}7p1wi1%S;r10Uf5I?l^W#!sEfjZebsR|zm^6;F=H?)2Q8F}T4~=i%#YsNV zWGsuM!YaP6H?WkB5s-t+Aac%p<9pWn5>A}#{o*!jKxdGQ30G2X8`5J%Q)x zMfjMh^Vutk@}uM}Gc{eV}yywmH4XMabkO^LP1n<}Y100BGxG#SMs;tGU&=IHi3#Bn0R}r)u7Y z)VMg5oDcEOyvo1Q`N;Pg&0J+DHQn#b{HxKN-WZAJj&pl`R7PwSdPCFSzws&g*Z>RC;6rcs;hw^!LIyaCH$*s>1;~9JP05CIHubf9&qeDcYd& z@9JB?7*d_fK-tV)?0%vnPYk8i%!zCsE*=(E$#yd4#B5Q z9T(BMoAwlGlG@}B3^DuR>xP<4eQ-b-@wHg}lHoso+(YTio#b||rB70@73`UrCw7#Q zTlO>KyZNeX&kUE)8Fna$433m_=-Kk*IAVWPq{wUqc;LjH#>PG~Pt=WyXF@x*A=DQ( z1p5sud7Qx>g$C74A70#}i2XcQYEqrE6PBCtEp0=Z9#k{3H-abDQO4g5IjAW|?6qUD zvTq9#7kx&iF%bJG0?XFXM*+W023dF$U9Av~EzTV`?p6@zaj~$Z6ZBXTZ8ta@hU&Uo zU9he_Tp6rnl&2v4;VqodVihDB^^OWc@A}Ie&j;=YN7ZGrywv(fg+)b%SuZW{W2VZs zkgA{VKG#Rmx7R2x2iKIml*bR;`sKn<-Z$i1;rpaxkP*oc)3`Zh`=HkMGw0IE69A|z z^Muf<(|Ll0Q!-z9?dPGXLlx4lD!x(SGiUho@uNtej7g+0zn=Z)Q=>vn%|LV78=IKw z%MK9>#hr3~XEdT)=6f!7JTyxQ$9M^cJB!QAI<6q$c+Av!)hGKBWhQ6WXg|MkGOIp9|^0Nje@_k_b&EmL^$=6m89v;=z>3JI5nVQB%2Och`o(K zVk>p~OXkz1BfCs|wQ$4Zs*h?^bOswr`BvGrOfqmyji1u(42Z9#6Rw?~{`WI;-8v+k znj=XojIM}Bb7B^Cktsh^qnCoxhRJj>69DiCJ zqE=a^P?)d{<0RmE{kPaFT8Ipm{`O@2d&JEKvIo2UlE-~Z!*5k|#*L9w(g4C4Dbk~5hPR5UJobREP(F@ybxl{4!PWjVt zsdwyd@UGMm)`JTl_cBPgYZ!Tcsl{F~IGvZkB~{kAcm&5b9Wp$`m@Vy< zttSE2wmle(c6wB1cW3ckY|^N1rg1gB=Zmeg&u1oSIo4jIU>62JjY1of)tevwbL*?m#PX0^j1>IjnlDm@<3iw9agmi+}Om z17pWyCW(E`c$_RIHc4;mMzmX4NYC_-e4AMEL$Pg*I04(y4WdKCRvK`yv%JX~j+py{ z6w!iAelkV4Mo9cw)k1SjEH^fnGf_rv3AyXKyvBJSR>ad^^a2KE_}v#Z!&{s~K@>0L9h1T`l+Nv&FhSn; zW%|y74UBxo3njh9>7-#V`L`r{sJF$bo>HhT&3A3YNqoW>zhn?dOH@=WjXW#sf(D&E zCBHwq>^voIgaU{j)S_^4dN=Qs7hzjaCWk0-P^m;th{}Lm%f&XEHNCa8R_63KVll;T zdc;)VETD9uetV5;*cGX9z5yah^B>Q1Bf(2d$lE3`;Q|!$XJSl!)|&ei)k?fdz5@>h z+~xweJb6t)3ta90LT}y7cmavRWxrfK;mEh0E6Bx6A2}RT=S^ZH^8GP$?yT74^5k5p zRO|`fwn5C zNBfYt2R~>eO&kbVIiGocBa`GhKgc^S!y3x3N&v1s$S{NAOwEIt0?kEz{!5b{oSH36 zC&qMUd#LljBCqaCtusKV;l9*6X?AgK64x8e#9QcNRHDf__FLl0+7PNoK^NIS#Ai*~ zAQXXyEOqM8YuIl9y-6ZzrSYiZA4A|H_V$Ge#7C_t6BLfEpfvCU0Y&tv*NnB^5KeKL z%m%THfYbzq*J87=s`G$Z216(h0UiQ+z%bJ^R1a8Ynrih>&qKW)ns{i^LzsuK9wzZH zNe`2Gm~8YA(_KBpwa=Rwe&81#<~Vi4QF5{BElp36zslV6$)5aRULR3jBRC84{`^B# z{-IhA-jM%K`jPd|nSNE#uRQMD^M`!TT>Z#sBT*FiKUj(|ATGkUJl_eiE~bA4q%qwp zkYzpWiAJpi#&T6TZqe~xNl%sI*}hQixW(*#JR1BnpbfjAZE%Osa&K`6Z~VS6gwD(p zEWHx=(*NpW|62$4h|FjYX1j4K+|RA>^LvUF&Mj8x-9O-NJhMMu0Q+CUZ6s6hO1~Df!;zR_9Qz<*PG861bXr3dBmRbU>^2e z&RX#ZDNd?XEzlrk^jQ<_%bN_adVEB#fJF9$B!B!twPlm z(id!V7T~F*n#?HoV7ZzIz^e;XZTuT{i}XH!UL-xe3c}0zm!;z3ozXtA&TSWnxL;=~ zx;ao53rAC9{hXJIeN!YdH9DAE#mh;sf{>*fp^jT34a=g|nQP&}od;msXdeaHT5o2G z^hDpoJzXM#`LsRgjrb{#x#Ls|%$@PZQDl>Qj&=0_d#+;npuuB9H0@RG&$lCP@=O4> zyP4q3R;D@cN0X8n8ja-#B!tsppMt>QG#0ieR)>AB;?89yR+1F5ukZ)kzxh=wfn%=A zVu*cg-N=xPz1d0_eUB0RY6lw7s7-=NOYlXRuLSMF@QtM&WILSFDtolbwUtvt_62qBTGv zb#qlPcYYIhvj^xTL~g7Hl(B{c8@>Q}#Srwp<{zxAlxhl#aOOyLAU!-1UcHH$KRL#$ zdBJGanI1TjMYKp2GUYTU*Cs2`t}?nB*S?yWSLYSXh+l+)aO!H_Hv!s@%EP|png2zj z;6Vuxp*eC+INQCh>OJWiJpP=rpc48B&eoZVun5e7NE#YgDu|irIR9uf7dr8eSx0Uo{ehE8ewzm>|EKQ&F&*}fP{*7PQUk!vtJbg4S zen!Y+FEOBp5W4+}z&OYm1XdAxneL}Wexv+w6uW*M+@2y^LY0sA@Dtlq!^=1B54j5~ zpkUuwRnF|g_7htONYQ*YyfyP3ZUn5tXAF<+p#?__&(6TRY2S%b2!th@;rluxg3X58 z`tgzb*qcNaN-*O8WA0tRqpGg{{|O{G+&rm@Mr$>;u?-3(w9*nmogoR#NTMjBw4&0g z5fv@U3Kgd1{mCgg?u$ z4Sj7fUyIDwzXo3?^Ob8VW>Dawayg)$CjlDikf9lAXj=YZhIzoB4~98aStclfAOVIE z;r)r5+}T$dH=6_(Lids7_cJrYvDDMh_2!Qrh;1hdY!qIxmpJDlmt zT~>wc@YNOlLXRS^?150kF*I2v#2WD$tEM@ATIOAd`Xu;8Z2W2|h8@OEM;Kemh~rO1 z1KH0QL5$63tM_S_3buQ&Ve_;%(FvrJZ`n41e8@128t8I|RdxJi*{s&f~Y3d@*Yih9f}fGz%W zdJk=cOTHFOy}-gCm}mgOsjHF-8p_l3ZOivc)7&Sl(LmSpuMk~33$_E6;jP=^&ckQT zuuK`MM&7mox$qHUNs<7;O40{sCWA;`9rH;$$6=H(>c8gWl!k(uzrS!tQ)}jjwQ2;N98Qdf z4c@a}!APJ}AZ8s_>5tDeHEvl;jpA=g>#Q%-xSXUOHLlp1uW?RSjWRoMeGZ2z`?vL$ z0vC*cwO;kzVB5G+Z6KDKHh!6JqlwM#)70YxPSv3IgyBzn%c6ma#LS(upjqIBQJ$+c zOQ!Q53QO?kKk@*Hi7491uc`u;TU^lHSH1Vm%#q&Io9p8(28^N-?&(c_=)Hj;=4+!t zuWuPX=sl~ncbS7`96CcSPI>^@+y5XryHrCq(_c5k?@JZ{yL97Fxn`MtQugjKTE=h` zLoNP_vE6$0e-pT+LPKH@a-vdR5ZuI2ntT=^URKI)VoAY+e}}&UgOC6g@)fWYvO9;$ z4Kv9N=|xVAn;b(mY^5Hyg3aprSp&U8xD%C{bh6`*lo?M%Z?P5`GB_ttj|EHI1y1uY z2BB`N7VbF-+^dv}-j&93uo}x^5KNz!AuEJX7w5j9DB7bYQvfgJLKv#u?9C+94r|>p zWI%B2NbIK%aptYkyKO(S{dcftf>DcAzU7@e$IwuE0N|!Py$gGtJIpD~u;H7QuV?o` zA*l)_OZty3cK7K&HthC{XCNDSIm5jF5QaJLvk0*UWSS5^qlbpEnUzip$`bRHv+8)& zdix9a==Z3I5&p|jVOWVRKI7vL7gk;Pp4#h;=1P$aqf5<7HiqO z#E87U#W~#IupTVm}8eQ)7j&!Up zu638A*(Ul0T}-tVliDl6`511#=+)?+fgev%qPM&Wm}G(zWpCL*L)qLH{Eg@85OTju z1o&KC#C@hdHy8OfR_0E`_aE8BtpSTVz58(^66ch?mOG|Ggz|ll!r%%RS#s`kXrt#I zU~h)9^IzwF5>0)=$+=D0IxfF%C9_+@PD^GXPw?EPf%pW3%7OP<0)dogYbp^8_Gzn; zPC++k3KyO9H^tdPgE)SV`U8lEn4W0n4q zCJB5}MX~I6%3fxB75UESWPaB@UF?59D(sdr z&J~jGb3M@f0gK!Wbg6v;&9CLD)_r<->vF$$v}1Yk9w<%{SB`P?+~9aENY1(A0L$I) zg6ME7Kq4%<4J^{+!2+THyLic6^Td|tR^eY88RD%Iaf-WTFAjTueZ{`uyI$^Xe^D=U zk+4^LpUcq#AU{^gD3ra?o$zfAaFl~Q5w8KQOijRagiP!x5qyYd6`y;O!+{ zc$>77B#snJ5=v3&qnaZ#TTD`H2xr>l*pGHHq1@YM=BOsTOj7}<8{HYqgxDAgk#-N6 z0Vgw0=vlCzw$;cNiJ+mR8oPm|7obcaSVJ(+!2aP&*BFAi+GK;SEWJciz9pE84OxiZ zEWJb@4(KHo(2Fihf?z1ntFhKSXSZ=pG5gT|Z}v(r90WC(Q%vVpQHdp-r1EyRPv`Y> zYblzyWetPrVE`3g4R7rjcW^29CP6x}>`(AS`lO?-l4ay<5>j(3dvlD3Y!cpCXv=xz z{OIcvY@Cd7!G{7G=Up`-pr8J?oEB1*b4+`*M5mnto@**lUW7m@vKVa3Zz7 z3Qu0#bhXq)gPxmPx`;J{$fahz`+|;gL?R1FS_I)z??8-a#HsO4LXiW^N%Zfz;f`^Y z1aEyt^8!frf6dN7MktOYD;y9Vh|)U|FYt4$Qf#IRsR}+uP9~(z%v&kk>$XN3y6zae zPsGXG1_HOQwDi@DH8{kb6l*|(5^G5Qwi{cx&GM4~A`x$Y_9qPtoCT9$5|X$hW@m~p z4`>w#rfd><-qN`it0Kaxli4s8R%ISCs3<)j_U&7mOw*`le>~HH)8&bDF*fSNawiqx zDOj~f@R;vMu#W8#cyc8JOJ(}HtD;$TxbNA+T}BH9C8m)GavHI9hMtX$!CT1r1yqUy z?BaAG5(L~0>d*me&rXJ?A$7E zBeTrJRw<+RjdgmtSWGYCSBY(y`4F83Waw>N|Cy;LWqjuH@PI@y6&M4(cL!csOwfW8 zKoSPUgyN=fjq zH-n*ZVFhy$G4R)rj7<#=l%F6ynAzdiQu$Umg}O2#7-F6rjdLW;lz9VL&y}M+$k7oI z4K3hpyDAwe(5R_g$>6876EpN%&u~&CcV9&_-4Lx#Wr_E^SyZE$FlZyqIfIgizW=$g zE5uyi>YLtS<1L>u_EsifhLB2VF$sLh12c~n;~9B=<+UvKjkRWi1F9qq7f8}L#>buC8+VO>xewU#NJ#}|N^a*H{ zt5A>uq%ETLT*+}v1;f~D+g=V5p{yE=C?dpE>t;NQ1`Ht&&G)9O2h6J>?3$52$0TS* zhOWC=y@XZi+vrSQRGXkZaS%qbp3f-E3k%Z7;p;&y_;0y4@E;m@@=R3^J_;8fGkvF0 zRN4XFQufejZ-9RY72GnSspmTVo2bi+ zQ^=3xYxRDpsi&(Mu{A4sciSJGm?fl}`+3L8(!`*Sl|{*eI#%{d{*YV4lB1h9ZDqe8 z&>O+H;r(S>yJn=KALU9OXaoNORYnAeA+CATZVFN+u~KZpD+dc@pKGhBqOYOmP21b= zMJ*la?E@63;^Mtkv5WF1u8id;|BL?JNNE19{_VTB%6s;&8TP%`{#}6A4E=j{^8a)WX&@klP#MMEJ{0xJ#3i-PgW-ZRTGI?f4 zY9Y-<632=)efC#nOdv^L74qJb36Q->*&myPwO>T*v7IQyCn6+-8&_&`Zb}KR6d>YFxmVgnfUNh^W zSoYB8WrqGyYE<9ZQ?mUT_QWSZhI0ojzyp*x0tNZLK6gF_i@Bwb9Y9%`^v^UrJ~7x? zTr+)CT^Z*_a&sevugBT1{XuTK9wN5eo7eLGq1hy(ojbYn=ViH-LK?eI&K601=>kYAUh#3jK5KfSJa~@K$akx#o569Loifd=p$kbS#4P#^jpp6=7EG+)^!1BaWLZ zA*9xQ)BCO~!F!{*s+gJoffPE$zQeqqcFeqGz9j1TEce0(Tt68`;Q~gNHFMO zOyy{!TvKRwBcC{3=$#^J)Smb_4mrF|Vzi@fN)fM_k@J_8~Bzg>A zQFj=+>&g8XXksc)<3?v|aI%_N8BLu$GR*EK{!inoyx(GWS4y$5ERgSv<9VG{ELT;# ztL!Pbz#c=5xyRs7)!|pNm`L7M{nM#Gp8E+~DJM^3?q^mqqckzqJ0ai1l1jQts&ZfI zg;~kK;a{}h(Ae^XmN6eQy@cKu2$-$S)qI%RTO?MRe+7CITdm2CE6yI6S)bfb$3nLi z$-6pFPpQxP=wA4JlHbHgS@;$St@8>m&9n$owl7uxQ=j!s_FL|i248W$?%AH)KrfDE zOEx_?G&JvmDV>r4-1(wS5`Rx3Z{>O;KJ7ZVsyknnMBcu;&g3*6K)I4ST#aMZ^IK^- zv2W`48~Eiy2lF1A*CwXyf9IWW$m|#QeIXp0ck&e3{PIl^KYXpJJZS2X9!+gf1z*deliKeTa7KiMCtvM=@Dpu5r zU-N=PFM>PCZ8c&2Vk+ab=BipZU9pMRHtR0Io5l-FMiQRf?&q`BtN`>`!u_;Arxk<%+s+4T`XH7x=Sx_<0G-bd~;f*BZJsWkagMkj|p3-?AsU~^f z7Q9D-_Z`8zSsZ`1LaP0ndDULdKkZ|!$h?F6jmV6Ns~V&8-a)mG&f6tJ!O=?B^Fk*r ze{q?&0qvbg(e#3Ty*!5hzpS^MS!|BYpDH=y@cEJN7C&uP#PZeV5NknE{MZU^3s z&6`ah0lB|`s`CB@+-LcS*@R_qAuoAt;O6Gz6c*UZe#n!z1t3FWh4!^xamqqsQPgg( z7zu3NmL>zFDcqmd=e5-%mUtw*j(@0NmD|pK8rre%}G!jP{kew z4amiu2Mw@4I|k7{!1(N#ay=Vt&$4U5v%&Q27}WW+CB*C)?iw(0ND9Yo`6Tpe3r^i~ z6yLj|RW!j#J8SNe2=_{jrHS2e3us~!_p{PZAR5@bAdA!V={OOE_FwWuA%d35wx>a= z5#xd+6Bb381JuTgYpiQGq$H?yvksZ)L-SS&zB@o|0^z5>)vI!n#@L~ z9`f&vtEv8w>gBt*lHLU)y^G`M-AoMcQ+fBApfodMf}wZfg~3+2lMyY5Od}F}uZ2=q zXA%^EU$pr#LrYYKDaQLA`hx*d(=qUiPXuD*z0!bN2%LYa6T|2}u&IWgtTO>=x6Zct%pu@euV|o za)h}1Tz(ho(`CX|t-vGs4TuiTU{CYJxP?&@k8Y5=-5xA*xndqIRh@yx!?#q5gAH~r^+sSoi>apw!&yn7x( z(*%dq6=S%Q$f^YOh5aq`oncH`qMr$(Es!&Jt$_!ZXH7 z%g}g^=vf`*Ii_a;f#(T&7IO1EIi8!pkt~6iLaA5kl)!6`yk|9i&&^lwbbQ5lNtJ5> zZQdYF$XU?lPzZ2zG%q9%g7@9QGPgpP7jKm9G|xGD(F+ugc1e$WyqFoy}UhrMsb- z>lV`WFP{AgkyW+%63-q;rnq~?#LFbR+8(>Vx%^F{Xba(>JCM9^p5_FGnCI#rVaaYtjUMIRG(fvigAs6Wp|U)91!nC7zoF zEt2f8y z9;DNP$}XWUpP!(&~q(?1eaF(WHV92(8uDvXR~ZxG2u z-COO?4NB}-+01;=p}OojQ@I_^`C0#gnxh97@zFR--$aY?)RQ8j5bLShXBFJ_c)-q@ zuPo^t=42ZBt6y+O8EK@w4*{pCM#aD+Qyaxr?@^4)hf)19UPiU!gI3F@29UodC39p^N_tEY|M#KnZ!m%v@kh)Ft2l z?NA8QYHJPEzi*|JjKk1pw&bJV$j>uRpI@x#PM=q=DA1>qo0<;YK%L?NeU17rw zeEry7W{$%4b$?!kS^gn(p-bKrv9F;){gdpD{yn$68`SRuGsVO5`_E3s-llk8Ac5qg z?=3a8NVII?Dh{@+&?pf{c}9lh6qJZk>!4mHIB5k_GH?Lv6SYLJ!`|7NAe8X?@$5-e zPI?lQ#ePVHdYtq~^D-MLp;HDY%OiwJ>bP#RUaMc_)cH(<{l5~2m0SF+;*}b}HKaIc z@rU~CT|G(~r-x6}H*9Bdt?d*OKB=j{^UH2+L}H|tYwvMl+D8rbB=8G9ts=tV{azdp z?K659@q$|*vM8o2X#2;k-_(%)Ax+|%#^oIm_26E05ysL=p43R@`Bgf`MI-%|sD)am zZlkn3zt-izYo~YI`(}g7>~b4;iO8B0Vd4>I`i50gpjgxGO7B4%`6IJ}s`dsSdw-EO z95Wyk;zC6{J3p+5&=Ztv<#myI1iWqUl*+sYo#A)ft#NaCMzjE70VzdxG z=B|on5{(egA>BNJ7W=!|P%w7t;8y9}h}RdPAFcOJ{3>0^4Z7pOegK>+Ii2)mv4d`` zYz%Z!U=JDHOc1b>Ad^p^v4Y+OJ_{Z6kIj)Y4O!Fz>d%NW%vN5fzo-ZP6KW%Fi7Rc& z6wnEtBJ_%4D9qMzYmd<87?@SZYuy`lo%o)}wl< z*7VO9^t`LeLJ{HHY}N%KO|g?+Xy~XL>iwAngKdUI2;ZKw7?i$+D$Fj50$*lH$8w%@cB+XFa{yz?sGm?!Z|3 z?vB*ze%{z1gpJ~(7>sw)H!&Gv^oG`qK^q?ZSsZ+;RQ2cx@K7o67TlN&^Fn5`HrEL3i5hB z^(-NWoxN{wW~f&P!SeP*cP;K8tcTx1o~RN3JrX%Z&IEM_Z;GZi;c&BZAHN?Z3iZMC zsPiG}MD5$f2*ifYM_e%U-<>&>`PS-I1n$3fZmzAUjn3Po5p#)8Xd%OEqd)qI2sWX%NU46D^l@;2Xm-9tqeaEZ zuTw#!cDQ#>C+~>^@L;YDIhi?NS)qODYB8hT($A7+D~|`2cdU#!nbEvhmIDnL>iePXTBe4sv1F^aw{9{73GAKp zAxefxw5l-x+a$oE(v1msPAD@RC=O;Y<^{dT3B4{PV`>Kr>p8TL@`|7}XZ{B}EFZ<>HI;jxVJ>HiZ`vYT{2S~Y_{;g0r(dg(UyoBND9k!yrj_OD?N_Bcf8cFl zg8g26F3_(LrU$JEzW+tv@5Q-0_#VxkF$H(Gr^=o5bXdH*)}IbUy2)b!Klf4qTT8?t zrlVa84)&SIne=SU640efs+Y)Pw0 z3`@IS&H{N`b<~`|L`fMmwf7m3nYNBHFPNvIjoxv5u|L06hc6GZLnym$+k zJ|-lSWn_pl!`Cm9xnC1|DPR1A2AqelstH(Yv*zVN#$)(Kz*U^I{5IrFwTRQmwa;;& zAmZO>22FmtWaVX4zqJ6_e;;SaV4k|PyM^Rq$|f)5q!WxOFT zn5lHMS58A_^Uc&ffYj3}j`u$WI9>QO@4Sjg2t<>FBCgz*;{I$<2yr!Yg1Es)AXry^ zZ#?ENNtgXewuCA?)3_gg%Zeroz;=Hsm?XRtO5nNqDY*^Y{fqeO^`R1rXU2saxvvMR zc#XEI%!TyTVu03{&oaEoIs-~a7(&&F^M69D9t`BP}blU_Y(o3 zaB_g}2Z37wDw2KBI+h1#{z%o4HEKIWe%79r zy9Fg$zzQ$81~SAbl;5##It>Y^9lK_DKm7 z^WK#3p?e1A?UelFq&JajDoz}com+v|%fQrC#HP;7qY(I|ZVCtdKZ2OqhKlO(70Fk) zMtM|2IQgUO%mJg41Cl?8G;aEuR5T5?g7cs+!s(i_t4}q z*{jN{=awgjz!unSFk*NUN1)Lz@8_j@=QaB|*Wbz0s2Sz7>s))Qvbe8!mp^Qm-pc_c zRB={w;=2JLu2dHZLL1TIK@j6s95UG=@Jj8<=SBqlTEn^an$LU3F5X9w#a5Xas74UY z3}|Ga)zXM)bY;b4?;ZncC+*WQe<#dVG6J#?ZL_=jT+sMUrqVf&`Oji{6&KD!FyO|j zIn#&(td-1|OBT|DTj4>qsq=ufekgDX1i(LDrvX%{BPZ;X&T_YyX)?L$g$kR-o{OCJYo{$`{ zD4aZ338Yil3Oe48*{Sm&Oc1eKg`HKG}(tPz>5hiP$K{IEQYCnU0aAWQJzn!(u0#e z3IdI0BgN5dsk>tN+k=*Wet2p{FB4ena6aK7Xk9NkGLOl4oDSx~KPFf~ojv?!YLQ7= z4aagAR$^NBxQu%$+ZpPCqW{m(pNRf6=}*kNuS_y&(^!?5p%UdfkNgXpTBVsUH>PBL zs%ju=H;yrj4Ba*Drw>&clNmwWWm5zUDFwyDUV>=<7P~JBp739Wu;9fPz9l>le2&6c z85hyH9#%#WM{Y7Egr4`qR}{!jmNk4%zX7S5b@FksYz!3pnS_WIo~E?cpAmnYWVVgP z%!a@3jXp2GaXgirHl7*rH-dxl+&4I>-d&YP1{}rn$Y4%_GPDTQn0foZfDtjKo!FMY zA$CzHx^@fdF0NJ>E+>%A0X%~mZwNK&O2Ca?Jm~}tK6{G2@E_m?GtCI6j-mPhN%a^5 zWk8cDLX#;%lPRD{=0KqdS{;6A%sN(1#gww>vfI1$i2T>c9vFkmzBu(PBhjk(;W$V+ znMc$POtU-o^y$(Myze2rTkIJUJmD_|ZNnvx)|pzPXCRV&8F^wkA}oCCB~Zp);eW*- zM>CCq7#s)o_N~|6Y2uKk)#_)M^~e7uTwe0kYyR6jwWw82fqH+%OvycL8@#zZw6813 z+xlKbH#Ysj_yZZ6cCO^~`?|Xfm1`z)B{$x0vQ*l)Ki&t!DmV!pskeXWkL3Nfm4n2u zXmQL9{M9^z+8a&{!u}8e^)>5y?Vb4}7VXt!v+`mAwQaOMj@!-KvQXn!z&@#r07moo ze;KtK1Qg-&c|7ECc_Gghmk-qE{{)xwxERs=BIFx{jxfpqp~GgtdqL<;hgps6P z1&hnVYUB%@ru@LW@sNC$6ZeMIA9xGjlw6@zaIitTW?Fi!<~3F1d~3q)ehfZD~k8^8TOfse%%z;Z8(u#-NX8Owgf zFw{{zc0|Qczrs^2dkPFS`fnI2EFnNWHSq6H&mCtSI94`YZr5qWLf`Fu9eLkk6RzFd zlSC>G;Jf0|C&MSvo z^egqA3!ciontKiU{pHm>`USid0WFVyc=a&p;vZjgcUb?=$GlmlE(94+K8^{S1S4VbEU zkg`#SqtQw(gbn}^)PEXXvrLDhhp&5Y8*?JnBp;Qu!rV~9VbpCZCEa`T9{JB~O5PdE z7FXo`utgs)h-n+)be9}dKItx!{QpNj)!lN)riMr!(Q`*cRFdT}&YgB#oA__2L<*b* z7(t`nWj3cuh6|`gk9(CoM&TYNt%P%rEUH~n2Vu$H^$rU@F4M=JvZ^78cfBuOv%25y z=jF#)?5F}!VmaO+*{Dj8> z4XKSqd>fV+#^QPQZ{^WrEg@`2rS395OuOTOr%pU)?=vd^st5jHfO7ixn2_;5Y}A2y%ukfl9O$-!#!lUnBw|rVPGtMzlu5!jPvdrFOU8 zrJnjxLn@rqIb>CUq)~PoZ{~n_paBzjZA1O2`vvdIGm581AmH|gja_>bcVnbXWahNF zwu>oC(9^trytmq5T^n>wA>pIl_oAIIBQX=3G)?8u5aEU(Q-1Wo;bdo&okEba#ch$H;Gi8Z=Lw`_7l|(a{{>Cs<^7++6MIS;o zu6(7)6GWd~IFzcvQ%X7iq3^8J}4Hnso-|5GzmJAVq%SMOGE zd(;+l6;t~+t$av?7U8Sn&Fl2~VR7Qo>$WgE|H+YDc0Ti~^`q`KC`Rm!6-8j!>*lzS z-;4TVg4^Y<*Jmp#{1x5W17A#9n;9MM5qWu`19W#^wb=EMe>b0@qQ;iQxp9I{X61m* zpK$xIeEz*)eHWf$lQT6XM-uS-@)zsfUH zZmX>Xmt%kJeiF2gLNq?s0qq;S?tR4=M4QH2af0+J?~Yr=E1U2JVxvTPayH>xTKpn* zRpC=PqK%fv&Kpd2E*F-t;@VXvVpf@SU`wp>t_Yq=z4C>UR`$4&Tgz2)JZp^xZ6!ej zATaq2Z{f{al`xCS7k#jXbcbrljcB|MKG1b%%92y_Hkd0RC$IVzv$kgI?{=sk!=B$}szFn6qpn-h{>fJ@~+w5dQ& z1@7z;mpJb!F==AQ*fWcz%VaMtOZLg`17)8rs6W7Mce=8k`QPe&xNBGEGWl-k<(MyY zJhiBIeM`WMuc!5bXXCmET8Lg?(!CrMuXd8j&=y^qp>2dqV z1^t`z!`vG>y>Z@K9FdX_9oIqRPA^+c{2~s-QxS*B@k8bpDVVS(T%&C0Ab)=f7pbz* zx+XYC65)!|Y+SOw$yF;}XAbNYTh#KBJCI2C9+20M%>*bUOvb3t7kg=QKR90AEDre4!(Rk;SP?EFGWL%r#5n&D zj%BZ4AMgDbM_qyG_bG#%f*a6A@0IPl*yiFyXd=>4b7my5PgE$MoN3lw4x|o|D{=#8 z>RjI=;stP^Jb#I&b|2!*KLZvS&CQD7BG=(v$Q5KNVQyLf z!24{seKn-+)#pD}598jMqEFSkc=eW9-*0f=jSv2S>W-Op@3JdsD!S|#{(4`fK>I@l zdNxz1LjGa^+1O%h?a%~p^HMJc29Qc-XhI3(uKQOQ=Y3P{I2oh9G~`APvE%f9)yDz| z@y-rXd#wy|payxe*5TAH#;3W-CGGHjN?Xcn_CeqEzS?7WmjoZ{tB2X6SU^&}ZK&Qn z3%PSw{or?~@t9eQ%n+Y2Bdn%O`~3ku+wpvpBs^vhKwJQY*;|fMjm!teO*PugZY~i2tADB-gwA zUwsr_(3Z#-ej-RJ4n=Zuta`hRlVlbutN1OXS+Ol*WQ|t!jn!)t`!=$c^ljATDNpk` z+WZ9QORx2?KFeB1e2u2nmsZ#B`kd+8}CW@&GZS^ z#D>X)HE#h$w_K&mm(~5w-jp4!vW4{p8R~DB4GsAd!3Oa!%gXL8;KP^Z+eW?ClsA@j zlhpCE7kuvitW#57>n!s$?Yo$E>EmLcy*}QBSJzc|b!8+0F#(rm$4}w*2qaRf)pHYdVmguY}x)T^L#^LiU$Y!KnC*RhnmR z4K%?f?L1?B2_y(3_(_7$)eUB%I~6O6?SBq_j1JB?->Is*-!W@$@acj-ojTrFdh_yJ zZo~lCrtQYbbi+^doUh!7QwrT2rtjbB@f|AfVGm|l2b-7`PZAk6$3uPYxc{bWP%Af4oyV%3n=ZTmX0H-DHa9F@E=mrPw|Za6C!eWIGxwFez%`5w zIt6il{_OsM4!IHMTmd9CIiLgUI`|ZGiz}Gl4qVU})a(_S-#!KmPOZ5wMpci@ zY02N}Rq+dTO}4>DqGtt{FE!J5b^c{)_m2mRM$XEOSkJqG^6=KjNi~t9?4Z0pbwmNV z%X^{O9IoE;e05+CtTR`_DWK=a=)_VBy3tqKcxFKD1a^OlsgMAndyfv)q*SU$dZ@}j z#LNQ%49h$EaV$61$Y~R7vN?oS>P=vLh+LW5pufg>_*-t|@=^OdJ+yH(29X5e_s}*F zIU?R$KQp;+5doB3KU>m@WD4dEjZJfD&0jaQh@9bu;%WT@V7dd&dO@&o>3PdzW;T`GqNijYH!9Egxtp z2y}Rs>=ENJ(gHm`Nq*1;lc3{f1}k(lA-I}HbAH zHIPUAre3yR!&~n(>$dcZq2%7{mp1*>C`I1i`OW+K!zPX~YyzVaN5mKs zoI>;7O}<3Zi+I1!3iM0}Q6jIAm|`a@W0`g{B|@4l|6Iew&AZjlazk%!r7zh~u*O6} zW|Wx^C}BKo69XB@@zLtPIyY>$Y12a{?NXEWHfb!z#^3`M+-Lk=8qWPf^g0ziRn+ns zMiG4QV9(fkS&0eAiZ}QsQfrAB#6ml9dSkSDE%zv^0eR)7FA$Pt*5my}@*hZ+z%CeX z19i-Ghu&!@a{-J!65;)j?Fl4ew>*?3L{TgAV|?gIGe$t3n9xyEjO+UEs8i;~SprsJ zpBT(|-TNwbD2ruoKfd~09!U2`e3I0{@n%53-lV8Zy0wh{Ns+Q&Z6M3Lm7sGYs!UJ4 z`%$y}3(1jR&u#b8iY}4Q`qnJr2qEg;VhC5NK#eKTOeal!=qu;R+Jwc=Tj~lwxamDN z=tH`MenKQ5xfqmszcHV9GD^$))LQSt8EzLLE+y6piZ^?J!QnJ(h zE>uDPQ8O4TZ{)wXbnoOV%5?|1ynkG4IaWblm;`~}FjE7{Z!WUrogRy2PnwXOMf5Ks z7uBvM&ot%1{l}?Y(=o2NC^=v|yuTa*dz?Y1M)j#>QO6v+T*(N44!BZxyu}XL=Xsl6 z(2*}jxI#)hFSVmj;+)iuzKI`l15Tn&LbGBO%kBNoc!pxgs|nPdvBE_39cexPOxZCO zs+M{0(ps#?M#c2r*7pB+ghYLOB|f;H%kcw5x0Tl`k>Da7wc{noo5@))s?_@!!R^E4nW&)>vrUJ@SWMr4L@>Ga=3f5(ZiBaCgUHz7lz zc`FxESJx6B#4YO%c;@0$+#{V#vmu;j^4n>!li+UP76Q$|ULg;B0{{qYCbGZUFVs)v zWgM#XziR64k=}x*rjOtXbD_PGxK~~B<($jJ3ToZ;<`PKnqR~LiLcy$9`Ne02-HcGkb0g09PxI6gSTYDJ|8!!! zvusoZ)h=-qe~)IRZtfhK;8F?MqUM%c8|mLMr6NO>>Yg79cdmY6qtn|zEk?&v`|~C} zTT*?#*m$`8o*wcMVQ1vZz&5G-x%abo;cf2Um^{v-s-v;&pneqdUqU!B{Cbj^6J-t@ zQlYaOAH}a+WTW`Td$U)GDw)IKt;`}}!r>g#KsK3)!IOmONA8~@l>+tDU~)7>HGT%{ zI3S=r-N1R0-vvUPv!{vz&BSz#gvLJmT}v|JJq42C!=B{Ar2nN|%hSM&`5ANva|<@l zhTH8yNZa<1zuOE8pE>Rqhm8}53#s3rlw*y@dh>4OnsD5489Z{2bDe5f$b zFD;c_J;PAh;X?u{JMdWK-9KqwZ2-K#8w_gyt%(O|rcx$N@5xPCsz$`lW#TbKvXoil z<*iMc&1Tv+_Q+RcisXt1V~5NyJ0m&tS%nhHF}6!5iyOh`5lypWry`W#J!DM+zXHp| z7IeKEr@EzH=tG&8o@-=$y_9>i%?n4p%*RS^@zof(a}xl9E-<>rnLid(Xvo!<@Ta(# z30UzH-C-Xrxm&&88_mRVk0)D!&Ponm%&=r7xLG=SuyM*Y8_~13Z@~2@kV|qSX8yto zJtna66jN1GD}C`cUZML&xJYgAQyB6q>C%{D*_oD=Ga60Q3-3r#YPyLYji*OS+5&}; z)NJISj22gHR^fPWZiE^UAy1T`7gi4b2z^|9`&4E#o;o3v>>t-%<4&6UxI={|wlGD? zHH2J2EbWXCBc45InTh{Ln=#W3XF*ssaWCz%p+WzKnGbW$_dfuPh4KF4QafHrMC$T| zK}W=2WZ^7}9j)y({!|7Yr$+9AKCFM%h;vN^D*El9=+7u>EL}>hrpx}7qzM1w*~9S? zAYyG)F*XDu_(#0=$t+J&Y}{?JbzZ&m;LiG@9kJ~l91YW;h$BP9$++`i8~5p{mm={M z0=+jSfXAWKuiLZ-zZ!RH|LXTOBtbtr#ugXVXU9%X9vI7>NQd_W?ti;P1NP^Av`hYe zBbMUM7jJ})ZXzF8rR*LgVfcE$o}6N{QE>aYyZCNqBxIXu%9kbpDVGrYq4l88!AAM zrNbLb=WzK#hip2@UXOKg>8x`Uu^!oP&K%3Z-tCAKqp3_}Y9o^q4^Z7{REMZkfVC8{ z&$s2Pn)7Gc#S2ZWC%@=pIKnwOhU60d&Qng1pTg?+h? zQETg+vD@lL%^djkw@`IfHB)#D5=)HoQ7S`O*u|Ee!xe>b|0*3g~#TH`3>&JcyE0DrfWcf1T#@^b}8hP!b=!+TY)#MaV~t zfZV`l(M{&>B%0htaPt3%n5C_r&xP)s&`KN?%bwsJJC70MhOT%>(#_nkc0#kncQWhU z8)uqba`88Vgt~9=QE5o1f5*~K5mHBCpS+1`u2eM`e~?LVjWWCB=C-45Tje{MLYYn< zp8i?qqphlpMGozHkar=6#7j*=TRuN`Iiz1Ob8c49-r8dqpVvb0UrNu(e1srj6dA-% z9g~q+iS(&@0{Y1GdaCl(^Su57dyOz6Bju`>F-I6rH=Tu)sY>z28GDT59wbUtwUhzCmxDnw*%9B}H|EYQRbm+r<+BI?rr;O8=P7p>QQ79S#njgK_3e`{v+aIm1M8!Iw=@eM}I4ej5(+{6}Y|EsB| zodXxN+kIYI&7DaG6WbSK2msOS%OAR|&5bRb+H#-qUj`>Feeez-xcSQeP77%*e*an0 z_zU{JL1#_h%if!qh!HJ{-QHH1Zx$@__zpM^;?!Ykb5ZuXFGzQ4uiL>-Y~6dDv>o+} zwLI$@p)7Vt-3FVzZVf3ji*dJF%axFj!*Wy#=!9TDZ8b&@&d1`8IxObvnYOwM1@eX4Qbn#dr2T60;luT$g-_lhV>&kjVfvoz3xH}(P zO6E0p19xG9Xylkw9>Bv$YF+E8tl@E&!ymeCDWL6Aa(+0zb?gp z+~`O9GdB5Hlp+}Wcp;q?&yB{P0!F+|0l=eYckR<&Qm*|T=x~5{5Q;4-_yAK7ElC;k z@+Nn}5{{(IOIMWHX?*L&P2&GCm4BM}+-eU05xkSDgxMtCR9+u|9(%@Al= zhq-aw=qS@&99Wi`lfNYmS&Jj4#PV!T-qieV#K{~B+auCjL`UX=K0dJt`E@6$+;mL z;#>pA>p#?Lb{rSh?6_uDIb#1*mZWQDaiQKZFHtd?#J1Tr2u8hQ)lbbn)>dK4*y3Sz zBs*NbhF^>8HaS+v1I(S`qKqod81X5LhNSbUEKVgJ*Ox<1ODmdHy$%#V%Y%39^)}T^ zgUNSWkWZ6k^2sdj?MFUXEmDR1G=1mM=eFj~hTH`(^UdDJ@Ol{gz|<2W2SgYJ?Q6(g z8WE>|*?dfXCjhTBFYhChX7>w)5@bg}X@qOc8(*yZ>U@O2&eRj)F1?ehn7NatD^wpM zV1v>6wt8FdmK890Pc(JXwBmMd$B~GiYAg2|Sy}vV8E!33t)z)c(q1SPoje+~rP5S1 zPAa1JJ5!O9sn>VK6!*sjg&Es>WR${50X(qlInP(-eQNBFfVUniF7%-fP++Cw9xNH* z4gRP%U=hY#QyRjnry$W}=(3p?UR9>tanS)g&5o=YK^z{2^8qJDA)iAG<+JhkEXxY~9K2U}5_aPsAwalLZknsrFLS_sV6IIO6S zHIkTYS#d#R&}Ljg zn|E$;XD2PXHPf`WD3bVrCUxDDX!Yt+O=W@t+W(cGz{{LdA7Uxkqt3Vib)#+&bSE)eEA9=NO!asbTDkJ}Ru(xd>I(SuF!RvYUhfDSAfnj$ zByqlmjhB9nZe2e%?pT&M;g(^&({2ojqZtCQt*gq`j8xE3hKTZIx$BA+rtje24Goz| zW`5r}hdoWrZDBs?it(n*a@%Je)5=_$5U4EbE^~^z5x>kQb7{h!3S7)-&?djkC#@0* ziQfpnF@Bj(=F)^Wm0^uJl@p1}oMvmL%{xDs&pPIlVEjzh98Fdc0j~{o>MHa1)(CO9 zgQR*};sj;mK90@at54*!O->}GW_F*`kdc4h=t}dy3Q-t+L5N64dVr^~g^9gg^DHmp zjE)2@f$@gg*x%)!KyHF=chL*^e}>V);)LG}7ZEvieYf#+zjUd1YMGcVy+b&0(qef; zL&6i%eTw55?g|~y$c~+|{JnneI+ETj;%PyB#kUE8K60It*($`?STu5llTnxoE1_o> zt4h=WcLrEx!@`z%)33FDtCt1~S(P!{4u4HzKK#mCx`eQ}NcfXs6qUA1C<_Ab_&+_rwXr<8p<);MAY)8QN;)P}s|794e&fKT(=QRVn$2htk7D1}Z#?^_ibeb?+m(-lAG|-L zbiU`)&r>?@O81YXN$L<9s}B9PKW262BQ%14K@X`dO|gI&ob*Q&+>;It-wPca7SMsV zqyjqlOF#z^uEh!HVBRGKIwuUTe;~cf{~rnekHK%xp#Q@=3g~}M7y6faKe$@cK%)=Qs6BPlT`9El9sg%|uj&oj zpIWFs@f$-;!tmTLE!rD994LV})8SQ`u`{4D$CaH|Xn&bO-$>UWy5s%#ElMB8*8uNh z-psSQ;eBS1&2e~lq?h%U<}`YP?%qb*!yflFcWFclXx?e3yJu!1p;n=)(8A zk6=nro()oU(-c~S_hkm}e;wdG5uEqH``gk2I01ga=fD5yKSKMA*y3K${t~6<(SGPZ zNBc@XS@}Tz)>g^nuqqlRsu8%;!}DhY38+Cf681)6AOEzg=-Ef}ysg`_h*bZ`vXLK( zn=BLbz`sQQ?17lOoXo+c!cqdxvsMm@0T$)(`kK4rodx^z6<+70*N_^|?h|dkhLx1T zZKMuV71)IB0?#b|LF{sK|C;3!ME;~C*0Q!=4b?u^Cdx^O4HJ1U(J!^}Im#$)5qE5- zxb``C3+t^o|5mQI(%{WmY+EFZUSn#K@1H@`FRgdp z;FUO+-DV^c3lk^3ukujdObqKrF_6ugvtPJ;Ck9}Ij#saA(mzo)6o~Nf&d!OEu0O23 z%tbI8I$^?2O_>h9a$Z>XJL!;-kfhrs63>2xWE5voyOD$VPq(hil^%iMuY-+^_eZC* zXE0=yJmZ#D2x%})Bfoo(UMAL<99Rp!E4dDA!8APLc=C&6=KMgEpS&b>y_wAtmZ+D1 zDJ$h0hDowc1#|D?x(e1eYbZirp{yY0zuA?ZN0Z#ZpHl}|VGt&met!kRS%Ln~nrPeK zIoW8M%|ZJ`J?{6mK0*vypjTG_n*W!s_L`TPPNRUQNF1Llu6VSjw}Hxgr(rD(tE+Iv z84{Q%OOQt_yREF#PWs~knnfeL0fTvJV4@yZMQ zG{tgK5>=X(}TJ)YIak@kw5L_VIpY=-EgAA%m&4%u5#Jd+a2p1IjyDace4pU?;4*RjgOo?W9r0#cs=p zR&1^Uh`Cs$2Oi98%w;PrH}Ej~h)y{08}_jb)*&9;u?k+YhzCwCmHX!)GB;#E-{}=i z0{7Gg_ft8k;Yhn%8>i(?MiVH^F6Y-gMDh<4^pIy+HiS1tCcx1ohD3tja`QW#XdJI; z9^%>2ugfZhJ=TtfGi+F_Fy9EZ+mmk?00d(1Cm2mQJWvj^-dPkoczx=vUa{0u#ePJ% z!sbO8u$XG_244E;4=p_(a!RoKfl??(Z2=AwKQ~-qxO;Sp&GacjSj-klk4zJsbRRMW zxKdmgwv+ii$uS7tu*;mi_9@^A+FT>dLy^N_gZrWOUpaa&8x~XhN^G5P0=vPZV$0t|!H2l&-R14WyXY6T zy_Wg`uH`zZRpEGQWofMXStq5Xh-((qKH}6-9b@~16R+xQaA{&qeXjVcbvoYI%7#04 zQqIIkd%#l~PBpE~mn{6f>Ii5tDl;6w)_bbN5qjkg?U6e8`u)MepWBpuAR%K*o!qIx1umd)I^ ze$;(tk#nwF3mwZe2)qBN!TqekeV#*rad(}Xn#`s(Bql&ip83@{2p>#xOgtz%3dV%j$8$+Bip>rFKn$W*xa zvXyx4^CZQyy#>VTHW}iJm&?~WoCwR&vR8;J73c&e9~k*oq21Ja8k_8$&Hi|PM7*od zQ=J7zifi{~3${pA^kYK+6W53R=@+&v_}Sdjw%#SQ*w|LnuNP*D8Kn{S>}4`uQbls2 z_gxPSBc)fOB<1yLyql;Q>zDhz7WMl0?nHlQ@qvx*L65Ouh87hi_Th}vfeVTcGPXm` zl;ZOo&pshc*B&8rV&Zr1{;VMA09Juw9utaaysaCgzU8LI@r=rkb=- zZC7H0*X)yc&UFz{iWaY^f{j;lDd zUPHOfyagLb+B70%0V!s`NTZk*OO3ve?8kxY_8o?V;db;o5?^D6_>ep^C)iXAe%owytX-WTv@(NDKDf;Hc8u7g&qtd7@pFcwWJ+c}FYYy|_-NlxF zkT+k{!0Dg0vFZH1w$buW+K|=Li+s5aR$%uAzQLp{ugx=B{~N^hjpxR|(66sp$Uy3e z3fdhRjD^+Ozr4*xL;5ma*pi8TgTT&glC7n!cut2YEO=C_fsgF97LC0B3Tm@o^3ZTH za;VbL67@!~d5GU&gUwEgcSBIpzB=g_Vduf}N?u|a#IrZ7<-z|AmKkKk`Bg?Se7Gox zJmwu=nl~%DA0h~9Flk<#9r$rC3c9??UO2W_UsZ`slYQM3UYOi1+1_=9g2ZD3$&D}JQY2Gv5u+A&y5#x?O69@7Zxp?49<;!?L>ATeV)243Ym{U6DVzUHn|MGhHZ#Z?p_M^e3t8sKQ?kA0HWBL_=@@vD)*TnpII z`oCc2lQl3c?el)j_D;_w*Bw*or$Irp4`Z33Ic&6dO7oij@h{=%{sVQvzX%R5$TtHr zbnbsuU**544_T$te=n#{oH~~KlhMHNq!Hn^kmRihDhX)K<#2ST{|tp zk!E34#~_J^Nwqg?U|}KG3eNK1D_GFu?(6>9kgHkGjUb$7&IrU}*u&Q&_SW}5ucC?l zRrnR_hqMYUS;l&oyWRXg$|@W>vb-5NYe%{6nkkjfWcJg5V zea4*UtBBRH>QzqaZw3x#r;tsL_d3S)DN4L0G{Dpr0YKvO?b_sgYkTTF~DkJ+SXb)@*=wf+`H3H@zU5<7iPYtfxj-dlN}dJK64hxcJXDVrj2q+z}OzE zQb*xxb#fj#-D@~xwDkh= zY&M_B4IyXmZZvlw1zgnsJKuw4F<9BpBkyDS<3GDiS7?B;{${y#SULFgM-SnfbyN7n zdbrKoQVQ1TunhNQzSCnXBFqPLJ9*LH+e|r$tMU$HvK4Kz%KHKhh_#5#eEe13_3poz zQKjZiV7%vQQ$J?!1&?9at-_{%k>16T{OU1CRH#sp8LT^l{#*R(^tm0&DeQ z-qK*(W7`R{FVfo%G7uZ;gxLfMz^gMiaaw&Y)l8CcwAt<*drz1OwtD|VSLD2b;Hgm* zY~{)0v6E}Sc{{m1r;jl_Iu7FeMTS6eSCCn z^iU^#1(S|vSLy2Fit?y6oq{K2LiVUxl%tQ8Q!t*rs*H3rXF*_XEH~g-TwX6PZ9l@y zcP!Nk-K|ON-#oHk@*}-rV;G>Mr0CQ*9BAjCJ5+ocj&5HbqE;s}fG+C=dUDb(UCE~I zqXk-G_2%9n=oLmjz%{9O;gq%2Rhllyh7~eOMMF7`nDR)GZEbBdwYxWz;$(J1CuGWW zh+go542HcwZ4B=iJ@heZDSwhbk*IU?a{RMD;{RvS)biuv*@p54z*oCq0B7t1P~?Yx zV(tLc#5E{Amk%N)U%{W%j(_c!$Gr;V zlGStcjNC6_z%9Xy9*xC>>ydzN^s%F9QZsk-{8sbC$oy}T*Un$|_~sKLF?UDeE1JjJoqe6_j5(Isbe5H-*C+k9no`ONYuiV6VJ-W2xT;iY!VL2I*Y3*mf#Ce;O`24g z?*QOXj3GN*w7h7oYtEM1srAcEPniBiB zCe2Alm9*@m)CX16GW%T~Wp={sBEPF~x#DJQ!Zf&kY_4`JEq*6D_^I05Ng&?NzOy#g zW!Bf?cjl!3#(0{KrBTIJYpc=uhY%)B&LebcHwVJxk{NSna$frf z@N&7uRKgFkOl6@CmisUBrLo1r%(?E{^wYp1Ki>z?qmbX<%nswv%@Ayz>qeV= zPk|S`(yhXaLrp$=YLt9!HDxAYy_quL+g4M44Jpg?$Nw5LV%LcPPlsAOEf<~+C5OdR z!^gpaGXH8iY2g1a@#9sNpFj@ykMZtzrVK1Wyr4AtsP<<4ois;?ob}-Oo7G)-ek+6S zf#?5?2pz|nxuYd_%p-X`Ok8g9a9wR~3|O(F@2t0ki8Bx29!#L&KS_%%aredH9l~Fg zGw75{%%EJay1}p3=3*9`D7W67d8m`o{-i(OF0N@h2$-B@>-@6-qxc>5IB8u=%Av1) z=o0Vn9PS$?BSPj3RG#eE;_OMRrDs%SPalma$c(rr>phYviKR}Sc39MHbyvH~-KV1S zHikmYA#;Geh}{qtM}pD;nc=7JcK#1%k3a1Pg5yOIrcdsw?mtOb1fyu zNtJZxFQ5wRzew8Oq+Pd-8wm>pJ;qT&^Ny!-u4LbC*@Jyqo$LJlbTgiZYPAcD&2(j$ z$^v-cPtVGz=mGP#Y^0`itJa)|7%u_h=AW4Bu#gOmTDV+Q&T?Dkbm`7$McX<+OMJsyMnP?nKcZg(cC%X* zb}y#h-rk+&QyH?wMw%-u?_U2=oB(iF)n==_=AO;Ic~7@yk0>0`k6h=2`AqB5CIJJ`J}GN-{YvH96Y<-mQP)4uRYp_Db+;jN2IR|j*nnTGU-XD+EJvJ?Zv5gfP)j@d~yw&@}*A(?6aYVlG z9zazr1j`TU;XO_CFnf*k-S!vEx%kcB!`N-7Zz40bfmgT8#!v7cN0jJ>zy8su^nCxk zzUO;?`q>3u&KKIlIC)J^u#9Er8x<_m(Kde@@A{X0@Du*V+~Nwn#jb1S8Cj^#tIy3W zQ^2Q)6txLwA^YS;Ecp(k$ck&UtSiqgF@BU=NFctf3Wky~6EBFY7jXhT$hz4(CCDn} z1(k7{2^jUR_rvKW)U+AaJixp3f)XQ*N)G$EvSt6+N`NQ6gY7I)RBMN<|c_wzRlltJTUxg9rpC1Kf^dQ@3hctF5-RwRQg} ziz0h)XVHpK0de6D!{)}OlHc=n&Yj65pl!dOem?y^e&6y3xpVJX-sgSZ=e?cxc^|Lm zHrv(X<_#wW^_oDmm0k;Eqbf$OviGLcxd}?ezQ})$KbSMi^uP2(c^dHS(;fjbo^D(3 z>#YEV2*p}umhCIk@#o((?U}skJ{{|LMFF9V-tl4kP4}FHIR3*Q!2dw_Su(=D>nA`GLc8<(oF4bTL zF_=kxy<$6-l|*Xxm3!fD4;DhBbD}TQByRxz_1+K95d8J`wZsI7piloobevE!g|jeS zhhs8Zth+6(!}_MaEgqV+r!e})cd zmv0w+wciWrm2K@!-nf`@G8A^rkm?(8*R#)xAH$zJnKZ%ze{V8>?G12xbmDLDKh95c zi{uB>=a_f5@xS&`o%sFssi6J`cBeW2p@NSizpD>F)TzFltDU>i>Es3KeSRDM{C(&2 zyFOhx&lIyST}(RHd7apoemT9`>Q#w@9_qw)bpf@bPp03>j)$m)SW7`9wx}TH6}T6C zo^G<`X}63ooaJ28G`^OZ{TZ5n5n-LlpoeOy z^ViA3VPj#eHm7)Qv=k?j?xIeIE5z9l;5P9RKJcYVlmTh9@EFvi7e1e(%kfQN%mXgx zO%{G~9fxEFt5C9{6j)dXidMp;R79srEK`XpTVh)umEdMml?X=MOGJQKfs&h7(BLEe zZWdqU6NXTgf5hk8q{1=D_M|^Qv@iW9Zfm3yF=f^Q5hlhJ!khLn#CKEF9QV%#FUfV6 zEUX7grv7?{!0MDjT;i>G+UESYj9#S&Ls!%o^79TkK*E61&a^Xm>2(=|kcJI} zh9eGQ6BK;4n(lR{n#qn#s>A@zEB$R1d|(Iyq;R(ol8o#}IucGP4haH6AAyjp*ltj@ zg+yY=9vpu)PME|zUVl!V5gEggtbx_!4xT^}18bJxklpOS{6LpV|HSwahLG zJ}ms_jl7iAV{~^;)Mq_=wpFU*?>0sDaBCxws8Q2nN*SF z;2-l9TWJQdQh6W$p2S{!*J)wGj)ob1^9wPM3>JXGN6JQ9hdBT1gZ<=cHF7liDC9fCdQ(AF!h2DF=L|a8wQL+q8 zpNTmm!H}Q+ywy8{>=L?t!|vNlKM#GB-Tm9k5tczhL8M79X)4Nvh!e@DytB)YtnS zPtw>f#io>ayLBs88R#(Vb_`Miby6UpT6Qtq8bupm10M%}}t z-0ioYtmxSu&ePT415`69y)X)w>U*-{xV2quYQ3H+FqHz{!L~2)`zR^e2sf@6W*SRn zp!<~Y=+ya?HLNam4NnxBbZonsT%tn#?5F-YpS)-Eq11fn{w^QVzxMj~Rm!lcY(5Gs zMde>f_Brc^u)xHmpvk*3zI4y@EB^c%X-xi=J+eK}(z3)eMR4@`17f=gc5i3$)w&Pg z-G!{S?gRJphwDM~D}8!aekX39uJ?%;%a1=#HuEbnE2tm6mf)=RE}EuPYz-GAVk!t- zU7dJRokbG2tE|~-yZtfK#_ejuH4S=Yy+7w#=iSoV5e9iIbk_5NqQ_dT*vZdslo1!6drkeqZA+QVu@rHbCnr!Ag+5+D_yY@sh=N zFWWXcR;dFoRofQAq{bK3pGC4h?{?1Ga4ie4GTN`j-Y-}bE8|C?UQT=M$QNwM6a9O$~W(%p_%q{*AxH^^n#}I=%YN7r)G}V829fxai%>e5>Ji|*0}H4 zakH(Y0G1EJC@v$Xu&*eMW}$QI-4yiaN0*|1;LYMA5Fac=MPGo=_{QBCmoU#WxDSf^ zHN+XoI|T)=KZX^k$)NlF(;4#a0V=(lQG@+b&mV0pC6)8i#NkgTN~krZ4X{Y!Kw4?x zd#06__@18bo!3Wqdv9s>W{CsJ3&KGizxahYo&HM2-5h=4JjhqZ{_^@_|4tLjXWcIn z&ucbn+)unW4Wbw$%3Jg;_Q8WDK=%XhI~Oy^#Vv7>m}tlQQcYZ{@`&$!9n zv>0z~DD=7kX5%czfxXhTaTX9_KQ$>l*ic;Dco!10rirjwsce}P{^p84I-wIu%rb<} zTasTCCj7U_Sz1}%#g(5k>VcU$S7+*sHw#|PeA~X-#<>A^%}i`kxZSVm*V<^>-{Og5 z9P@Z`m-d@8H%36Z`TjWB=gj2zo8w)~x}hHXEqVf0E+^r~@|2z-hYB zR6!n)JqH+K1Rc2N>^6Wm4dq*wzgUoC8!!P|3Q{_~*}CLVw27-$AGuj7E|{ z=(hPmC%!|?I#0*pM9hP9U38ty%Q2aUYwcIGQm+ZsT`s5qefXCd;1g=~YVWivaf+f+ ziSOrc=vi4B>KYc3(Z7-R*6)tKTxIfndBfl!YI6XCLPMTTB{J9KusBD$8meT;R_5;L-2OOs?=(!w}mH^!XnHa^W`njn0vltcpUYDC@%@ItDhj^=hQVVk|4)6QNOSFVsLmtjF z<;$RPBV+h0P9%m<(^73}duKc#1#L$FvM4%a6KbD`JCg^)x5&fvk}T{(deWJF_{zXX zKzoEensZk*Zd~ihiN}HZIT2)fdUFlTGqk9>G~mrUU+_5YwR|=BG4}@6B%c!>Lw(xk z^)7icL@{3Jsh`UQ7pAX!zfT&y#B-wgnPJ=Ix+C|s=e+1oj4^r#PR|j2F3}%h#yWgD$IMH_w8(z*rgc#PG&(tjBlS%$pAms}4hnw0)0r9vb4<(XQA{6R z=zV5hWhd|GBmBw3(iNoYC9UA|jfCFrGZ` zntdfsq5~CIz$|@2W6aVKnx&`KF|jFV&Rka6Chxt&zP`&6W2#*EWc}FKx0CSYX%I>p zommg5LW*d3qJfrfZA!`cYF!kaI+o&mJi~Ua9U`wX`*B}B8u8KAe`tDM5asc|*cdi? z2D>?=2SN&QciUY?3bAYxPy2!>VU*V#aTMFpDS9!%jnSbj&FI%LeS&Df(!)L;E+d8g zKmJN~`pOKjZ9BY8Te_DkkRPCSUyqqFjeO z&^z!+^;|0zTTZ`0&z4vL5*;`Y?D)uNGg1n0H>xseNmzkQCB;0<&5C z>@vv0*JJM#CdD+s3gs<-z`KTlSK4r{~vr)zjW&5{^#d6@<;%&EGJ zA}O75vO4kcs_pmnj6NAPNcqS=Ynj@H{tlYX-U!TT+78Iz-ufv;Xg_X`dssRpeEgqz zjK#k&yeIzuHqPQ-I|J?Te>W}M8zUnpX*lGQJ{ zr}Cn9^KcxyftrU)+R)ZDr=?%gQu?X3`Q7gb=>Ng&Z_)oDZS!!oN>A~pbJd}3C_ax5 zsUKvq{}x)R`hOxo)b#45krq{-rz@~^Tz=gS$@857=+I@2#Mz{Ft~y zB=Cl02*I=lEwKgcN3XTrXZG{6N_)FeHSAB~v1b@Z%T)Cyz8rd1LnH^}p89-tPu=>8 z|Mej^*a>!}nKPV4PF!gUB8gc!ldTPkQf54TrjZM^qqo*2CkASDlJYTAxWjaIoX3W% ze4?nS+~Q14QUz})+Hz2g*%C;dQe>`;w9FME%r>+1+Mv{VMD}J>_6{LHX!zb|C)njA zE@Yi0LMCNRV55=$d$HVvxvtoa#y4VGcfxi zGpM#<3j9W~H|eae!MvjAQLxoehPJc&8AvnR)B}f_rqWLW3VJtr(_S`m$T&pK@7|`H z%zR5BPo8c#q#Oxl`z@;+T4I={bKg9tZk{aKw)WYAB#G*fqDbWqHWf*~zkP+)KM>`- zXe+;HXfU8VSTpuI_a3%iPv^0H@blq)a5Q>rQMDv{n;BRnHh2kd^P=D8VvaY@??dtp z10V4)kMo`r!k!Txcr^}ym#{TDC)%ZT2~n<8=JP;#<3p`d#S-Jo?SoPY>P2Or>uKVK zr|5YE4_;A!#a#^EU(Ywexr9`H2l$=37%45h>7C(oiAklYp~N$0;%{OteN(68{I>Wx zSzERHrG9jj*{TJv2A}icckDmzuui}l_hrlWVjBnGRLZ%nnJ`*iePA-)v)F>lZnC{L zc^v_DqJ$Uf&rBV{cQc={d1M+`OR8;l)|BN+dlit7Gwo2*0{c^}8)bd)ex_k2>PUxs zDT}!BEoaJWpeiw*+aBHO33J&#?PN0~?%AgKjn(Vfumel(-iBMmVTz_lC z9MU8oaBbr1$c!swBqzIfMcJJ#Tf) zt$QsHjv5nj2k`k7O4Yg%26}CI#BIQSAN&*3YC}o%s#HXwFJ? zEE}37P{nwHKCL#YF_)A>>%H??5K zB!_Kp+*ROAk&ARt(B^;cx2*}Xo=4skG7C}EFu8P5^Pph#aFVDD8cf9@0f|5-yd4{_ z$To7rn!3s@*Pki+ml`#jnxV#Boc?&-K5-u8Mf=p#X_~_mcTkwiPPWwc+TeW`8p9yQ zC0#L@s7Li67us$o&ha(;K&$Mn3%-P8;c!4=J7JG#z+6nQIuh6xo#4O4tlrW2`u+8G z?guy*cfaOL!CRE)%{tIG&Y6vfW#_r^3pyZ{TF;{K`OWOX00~4o_vYOPC8W*-ls0~= z_o-8O)o&H}HOEQ0+~BTn^~sy@plT+&e;?(_U@z3lO_bJ6Z!%@g{DUb_5u$*63q=&L zW*G@ko9YZZkrz$DVuW0luB*$V~eH1Op^4EER##0B^6Qgo^U{NO`EKTcY zCC@v0pEKR)`zRu7G-inGjXZC6Hyi+!8;RS<4_tQ(%%i?el)2fv^F-}2Hbi;#eO`I* z_k$OL@OIom{Iqdb&-&vb={riOC|DAC>D!DxQuv#;SE-u}8-cGgp#+~_tvRsrDOq@B zPPy~=z!kcrdp*BOSLvF+N?&@uO(vh(hp8oasIS?)6aB+322ZU;-fc61n+iW2aDbJI zOTZBmc;ODJaMve=X3K=|cJ$HUwAnAeyw~M5QjVEqN|eLA&51S@I?NV2l=q|P$m1Hzy!fj6!%!el0@&4mk1s>`GK-KY=a=cJXm}e>qZ}T_6T>y+gghAk1K<8e zM9d7CDquse#b*HJzs>}dJTnYunrGg1U#fEeTyx4NI5GmlJJO7WJ1JE_k=g?*Ue?z{ z;dA^M`$M#zt#F;__i6E$YH>Cd5@!$rMglpzak5u!DB0&ut%JlsyJ=glKkk}-tMoTH z_z<fl&+Qu{CRk;%u zUS#!Ya_E=k{vIAlez%0l@$wJe#orr%3Fp*4!yo@8QYoL zj6#rwKNJ6~oZMk|AsxJA$)9LCfM~a;ErW&jP!u8(BBP`&3^3W}^e$)u=msZ-GDpWS zcv%A4$dNKP0Aon!VaK?CHjz_ODMsl--$a#iS>8g+(L?0U{96&Ti+&00iz3N!_{Yue zNnsPsGQCdIxoR>=DjQ|$(sfBXDO27ye~IqjqA2mc8?t*+CTXXFScw3(o0Cf3N0v@m z9ZtL_UqXqY-TJLk`^`onE-cf!15W>_omB-?uurnIDlP$-9yTaDf7{Ce}$EaGI_(r7l338-~_@ zuudG&?=XJyP&jZ11M?4?-~1}lE3?iAFRffl}b?`l0WG3eb80`n(4hbqZm zshbJRG-l>SXoA4Z9(-Xw*wF#~n+arUO}#={D{tE7P!kqE$24*iW7H=2-N5SgDu$$E zJ03+`J5zRp5pQZ2x_nmh7pC@YPK9|34>RGk66c5i5&G432MGb$oht!%?Dy*6zO>sd znGHM0-((C7>zEk9Zfn!yBp-n{b&vth@;ecaR99!pjr7bBVQ7SV7~iKcl!}%)28it+ zQlyhJRraK}!K^?i)4)K^fetWa0I>KqEJg7uVh%a+Dr@LXfuFq1QHn2bJ~Pq(UClr@ zG(8dPBM9)u33*mZr^=YCxgs0|5!Lz5UrPc{3&W&;SYJH!G(QY?wVP_Yy`g z#LY4Lp;~k1cQRb{h1Oc?_DuU^o(;0)`2s}YJtj-irw4#QK9iE%Lz_X4%+mas8;L{; z*hEx_B(EhgJCGaR&f=O{;H&nQr=x|VfT$qrWejV5n7k5Si@2|8v+QOtD0eCijN<;L zV2%4Wohss*z3^%D#`O?9Y3;dZz@K2YNHw^^8IjZ<0m=v&;cA?v!)2j9q8{kVI|U)0 zVn0u!`!Hb2NdI$MeCeOkRnguO$T%}zGgvVWcRL3;Q)N`P_>XPm3=v}l41CG(h#L2u zJxpe=ekYy97L?DoyJPYqYyC{5QiS^&6*~>xMk|^j+K%3hNa99(&O`CRApIkW>q=UY z{&ht*I=XW4buY7~M(F6JT~iUCp80Fm6x7J0z@r4WFc@*!x;AUSNC|H9e~BJPnpKw=2WywY3BhFX1j?s}a6j$###|qkawA_;2kJxDD?3?Dq8Ml7EX~=CX{^(^Pb1uPYxOjJ#qrz3?jf`jE=dM?k#>`@RjQ6^@E_DWJN_MC|;|u-<;>fioA^rP*4}N z=_jUhnckOk`o{9E87jU9?|Oi@-U$WlTO9w6>Lu?qKX8EJ( zH8qT`?YxDIaHEZ*{5CTDVl?51hF=g{Ps3su(O;rqam5*86%4^ESX)pcswjW5tm0jk zO51p9ll^OImTpep>(dv3_#$=XdA0iMK1P4-8fqD0n3=iKfcTI{Xa#&F^RoL+7GKZK zXSL~O>^ZkCao|f&5j=7)2j~QCkin76eot4iKLE~l-}Tp zR#_nzU6T6k5k+~5f2>hH4}Tk*h9+-p#Lv@CPi)`?dSbG$9F_vh()uqK*7eZWJixDm zWHeH$6b?&z`*ac~;R%+fGZIz)(KVyPRb{G1^q_r{ph941Ygp#X$jrkiJ$M%o^oK#c zu;E6+#gtl;B>P*uejnw_%wE_4uyTPUFDAz4CU%|Va9uR6G-doJmVc9<#yI3C-P43d zA|-ULc=Q^i_1pdKok`5@rT=-EUy}ldP|uwm=&h3SO0ZHsnDDerSo&TCnFR z*Ft%3zPn zm^rxz^Mj|=XIQ!R1A%eyCXp4h342ms=6s_$c;l}<+_|QwY?nN=rwDKU57j4`iC|mY zg!_Sa8{nAf3PP7mF7*NPh#9uM@i$KnT^+MYk88Nw-Gbmj_#8(E1fAgP9ysw*9 zgh9=4f9VD}7|hzESqJbMuX!RUpiHhDXt&!fuk?~Nj2QoKR_0_`w9>6fYM&_GS zejk0-B@fQ}w?{Ll{H~mx@o}s)_jBhEc9C~+9uN<#F1r4Dp>H!t)}4UyWes1WMQI8? zANEe#wX-!bAlBNA_?^~H(F?X!mvoBuinSga9h4lp6&LgM{Z&H_YRq%e<3sGWyr}s)kEd>P+~IzKGvQ@mGs&ylO@L zdGIQAn^kVicxGu((dR+*?YqFYSWYH>V&}7v4a>I3T^?UG?pG8!=X2%)(+Mf!t>SBX zs&^@vmVFaCAKm>&G?A4-qQS`1;G=xl15Sa0jcqbS?1ZHEycj=&%d>~u% z@+R-ftI|HkAL)SA$NAOzACob?{#aTbP0K#NR^a&u%u7c3Jr_W%wKI8vddu=+Q{Fpc zhvu8*#%$a8CFb5~dYMkdx02oO+{yX7=eFnPrDq$z(m=0@D(*Z?xA?MgfATuTXs{Wz#v4^okQckU8&|eE)2@IdA~VGScxa6r z#kNvx7deE^(J#WE!e8u^z2$zB-y%h)sg<&qH+zZgmQIh2cC&QpOtpvlEWP0zFQ!VC z{-{gPp8V9ciOUeiPnpwi=2VtIx}-rYj4O`ozt(S)>!pSm>LQ*)oT2Pi|LYXDj2MJHz$aV|x@ztS zUIAd-^|%k#gygpAb6Ri6KNA>^b51AH@c5s<58l`oSZ^HWLtZP^JD%pqG(%F9*4F6Du`l+2taYZ2b2#C7K8I|lj}F(#6cFdVd#>rF zv%g0{hzzeJJ#u&`k_Yf08uV2I^bEW+t|YoiBP66cvnb^bZk^FC%Q zd9n31u~y?Fd!}&HWF3_^|JwYwu=-DoQqPeV?~(6o`F++Jg^6e%Zi`n80Wx``>?ZR{ zG4OF9jf+s~(W$CQ&s7QzF5yyn@w55OUK+Y@zu$7xr)}e|dxq6Pvqyt%JO0Ix9`j{? z%rf~jYTVs&WBbb@;=UqDBHi7%QPug{*`Zq{?*A5|I)m(S2HAwoDXZ%6(Z% zmS@D_T4H^j!#8Q!`-Q;43BN3$vp3@Ou2XFatN4m zE4Sw7x${%kXw4HBX2Qsey-#Qwq!sf;d+*u)Sv@^IZj<(#o>FjDtGAHiDHB zM7yafCvyD1OwEEa?cyyeC}#3#Shkd-2v0=qVxT7eb1e*QVN-v2IwJletemKrqpmPce&GKr2bzgf6%&R zOY8P|c_ljYEe*pSdyc;_{lUqi_$^L&albk4i{A8FO@KB7ro}0iiJ?IV9AT$sp{$)` zh4)`5b0)d1$qkmz91=_MjT8Ieh=i@~6Yw@;Z?pUsHjEKtymqHqjKp4TpxM~FRZe^Y z4;OLGc;?RV=Gh^n+${aazC&u1C1v;@-Cg;(7QhByM1G^$;|`ATP6}WPs_|po18p^i8#zs(@f?vE&rr2^ zzck8Z;e`wsjYH08DL48ug)bVn;~vQyV1Iv0JD4s9rj!zy^65pUGb7#U^ejH5e`DQd z>)->FXlz%)`lZTL>}LEC?p9sv;=XF)PfcFd)Bv2}8GR*mo~%6+UuhzBv|c55z2&4+ z2E_RdkjXlCwPpLWAu}|w>%^Cl)Z3hC@(@?|dm-emFm0P&#Bg7qS(N84bl13P?;e;0 zWUf}Tf-TRxeWSlFh7&y@I{*4cyDrB4w0&VK-x%gN<}EX6)sJP4ILTg#Y|c`=cRXLx zZTeX1B>>6wm)Q6#_YHz%BFIU^_sb({wedQ6V<`m6e0|iXk8UW^CTCDWaR7iDL%%BX z5X?LbGY^PKw&rk$sr1Oqw^5mgG3LPudp7WwGS`|noZ1uHJ9Lf4?Mz!-KrgtgsWb7Hh4Rmx+Ao>azU8>M{XP5T5+j1oLwD|nYqpcS*R{Gy!L(++?|)g}iW zL|E97O+gK{p6XQ^|eP!`tsa^=TPjuqS)GkF!H~cSKZS4 z!QX1gF{Bn7KRYq{anq`3sc*mKzAtE6Rlg;~@mcLiaD41;+Sfm`<)H;`hUoRXa~~!q zTHmxPH0{WGU3nW8t-lvZa2M)>2rFQKR7Ev8lHKo5c;M#72B-0+gIiCmKcWpkpfvSM z7OritaZu+IqZ?Edw`Obo)=Yk-NUXX4{Fq{T-(r#z`_j+*;>NU-k5{m^zg;{Dp-(V!IyN1u9*r2lgqxW0gJ6Z9Ibas*1 z9a3-QpW#JC@FFvQGx(MZWIKuAv>TCPFsYf?8-~9c&L9kZWO3M{h_=E zb6ldCy2gBM1PVrmddX7$d}GJ{zpehK(FZM;YNPo`hAS2`*)yY<_8Py<_!yer&j0~h zPy=}1Y|h6q-$k^q%uq#;bTPB~^)Po~Y2rzH8>F>TSLnYb3Qs<=lCx&)Dts4us~I_SB2E@>M=~ zwspV$HL8Cv1^j`c{l4!RM?+5o%sZw#fB5$^>&e2ql_SilUIK*uRQo~zgfUbRsG^Rv ziXzE7${HDj9py`g_8SgvkIO1yE~pwl9lk)n*}*Y2t=_Uf(tI98+S$+S4{8%-cUxYH z97*!fvC??aEcaqt?I~DnWOj*sbA4683Kt%}Or-G1ND^-<>roWHg;CnOy{rdJ3%&#q zGW1Q@c}EcfV_$j0q3K?}d=-QD<%qttlOrYV<;ZlpksN7OcWj~ruP09OVl8j1HThPy zpKs1+7yGcp&BhLAu90?EZDkcuq@8vaFV`gc&8M}DJ><$u;gK6&|Y ztK;-<`OyS4z+++9;yt;PF$*|n>UWtwb7eXFJNx~1zFRiLP?{=KME1TxnRgI8N_RMv zNH8)V#hedtnvNAyNH&!<(huA8lHTb!X=t%9B7)D^} z?=Zt*q9O0LcMYF*;-{)vI_nEwbXlLbV~N!Wv=DJr*FRv0(s}xT*oG4tcLi>^-GC-* zw^!JGr{A_(=^n9n$knMH!|pB?1kEWiV^?A%Q;O^`kTDwKDPD2nB9!(EfH65u%Xn>= z31{*F$}$v_n1Ur$96c&L@L9_<4++cu-J<&duMK!b*0(wB3hLmmJiss)Gx%HWxY{ki zLjy)?HT^(~D!I-ep}sPM0PnNc?BHK!(J^>?$-1!XBtHi{p~7OgQy`^O{h0;(;vd^+ zk4HPKG50REqW7ni@qZqBP3xpCu{fE(&d5Al0OPdc+?rDz}+%)luzH0dLp`nVRE>t*bck zJqwP{V6XcfkX!{gzMMrKW~bblx=VdLM-O?%14{Md%%Z^HF>J~^iR!V%t*JX0Q5*aG z{kw*JuH(<1yz^qxYWckL(+BB%3w_KyS6v(f$F}Qhg!_hhmGwsM$0v;HgYCxT;fOtc zDcHb-X*63u)K=hokUr&F^!<{z(}VrE90r>8pY759!-TKU;&-t$H_VnFRNP|7X{MWf z{cc#N-te_B5aa&@jXC`sPd{1z=WBcOe;WK+P#$geU3VXwvukFg#(~T^GC|Q(+e27@ zQ*8f-(2qaR48O7Mq!{mO>nt2^DfgG=)Vu$I%#dHm@+XrrJGE$M2EUo3Oui4%Zloxi zQ6yAS)6w(9bt=*QB3y#3c0{b1VZDDJF6e>X?F zDezVAB#d|JH2M6HSp9I~>b~wS6sy>}lKMiouCMzl9afVxhQuA$&>fa!H$;3d+G9rr zK8EsEoX#f%bCX7T5Nm;S$bC~?&7!dU9Z!h8prigR0vqMI$Q@Gsf()PMhJuIKWI36t zx-I%n3O`eQN7W>ViIfzwy>2~iP^Uay2*ij7NMV|Mr0_x2LJlyA8p3>3I z4E=0dP~bEvM$F7v{)8aurxJC&6C;qO^?6?1hoVDgS|L?bb%3dAmiCNXMNSKg zb%`?g;b(Y#<%8qs!>LC|Ng5xxd}eb#%jki3*ju#cRFwd$=~GIUFZ>UP`wqsn(0y>wa-_bCx2t3~p#{x|xu7$g=HR%v|7|Nl1LoV15da3^ujF!U?lU z!KS@WR{6s^ZjE}_=EYX!%MCY~2ECy`k-CAWMd8CW=lFxT&j-0+LYUo2;0M@x8Q4C| zu!DYcVlTCNx7-I#zM}$(5v=iwTiRyIo~8Jq3LGY|UusPq$lnhBRfT$dI(*yE@&a~J z>JO+*979xs_q&(#IhZx5;DqQ2#NKfL`78vUax)xgwg$aB@wLOx4uqL9M>1DaH;czN z`}+=A{t>zWXHF)^8a@(svDx2608ZZ606n8|FYoc?O0BQLdP82dLi|Jfnkn zVbdG~I23>s?6`b|t@n|?{`~O`T5C73x1f@Q1Kz#w=jX+);wg?P3Vx08IK2cQXqjzn z8L_b)D98`fjMa^AT&=!U+P#aH+b9B~Ed{CG^D8ta0w$cMMm}ZsvwPE&NvSA#LUA^* zHIGuI*Ya1|EV?fd3H~-V@!=QBmw!`Pkm=P%vFTZ>@Gt8-8y3{lywv$q;mT^(bJ;l) zdy?xK4QK~{+<7qhB}T9{ic};#+ejz+(@^X++LlI{?E2JOW+umizYObK^Gg7K90t** zuNZlsA|bJ_A7yGMZ0(Ai+P_il*_8DD@TTx$<~?;JklVfPo8>Pto)wGO$0=ok>|0QJ zDW$P|SE%bx8yR^KI?pI6zRPy@Cap<#%WzNk39`V4&3@3n@nRLe|MqC{&7OGuFfW2S@SnX0 zALrmu1Lo_3piT~Hp1gP8@ZmhpplP*t9o?7`^K2R0U%yuGkL%gR`?;?NDSm95p=(7d zyaJuQu^a)XQ+g!QhP%c#j)F%_JQ$|R0WBD%fkF>jg}i)UaC)y_WKI0{^e%~6%l*uq zd6v_DjZXf+0iojYpd(rq6yJ=5+0z=Pbyejp3UT}v>@x`nQOaQ{Ic| zA+}%?Hg<;D%D$%G5)Rv#9rYctIfnvXZK?qp^YJB@r}Btck5Kx#;nSgKu<)6`FQHi7 zs%(7GZWs>B#Oy){10y4q`BC&4lXMOP3Z)mPbAH4fYXiO`?(h=#EM0=rOsm8eG@J8l z+47Of?a{8Pl;)1GMvCA<7+wuj<+gnd}8EL;d+5YNx+tXsN)UjHNHXy&)qb zt{NOg18NZdX&Nm0XWL`{hpl?C6Y@v&_1Ey3P-Nmju2@+UQKqHHW?`9Kx&v5!FTqLd zHkpMRJqP*Lrh|EZx(kN!*DSo;!|>PK?}njxaTS`bdFFN%@07VLC2VTK+^)%Nt_`=q zENr+MV0Iq>Ft{54X4WPveik&8L2iSAhVR<|mUX}u+eM_*S!+^F`1ndzxb&YfL*Z-t zs_O+A__K^7>NU&@Iw7_LYQckvT>G6~k%#Y=R* zf}izW@wRtySEQdba!>GdS)%YI^Dk@vE1q@m1(b&j<``T=i^VShu2F<<$c6s zK=cU8AIr0M0G(aL;twyh#qE42x}VNR?b0LiMa~9He+5 z+NpIZ(P*u$!q0wce?uU?Y|`sg{oVeIHZgbzbZ1U^4gQ1|JS7IN`Wk&tLDx?VUcw{W zEd925cOkkJsl2}~Y$-Aa$HJD8BYaJ@2UTqi3kmQS)0Q`uDlLVBd98n`V*o>N8i`Pp z7#vmkBk9Ip7mg*U6^1&(k^zMQnwg<%UJ!h5le}^E7#cFFQ0Dm3LJ|aXzmb+y+M74< z3t;X+yOOf+AwSa(E1!zh_U#@h#|S5HoJKP?LY+t*7z^@*ONYIA;9I;F*C?nlUp9M# zcNJ>o)@U!25j#zr1&{r@+B?#Il>p-)6<=y9Ikd=ThQwPH-Jp^URCCF~vi&)9kE?uG zziq}vf-KSDDjF^K2Am+il(})IKesTf_s+x1sCShH8U(q!i02&9X=#V6YGhnsKk zYgIVPuTW%O0;^x6N;U2>HMBp=PXwtmO@}|k>&Iv?Rod!qQs9w}Pmb!h3^w1*+6~;n z$4+16Rwt$aCyqN*ZXHXq#Ns*ILOlcZ??@!h=wr5qz>(9mABDJo{hXk?`0}}4p*zoA z6kE4n>;uPndS&dhe2XOt+)#Eog5ySF9Q<{_X<1?rKdMdiUc%?P;N^2ug+1S@e2J?d z?5@`tAP}YHyL_z<+7uk_+{=$Xa<@vx-f_CTHTRvuE{niF? zP)6pP+a^S>iO$=qdZK{H&NlunEHrKhP-~@rYje_Sjnl*uu-V|%uEuY+XKgYgSUMhm>>&C7-#>-i)q7)r&bpj?LrPnv^=3hLL$&5_@@D?j>% zoJD2<2m}e7%Tdc7Vo1C zor&*Fz0G)$bM$g>?A3zHC%<##Zg*>JtuuFRVVAkg#yP>*i$%=7$z*YP^W~w*b-~6w za|w?4ft*<5#BN)t*)9J77hz2^|;UtG?xO6ov962 ziddrO=|h&_Q)T?Lw#`7E+S*r`w{L9d=5b67;vA7&ngYOFuz%+uuaZ#MJ=sCmSgcmUuGs>G*|GesbKWOQY`l4D;63f)Hza<& zQ+Ou@y(Kn^<3lVdJaB&8YV3LQD%x4mo6ueAu=e%+@AaKi2k3+KSLej@wterk_wTb! z`_%vF?!DFb&x>#z(c;a>FKr1nD!m?xdr1!Bn#vk@E9dnZZ#2y@rv7F}R$4WI3D^3g z^RBlaFTt$UJN8AQL*N}AuC3^??m`6~s--N>IkI#r3sHS$79!_$)<6`+-oCU2(G

rMkl{VeoFOks|Duha{dQ@p{xQQjw|l+lp3ZZ={HCqE z;9GH5QC>Rfeeczst<8yjNblC!tQ68qb(sN=vf>q8Pi$XtNpri!_O?BnflXs>{NfQ zlDXFp{yPcN=XA_K|M7g{Xr9RDbs+sryX5cbr`qL;Pv2+8DSB%4RSxN#BWp*W7#?^{ z0a`{6=N4Vl5J}!Z3OyY_?7=zDBAEKEIu{>GbXJhe=p~{8w{s|Q-p@-y?gb^zt@ge> zWCL0sJFmVksg1X#zX_gb(Mq)KexuWFqtTjV!J~;`C1<$j{h>W2^y4m?yZOk# z)}=ct=TEqxcJ#YvBzu%;dmIOpnnA-0Cw~}-&F>T$ovs661RM{@Z zCHziJ6~9||EK>zM@Whchbei>7gk754lp1YH!M{Su>Od%YNvqqLo|cjTZB7B(BO$l{ z)JU@b)Jc8PPg^}iBRMPC?a@R-2`8}K8%x}4OOj`_F5MAdHSzY^(P_LS?tI|wx2!IC z>7z(?(zgk@lNNP^q=SB*(GMfZ-Uq>aKW5HKBbA%OiC*UDs1wsUmT=;yWX{H$|A!Jh zzRYmWcwP;=uhq=ny879lTv2^g0D6tB&*uuf?^?JyWgh=IEoAI3w4N^PtqaqxbRk z`ad~OFNy66Mh}SX>Jsgm9QJABu1+`HY3NZcQ%=UyO2tbK>Pnm($j`oi`-Y7v9q!5K zVX>(}Mj9ZAV41+1dYB4J2#2|>GqwOpm^-cHyJlOf)l*_?^SIvIg->5Vy-2r=rEB_l zty_L@ANGFgRG>j2Xdpi^F@Xd9_p(OrkbL_Gbe@ zhlNW>Wg64G>z_G-oh*EV{nM6MH(shR)aE`c0*Sb>Qr>yn_>4K0Nfx)pQ=Ax4S)q)O z>i#kY7D6h5P!de=`EEy-)07jxRlRV;jkh_N&d^U}^hsQ7J*msKnEES-o@S1%C&!nt z!DX+D`^ic)q0vtY;7B4Na3aZBLH=Y*jG;u0iz1V5#Nu7nfVXD zX`CWX)9?0z{@d6?=9(W3vkm?1Kl(E;oX>4DkU@OcmxX7foilA;+DtrYm#spSl7B7> z@=5~l0_ytoZmw;>U{uudoFn}hw|Nssa!A;B{;h-z%zi+0xe7h}5;iOP%3ps>(x0vmac3dGJr!z5ZV2Bmkgnu9eL;Z1m`ij^g%w}$-=@H z85)WGP?SQIuQ+3G7>7c*UfxwXl^ zXereuAJ89$fN5W(nPjt#&I$gO)|r(D3A6A*mD?wT6LHm0>Yt?Ke$D7b{gx3-sR6ar zByVaeX}w*mQ&!#YY0qhTjQ{=mn5?vM)3b>?)rQz_;ICmMbMcjP1lB#*GOr~5swVCY_}EJfF&#U1W@2ZK)P~~0M;hQJ)!Sx-`K+V9XhoF9HT_!a`zk^x0*6^KN>Wh2`(WZ&35?wKK_8gIVswhW0^QZDK-6#4RZE zde1TAkFJsCiCVSAJCrxGdl@L$ZQJhs;1zK&A@*t?v6ptwyZ%v%65EY^B7AP9xWz+n zM2X@0bECHi1-%xx;Zk}@iyFs)#yLC_H8Jc9Q`=}{UaG}5p-l_o`KeT! zKd6iw$paC0acwV8NOOzJ>UymQubofyt^`0V&l_ZrnLQsNm9T{uy)F1C!E5DQ@LK5O zHPQQv)|ut}FkugCyz%^|%wZ}6RT$h~!8;?{KS(JnnDm?JnwL~(`4-IjvA<6PIBU|G zd{f?TaMxb{gkQqp3%h^bJ8#AfYChS0?i_rbRXpeTI>}#|>^|pFvFEOL^BsuRp=Y%i z=Rm}b;0{tk1e=8)LZ{mGL`wE1>IBHygB*be9VE_1o#c^+zbr`dmE_}**t@M+sUkd`wv;d#vl zTeZq7%}g@upI?vnSBGt&NzIKAf>uP|b!Bt$4` z!PrZQO(=Gtoe4XI-KxGfj3(A(dXN!AfDvjN9GSaB$%f@?aeV>HyiZ@5m4`^n5-FG2 zws}!3)Lr*0CcC_yH9_23aZWeyJm+^acT)knSX)1fS%;(@{|l|;nTZiUJZbLE)=;8< zS!EQ+rz(@7eA*ww?C82UBeXd#mK?)^Rk$FbTIhxDVw}g!bATJ#!|}XCiTmdAEtqgl ze5mT;Y1N)bu#W#qYZKkJ*CqOIH{*^h{{YOx61$N<5brP_%Pw!ONnBr5n<&DKdj6n@ zGy7|yM6t_G%*hclPxJfwKvmPWXnETL4UrOBA{2LNsMlgjKTfGr!hyMzt6xWSN8h}> zxx0!3FZSHvzUeNVyQKhdBXiex3cOI8EErgwz%F}r`DV<{`V;zXySy1u9Qf!<%T~KD zg_fs7v3EN~|7vmrGYI7Ycs1nqtww1KRW7-HNGK5Vyp zs;v?>O+^7U1Y+S(VT}AL2+>>-54_=9io>w2J|u~D9SD*O+jju9M+arVxujibfph$x zrN5@qK@n$)qzn?$$50KT1vGEfGsqxTg3+vVR5+ji{SU4Gng06M->+Q%pXRQABLi6f z)cT)X|9&^`%=o9)|8xJ&^^YR)pY{LWS^pnvS!?36>;IX(um6v73!3%6XF;?6DfoZ1 z{@Zn6)_?mB+OPk1rOo=^v-DopKh-kp|H;3z{xQOl|70CdD2Y^naKfp^!0s-tk;5>2 zyDKrIsyaCi&q*zE@R{$xsTN7NmwLZ_T{N0k_AQO`ashQ z(LL%g#yzg!U8**UZ`Ks3FtaDDzG#{lh;Zrh34)k9+K>qSKX5s_~q$C zZ2uu_&2Zq|aL>;|l`EYl$!K?l`xXKgxfM$Eo)UOr`6g~E?o>a5{{!`}vAtNT%*Dlv zoo7OWjyCdcM{&4vPW@An#5j~gPDO?pK({b1YL3eSxp&HJY4m0kVMRBF;pE-wo6P>e z`-V?a}udk^K;f1OT)I7zm4Kp}cT*nLUKym3#Z zeubdQ#t)!t8SIZt3@xrCBnf{$1`?+P!iiIyo3EFuFth+{gew2)Owl>jQ1blU?$V{H zE=%1P=WgiK887hb*4X?hFMYIu0+04lWU zBiw4gG!^dh;Xev=xAs7fpgRF={&oO*IXYPe=%d>M{Vtz!fL{OP-hr0m#RB~S6|A2k z`5mm!Yf8NN*!e^o%T-No-FhaHos!zbu&S{0Ow}NWyi+(aXbN%D(Z2jR9g05}mwWUm zU(SZzoe?&oh#?5~+NqLIey332HJsMD1YaF!3H4lqjcg9 zAYTr&nY)7`YVT{Bt#-eth4QMD7$#EVZontyz8!YwSGzB#hjCX8(HZk|*HYyQr|DVx zl$)kH@M);$rs~Qq(Lt09yQ$2=>~?doB$qBTnpxcx{s^ei64O3&Dc1a1E5mxHd z)o#k1NTZZ_O(8QZC*F@1s@*NAO8Pc*h5;e-CQs{+XStR0oSPf4!Mz%GlWSy3Kz<>} zF-4BD)=c?K+0+h-0%Ca%ndgzv!;tgbGzQLU-@svU4#F9Mfpf3$;~O|zymOx-Kp!14 zjD=I~Oq~h@Chf?(Ja`N79nn3+Urvw3sz|EPhKX^;G8Z4Xa7*5TXTF_v~MK& zV;ML#5+g^o@e{6m_2tQ%l(h0>m*h!?(+8IHT;VQq=Q2meviShZ26t}-dv2Y>?!4t2 zlsd0}zh(Y9WsQDSjcU#_EZ-7}t?v|l!@6shuiL&X+;g6LaEQ}Hl{?0U0i&N<&F4_& z+_hLY^J@|Z*0~4PHJ&9uT!K zI!F)dB6f#5-cWY4GGqr8LU~#H|3CEizfFIs@iJ!NG=}`zlhLhz_Q^=>#!pJWK&u*B zv58IF%1fF3&R)vv<`rYmiW#MpFyc!(>$yke=tW=F(Wei01T1=DTPNLE8QwZP=st^s z^2{~N-mCUq>Nc3G87=`_7}a){YSs?%@YhoH{IwFhIwQ2<0Xgz+`G(ZxW=AlLko4mL z{`d90LqUO5C-b+1>XfVRZFqmL`krhjX6(;@@)vimZ|;9i-@AU%z!m;Ave^Nxad zulnBi|I|+Kw%7OGSde9g8NvG>eGgRx!|H!q-ok+XHTs^YM0%ZkPVYbH%fr3sdpsVwDea|m=j|%?7`d<1E?Z|Gg`rZZFw_?};j4JRSeed6DZ*?k|zxB!JEA+ig zdFgvU+DrMb)b}!#MYH|(sN7!P%am0|g?pCmsPBFBe3r#!^}W^h-M>`d`&ao_PY1UD zpZHe~zUTi2|0+&ayg7>b2pT8rj|1(TtWUsv{z)fmsWau3_WsJ>-DmYz^S6Wk`Yc89 zSC-1jTEEgN-5hF_ll9E@PS#UsWpDaxH-h!e`&1njj34Qr@~;AKU3+*x{k4VH{Otg5 zaSpr--)aYM4?g8Mo~F{u-r&77>t8*R3hn)?qo2*{+w6${oBgX7W&Nu~U+G`9CUB0E z)dtLDU9C`859N0H=N+vVWc|i_^|vaP_@DN-Zl%&c>Tg~8kN8_3q!6xFr|D^07A}OX ztk-o9e`^l5TJoe!rIvSey>h8D+vu#z0`G|jeO0_bu2;gp*bH&v3Jv{7U9aCWPS%dD zSA_-2^?C$->pUJ_tPIpPLfZ^PZsSycilB$&I%but6~}B?j@id%bWqg4+1@d0%BG&T zj@iM{7zeHm?V{eYx8NY7Rm`a_gw*rB2%x>Vp>n#|JW407X1)T4g_2~!ySiwK! zpXJcyfBdumr~cUj`DY8V{@DWjv!&KQi|@e3h-Ce@v&nl@&e7L9bTnem zvN`&CSNUg8XMf7)bXk4<1p6+lud`(?|Eyu^EhYt1YNGF@J@Fs#()PtmOK>XxvH`AN z;jjJQ&>t_m)AxVsZwGxWSAVQn(oP@C=#Mgqn8xjQ_$$7H|MOq3KmHdz$zN;!c7Qim ze~iD@4&IFZ=)*hoOW^$~{qd+L{-ZzUY}Efpe|+L6|F`Rp*FO5s>W}{VIQC~>BEk2n zKaRVjodj>MKW=;^%T@oQKPEc=oA&o}mahqYU`r~ImYe#*1)gQ0;^MCY58}*zfA7KW_e`dG|l4KZX-Wn$&jH@m2Nt z|0?sXy8`rN?W4~R3|ts=xs1ww)CCeF}ZS(gae5LcE?!o^OWT z&vbOQ3a65ZukE=!RJq1!TEr@E3$Nu!V`JcjYU7;y)Q_^g#zfh^P?HFilJzywf2;G% zkU^Q)t8nF#`bQ#(i74d6CDqE)TB}G9h1z!GR}p^+xxE-~&jOBPE991EhFOB!f&o%W z38OHGsp-T=;kk*upKtJ4e^{t;RrDa6-EjHZP?tsh=2W{J^o?CvKyIPTRnMXCguZL; zA=E2Vu`QxG{ej|f|GV?^F#B2m56sV{lm9*Q6S^Sc?yv#spOR_J#Hdf+_>i${ZYmok z7yh*~aVF=Xy^P{dp0|OJAsut&9t6Z+^#H}w?;lAt1ii+wHmmY2@>XxENmgSnn!Ib} zUi^0&o->UrYcZIb${J}&CsMDiOHR0!`?;ao5-LRWK<1rr*|m)WI8kl=C-jKvJox8HNh1}}u|J%fO+9$4bfmbU%DwdM(08)% z^|>$u?JVegC;l3)ReN$(sa~t{j&4+i z#8~nubbp)%$Wjv_?a?&e>YtvQ?PJ~{a~N_DobEmH$txFe?d>!qU6k9*oAu%6Y?EC| z^t`UW3I36Lllct9@qiU&&abA z{nv&PLxK;%fmTyWX|nI)FF04SvxHtXI&qWxA#r&Bt8^^n{GwViE7VrL$Td1phI6wH z=-0U~)|%VoYTVUzy_VMI7lj(fako`%UE<_gcbQ2JEA~ikh}yDYa)d|xIPC4-hy=3` zpCczY$N%&NmN-nzaiqO#BpW{q|E}Yj&zsHVh>V38bq2z;959C&1VusPAQ7s9SV;b) zr^<0%YaW#AtbEhw1RP(_an)^6oE%%cE4J#z$$Gq)$4KJYvPOo@-M@o>$lbqp0~MFg zM$3ZUrl&-1(Rv}bCIiaT%ysHo;XiqJ?Jb@2Qmc5ONLY78>SH}>m6B()iF3zVrz3B* zNvcQUIXB-DV}hwVdECEtH;Lnq<%!9yNt_mHUC!K@bH#L;V32*D_XnwIv_sDhx1USp zcc~1rQG;vU*K+EoX9K~3K#;j7=O_?p)<^1Vpe7q{I=sf+NXfyZL;g@G3qSi z+)Urt)FzO^En%l9`BD&u#CDgcs-Vo=?Wd%TLA~)#87G=-IN0D!Sne80jxYDFy;tKl zd6WBQ@9ou$iQc{I&i`Dozdh1Qh??V{GWo@FucQQ)F_V_9onEi?;oG(^G%gbP6{%Ar{3H}nQQvJ z&~I6G###!>7yxi?_HN;t0@Fi$1iZZ_aYHZ?n>Y$4c@jUBvb0R=3w5>oI>@Bf-3b87 zTJU;(<`xH~Q?Dh#V31RdrcI6UcTA6(ZMX(vD#h){30SRWbXn460@hpPNXdaHmxiin zhWn+jw}3VD5f#}CoBP{g4fBrqr7)mNEq1F15N^o0l8|ZxxxqxDm#^gmw(-am4hmOkDzt7em)xQ3i>sD&!KDxUzbH3fX zF%FlCEf~{wTTAZ!zbY}35{6J%C+LbyhZ#|-7c2+aov0pDn}`(EadBJICZQu)_g*5AG8XPf9GiUCuY9lq2OhEGx@@+NFp~eb0UZuey#AtOuT$ zni`N>UQi4Giqs4P01!hg(rl`f;}nXI0JLEV!}K6@&bTZ?y7y5>*UE4|#)Qnf1n>0b zfon2v#_`6WACW|>>)NeS@1os8#ddeT_jnANXRITDFEt`lDcQB)`n@mip47C6{ibSg zCmQr?asVZ{-pBpW_5Sr0bGZJng zN-kjp>4!S(f1C%jBl>MJc!w=`>2qi{HXe>}oT2B$8Sn$rxr!gWrfqxdaH+*G<-*TRQlK%k6p5t+HL*=aYNUR# z=C;bDph*^()<{?bT$s4Vl!%V^_vsA{DDf+rV{Zar&`mRdgvrk515yS5ltwzJZ)n?4 z1IKy5vCM~~)!U8Aq~t`#E-`Ry_Th+dO9@vw@_!L;(EeKMZ_x>(G2#J5hLUv`sglF_ zd>VVoho?WI7}5q$4q^n)5WxdpEIcq2=+-fKY4v_&;Hf{Z9Zp`h{i47Zk*kl?WY^uM zYXI$f3MGaHm9MOn`)gxc18yfRhl81@Jq|2NCvR6W{kmOrZ|3SpHrJ}j8&9xC1iTkAE4-!!D4j-sI^EMKj1U#<-&)IasH4GM{X6~;_KkD0`W|+zD zeX;;w$5(RRcH|G)^DO@2o4iq~fLU?Iqov!G)<<`?&LCC@osh%gTa+NNq7xCCx_5)o z4m0cY@%{A^%v^Z0IIU5co%nG^DdehYvtnO`o){gcvAIAQ1%Fa?D3hN3 zTF6&P-fJ_YTbnHN*WYKY(NI>NTKerB3~j64V_k3Y9zj-VJ^enruF0lk*0mDoO5Wpj zf}6t%Zp`5A4r8>|CI-!G$4<`9tYTZv@{``IW7}`;I^N=)?Du;@w%_bJ_WKpjlqFud z__|vJ%k*4WCbroJN&xv7-~L&6>^ipmZHxDNbVuP~%3k47-|gWM&l`wPi+*oWRjZk$ zD)ACT-qNvs8&5saX)>HLd3tLm54>)0Zfpqfj~pUzIaP7B|3+ z{NA5)?wtgezP`Wzl9w{~o_p5kJm=ZYbDjek4e19lySCK4f+YK|N#adcRZcTQ65?PF zIeS9#xM<#-vB8P9>rIg|5z=@8ZNkph^HUIX`6F(%#ip-Sv*oIo3j(UlSTt5uDM%C~ zj}@P#tl%EicfarIQ`)Zesf_A7S6T#Y?vt!zb7t;OYz)sbtSwqny{s+N@5Tx7jOb); zZ&;O9!Ql&tPyV>{;$_=k%C#dp>EO9oPRxct{Q`d{p73@T0LmUobLBxK0q=EWy znzj!y`@rg|HXZY=wXE$onkp7>g|x0Wtc8$UPNvff3E3$g{o@SjaT4=4251Zzn;E{Cu-7Bnq zFgY;2Af)oHHdQmpRpX^)w^4^wRekOIGykb()!w#PMMX=lYxP1u!)>#{OI8|F?YDm5 z=;`dAs=jLT+2ponniQ3N*+xOF zX@3|p)ooT(Bh!9|rwIRcZMQOP*ITfs>acCMhHak^rbKO*=i7dR1p)Ic6)P_zSJ$=B z_?8*8&UMp=5_MBVm>x*1F>&=^IVF0i1^2V`#MzYa{O`ZYo^q0GD8UhMk>VxbQ}-_X zZKh9XGe6h&N(p3Sp6TbdGc}=H!+R{ZahG?OfA5QX^7psTtro$QfBTPm$`ilNTRdT; zpE)bWAOX7(|dYSb@v&|Q$yV;>>1$wz*6W}^!yuK*|5Z_nRB zOb32XB33YL-1o-*%bbjOh)8@0F@vYq+*>$ne|hW?IK4Z00Ef{hj?Bl(8nRaHIAmKv zklXiq=OM;;sz+DR?y~SsYwEHn( z|96zI=@Sis`0knh64+QR$H@>?jYT{+oZ@-;B{iy`3wx4C8Z&v=mMqWhZ8H_v z4VYd50c+Y3ed-FF{=hr(N+{Zk7NqEIZL?^61MEvJJgX7tj)0W;vdDhFbToJHK z=)x7r)qd7TN@@0^yBD4@D@1mJ(Xm8u9vGRgl56K%z(f{xDF0=L#aR8i-$_Vop5!t= zE2idVDjWD>HAFjs%`CWosxy)O3G!P-AxnO%?E~bu!dtxC)I$rlPUU)Oi~}OUnF$E7 z7hpUJo)4ApPs9m2H;Z<83vRJ_#*mMQ0uuE$`k86P=C>?;eZGRv-r~Le3`Ckc4jRkN zxJwxur>_YrSEcJ+_RZ@3JZ7G)jy39#Xe$9ZA<{A}_5U&7v-YMl$*wFYiED6d2GFQ} zn_(Hrbl4MZ;W419G@ud0lg#*~Gk)S{20u&X$;*9$C}c*L*N!W1xyaAXs3LY9_t(r6 zx+Kr^GkdsBQk=NOWVMkgGp8Vr`*05~CJTIO^sA zH>zv*i0+Q8^cIhUzSLJ%3#`HNsRO&c0c-rZAMf-4%(%5vgGnO=&iAGZ3dAi1GG^s` zYYrG_)sp6r7}zecOb%xv@3>17IWC;Pad!GT##wF(HO=FPQ&}F&zdJQH)VEXbmio1` zntjyLncPcy&nrPjvJjx2tJ+FU3YeuDYNTF1tU`^<2ff@Ze>|^OdwfHKF;<-N_ zS-^~zAWr!mW5Q95aibdJMs>Q4gU1EJz4foif6~$cdp(lmo%+mi$Rk4)w4TR^fcWDp$Cp*^Tsb3^c9*RNear8^3zrV_`fGv6om-u8)J=SMMsQPgKg z_U#&o{L?UEPRyGp9VU_5QW$SN>6n&x!|h14n1T;%z&^B z;<~23_F~_gcM&Nkw_bHb<1t>_c|6x=zfYWKYYRpTZ_s6wmuPFz67jbZ!Sk##-TqO> zOfMe23mmzKiZRyLa=Yf;w#nq-iOjj13hGD9@Mj#%tuci(bS!Y*+fkzT2_$Vcz$YN& z|FFPSGmYA&^K;L_iSqK|{cZ$I%~oQ=GrHhDK0EbMCj5*rEVG-%VLx*=*hFZnvB<)4 z%x1b7GR~O`-3%Eo=NH(;EBJ*K#H;v)6~wFgg%!kydugTu6XIiwnKnpOw6nJd_z|sOUtJ9K!wr(<6 zh9^J*%~~4}8SXOkx0bsUe;vcLtOfj6sSe=4(XqJ}XCVDkV_Gxm3#ARdZ2_{u9LDmu zS900za2J5vPvuo72@ z3!F)v$z0wwv{?76TMbMYKYk{9g9c2&5DVXU+5wPf3pL(Qj)2}1Aa z2S~8seO7JmpLX%I3YuT&n^h*vi+@EHThkD{#eH~P>=_F2(hq7e3EOf<(T!+520JX_ zv4kdBVu?)49+tMq4K4-+iXka%PHjx2x_e0kd`qkOf{DTV!AG3wJfjfz4BfWD-Fovy z(NdkC4_Hgk=mqwTfPAC@qjP5<(ggD>KoQ<{Vk72FT#dJC_a^+}Z7=txje6eRl;M2D z=*h|A)RbvEQKTkYSsMykA%R$J1V~R z-FWKF!qiTJlqr%oaLaLLGoX7mw`^0N?9jbZuNS7?BI0A8WpDKzuyw%dROj{q#(|IB zxZ%%1(&@Ih$cpd5V*og|b`vGCXC74`P;Xjbzj$r8lMSG}F6l8yg`hsf_Bj=T`sU3V zT`C;UEcX_U=OyK={Sv5uaJ2>X#mbuIOVL?6J7`c>OfcN-)Xz_ z?*rF|uz!cTx3GWx-CM8z<<1G=U5{PH65c;BXiGuuU7Q=u-jB=GgX_Fo24_ktL#QDS z+`JsX6|Nhw)2c_erM>INj)str>tXJ`xaNP@2)eFXT=%m`XpTd>Itp?bvi0g8 z^)>gdFK;i*Uel;*%pO-#ZSBQ~qNAH;;&)l3%_pp78j|pY7nw_<{$ZYD&GcRN2Flh) zOXVRW6Wy1tU5Rg-D=@MfxRD#^?MBfhm9eQPk!X!q%uZIB8z0gNSRpF{8ghN5ZY3!> zR1zI-X4-+&A^a5!%^rWW`MO?U>}!7@cKePUI#;_?9{`zMVV0i9B^nVu#5=ngr7OM8 zUKc(&SmW*sZwkh7x7OHc!MGxRs`8hImnBE_R>`c6mK^AmsFo3y4s*kJX6)c#++c*$ zK%1RotAlZs5j^sxTe&;u0ZZSzo`T;ybuRhv7gf2gd%tMUSG*B|=!b?S-8Pq*S&q%F zr3@H^YgTU2(YhUn!t{Bl%oLlENyona4YnaBQxGOKjy00M+hP0#I^tJ4P`^{Xqfs3O<)|Fz-Tl9AdRmr zzg7IA35-J%7>y<{4ozV6aH%)W^uQIrbJuixn18xu{yBN=)YK`Xilzo>5z?H!U6gnU(wYmZeG5} z!EXY2LP0^oRYUDm!gbt64yL6PwU?-&mm&IYF~N6%0=j$6y3hcM8pq8#*Cu5F72v$I zh$$w3zj^c0)M`2=Q37PJE4{b!axgP{?lNCGjs9BQtk$f`eT!mt{hCvL4|hBlYVFpu zMd@65{vC8_y9v?9j@s;;DPECFkr2&0F3_EY{QZD+(q@(2s&MyhgQ-^XPWHEkiWcO-7J#$eTynNFC1kifbhe?@ zm19ujUl2BBH>T&gX-q1>DaX4YqBD4O-fn9;h;Xc7{cyDP=O z0i-mLCUekabrQ8f8+lE6qZ!JDGnZlbU527xhrB&a`RE?HhB@A$efkD;QLQwo22&+W zHzwF6Zl3Yo__lPVrSD$)fFd!sfp?y-=FhBb!mJs?^toJCPua>^j*@a=Ei%?j)^eb& zNZwJlGBw*c{cjQdX0uV6idE;ouzht=Ji?N?IPqV0AQxlz&?Fc7u62XAM?+)@QDy&9}O4 zv+FVu*t@uf+xa8(cD`>kER&V(SAIZef$N;+>EE?`J^oqVyb(+?K1HySw0dQ)z#Rjw0nZ-=tSA5WUs1M+-C>#OXLuL0X~K(e5DP+XZ67c zI6vc4(sfcE-g)E*!RMuAn5?h;Ky@^7SSoYmhWZf~S{v00*{BY6Hma*(EpNbG%!qTX zhPqfA^25~<_AuIv?jhH>$hy&-VVrU5F({)3Q;iddm%fO`{7hdza}n5sQydveW9(Hw}+R!=N}apzt>nmOf`9`C=azS*c5k=19b zrm;Hr96D))zae9Loun@^HcM8;*tml>{UjOu?8Q}9WRE}0#DNo=&DBpk%glX@QB@;g*V1p66iaao4X3TNPa%UY0wP(97r$3-t_Sa*qb^Tg2hmDm-TE_ zh`Vn6v5+i|3&N3kf}&2&cKkJYf|+xdPPROjhY*+CUU7`No%^0ToE>)4WbvN&BZ=^! zZ@_&v;+}2J{IxB)unW8Ixj>bp3%^r;;%8Z*)n4w+-ek0UKKI>)8lwDcd)*-D+(}TL zg6)W~!P>}ns;!$;XWwO=CE;GqROaC-=cjGH`?wat#ULI2NSBF9|HCR(Y{WojE6h(% z7h1?lj3-7Z=tBQ3?X6?2RGSAWA{p*I`eThGHJj>3OtIqmjHAbAj_mBUr}UsjlC$^u z(w@@g=DF1}Z?Ltx#XLSuHTK$4n$l}a>F!Hbl_dNYFP44~~t%(VhD) z|ClwWA@1k(uSmY&%2~T*g)*XT*@I|SUegs~CT{6PTm=#+a95bq9@KU#=#|`GWO2F3 zVrpeGC>@Ozp<7>?PnPR68Cza-OEh~P@(PSnOMH!!hjdS&kWe6aRI%y-tMm!-Jv571xp38=W9sN z_YG$I#g={gnZLTptgH-~=SK771V&^!GwYcC+kJB1ETB190#%(#UE8c_OHW6PtKKMaVW%4jN-r;7NhZG*^MQlu3 zAa&m;V-rw&Tqj*XMnS2l(prDqZZQk&0lUERtE+2|aCLRPZ0%?Ghw5en+#C|YlhJ&0 ziL-PJv{J37X*|Lf>MCcu2WO1evzK1kpHB#z)2stfW>&HM7ebk}^WRQWIz%F)d;^p% zpqn@c=*r6fOUD3_7=Q*Iu~cF;oN30_B|E#=%nsXm5E;?WH1I!NwGB0d4K*-j@<3>S zy~_ikfu-zM@XPee1EHas-)eqg@BVNB^D^6zWS^dvO3j{OOZMoKRNiPuIY6Vusgct5 z!8WH9+nye5gL<$n>cKXt2iv9t4pTWO6AM+PJ=~sd+i*K94e2XC%L6yxkFU(}6U+m4 zINXs+hgL`cA|vCU7OPn&ig(;ND^%^tDO0cQQgkj;*Cgt=f-{o;!yQf8v5lJl3OoNG zKc_(5zPwgKl~p$M1O&+>st1e*FDK<(OQ)vO#cX4tR12w2qNSx+lv>}!QqVnM?brAe zM0&lM+$^qov2>p)R`(f4LL&1ww^+B-v%@KlWhzb)$rXrcpgKPHO}Pxjmwkrm3N;Rs zwA-?+3+}AEUHM~FBcXRP_!+4^-_sD9618KSXPz0~HqR+NZM*do1P31c9ea4R=}S7# zki1yybe{ceEl%ed+bqyDP5-;q1Mo!kISTpw&vvhVgW2$^Tk!Hbb?VQDUDut_qQ0f9z1kG5>T9cf9WU+1b5Vd>Mj(SK>Xm&R+>*_K;= znp=#JtKQH%z|voR4*5b$@EeBs70KRk|Xax9~!ciRv(>$KH5bsiPXF3qa!P=K6;5nAy#!mu(4qX z{^%Ek`e?XD-2x4n>J~GL>Y~-?7OYiDX*<+wt68edPl36OinK&8RD)o(ayLmWoy#F^ z)?uWTUdB8|TIm#?>$4X{TImJSNedvgS0Q}Z*z(x_3d-1Q~29i_04p&JFRUasczLwITuo!x$4zv(VAH~_dl+g zj=EQ;2}g3*(Xg|NS>_C8Y)S3oRVkx5lo!@GP4jP{|ou{CBNbSo(P_{ z26HEmYTuJXY=|CUc?ax@9}HPY1K_%x*5JS5K^@vV;?vXh!E&<>OCt?0c%LLGTC5Wm zGtcrT39A~Tgo2t^%owJ%W?P~bC$`5XWRHAH$D-pncj8>C?EKYvDr~XBO>t@k z?mEL|4NjyUgLS?&vkCt&EW^#hfSE-)h$Zh_j|051c=ykp^wu&0Kc;c)lgx_6=jN|g zq}o0$ztpNORfSX?)=3Mq{*;Fg+bK@o>n#?XLaaUOe)&xi1t+^hTr~z*av&Jv$2(xRCe8H$1$m?W*bdM z_UREbnrA%hXNumJ2y?&g_ER(5d%g-+ks0vXp_S7+yMC3Y=hW-x>rJa$QaHL6I}LLN zpxM}8Q(I_H$F6h8~1b82%BKlN*$n87K~BVQ9J_L3iZ>)X{W zI_b%%pP2p@Bejxv{Ji-2j1@q(^q6~Y*sVXO|3lMiXbIVztT+9a+65(L{<9{nsg{a3 z%KBY&3lCAOoKUCj=Jj(a9odplC~lH-1hl5UvN?Al<8tfi0Q?!c?#tr~%k@uJ|1VYa zuHP#DGXAZg?1{LTGxYufcx3)mziQTXeZ$g^Ov#Jh;>5_-x2jnTI?z)4e#<)_tXLvu zi$<28XSsNd7+W!89}ZnYqR#?-&Vrkv{RREWwgg*IcQ1eSiA&#?hM_Y8gVvu+u#!^h zL$UhQdVn)0Ec$*gUUejfHTF&I$wnmXzE%a&uBP2W>3Y9s{5VkJ^49N8iujpWth>{# z=MSR&&&+(I9!L1&bVWQZvX6?XszI~*JQTm$zbK!dNp@=1Kaa9UFf1c63L5d?llssL>(2yO=iU-O2qQIEDO( zQp@79iEZzm=$w-JCTAk5BoBC?-hKX^{oEaW9$lO~Lpt>V4>Y*%*V^w}^5097$0o85 zRoc-)1+M(ACF%#~F)adZ{9NI5exDMZBIxLz7(+HLc0Z;1!C7jeyN|1DwVR7&yRJ8< zmD>}{8gAwnMqp(Je1e5zBGV=SqfQuY9aq<956%5VQ#T^sjc%saqK8uV5Nxo&iOkKm zCLQpqeSZ4lMD}3~$?U;`iii7lnj~jT$j`T*nO_RZ=HEkmQ}DcV{H_Zg6Y^moWO6_> zYvMr7Gk1=XzO>^H-hBDr6WL?5dYPSews?N=(hns!W(VyP3%8o$-P-1FXD`A_|6T>4 z^Tc`ZCtDjHYEi6FJZmQcA~sNDMt@9z!ToP!ZQB$NF2k|yr#wqn5yc!=oW!1!#9b_V z%}`U!UIiw<9b}-*HBZPgxYJC>JQO;Ur*?dnoYU5Rg{Quug3%lKhI4ds7i)&rwHYx2 z88tgBdBu_L%t%eQ3PmNlo{Z=+t(PlghxsW6`kZ7iw+={W6Xlu`GhOK?<6O$e5e1OOs#Z<*`D_hl_^i3c6#2PbRpy1fOzwCeW^E1fi97GfjAJocp1ln%7@oWZw;D&>4LhBzmW zbG(E{;t_SK$`htLvt@_3;NVb^Z_=qz>#GwqR_WP#>I99|Jjx9vXdEs_!D1dmZx~r! zuB#MASi{S8l?BS?vki0|$IkUwq{r1Z1H|k)%WML_EOWm-G#R{yHF2wTsZ5s4{kWi2 zwx8SS4$rsa2&8|KLwM=b2f2Xq9MiM>9aC>7QacOxTbFuc@!aK`=Bk6`bXAwq$^>6p z^LX6y38;mZOKH$Jn9uEe4jL;oKCRrKv9e~JsecA}aXIi^_Rhhn9Xapj_HVA$$=A^| z6Hj&Ly!3Z@^0N@bYzwkJAbd%4`P}hNn0ZodGI6)-R~p?DWY-Z$26~rG+vcVJNLrno zD=_ceYZFmHuC9#z+o(pM_aT!zD{wr>(j#Q=63D1Ka9$P6(M&uYcyZq1DerX zJ)az(l##uOAchh^D)5~pB$yMsh1I7*E9elj!)GtO5YU-(KHJ$%BcHiQTr3Eh@D}Vx z8&V%CYPOlg7|4~LwQ4?NOHG~F5$aFzN6FcpyMTXef5+6klKYAMmZo+sn06bhB;wbc z@2YW~b>APjbFQ=;lnvK^vj?5d$=?|Gn4~z#mAEy3btJQhT9{SCzC;NQS?Vaksj3R( zX{9qVvNA&jW^9OUhPMbp*i-D%U&Bs~#Ojsyn_HzqgvS3rm#R-=U%6Bdbsu6{s{8T$ zAD1dtwP>hcw?xgahP#D!JRlcKs+Lj~GtW(Q$rUzPDeto;q|O7ERetu0Ds!4PWCREy zL#!iaH~US7wW5S-b6QN3u*D2GG0Nv?N6orjsfVe8<4MKbhI*X4$7+^Pgh3a*Q_Rn> zcXGwiIotT7sJh)|{fD4LA9XA{?2_8hQ_vxv8H}kS_cnF7g|L~~b}02GPv&UmIkmbw zH=Ya>zG$TNJAo_~m=u-j(=mMN<)1f^SY&y3RrXVA99V7>_5di%NLUG8^0SkmU$ctM zfyY|H!MQuB+M-u~A*ZER+P`muSV`V+#7eeT#+?=&tIPafQ7Wrah*FI_P7PjB#WGGJ zfGSQWvQSKP2GR<&@@Z~;Q4sQH+7MJAaF6S2=sxJavmQ^QRGyxgt^~6e<(j%s>-kK( zxO>*KPF+Xq*~-J>it8j1=ol^BX*VPS3~QaHh7c2mG}SzA=C5=lB(Uk$_RwTcb;9NUAMCAUZ>_vteG>Qe ziK&>>Mn=voJJR9i$B0E*mrdHg%o0uEF70UJe$f;e^n;5l|AP(xEBu+NOuA7v{TZ>y zohiwCLvME`M^Q~Z3&78wsg0vB*h4m5*-CHSfj|UXdk*kL8GP7C!Mo|5z*!q5NmQG2 zsaI>_LyBPQoWXIit|VCWALey)ukFbq0b$UA z`)db4Hc038w9L9at)qNd-jW!e4%|tJuWr#g*sz5fo*kS_*9vk%fAH)?Nm5?Az%r;| z|&UG5ZKhq-)c!gCqSL* zNDu2f^uGe%!gF$9$6)n195-8*cGt4Pyj(3?_t5@bd#b;jm&4wD3d=E(+Kjz>lszv< zN7dV^hTx-yA)lMY4KjCc>T$n%sInCpg$D+^&3vlN<1g4#ji4a36Msa0zp8RL$Ze&i zzfzOX^)ZUuY0=@CX%GQW+e=-+aO_+XEygqeG%uwQj&8jQfOu_|JPYQsUF*1@ys><( z)C%B_g+Z=wCxvv*TU=K;GP2}w@^Y}3-oYq!GB8oQNvv}JS4}TkQY*hUaN)VYE}l7!MevYys9yRs)+RQhEGMdJ zwo$kqg`zGXyogu#G{r<>>+NH^?~TE+6JxBU$gi2-9BsMmvA|y2N2PK5ia`_NoSFgk~^On%JXYsr}PPq z!;upy>f(#6^>Fal=@s@U;NaXO7`WF&J>7AUt$5alAmx8NuwJ@juL)m%Clafu0Zs9B=qi{1-MOY>X6H z|Dr)*<~ynn_0+s#E&uex&$Ow7S`G6@u8+&KXie<5srR#3rVk5P<|y{2zHHpW@cn=TZJhk+w(42f!ipd*YO(HILSG1nJ{Bm7XbNI&)9Ez0Gkwg2kq zO6EpUIyX=6Ksb^^z=`9iU7h`pM1$^Ps~zzdRXKeznAOUI9pWUgOXJBE)6A~tX`G!< zxIt0JI4}e+j8qT+p(`ygF9Pjk%nH^D^LSG>4zupP7DeEsdFj z+_Occz1*`pVRp06M_qP-wHH{!b~YoO8b4Df*Z6pgvZ1kxq}nwtoZ%e@np17kB9|aeMG?y{6dwfkRwdQ-9U$vnR5}%!83JDcw_O52>7e3OADO&TvHe`HN3l zN@Q8Y8}biYJR~wNpA{Z23O;ybIF*9m*sc2ALw#ABrL zX_`Vqo;_}qcAFda$Wgj-z4F>)N9oE=_gu|pSE3MSa%wtpdXx?-If{B0j zBDt(Xj^DBBUDgv)&5I{7J&2tP?m_9P&pu>pd!USr0p3+R%^&CV<%wVu=C6k%9Jjsc zEx3T3iR>6oT0ndV8d-3qJmm+m{fmRJy}tqjc!FbuEJ|^F&ILkS)0O4! z*)G-!_gt>@D)(HW=W6#{rDqM^oh?k;of3DxFm284^j=katI4P3#Cuuvex`d@bN2gW z_dYm!m-tV9b-{jba_`#5vF{hScXi9YH@o*EqxVbPySi$>Pjl}>`H_+s6WaUsOOhmW z7?M8{^i7rZyd|=yj+z=@wuZ}zo}XIBbsN`_I2HRyEIEj8irqAB)YN6Gi>ETM>-olH zdGmJ&J?6flLzIcRpV+gM>1MRCsRWT|`wkC@?2pF!skac?iKI#?KUjkkghEVg(pz>+ z83K;GcF$u(9umhyd2Oi;=HDoOJ%>f17Zcl$j@+xOb4>-ZsVKzdAeHK!qZH20j z@cUlpx@?^)o;Hu!9BvH@PlOUy`?Qg#HI~-5V*~*%J}KExKXE^}HJs&_bNgDl-EZzW zR{9XUvxC0*ZH{6S75K1Fjo~=I7=f7^`p z4$YW-4pwId{SW};Rsqd=;!1Hwla&nFzkpq@cI%c2>1(B0Sm0WEETY_8kKrXILqwHw zvnUkSs24G=?oEuFD5-Ubnw*oR&PWnFJ zRX>8WN?z(52>^wg*sd+}(x1Xx)Ts($3)04|mMZ$ox+=UUco9hqh!cBpaYOA#-uy;r zc*Bs*l-%2!H<}l3kt3ri6Cb&sH-ECg8+PHhOp@#1rLGHYaXTL{AD!=4j zI&RDxyJ>|7lgX6(DM%rC9`ujZXD>u&Tp|#lgZ!FCt-HA*ZPy3)TRV)P*d%KffRA?e zt?}fHZ)%E~aSr*nmwLsHbfb9<)RY$oN07bwKhv5a{?BB4T=?wBhvW2vLLob(MtMID zZr-6rxo|XNAj9MQZGT8tq7aD!2l~rOh%IK0{x+wbapth(CccD)Pe-|q%DR&N{a{DP zUS&EW%4yf^6C~h@=%ttQ(5f4vmf9?iN-YH{#1C2H&A&sbSX$!2#De-Eoqp|lFLi^; zrXDNuhpb2xuEes}l8R?M;$a_%_`^&o6rJ6s-a-ucvP5cSnK^sEkGtcUNk#bJ9ON?1 z6Z6$|EDR~ib*#-bt{A;E%+=&_4egz4Ah|SHTyS@qY6z_;b%$(2gsN4Yg7upF z9;~>8WhHI`0nc4W;Y1kIv!QT%{g4l=fvwvd!!kxe!gTe4ckO@E8M!fdZO_~MNW5xw zmjXKv>Q&&Pd;y8v2}mX6K7zI@W)2+YKr%_Vrs$n}(DS7yS_Ux49Du)DIYsQIvU34L z2=~(SWK)t2u-jZ0wwS1W&6~en?Wl|Cqriy=a5fUn{w>v@I&@DI2S@}(mBc-!0vquN z$*;rQ!XmVK{R6mysl;WwmSCh_daqrIT&N<2Y6L$v6&d-(BBfq>1EjF0mG7uXx0S(Io2;Kgj$aQwmG4AtEdwm|F&)kop&+n6-yTCm+xvbyom38L} z@=!RJbL^RsmEC8=WcDi#e@pqrOu@f7%-E_dNlAusP_GIerh?q(a4kN+%fjb#x7I&0 zZ2|tOeEfuumcRVq1Doqpm+Pe{7kp^8@~u-PS_#zj!#{L)TSrE7-goT$2X!oo+&!+H zey$t8=vBjUs$r(Bp*QR%xty2w%2}eEQ^U649D^Pto{DShy&Bin%h0LZXxCP=>+KP} zYFP6;HB|ChuItvS-zM42Z2EN$Wy$c(UK!ezVSkl}iLhe@?wGsr1c{_f zV!Tgl8AEs#$)WLJ%rx`2W93}v^ncD>ltHRbA&?f|%N2X;`jNeB z33=^36EY%QKD94<6K^Juec*Qcb=WOb2gXy*NtL5nqb2$T4LI}DKH4(x@63FKvW(Gz zQ3Mltq=HJ#{l_>$^(rrXoNewvHx@B}!X{Yr83h_tKy=Zh!UEbi#Jpz3l)W{@ z060H>wp39CN3dmv;Sbj^vUv0QlfzuQ4}=3u8*jUud_g?En3GWae}vzmHZ9vP#S+%* zl|vl%llce5?0F3MS84-klv3B!W=Q5&wQk}`TP4yutak9!)rbg)X z@L7KWz712h)fY1E)R){_({>#CV13*pe6p^uF+23~u&35zhGBL6)80qS;TIPz%5Iam zcskZssOLx~vPG4uS4wsCFg$vQ>A}2@AC4C6`wR~A^kiKCQkC32bwOp!+JCD2Oqyf*p70`j#j2WsW)5mAT?cv4TN)DQLcPxDRO%eD?1UH4Kw>`e^i=ofY?=*o(3^prAZ z=L=jz0RmwtOpB#gHj0Kdu;=$9uzZW=~qvc##BYM_Cik`)eqGvIq=s6ZXo5@w;t#-g!*qfgXtH!?L)&tm16W}PnVY4>OH8TzPYhSEx#!sLo@e-OVh z!Bxrnvs%w#RAxPutW(H(IxnirK3&Y50^3lND~ZKSI#$mqBQ0GH&v#qWtV7-$N{$a% z=`A>!TweNCMo{w#cgavoi-HnBV=Byq+Z>JA$KsXi1Rh7ojgjA-A+@Tt+9$l6ui)#g||IgfRE)r%Y=DnJh%)VWmm z)4esncJigEH6;gf#awyqXkyk6_FG?vndd)wctur7YD?5UNBsMYTZ-&Y6wm}qa(rfRXUm_# zjO5E*ce_DnCN}FF+Cd0QO@6jyZMZIQy=gC=n)<=0Pq_uHWlP9-!IRt@Ks-K4bAm|C zwMOwX6{X0^?sMOrO*{2?1#8=Y6}a7e3tJ=dSlbSDAZrCHJlD3E-A5_0R}WWpv&RwZ4UC9s~`tsL;@AR+Kk$t zPXHtRIB$MxctOj-nc1+ML5F%)TR&)VF)(@$8%r5+-mJeSy9`!(I> zHr@o}3(0~DECfpP(u+FPu_=*lL0jMctO5v|tNzQO{VFd|Q1Pw@L;Mp|DyXFE&u*R5 z_pXfV+n@HdeY=khpHrSPm_>x*) z?&HSTb%5rvm{B$I zTK1*j@Uc(#TJ{&Y47yv_U)*t>;3>DeN$VB7hgDFd6+)8q>^nq0ie{Or0i~~9U4a$UH(DT zW$^9%M;M19oezo<9n$=vlyN*FJk0CkqU>VXyEwlMC!wZ&+k6W+Nl8RS`D%rn52QZ`2?L#Em0HnreD+c;(~f_+zu=C_^H{1G*27!9+A?R z#3o5JQJ@n)L*zD^sv@o#^w8RgkZ3~rE>?=p!R=qG^X#%Ab73rzAwE`mRX=R;-XcQm zy%Im6e{xXQzRnQ1qR^(sPbfOLr6}Frl7lv4mh3iHmjSO^{2~8FZJapLlD2?4@MWma zp4kuQ3;o2!s*wKyOnrb*1dB68ArP9iA@7(T>`zV;>x_@+%-)0LJ=H|&s90 z_GO8C!Bq`$?0)xBVqbLVnrx-^rQN-h*_V~>rQE)(b}xhN%aiVANVs-qj7gOSsj$7?$28;p)9Je6I-KP555LJDnXfiW6&1>Z!VUw9N#n_yN+zO|BCG z5k+{m9SArD!n19h!|Qss4TtB`ZKL5?eA^&r@s&r7`SvuvMZ?K4P)pHAH&{^_9&OIu zOXuLkt#3&buHf7{rfMku2Gh5{s4UnYBKgds2IB05_>GUQMdA^Dxp!>>?Mfc#Ju4+S z(9g=uLN)b+`WF!1opbosL4(xR(}r^^AEcd09Hx-Y~@Ev3Vobr@#aGkOf~+W zVkFaq|4q_~4pIu7*Lxx}Pm@XryiP4~$%`+sr7K@~Jf;}J*CvBa z0#&tP#2+*+@7hU-4;E0nfIQQ0B5jG_M}Vit-WuSD51;^S=V8}LFb@#`ZdaK9St$ff z!MpdK?j0y!Z+Z*lB^b7aTNqUV7ulPC&5mjamOJpnuv@^qYwD&@ji~k+6t%eMXBs2@ zIo9;``m-f_=J)LBtMm`F6AzXQ_cPQ2Tjor!S$~kT+67F!dNmwlhHjXL`s~E9iPRfAa!Gs~^7aK* zY$CHyB0HVPL^vv*1$S%2aq%ofg+{%@<2b~XIje%-3Vz`vjW{k6(1^t!&zv=!bq}FA z%UTUJCP@C|QMpgBe;^Ogrf=IUux(-wYbgoAxxw_mz@k*Jp~r6Gz_gRg#$+V}JR{8a znXNE}nX~R6iq1$q75RD|ouYbXuMk@Ry6Hbs9~p+`GyK|S@Ph04&~@v>5?FKppo8@= zYHMVgVP`Wz2(Izjk;|;Ts?b~9NRX>Xr*4mpvPRI6$vs-1jwt|_?4y2a8M}TTx4d8p z%&|hGp#1?Rs&B54{y8#}9rWfro`a{gNFMj#k^EjRUWqvastcLQ4Ys-a)g3G2PDqwq z@XTq{=IE8Mfq7st=dK}5a7Dr^-|iN$9FeGZ=??^jmU`GY29Y;8$wpS?+q!L+d_Qyf zD#?ckKt54^_16b5tYw$NwrWuo8~;J9KAp z4^^n5f*hXT0ApB5?+>0nT)~GBWPNf^ZzGpTlp;d zEPchFK}5N?ePS!3W_|X~%G)WYYvyB-T(*m7Yb0&A1Aa|@DOoKRl28x?TxJDNZeX_25&oz zVmM%D=C9^e`$AjPABbd?*>{H>L~_rLSfw&YC*W*(EFB|$qdKOqFb6>mt;Nm^9VmSf zg_BM|(L%F<3~!&3Rfl|gYe7GMM&z03V+$lcGAV?eTh9a)nsf1b(wCP0pQl=o&Qc*jt#Jlz(p&Cb8B|TuY zG4IlEO%uWOyla2R$DG_}dh|WP%p5Pu$Ph|RLkVYG<)IwmGkTcUHkkzQcRfl&6oB?Q z%=@{ROJ5MBJ7sJ?xJK?!KADp~*x`yu8Ow#aJvLD$ zuZ}LXq&GK{Od%g4{&sX$>tFH;5f;t#Q=jb325chuXx1D;qHR4IjL8=5jcY0{!!H4z z_(NsXN>4|P>t>p#QsC`)Dmk~*&u0pe70^F3#*QWl}#3R``h31 zhrB?@DQlmWaI%nIqx@Rwj^Se-G6ToU9ya?5KSNMK5YEqhmnMHwY?7|xc^nW_tSCv! z+o2_6f*ng)$4tp~e+Y)Yn79gwsgR3=z@ZeHY_emin6Zg`U+A!($;fcO|z}(H+@1PjQ16)}Zk5|%9shK7+M;~{+ zvB9k)@kaus&WS-O`#|Cm#D;?cUiu>m)(?qq)NJZH0D7$W20xC?yqi^#=zEr;wOY!3 zYuK-PW>0-9k!#~4ND}mH4PH&9y!)9Yt%7a;qCNnjg}4WHpvw6n{UzykhMG8>3uDFf zn3%UjN`&q9AcvPeRuo3zv8>BYu{m#`)AE3^gBeB=c0sm%EGT;cyZg>(Ha~ybC}o`2 z$UCN$Hi(>1Z4c#0Qj0&LrqFM?4v*&B>Jha+#5d-2GSmkjCHh`gO(^3sTWFMe*)t!U zG23j`z`7a9DvepPemLg6-2m^&cXYEUa7ni^=7~dk#{Ay4UB`TqNVvQhP^U1nn2Soj za?E|gF^|`n_n?fGAEMsDBQYLAwVSJx>XtdgcGGKn9ckqYU2X28x$xRn*-s%{H=EPK zWbH=M<=<8Hba~V+UA8{ffpV$K9cIZM>To#K5ZJfPSvv{~az7-;!mxjdREICD5tf(* z9|?k9+gRKFE|~LFq3hZa_ER2v7KO=WO3wD{->YkPeAFA7xT|~V&FnK;4C*ik_H@mP z51Y+{+v%Ea`+->G9@ieQ{_+gS&(6Pn&tCB@MFQ{`k3=vDTgBjz6}C#F2P<`jQ3+cP zL+q&JAa|H;T$pQ|&EzYHtJdg>;C(_xzw?0&xz+jKmOM%FG8g|Tq)WP^BUX^>>WAsM zr+?6=;Kh8r=R|aiT*}_^GW^>|B2~Amld-68e)P~7JxtbvvVh#sd3E+ng8~sNlw1`R zs@6mDkOXQc-(rbO4ABg!kq6KXsf-7!Y2Z`c?}vvSS+Mj*)t(*H_rv0XN1BF5PWmf#Us6DPE1uf%MsU^z(+>TDVX)gR9#|=MMCi?l2ezX0a zX8fpp;xeg~%}c1YyH}%*U&2z&VHEHBv)&Wvh=M}bO*XfUMb>-0c#HZY6yMApvqh=S zE!;8N-+Jig*OTJ;((*N>c_9S08vF}mz069xXf!+MIEzCDb-Q5#_L&p$E_dv-)}Qh( z=#BQ34H^^&Q%n86lfk{orSWb3Id!rJ^`$=D!<&CLD=!Z}-6w(jkm^RX9(t${8vf|D zt<$*-w=vcW1o6!GO5&|vVWMMPMG09s$@Oo4#8LC!IRZ%B)2WpCMU=G7XC1e@;ys6J z-L$LpMD|fbM$qjTI!d2g{n$ABK-0wUo0aJX-CI6 z^`M}`QIL*t;$6I9E2f5n6PfvTk#N3<y8>U!@J%A98g`y0Voo`orX3=8rhJ)XTE_%EY-ZTHzIb)~?5JYkZp0 zFyJiee;3{tdupA@&*v_##`w)@I^(5ZCvD*a1r?0S#p9_Unh_#;!8PxAZG&aQ%ZzJ` zw|<+u2aq+#RhY)p`*1?FKZj|?@)dMF_*>8sohAa74{m{uFs|^hkEJ8rHvu#l20IlN zp7yAHso7ZIVBG~pRfR1BEDTbyBGftLgVeZUjA42BeWMrrytXwI`Vz?g3FC=C_9bxD z0!S#I*+dlEqcR=Wb4`+zr@wFn6y+_2) ze8Pe&N?SYt5 zaPEXIy^Lp!8hW1svbo#L`n1J(RIg7j@=28g$qKN)2+unhHB@a}wK-*i<;V;Eq4t>V zaC+}5_S!0hN7>7UhduAw$J&<^`AU`FhgvDegyFqW;J{Ns0g1t@W>+vX6-o9@k?1(8 zwZ+sxzq=mI@At2==#kp_iEsnSP|iaRSfB0~YY_ zrKUu7v143FaT4KP*jp6pdlj5^9@6E{rI+2;%t4yh_CnBHVM(d*qC6N|Zox2$!48ME zX@^D=#H+7ou_pZeqWeDblZ^~~y0t8L3v{ThA^T$_|IsLhD?tJJIIUeHN z!wrf`%_F1Tu(&`@5gh44U`zztyM{4OU}sYu%3ZLk_9buh6TzBz@RV6hHFffn0OeNs zL!R&ppE4ipC57pgyL3Eg z51x$=Sz8yZTDG}QUAF9>OAfCu#4V;~T_Rg@gZTPX@3MYdyNY$k&{S_{5&v8R zaZI(B*1j<7f9eWf9HT1RF?ae?I%sCT?QwQo;fWe97c%S1Evb$^`EQ)ow_mQaWe91U ze$pYJNoxVCoka~yhAU>q~`izChV{V>b;U%{jal*+_&Ua<8vGVu!8{~78 z!{K1lZJ4?K2b75D2V}S+x0qtlzDL$=_|zc)LRm{p&0YA&&b_9nF+TbfVy93EE4^5Tw4EnX7Z~tkmCp{_v=J2t z&uOG1hvH_ex>?EBg;2pZ0lsFP8&~dQI^TK7zu=TdDprzO(i#*y=08rUKOnCRKFZ?VR)Q@lnsF_Vmo$N1<>9{*Ks-jCrV(Mf+ zyzA=tzzraK`?YJm>%YARFW^)=bpq*k>q82A;fgM8reC?ak!eLjXk;eMKMQP0JcEs4CU@U!)90qjF9xv5&B9ZxdmFU2RVlF)yw2 ze;WB@xlV_31^a)^oUfe$#3{ZZIBYNzcz3+mr2Yx(&0JDh6^t%}tY^-z;0`5)yRvvG zl3>9_gau^4vy@qUdZm|s6d_YlE1GnbgYpsIs4E`PJGLRVQm{^^t9n@UGp39haLZ&> zQ%T688&SDLgwsD%l^G^mcL~6v?S}UoyE!iXSD7B0Gz2RJ$2d^#7`A>NvXe|w)P9Im zmaY;Nsj?6dR)8r@D;!q}oeF{(ebXBK3$22^Lj4HE{lfHX4imc)Zs= z!Mu*w)Ce#4;i0A-6;a!5%9{5N&E9GqXz*WhNFK*5irT0po9cuVColZHk z9keH!v`|LG(9{?e3S5TOOnOTuR! z+j}MF7aE<{0#vbB^gVT1X_?utuWK@qS!9hjbWLcaBX^mmQuE0h*1ES~2;J5M>zkRl zQ5|+Kn#yuB<3m!i2aYV$ntE($QleRQ(DSeNULy>uKwXl3GWoQ7FMY0aS^Bs+sG2Ip%FYkzZKRJ+S#tB>-j z`iK5bY^l|B(N;U*-vSEWcvKfUA>f}K)^$t1E_?u%>U?@hI}du<$`H?DPve5_3VA?rS(xkqG8g%o)%ST(u!#W&w|8pX7zUjh5G&?@)!j5iz|JY8S2j~F32X6gF(oSW2Ba9q^MmV%|i z58?_uiU(^0Vz@l2a;fwpp{bRiry)V#L83opTd(v! z*=fj6nJ=aH%}zstp5f9{?UJBfRkhE0>ACcA$g?yQ4<3&b$>`+l&@4#>D6uv5g&jEF zXNw-GL4drh-#-C6F{-AIa(pR>13#wu1Jid(gdrm0Ucp)tJ0O=vh*liqPNsdJNVEu0x;40E(~y4gHY zyo`#8&TOZY2{%`4aZ?&c(DWAV@g;@m`d#O97lr6yfWpwP&rhcmqFYFG3Q?5q6r$EI zr8|YF*`=qfLgb1-r_=M8y02G=j_py1u17D`q;|gcRr=8T)15xFR&y#{$jwuv3njl5 z=|L{t=|Ra7e~NUVN9@1^_-ak8$b;SDv(s8sn2MEQh?*A}@|cuGGUSQ0H_DoaM?u@4 z7>4{(pk|9oDbK;6Zu9$XyOC&XMLVX--h30e>Jl;*b0>SC$p#|6$Erb&Tc8cb1DyY<+HO|o z6~f2E%-50`A)!bbq2m)9@SMXFt^~(9bI5<==!!GdgZP&uFzc5R5oz95$u#`U`L2XD z2?{lvoSug*5j#LBOwGw#8_o33856Q@dVku1CAlUL7q*+luaV*!h5Y-4kC~eb;o*cd zE4^xwkf4>Cg>=)*V1VFA0KPRi7}jN)xOeTx@0u02XvnjFs8eaC0dJh`_gmIJCg`+d zhQIjP>1Bx_&vFN;+pS;giVPKlY_yQ?HSjVB*iAMRD<>zaig|7#3y-Cy9DpSD?wn>Vld}!+D)p@?RM2D3QagemF%}@9Dvl%-rLFe%;hJ1*8KSo9<^JXD2zy5sm{`o_L8pl)bhBw z<1fx5^G?fR9V{Zj!8(>w0?88TNrb;UdFm7%i+JR(kC_POSUbh&O!{ci2pjIrGFW8U z$DCifX3!i#&cxi$3uvZg9b&F(qimk= zQcixI{=5}^@3G}69@;g?^TqN46<&*F=B_W*@ho*DFRR%mDT_EQ!AF?osH-9PkXRgD zL!qY}T(ISB6s}N|RL{&gwle279!b=SpOOFr)B~RY>}(~bc67Hq7#K<*KNPfjtGn1) zKNrik^kPOS##2gF|A(}9fsd-X`o9xMAS!xdAJNoWjgQf$MKn~XM6jKa1SXnjR8(r! z(rOW_K2ItW4PJvYgE>w|W5sG)+Xt#vYHdrsAb1Uk33w~wrLXQX3KpH}nR6D}4aS3qDSwfzx7rLQlP_x7DH#LIn ziov;$N&uX2-E)SPiInScZE%ZyP{7amcL_hgOa}l(upX1K+WfqM@zToR0(8QTh}$Y* zoxug@VN~Eb3a|^VOzxw%ru-?tX(R$ThkSzXhI0FIMjE~jUVO@ZC|j-a`eGGYJC=P4 zf@ufA5W)sY=2FL^;9ursZP0O zZl;<1fk2HK4}p~O_rh^Gf&V+(xlZ^>)QjN6?JGFKRj^qV^pn=+n|2>$(8vcGcI4;v zh3!8bsZafvwB;B11y_E^uwG;gK_|qA9`PJmZF3WTDga8-0D#Y3fta!qH6!`&M!h2c zLFL~@zO2mb%2-{c-f;hdGn(TdFI{FvI?7G?>oD3hA{}ADUzs1z19Fqk5A~+j4YoH+ z^&aQiyRE3bqm_S{%RjOx|7*&>Q1VZ1!fC1}ocO(!Ka8;zN?mV_YZQcsqNZf? zNF=3$N#H@Dy;^WOK}F4PD7&On;6%_%@1yrjWHlM6B*tD=2Jet}fX=^G_U{qe;kan_ zgjmtHoLiQZ@@DYTi`qpb!Eaor!kxuM=fF;3KsjvSQd2L_`k$$}-yxV!GKT>9(Z-i!ZyHb(9jC)9il;@u2AMzc&nd-#aZ<(mO2xvKW z#^7gR$uUt$I~xD=dCxVb+4}t4az}5weGJu<@AKO+F!-Bm)N8zq7u0l;U{kZ@NrY6i zULDHoa(Vl4t6$S38Qsb2CXekIm8n>3oSe!6pALgl%+r zqIv;+dFSfruGf`T6WOww25;$-+eyb+mlx`H?K|<*8|<*h@&R!fqnZXGo%u0!YMr7w zTVf<<%{b^26CcDU(2_;9NrQSO#c@%JD$1W^pF=mxzbpAkT_fKOepH?8)5nzx#c5evGe}Mrtn}__Mbhu``DM>w2^0hx{6mFs%2XRcMV_dMfRipk$c3OfN-P6`( z?qlLsJo$GAXG%w2e|FmidHOmdNT{!=RcJXb;x?fCnqE76AtnOL2>tgG5*#>hVKFs` z%MiT!0&6v0eym4bX8c&tlDo?=2}I(Z7f(Q}_Zr>JCwSkqafji|=3LF&s`R{x{g;OO z&LcQ2eu%uEhL#JK6+jy`q%!h9GU{Gw}m zx;X@}`sVSYRLs3~h^f86QLAV57vh)Zwbndks;y_{&A!={}eYl8p5I>b5V4;w0l7IUb#@7@{I?`4jwAYRGl zzF}Ub%B2tx4uETXRi}~W7ZWQK3LG}Olp(q zHSvZQ@(MaE|2aBn7Tojsc`!zvGzDJ6+FNg1vKGlDZw7bJ2S^^A|l z6PSqpgS~61`IoBM%Y0m>cO1_)L|1C2Qf3)nsPA}y`Xj?Ps(EhzLC-GBF^F2e+Pa%L z)kYQiS7A{3OE6}Q8^{C0Y*N(+jkgWdZTfOw^KfjZO{q(283~zYxAiiAqAaHvxX#DU zaAXeEs8W~AEP()Z0m(f8CH24!RE4qQHbLkix(_(0ca?_n|dK?1mmV-XiL^K$jui^yxe>bV2dOZs`ubFRaC2rCZdXMkm5U$n!GGY z96yHOdf}yy#*o^W=J@FKtjVf#-iIyf)D`Cny%{Dx2zT6}A*&6wSR1^uGm~s5aJ;k* zAgXHDP;;(JU~ll331rQR<-)<+?rt7}8)1g=&4fkM)wvu+#0I!bF9^Da%T2V{9xU z_Vj-!|7r4rNz1mn;HfYiV=ge9%zeOjaGzGk99IPAiC04kN22Xxz!g{-#08`6Rv71( zt8y3?!CSY)2d-1+SphHNkX*GEiiyIc!}y5RA^nj?NPV}lNQ-~n!t<30Zn82p23yv)&hPJLMB zr8nVU+IjJ=AA!EFlgy9jjhheSlH1^n`PUez_Mh@&p8pJclI#f`;y1NYZIIgv# zpSU^1y}z!D8fhWZMCO#v$&(Lm|2=}wk5q(@&_el@vnyuF&Qj?z0$$}d!2H|r2D%S0g%YVw&|4{l>eAe> zgm&lebod32>`_x}`?+<}g8n|LwTZ=p;J(2lTu%YXYhB{vA+o(pKgCs_OxP^Gil`*3 zD}55%wmO<}cdsSQ<|9~jry|I5$ME}<5r|{_%FwWo0x*q9*99aXmks>P!A4m2)I6dz z@#JMV5FmSnQ9K!8kOG$4d>QlP;M#=ambIHZ7Thi@9is%pgY)+k%Ej-mASZv9u_gGI z0`7dCIsQ6Uj$PxXHw;3YjW38S0t(`%6gstb7f|a+!c`55;gjw-&TV;i2sk^%ihJtDW@AlNyHM0mz4JPeO3XT4t$hoC7gW(2x^U+=3>a$>)v5I zLSCKA6W?weBED?m#pcvP{_RZeba)8~;HFBM_3Gx_-NH#lk(`O>poo*%ORD^oR1Q4M z@KXz2s?AR+NHuvg{nX7aRpO@>yHtgrl2IzyYZ>=frk0S*Htw}KwTP-q{nTCdT+KN` z64X%VrxXU5eRb|`%@!J!9-f13*gu;6JJ*x$V~Ij*2kc>s$=wq39#)U=4&+#(*YL3J z1wvvG?1x6Y4Do=iu!ck!fPt(HeQ`zd3pyEf0ab=$&U@4zmUkY4!3$h+0$VU{)j~-u z?49oW{*`Wj$x^&I^-B%Q=FN9gYSVXMZ*oWRnTp`V@j|CdYJ;6Q+bu;xJKB-_$6#96 zG^ij>X&jQSvZMr;j|=&v;!sX!C&OA(ZS)@8`g>_k=u}4?1TcdSOgaUp_6mN3KtkqT zp{S}MGejSzIQpT!*fhG4E*u4j!`*8g z?)D_VH@Gr4tQ6iR(Ul2HV=+C9qyH;k$0^?bj zuz>TPrt-i<>u*HqA=y{!mg(U2#&kY07np?(%36XW#MmG9O9f-PIWrjK?%NchM06P5slJr7so9iX;V8{gG4|{RQi-!uv|# z0>R^VZ5`;Hf=ysbTxD)>MMzF*Q*z!-3;B28GJ0SzlKw;%hk|^3LL&G3WfX}(Mtl}M zmL&HH$C(|RL$f5%bN?*VHDm zKknhj^ycyq=6q5~=Y10eYA>VaAwP9Fk)2a5!3(r#f!bn?5N}nB|3Pxc&WmC&$wM{J z>>R|`&B@x%i{gC!FrPtF1J`zuKyLV-o^(&wl(?64(m>zq~kAH%bm}@|V6`W(p%K1(s82-J4=mlq@q}(gGG)NEPg7<~bc? z`UeK26;v3Hp*33WFGIMBC#CX~tsdtcjyK0(d~F?UG4`TsOED~^&Iw*rmK9D z@0!2-7O&RZjI1mT_5h`6Nk#ioj0SZBbLFS1$Z#{gA{d_9P}*fsXD5Fhbvt^q3$a2b z`!qbPa`WYj_`cIi|A?PN_HuQfE^#A-o>}E^z8Ta-B=?Dj7yqF*5_SDeyWP;Nqqwcn zkuI0nnGraBp#GMZtt7;v0K8S_cP53`yX#UF1H!j0#w6w&(b|JvQHl*+X zT$uZ7dBeOCbRFOpK>2UI6r7y5r%{7Eb6k&rAFW zN;lwh?+vOp^9jYAvP~C2I%V5apB`Oq1<9~ZA6*;RM5S`DWS#6oye8CP;8$wO6YtqB%U zH#<#fLNuedY(vqVa&iGr(H%f5^AKe27e+7$FwtL%sRmw#jpdL%6xK zx7U$f@Xg@{(l?vSA^)~GQ}{|Z65<0!$A z6^6{7_Loi{;6lJPh-kL;KVy8o4U*g#90-x*w+yydAdb^LUZ^8(yLuNr72N(E`R^4i zCB^dJ29y6x+#8ht!1{kF`|VB?D|n>%c<_~-i{(GN+LMLrpYY3I_WOLDy;Fjk;sz35 z6s-UhHiRWgLS#?i;;A+HcB2Fl(%jN2j_77C^tH)exs}=y*&o@860t|o6rqO;+wT>N z3pX%g9)>IG|FgrFmfY_o|7*(gJBjVlh!_s+E2w3vokp#z#VE3j7@$_% zSWwE$Cd0AUa=)Sux2Wg2Pz_;8_02RA==;QJ-!j--$oltAeBj5SWSjXTxy1wdfsF_w z#0+Z`W|uvpNHjq>q{B_w`9nY)`Z1eCvsTR%)VXfch*HoRFKisqcUVTadAuyzJbLLx z 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

@RZUZmQ`VzU>RjZH-H_5TygFfRau~Z_XVG1U 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�O3TTbU=T*T6sl{93E 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

)nqY@v}$akLP{+GvXYMl!^&u1RnkS^bd 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

y~_ z@EotTXr|9Rh3QAj?HsrY!_gbZ43iwXHKyEMa;Q=kpHi>2c)o6}IelKfFobJojgS3G z^7H3yd@Mc7h)vHbsYrKi_B%e%&CTZYW(*0Pre_aESt7#KdCdEqesd8s>O{-$U@N-y zwAAOZo|ca4p^hwV>17fh{q8BcP$iMp6D#=fTX)a&Sg$>xVh4RuR`I9qK__+d$5q6l9nHSOZ8i+ri~2J=z`ue! zqN5$O_qlmMN(UZN%YD~+zx#c6v^*1~R>3*N$J~QDbo1#{MI$D-%}s+gQOAgBQrm>x zN1}7HXmZ5x;=S%cr*zXE0Q~CVBnK6C-U5~P;ZP%pXb%3w@@&iUtkX>eR{$w+0Hq2- zPfCYRhY+{t4!|hfj$QObfaf)z7DRZ=rv(XJ9M5a2%BXV{$xeUH|3&^yz=2Xr?j z3TLm-t2=VQsJ5&wAh6T-)`M7-z-E5?*V` zOv9SqWWM8e9W$aME^R5f8X9yxUrR%&{JQIHkEu#}UC%2xShur=J}=bkwZ_gjq6Jf< z74YiCNXyCmiect~;w`h?+MK>GOk&%O=iFbUJQu%+CqA9dc9-{bbDthMr1@Np#)$*o zXkZw170fdaxK7R1wTJ4dVQw8Pf7;a6RK4TU^?oy5?;YYv%j2JFbH=su?;MJc%-E^^ zZ<(#ledo5>+Q{Jv`FDiiP8HlG!7b#OQ^&tg>St?n{wkhhc=pZKW*<<+_Y?YCI=YQ$ z>DtJQle4u450ca_Nga4vNjjmDJ|)zVik{u5qR`+x*ov>CMgARh&JvJTRw~B z_ZQmQOt-6fwl+F8+hk{0e=4~h`P>>i_tt1ZxgMR@g}QUy=HB?tHhQ|sdt}ys0Y7Bz zfuLKX)5=@bdi(!%_`A*s|JRu=&}doPZ1aW`65e-b1)KcVwZg(h{x1RYsY&iGX?1I3 zS`q64Gu`H!-mDojeU9C3SF7+6uN8zD{S~pt$4ay8O0L~no{^#X!%|C-VIJU&v}F(W zI5kO&OVL*B8Yh$$2_LuF1oc$nB3@SUVex>BTJu0$*5avg>kqV{MOi+ zaNkkGbo2EpVsz_!vU2SHAbPh$7J`ArCt(`0g1860shiJB9vRr3RKg)b${v3Ad(p+R zZj2gPe9%1EmD6v{nCrD}pO02@#GSgeWa^+3oYIY0Fxw<(s&47gg3J)xy~mtVV?(lu z`^mxI#5>qRd9Bw)T=!bzA5dD%wnx6BThB|zn@s>-90H@(O$nT1IF+DFbvzM`Y?Hr`+1u6QT;eScqq!k)_Y%3%+T9G=kh>NZ)90>9BiZC3~WFC}N4-hbq+iAc34^{&lmy&A&;8N*uJ zD`SxU_^buUTMYAg0^X8Kxn75d)yNq&HiX&{pjS$P?!(!tsf__5Zazt!n_R+!CEQph zNArk8V^t9DmG3pj7E+1|$9 zErPupx?}H>9>eXZ=ofl)SZ0uCh#np(1}JG9#1#(SLw9iI_U^UYn{Kx^CEcE1+B2j* z4vVw1o+0^X8aw1{l2bZdO4ti4e#@@$Jks^KE_iDGWbc?*{)Xac){7`>tRfi7fmu9@!-*vXCD1z(=P(ryP*T zw0J$WwG3R${*|rA0JV(`Xg+HeaQIW8m$&4iqQKd1luDt^P+R9)RJ!FZ>YNtu3QSI$ z7EQ#V)6riQrH)(ke9ZPPyK;>l`n-2#t*7LrBFPZE(mN|$v{{PVc0wvUr?A4c$lLHRhhe_MGL=$ zpeTCk$M}_m!IT%S{s>_?j=s%f`HGMTUn;Ui!i7c1gn5-{Z;a?vWWtmA6=Td}@hHqR zHNCzj4KckU9|5)arG)g?1>(7gENK^CMHGU{R1p-NN}RIA zFl4@-lA$&?p#;UxMNkx}?rm~^BLC+61!*s#$|APSkv`b*n~7)Bf`}#}Ukhmsk{09N zoOemvr_w~G6v5Dr{}b^d5{e+GJt*Q|$1eG|RsM+}*>Q}2BQtu6gmD%3sroO%=n2F` zTVicNI2^3v_u-q0m?)Y3bhvM}dA>v?w~BP=ELV0@>IMW@@`8XpfDJ!VrU9^UarC*=zs*sE>rfrwk9Zo@{z4~!Hdej=Wpi1;y4 z|34zW3=zrgqOev>p)O3IL+bNZdZmukUt2D|zvMVFq^T%ev`T2I?X2Y2ib*SGfKk@cK}l zp=i;YmxiUX{4|bVidH&DTlSn?&A^Png;s@=b&5A+ZbWe-I_tnSHg67I zi8*8~wL8V^dAB4Y}R>qLL}Z_ExEuG-Z9ryZCSJDgV?%c$YRV;2e|Vb_i&m!o_U zb{#sEx$wO8rOMZ9Vc*xP@U5@opXT1%d#kxKw55 z&PNT27R7Ls4fHzPMTK|<({H!y+aSbUgj~;=48MXBcM&)tkHUQ58z|v?a6L?b;@7h3 z34!im(JQV~EBzfTIw=y%3oUT+w8U`|6TQSAgamCBpB6rcqTX3g2-cLY_)~J})?;dY zZo^u1Ea6ZaXHmV#m@XC^ASCDFDpNW}3uj2Wtuzw60^XVE-~`9onrwD=Pl(uqS}IS( zm&WV~lI00G1_1u3yd=6NyFX@&;m7t+h_Vtz0Xct2Zq<`d$aa9PNtMaElAS5#mllyL z5Y(l1ACWEdojgjG^~g-D(2isB<=V=TC7pd2l%xuy;gY<5>l(jxpTgJckIE#vui0bW zTQr!BD@Z#8(hhl$aeU}MBEYB7<~+4schVmx5hf5YsI!6|GS9 zpCm!lGnY^5m%O2%pB7ONaBRO}3dS3clX$}v@D{@3i#{g1zT%|59(Iv&!=#&eI6*|0 z+oE{`2=P+DV}$VK@CKUg>!n2&+rC`x8rwdO(jKvW+&`X&&ljDM>5GncdaF;iQ*mWq zZ>Zi$HGO>Mj=;0GMScA;z{on;~4R9nb^RiV)pzDuiB?j<6JAr*ZPq(YSq+T1# zDcaMks6?s3SIWGv|D2%Ldd!}3Y9cY^42Q(2Dfe*alq}WziA0xNCMqMzOwRCEIG;Hj0?zBDKQgg?4odzKh?{~0H!#=w|P|E zqgQZDc-0p&$?0`hruqB1LJlK?1q#dKHCAOBDlpR^(l4dpV}Y+o!55zM-=Sc~I);`J z+K1&=Xo~~&8W;K-$0(RdOlGJ(Gk89Wk_a%7$Ak=0>sDNDb1B=h_iQln)*ire1YsU0 zS~fC@#GRt#u=)4Kc?y(S!7*QQ&U9mc#L4u@)gWLiK$E{SpE#wL>dh5rT&l-?VX6Kb z^`Bv>u9qd=)nb+vdf70-^>=zrer3J($$IT8Dijt!o-3Crij7o5`Fd#aung^q-SqE& zSyU0Vm1qa{13-^8=QNRIq&?2cw0Nj7N?SaK=`ZGV;Pu+_?Ym~>D zfIjO^^jRl|Ru1c-&pKF9sGBct175oMWS#mkWqac>t7T(jtJFG_TJtSV9j^}TOnj8G zUlRSD5xp%})WmX+)6r@~r`&=}-An9|F0wmxuHB)2K5Hx;ste?JOGXB;Om1c)eb)3% z9?PI-6X;pT(8^IgdiGYuP~Dn8jH*3I)GLB{hV!;N@b19c#%m%wzPqpAq}`d<;e8VQ0rt zjG!5nTvc;tVs72mX&>9Eui|}l&dZN`&Ck46c9GYbRx}W`z)4+HI7Z2v+Ss?PxlYR{ z#I&(Uv}~dJt79Em#mSPLZZp_y1~+R<4PorOPA)I2-?wh|3fE4L^{XNop?}D)iiB^w z&5x~e47&G@juu>PR71|F+jh^(*&rU($c@u$&FOn8t`=RE_Eapg-#nnL+{7vr`A{t> zNa%<06uxau-@|%>7XyG$Yj*KF#anvUYb#^I?$|#VroXA>&F{!!ATq!3m6~Zz#?~2H z==|K=ccR(mG1er~-ThB>3*FnFnRHQ6dhQ>5Nap_i_T2B3Y)5p>eT=z}wVcye=6(fR z!%F6U#bCE<7EDd%eyf{%bEu{V2Of}p%v_Ft+18kw=4H9f1dpGrv%wxHnrT?`2YRz! zQUEi|cUoT0lXINxBEvCtpld4Io2i4njvw0aw7#=Pcm0t&M@>{392)-_K<+&6O!FB@ zS|LqHJ~u_A1B?9DD9}7(plIJ^gJphaPh}RnUP<)9j!~S$sjl~!AFK1EV=dRKevIur zPvV4F&XYcD3GamIm}5Clx}I_8rz@5LON*9&4-?9P!8DDz#v|m99W3L)dhh(6)C76) z=6Xo(?OM|}51EQ>*)t4C2Rr2@yESDt#F@7s=>btV3TbikLpT5ED~VT*a3RInk)kT( zbc2`p(ZSZYEINyIEv2AjwXEzT4=mYQ6W!XVs_|w~LP6OY=5u}QV_0KTrKA;665Ca) z3Bh8J7@O{aS??`bsg$Sl?nyk5R>v?Gun(ZG(i3Z#;o94Bybr`7NA{u>H6K^)noSf( z10%CTfFUA}YbR4-%$p9jXOF9ht`;hsl35hBN@PI7ij1ZunFCGP7@_;Ep+$0P7`OuK z%|U7nk&jyY#F{MGvr!nr|iUX1(j^!ZI&i zkkYPWq9+niq+olh^HhQZ~Xj`?ionDmIGHk=uT2lYW2*r(7)+2>HwMi`M!f%r1d`Am! z;#X`YHYmUp6j|SNVk#XGIF)eIrk;0xccMd+@?r%vs)$R<8NuE}p<&X#-{|GC!Ax_v zVp#9+6@!+6-vYv^*)0G}Z?9+ms{n4Ay|pgchgOzTx|?NR?X^&b=;i@oKP#Pi0vFg1 zad-ynuIca}lpio4uX&mhL`*tG-VVy6kf9#7PoC7Y=mtz}>2KiIaoKfuTQ57;k8)Oy z4Wwa@dR*4Z#hi7pRxTDZE1$KPwK6Gd<@JI7=DshSbab8n{Tu>0{h;GX;^e5LVf|b> zEXtu@E-*ixBFYtc3>*VjRn;4Q^C4E8#Te|d0s4pp1Us?u zJc3slzP>GSw*4P(Jg7kBOx>DN?%36`vzH8QG3{2)l_-O_SM4}jtmFXX=`bZE`akSw z+N#Va>%f+$R0L{APRqPQ#^)?>B!f+gfE*`m}6jy-}qw zLaQ_NEESTiDxtZAd`J~J8~dnm4dLSb@f*N%>cr+=yz0c}N<8r?{1g2AbT5Gd0)OXx z45DE(KWYCu@+g^_NEHwqAMkXc^V0O`5UJU71yi>nC`ncpXqmo_BY%wXgRkx;3#hA<- zF(Yz(wwZlv;9SfpEPwfWv8QtEqDZo{CF*8 zqpMpli^M+L%$rAy(iSX6Tkxtx)?{CoM2AzyDO*L|>q-jok!4%6P;X zYst;YpbfMNk8y)ItyPHFDujsA=QZ(2w_XyFN_8%T(&#Gbi47}8U@D-g?*3E~ZhX0p zA8pxF{8tv#kyZErof?4kYLyBp2>LDmOpo=Hz{+ne!sKr{CV#=Hp@vh*`mXa%-Bd-f z@=)e}*^c5i_aN5bh^k3jJ8G=k{B+Q64q8Xu#lM2Fx~aOD+@7rG;L>aiz8XJ46KVU8 zG}a1+rE1n2BdbW4Ke3?1kmNkw{81IbG^XE+x`#P{PHyo&{ql&7Th%-VSz7p)YByx- z^a$5HPf6J`1!u;^?m$RvK7>t=R}mCQg{}hS7|qN~;gzZpf}*w(=qZKNl-^aDUn{+< z!gWgT8refdjN^<5N=Ai>Qvgrarv|Bd>X2>F1kpqvH+P|?kiFU`E#IE4Dii#8O*IU! zH60DPy&Lu4D-vm?EsW_^5w zRmG3t3HF(>M%J$2M*1*amFd$2O_qJ9K$}lfBk~jQB}tL-k6G zM-+m#f`Sy)o&iC>y5~$=hSD^GY(;o;%fXE9T9L5`_^I;?d+VT%FS@G@IuR58S30Dt zB``h%ud*jfpU;&m{`#3-y|F0GRJCRKj3xdy%f33#6QO983=Yv)xR;2V>(pJ)0$)BO{D~4a8z0{#&EwGwcu((KJ(OooCY7`=}t zUQ!9Ei4(RbPPoXPIXV)Y6yu>ws`S!9C5=Vu<`)TxAT%W|?jqFeBAbBKTglJDNJZ^o zORK55^g+v|ib7J`1EfN!&la#2Dcw$TrahbNql?bzbfYa|RTjd^WHWYM@+{=D>6|pp zU?Vequ*Vft)5+i}D4RPzJdm0`=rdsJ3L<*)afJifUf3N)jhvyLyoKi=q@^II4|!bS zL5cR&?T&oLA1YPYs-m~x$;OXD!+7H30U-deB)Fi;FSOVb`)5n5Vwsb^uT|2NE=*(( zbfAWNVQj5F8g4O&zp@Wp2cLks|Vl`HHhk3;$5M zbK~Phb#y}u^%dl%y5c&j_9m|@iKK%~^0H4@F=Vi7WjaF7t0)s{n`b zA4u@@iQJu%mR?J%iXR~8EW1p2eX3CpkP+Td9TQ2%ZEmk_ke!k~ z?GmRZIEMXnN~Um4-g!yBzsB3jeK*|LCCY?tfoD4pqfq%Hy<_oQ&cdP4vC&D6&p8`- zqC{oJ1}7N~i`*mKkqV`I!X@aFDyV+}{ ziQHY%TsdA80aa9i{b`C0K2YN0B*FhQ!GB(#;&%P=$5Z%!T;-OXB={eN3^@(_W85RM z4l<;$H|Y_wP93sN@cZ#61hQvbMbpeQFiFVie}s{ycmf?@R;D;%k5xLX6bovZX2tJf zuU}8I*K34^1l;g=9kg`Iq}8kc7O1tFUsP#wo-YO#Us$OXTkXD5%cITRSLzR13eV7|?(9EwpKV zaG!PiT(@=q)X~c)jZBVNK6E4&;;}^Ljmx%CTGvLut;-uPi|XwAA|*S`$=kHCTTNb| zijM1p#&n(AysxRdeBU}Q%45s3+T0_D@>cv%8g!5Jm7sJQgm-y={f6_j$N=$r9r_L9 z;WoV`3s*sX=3724*KqMw-w3nK;1Z8d%PPCU=WGuy9v>~ZN=0N#L`N{70yz>m8T^h4 z^pe15!PzR1D}m30GgQDSfm6Y$D$rX3$>0QU)SEdzI_WAW2Hfp5S6Sx8n361c&a#m{ zt&czIMVDBKe4TKSPs@@c;(B#NT(6FZ>(vo)y*eVUS4YJ4^0;rU+qKh}weuAPYSeNu zui4?Y?rU;$X?1ZSv`}Z(isW>ozj;xKXSq*HdX^8>()WwqgWl)T(};O`$?*zj@=Y!B zOYp~SR`~2#Zs&DcdYVm%xLhIbl;0*z^ol*LGOj{Hg-QhrqL|fo76&+P#Og$y!nZWMQq`>N zkm1EPWQ?wN4af8*-F49G_#?2J=0dq&HqG3G zjSg6eijp;4OzZl|OJL*wnqn8%Q9AW@j)cZMxH%n#u zggW@%X6p06QHju&$s@pK^LoG}MjNjY%5WVBy^k@Sm?xQ^ay|UOMJP(6BT9`E`%~*F zPe5pEZ{{t(uxf^)p@vK&xheQQ8VYu<-==6>zT{;@bIR|?%ShznxfhSY9TAyK6Hc2< z+GCHxwBoPk16P6Ftpd9%z2>{nL>C>XLyPyi&z_AG_y=&56PrVTsVonqH^+GkRKCO$ zu4bU}U~gD1L9Em1PgOh1sze*=VFlO|x}dW8*oa4jm3*peOUfQtXOJ^-w@fBj$tt(G zXrqir*pkg;n4mY)sTAX3-qbN6Yr8WJ?Xf6UK=GZtS^-opnQB92oq&XQ3f=tBS!Wt` zJxflMlFv{Qw2Z|#R=_>)ZVtq=dgywmrRuXhtJ0NKFHkLMk^R|>fR#!5(6fopcr!9yN@=e(k@L>7`H7)D;VBH-4}*S~ zsmgaO*Ay!T{l3?6T&AsB(Yf&Qesa5e&~a_ewBO1H%@dxIPb#h!Law95G^l59wWXv?Io4*qub2~gvkg8jXlX5g4)PV|>v0W#w9Xfq#43bpmOZ-vP_bCFyosUDrot+lr*Cc=H~_gbXW zgVLSW%{{DH=+L@PynoB1+}~fesB+$#u5l=CDLR3#Q#9E$n@wh!jKgCd)kBA2Q?V>) zJ`;GJinq!5qLZ_vSAKf+kNbn}^(*v8HJO`gGD}{6N+uT5V6HScO~9c3I`13(L| zUh_?v5BB>a4z_MPJ<&V(D#(t|2f2aEP9U-PSKIWCg2QZ0Hq3ULcBRQi-j9-x)~v?v zDVKWYEi8s6I_V*reRI@zvxB>_HVsGJH)l#fO-xd5PT7 z=q2sJC#{zSw&yXB3WRReAsI7pq+@6*->n0l*I$+V{}p||qo zhWHaC8D?X=ofSwPrjfPTUJ2yQVyP}AuT(GEC>u*{=@WEH4}I24TPmFtd0L=pjvZ+E zH=1006e--yb({A){bofulJ8XAsu-o0RFqaY%~n?vD|0C#NlQYtd{8)|!7j)eKahF2 zio;;jkKpOS_JHo@m3vwy3C+S+0yQsLQ~fR-7nJ}k^bi@eN# zu823d9WC9uZMM1xwephq?iRPBj(1&`I?Q&rBknF~e z^myFZZCSw;e}}2c()-0m^{DSAwkGYBKhV|&mS!%`UYcHm%#*xYXm9AWwe0#QP78PE zv|4x!G_o2ZfDEG-&!;cE3@A~haDr7@WSfxCnmV=!kioryAm%m|Q`G)N##7WoR83=O zDPp8rH?6XJ5nnqIG(pMy+M51KkT~LnJ*nB=IPZ75HE~)uup&{AXjV*9J#U0w=0Zvf zd*rC{sExQxms?yHxeN{Q98~wyzgE}nFM)};90;Jsc36{xjl97!9 z?0|Do6>`)nb2n@zIk`qQl*{OfZcXMBU~0CQ`%+9iRmq1W3l?hn8_Af=wPX{@1rfbv z()XNO*R(RX=1F}i$-HN>Cdm_}KB|HBeAf>)e?3j%3wu)d zr=1kOy0n`RVPE}*cD1!{fqCPP3HlUxNT_+d5b|YR8?H1J{|x@!NyT8blTN;z zj9&)XGkX%L1IxCFGi@>kC9u`9(pP|RhBn&2(ba_cmkv5E_JNK)=rru!<(wF2Z;%9; zvPWWS{!t{HZmJmVu^YMF6<!-UKO>OS-{Bp2#j4t`^xv?~uz_ruGM~uu1qXNcgTU5`G8z zmApd3o5)DNX8L%{$GUTrHE){kl6%tblKpP;pgq(v?LKV`YLK^eS36&^TZP{D0=?uY zc6;05Wv(W3^fU-;`bO8m6MIWe@Ws8cjk?m$>8?7SPUadg&*0|x%)N>0N>1?3#CoLq zr0W>_^K*E(=Q@YCgilms!P!Q<5uJ37!w^GH`S^{pA>AQ;bw_VcnjN7dxq4DoBe6%Y50*H_t-G~}O*dwv*guRf=PxvO2(P)1?gIowisQvyVWfG5`A>KTgxaW(} zkbYuZsMe5*}<)2{qPmp>iX{nsMz7F=5YtKJSt zX?phuE=xVJhjeE@ycft94Rvy7=L>gYsOaR~%^v#l$-F>;{dzg)A6&)|^>3});=>%F zhLb2OQ*uzV+nQ16b{!Dwepf4bs`TnjN#Npjyy>xSb?eJ-ov$m{seii26kHL_JBtUqYR%{*iHqJ!^GcUS4@*@{HoZ_XE^57Jjp*onKv09! z*{_o4uFv5WOJnyDpW{Q=c##u5!MB;yn=-w-|Lk@AfoCrBeb|9t{;~~@g0-BI`quKa z&)UG+%*4=?Jj*wF6zI&I0zBWK7H&|Gv0$0xUZ!#{qsEVP*S7GkK>y?Q`N5&b>q`TT zaSOqf_sVL%!B<)QCEK-7EfKzw{o2yI=zIL9grGld%`U{d&=D z=jc5CMlVx3kDa#8<6}pwYHbe>ld6Hb{?0&o)46l3i7c=A4kq9nM%4KR)w5?2cr%C< z4sGqU6{#@*r0f+u^9^V|t*6vr3aifkAx*Ei7*L?z& zus~&6IMdkup=&!I0?rOgg@HG;wVUK21$PPhbbnLD^)OGG8)6={JL!(jc6v%SS6q#W zv9_j6p-RC4<@_6l*&J%f=Q)-{KmKu;Lg7RfkkZv#DD*+cLNdA4GYDiC$Y4CK&FDMa zL;O|dUbkzz_Sn~CWi=3>OBODU&Iazh^5n9*65fMTPdj0ztS!mG;a{g$pkeK;=YMgOa$OgZfRuk3wy^J~SQk#@g%8 z`85}4YwmE=-09#av*u3Lmpig*?qq$rBfI9#Y<_ZT?qq$rqgTzHtS@)u*4&v|U+SHq z2G$pjA69vzzHc}@AaKa^720D%l*ss$umf*2o7Z4o6@E}S??U57bvC4h2GeJ3b%z-x zlb_W>7ZCEpvJlCr>{)koe3CE3FpSGY_t1mhv^4`*DwQnCdbvr~%l4k@<$#+0@-2>< z35;h-X3Ye~GbO8L0^^yIT{D64Ov$O4z<8$gs+quersUR4U_1@1moa<2G_pLaz?#s5 z+|q0Co3Z%Qpqu%ko6Ybhtc87u1ShcZuFEXmFJ};)^8tF#Kc&~?4G>RKui>gLC$#zE zk>}^KU^t&g^M-TVv2ss|(15>*%W{sr@o&+Bk=#Bm>g$!c+}B^#Ayy8sm`?2cP26d4k9FsrHzBcpkbEnn6vmDmpC_9(-bmNc^7F<~~;&zw1O4 zF!%X5zmUhS=Y0*JuZ}Lf0WH%GZ}g&(MwYFIC^?{ozDs@H=)#*Jvvw`?pfoScnO&|$ zJwj_dp`07I_{72PWoP?dC27PkHiT1T}Isvlu;@7Xl|4eF3BInq-63=qJhO5#uiCF?!^<^yn{T z^gZx@hVl21=l$@0{Aql@#q!&}$#OId*Pom&5~ty+JLPYtk> zkPjZz9||6c)TPN)i;P3p9GAE8JqQlyy)X5Ltlz`*d$xh=N{SEUi z&|ahE)5-j^wEko0Yd`5Hd`w19Uqi2sgimBxPl@;?*UvWT{V6xK)E<_1$9#i$spL|h zSve4z$kAPFyJk4`>X>XQJg%c|rQ%bot6`RxV`9PG*UjbKoOmqt*nG-f zq{~PmCNtlDIdF~bmB)8}srZ3$lZmO*Fw7>fq}aVM%G!2lK;k z=eG)nrNSzn_czeH=5lPw;AfKCIRY>>>X;kIkFpdYHdRJ1x1*=3Dx%f4VMV7}7S-$n zhLVW@J)%Rkh!t`&t`!|hrhI_-aCKU2=GuG^c63!#*dbhxOt;fxOV+wotoM zi^wP0xmiRryt?EmxqoD^z+=wI_n7yORK`QW;`j#wM%kY=^ZuftfErp*3bVAcY2gOR zV1I#NgUVaR6PEN^G+0K-KrQlfJgTEvhTYGVlG0deBdRoosL~W&p7{w#%gE8D8k;U_R!F<1F&FoMq0C5ax~vhpJfqpB{rwbW zza;M;a&tPl0S1Dx7M~f4QC+AVTdj3?s&2qm>o<7h4%}QorMiNlxH83>?Nu*CKFU+0 zsq1XE5f=Lix%Bq1AAtK!?&>zWixiA?JZgyCCB@*PQY`}IDBj4WLZzfmXfA`pc)P?!$jk^DrLM87ZW*kgAViV{pLR5LF%1DC7-0} zb0T;BPNl}mUC26`33V`5WtVny$}UZ=;LY(i+K-%Lx2eW@A2;E+5XeQg#ixz6QNhM< za#7H{K21$L$*BhV8i(-6S0`HD!5kw!)Wr<-l%AZzP{({>s5>XgP{%OTF{z=_Zm@=- zHma1{jJWJox((I7lb9N;utWR%9BKX&m}6i6f55)}|1at5|5LgCADoz)Yl?;|xga|K z+R&-|C2Z^GPjyH0u15|pth~nF8z04#CfPKo*=!d}s!~pKjHx_N(`eJB-e?o1aKbKo zK&9WX?c=y*sk#JdFpbVK8;_DmTiN%8VQwLu0@vM(X9o}==X#* zD7NsR%E@h5zfkSngv3x+*$>_|K!odY&g!JBhQU0&(NT)$b@?a8=uUOl#&3OF9VZzG zTo~m=Z#!v5WiyCHDF${?*}&n&z>aSgiPy5{TXd!!vZtLofg|l%fKE=emy24qft|mK z&%v+<26fxG7M!-Lt8<*$t`4R}6-pvtL&C=2^!&`Wu=B4=4B%KpSYhqOQij0#<^ZY=mupV2y^*r*RZ1M5|@f6NsunFQja*yG|2vc3- z+78V0XgT_q3bC~q&X>P-zwdW^?2FD9d%1iqG#MKR0d)@5>Y=(*+M0=}-8-gra^Qkk zmG3sW6W$mfN?zK4d%uw_BB;F1$TKLNZImH%4p%2NqWw?eEH;~)^DZqosdCC%Q3nyW2aGpGD77GHS(PjXwRxFXbvSaK_bhsjuQ&4TqT@Ka8 zdxqm3a`K21MvRjs=S6nT&*iK)`mpTBGrQ+h9j_cBIghanNT+peO)$$Fdc*GZ`-bC~ z2(WIm5yck3<|D{D7st&%ppSV&YL!>-y4f%mqsG8kGqk9tm*n86ZJMb5M?)l9I7Az) zq)=2DVULBehFlW=ST+tN4IXW5tGx1G(ttW$?&xXZVHA*;m$BZ)QW_OFJFaKZY1Hw} zqm~_8xdX#ClusWc$zqo2UnlBukL+tbwLGNYc5!vqQSWh8Ow+BB_)YMC$fU2fOdf1a z1ALN|Y5h@@FGa+*_4A6>7tyS;6wtDSDS`~r_OoEbt6a)AG@d5bY4C5odAb@3l-?h&< zlSu%tzg~a8|NVb{e3+d5-fOSD_G|66*MdxXBD|mZj!R%U(?k%I2!+7%Q+TxS10}8# zO8m28;!IlNi9TIRr@EpmMd-&}u^(=Cufu(~!tPDgiQD*N#U+-)x8T;{$8rPlf)FzI zhl!7r!wjrpQco=854zn%zWHnsAZ-M#kt`qVnDvOIcU`1aByMEt=hnMOKz?7OEzNX@yE=LM96g2yF1AU?SXCVTG7lGM?w{90vqNl5vc;AStO0d^NerCkG$`QPzWJD&N zastw4KPF_jjLi=rvRH`saXI?Mat%xhC3ey6UTJB&TmJ^t`|948x_!;>7yAl$P5-l! zYW)rx!g#x!(iv$=rNYeq488v>5-C4X`eLGmyW4ff=kw)c*a1^2a{zT=gn|T2b<7K` zlI1E(n>(74OhN1VS2=w{Us==7R5R{F5)%_^im=JeY5G-Rr;3%SR$7!6K|qt}vxB z3w+HVDLGn6I-I1{`p1bwtVVKjkk-G7a+V`Sj1xUYjM4DoYW}#lEA)Zp!cL(_S7V&Q z`*Hc7mNI^ll~qX@{~Hd$b%vy|w7^3P%7OOOeY}!EAY0Ifm>~<+6-Y3;V$<`Py_R4e zR-tf@k2hYaI83)C3XQ0M`&cB0??#|d%`G~t{{GjA$gq+XwVTS6qaU35?=s9~x(ubd zB!{bOwFcQh=$$SR7I*kcd>0#uC1B01uW5cSj?0O6-;g;YBFqX5YRx?DikxQ-0 z6jT*|rktwyGsRSawd!b6s>{1esj5xS*GZ|$&Ic(~*)>&TPhiB!Ojhy0<)DfEPwrdi zT67>|+!}o9N{DqsRt6ReA%*j}f+Ka5)QO+S^Y+$xGF!_((JD7abrceP6xt)VpcDb` zu%wJW9pR(bi;S0Z9hbVHIV=Lz(W`EEHC{Ete9Yv+92>%=TpgT|a5cJh+4Hn}5LUd5 z&5EpFs{ffT5JE&eRqh~E@5`P+o)B0$wPj@WRkTipTie3wdcBS<2W|Q}vU}og;&m>D z;h&oV<(-hkVkM#Js`$*Uzdp4tv4>?=TfQN5;5a?FI51OW4C_VO!xg($36Or*-Z>@v zSb&(r>y11{d2k$~-=f)UmP1uSMsp`qV(rhB%-_B@gO`DGCtUyroo@ zD3QWr*DB%AbdA6KW;Lp!^UR_xxz8&pOUZqv%R29WqpUgTA_GiYhI2DAoaO6ncpHKc z1!A@`h_$)GFlNWz$qh3Z?WVtdBV~qj>)ciJhTwIwnN|AoXlZ|%ecZ+DOMjt z2g{}gVmG8p-@r3EHt2MbN)Jzz(P+A!z%@E{^XWy$iYPf&MA^|IV53!rT5^JmIb#lS zIS=he4b>Ye;rMi&M*p8EW05)}&!L~DnYj+pGsn4HX*+{~C>nK60k zm~<$LUn|;!zqV*y#xpc&(z!PGJ~lvUVamWSq@%1mIbZiFB~zGECX}d>!R->Ml-Y$D zq*i8_?d+qOVa8Z9%vN45sinR943k($o0(D;9wl0axy(At#jaU&-Xc)I()@8D%W;;gZlCN^Jo+^3m9YD*NL(WlNU_`(&hEYi z11^cZh*)!CmpzBohqAS>k)?&@5s928SUyBVjdRH;xf_}~jk~B`Q}3+S;RU$Z+_85Y zG{l1gkyB3ih@A4+JQ{q=Xn0$wXVMeZqC-ou061g|)4;>qWu!|@c7TiL4FWocrs7S>=KIfpOS8P+2wr6 zO2OJ0*T>xK39t9*pKIY#IgagXX7}8IxNVjbKdW1N{r=>er{5UA-mAlBBwK zK~`ns$ORZF>rH?L;8r@9^Tt)Sl%$~aD%EW=pLEbE#Yy*(i0aX8Z?ISD(QQrG?y^>= zpK`g&m!tNjG&x%RSSk7^s&1`lyX!op%|}#K-UUx{rIG{*oX32WIsH;YRCZS&xVc#*6p>F9evBvf3mA-JU}7lwkoeTWY|h5MmfCxk?9joh+lTFEx=HMqH8G^RXDs5R_1a8_` zXJj-ShOt?Z(c;UFjD{yLHYYMVhfi)~G?(;adqqZbNk29(GMY>JR+w`w<|Vzmv|0^i zUZP*fZ7br2fg&LRdpWxU`8qXWnRB!qJb_?2>+4%R`i8U^X@A5>H;87P?rD7@ZhN?k09Ku&=bqX&!Aq$dgwJ;YGvW-fYEWMTd zr9i50O8&yNTG)~7G?F!b#mi(*q*@`Ih~zjkj9yn^!uw8+@aZqZm{9?vB;Y*zpzT^M z`-bGHFy|7t0g_$dA(hr-K(ty2`1)o+;3FZLKUae2=%mL2XX|g2GMx9o%rZ7mGTYA! zDX6K{aV<5P_7ix z!$hVudsU+{gd&(`s)|B8a{@dZpIIX6e2V?0*nd4}Y`WXr$fS2&U{SrZzc1drvzIHo zibpnA<(F@%JD@f)i(8s^=Q&%-<8=oV(|0kc^6L%=mR86%PxG{i!dCx~iJpQ_o)hU? zrT12Iw+QTf*k^c}kCe3q!Qhq+9GwNrQ=wPx)nP4V&{tv!!VYGiK(k;+ZQ>Gh39VUl z=blum3_AY0-{RD@BtkY6@KwT54e->`kD)ChjR!Tn@sD)kq> z6JX`7;hW$mb<|SpWqkeoGUZL|`$3nwzecyLPv7U2E$;2Z(WJsfaw>>W(Twq~#_Hi2 zN+-5{pjM>R_)1<)`E->~3pdb46f=(GUbBj~{C8pa(c>1YZsxOoCycjF%rbhJ`gq&_ z+o$_DT&3>>YNR51*N0FHSEFHqJ^E~SvRvw1NjEvRzU$H_jl{NmB_3GVho=7l(N8n^ z1SzG}FXjcU=$Ht9+&IiJgoXvx^$#(#IW7h*vnJ)1F_T%E+OCt0(Uuhfc{dnZ&+%F=ta=&D>qustJa(ymyi#UsMLOJ3r!HFQJIEUgy<-It| za31tFCx=tSA-KEwzKZxt!E5l3CLr>b)SdfJ>idPQqRb|#dunczD!4sZm|Dk~5}o{0 zPf8AI;vD8E?Fet7?6_`4Ov{zB*%Vw@dP_d<44o*e)V$d!1lGqDDFP?{rb(urYA@>P z(V?RxZfK~Q{O}KzN{=N92H&HI2_Y}E8=0FMZzUT%UPT;SCaSNJ2BVlV@$(&Tg)2Pz zV)u#|fKR`7k;LlPP2qRD*IWizIf;<7g+Pm_*-)W5S%b^tVt%x{yp%mA0;A0Fb%{B? zF0jYfcVv8>fw_p--xT>DK7INLtlaH99)W`9h z$P%$z<|zx4*gj(#VSaru*4b|N#pbC_sC&^A$&gdp)H8gsW$#IriqEDG@H-PoRNap4 zwkgD!zA1k07%>ke9Y-L_r2YCI#UltBC?Km|M3fMYV>GkQzqo6zbH8u|! z`p?q+hfvv^N=KmF>_1jJ(_Zcw(tm?8=SQto$qLGJt4LY8E{vy#yw2rjd6$~ymD%N; zE#;k=S>6ET8sXjTK72(|D=`4_eX~Sf8i_?;zg=RLlz4eJ z3M=zYu9K5JtjMCegR=b(XyyCr4$1~T*f08vo0A36zY1UEoL}6G+>8^$9QJ!C>SF+? z`o4J!yw-E~x@OgtrI;`2%$l^;UjNm84EGN-lM> zNdTK$9wNzmh8h&yYyt?E5(ujieNg>PfWkiqX|C1WG;;n)c`80f=;Cd)-^-XUYC^Ln zEp-H$d)Y>QKDEQe14wN&zvUDD=2}HFkj8zrNzkuF4lzIJv*&x99}#`qGoI4-wa6aA z{H7q28D722Q~Gx;^0EpypIPZ#C~%fl+0cJi`l1#QNeBY8<+Go2mHq?eiMF4|{YqBK zC51GmLsu*R-T3v`EVD3ed39Wm$yJ<+`$0Nwi}GJBX{&2hCDkwJN}NhXT%1n0PWjJL zg~|nhnYK+=f>OrcQV}~PVs@BNSW*B)lm1Q+eN&6=km&4i zRDm7nADTTM`uHnx*grsv(c`#0&R1$$J->!}-1>yY9w$b3_1o_EINSJEFM;*O*YjYs zehM%;J8SgW4>_A_bkD<4^CGgXhS$+9Qt6(5k1D-vZc?G|=&`7hHB*WIV2Wf@re6I- zREd+R@F%05hzk4@+5aMsX@Bpf8tk7jnLzs}+f5M{JFP$~|tO<*_M9T4V zcRD6Z;!bp9=~G)ycx)W;q(gnj$XN`vEE#Igiz%g3wB>~qv|b9jzIqXN?-W$63c4N} zaZ%5F_PTEDr37zQ+Z-Mr6le{*87E7f@^o;G$gjiFIqO~2Vw#U4@x8uV`ECWVt)4J| zJCZf7HL@+Ryng-n63IvCFgcp>D!OVPx zs=O*%*z!ApMlQZ$l_^tqANOQ3D*e%+t)5yOh|O+q^{7j6b-Y_8Ba3_YNwGR$+Aq#{+`)K#MzE9ntDv1S4lo2y6ACQZZUDqqjPC zM?KT6rN{&_J1{y@7#S0}If884-qM!ly;(J*_3I;9`s`X&?be;T%BXKU$1@*>G_?zr z)DV?XisYQVR^P6B=9e~8 zf)=`l2pezPg^-t)wrdN96Y7*ryu0Glsfk1>UX%zhEc9Kjb?%s>(iL&XxX*2Mi*mxK zA{SQcEUz=qqZhN6iuRqiSC+{FFSY1^*V}L%VhAh*jBhi5P4Ixb`glW!^ z2$~_wR0u?aG6yr{85KgUj>I))$ln}+!R5$G?9lFun}QW`+o!Kp>sR6i5*cg$O-9uQ zZxm%HUT!RVw>m0i^!4z&T7?zmNQ?k~ran<`tU=gCUcEsqdoaGv{!AXPG~BLy4Wd^W zpV;{z?i@3&){J|eDU3L=`9a(TX512dHLVS011Z$e+8{P{or+4#ReQXgfM=#}~Gv({_AiI~+2#OYJ$fBj0uu+KwXI(cg9y+m1oD zqr`R$u^mHg$GNtn%yta39m8$MNZTR(q~M9$ju&i4o9)E4E{s?Re96?6e*4 z*$%^Yd}up5Y{wV2qtkYLWjh?uiis%OA;y)Rkd4wSOX=Ptqmnz&SJ|c&w;w1 z_gpui8yCUZL(!1X9-A|{y5kaZkG4E2R9SE!)Y-2_SMFK2_~HJ-9vkY7jpd|THI&z< z!`+RcauULG>lWpXqE0Lj5o0Mdi9x78E@93W@TN$-t4NPNPbOg$QnedP{9-rxAo@zo6TabqnNv`VsZd< z8o#cv$dD6xeakDL?xD*5cK4uj@y_Ih^vt0!+{H%Jl!ryH_OzjJ

_l<2R~?G}1xA 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�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≫>x?Z_|RxTCR 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ℑhda~9fpqpIfn*g2f3#8bxb2|vnFK!-rIgF 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 WF`Ss+Fq!eF@}BOY>y>z+|NSpx%^j%# literal 0 HcmV?d00001 diff --git a/docs/_template/last-modified/plugins/lib/win32/x64/git2-6777db8.dll b/docs/_template/last-modified/plugins/lib/win32/x64/git2-6777db8.dll new file mode 100644 index 0000000000000000000000000000000000000000..af7d32a6d45d117802aa97299411857e337018c7 GIT binary patch literal 1241088 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

ECgCq+?Yf4yq)s!?< z%rRPoXN9bOXWlzh%q)!9KS{xkn`leY1;p#3s#kIU62Kx=A>l2ju@4Y5Jt`*dzlR}A zzuX5CO27QXZb?2Z(N6c{bt~;S%zLW(sU=ptZWW`iZV~$*PsdgS@t-3vDS&X#Ikv8G z|1YWjLtXtN1cm+3lGSEv3nx5h *ID-Z@NK+8!P2cw*i4zJ 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 ?oWtXo? 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%0D{`vt#;`2CUJ-%^n$ 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

k%5(DZMh1-bi#MV^Piu%k{HXWh{4)mNb@ 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 ZVD4QuI=CsyZRXxK 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

I@anj*uWmR)0jY;-}-vk1nt<91W|&r(hk} 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̟LF4 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

(xzl{+N>{IK++~#@x~5lYgpWe{t7kEwuLGO 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

5t^*UsOY;W2JxXLxq!z*A-G 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 literal 0 HcmV?d00001 diff --git a/docs/_template/last-modified/plugins/lib/osx/libgit2-6777db8.dylib b/docs/_template/last-modified/plugins/lib/osx/libgit2-6777db8.dylib new file mode 100644 index 0000000000000000000000000000000000000000..cb1e7eb8c0e791800c3ea9f7175d1099130974f6 GIT binary patch literal 2102976 zcmeFa3w%`7wLd;5Gb95H>;a<$q!NTGBdHR>nn2XNCKCyHAS9p?gH}_uQ8Ae@AOuhW@zI`**vZj%%WV_gWork=v^ z4F3&7U>E|!5EzEQFa(AnFbsiV2n<7D7y`o(7>2+w1co8-{}=?`@BOkrxbW9SqU~7y z>*C;W!-e&~t_43uMT@OV7oXFy`Y~Dn-jsg?9?DODMMd@pR@ybU<{z4W*0nm_9ZO6) zdXu7I;Lo6QhTKI(Wvd>!@3E4iGP~nG1fJW5b!$wzmC#nuo7x%rGmg;8pthh4WG;H} zfsz#ulnVdQc6?iD(j7#@=}iidfxloG zbo36-7hc}rc&4W;P6>;lvCM-%_@?m$Xv4Tn#$sqYoQ-32u}r6<_l3ve{(J5B1`8DJ8d}Ed z2gc~O&eG}VO)xm$AK}C!k39BhDDGT%EY*+Ixq^}5We|u$e?>+2m6e4&c%NHF2g+~; z0db)+sJsM`cfsvBS=RL1Lvz$TR-3qZ8$OW4{0y&~W-jH6!6U*a!=an3ODOr zN*=oJrw`e0{LznZzWL_+?@PG;#)RwdUxh&3)c`F(10pe2w;UOlj~lCdk^I5GZunz? z!ZBBk)os2_Qz}v&n;spjJ3dOM`{vA8o!P6?jYb%u8~uF*B%$YL=;ZB4^GhxGyuWcL z$LdPMI}%KFCEireZR=m2^TD5I&w2f~rLnDXKR!DhVP;A*1_k4}F65^${LyTC5D(=Q zpq}sssKE=m8y2l9vp?|24GSK+uk_y1RX1dm-uuV{<&TyAtn7xg$4Vc_c+BxAkm#Yu z9=*Oe6mvtt1EpmMDZ3%%oHW6DmW9<5Ir|Tv66F6*J&PXriKFx(`>ONT5Q+_!JtwSe zO=TOUyTMUbN+U_nLm**KTz_M56t#Yb=P}%P0@DTU3Cp8_;QG{1rfX0K!Lq(^tnM42 zmnG=mS~6DGah@?j^zh#>1co6n41r+?3`1ZT0>cm(hQKfch9NKvfnf*?Ltq#J!w?vT zz%T@cAutSqVF(OEU>E|!5EzEQFa(AnFbsiV2n<7D7y`o(_#X*@eEy${mK4aH3t-2h z)7_&~7;9`3;y>KH);@~2%exocQ*?J>W3~0Pk{_+wCU9$~`#_CNVztfoyLp?EZMeMfuq6BX!B>(Gj*zLQZ}dP*n2kd=rtU$p&MT zkveC^)-h~T{hO8M)n*E4s@c!XYdIW@S0?Rq-$=gUnxg3M!AP|$vWG`)da z_bb+BWEGvdPWHSa_l##%rLaodA}LRAh`b7hHYWq0Y#HHOjxdpGrdIs%aVUOkbTCj) z-7r$|^O25vg0Tzh0CO2()Fgl{`MO62!NZSwcfuM<$@W%DNfL9th1T+3AgNZxTB>59 zsG=ij6mxwIL!P8D%=J0mzK^w@C0UtEHX?j6bH9$DnyBgDnxyI|H1*9$-zvm7uhlo% zOhA@Elg&skjH!lA7+2;>6Cs(*eV-^0_%yAKtbbCkV#8-6{YI}o;V4) zABA0;C}oTmO9oWF1Be9zX{~t^DYVu^qmZ#$vLhI9-@hUmZ`V@&5~!!f6&nF2Wi1E#URU5|F9ffew5VKZ8In{8xXeLH3 z7O8xt1VkFg4`CJOq;Whzj&p~ax0_-OuO&@l@-xV=$94rCy(BljBllg#?v4lwuS1jlUe9_cdQWpDyhVwr0;nx|y%cJCEs5ZT)VS zLPdi}`a>;Q10~y}B_kYt3pRUVP_NPAe?{^3U@-#Me>YGJq3E?*velFIDlr%$2vXqisM@cH`Mlp9QiV@KkEjp2+M{5<;xC9w=ft~z;+LPU0GqQiLvu8A` z`Z?$mtKAEtcjyNi(F1TW0#71bv9|Bg>9pd$z(D%m21XKMID1Ai*HWTvKmb>+NO~|x zSr3Xv#A)=^*#lgSA#CVD4=M;lM42MZ^>W2Q9dnOBsBZzKsW^sy5H%3dKSI(Pqtnyn z?1^AiUx0Ylf1xs;Bo#)~$a76#uv%@e z1GjypT5Zfd9{m#Cy-|x@N3n}3RzRZ?-Dt9*2}qS|+;Y?CToZH82Ptr}SYI-|MY6jF zlQ}C+>sYlP0X0$FQ}2tw=$`Rlp8gW4&v+!}J`6;Hl#^>zmYDblQxD6S?XGIr)Q)Ur z?n8K^&BgLsvyQnYfx^N$9!>`5o6=@8bEUxLODEcEGb*_z0#1JY%={DluqQADka%xm zANzTu^HYggTU;M9YmZXc;{K4O7oOmSEtZyvJp(Wq=~1jF)O2%zTT#Xd<~D$F326LS zgN7Zb<;wsjiy2@CSVZj2azzW8^aVj>K=e5VUr3ffH6;6-N0!iJo}etT6i^bfL<<4f z_hdKmzpX&RQK%^hcA&`(T4O%PQ2DkKL9@05ksV^o8(QQ(ihLQ70&@0S1k~(5CbCx( zgj*#fBHzCYQ7Xt-{(zo=WsFx1PBlFZ?9Mjc_Y!p@l*h7lMeuV0_ zMETyq+}UFE)#62*sC0p^KtK#rb1TiQ7vLj-E_w?Cakb+IbFmVETg?85Efyh$Xr+#z zQV#m%>9}e z2ylj(O5uK>m-`OH_+G$|K#|#61+%Gw5vV{EX|&(IS#Q5Z$u_cWw@0fBUuN45$i4TM z&Scy6R`%>iW%k(0o>?fv9<$lyh(_KArC#=o z5NVsq-IwVY_2zgI7T+Xq#a8gIb`|riD&_K)}U@Dw~TD$*=aAP@s#IPptqrT@(lhoDRkB|=7KqyxrGNB@{N-jPCbTk0$nCH5nO6 zer%oVy5j0O6F7byhH1-42ob(l;R;J_W>sIIrJ>Y65~*u~shPhlEa_NQ)fkraRwQ-& zWXmYX8U6)f$;Pp&m&1}}Q?jHjXqegm!?0vgtjZCVtca3bzQyG1i4-)8xrqMwit!U) zFG75oa09?b`>p;t;{9V#mWv#+rvQ-)kP$juC6@o%a=m6?erXg$TdVV<%ykq{@x4e` z*`rso>zMm11Q0HLhPSgXg}FXK3(r6Y%%zVq|l1e0iuOLW3@)H z{`Di6)?lVsh=WfKh=Y*h-6t`F{SO84Y$vJ+;@K8BHEPXVZ@}&AqJZFvC=<0oK;}h8 zPu~#kWL2bY;x-4Z`3uF!x59;ys4#qc zS}eGKKnZ6KNjRc>qL%PUN;qcAcxMlW?3=HUFoYAn&)}o=mRKn5Mc0YHdXy9+w;oe& zH}UL_9bj;}v&YpWt|mRnk9vBiNbTc#<@y%+KwzHr7;n8YyMwLUfUMjzwN-HON-9Sa z%a@pZ_oMp&NCF@}h<^Z04HgTNSnYeLgBNaP?|#US6!Yw3NjLE$JiD&!2a3&*%x#8S zq+|)DwUjbnKCSMjIME&o;1w-O#X(+i5LJodoPAg{RU;Bw2m3T3(2}g@pU0*^)(qFw z6gNfb#%&qLJ+wwkWL2Z6V6jH~J=8{|m=Z&0*NxDNwKg@AUG$Y(;nnaD>yK7UrjK-QNR zz_eU##q%6s@I5w1I~DdR{7~3FMF?%8f@9B53GmGPs zkUkIZNAOTTBar5QYCq2aR^k05&D8&CKYs-n{r{n#cl-|?&!3}h;p6!$`2SDFlji0G z===ZPLusx?no!!C;a-l1Ri%Ke>ipr)UJ zVromXI=V}Nt-Ff?jzA0I^t|TmnZ(xJjsR!l$IiY&R@F{PYTwgu-B65%1wI?vAm^uO z&*?hslcGH***b=ta_=cWJP_}Ldf`+v3cUpj_jkW~V{S%eaH({%{zht_^Nf~A zfFk|_@d8A?_sB&h`#j`=9Ix|jgA4NUDY&Pg(Lcpgjt8nf@!XI1Gw{#Ao1O!3lTpGK z7zH=n^pN{vpHQBQd56jj)p0R-{;Si3`g!jAzq+1_DUaF^(qDi+EGdBYxL96g*4Y>0 zHC|_*Uo$Sg{!D|}F<;={nFhT*nQePKT3rJ@bU+T=UmDN0ovG|6ovHnr%6_4TzUoYa z%P~<|Xq>jt1XUZhm7cGMTqsI1I%@AJDr^LPpgyQ=jWxzI9=-iqwk=lKMsq7VnjyU6S*+<0J-&5GAWE!VsQpwP7Z=wJ;C0)=rL9Lde4|31M@{x+G z+PG?ruCP&cW;}1go0fBf>t)ohWSh`}CbS)T-(;G=coClBWz=3E%H)I01u5QK{l4=v zJ+|f0zkMtH)h;K!>_mXymO(@;&-1XUf2Uo z7OC!0@=cXk4q*;gO^0NtR75L<#wPF!%$Nh%Q^&i>dV;*tQGlibTVc;*SKkeeq@DxCZk5M6MGy# zQnI6q1L@l%{W;r_LYLTM|I#0`onQm!aRJ^z`0}GO^Nna`F<<SVlgobn#^P3ek=YupQzcaCot$PUQ=%2bB0xA{wtpDv`n?-Nj)6qQNP53!u?b0(B zY5q_=mI&Axv5iurjp$bhM8uein`~fv@dxCJ6FRo3LA8&MC?@NqcPOLPC|NrtPuO^< z8U1p%kyY(MG^?GcD3_)#6{*trO>Nv zlJ`;OqhjI&j@Ln?*6kp$$^B^kSSsfInGRzyFQ1H-g0uoS^83mDInKrwQXt5;APEW4 zI-xI;`>`!e3@((*gj}?_NVyCeFny$@-a+7V_T9}~f27pynps6@bgTWG9x61Rl^s?u&gwc`oK1Dl=5a z#pL<#P7~hm|L(fZEuZQpdM_*q$p~Yuv-e87!F9lKIp`|%ONO_uga-EjR5nJ?@d+T* z8wGzb#@9PnNprzw3L7^L{X@K<&nBhNtW*$Av27IcBliC^b5=vbPHerMe=S z4tzGF0W>NYw7|$%#y-y{=8+!X)j$L{c4}V(0?B=hRlN>}`$PK!YFdCFm5=MWwafm4 zvq#UNuc$)WlVy`mraHcnE4uWhH;DuT`wlM?Zr9vD!^hltwy5m2ZuDliY`-lN3(YgQ4(0g@tbo3;%Oicx_nt zwy4*Yu6WHZcodA9~XxuJ{I#z?27 zBdm6XBz;7XS{f1b>w|tn&_5#Rj|}>wf_`JrKQiba74(k|`b|Oqn4o`b(9g(^9?QMJ zzfyEsDeRhA=(XRgujnK+v~~$hv`;#FG$b!_?7>ZuKH`lU4t5C~j34Cx7m0uG3WV!A z`}rWk0lMK{fqy4?v%K3RD0y(d0`srXR}MA)pda&5$u>jTTurP9YUcA{Gu!qtf1myF z^!bJr3R%zBFc@j^c+ILSN}zwU`t)UD8ZW*qP}!qRlUB7x%o;JjF_G2iS?bnVSLyl# zmA#(?Buu1JY6c5Usy&_#^T=lZh&sSEAi6-51nt-4Kh^o*O#|ZTAp8dCi(FySK?hx7 z2KhSMLX_evPz;gxPIXB~{22{@czzdXnL7E#GmRuq*IveI+vD3jUgK=nFXK=_hLYbk zKk=;NuS=ij1{vo|HiC7N^|Z_MmXmDGsY ziwvx`m(}i3T$Lh=OUrV2FpEpe@i0e&(YR(TlgZayny)WG99}4~uwFHmhBP z^AAIUERG^*)B>4ZAO?c}7y5pCF1@JioD8JbCZggngNrL0KmF+#9e=)q z;5Ht!%6*1y_ytXbKc7Glo8c^qhee3R?bUpbX})gFw^s9!^*T~MqxoVq-)ow0hUWXD z=1b6g?`pnG&G&)kTMA!%U}vmc_oXVTbAPyly5g9Q^&8*x&I-hE`Fnp$f!{~*E z87rU}LPIhz-v{`Qm>hR2*4SOpKLlt69Rt!XS4>ZU6&PI3gm_p)!vTi73+)OJi=q`z zlZ|w?*ei}jhs=tcdOzlsEw;%vLj-3>gCNOkr|TT!m7N(B2Le%OEs;l&x2&%5OStQ3h&VVww98C*(5OfCgi zkv`bHchyL_7v`yVQkq^P4gpd5u1J4>t{+d4>Kvc+X`+Z@Fjqh?0&2A-Q2 zinA?1#9}pd!fx9E}J#x=?;#1#AI~fxK8+mD&=tm~xn>pA(ZD zj9Ku#nDnNqdeSC~X2r;!$WYZ)FC&<;8S=DDp<0Z}GZdvptCWc^!N4Twn2WyDCa+C~ zD}rPLjD0Vaxg?#$gs&;(KKXdR)WCo7Yszi9UGnf}UW60Y9=wVOuVS6dtE%DHW1DWo z?knM2C3I}mw>==O?)O9@qq1VMk`brmq)YWYBT30v05wqxrns7}>j&QEE%Y|VigmiO zo{Cis&_g~g8y*7MY;Yogd=bL;bkG+md>e%i2am{?@l;br2?BIY8OyYnUA)$BMU%CF zl^AM7lf@QZ4{Cv#^ol>@zZ#?d5@HnjR^Tg+zX4r%N({QS&`U@_o$4CkJc0mRa6UPV zbz-udVXg+sx+WG-CIyaCFrA?LZ{*CGOePz@f-@15j8qNEDg&?RQrGU3197a1dZ&MR z=NXEq=n8xaGb8MCGXhxPi5Y4uuv>4+STmKRDrh!N|Rk$`rYqG6c@Y z@0A0O*MWxzu(J^AHyTnIASf}{BZ!d$*haY@4*y4VoxQFt>^avT9(O73OD*SO(^I+- zKNw06i-=N9p6;y$5z+AYf6*A+Jy}VMQ?dw&(~^|5a3tpG(+%7--TUniOu(N(9IpE2 zC%{a_NmXroy6Tkh1#!6QjPM03cX-_q!X*isw;c%LU!}0(Qr)fBxrr~g!hQnzB zhX=8f)*nKDk>o|qx;xPy4Ie+WPmou~>g?m>)zfwM(aNI9q#sF~WH-vYlLTL(mBt+g zwRET44-~uuBdve>O)|)Wk(a~dK4U+mWOpgI$KY_O+!JAMmV2+WN6Hmm$^H%^ub!Tw-^57EB{W{)J&ob z3q}%USeWPi-DHh2P(BSb$r@;!A($x1ah4{jpEoJcrZg*Q25#NWR~z_js89JxFF{IK zQ=(+p)w^^WnpPsu(Z!@{+q(~%|4dcpt-s&DH-R=Xe}BEEH6c013>WZMi`{Cy?A zV`{IGeXN)p78diQGPMXC=!BZ`9dw+c2<9S8A$f()n+z0WkBNvsG|kZtQ1KNgE4o~% z=$QJkC@FdsSWz*b{5U25Ovy&Qizn*iPfg2j=XsehwL&!8WGqDZ>tk=>WNF0ICq=aO7zZNSf5d z*Oc%z%ebJbNJ{wClyM%y3KoQe6&ydic_y7s;2AMkm~H|=sqED#$iKo3{9*33aQI%q zj}4_w4|~q_hsRxt`%=rf*z}Z+#xFGAmhtz4GY;%-ja}W?3z%_?O)r~Kxxz|I3+rY$ zotm?*m_1gx5$nvSu0a<269> z1#+LUELJrY@uO&rV>5m#>f%52y@Q?&%D1E-ic(EWirJ&}#cV~rPJODV%hEQO;~aVT zG<%E{vjpAyNZgtO*X#rIvlkiKi`my7X2qR&AJ_cF$KZb8MaqoO1RcC3 zNYdMar=`^fXvX}0zTxv5KT>~^eo2SxrVvZsHr{cKyJrKy;u_7(F) zM9g=5rL4i?!&r8O8g1hq-|wlnVe1W?Ciox}FVW+_sENO~VWJFQ^5m>Lr ze<&U01$G>pe}Skntf5s?1c)44cOzysXo%%7;U`hn4puukf#0K%-h*wQ!hG4laGS zoT)wNGuxK`MKO=ggpnz1`atlODrlC$EO$q6(Mq=ddDLQ?kL8HtRUe02Sx=I+Qjo-3 zEuJR|F@yDMN)o%vuCer1_L7jilYUt0QFKP?27g+V=N);40G8C}zqYc8qAg8NOiTQL z*?It5Bw3Q@{p@m)M8Atl$C1ES=`HVG7SwpA3;l(*-yo>RUCMy`X#Xk6j`n-yHQ?8G z3z5;jI5FOlr#x;@*N~i8o~_@sV*~IvfE`$~vM^3bDN*jUt4aFA!_3x;Wf)leM0db` zxjrR9YPX=-h9!A-cq_DaV`Y5?8{D^s1iZ?AqRsZLa{qPqKl*(b+XR$NWIptq>koxr z>ibg5x!ClSE<}$_L25hzPi^B=lgIxB2??&u^-pjqYbMj$mc+5do0+?sf|eN6yLQTb z5QHk>)j$2qkMIh7(v%U6H`tz0d&Ow4IAWVkHW5dsS#2>q7bf4UMx1TuHkhc^J&yS8 zw6KJMls4V4R>wc@7#Kv;tjd@bTtAZ~tJk(pEIP2^A5?c~eADhEp6Mzlsrx@MK6xmx zKI}QyA0Brp?n^D_V$)MPj8B1*9~4Rt*mLD4f#kQ#PXfu)l=)Z}*^?5-ITDnGK}obc zR+||5O>g}O*#pPrRWT8c7^w7l%4A_T5`@j?B#$14*+}umQAju=>^avT9(O73OD*SO z(^I;z^+-5;as+%b1$rfN*B(r&zBH5Jl(xSp4MR5}t@Uoc0JLZXkUK4)IVaR@&yn z7BLxV4Du^wJwcjoXV5`H>tnee3nLkRr0w{8#nCzS6!&1&kli)V|xK?IPk9}4{VddtTU(H+0?Ptb;s_iKx9K@aYx<#>=#Y+Q_rd%~V`{o!$! z;=a^!E;c=-JKuQ53ACp5xTbu(;QDnGEq>z!Lse1@YUWP42UMFB!iwveCm=RU-GL66 zgu$##80$c#f!##8$56gU?jBk0!H#WWO*N7`rYP%NctZ!JxT+pr3{4PSqjdW`*E8g? z$H_Z{_RT&Gy#3)3i?CkyZXmHd9}R$PfgyREMq)MW?25Ib=2^YW^(vSHRBY~iyp?rZ zFu%&SznV+tthV&BrkncT0-jC$ZqAaIX!{a=^1F~!bL~=T!(y1<3*oAdR zKBVfee{thnT7*3I+f=+E+*;tSx>|%K=)B1BHzCAhH!@-Nmx%ig&of${uY2Ie+M$?) z`hJu}e#qv4v9 z!UI;B$x!x|jZ)_<&Ou4nh4?Ytv;s?jzQpyECXoWNJR_5MIK{*C>;ZC_X zt~^88^xQt2oso`0^r$e6U{${pnX!342~r}M>j?Qaoqa6g4EC9oJv3Dv(-h^NEYOeJ z&DcortwaVb!v2ojbDh1;S1gL4YfZAKvWyut`61C{%#hbaBlL124xOd~@2yY4LCW4} z#b!?Q@O{kIf+}yJC4S%ubD$h|o^*NN7^SV+vb&^QlaynYaw)l`neXE^%4=!mInfTI zl4ImK=J>rte*T5%1N1>T2DFH|--cJonC0m(jnGwNck+O|s~SL+)?Te_Aesn;-%}HI zBnwyMQ)9L};o4D;AC}%avVphCdt>D_CGhRr;Wnol$uGII6&2 zqS$5yljKCB11U(uJ+RM0Ww1v8Ek;SzhEYlePBMyOQYD^&Vi4}FHkk*r57dCdr;j_g zTCGOxsAyt(@n1DD-8QQ!!$88kVw;TeF-Cdbm!8zdh-i{FOw85{IrcUT(n3@mSRuwK zyVGkJsf`m%RLNSgOG+_IwrGpZ%o~)HXiE!EiFS-cIGrj^F%v4-=Qd@~#&Q7qvv^p5 zHd#ASxv=J_H_)(PIgk$WAH+Ls??74PK7%NKB)J`<Wfd-hg zk@+TEq$3K$>GghcAd6!hw1BZ+qSqq-0;)S>In^yz^Chg-U{r)Oq`dGtC{b~fVIdVt zn?&ke5`UEfF=)jB*ZNJAYXb!+FT9N3`GFieR8q-_tx!lgo>g*|x%aM&QVJ5JePpd? zX?|FjcSnKu#?=~J#}Yndl<s}GM+K^_opTMNcnd&FV94%LO~#u1 z&bbR=d_!X?+yHzB+;mAJ7h)$)lcONq_T)tlR*UqDC0u_YrfEJTMXwq?isv5#y0hBs z&bbRB49xwnG=~RL<4&_*4GF**`CkqRh{CM|Ljth7S~Vm9ho9FVK+QD5!lSacn_6T& zR{le|0W;W(dnZM85Q6iM%}pOSifpU15AtT9Brq1^qAr#qf)@sLA+JCkYT$)Y2T-JW zuOW+=gZ~hLnA=5-z5o(^xpDxBI)g}*GB9&Hp3ovObMt^lof;lBXf!sJXl!u$J`OVL z^;$;+QOOJ9C8dUDaB8$A_53q9gioKM@4i-QrB#gGVq=8=MgUE2(EG0wZ-f78@gCuy zB;Jw!@!}ojA2pB%XMv&P@38EvY#OzT&sXF328j5_7)KPTjjB*z^6~;s&NYiOlMJ`=HAvy}E#zxqXxvOL>w`AD$ z86{%&24?_sJw*-3u-~Fb%a}~J=Yf87ctJlZurHQjXYMTs3r7D7oIVe=0z9vQY}8(} zdI4&=n_MR-z%>=3ZB4#6zP=haTba~onCt-Q>n#*ilYgSR1vJyzg&Pi|4_I0fA!k4H zHS8D^S@7ND$xyq96d`CfG zlYCv?7_s;3k@rfVl#VD6f8y`Z5$}bLGs1zhFLXPZt9Zoy@@q2x>cxf!Cz#CB}G9#(pft~bp zCFlEFW=}{0MFja1(JOR$SCBCAO%g*C}@yzd2=E}nNkrhj_Z={ zGD}55x`1ZOtjv#w`glHZEim5sMm}F$6q^Z)dpfK_eOe8~kk`cM*ani(HTFx~9X#Tm zXx`}Yo58lhD8R5GsSuJDL|0FS3XRzOKthc}4|RcF#X$VreqNLRYMXmZz92gQE&`}3AYcM`f2VR9NMC!|n;lz=b+5vFlTA~!cz|Y1U zG+r_eKIi(w<1WR0spVX3dP*1EAB6exfL6-BSSa+M)`P+`Q&Z@rK%sZbphEA*US!qX z1%+oa-q7t^A=XBdh9A17?X-~NZ#wDsSz5;Nl&7Et#o4={Uayt(di(uflAeqdrlIFt ze<=J?-#iplp;rpo|HaLP|ROd(WW*k43TGZ0pJYPjZz#D4Euo}91*fC78kCD3M z`q3dh7>sF@wJ@paREu`=R48XZ=l-7|~<=KiU~e>$qB8o5viJaV@9U z#1DDC8teIDqU4cIO0Cin-s~%cV5Fu;j*!}Ycfbi9z8ST&!x?(c^@qYQ^?j-3Tx@zu zcRqdHWZ<|Gp*(4loBEXbabg=xfs|cC8co@Aou@~i_@0tyfGVmiCb*1&if3jXc*IrU zslICb1jBj7i2?gw%X?(JyRc;D!evS(a(ks#?LZgbS9V$A(I;XO`@q0TC;6fCq4T0U z=&)Df(Q+?u6ES5L7_Z3v2KIad&TVYkllUHU{{~!@G{CRo9eWC9iOl^RoRCK3E<^m0 z_yZ$7I9Z5uhj$R~#g<%w*Zng==rk@>z0CM+(Djt@yR&T?r>b5yu0QB{YFq&OuI0pL z3%pO3Xj$(G=dm-0J!va=@0Y!!iHL$XN%w>pQwA+gGNSEykoB>a#F5%AEdTeEN5HtG z(5UE@tOR}5G89sL%qL)^fEGx{?ifE~98F;eglrZ`@0n6KIzMo_0Hqyd4 z!z@a5{GN&;qYzwqiq(tVuFS(-QVNs`4liy`J%rj|%V%GJ<+=rikF-l%5V$$u@OtM4 z>kHc_ER5giZX~N zKpTvb96_v9V2J%Oi~+1468Dv@#Km0&kbb~i6MK1Yc^tGH86~uKq#Jizo`7`3s5bohQ%e0+vNTp3IqY0fAg4aM{WszJI zD!4P2jBdJPfl#m60Qr|}XJTN;WWO55wO0v|0~2fB{AJAb?;@R1S(#+{AQxvC^AW)h zDQn1^*!@I?QV^#+vCMMlDO^B=t3P?!GU$D>N|dw&se#&iN1j*i*7_=w@(_^WM+i2R zReNrKD*_0)w_*$@{gTPn#vp zlU8HBV$`oJ;rQQ}xRc!02AGUyhYwue=6oGO`dt7`Mcx6^UUAt0gTZ6 z{n6PA&R<8QHs8d7UmT^!^me-M13Ow3Mlj98r*(^h{{qu!D#{SpM*1b-9SR&YfnJh8ni*PzYc|hE z;3CaVDJgk5C`%5MCwp%T1uqB%rw7W@ zy)#6x2^!fznK4jq^iBw+Gb&l;nOQiR44Z(EIri=HC;igd^il9{zon^lpbj90}# z+pJd6!kbr3hnshgcnZ=HubKr9H1v~!BbuOHXcJS>_ccWN zjTtC+df0QWKRoVI+?QI;#iplp=hx>iCEZ$~F>JrJa_LnMV5WiNm$>le~oBl+HzrCN z4r2@OwB@`T`qZ>rcLe+@I#Jm zq9DjN%#{dug4Sb{s_W4{jEdwDcOKAsK)<>KDVx%kBL=WeV71W+d{HKUUkoD0Y1(wy zkF`uoTg=lksWd+@-oIr)egsMcXPzMDYq;`dsb9@Z^cxX8QWe&8HLi+R8`p0+H+P#(HZ z3mzg6hBK67UH_1w5KQ%&wz?O~V`3`7J@B*=sHwLD+X-K|LPmL{iE)fovPjQ<4MrDw z_NlVKMd$-0fwzca)$0hvBDzAT;U!#K@BP=GoVOFdzV{z=V!}mq0>X|CofyeAk&Z4RTfO?>WrrV*N!jL_Qc0Y@tHx6Uv8bM@O zmAD7k3g8almy)ww$ymX2R`QJdp$#RtYs?-dkTQb?MqcwED#;)ylN}`RF5MWo;MPg0 z1m?`Q5kf);4c|anFXnloQ1asXWEv_`Ijx+kX>le)uQhZR<9Sr+%fQCX5M9o(An>k& z3{6`qt7(z4#QPsbVmQUJIa*0G2gN`;bfJbNSbWfKN}0)<`jrOR)k2N7$}FvpwyYLv zv~Jo;89&g70r&(mN@%+$xU)jY=A#dhU@|(U0~#}PRtQ13vPZ(olF6j-BmrnZ{!wyP zk~OKkn{sZ!0O9lwoI0)Cfr0ref_!ffP^=w^)?))le8hn8f)ae(Y5-zU8pI+nQ5zl> z3a+N*8Zw^)l=^$l50o2+0_8_v{ym^D*L_5DGyu42ff2z*m&ZXx{!VLl95@Hv$U-PFr&?-HOUw%*v^h3gV=i(lT~ejpwt<2rZ$6f-346* zn3oN^8X&<-!?DzTARJGb>kgDYZ-W!yVe$rQYEFrzRaq0aQ}DTu6MI-yIfBtxGaAM- zKuEC*em{bOo5ak0Jv`xs1_y1O4n+%bc5pnwHmiJ~SWquwTR=^Z_zt@hl?}uSXBOPA z>=Fc7>>i@|McV#_x?18weOc+Dy^Cs7jFy3}8HPMiH|YlAi6#b~xIyEc`}jW37g3cB z#5OB?H0If=RNpvDB&1!*4T5=!*+e%ui`k{DSt+iAO^* zH1WTJl6m=E<@1$$GFdGKU_#I_G2x!{l}tCT9x6WGr8wm^1Yd zMuTlDgl+QV6|}^(wv&}IU$Zhd6< zkS!2n3bBO(@5J-BVf@9lVXf~{+Mu&X3En^#frr*@L+De8U!-H9%pC`nRV8&aZ}cf~ z>f~E_p*Q|Rb?dESPuEdzfkL2DU}=HP*&L!yLm-3 zvo*ms9*WAE^m*7qK3!v&R}D;0nZvDHdG>xKCAsF26Wm(I+i|nEx^@(=*gbIH_d#{? zgoL;l+?0<3ak*{60)2qFPrw62uNjR(=Q8}@<7gD0Ce6j?2Ho{=E7sj=k{P#y5fj5* z_=R3x(as$mH4F6mxeKCtn46Z}kXF^C+0d*i743*IAO>H(_zhy<8v&mX{oJo=0g(v! z78e3&z9{&eVqQf{ zMGUlOHLi)o%V=ocm?(y~+wX!vo!txqXTzb%bYYPw?gI(4@4pk8{5tG3253dP9et83 zViK79k8nBX;wUJAQ7JUx%a9%2IHV#>m#|Gwp|oaaE;l(HW@zQsgrCE<&!-dD_Pa3M z9&EXiPCV0cyahrK41sgGZ8Dv_a{>dF&KNL9<#};@MM6{Z92AMW@Mh5qYNczG$^+NH zENtLJw>ZoF8-*XD(A??%f2srd9xyo7@V~N?&{(L~Au{cT-bk~$f?TX#h8C|97WV7l zY)a8==52=CZiCMT*_>XYc16MnHCaV5?)qI6W7p%jgJO%L?N=_kUv*SpdLs+>n7pzQ%~xL7mnA}mzE00Mtt1`G#kZD6#ieUFX_nf zid_W0EdpOuU;2%3Jk9&mpVyEx-xa#IukhFiPd&idjjuk|ju-931$9%Rp%=gfb@FN> zgvWFPI)qPIcEQl`|AOmae5I&ULY-A!mb=1yom&p*a36<47~ z)!KlBm!9(B6~Kewr7y^Y>vztfooaR-%B*Y?AfJ^P`$LU$#gqtYQXt6j_^4l#f+cA7P+`iut zWsgV6>ZT>1qu{gcLSP(_|1)sFjVfzOUu{QE3Sl%8k?iovJyE4);`@!3lQgwmrKgb@ z`wO^n^b`^=LSi_-8FZc*baoFqdk3B04m$e>oaUg5F46LIJN_3AX@iJ?8UspO=|cx; zD|lL7Q`%D4mFNKfg#pJK0Y}}#mjxX4INo!82FXRSgxIudA$_`=NCR#cz~o(s$;7gM>4^UD$l$7YyVA3H8e@6-LLPCt^`@rvr@)X|gu2-`= z>3|?($%E(M)*_DImwxG6$$6UoIa&b@a@iE{h+EIEX>wYEeL8+PdJFcl* zEx^s(5u#}0kc?H7F##D#x>%hDh1f2P7Klqn+h;k`9A1d_+oZ(ot};7NdnkTl-c3K> zyjy9aF+8TM%2RHKdaZ*LWa{G*4s)>Dcx*Z1WCwI;Ug?zFXcU!U_MkFsa85lWs>7~k z;(Mj9V?L_s+alODkO4-T!op+a7GeQd?q`*dz09JLVxA6FRIszK3tLBOC?A~?z(?}r z?s2FdrwO~ws1Kj*LC4g`BN825&`%IfiXIKjw+qpc%}_pv(Ggndw;h-Ay_p&}NIY5k z@4iMVdX+vAd+(@8{s!Lf!HXZdPz@R9t>F+q6{@1Aw88h!qKYU~!Q?+(TKS(riT?c_ z3@zXP02(YvU$?<{t_x%|KaM@ zJPK=<-UOV9u(qF~BiwY3JFgV?%T!~3RgKQ$U21v2vM0VC^b-d$(o;8z-`Bdoeew$q|mTO8#b`HUw(L`nJ?eSX~6U(>Dh{{G{S0ArADe zj%cVqsxF;KDL4Vh3K*$gW2E2Fm1jdH`m6ZNm@gMZr&!)8?mDo~4JYD6jWC&&imi}` zh>n9c);}zHf0`U5tqsvVso~$wP>c$8cs@J8)dOM(&R+U4?VcJjKKp!tkq;OB}*5 zPJ7@I5{Pwa$x2#WV%n^-G5ior{XLeGJZlzEj;__gZ3I`NH^5TppCx4>3|L!~g=Uf$#eRMVS&6W^zr-hw=%E`AI2axSYK=RUwc zVy^$72DVmy(nY0_u}2FWY#UbCz^!&{zggSg7399P?ekoc*Kp@XFOKPbfsYLGCJA67|=lzlC|wEEqMDoz%;U6YdM+zYsi*DGL`Xw=aXK zKc>JC{6}NLg@OU}7xj@?0Ad+lW$7j=q~Zi`4b6Ztbbx@SK!-L3#@FDxcJH0>5M#2B zMaQZOn^B98)D3J~gHqTo9TAux!uw|6{SmM&f%F{$=~a_{UUt_L_g@&##TiJ#^Tps) zL-1Vd(YdJJJb>z<8YBYYk@A-@)oUg{i$=0-i=T}^?m?747q4rr&G_cpefXdN#vJ>B zA^d$2T?76CbITsR0P22(mDE2*T|$vXnf^E+p<;a+oJPYfVmCwR<$^BY)_1fxbDYo+ z!~^^wBvy80cj1Rm#kK*#+9QfQgtdO zPfA2}D*5!)skn4D#ZaA!i)2$qRHu%>E3!H@60fN0)F_Y?96FJkx*hNO-bZV=qh0>I z1JV#~$|X5xgphOeBug+l z#6~u5LB#76wuQp#DQpXc)l*mtg>_I^3xz@Mc`QA$i{Y4=GOqG3chS@(Vys zKsX$d9u8LSei}K2dNP;-@x0$pWEla(31?dOKk*kJ8Ejr)85P6N^7lj3S!lzzQ@M1N z1&;fiMArX>d}wUI|6;I2|ISSVGgcV(3lJyTII#o8Gr!B@pgE z*S!O2UceKy7cR)dW{Re7JY%1x-IOv}T(@V}*0;ec^Fp`VL6L93MF`prnj!sV9lA|$ zN|~(W&Eb30)DG@`5DkX1MqLRR8Y1Pdfk&1`Ug%O1LI0H$gPI=I$E~j`t4vCYS$#Sx zAO@_9XTLlX2U{F(W5Z5-d#>%%EdELo3aiOkHW-kM0M!)5-?Oyw!p%It4p%aN*1;WH z`C$t*Rn_W~D=Z%<(1YKTAbrf=5lYD?&6W?yvkZB$MW@>5uCTn1+q%V_r|_9IA1PjN zc9?MAa)>*gCO2>rCk%z$tXO}I^9^Dl4$Y~hS%QbI@>9#r9P5jEt&pV%5vtfbsSz2o zxI2@I&4A#Dqf`(aPw*~fMILu-QdTVHju)Yu%HOR(4Lc`+|9LTz@^|v6&^dFt;|**_ zs&k;#-=aV{s&BiEU-qg4E(pa+{E;9G%i0$W;Cq1VVasz-W8y6VotQFzLjIIXVUQ^47MF z%&A?p25D>i3Q5ZUiV~;*sY}g*x}#i@n<9{_?K3LQ%uh{wo(4;)co8e}Ur20Q`Y$3Z z@3nmeTa;hmD?0qFC#NQ*8Ze z$Tws$WZh4fjdkEc-O@?(D&AnQYNet!tA;475Q&3)PAPlUH35EF{xr%y;p~Tl>qYQ~ zldE+~*fJ?ly(|h$YO;hkZp+iFPhIgH^qg`4%(<)lKN9yiMoCRTUmxj|a%vVJqbVv8 z0}VCHN6;y&Pen<-&)`s0nh6461K?Uf;f4DxeE<}6t!y3XhXJoL3`Gu#R`cB`3!wonkUyIW%^Y!-#JP#CehTazg)kHWgZx#m&Oatc}@f9;g( z4P-bjj@lAkG2A@UdT^%onBGkULw)LIGlny4Jk4NwxVU#5ZcrP?!29H;*fiWv=4io3 z&!M(N(i}CsI8l7es11Aj~9by@w(Yd(ssc28^7qg#h zLj>_gO-cZ2S@uXC8Yrxd@Xd=T5F-0!(A#VDndHAIwj3e<9is_cnvEeF&@cWMjhDWn zgZIpYdKfgmS6?>KpMZ@G;V!+NFyw;uK^q4Yk(=~1k+E^|G3+`=)c}WZC%t354Rd#1 z#mj8ncFa!SXy8PRz%1~CP|Rx-Ltk;lS!b!IW`R+vUJxZ=s$;?6&_puZ}$s`b%4wTFP{w)UP6a2u;j3lHPtTrM{LV8ldHXL-; zkVl#zkNC$9@Mi>Kx$qJ1o%VbZ;Gq<5sxdqVx#u~^J!3Es%kj zdpguIkewVk5b(maah+2SgU1$bg1PQa6tk0x*-6EG0j-m(UeIsQ8_Z52@L~3qEt!}9 zI$M{9+WiZ}-v60~SjQELTL_iabr32;sUau^^N}1i5#kiCFi=SZ6|$6(XKD&&CHrlj zV&LsKh=_$TPA=d8)$6in1P<7&G|?Tm*)Lamh<{^QooR+lqsf_&C?RKx%t`#t@;>Lo{oK##e(r--N37biI|Rm~ryc$agQ^#V3kD;|79NwWKA`B*H-I0bfcoLm z@O-C_$qg4chJ&aPE>I~7vLqq6G<*ykqI{#&C!Zg)R=6$-X6psh^n$W*El-T-yDePX z0vGxPc4X?|ll`D)e|96G>d!WDu|IP6qV7MX9-aO9CqyRoM-$nIaKSJHqgA=;GhBTJ z%jf^YjwbIn>OKjcS}^P+%qA=Yc$DTLQLs@wgs(~S5C|!DT9bMjPS;4S?(gv3B%?S1 zdU;^wT=%R zyUHV;O#g=+d?2c$WkL{LAxqfHHFc<0)TWHh)Ta&=_MVZ^PXR>Gd8dGH2opqXf^8SHWVT*1O)n`6`w}SX zOQ7iKE;*@7j-On8AB3tnWgi2$xdA2nYqHVDwQ%{Uy8owefE6F7t?z`#s)kP(jD|lh zTGsIdlwil2GqiIr$lG9Y>GWXN%G949s1FJk3xr{Qfc@jc&D6-770nWvwt|s)uEB&bG zUuL3z>sdxk7W(%ua7q9E5f0VAzw6e&Z%Y5FzM_BMx^(BB)TTy$i!J5OY&c;7((DzB#Hlh@#cE$|{aE{3hr}1I@q=(#QP#Sl@7w!nLA&KnE;yl)g{w ze`@~Mwrxg~pwOdT#3?QCTi}RNLHnM#IEUVb%XmcAfh};l?tG}9>;vXd{IvoP> zhm84I#+*^48qUdw>Pj>Jyk5th+8hhUx~1mWS-KeLG5w0SZn=r4P4_ButVegRHvNjX zZk_2rf&S^j%Mx}UAsh^F<*objX3%iF0dw7lbiB@!k-2WCxJfcF*R34F@LA&i$5W8h zeO->A>;4e}#ro?)gj)A2Nh7qQb-TsQ9obyhE^hAPVfSti4fLmn`E@kUa!^LF(&ddy_NiVZ^#IM2DW&~3)f() zJPCSj=ZF6J)Isx8JQ9K>2MoD~wEAbU1#jd^Q1<~I*0jJ-jI%kX(|i^uJN3Ml3cj>) zu!Ech?utyL12VkD@vmq#=YSRjZ3j60EwJNQb`B>Pb8?oyvt3(w7)fD4>NKg!fuAEi zb_i|5m=vHij#e-!2C4=a6xtv*?QS0seI3csCTu?)4m4=AG)N2lKvgtBz4>VyTzv5R z*j}SrG#DZpNX^}B5rtRq2KA7%Xol4y5a4iW7zfpxD0xLZ?L$`DKd|*PaA;kSB85uY z0h0Eqc-lLxv|l1E4PJso=8c%uIDUZ}5fqe>pb6u=%{F|@wCvh>)mOD`wxP%FNc4IX z*mEGk6{*!`gX{UiPTMLg|& zR$BJgoPm@4f>Z??4((unC%Vi>AC`N$q~)kOq>rlaI4fX8hejVkDsSbE}e-I+4@d~O1auW?Anz_N(*c!(& zyzBY54~XtSS`kZmN-qt8XAp|P7G90IqDweBP^pF+*1G5fKB5;*YWA0%lij1DG-tGtz{j#M|?S(eo^)Xkv5`Ioirw$Z`Dz5TpT`lS+5sE~S_50QX}H zbUF$D1y)8aIs)61QH0a67Wf^J39~?lg^zkNN^RscXQj&k3C_6Z1!zwLHDFd6yt#3f zN`03(9#a%VJ@7!ihT}B(wjYl}Z$2n0ZRQ-ziHGfp^n&Z07tB)ci)YERviw1^U}`*^ z(me~Ohh!;@XSskjbByMHDOrFq52tozDTi*g!Txi=nrq_ecS(9+O%bsMPaAlaYW0WC z` ztA#sM-S=dvmdy~y)-=7S5HKGDU_z$>#?NBta~}%Z#v;_1TZm11iZJ!+hYeC4wBj>F z!E2EkM~>;}+|*9*4)8=oUTqX<4m3Nb-41ruHa?xS*s&Q_oXD9|h&F*oP>ViB9vv># z!W*DP%jmD;7Q?qMFk`06!>$&+2N7sAy8}8rbW1?44hg9C@jkRI&YT`^vVT712giYr z6|IVEiX3IA15Q##*7*ki_}}72o1!iJ4Dk2Q2WxlTT97k@CG%!t)<2^tV79g)jTqgE zo1uLhcy)^=0Nt?J#4_;Zr4g4_#e8{!%$M)!d-gchb7@I~jP<0fTFR5>C6PYhT zrg67JtttEjzhQF6HSiuVKEZ%#a^uyt^iH=~S2s_!vv}iV(%*_HU zZeT|N$tyx$xIyXytWSPiZ;vxLm)Z3hPw1zbKIx6u4cNbfHXIx~{M%3A)w1^N^(b2} z59we&zM$2g1da%wGtnfWxXj^3GeFh>egOcud9O9smp#v8!yc$#!_2H6O0eA}GaO*M z7ksMFFVcZ#VVeZkNSi>ev>nVrC;-KP=LsAW!Vq7vf2{uKQ(EJFfJLP~@i`A}_k2hJ z7PtGG{@`y;8Hv}DidOPjVClRZ%MmQjvDFo=V(~p^+a@3+EGgp|6h>0CKofk>xyM$P zNGn^;yr0hsN>6}|7zUECC7nRIpr=JwAT5P>)q~eqyjTIkf`k}iE&8i77$eB2nmj6j z46#Z0+fvg^8^6PFH-dMra3Ycb^_^1biLmXO<6DEc(jc@zU_Tv;NZ}SxM^d}cj z{deYrDK0RyDNb82c#pKef8g*YN1i*`HXe|$mQChVh;NODs}4oO0F7CKx54#fYR=&t z`YpL*d91ppE8n^aXkk3x$kO#y2hlK!kz9hUHD{aft*#-^iH7BE(bZB3=$cZ=Ev)33 ziz?|+!~01!^yG}asD{`WbS<6%jmA9OB`=of3?47Rs9OX^-8F2iFzS9nf~Cc%%N9Z? zfoBXpSv%|_-7B>EA0QtjhlHc{U(tLn8c4UR_IL+7Gq!_Pa8pgZ4}X*n9myTSQ@f@c zPpw>ujB*rNCQqC>2lMukTck{QYRiPDwoG_x%Y>)4On7R`gr~Mlcxuc1+wwu21yAj1 zSZ)Do;@;&bJ99M7Nn7MS?K;fXgL@5|!8*@1cF^8|F{^=5rsEl-W({~~M<^az3UjR2 zOPbWZ!zbc zJu)4qJ2mfeWZv;+g~ICOZA*4k(7MAmE?O|orbS!9foE_kPYV|-9@%2>$QF}Fc6z5U zFJMx4RtuZ#Ih=c>Y#KR`U4k>4_qgbHaPk92;#~ksIj{^jvcA~!m0wOE-h91)n7+GJ7^Qvo)R=*nGjiidgXlM}xbFAaRbrAF={lhvQ z;NSvHasJknyLmv+iyYlg7-+>m;V7lpos%00R7RXG%sz7cmaUyImz_Is0K+Cjpm>X0 zYR^(gv8vjCKCPh4D+;YAjWP3=b~+Hql*Fkli+_GMs;5zYwm zQMTWNTEW*iZ6S`)JGmO&%Z1`WfR7hVzWypXl=x|gix^~{A~)Bh`$3^z6ezvNa z&-jh=7J*w92)@Cwh{yOw)JZm_CdL1&H$hP{f?y&lgqdJ(N-X)<2x~$&Tma+jr}{xV zY#o9-aoVePGc$|)j|FViHlUwsRX=GJS86Dd!Sa8=AA)3RJ^0hj?Wde`& zqKP=ljsva%ICZ}uhC^?_OS@4u!p9Q_v8ohJ1E*4Aj6TN>i0!ap+6s)(Hg1EX!JNp= zW+e)p{8hvBIfv;z06Csf?S(CPzN!J|9u6zm3_U+iX&Crp#iZ)FDp;|fEAk0Lu!XxH zPf1$i0eh3hHpSCs#l{ zCCz>pdH@n2p8(KeK)_GqZSzbd5C^fT0U4}IUSKbAfGa&=pF)mOyS%gr47`zW`b3ru zu$8v(3FRl~Jve!QRMShun%Pw&C*{t)&c8)Cdpy~OFls>Iw0j5i8BHqG-vxJ6(Qy4; znlFR;yPS^LU_tV|k018^hDrq(b2(-9HDaz<1zS zc@$uPSweWAxv#I8d9SNwPCCMy5zejky#F}pR*;lwiUP|+1=y%{Y?uBEk5xTpKHYh{ zH=XV7vbf*FVc>|+ih=u^I-qB!3Exr zfefzSQ4pxr^9(2l`T;XLk6e%7l54>c49~aNBX9#s_gr@7u(n}9KGjWyNm_6`9%)O`gX7b& zrjY5COe#6J)7IeC{Dgmgq0Q4UElX6!0-7;a9|Sa0R#8VPnfN*&;oiS>%i zjSxzK5pDGDtM<+L!)%_f$?Q{4fcn|8NCxIOpn)gXyJbs$040kIy|6O7N;i83)Yi0; zQe3TJ8+UlO!pkw7y8(}gI96e^V?ZvogY}OB9D2lW7Gxp-aIlDZ!V29>V zTu-$kMVUE=aN?L+)>%C;vi3Q3;DEh~A{eLlF96ly#iphY(^4nr!+uF#sP-JuLR%hc zYE8GdGOEV&xlT0H#KS7Oij_+l&v^9(Pmi z4nBOy8@If`#6Fdt#y;LE$S3fO{t^ryVRs7>+P2EtrGj4;K9C)9%)wh@i(VjS6T3dM z+u1}Uh+{9s$5Rba^kL-PD%2w>3sNUV2*I#Ne~((M%4A}w%5Gz2HHTuic0X_t+Ys9C zqR?DYrl|qy0h?nb zf~A~y5UMTR1HS4pINTx*%&b;m?CVkp9zY1a=;O?fM_*!ZtdE+w$Y7-==3;v6VRKwa ziubVrm}F;hYyM-u4M_6=NCIh2n{5DoF9U&x!k>p<5WCAjoP+Mh?>UmO@EZg7I*>wY z@O=`e_d0xE#gBFT2CoJS@akc^8b}8I`^5V=W!8*`212D91VVEfCJdF6Sp3P22WER& zXVuWo2L^K?VIruKKrwg(t8p50hT(EF)^%a-BgTZ`IqwLC5UVk%usLUuc{=Ui{!~bV zIcGfIKIpX8ikVbGj9PUVTG z0H?e@Ha8EVK9;^|Gz0HCQz3VOVAo!)@LhevaMzwWzqLb7FE@4|`F#-YlU@AkQ~4a| zDK#by!HxtSt~ASizw1u#$gRQ$@SMZnIjH&$V+;V`xg5uGF#yk(WF$oU&_ zQYVc7M9QGt?w+3rcvBzA#o-}mJ42xmcWPvi3WwdnPM9E^l&j-mC{q>$iyuVkL+OHn z7T|lcdKO(Jt|1_+z64kNS=4}&&!TEvy$ubD zlVpGHv~J zW68b-a%9i`VBb-Y-RE(McK5qPyZhIacK2JL-TlTlWH6^V@RnPB<>`XV6pzN&+JYeo zy(>xlG6ElP7+K?`1y*4~a?Ah~aS=X?;WDNGU9g(NW5o}CKl2~&t!g7=t+QSub>L^IG~F!SN) zz<4TNhGF!>K0JRO)2EN}AMel~$@ia6N7A`B!gQN3NI@>ZoNX7zP;58nN6fi8uM;zT zTrcVYS?6Yv;=yoKrffC}n zAVN&u{dxON=AkA^O;_?KW;ES56d*{$89LQt_}2J zQ7BW@YfC4Rfp^1527MXJ;U!xew}l5jZDpEbIeTVdZp^)QHi^maZf$pwyML^-Go)^59{= z&HwxekOJF1cVLI;z9}K`bZ$yOYN);jourKm@N{zM#FpfRKoo&`B66^BBeE%u7sB5qJ);^G=xuLE~RDJYT#5{8K+0WD`maa?=z;BDdvn?ce@M{ELKIxMvWa%7%>~(ojL^L$|FGK>$>%g!d?$V9z!*V zMQ8NsBlPNld7aS>0CV#Gm9*YrrNi#^H5txZ)o>2Ra1Kmf@3bxsLBVURbYG1hqolxZ zNP)Skz#J5Kb8>+Luyj(Q9pX~w{W~2v85ADSr(_D#VS;~>jELxBnUptP$}3dmjYfGc z8qt19@C_^S?Zz_FUYd?&)n4Fv)T03bFYq)8t*Hftu?(Y@1d`he3hjHy*w~}}ga;=C zssmyJ9>b)%TU2#}P~El3%}0^5YnwQ7IW0{cDV88woCDP2A6kn^7~xEO&?p_CMA3|O zH+=xEzcipFwk&N%NXr33agMtMLA=jQBAe`_k1-V3Q!`A`*xMfU9^cx#QL z##eS0Ld9I;yz$UB9CtYqt~7B$ACc=FFW1|FX6ATd?hmjvpvL4Ofwu)Far3>WDh=;P zv`^yPif3SO{;aO7I}MThy8ZA~`fEr`V*D3 zl>vCWutk@tfTIk+JBuyqQvpYyi*G9)5Nxq36!1QMq)o>jhwl)5T-##P;X6Pd&Z@Rp z34HtM13l3eyBEHF^a1v^*f99^(8uLJc0GLW(1)|GEtUn}ZfvrTAs?j^akO8Jzcwht zEPhv(1M7TM>7R$2jJH?5tE1|3NbEr8ZfOu=_d7)eZ_eScdlhj*3))bWUa`^+bEXx$ zp-U|1uoi4XLnPoG`i{b$`H7Y80Da3P z-E723xNj!Z#>3ZVBIL zye?g2A#WI^J_+1xh>W5n-eL$lwuFa_*QEsLN2hrv<(bG$6SLZ+pu@ zq4loxU$A?=g*NAuuB5Hnf#Y#zz80iS$aH#F8QxVzP?S}%#_$d_DppY)HW=8)ryxy^ zUb-3-VI;$&OzA2p2T}=3SHo#kfbjsyhl7r}8gtE6y3+eof6a26XCTyUkH@B$4Iz2& z8radQ)Mt5FJj$LPb}uHH;_Qgq#AN?jNN6ne0+g$Ga`o2)Gqn0=fZ(s%b&*;KyM5$Z zH%#G-dv)?bysU$JPwz*EJUxd+FqCD+<{~vNcebt|qjaE3rI!X`rHE!a9EPBTTo;yt zc){QQHNJ&6(ZL&qasL&NTW2{=ogkJHVk?vUT5D6 zyGbLq_z35A>N0#`Hy1;j{ua?TS_|jxr7PkWJ>y4YfUtjFdwv=~p}pL!OF-@UGSsZS zye%MXi}BV$3LBv}zDNcMqO43ft?n)aDr_?czGmRy3?_or!OWL+C@2XAXT5CKKhL=U z)j$~0ms9i?J;)ue-JFo3i-ZAg8(6A4JI_FRm*{DD7pv*4H=(V969XZ-TWMrI4NSum zuwaGHbyPn(M+?h)7`uo`6uZj>>6(>u`@Q;@ZgOUX-OCvjyB509yn%-7N&1TnHiYjI z1x`YN!W#e-!%6cH%;*=h3(!iD*5?ZuE#LE^g&E~%Wi(SHKR4ax!=Mv4g= zNWH_he9qc#9`}GS$#k~Z@`NafIB=e@juB3C8Sz42CKe`^Ej#ZXpwdGi2Io4W^b(Ukj<=ALBHd~I6<=A04S}ezI%dy9D?6(|; zEXNVc(P}wPSdNJ0XtNycmg5V{(P25hv>Y5Zfrig=1T06;axAtSOD)H8%dx_8th5}f zEXQigvBq+&wH)g#$9l`L(Q<6I93jiG!*VRghHnQVtrdhKO07w_EEDJ9TI$2+zl!Z$ z^eitP`D?O`MYJV^XMm>nj%$rC5ic{|_jmNI)Wtn-j55?^&ZND`V79Yi(IzD6W?K@* zB&Co|ycOp_aZ;teh2{7|pI7SVVyTe)HY&1oN#pOxn1}18)0m%46^WBjBurAg#4=;J ziOlb76lGJh=cMe^B4-fVBNxSIisWV&^h0Ox>L#WwpR?=pVeFE|r)k7wI~~RL$E-?`t-UbaxJt!0_91H%*N|Um;5W>1$rY089~AcyhGl58iH(-QRXye zXG3p_{!Df-^Uj8#z@>X&W!R^hpZ9hw4_qujUCajP#QZvDbV3k z1zLmnX{G*amL-FDQkTm79ldL&`9tZJFG~yPC>*>U+Tz#awNwd6oZ;&}PYzXD z-Q&t9hbgUYy7H|;|MALJqI|2B?_T9wqkO}Zk9!ZvRzRKPD10RjT8j;&WIu&=NTBN2cd1{=tH z6^nfao~M-uyA3>#D~|(>w0UPJk5fEQ5zJ<0if6R)2z?mzWQo}*1zfK@o5j;ld0Obv z0u!BJ&}DWEjb1X$e2LpKtSmGj+n@D@n9H~lLtBTrjB7JEaLn(s z$Txt6P#Bc7evsLRJSHQ}N%oP@RaetqgOe9@0^#+mE&5C3>Av2KEIm;(0sYj&sf*v> zK2)izFUXI`frjGl@@?2&I|F-eTi8x&sELsCR9q)w72Vb^5tzHqbrAeGC{-2Wxef*# zq;P~ndHaRl3=_TI74O4uVgl0pGx1J*lNbx{OX3|ZhF{_RiFogL6J2EN z55zm@O(HeCuZR~kr7iQ}vcE~3^nU=>n1}J2`D>ncjD`Me9^8f&}tJmY_ZAaHp84_GL0oi@igw8oQ=*q7b+2eSK~m)%#~+F~x5+?U2@ zLkvyFzBtg?wY?>_Yqpdm1R_9862SY1z2*epcPI2l8hu3wp_JO^i zNH~U=%l7St<7DJ!U`})*4kL+;-Du#d3$;q7Zo`XF5|lp3IBzs?$?$h%R_X#LJekca z{0qPYftkcPl7J(vxSytY4q8c^AMS=afL<1a{5+zE-ax(aL(rkstSnH31b zH{!?utWV}EymA`gUX{T2BdG|~2dV@I(HqXslab%IV;A|r^RPlp-X4ZD$dw>|s#o^D z@M0szzO)T;JBjtdP2$Q*Bc3puDpsdwr%rMPL1MV*LgC*rO3r|9lyI7PaVnYj(id1< zSBV^mcst--*5&;Y-i4NT)JyPDX2h(5kmLuj!-`_`Q&q1=A4gz9UK|=rcSjI|_Xywj zwt*4=eseyM5gT)LZ;O!+6~pU|%fq#0*-XZp+%&jGV@~ON>q6k~gXZe_H-S(3n4P9) z%XfI^_Z0e$(V$1op37g%byH3#}V$R>2^va)VsVyNtz_nYV>6r^v@c`shAoChlXqn6n` zf5*yp8?Q>ixDrVwefg^_)hZA4qJx0#GKbAG4tF&uhcbea{%O0ujt+fukm;cSr#X-{ zlTCn<6xVy8X5HR}Um$2K14vXs-bQ-yFdzxFI$BF5Fg*82v!qd;8~;SJ4np~FxNs@q z+=P3ubR^zss4Q+-@GzM|6;W(=a1%l)$mAooU^ zHCwy~5Gpa=BS6DYy>?C5}K~_HRJT(`QH_guiq#|EMLJ7XnxBo zU5;1hWau5STV*`G*Ar1TsOI0RP(eRb-8=SMrH_Q-UAv9VwNgq&2!?{*gw~--SN3b# zLXu&<1JF=y!*ao)dzZTi1#Qtc5Ca)fee*KrLmL$g&{Dh+gtR5o5g+Z(MA99+7zz~7 ze#1|kpmmxVo%;8ruj}7rAz)(%i`#3A^>?NU*-u*>0!W0_S?&f~_lVE~5{f~otxV0{1f@}>n_(htNyGAy(xm07{NV6DW>3TN zE9kzkEx5c79gv+O!Vg8fMIs{SrJ=5oAHmFw*XfJ+bV4cx`b=fXfhi>}g|!!K6|g80z8@lL&Ttua0;?9WG; z{1^6*O1MfAuEKR(#nB8(Jjc(-=TH+LYu89@9p4T zrDLoH0(G8EDX#DWa8|Cwm2nPxmACKqnzi#FV7t!9-UNPbu@*LP6C??K^*K<%{;KR6 z-c_h$ONxZ*yX>#Yx>vpumI3SsF$803&y8a97xR1|QVM9b8t?AyU4Ln9L) z2v82pD|5kx1?2e+EJV>;Wt#_1L+AFO*msi3uQb+AxRDEN8@E3Val%pqdV zWY@L@U*Ki*r4*ey$~WI$(L!cstZ>6$(tdT+@b0$1q6P+i$C`kI{%djT zR3}6T3z>3;hWwH#=T$HTl4B0}l|@fw|5j_vd=?l4i_Yc(J5NN+h)X<4dId8x+E8`pk(-^o*QGU<5cEN&(w&V+z1VQkKF&WF- z5#v!@KcPzsY;;G0*-(rB0xy$6M9gp|;1jkc^RqH zw?#=QOWv27zs89D8)?Ui~zZ3*d!xH1?eXi~dT zlFe6%2eY9NBbePMPDBqf0^FL}c-cpswgHiNAz0e2NmsS&&536UyitH3oC;1ycEiRvlwxp`grTYzL~+wF_j{o|HCHkuc2=94-!=x3ZtfR2*tdcXNk zLClI5lt;3`oKEYjc%~rGmdFi!IwRttfYwV%O{1ccS^e7yEg5$}D|SP-^#wQ2SbsY% zco4)t6#W(ef);bc(dcn{OH(Ah7vC|J(N;i78`DJM-iF2Yir0w>ARBmsDY%RP)0j+TzH5+SVFU58tyOgX1(_6*Jk(Xfn7`cT^dhR6jsD()1mar5&nwW>PB~D~lh1d15nE`oMj-{Icc{#7_v>D4* zqLA@N+1<>mxLt3Tu;aaA}QWAbbw~WoZ4Z1krx^woMJdn2jVRYB=qc zwrxa9Y|zi{ZrzGa8wwObyn}@<+#jIn0dF`IMJ%jMgM`P}kq~%xAF6S}QbS-A2#z4_ zkAzkqb02X~hB8h$I8z?Md65gzW}&Z;&O(Yj=qxhvLm3chY){Pn_>`Uh_n7&_V9?S* zg99N2@+C8|ZVDX*PXS2;mv$k=S?R!rokVbH??#I=XQj8lXVK#-^*uZQ`Osj@eqGw! z2}!WJ$>@4CAE4-hC$IrScon!b>ejP^ONgrgLv#j(o?LsrR@#6+9RNErQLWy z-X4+w(g1*D-bpAWFM#H>ELk(;0a-sEoyt|YapfY?x2(o(UL>O+t&>$UW6vA1O}y{I z$u&L<+LHfZcd^z^%7zqB{QcU|yCJa#DGkA#sC@_n-hHn1pz+INln-y z??8VFJ~#aJ;S<8x+26V`}6LEyF$ zAXhT+8a&vE`Qi_qiVh*Vhf<;g2`~uaMS5Kj@@)qU#L-w)_XhQiH%ME2JdQ^1`u*z}*MsJpH>sn%E z-Q{A7kv%ff?Zl}UTB@M=DK;2pOB&Fru)CFyG>ArSE5*}D0mT%u86}vku->afujzYj ze;+WY^q?0Yeq*^Ug%Q^NrP2$3@a@>e0>M$g&P?m(Bkd;Zuu2S|ip=Sm6_<(&O!+s#+Y~ zw!p@4?MHlCuf5QYzmU>8mfm#ia&5zGs8qSX>7&dH2=qUb;{W*mrjOGy&d95zw{Xbb#F}M`-Krm~{kRn_;kvBt48aLI$HxXW9ZM4e zkPzAQgSdMP@E^NBq<;coFB74PNR!nefh z1ec=!>`-kX??GnpM)4x{$KriVylL9PrQ)40UI%mlikDIv{N{re z9SQ9<_c1egmpHSk9x{WaDr?nbGdM+@DOH7LFdR?dGK2Nv>^1ie!PS}O(jWqA&+S4@ z)q_(PFMA5z?)-2gp9(6r`$L2Ar^Q~eJ>TDYp<=tabSXMrdycDvR^Javk%OutkmG5L zQN{L+K?LHnSbcu0KHpWJ@2k%m^`RXGqy$NtpYLLH@gX4(pSRS98qeUPf-`(}tIy}^ z^PlQN@+#t9Q6G|S;QN8{jZr?I^372VtX7}T)rVJGWcY>p{8D{>r9Ra1kGOwRpLf*f zp!)1ppAPjor9S7?=Xv#+r#?0E!Fg{0fc5~I@|XOk^vL^QlK;^pcV&{hXFY%aN8);> z?dkViBJcA_VGEPoJ@eA9Bc8aO9QSe$e{vk%Jlt4e|CHojo8-3Q|F?W!OKKZmU#xaD zCAqDz|83uv|G_rC8?Wm?k2*=rBwSA5J3j7?^+@OxVs2n+MTn;WE$KLw_D#8T{3E)}HMI384Cxrccs*JC(Vxyw2EnN|NgH zJ!7|#Dtjj8MQUug)q|Tp$@J}P1u;e6$&APD_wDp4K3en#a&1kYT<+W19*@sd@xk(w z$*Hm1D6U(GTDSW@yubEsA3}l??{3H8(kyL<`UI$k#kn&J|1Y86T=lM@AFRq&HRJ|P zd!8(a-{%9TwdLDAt`P_H=HNm7UGH5z&ch9J?L`guOR7Mp=SpPlS3Kf^Clc!&e?LJs zL<|IYvq-OI`e6Hz&?ukhivSeadtaf#bpbe=93MYgLU1;uG`R9k2e&)Vdu}Tj6K~Im zj;emuS3y@}gR5XnaEJ3t@9$%oGN`d$ayZo6Iee%*z~Wfm^se6N&7P|Z^yZ}T2wqhL zW!wdUecu1%$Y1KbPyXgor_Ti*&*do5@Mbn#pBDl$&C%bN$1Q*)flttq&^vh0_i@PA z>GM8$Z??;OS#iU3dl4!)5xcPx_Fdo!9`Jn>@?G$GPUdwYVpmfBhG$_f?VRse$al`? zIh7xPluD-e<=9}WKiY;VNRY^%kL+zQ31Goc`dbFB5i*bEqqRKckH>Qx?oLA*`Uc+C zw|V*(>DvBBfdHZTF zgz&|EZ%phpMK|nLKIc0p=rD-$L3;!k%qYKiH6{DVitN9TqSf=zt8GY)-Hi1BU%koq zVXN@D1r01)7=7mP=)m{#5LdH&Q zEGU_vKkHsQP$nHh8Lk%ZC(Vxg_*U>0!DTwt>oUTtF*ZvOOvru36eLhn_Ou{!fypqZTSEegG z2d_sc0JHV1_fxajPE4qqC6jnG3{r3N+!>$Bx8?1V<|MTzGYc&T@WIs9;K_r^wpn-o zzG%cz&nf#mK(b-Tm20hUvOk^leHikc#rlgK>ZEsb?D8)7>Mats1|%H8#yCEgI`cxZ zLo7jMSce)0q2TYpQp@{#2LYCV7hcS}_J^W-v-7-{6*ZLExsIQR_2>QoPuKdMcbfYH zUg58e?|-sCbg2Ck3vQ?Phq3GRme@7cevQpcau;xWIfcxhs!3z@uX}qv6|$S5tY@Vc*oYfSC}xTL?X@?eyWVR>xb4wqa(9?|8^}-lx??l|R+;A69-x@OSDI zp#{PS0b$MmQEtWo?~>?7coXpMK}IXPRE_nj#CVO~=TUpARl4Wzsm%SO!5IfUe+yfR z=u6#juJI4X@r~uTBEQ;(y~B{#u3GB7>-4tkJ$JAx`up(%3(VuCu!xf&FU775?0W{L z>}J{v7<80DDSFGr@P+y;Szb$>{&NeeA(ZcVGT2X+=P0QKT!UmyxsjXs!XSdEwl^&^ z6tu?=!&B@^iQISM%gooQEaRI@m6_QZv`g|K_hA_s_bUeM2zDi@I&lX^SqVC*1qj(heAFm8QvjAsSz*q$I%x3@n&F( z8Juj!k2}Phpg&R? zE{Xp5Gw~+qkA$)rOwb<*VKZpaA8Wekk5ygt$8UGhAOEI{{y4ph{y3qF{+QoIf4rMV zG26`1WSL!Xhq=@Tq^Lc&4Pn*yfv6Zj??F@?i&&B&Tk(ek$Pyt&noD00G9>Bw)i)yb zQir6Tje)G#KAN;kt?mYtun|`*hLE@jgX|1xl#q?}>SL(SGWA)ZKIC}9L13`@{Id#N zt3JO{AL1mEY*wE$>a#;>vmCC%PASAG7VJ{Q!dQ+*bx zPf&ey^=VL_#p<&}eO^$XFVyE<^`YWm)VDx=&Zy5h`BW|)1aOf=`c=PYdc-g2;kWXU zQ^Ioh{E}IPH>Tw9ANKGk$0fUea*1?5PYPR?~8Flh9?2W|E5QHavsw0EkEa! z<$gcOZH4{0-w*#A%D7aWoKy_|?5|Y*rRx0uTiEHZfXyEe&POu#hwNO*{p!=he>wbD z<2SfRcygZq?e1IA_B-&q8$Vp-yY=^fqU~c*=Xm_4B-Q<3k~_H#kA6jXa+?1xcO~lj z`%Bd4NeX)&?&SS`)p2n4T)f}QeG1xvoYq+tr_=XTEW_5QEMTS`S2d7+2W2)4EaO*4uH&^cP1 zC3M~iXSgUEMTy2n`IOLytCz-mO^hHb$_6YR2H^o8joJQPLI=R>M#9mj)9l_6W>E>R zHjiZbo1bFNx0t4INEU=hGa*bW_(N@)jv+!JjSL!Qv%ysJ)p@65S3=Pv;bZzubYCyZ zk`%O|s%}8t?~Bl;D*byDDr8AqJQ?ALq{#~u z@OV-I!=!+3s{)eq9=I)@7nVrbQ)@V$Amxs=V^DIHPILV&yP8|5=>5bgmTVa5|TXa}=G6#FOcP(uzm$Ls0~- z2fqLdKbErUAqXfqoz7WO?BResnrSW=!4xkuMImO1N6iw>5G+Rkq?#pX(bmK)DUQ#Q z(XS#?anD)Owcg+c>x9KMeN0(i2n$Z~dL!JeDt?we=D~~N75zHi-_k55FL#DK{NdigOwG_TAVRQk!C3b1o>2`vGboyg?!nuO#eBkhXA9JO)K0BeGvMY zrq5Eao>sI&jVb{6T@0M8s!)yku><;WjImr>zQ(w@h%=24YKFKpW>Q^-=OD)Js5|{^ zFL1N!SA&S{KLc&Xp24;6+6JS%!)G8>Ze~Lbnhc0mbc*TnKs`9BR~!n2z(5OYb)G>; zjwU`=xBckgc#*n(BOgy zqalR9IZe2SR~N%%9#==8hUvQx+{OBstf+AT+a62@H^oOnBA>xvME?OX$$_N|oXO-3 ztP)It&;;wh{D+w~D1&v_lj}oA%behrWYv2izfs+_FiX8fS)gVgP-3J;v9rEgF~@9J9<0MGX4O0)UE0a3CZzt*&4)>e7`dNol}_ zK8o6o(DN>oL6KB1r^Y+E$iKY2XD?YEtPK3gBH6w_+6Vo8f%czB)f5{5nSA|o2q#c0 zIkg4V;(-jXz6Qm2p9TbY^xLo^0cc-5p#YtK#YkKX9TXkR{*wT23l7Kg#6{B-rI!Cy zO6^2HR9p3f7)uK`4iWJ6g5xj5u|h==-j@nbfca99=z0RcrCENL?U}pl_F=YZfz`w; zD0!+E6nh~AZ%&hI@0=%K{jl4j6y+hwsAV!&Et7e28^#SJq`oV2bhcn^BjbZ$DhDfOyHCM9Go23cAY8(zjtA1Jj^FMIa56MOZIG3@FXi?RlYS2Fhs| zcimTZ6Wy1UTuo6~&9p_s@cyJVj)(fDuK-SBzA%A|E>$^X=?Z$ouzjOg84zhqP78D% zXp8=xeHt?u%9CCeh=ba%GB|o0FG%}ej+Ye=hrYKst=KFjjJqBk$v6yylq_%DAY_1V$!+c{$HK|>3D!Nx`z8uX^X%NT-ryZVL0tb1ysFT$Co9ebdRK13lZ6PidIPh zJ9+1|F^6HX3UZf)zoWsJ!~PFpJ$rW${elBO{NZ7<%7?n&= z3=WQ~HW!3A7b+1Mn$l^5lux|~gm>KTZX3zSZ=gg-4TF^e4pycGcCr$%X!}~x5}Y_O^_wU$r zh%jW@gG=@hJWc+$?XI()DLn68$T@%)F_Ig~GaIsd2VdHY6jk4VPsfCrh65sOe!l~g zWW#ftK5}Lpz^wv`gD6&JPDxd{sb)&^lP+#GucF=ba{^(qCxDaob2Rq?H$^hlC2twG zAtv^mzhkIpg1_T7Pm%xJFi!!WYPZ31eGct*ZWuo_qe&+Dm|^gIjlgO`lbG%tae8NYN*{MnxvG49vny)jb_`;~Erwf{~oZ)B2-Q=3``WbENxZQ*{@=x>5O+qO8;Yjx?UJW7HBL~LO*6T}H^q#{mi zC(U6bc3+4vrn-TXfZYD+Wm6+Im7v*i7osBi0O;*I0;DESIrZgZH>ZnqkhaJ+2+rfu z3pCcLHP?o#$c?u{9;K#j&hU#s`>zE0K&)aH#au@0NnuQBW@_mPwxy%>f}{-wFKXzp$@eIpAuGyVUgLTnsW9)?G8moESbc$V6DPP00rX zRC%Y(BAh7%VX+fV;e0K}PLO#g?6cfy$Jldt=iQkCu^lfAA|h&HUMh$GY$X<}x_glU zR$cua4z1n|x4#*RrP_@^?W7DWNG+YMY907Ks^#s@kqaQsC`02qXLCKkDzGQ^q)M~l ztJ55b6{$3wJzr5yOYBCKh8!$kk!E+~3cQ%bR~!;Hqam(>9STdLBP=YzrQ`)fSfx1h zv)I|D08b97BoKdW#wrD2TzSR^Z;znan&bkg*688_UhYxAk=S!q^-m_}<}!bA?wLJu zx5P$SxrZg^7NOHPxVsvEZI9f$^#L%6ip2_c)Kj(k&oN_0(pLRi0bq|c;=A0Ar^;g2 zBZi19M&WvdFC^;UaH$-lSyuX`VrC*HHteFgGKaxeUKHF_GmjI&BdXoudmK?M}1V+VRUyx7kME2l^B#$F;KKFXI6~SVp_kdz^-BW(j&U{G3q9e$K08 zKc`o+pR+UW2YslvjWsckZ6*)gpiIAdd~U*ch%?L>o1z){7dUWi_z}^wbXBhq)c|^HOwJ9v1Mq{PnFm%dOndqQC#OVa--FRPiSumiK1lhB^3=$cP4P^1Zaeb|%`(=DY9TYxf;}^+$HS_(6Tf zETg!rPw_PGEm#3f_nIf2Wiukz4dg7%B2kwRHH*t|`gO0t@z&Rc zFcVQ6oa%fYa46d@d{A%{=87Qjyn0#E^rtN zm;#4!I6S@G;lYS0Sk+N-;q>+t@6g0maFyvh`C|-Ju{xU@ePP`g1Z`k!v zrG{?J?aAyef%X$|-(IAs7;)|4smtJ9R7IljvZ4c>l)fn1sLMtuiz z8G<)F5~t5CFr_B*#}eUPVf58YSHj>0dS3fk5KCd{N^}{-)l?JeSSnWPef09>#^pIX z{pajjJ^5sk=ghUMu#r5N6bOSYdO2ny48cZA5T1A1vb`d+w{8qJov@p@Zp-@sz3HrW zMrZ>wjwUex4}~>%U2*TKI4mX88PmHf=5;G(=~TwFW0d0M{ZPf2vRIj= zhY$^3;?AxFazFa<5j4k~!=usk$m0rfdOhbAq5F3z1D1Nib;B@_Vi#t{gT~}p+S}Sr z{Y5hQ>1Hne8aP!=o~A-aN$3dt4d-VuOE^E9T?UZrm=+MuhoQ5qIwqlKa5#S`6PP7< zD|2)Zt5TJwjd<=^5T#@B#?Z= ziiSlj#F_PKCOV#U>S8%Y620D)h@zhU?Sl<0<)JK;M7z1p$nvfP(^UP&_1s^(uZ}Bq-6x4&KK8V0@Jy9R%XN$Ig=9N5^ z4r40CvXVn?<24vqX=OEHTvQ;1IA?ZEBKg^YNQ!`c&WWY9x%Sr zQ(J>}fC7Daa(!QC3zis|?!95e#ZWI8+M-OJ6DwArT#)#^EA^|4@};CUr=n`qBwi4f z-OHhkDlJYYJS3ONKQGT}E040)lc-I$LqkmUko=mei;*8AjU?r(;^D)3hRZ{Uvd0t5 z#(j2$F(95pUOrN5-+Bh4OBjH3N8*t*KdIMOu{EVDjDE^YQKB_JVm?Dm7X=5V81^_2 z2PjsjZa4WW>%6WJx+dm!1;$Ykr1$0F7E705;*>b zy|!9Vx>E0FRQQ4e*@8S)(l0nFmmthC>^a-GQ!J7tk=qNKT(eT|FB$B}pb=~OCjgcn zN10Bxsau90@f<~fCFil+iAMn|K)nLg)&$g`Udaac9Mm6PR7XXiX9beSYSfc|ZU)yy z8DuB#S&7x?uj~aD3!>&^7T2>E|IPvG1}PZV>H(&1y`VYmKP$tWi!%JE?9U$y)o=@x zgL;og zk)2AS`zc{D#-Fc zj!QgHCG+dZ{e3YKMDU}&?VG+$ecL|337jXT%Z;apgCw7S(~z6P?n4ubr``}Z7Z!G} zVutuRH0kGDYFt z!6Mh^-cNuBF)(kefL622A-JcobZSz6g-6bTL(Ga6vm6%wB1`DUQy*?k8@fWF#0TZL51HQ92KUw= z6g8p@_lJmtT}StSn0SwBbT`8p0TUwbYn^2BZ%C z{m4-S(EXsp47{$K;bLcD!_hnUv_#R26&|&sfke zxEv>`d>*TKG4uIQA>8S7b6CSZ>v*-!POco>#*GZz^mM zZbXXvbVMP%DARA*z)GgCiM$Qw!BEbFHf}U9Cx9mQ1H|LZp)Y}k4EoI@7113iP+VR5 znxG#5ucQ~!mAbw$&3Mp2`)ripP#33n@NKxpcl?6$>V|7V$J2Yyv*DWT)NdPC-F zW-7?tRaFhorG`FB^?iIjqf;9mN(~)%^q%Pm&U7H!GqvG4N9Z$$@8iCVb~HTX2pv!D zJ+oJEW-ot7TGjA|=X!-c>*f16jnTat9_kf3p3-|}T5x6>qCHnOj7bYc(uSls4+RU- z;IW0A1?dg_8Vc;e{d?MS_XiJzK26cz3&m1%KhHfL+#hOlFsN7VM|7vb2}Oedi~|Odo>iK{pGpS8Vb_?^4#fE zfM975!+HVo3f4H{cqD(Y2ob}+l2eB^U}zyD>$Flv7C-`_ZzDZP+~uIaLVbRxH=8`X zBm?+&3;;>GJO8@19*v?7^enw)ZzSJelWj9S87Z2(J zwm_32ZOE2G@g-lt1J#(r-P;Gvo@X?F5iZZzk_)lm&q&c4)Agp>4{g}9A)Ssz(>v64 zO7qiRh1S?xf2Z~%iMn6|)xvvOQ)_QC;Is`{^`$w(A+PwOeQ1BxH$>svXpwTiZ4=73 zjh1`L_4xF&Nq~PZ!}{4ktVGdco5^2p4(~J4dqk^Wjtu%P-|_SdyL{(Ut0!w4&g1#h z*!<>D5FG8l>-<>X9+!T8q;nFa9sjr&T3NLXE48vG`q(nI2a!Yn+`bDiah-xrw1rNb zVZfpi2NWcg`D(N1KJ0o?2LXeBiS<aEy(*_~^l-`_k&UHXDpFk-he+fCw>XrIQn1L~; zY2X9HaVTOe4vruU@Jj4H(fJ|XvY^#1J+M#HFQ9nexvhFLW3>9uq_%1IK!t{;A5(E! z{b4vv1U7uLGjKxFDUj#;a;sL~1c$!Ow{5WRTy}MiwqYl+W^qFatJ>T7q3_F8bEZaD zB2jnz!8v6`)2MCQcef4RIqE;P?>6P`^_{hQhDM*3f`2^s`slaCwRBE)v_f1jX!X-r zj^G=F&Kpa2_|K-Iy6SsT;mUZ0&^FxkQJS`)*j}t{XtAGc`cQemX3^b?=#ag6WCfJQ zW^4W{P%=Pr`}&0=Fxa)&{U8l_joyB9rsTKf@&4{P5c@>l9}Qeaw&oz z|NOt9tYW6BVX9j$ooWG6!Nx>?rW=NIR_<>joU92rqzu1CiK~o~BOR=ll(*&Vse8LQ z6*lLa3!$EyhJ;lB+Sa4mkB_}TGG!yx|_t25cGvl;4;XsGfIc>i;MmBP z{x|~58F~Q5UNVgu5*q@VvlVVbI84lt*Zc-H1?2)p#FjgDan5zg^oDNow*Zu;}9c<80H&GPv6o><@2cp*P>A_KBUz9*?6Xaoj-br?w6 z53KagCw#!ZC+(5ZXto+yOa4jPqvBC$WSc5(on6XO`BhC%0zaIQ0hfrE_OLNb@P{i| zLsq;1S&qB*C*lY68)f?M%bMeWep1L75ePh@Y*P8cX;~OV=B5BX(pN;cqRKd$slx~E z;4?C9{t-4$YF>zGP|E+q-MfcJRb7q$6EZ-+zziBSDr!`$A}F9#iC_(cTm%9W0*Mzc zy{N^suOiGqP@;pAAvqk6V!f2MT6rsNwY7>?5O0tGUlNomA}T7?sI)zCu!d^6c$@EM zt$k)PL44o$`~05wpI@HmWX@$@)?Rzb3 zR~E2{lMRspV`W#QNOb69`4^PMo$eT1Cff#Bt!kn663s?pV<#IE&Ks-$h zz6>>u0}Vpgk)H1BpZ4IyB7>rC^SP#1oN8Z8F*x;dJ(!WJ%ioaxFy)^QX?Q6k87U7h z-&?=p)u+y9Eg3WAs$Ya7&~*LnTV^ zhmBVdeBhegxj4+_gc#pHIy`%?!?JgS7y3UYP5a%gNaq;9a{I6vXE{d4ogPbtFX69hFIwYt+Ih&`)HI4o*im>v_F#6A zVmjSH9^e@ckWrxM(zm2XsnHYIt3R4bTcQ`;V%oCTw58g#<+)T_FigyB4*UO!e1($6 zOpztfu2fq>?i2b&TGHqo-jcmlT4b_1vn?|_0bTd_!J^o3+}P%+c^`iHPx%X)sJG)bMx&67sVke zmPxAQAW+sy@753n&FkG_uXp#PdN;pY?=A>PAAln&Z-# z4m631N!G#0i#V~SDwoA!?DG(aw#ybP$yMyGG`Qa7;W|BnZq6h*+8lBhm-rh=&}GKk zQHd(?iRZ7a{;=NgRQKyvnO>EaqrGmxm9gTpP)()#!y@emaBw>9N=80o3hB?9M%k6t z^qD*BQcXiBNg2RGBc6+DCO~;H? zx;7|J+g~>wmTs>Wu%($%fqafEK z~}vfb@CO6O$eW9Vtg-sefBAYW;h6xj6x zah;5ddrJ7&){<>ngd8&UyxJ%><1TJqww5%@x7HHL?lZHjp?-T|dF*=}QnNeKr?q6e zd`*n9Z)==H`zDt=KO0hqs5XuDORnhNbAAB}gBUD1BdGLp_Kj98Vc9Mx*=(aAdwM>2 z++XSkd!4NR?8v~_En#1v;XxLLp50wwaLEdX-6gY(Dxf}h--Eqa&E~U!zvCgE?MR+8 zray{;ZvAV0I)sCD+gMaZ+F3Tq(n>Z1`bq&SK#?;y3onx5PLT=^bX6d8iM#wid-*Kb zYNt{r7HF%1$L!6l0uXm@-@c+|X!?b`?&NIw!EM%*fmo(kv-7-eLcvh@H9!V#lbD(5 zhJ8&dTT6CQ38NL`_nC`8SH*HCda>M;+`~qld?Q|-T{`!=H}B_O<}g%}Zr1id!v;ap z^yl&EsA&!iHd~B?ns^N`mALQGB*Q0iHCIyoCCjO}9eYE9SFNUwQr{x6g#W@3`i;qwCjZAdL=L9EM!NfSW z$NY{OY)RL=o@2V^PFbnw7uoYp^zEMNaZ;&rSiKL>ppAoRjSk|cKw{HGdr}S|{4lZ) zp9YS~hu}QamdNjte^u*La*rOGgZ64>l!GD*TSOr_uEpXo7(5GbN^2`@TNn`~G+Hm8 zt#&%FGrQzb5bG>%@~=juY1i<=!u%$!{?eZI^g(-UaP+ufx zeV+ZSU|`;LgE`}@?Z6I>fIRR9+V--4wfw!ufpu3c_BT3;>)l{d&bWKYj?b1?=M zo+SLkDGk}j%Xx;9fPHjFIE4FAe_=g*g?feQsp1VE2#m%23862#%cWkx19y z*vsftmq`M6R`eBEJO`)X!Ye7H3L=I4>GxW=4ByB?^&fVYJSuYmB`g74n5mFo;?h|C zYF~JUx5^V+fShYp-y>tfzuGRxT7Dp$%fL>-(UmAJG!J4GvOXQ}?Q0=L1J z4giB{x#0?loVP}1T!MM1gP4S*;$_DJ+1|@nl=eDP;We87n)+Y}nTk~2NbftjAF)4^-fV@yiWdM!YkUy@6&qT*6%X=E9a^^3 zk;AhUXU|BCzvE(m+8Q6|<$+YIs~jyNQTv^G&=XJ_UoV}$U-xtdYB$BE~W9Yg6|AxGO6a_2nF=E3Fyt2LJVYMro_!1#k4 z$Q}7{s$fB>JC&IMcsEFbj=#~}Ua1j!^&3SVn<`Qc#ukZ+q66{A$>qNN9-TZI(fV2` z=yATu__{|5tcTlOl_6jwWH)*8q+MLVA@qT#i-$uUIgW~- zs&x!9I%Ku0opOOxFuF%%EG5x(p^%5immV@Yp;p1PKio&xOue*uV71&!b?X5t2!+5khg|yTB7z6$;@;$R*?+MMQf=uC($ovM1LFJtf!3=j0lpaBRXt z?in{yathd`q%*SgC=zuSqIo)-m$p{p`3q^yR=kM!ijrok5AhIkcQ@(!(a}7zUUffb z@6D^I?lf(5ph3o{TJyZeO^3jglDFyP6q&q_*dN=BP-_~t!#pO}NONr+f-DC~;L-ij z2bAt%FK3ie3S+#=efhgOzzesq{(zhkeKwFcnK)*IIuNW8=HO0Psi?L+#vune_p=Tz z*(@B!*oEEnRp0b_K=r%%smUSNzN=@M%m4=&#Y?^-+>vnfPI>sZ_u$gOkuzisU2)JV zm(7b3mwy!`@|+$-FU`#3+!d;2J!Z}Q$x*(kp~~89clA38{W^hJldvC`TF(w;1?Ta- z`aJvB7krO}XEsa^jz=&-_^7P%c4DUG{_M-XzSj7`e;dxz8qeiB-Oana^j$E0_obK4 zUV1AHu;QIO1Mbp=ra5ufd%nSYZs!>dz+lk;WJRvDS^TB)V0{;yBKtFr$uuA?iOqgr zE#p1VU;)PZgtRV+OXaD;nNfEExDywMOe=Ee2VbJnx#Pv_0B901#h8tpr5}MTNy_{} zKA#(VyN7SRV9L&>3j+;9dD}7aTZ$xu&mHkNvkQv!MMFD8m_Jh0n$CK{qzg3Flgv>B z%0yLpACsXf;;+&7f=+o~n0{X&#VVQw=5z&uV@WtXU9eb4?pM5J!7x%dkUo=im+$KB zRrDpeu(dA@mb|`puU(k}Qxy15d6Mx0%R_b-reauL z<3VA0<5T-HOZJMDto0_wGoo=R*_D=qc6@KHkiSdn#3Nt8yZ62z05AODnQZ1SM{;lF9!t_*wTjQ->N9-S;^ zvn6ade&-ToSe=C$PvKUktafaC0slKFG&z$7iNmRA4<#4)E8Sn+-&dz^QJ$T$=sO+K zV=9s4Os#a+)3-9WZ|YbnjVW{!#ZIkU*zS;~7^=`ja$$P_;brnq5#=9Bu_nw(raahi9z7kIbjAAp+=b4WF$zy0UQD z*NFV#6APE^m)~PYyi>UBbM82(OULaT(=TuST}qVFdb^1o95eRQ_&aq|L6@hs zpv$fV4BPtsNU$<#P(FMl4^F26jE$B7COJ?@n%|({m0y{ReeOxaOv}Rk79B?of%tVy z>*;m-R{?-sDjeR10e4Eyc(XmdJv{B3^`R*<+)-Bi-&)@v>1);0_g)n2_zDm_UUxS& ziFyI9y$&A$<-22aa|I#S=Wc!pd4LY6!z3ZqYzgVMEY)OZ*{@9>h^`LNr(Joes$LF* z$F%#56db8`i$Q9--93Ru`u$I@_m&3Nw})qX%|EQtKW0?=tr#~oK5=eF%Vjs;Yxytw zo924nJvaTuv^3E49u4W>XH>7GPM z&ciwEMAf(ZA~z-$c);WWjGPwExA2}+<gGk!S?Y7>R&Lvfhii z=OMUnk_89jlC_i)jl;NC^2<@WxqYigH;e3&CT}P2urB;ox)IPa=-BjP0tTvtI0!-n z%5#8H#m{k{80ljXxY93epmz^qyoF{5uhA`2LL8~B2N>h%ZxO)8}K@GJJ>evXS zIk7J}M$LSeJx2G~9Mg(G(?ddt-Uz2T|B=Gc;q0W_h&l{2>7J)7pSzXWN$L(Xl_`-6 zmX4FUWo!@pXG%spRX^rD><`4{FjANbA&h729|xnX*b8SJm(!iC?sz|wtBPf4vu;y>qZd$pwliH*iC;LyE*8K+!VVx$H(?cNrBa3`=7Cj)i!73Gw#a; zT8>qWGIjy3Kgje?h1`64*$7rWDK0U_u6PQ!n#lzVdfBB&Q%zPeyFn^Y`JX|CLqRZ* zorJ=cKtl__NcCOvRatCPUSVtCwyK**_Zv{rwU7E`~|7dbXDik?Z$nDs;m-02ISiJZ6` zlJ?}o-}F{o@ghyak)57=*cNiQdI(up z7cc|U*7V|tMW!6L|5rk9XXAyHqKA}xKgkG|NZ(?zMpVb{Qhv!^ZJQAONADj-_!bj3 zus9W~mGGAtS`r~%CV3(FnJVU2A?D}0Lr~NxF$9|aNtr4RW21Ss?Wy0<@dcVrm!U9y zkA#gDZHYLvw%fT&#GK^Da*2)wM`MY%Q}DSBdbVe*HpILd5&yDN6r_cTQG&Gkr?+w1Qhv8@ide>lxchxOVd)s|$AzZAWs?4vj@ zS9Y4>XK5z0H4vo*_R!u?T^ zpDf#Ixe7fc6Bp|0A?YNGKBU}g_cjDAYD&D`jlZPYm(nLpCp7okvqYb;)0Xa&`4zXj zY%d6I^b026TzhITd|LF2tnha^DfVU{M_6vB&2Z)2^22cj)rlW5z0c-7tUL97e@jlJ zGBJw}dEGw{^0Hsze6J45JIkKFyLJ4%T4v(7)cYMA(P7?8nd8uHP$2IrNb9tV6gn1v zs1f@q;8cU(ko){U6q}4rTssIgdh39W`$&k6UgD14v5foY1Y~uV}BTfH`3( zBpg%k0u8_54l$?kqd`J+op$kf_!X;$8~2w5gOORW zTVZDtM!b{a-&h;k{uR&2cceHC8=3t2f1|(mA}w_9?_=AgzuUXvK>J&gextwt z@g5>|aY!1pZ2?1qBQxyC9?o$>L$LJ&TFCF?{IV0er5I;A4&dBUEcZCm72`}-+>5I> zR}NPnE|L}>#g)s|kE=gdfGfx~fa_?kW4Q9Tj^#Rz>v*nwt`oRU8T<3FLz%`QVyIdD? zUBoqttB~truF+g$xGv%P9@nK@MO|FRGE-24KzaC^hj(zeH&h0COtma#v=xLI|el8imXt!O1z8($f$00WI8qvO!u zaQAC4r>tGccC6Bzxp|Im((8H>BHY&A*Y`x0Fx0b{K>|-}l)W>3=%FqQgyIx#JBwj%XjaVTEV~i8gRGJ^cUVrg&)U-RPsIB+A%5pwXnkMDOJtFiuM_*r zDGPs`P3$DZ{4Kb#9Q|y$t4aMd3GIBn(RsXJ+LX$eij9duK#`tY_@5Rs4gXy zu3a-#mQ><%%O4T2#6t@E9xqFmA+Y<4J7u@duHQ)*ars_83bSI+T68x5%7=qkG1J13 zOEy+ib7DX;EAZ$3=JyK!LNc3|_f4k7TM)-J?6&u^QeMj5szR!3@;h#2fAbH(m}(|U z8QS>!H&Si9S}}2Tm2qVW8+Duw|gie1Rkqz&I*)lLLvXJa8Em6P53@m{bK#IgmMCFD+<7#^qaR|Chi2*8_73O zJZaZA$vU2h3GYVh+vtt_@Kw*jNL)owgxU(TsOYV{Pcfe%eLRVAkj6 zK8q@DF*3BRK zeTg|vY*knJf{>1_n61e4q5JXgCT2-s-lPYXXlXlMkObRf%~v~)nB$20Q<^GeMo-RW zzs##i2ukF86jOLPMqd-uI&|QaUbO z1bP%VaXENf_Kvp!j9CpW{|%VAf=97xlEW-A=kJufVAcHWtcZS@L zR!La}CP|AXVQGeFztg?c)@p?IpW(x|a~6S3xA$uEMB0B_Wo!v37Pxnl-3!(jp4SmG zMZ<)EE50KQS6xVR>pI~2c0aJ>YAM^_GV8!i-Wp+?ehZr7&cL;X3ZwtHOpJ@LEt>YU zu98*#rb!~lb#0G6r$nZ3eB>_P)z^3J@};0l`V+bz|l^V0EMQpW7b`n9% zQ$2xloDxJYwZE9v!;Pv8nbB>(5`Bn&^^w*Os@Z5yoY!5R2Hp@`qelItNnYqCzp|++ zN!+Ji*XDXIMF@iYCC<8b`5ZYo7+Ml-fR-aGGa)F zFE7^qL7kK8pW{60FcchbRwoZ( zDZWJ~cD%_?T0beB7fhi4=(OHK-Te~IN0Ad!y|RH`N#LJ`d?#IqL6mXF-sWELhFR7_ z{bGBg)PJqwwi30rSo)hm(=Pfz|GFd5f7$4pW&M2Gk?0@K#{$}`NnS{ie9Mk+lDt$^ z(U};fB$6mj!*}=V3ZK9gXtXDb8Ybbo37F@3|i4b72H z6TOz3=YHV>y!+I;Xq|B0jspzmWxaC!W6lf2#eG7+Y!z2W9i#r*EXXR?eWF&msnr{O z1Ru~*b;ubAW3Gx^$Vz1YW`B6H@cbqBvy`mu#V$r)gE*9D=d;xnYhw|P(LNS8!DXer zVq1ERISta`ypFarC00Fp*R3dr_DbdD!BUERxG2ydf{|zZ1vy1J1M82AeLf>{OyWB< zaXdaMO>O2?_}GRWk>fjL`!ExKPh>ru6@J^9a3FT*_=WSV*5?Gpfrnn2f9=Crk<+6a z4@5sdKF}yUBCvMjGXwNv%e+M$SIHap8%8uoKOYt;R`_w(^Wew(aC+y6?Rb;*X>-P9 zIhO&rt8vUa6PI-3zYk}j*rSN>3$f47k(1f3l9SmkjU11~%Q0GNLAq3}Z)?Y3dLY&0 ztzAtHCeA?LQrgs#(cb(Hk$E%QyEYL7XMLyXZ>O4Vrp{%PMkJ$$`h2(xREQ#&kVwYr0Lc=8bn zs#6DlQOwvdJ1*D#SjUm(%dxJ=wQnSbf}bJQDWhzn`HC$dH4aA$Td?dDIU7|vdc=+m zLcUffRFSww@t;Hozz)q?ALIEH#`q^VOJ?F5WChla%|h|qIi_EDAE`c;g)jDRIm!b) z{o1B2z8OVE;aX#LBK?+ZUW~*hn)@0q_6am6`7P|6!j0 zuFS)~OC2eB(&!U$)&@60J6{}0Z<~ieQ#jTi?hW+O9|Z9$cI_o^_cy}blH?c>?shBB zc9uLzT6{{EW#g6hUgD%Q|0SeR|4e)~wTVn}AN+1i-$271{FYf?By!W~mt_|R*0*^W z?h|-0)E5j)no`fZ0MZ7j`s&hqQb{w&+J>OY~Rzl47DCNHKDR+_G%z zJ;2 z3V%OsUf`iOfNfr1Ie4zeSf-eFof$`Ejg_MuZ~r-&2|C?EorJug&O3kP)rsWA#HJNT zayrDLfJb%zxxp?Cj?RkA5!q`2;uq(K7`sH4Emay@p#r;LMs!NvEE0LBGl{H>O{$oo z2Hk@%8CkIse>9zaAx-bFr3 z^u8APf&hqc8kH|Ztul(OtVOxLXGPEmu-wO_QZ<#E6g!Dej#!!XGU64-p0geJa`*ma zyjH_emJMjw5k6<^dL_Qj?)}%&-ZQHcxBayP=r3zaWG`XE)=5GM8kZjLqVg&U8igi1 z0?UFFcy^H~a9`Ja1wG&jpS3UR)xg?d5#_xc*_-HTh+btC`|@%a{4C5+yzxS0i}Cj2 z6|(w&#*oxdn_RQ3vZxc?04LX z;?borR$i1>>pE}^U~SSX{B6T1xC{=AQ9;!Yivv4^+E+rw*JucHec%AF+D1+?zt zUHGCA_?zoyIJ3?E9sZ9qb$oOt5g|tkJgsG;fS)jQ*lO1h2fZPz@K z^&!FVLheYv;!(d0lc{kO5GO7a$YVDEm@NM~ali!uL_+bXl_c=ro^mD=ZDbX^{%=}7 z_ciXnt~DjH4`v8b`!9vBTrra;q}jY&Y?>IG7hA7IZw>nDG-Ow```xuV1mP;GT}!aY z_9qwSBJ_@4<9&(T>=0Ds?d;*=qr`c@y<;C{J?xKs*Pal3xCbhVoAP{-5f2B$(+cMW z!&4fX?Mv%M8Jc-`tB1QVFZ@;2HHl#Cr5@J4hkHb}%8Sb6Meb*>qyV_5IU&2a(Aw3h ze33RGn6BNu?(`trvjr%Gp`sMwpIWp*N75nU!z;ZXO4Iu*ne>h!5`^na|Ev;oBEsRk z+~#p2v1gC;w<|u&Fe5@~KxWLeayPsjwI}%*$0P|H2z{=k?ZxEa+v% zGbl>V!=*OIby@|`JUCg`dNVU#5*`5%Z9sV|`=J9S#CP0!dTfzjOsN8`V+~&)t9;## zp41Cgpq}+C1W~KX&^tnWJRy~|&}sZsORDpTgMpJI<*n#E=BM_hOSsC9zvV1$g zqhslpq#w+)n0}V{4@#69y-ZPH%=X6`P5wwbWExsudf| zW$=3r|Hc}zb_>xqErBa$y$x@(1(6%bn)=y zurS{`xA=z-E44bEaBpUyy=F5ds2Xx;CQ52+A&PN0T%xC{OGQtb;!tUMb&~RP^b45C z<=U|o)Q|XSFZl>ojhfP1KVl^bqhIm?FNM)>7t4U!-^=EYXXsO(&q>dMfzSMcfw}_v z;VRmowy~in`tU9?QE2)6{{u=|6PHS0Gz>3VoUwWFt0pT8$XnM-TN4*TPwqW z#+|wVLmSkm*CT1#qcL4XhW)Js4Jt+huE7HGX)AS}YqLEsZcw20<7;ww#rza5LJcZH z+b^YMTM&RoBs+e_JTC$(-=gx+Wu%RWO_Bog<& zs{y~*-Z!r0*u;;*P(^ z7ob{Hb}UZCu4a<%!5pzue()d$(FWvFO4E)(mWIOCVCtY`pj8bpP*>UPzyb9{-N2NQ z)BYo%M#v3U+0~;snxwNc@WjBo#DPomz1Py$$KfSoJq95Sc=xYp?uKhk9kZZ=Bf_~ixg8R~3J1VpUPxy{qBm#l4;6kdt7${+! zyn;>U#>O=Hh`TF?e#ABt)+{AYnDymV6ofDMIw>keu;IRfM>D|fKi}jNQR{9F+LQ4l zo1WLhL1n+PT(WqZp4EPBBXw?a2=kG#;aRfReXiN;cpe~w9Z`K6*}dQ%1AoTohvWiH zE%KSrQL)H*W-vLi+~M4@ZMV<;8y`(F8Gp`XzotB2zDrrL0+Z5x!An=Sz+>J+e_#em z-8Bw}fj~$nrCv-EJ3%p5N^icdtm=h+jhT;reNs>o8E(3ky~OePS>U0_REUgM=v6I! zmGhU?-yc}ftsu?=vYP?qfbirkLSuI zJ!IP}{BTj-q>nA1AGA#y5$n=Mfr(DN8J*c z8m-G37MT=l?g1q^GuttVt$s>rMsh_eku9p+hW{|qXfMp!E;Z?pe5>61|Ljp$WU!{2 zLAt~Vw!Q0Xf-0kJy?fue7<8Tm4yJ~Zl^V~nmk2A7PWS!e1T;DxkHnrcOz~+-ORe8h z?H}s3f3|48pz z_pS6N8I_rzUhVoM?mO{}0@w1X<3?c+M&wvKD+lu{Lf*R^I78ZLsRj@`Dm70K4>SMT zvsvDA0;h^>uH%A&SPEcQWAc-MK;vAu@> zh(B)ZmI5E^RmgmWB=6$G7R56iPqB-0*&R3g`tA(Cr*sv}+8KA|W5&$*li3V-BqL?X zlLW#}qEs&D0;`k5l;E~TO8^Yj0ok`_j^=?|<2~W0*LiWfN%>IV_@j;O>U+iZ{nh`UKTSND#wTeeyF>T&f>lLT0 zT$1f(A?}pTklO)Ii|GilOr<6{nOk{%YuRFfv$d?w{DkF)HNE7xv^RDqavB@#O_Ijd+VT1*nBzLWSXHSQAAiB?N$G2K}>SxPLG66q^hnhCvEi)sQGSTGt#=)!&T z`edIE0Q&-WH?uT6Y<j|lG!^z>v-u`VIFf8L zKfBD&PV>`les-H5U7WO*>@iQPg?ul)Ltd>HU;QZdfxpj-)~l~}#NO}G=hgi! z{jINY3egW)e9(heV|zn(#lx^lVHnbs0pkY=$B?#gD=b4A!>#ZPX$`l+G^9D)!ZCuW z5QM2VVMV6j{LGp~!beYJ+a$J`9VHf3z2->cc1Eu_^+=!`t!nRl$xE{$ANGTz4n`cO(A#Ma~{VDH2nt)z}oB-kk#&@ zb?Hx2`6TTL=mFGT5$1qM_vo$?diuMUa8bGhOJYrR{4E=Hu7KN$68q`f0SZYb{vKaC zMu?{k5t{T{a^YOgK2&U2dTNs(h5b`Ud( z#)L<~uYC|`kf>zd0qG`g=RtejJyM1)KI8kXjpiIH_FWfWlSQ39NrQbV8dZx$dY|EL%-TVt}N9-2t zKEiy(vR%%*eLxa%O7FcwD2{&#x#MCE+R;I4jJ~?ZvpKxbqbE%qO567=Nb?=|0KlUM zN%!hU)(hjMXbri=qyWZhN1LNGYyH-nQ|$+&=Hvwu@2x-p{0q5=)2Js-Tcd18ph(I= z&3&BlO(QHa%l)>G%&Cl8I&z+^V>zK#^RvEL z>BfHU@yl79tWmR*npYEr)=G;Bc?jnx>xD@ zmVCQ9Xx%FVt#*88ow1yo3%b58N`Fljny=VIO(w73kfKoqhukGS z&C-*jRn%Q?{=ks?m#@@r6DyyBrs5*(A4U-R1tYsP5-rai_PB_N{%ZG)6O`E*HiuNW z#SoCKI10qyl)m9S;MmGR*`-`hX9NyS`}hzE%^PK|w6DhPFdn65)`-7I zl5TNYzp6?*wM0f3qQ*+|BO*Lc51XG==I2rKBeN9W)|sED%uloV zdEWfAnIBJzSuRvZlqed+%w|u-_#$LijYr9*Vn6?wnN{xRAGa#_^N(AV{Q1YN%;LrT z<5p(zVkYh2MD7N3pTE&!U8w;QL(fQkh{wX6w6R@{#^H$j|f0$ zj?hTrP2STWnw`*}rkrIn@t0aJ8hh|7*?(fWgVTWc=mkpJ>=D+VqhL!;ro6da95Muk zCqIM3Pv04;B-(w=RCm{(6zmZg6@&*^Z(GkckONK58J?@f&cfnp*4s$#6GHZwC8^JW z24QLTlzbJ`V?Ur^P}#H8IHy?)^R0!W(8k2K>X-{3og$*jbm>;vNb5O43WR_$#vXU=9}LEt6Z2bR z@Rp}%x+Y;n;~uXi|@ElD;69#1F_v0 zmH&5266^EWM^Vg#>;d+T`A+!!BtbtLAK?R=T+Wp8A~+c_k)6ArBtDqK@jFv1tKA3x zsA!ORd8G_|Vjh=G;}Ff4151S~p+U22LM#LZzY_aFjyK zC9yMUS(m+#UHMsZT)tg-Q2&1^{|E3d))I_u`7-jpbTCbvxu*j?rNlONqi__{4rd`u zM}f2z$myLBcw~3=RQG^EA``>RJ&|j=z+7;}{~CP4&e{!Ja5Tz+%{nmnl?6YN`%uW4#Q_1ae`JSGI`E!O2O0B^e_66Te{31__=V6Txw_Ni*w6TG zk3FdWzm)%3{1bX?6?%-I-#u(RVvaCgXMduf=h{!~`Uk3s;|Ov4zoU%k6f*GCyNC@! zL%2&ts9S6dtnyJzH@bmpuN5Bs~H)8APlH9=0TXc8_id(w0#HslnYZsa6 z?R7E=J6lVhgovf)18-3_&#A+U)8Y{7Z!`Y{Ky$y_O> zHCPyi+?l3U1WgO+Bk{-X^riYiS#x`XkfWZKR8fmD{9kG8H>MXP)v5KyRx9s4;$gn@Xk zzUX3p#XoaKjU9dSLk71|ONjTg*&#a-xrFT{zaNn3a@i86Fg!}Yfm6z&SQckq*#w-b zzn!CvQu>qFn7e%8zT*l%U;OWm`zSy*yr!>Eivmh?;$z4v5H`^HM1n&!X&TUnWDm%P zR$Wn3D-1I#KTdobOG9rX&C?bXK?o#BMYYH?PeJoD(EQ|^pF!rQ!2Ap~KWCetk>+Q( z{>0m;MmnQak17BZV38p1qFiWIm8nT5YjwGkW@&ro@yT97}`F+heb`;yd}o(FW#B9Q$6W!&xIBV$eZwrd6Ob z7h>}~ucK1Gzd&LM1>(6<|IC#(v2=O+*qd4Mw&4caX1biYBl_pPeSORv@!^y!&wuou z&-R`l@}3KL_6jBUPk^&Dg6(8kz$*(jp!Zr;ssiF#Y(j+s_91b zlM8HR7r>i3#q3>bVYy;E!a7p;^@;fIKq!nFrf7uX8fE(y@?5@880*(gb>F zl{`s#LMjh}F{civ)RmkSht_#!4n8Kg5VB^N#ppaio1Bcr1=K9v7LRINIC6e*=2=fpFqR zgQ8dD(O}z+eMcu5Y{ymsapK}wD=Jdenn{8&gWMeth%jM3M^0iNJsVBT^c4ii8@C;n zygF+h62?6oMrZZ_1foEECXntgxhD&J1saeEeD+v~zscrkE-F^}YU|-M=9n8tkEgMe;tSt&%r;&{lq1|?ZGM~8 zmgV@#w&aixx>Yw+Y5(ob6l1+mWT4AB=xJ>o0oS>IfbUD_C~38H??0>J9_I=9q+DvG zm}%rlsqO%#U1Ylgr%@i4wEA-Rze!S#enBcnnAmqqOQNS8xyL$)W{yBZ&9|Iko9b2T ztNbH6rhi}D|HA&lmc^gaxrtMxhci+sI9>EKxNWe6S|7a8U~~z%>AW=1csos7@_Clr z$D-VO)7AJvK}Rtv%+yhyz+H~Pm{6X?Xs0u)iJye&#%%ju84tFO1*j07si!U26)QZZ zZoTDROmkZfV(O~HRL4SOh>pZ4jb}8^%#lMB1_}R*2D2k=1C9b`0OktfGU zREDU$L@@u<+83@7BT-s9<3Y+Y3{RgY$+H=P6zzU>x{Sie35e1eqYvAeX}^^2hL?-H zA9;ipP6_J#HFIS$+r3t1>DfW^@pi!gd&2jF0nCn8y5%zNq?NavZbz1Pr!TudQfW{3 zOp?U5_@_iZA$~6Guds!)srB4JBhwi(>sbB$A_n4C!OWJH0@cJ-W~UWj0yTPEPbvAb3Qfp`@UNtE}nEy@p2~prIugg=i=LSe|IMG!h!fS1?hhY(mK;X1dz! zc`KB^PG26mDwBVM?zN?P7nkKl#>4FF$@y6=qo?FYF3QF^gJ%wo?Ezi%u!chr?kwPh zJek<=Kl1F!yZi51UrRe~frtXSlgODELM0j%?|25rlFhP`Qq8kRL5bb&Bll+7%cwm_ zm$_Z|V!M}9p0xU-hPd@Sd$KHZdb&HMRKuM6NIw}wOunDn#_Qf--Gm*O`n(&1{q%e; z`ht*jfKN=kXjwkzz`0AMw59#YXG=&m|E!r}*}{+5r?N`a3?WcI!+{ok1&aybxZLu2nqWg4J4&%7bF3v}lF#nG1;@r{k8Gx`LW|oTS zWg^SJ6-T;8&On zvfi}nSJ7GUBzeEev&``4wCbiTSd)`bN}fVwa7N~gj^r*FVb8}Rn<9Hzx?74>-{6HufT6AZ6r=UgY>ruKRS;-6ijTxenizC1{)*jJ-R)!164cYk_^pVtf)QIdHF%LdrWKYL z&Kav0HJ8J%d$g_c0H)}z#ERq3NWJ#z-$QkFuRy~JszH4_ht)g>i3thR4${qPW*s%T z2{iNrVoRZSD(<&lrV6prLk(w79&eRPm14hV6m)8&?O`If0le=xfk7SYLCV=+8*$o!8J&A-ul1ht)%{F_bye!-i9GztuwZ zSzMRpc<305o^Sx@7+YY_F&1s%fNwmKnK>TqA z#NM8~L7_2G6o_90rg0v`6Fi8=r6KOY*9k|0_&7%OAOmd%{TTes@0Wu0pSS`ftx+h7 zruYNnmHizKrd`qG?vbTp#iQ22fbXDPjUBHz880A?@`9i{mU5JM>W&pPe??9f$#f;8ZgY<#Iud4puE>dAHayE3i|7!v#-80eb|~<%3!uiBhm|jyh>G0KYS3#YO~n~$IL(EK7z@r1PGJwg^)aN zgUQHe?rEF7xe(=rc!=^&{LO!vdM#5X$^Nj(B*PCj<^9(kAKrYQm74Eo=Gl!GfCY{s zO@58&gMPR*-p;Kw*?v0q8lToQ^UT0$yqPCPdwjb-4~VbhS5DRlh8J6FTppyMXo$W} z;ui7BZnMuzO9D-o!RPg(6fK+m?(!d}5fNxQhtC9*oWw_~Wy$*zQbq;zx&|7LgB+T=dgpd}(EU8ot}CWCY5?a97A4n*wbKImmT zNH+TgZLJB=_bx@auh~cq;=7SQS4(jmX&gb`L$$*y-KtB4!eG^bCRxzi56H(3)jT|n zGo}Wc!%)Is`%|y^m2SiBDu!GuW;h_$Y2g30ad=_L7B6PzN|B&;@fyXZAY0MS5ww#0 z=THB|xP&wo0RJ44(g^EbL45LPAW=3UiWQk+s5rSs3bNvR_z&*iGL_p}d|{i_7SKIv z8d#ehvR{x?HA(F;A)+@D=v&skZQPs9bL~s{garrw z-uV*Yj!vD3Kbc3pfu`w#Db3Fmw?;bNz!PY=i!asz+mWVP&O!b|U1_T7olu`jQoOC_q!~~N$BW!47qq3mf<9+N`Kb2U1#dB-fB5?YSsf% z=m19wWRyN`f^wN+?rbtrI|sXL1_E2_zaTDDZEJ=L9HG8GErIwdz9Z1;5H`W%z_dZ7 zP(q_u75X4 zbTYTFLkYRyCn!O!54-;>wxzjV-E`bK1=|D@+4z$*w^L_B!tQN|r1tHN6UPIFYO*$& zDaC^lI~cc8VkQ(RfQGUv3-}e1kz+NUmYy&ao;)BDV~RsAiAWpJG#A#vf%_|D{vML^2D~{JCXcQ zwU2m5KcP-58yh*F@SS=vp|){mC8DF7Rk=L9d)#Rz$nQqeO-*8kD%i zx#Q>i5kcQV zPU#u)?2D<_3e0Ej+r~LWfH|@}`)&MufZ8p8lb_G*I15JFZ`X@icpUvB(=7;hL1kxLdC7(qhL@I7{GWA%A>rf;%leug<> zHD`jjKGEb5q=jQe(<{Ezd_Wu#g0pbCmMk}_-M=*o?)@QmQV*T1#Qf#+DvA3Vbm0Je zGaaAy$DCwU?9?f6wl|*a2WK;fSTma$_Kh{%%J5ic&D<`(tL2{%GX|AY-TXx!fzVSN zbn?D3_#F4H+su5=tns!~Nqey4l5r7e*ux8P1KG{5=Xb_g4pe1|-sLo|{)}-|v5VCq zk`nUypD)mXpsS{lGEfK_6xqep8FF);H1Y|uhMGE6k ziIPshu5?$OqQxO?&Q?0?bbll37a8W>^N!V8s)r6);XGo1ZrCEN0fNRR#(q_zk2d>S z?nBgelBrF{f8r*zoX-DFGQ*m?Mm0HH@!apk7M7FMUzjvq$Ax*cf$(;q8aZ2p}UHm#GcyE>N&EPoE!)la-Ta{iUeJ4A@^~;*Ku#+ zKzMd_9hcK7-R46q0>o(%qwRdm8IyBmVsy7F{V^$am$x#;6Z!zAet1*lHANmm#ijau zCdZzpkX!BkV}TNkHHGaj2#kZArqJ3F!?987b9R9F0Ca8$tfq6 zdZru)WrBI@&x9!;9&sIUr}RbBS}NzLVLT(S7CUHP#$-QSH4B*gCvL?-j?|pq>m`5d zF+#=cB5IF}v()%X$y>~av2mMa-jMk)b}_dy7F^jej_#0{ED?=cvq$gE*>du2yvRkm zPCk=6e1Ul911`WITEZbtWfXu=l=x|o`v#^QW(JX<5R!I~mKVNU?(@z4B)Q+VhBCIu zT=}y|Z+xUwI*1Ra@yzs(0N0)-j#TlY9-5PwOt)$H_Cd$-B9{i!~p`YjWSt zYfZorX(mbxDj1(Tbhx+10>9@NyLt%CaL#w$cOjqGblm7zVaw1hIR$@2@2BL$dp0^Zh&Il6IaAn5I^#vR11M|1NQo8YZA8MERk%>(g_rzKoj8@N{YVPOX1d zEPIZXL-a5IWaS`BLR{Wi{TnmxRP4C$xjK+?tul2esd1lP?~V4lJ|ditf(7-JVgF4D zQ{=Y{eI1QF(H7a*-Aobo(o?AX@Exxs<9m#mtR$FH%F@7{{0Clg`)WcPd|$YmC8-AN~Ok-`^NDeljq}$se2gy`qcfdko%N>KdjMdQrV6Sy)mk+PVv8?DSYQ4qd3LHq3jWesp9U79w~{T zaoh&!2w96ZUd*i^yxnPh5OX-^&b#?fs5TaTQ!5F$>wY*yTdRl}r}H_YYP&AJM*Tq% zEuR*hML0L7@fgO7bLScSmm(VX(*fY9Qs&z~R-4&`5IkJn8JGFyYDu#n%_8y1_ zc}hX~ph7vb8S2ur4y$sXIj0L#hXK*QI}ipqgdAfZeWbL&)+$!+?kaCxiAHd+mdPZu8d`vvZT-~iAK-wzLvA@XwctbQ z=y8NPwDd11JsEj4q#4S(3g4#OhQha-!hd>r;fZ6?h5uI4*01vg8b098uHPj_IB&{r z#cFAEEciD%;iamO+iRhxt|Z8j38IUS3H%9^{OXf59oN;6OOG+x>ux?>F(t|G_du#> z<{PLO{6-4BmV8Q_rVX0Q(5aS_Lr$#f;va<62Edvnpy8s#vuNR(wsicI3|;HPZu+!(>xu>C7U(DbrP>AgReQbm5>1CvZiJ$Dtz@#Y*)%DQo>*5^tb8go$K)qn5h zD;_;_@4Uy*8zZF8Y!8o>q82K3-1r-(96@4!`8UayAKY0@t7*a)-fG zpBj$n%4Ehz>JKAdqL0h9n>IcTc^Q4&v)l@K>H4FY*?_eGrTD5lqv{UgHk=?P>Z$YrDcBKwf31wg4El4|Buh- z|M~p$`JBu?XTR27d+oK?UVH7e#g8m$9w3bo+|4d4z4^)$T0n37Ct9Ein0)n6JN>$j zmo&eY_0ahOPw@)j*WdNwS#B3Ufz| zd`7$VGA!qzVjXm9#R$38e#D%D=!age@pv&?nkX4d8#Lofnvr$9?^Dy6`;0xeMOeH- zf)Ze#TOHdY%ze9Al20`3SN1pT=*B9&38@%ia68QXnO`Y%5;x~G4xG93PNZjD`;$+E z4dv)e-+!!`WTPUCaR#}}E9q)RHlT@lS=zg2J20aA-1$oYLrM{4IN9Dh!wh{Y^TiE; zA{E_O=Jjg>$0_doYyo0%TOgjq%!NsZa&XrK9A#c(mkbbxpm*T~^G{N+8-!`hFd1GH zGEUsj8bO&w0|}Ikk0&}IXD*ycFFVqiZBR%`#p1=xFYes!_M7FnMz{}MEdXTt=u$0` z`D8otD+(Z)5gWu~7VNc$;s*r-T``72xbemtZt|0+NT(sP{UMW$eKYngpB7Fc+Iq6x z_@VS*^YcN-<5LEc7C)yj@l#Dh9qV&2aDCRi*+(k92Yw?xnM0mIJIlanxtFV+dUVTo zlBR3hs^zI@15iC<^shp61tyJ7D8#<(E#2u?Yt^1gT+PnNc|rh_n#X(JSKK3u^wwI# z>~IcG18Lcd=#GT!y9mlriHTTGALr_%sPOzJkTxMBROyX5UNX=umLHdCIG0oYXzWOIuSw(F$mCNqS$g<{r8MOPcCJ_|cw7MG;yWbD?)ezJ+|a zZz;=U32q94O8IcE`CvC%f536|o7F?}0&ef@=+@Y#;LIN0Sy%YNYoZSo;C6IVaK>jc z7vsj;-c;fB?Cc}Ss!eFe<=8uLNA1gHv%+ok1xmiC`s}y7xj$C8#Xo8|dmz|_v3eKY zZa&WS+@b2pV|v)0v^V&HJzZ);@WJm`Iv>YdrUxhOl?8I9eOzmvF3!RE0e%-MypL|v zGR1>;NjP}WnY+&}30tcyr$=p078ia@50_By?%m>-18Q!YC46}@K5v$IW(%Y7Q zNaMaQah;7o-_@BV8)!}dN6ET3=1&^w{W0~gt-cez@BN6Wj=Q7Plr=y^wZ6Z*xn$44iNolCO7e z$4t*ukvuqeuagZ?G>r)JCg%mYZRV?4Jrw!irP5nDO>q_cP!Neb%mbqeKE${9Wt}6P zVLO`wU4*6ve3gbWYLW|-(H9Em?wu(nBI7HO0xP_m{h~fdBdVLMHc--r&&Kj7yh)s? z!jQ}otc^X9kB>O#lmFi+W*f`*I zdq=D>d*%trpBsG@Zhhs$j75Hlg8RHyB+oVy4wQMO(=l7F=ffXP!wh9o;cOTn%js<#lm7;sx0)589QyhC73>5_)04mr{^MG7s$%h} zx2a2N;ilv9hHyEgkjN&soxPf9ib#!Q`Y7NUYiE%nibCW^C8J{R+7dEEIhepCvKuo9%ioxIW4}hQ`Ak3n%Qe9?MWJIC02)=eImFi2FgC zC;k3ydHz|P zUG`&ZA0=VxpY$PHTUE37Yw^MmL68&B5 zNN7e5X#>#?)puqGB14;kh&=&Sxh9uL>_QR-qBW#BV#V)-DoKYqn3zg81+lgdu>A?W ziY0whP=e;YjCbgmBRWWD|BI(Tc`xL-mZvTM20uCl$;iaoep(+v9Ki1dLT0xrYsc;gT`-p z>WGu)HUC$_@9=zEo_`i6c};(6=UfX8;Wg>g-sXU}^T3~;WOXKH^z6Z76~#XC5b~Kh zprgz{bhu8a8ZzZ+N){%<-GvI(6sG-r-AWH#3zy8I4sOXJrJ7Mk&Vt)A2Moi%$vf73 z=|OC-FSWO9_1x~=2COf5-x~40-JJYh>>j%O9f-nRa55LTiu!10k*;IbBq93bmCg;~ zsP&!M4N1z1ZQxFpgM~MQXATvriS(mUd4)@6PMF=?YPG3LNCO2L=?lH{)_4Kt(iv`1?HswQVa zw$|ep`i=Re)qY7p{AT&TrCcfB`KRSSDKYp&Ikx?V%$2wpj&ya(!UbiaS)om#69PC- z5u{w>*n=dqFr74gDGi4uR5-az7S=&7l1Su%W?*{FIgvw)!7U4!arTCoDzH58UcJExsCR|M zFH82O&=BeAU#h?MHuw;D5FJyIQ@#mR*0(@4{};!G>i2Y@p_epNfW&$R?ajHzgy_lk z__>b$CABwlvVxEG9VVRs$K^!B@rn`r!YmNFdp8$mnVVMR?h2m`c6$XDn=1V2{>SOT zPme~}i5bw|@DT=RD5wGLfk_5gGr4(Fk;SqvmHc&j{3^bBvlIT})Bo`w|6%VtuzTxg zZq7JPiQ{|<5hJ)oY3l~ob2CoF7!2RFyQg=iey$P;Hp3j(T-*j&vzU~X%83ducZU}~ zbg_WEyKqFhgVBxrhyyqVm79Tg4CneWPTJ*$IwC`tX7Dv!I1V^y?_kN%R$juBnYF6GJ}j4VTC1+fLOt2|X(;yTK)E6;)ak2O zi-ma5_?HfDXaS11#?P{>RS)(Y{Z8jVZ4W|yG*m&>2RoWz7VE57%VpN88uOt9F9O?H zQE?hM){q@t0^HeA_MvuVqu6c~tQ7CXsKiR%EVmtq_b*K;lbxF;bz<2*1`vu$Oj6oEzjCC zEc=pJW5{kkJKG)+hV^lO&)u+zZ{-h@@yED-Lw1A(G*kGiTg?=nSD;gPvbWIT6|CF= z#tjt(o1sS5@ZG)lhJ0fHi<|k*W(+Tx^>cc6PvP*;EF-dTaamj~TSbBRhG@DzkjWv+ zNob}R_V9vyJjtXu#bLw+p2xS z|CYV5#(YEHw^%C)bBf_2xwU6@*u5dh^0i@4R_&J!$x!vj+2N1r``X?Y376C~lf&*z zVRQ|jgle}n?9Hm)V}<_)Mb-8@t$hN3r#l-y>d^19@D}NvP%n_rbWzY~-8Y0`DKh|$ zjKsTXD4!JzBH zA}M=VINdEp7q#h@b9A+2zwR8bz2Z#RQ@HTmN9mZ47zU-ycnUR%1(8;p!Zqo7XiqG&CIer13Lu>h|m{2R^YUykR%LG~&6_ z??3QS<7Y4i?zNP!+xR*+&wU@~+3z$aPqeqo$6fNVvG?VCEZsf;kMhB-!tFbt0!M!) zKBgH{Px)`V+n_NOk%=FeL2p>l??p@k+R_uVdjLq4tB zY`=EkeR{iKi?!e-zS!@(*N0QF!y%p0SW{TTU*q;|yR;>eFQa+AbFnxp54*#HHj^_< zF|RgcHEsyIV^guY`|ttGCGL^SkK(t;OS3WEb?*t zf6$oBt?ixLxGCKD3FNl3)0eTvBhgJ_1G?!rjzgS1sYPftzV28=Fvfh8jlc|BIgM}W z@pP2DVdTN=VsU(@tUTv}Hax=@EYhOk{AG0Rr-h?3e7w@D{~|q0zZH{(f6XUg4(E%` zJ*1U6VA4_kj9Jqz>>jK>{2eR)E0Vg?v!44-!3S3CL0*Wn)?FD4(wVh2@;+(r{*lgw z!N?slR=CY=UCsse>&)2k%~dxL$wa5|RDyq!QZKeS-)>&}PJWlS4%GolXL`%0CFaBIgc5${mJIvj`1_ z@^fr*uR_!5GxN8=aAv*JM!qz*$T?nQf=XDyh8gT+hqFh7nKYjm^i50~-dwok%m)?I z$V2{&Io=z;FN0~_6Tn@GhkpQE77W;$O{y@vLpjqp+=n5;d*h_KeA(ohr+D4x*is}N z;#LL4Hw?Z2{yN~bg7>WXk|4+=B{mc&pRN0Tq_frDf^4g162XEmW^w1LC>l7w@)sWl zt9H1i`ZgfOrGc2^Fk?FNI|G1-w-@*);^r$v*@=VTj;lq-u#QT6A$XL(w(AG8K7u&h z3Ay%!uK`Ak=YL94RbzZ3J?ka)c!5Hm)8Q-t&(IZTZ&p!P6&$ik4pBm7Y9K3fg)nzh z=u(c^$%@RZ*CfBJx16p8jWf@|PrW^Gpl>SYqQQ|}rg2id8|Bf|+u z?KHAH%&S;91ToyEowAL;k5|Yww^cu4))OLab{^DFxcIZBjD|kWo#H7puW7ifFak}( z!}8Olbrem*&Pcxfrrk%h{wvBwK*+VZmiX<+#RXg3q99i@B?mcu)-fhhg^z04gV71h z%u{E2>O@lRAP;zpIWEC8*ps#BiA9{Q8Wn1jC;CR~`Zv=*NAqjWGm5AQ>!BeRXrs<8 zjJ>;r=2(vN62GP~O#DZ+Cib>Oc7(Z(d|rbW`3Yca={02Q`q;Nm5hlZx;}b*?$-W}C zIDtslAy*Gf$qdPHmh~th-bRqJqkCNZva*)hd{4Q~R3UNjS0od%bHmr*?*hg?4ut_t)oN;L`Ufj9fdqU2TtFu!G6MQ%hjn0e{N3n=1c zH}AG{GU`9Glmr>sm0@Dai4pUo>M7dLFwxh*Wt88Qr~ zg}H9Dd*r0r;4oZmMEBm?BcV2a`dPnNi@y*;WA*l?Q`+K&ICQzo{=yy3Wda^9Fmwgy zjtqs<91wL>2$Sn(!Y zWtRJg5bqcm`wAKXZq{JHi=GF~7XxH^{vMJY%^z`9luche(Rg=%KRLGjcqO^)epaHR zT3f1XL5dPw9}=ROkV~eyrxaSVdQy0#8?8QyUjdvIKMOi$;n)!xmxW_PVyW=uG=DVu z03D;ON49fBi6x0IxyMs$g)n?Y)!ebBT^m@|(a;L-cK<^Y6vbWcllDfw3(C$M(j!U( zt0m`ELn?yqtYG8-LIigMl@s`I-MovwdlbzG#g<}=hVjs@!g(bwqvu0ijI|Wflg+bERnlQb z4SPGiR0?R7epItt^^#M%2M@5t;i`^KAc!Tp2Vd?Jo9hK4CzB7W2aLsuW+!IIm7N17 zGZG>4jcm_Gj+dIu`XQW+6A*TC+21XzVxscssH^>uSH5|-H@KqZW(?xdPrqZZudSwzj7VKkgHFl_ZktJlV=aw?0aWQ z_D!2|;qaSMqAyVj{vWpt+L`v>guI7@R_X;`o6#-!{*12K6Iy0;f?o(&e{_dV z*e(-JCmDrw?1a6A_iu9O)%WG=gzbgpA%JJ`JWHL^2ggaz2D$&YO}D`IAXtspG@mvC@GYh5ysQwKyNIN0wXG`lQ(yQ zr&`533XWLAcgSHYUlE*HkE%e06SWOzBYaQFQ|@u?jE-V_AR44)XMR%{z7Q>qPLC*M z3SSD_bmwklg2F38@S9oEKM1ALkwgBJ=I==Pc;Z#SqnQ1;-7gKkHQ=CAn#X;GIhT?{ zu8e(hw1CZN7O|ySsxJsEVSA#gVHkD$6SHL0wc~e2|1w!*k_D$NW+K(|Vhef@RC`VI zv-IMv2rT=n3r>&T$m*8run5I(K~|Z!Y)=}*UNS{tcZf~I1g;_vpJCob(!-LqW<5NR z_Sy%7`^=K;MsE(z4I!PvnPKa`KM#dp@8pyX6-Kv3mts2>zE-BbFoXVRknbX=ZO?h!^XJcHzfMtG~*(YW_&8tG~KF(y98ZGjJavDDo3pF^Tgk zNSx?MWlLEG795Ivzi`6dS?b*-I8MPoDFc2lQjlBJK7#+?^{x2N6nft#sX|J!YR;A> zF!P*Zt?PY(6q~PDF~zRqDsW{XR&BPV)1pzWp(N_n^QRazP7JbKWt$`+Kv#cty0vJH z2IvLp%5;r0a8#kS)$@@`X5W;&N56ctC1cW6R{aYtnc2}R>(0aPFmEU0AV<@#RB15`)GxNL` z&VY#L?xD281wstb%EYe(0bp$Ip28*a$*NgmTHmhcuFF7nbbH&3oJ_HitE5i3E5ckN zQM^T#x@uc}JmVCt$OzUPCuFlFhy{D(95OO&zhhvEoa!vO7(kdT{T<+>S&&QG=r(7; zI3k(uMNBv9)MLoYY)*tRf@1nR$LaW@GUK-RvDRIkmx`@F5Id~=cyhWJ_)@;Q zBaYx9xkkv>T6JX)6m$5T_1x(n#Ex8TEf8+y4#ye8KIeti`vD?&gyyF{iEa1?iV|}# z5+$u0*(0m=)#^VTwANkUBfI(^1I;anwg1H@eG_3gwm!RIcZY_S?7`L58@7aB4{xxy z*gKBC56ecozJ~=yZO-{6i0eh53Ja5hX4LWPt@|#8voR-c3Ssv?3QL0|G>)1U^Wte- znJeZ9SLPdY1QJ5KW(5IFYnoEhAi5>rOMf`t{~$-mg=gE}<->UBAO9}dUQmn5PdSODRwA4gS%zJZuRMFOo!feTH6j~KDTjJ(-1ZcQZ8+bTeV!cu%P9Dm<<(F!5n;Yf$x_Wev*r6=^ zVSczapUiS<5W^~2)Z$UiE&jC3yK$4IXC@W^@5n0~Z+~SUNJY0{qwjrrnShnAkm#|a z^V7gY9B1w>bv4DMC_W?e=3gov_P3L zD7Had`bip+aNe7W;i=qLe_$1<`OHZiE1@Dq}t;@%(3wZ4!n(h zZT6%+_SO@=*k?5@k;v$unNwPCRZH`j^!ojq?R^=Xf<|d?ADEJ~_enk(1M5G(iMJZQ z+{+jAnVU+2JXt*1JRzRrc;tIWo-j`*9+H+E&y&N`g{Lcz#gof(0#7%d6M4GxoW#?E zrzcMy&&fQ!cuwKz&2uWxX*_*+@_A0@IfJJ!Pd}dT@SMqW7Egbk0X*O3Ih*Gko^yG= z$8#RfK%PN7=kr{^GnnW5JQwm@#507afahYKLY|>Km+)N5a~V$&&oG|hJR^8U@)Yxw z@QmUa&2u@=6+B~juH-4@8Ow7OPZ>`+&p4j(JXiBf;HluLGl}O0 zp2<8n^8A43hde*xxrygyo+&)H@J!{om1i2yZ9KR0{Fvt_JpaZso#zgo89Xz2B0N!^ zSv<3Os(9w`+{tqn&)qz8dG6u4H?V1bwGjL!)!6fMpLr8H=S{c~KXLOThS0n%kRQf_ z(T!Hi8}uhrqO6K@rZf%jfmcc6KSoWCTF3uT`#l|B*X>J<>Rr8d4=NG_G~r^_E2FwQ zHL<;XDIAq&&Cg{OA{z^L$fXzF=Y>MeR_$R%JmbWPd8D%&aV1w6t6fKM(!NuiMFcGO z7N$RDazp4ZyaAy%HYSe0Bv6D;r?6BsVuy))gt!89NG-E2W{@1l@+Z-sys;Ox(bnR{ zQrGM5Oa2^*i za;|6_KfWK5U1FW}g)oG$fJR7^r+!_0&GAaddBX=A&o$Ogz%Z zTD@6543MOFUlw6Yfe)beSd{E9pU=M#SNvQ#AvVRy9(;k1uvH?TZjn#o1ZKcG$#vjE z8!>C2^RVF2S)gc*daxw1XWx*``9Pl^NeujGZi_+l-S}RmqHA6U)f`ESTyCu%)5BUl zs>c*Ig|AiR7NC#n&4S($`R{Mi2}Fx;fSNb;rGYprE*qx8m0m#?pO6Up>27f4SKv_r zy!3hsNqnZ+r14rLC#)!vQnIZ0TZGe*YFg4CirzPSp!ZPucN{tdBWC=w$ z_vQr^C(5D~AJvKvOm|X!*mp|f;}HCLaT|Q>NsgBm)DOlvt-9JVq%gD}DBqVF(cAto zdA?Nm*ii|3n*^hJBW5~*wypl_YoL`8@W~KnJ*={Zs=>w4<1H)TJ*q~9M~$}}9c>fQ z9;}%qcWXt8n0mRiSb$tiiOdk+lU)_@<|6m=ct72&NVbH;Sj|9O9rmS)dYkj2KNJ{R zXW2ILMtc5iQ(uRp>pSgO_4PffzO1(O{q>^%L46OQ$q7Wh-`c+4lbiPSZP&i%n?a`> z77Fc4mGl-gxa}%wyWeEwL%BlmB}PgLA};G4I~2s;bC%%7^Yvd3@G^`X`P?0n1dvZ*w`$OzZ;6ONb zaUgnX>`v^+d&chMK=%pGyi29X?m{l=w=nS{*6E@DN|6koxA{Wc)pUq1}-KQzU!%!DRpLRV)(H)cZDXF@k+Len#$ z+cTl6Oem5GRcAtXXF{V1!H(rl8bb1i<9tHQ3jya24km=TZ-%B!%_miv_ty(lUZ!Vn zvFjhBv1s$ywfIi#-l6RB*>#ds)N%2C66h#=p=KUMB}NL*7p->HIleE0$XKLdH`d_~ zXj+_?f6IbEyawOeO;-eK4+2TzKSb68g4pN3m-Rw-Z;T%+a2kKBH4l@^oB z27q`o0N9T&1zNF*`Y+zx_&LBw{nM`I7Qw3qYonaUr}9x|m_-KI@!r~d)L~lzbW6y^o znNU?GB%MUV4dMI+9|nj+c3jGF1aiv1gzt6tP1 zAY|zV7{VVrv`Jg2X{9vAa^bKXt43z&{hB)~Do16@yhtcps%E=0E>sjbTZppSf^vl@ zS6QY5Wc(!dhLmKdF;*^pkrk5|eW&WAc<=MAnoeeKobGD6bX4|R5{3U{O&EVu6Pgy_ zbE;FU`8Znv!aG$@$CX42FTbgJcQ8s+$VA!kgM5zFYwt!oH^n6&^cJhv&XrFR2nrF! zCrVmr+KW#Z|GDuRzPRzP^?PVq7HGO>Bbhc(v5*Xs7Kjx(TKr!YB-p@(Ac4PxsEJr)PR6`aNM0@hT8IEh|;0 zqsY5xz8*>zu%cZZjpQ;c%EwEi;9637Pu!@9VqYDI_QHQc79Dy%Nd`K~2CTT4pe0X{ zjwl53qawd<2V0X?k%3Zxq4oEN6iShnAJ+!J$}SRC<|>q_I!RaVy}w*>$OL&0Hd9pU zD12O0qkL_QkdW;z0_1Y<^MQu9Hbihn2-7Q<$W)y~dT(dqij`|t5@(`>0ta{T$w%9M zX06t_764L->ye%@Sjac^CiBo>=i)|sYWz9j48}DU8sE@1zFXV)6%t>! zOXC^fQwgxwvjx&iQ{#M6D8z?n8uC>dov!8f2470rAH0W$TP@$IsylJy?br^)Iedu3~R!ia!VxLSaIXasW;GUo*IF z9@Ug_GLZ9MiV4H;%Dw4VOKzqR$@5F{P`^{8wbSKVyNDa<+8-fo#~Kr@1TvN-aMf{(l80>w5Lg>1Z+g&EYO?j$Lk^uf603dlS806K<>JI=$ zAW$d&@mra|?d|h6im0TrbW>ai8OZ!}iAwR&Bg0z@ccpNsT?TTwmp#Hq4YwU=saEX< za)J}00nK$qZjt@NRGnl@&jNQnB)-^uq}(rcsT@Y*NMs~28JA7P3=xCnx@HQR7Oe2f z8kCaK-7Fq^4df<>OMhK8?=#PVB4Qk$kqz zGwn`v>LxrdjfO-8uTH(R$V@BF%1@)R(YBDWZELcrTpP(06Pk8}ikd1H50aSehHoK^EPI)__0 zby9O{tpda(x0V>Uw#!Oja3dOi4N-%OizQs0;<%z6?+wfe95ehn7e|@7<+0ke^lX}Rn~n-Ux9?h7yAGkYci3bD1Xp&_E`M_s-eMIID+tI4{cm50W!BBy7chO16t4MOc?U7Mk_?(SS+w{{rsf zbt8GPYCa}xM${UqY=BPRTwlQp#es%qKje<;PluNILa;aWIaSa)ql)bK%Ot@wxgBpH z&=lX;F0Vj^0wZsVt%bH?vy-*pE3orRqfbc9+RCj+v~9 zWDp?yER!w})+R2q;<;xCH3{+9&5bRmaU*4{B||%wy%{$`iM9MQX&^7{%9p~@{E_R^ zL}uB`CE)}7!(dB`!=m1H!I_+RG5wn<~TMa&!ae4|WgLaoZpI2s*`QNj4Nz7M-UtJk5s<*i;x~t~_%1laV17y% z%Q79zixzH>!MruKJ2NT=8f;lLb0t}3tQy2wHMj5;Kn>6FI&o7E!1>r`*Xlx|=j~>1 zG0>PeG0{m9<1M+1Pbftkvr6WeLfv6G?&T~{{wdj1w4<8HU~gAQE~VzU*^odqpG&Wi z1A9Rd6{$Mm^r<@G@!V&UrOOYy?h#&DZSX(cW%1iVpw=i1(~Xao45_WcE-@jhIti>o zNM>@039sCZwx~&yQBMFLLI=TdDL%O%V45;gt!0QfN%KSQ3HN#KimE1d}=HM-WBH8+8??S zC|CJ+TDV!H!Ife8G9(hOa6tB(^Qd3@w@s$kwAT5rO{T24+f1h4m_%Enk1>B*K%JgH zMS}d7`tGRtv;WioH_V^Eq&LzN(ag*LwMpnGZc^ec4k$P2E!^aM;U+zWQ;llVEyCJ*zo>N6$~8(sOX6u*vFR7X;}SQ+o!WhPi{*tgJYp;Fc80ET>Vy@=_uKV4 zW!1FMKu1>#&eG+C?Pbc$s#i!jUgeL|+4-qih?f#&CJ1|uAH!!NTLsVPmGkb&lL5(v zj`>a-!M~iP2zl^x!FD`zOx2ai@dg9V^n79Svx~e7PS41vR?RL`gIPB@%M2ftMF|p; zvQuvple?CM;^*LQE51?W1iyWbX^~#`upr*mm-mz-Vq98hV##!mnGHjye7+v8FX`jQY zIjObMWwO?>LoXQ^&QGukb07MO|JKMY?))7D5Xn%sG+`GBa@GQCD)C*)-M=vyy@c!Aq;Rv8 zs_rvNG#JvWrk}Y^!JqFRJ=X`*s@==nZXnpd5hUPqo!5R+N>z?1s&Uj$Unn&5UZFrc zzL7|G-jdPn3%3uq7JqST@k=P))w|K{_%<@enyT#j?Fyt;Qj}xIWx@wNHN&NUMJACC zUi3>N0K{LQjS@YNRyM^&Mqv1`3K!Ll9S><)3SadvuMqfjtt9eDt2p5eNf#zkmV@}g zGNOkxOx|O2*mOboG2t-NT~8dNqXv+YOg))}!!J+u@9(l|Z<7L)E*$p_fyI>(&1voV zjnrFvriIjQ=Yc_?WDAc60hqT9z*Jy$!)e^`TtH$NO&g2s1#3c_l(^sDA zYv|Bq^2MkXA~(qr+Elj2e1aod@rO?mAeT%2=^;4NKAG(FwFr`o;GiR%nqHKulN!9g z_D<{mx{fNWm)6X9Ix&F~#H_efOH#Py6pxkmf?SaS?D=%|G+>4cE|pfO#vs5sIs|FI zwwl)D0uV|d{zqew4%ZrlrA!oX~1)d-)FLl zqhzb*7re*nrOH5rSw{keipfZ!;e^ickP$fTVIlvlnC!?c9G(+7J|}4SZtbuf)Zm>> zORGoc1Y^n*wM2okwM2z^csN~R*gtkAJAIiFCCxEPG%%iL+U=KkdOL_uOjp|qNyyPL zQe^8-p$;GGz9c)wi7`xT?DiN9nOSxyt1vnrh8~KWeBA*MmTAI9{Z!^nabWxi)FFFHp56N@!r%o6rQ?} zQRS2JfK~`nbt0-OG`YT_?_}vxbC2h#oQF%y!!|zMuta|nqc=-)!E;a|nF)irB`F?h z(lJ-Ii5V?Sb;kZ+>%3#olz3m}fX8KEB{mRj%XZon^-JnR!aEqPeA$O3k>dlaH{QFX7Nl|u5C>vK@CAryJlpPNPgyYIqBtUgf)yeiG zXv*O;igI0zD$c|+msRs9{biK;jot|?Gh)qM43{=q1z}*Sd%)lQMldcr05Wu9RaM+O zD`UZ`d4d)UO6?D=W#ekT^ifg78N7y0PAd*Y5y7g|yKPLH{_T#dKqoF>IS*1p{4#IC`&tWt+J`>q3K!(d}oMLw=0Lu2(qM1jZ! za%=Ys1f_!puk^P@r~OIGU=-AD6&-S1Fj`VrCwXSPl`c)@nj_LrnVz(2J{P3y-yeED zD{`as-_VsP7bmt}4IH_`tsLw#xxe)nZY^Y8#xb*FV#jpW(LFhPv|_2mUwVwLDtL3o zB8W8dZ8b;R)O=^A=665&zfg1G^r{())7TKt4)-xDw8e(_636qu%F^Hj?L02=m99f8 zeHn&cjG+jrz28WiBmM%*RwC1N@4EfEBV-ji5-7U$gli2&VilBdlO?nE*#2Q{rC_P+XvnH zMe566gh_`GnBxUnm*bzeOkbKuRgPlIHzmu ztAAMWLXvs|zX+m;(NSu}#WK$1bS93@aFn##vhEd%275c@jA57ydxc$aAJFsWGqn5z z)LqSz*r{uZyN!p zwBr&+L`&V#ZX7_3)_o7b%wh35AIH{IOW#^GeK23m%)Z@tY2A(b{`0cyR842NwSRq1 z!ZKC6wFfjTlcQUEsivuwaP@fkt_vD}_71IaIS%Yg+z76=>Yi{#po;G2g8N?$N3bto zFHvaR%;ROrOHB*J{i#)h!8Y^pL83{_l)3-a+{j=@H;b?zLp#kSz3uW>c-Ne*BSmpn z(}Dbn{4i2{gSBi^_^&K=biu!Wcn)h}Pl!g}@rsMf>RzaQ*>jF`gY&7-v45B(Yb2Si z8&J#wok-UyA#)Ic@0n!Qs>^fsH-@5voT|LFvKw^zhfYP_>F>`=1(pW_(K53O6uJ6n zSd-(9`ojG)-))7y_G&q-*1mll9!>T(uAIZ37~7)>|s-BuFySI#15ImasV z%=Tr@&XhT`eVIr8*rv>B9Wrprn(G^YZhgBQpl4(XJ*|DA|K7GxqZ*MZ3t>xsoMi&F z*dMY8mSO9bhn4h3Zp{cdJ)LfChgex^Mv=-m84)apk(GD{CDH!IT!VG4xI--4--t@( zIuWAHzT>?2#9lgHMm3zUoA(xPoTl@YEc+0~z`xgKG9sgYfL8A(t2yECN@*gsRxWZH4fGMP< z=jidu5S!xNsZdB8___T{p%x_TM?PPW8rt@EXCKAV(dDBkEL8Xjqn;&DEd)}3{MeOO&8$}K6eqx-v}IcA^OXLxYEn-lIGrezpBt~ zTEX|~?=p-(&Ll_Fw2RYmou0|W-D=`s-=l$`%v)@-;p_0LK1e3SX6kpQYrS;>q^o_1 zeO7BNeOhag{w?#KeA=%?H}ElMFbROr#P@Ai6*3o92@rPN;6_rlM+rxRFu!6VkE5O5Mm{b*YGxvK=e55~$=+>-!h|$F za9ySM_q`5hrKQ1L0F{wq)J~^v& z4t40Yr@*gNV{YozvRU&9CvX+xW!_KB=};vGdjVi1&-2E1lxsv|L$V@$z2SsoL%OS< z4>Vz->YSG49sH9)0L_p-GDUjBPn8O>01^zBdD*`aI^)%h#J~O8e>J1!Pw7`f;;Y_M zElZk4o6@m)TGSeS^%=D=lHCWv^UgUv6MNnVA-du;W;NS*7m2BsHl}S;p9QfQ3VebW z$K6IWcjj)6l*QQIj$EOaBP2VTd?om-bgq2%Yqvbdos;igGkARJ4g}0QLgR1(amVN~ zZ^s82%v!ZSq()O<;T<_M>Yey@%0}wAG*(5)+$8GYo*}dnSM_oUF(X?*^B!WAm!af7 z6v6UGG8RtHnenFZ1&lOJIVZVl;;i&{H=oLNwFDC4-VPZvQk-7@TeF?_1G+UB2v(y^ zZRVZcDf1rvtzTK9PCsQ-N`FNDGjpi43(D@Z$8;>SV=7TgVuRIt+Gp$aY-eaq7((J{ z(5Wi`qtc#AOhw|M_8*&6aaAp2V^DH#o7Df%avmX~Y+7gU$&Xu!D$xNw8BI>>zV4ui z=oZety-})?aG+!m!a^l*OZwu9;FPar_iKHJV~^7ga*@D|IO}x*krN4O#FmQ zQ!!rO`M+LP(~BS_xN+?zwD>^;S=zI`EU4dSM%nSOqHVMJf20ZQzf-CU-+AR4E?5K zph@54`@Bs7IG3FMdFE0X*ZzsSk$T>)jlUlJZ_61H1n++FR5ag>ZN3X>XQUpHMJpQc zez!Xqcm>KxB|hR6q48{NEzk0uE6E|4H$K%J)AJOxrQW~Q8npuF1&AB;ggkq zd>Dr*cobq8YclpapUV?dR_ziXG2Nx*UGM?v#geO5SL}L*rkfh&=7>=)XUMV0#r*}> zQg!@(v3xqLeqyIVETL{@g9-s^N#ca2a=*FVd%dV)2_xBMA*ABpb`xxHXA2S+Th;* z${hB6?Z8ji?&UyIwzvJil$EamS+tZS?a$-=f3CgPr*wxT)84nLq`kR6PPf-X$b|>~ zv-TSQ0`|MOzM300DmurautQ<(f@{Uq?t-Vlw6kcTCBR!G|qe>2W;(= zLric*=*2K!^s*nWut}b7t-i`PBVva`QwJN8VH4Wwu@PWrSFcl=s_HxlqlBo1Y2CT8 zmd)YMF~>*B%j{(l8GmR#xL;w)blE`4XVa_Z zIVt$@n~1XOWY)3kr}N(#HC5=Qj!0c~36B-$x=y{8GP{V=9$PmVxp$L0Id9&*YT9GP z@7EkGj+86wwNR<)Q@xXZr!uFMDK4%ZS1Y+3Mi_Q7fU%W-{|d=(EKTzyp+e@2kOKm8 z|2#HAiP5aI+kO$Vey3|87YNi86P5T%;^P9RJ26k40C73FRkN9rWoqpz(REtC836b6 z4`5TotS2Lj+oTDZDK)JQZYmb+!~Y(UAAQe5Wfs4j2ufJGZgB&lC9jBH)f?O`pdxGgo1^yKw87ifC29|$O^Q@mxB$Zy~GoQ z<`o8t7)F(*olaGeqo{UQ$^;>$uWTkz;muv4;uy?;&95*wr7U{Pd}ydb@rp1kbmUfl zISXO9!s~N|?u#e8HYp60fa-81wtCvudV%&uWL;FQf?fOFFMsVQwYUpp?vZL|6qR|G z|4gfJ^dlPdHhsvMf$PaRUXPuWiBm~?6BoT5+0DK%Gx(+wT4<24@$k0P}fMrkYL zSn$nKxeiFvO2<_ma|fifc!}Ru{EMdB`PqKIoidn*kvGwgf9rTsiSzmAt=-?L)xShq ze(ueD`xZy;o6w}wKiP8Ah(F(23$9|IWj}b|XZ)l-a>wVey@T&hghufffy<3spa$WU zqWO_4kdR*Sjqno51H@tnp(FIC{5p%3GUb)PP97Z zvhSB@Cc`o6P71rqWEOEw&LRl4zeonzF-$C$s!DU`&B>FwH8RDN(hB|xiojH1tUt?V zCGWCUk4PWpk&O^>bUG|g&mtJ#AeRJ+D7xk(3f`|w@~9f+EVThDxH(2+_1*Gi0dv$k zw)==}4caN^a%x27mXO`#4CsP70bMnKyMyYZ?HG;!JcCl;KOtkCd}VcZ!lnc!xdS`6 z1tfW|GpxwL8JsV*>WJ4R8C{rOfBZ^rTdyk4tUgqfpY-qC>dqQK{FADf|26Ac@oj2a zS9MzKt5D?RwiQD|$y^hQOOi=pMSzVPiV+hPYtiFkyF1w#T-3_SK+%AU{$iw|qKWqU zb|;R)vE7Gan?tsRcVe6=oM^4y;vYIXF19(SpVtaEBJQO9!}ZY73eFrg4B3L0Xi2~( z#Y-Ra4GF}0z72l9tQ!WAvBg-sDgf9tmGgIiXSa4B)*nzNMyY%I9Ja)b3Jv^6n<6*8M z#X&4{Ic`^n6$wwioEh{eo=haCwqz2;=d7Gc4@9nXvSSB3%`V7TW9PeL2K&$?&uJ=_ zDUoT#PafTxJVlJGJG&!t?Bb0Gtes4VOwNdW;j**N;WlihsEuXg{7D(baioXW^0o?& zd9ZnBLPK<*$c`tXn-g2E$bjS^Uo>oR7yg8`kNd#cKg3&}h=%WNQKqj6qn*V)tXVUA zxqpRKweug@ihnM1F)qF)I?)`bde{Z*JQZ(r__t3Csau%-?`kTRiIIyMN!6zK*_x_g(KKHleyR_$tfI>W5s`_ z;eLf9`dRVC8qRaZQhOY}^!B3^Zg?7FUbYM#*a7EZkEZuh0x-cryU z9UI#K9RVI<;Wlr>7e09EgIGU?z2BRU+FU)Z9-G??|K7$Rgm~rThcjVI!Infqpefx3 z3v@2;ZLjb2TBOSbCHmODwMK5WcS!nZgnKn&d-FLP z1_R4M;Sm-_?nbwxT|)yUV>sZ=uM~pHmu?jIwu%StGTY{@-IwmBnrqrbguN#+5z96t zF%W-;NL#R2;pql{lrz0&?5VXm+Aoxc2X(Rr8KWJG6HSwj`hSM*XD|OPZ0b z{G+%1rq7OLuov%R6x^{9Q>N3D+*|#n;)EENba<3ZMfap8=+R%6u2$`5G&2?5hgJ$J z3y)_{nO98#(4eest@wHp7>BAbZfS9<#t; z@pCK3rgZTWy^mq-uYF(Ce9f|W!XM4$vVQXOm6xSvYQ90~d{(>!+yX?+wfve{^;`3E z0GE2d_@Q5~RdWXU5<%&p)b423AkoXySg+5krhyryp!!z@4v)qL@R5tnWTc0)wElbI zq&4JL-#E2%VCsJ{JFtW=%{f-&hZ1=T6FiY4kIuQ9NDeI&rN)_)7o5y5?LMzj<_9W8 zM84EWAX-niH&JA=~L+eu9ml2nhFqL;%!+2v7 zGv4qQ4o_l7CrVB|cC=wymWMJJNIlgXZnjFGG$l&pbF)(g2w ziiN{rhOQ`#{hXU4r=bb;b8hAgZzkua&$ZHH-&dmg8RH*wqO<0TbLBw!pQosvIxITi z`G`~ea@i%np?=b=RAops43SCVl50|TRSV}pfOZdiY={funY+8aBK)K8oq5mYVpY-t zhZst;{I7Fbzn%##=f9|FN9VyVNQv1@!$+ZH&MSh_ga}iE-d;F1r+W8a!dq*{=3rL2 zKG!+1b?pK`ELK$rvf>>`E;p-MHM%r!=&y1S&gIco8x^d#{Y#_IwrXWHCF)mnq#LH- zA!Te1{%HG!t9Ks=H&PR74}^{AIHv?-AbR4c!c=AI_=Q#do3BH?^Pd(J>6*L(;2Xn{ z-%GKVGHX!mMd@M{K$X%iN|%YkT|b<8tTGMU*OAt*xlDtap_m}5{k(Y_meWL0Ba3sh zUw#%29N2zxD%lC<>J+!IEh35@-?wp^pFuVv;UGPxZS_Uz8QUu)Btt_8K)q(Q`VXDA zSLS73gyNEjvxqD>8ZNU-x!a}iMjprckn$J{bB5$ zse#D#ZDcc+$ZL33IHS0|ghqwjxhtjx@e)C)WtH9~>`^c}-Qq1Wc%o00dC8e-?p6sD zsaaFKoab7n{`gZ=qS#vQR^NOJDuvYS?%uUY9c#KN8NZJdo96EkV3Kp3#R9FhdUC(i ze33oL>Q{`41pQLN=L}URPr2ana{$O%y&jl(9)YzDZ>;-NAIEA7r}gBK|d`t8}I7%_H|w^HW+LyE45YCnzf3GcI)@ z{%ZH>!DC}O;UY}SI*LKx+-ef5dl{^%MXTv7=zpHjz!nU97UUDeu&1~g)^C52nw950 zK>;$msgc4-@*)#wGxI{3SHWbSiIbIOY~3zOgwUJer}7SsmWFY#aph- zAp>?&>PUlq120bL%J}9r;v>nrs&NXlAZ; z5P*u;_*;<0FQWjur#n-;XATv(ONyAS?9yg;$x;ox;VxOJfi1M$##`m2?M=mEUIH>g zqO4KOy^-zHr%thZy=T7G=F^PYXGx0mUff-n<5Rq3sIZI$RGGI#Xh~(^S~xejW@XZS z3dd@acPe#xZuRHjwNkM9_l;QD-AFG8mc7-jW)u`39ePy32S3U5(Hyy3%w4c8-9O#E zrzweA$u~uI4wnNrR8Zz^s8JHoX6*5zpBvKK&QaRf!GA=%87U;zk{jvhZGV+ZYj%nx zccs#`64DyCbgyuT=nLQ_bz!;pz~7}JWXMPt3LS56@YemQQy}?sSZrd6D6=?#vB6#N zlmRW#L&jg9%=++db}7>96S*@4jlK+wY7CxPgUp|!M8SHyZ)|QgH=C~w1d0NEe<{k5 z7g0J*Fw9_LecvtTsJR~c6iZ@@ncMvV)HVYVaQ!hhQo05jl>~*W}XRW7{ zkYvk-0@i&kY?${gdvSs1D9Q=X6Fcz zEj2~AI<_?ZA!EOo>(9E=w188TE3@~PA4@av@ko6~@3*OZL;vk-)Qts_ietvHV_t28$oodh8AAub(2gHZGFulw2LB#(nPn zQLvKi>XelE@6&m=it(54{hUH&T~uwVc8ZGH0A&9gz2fM+D=nUwml>ImF4Nr&iZ(IQ z?=j_qNi}Wfo9~k|d4X5-QR`$gm~iW4gOmNOH~K{INrMuBPBtUkv0%DzQX&X8U6CHK^n$QGR5enk^NE^dPB}tq7mid zlSB$n1DJnIMr18E*9o`E>(aT=y%pX~OQovtw8<6Tj{6L*#r6TGRUsDCUWFH1()zWG zny6>XIa<%Wuiy^%y4P`0Ge@6(KPWZtE8x91`rUNdVJ$mHp$LEy=1Po--bQP{z<5Om z22z%}AtyZ^uGA&YWQQ$zuDx1NafZy4D^*&`?177P3O5iM<)=Y@0BpRs;ycQ1^mH}a z?jP&N=RXw=i5uglvS|a#y}?sOY{_w#i~}urK)~Di{>Wg?*R)U8C7o;$$=JL;#XH4- zy-xZh0UN{hYs08E)|!*e(9w`m}y8)$a|YKBLXo zi}dTuEQZUx&TYQ;QIz&hMH|paq5WqWDY9qNbZHxVMba^H(qv`b)7xlU|DKK&67?Uii;=(Q=HOHeuh zOJYCdJU{A864eEGN5Y9+#+#Tfw_qbBzX$nkiud+YOM~P2yiDEJiAAWl>jT4gQ<0A9 zax@A`w5`s2YPZTXHCiwo8+8M!HK+GD?Vb+a-Svju9+d83XN0(clH#X#auZm2**MG( zuJMy-5B``Wc3ln?W935?mEN6r+7N~<(IN?K6`>*?CWS`d)>oq?X0^uTnHX8oU-c(L zW9|VpT7%5~bE3be6n0jMNFmLv&)-io#R|L9`}==sGo83Vz%H)hCO3nl8+mtQH%J3q z371t&JFncUz26K)p{vrVtKhphL#dPaO7EGswEaqRGC{eqspQ54l=5L{|G=J##%Xjn zZOgkFZ2T7m3e*N)bH}8-V|Maw^qxYhs&hRR_$sQzHV&1LMOdB&Rr%Am+L?$ zI2jPJ)FBC02OlVOi^hhT3U?%ifCL~=1s=!eHOz50UNLp!PrR5SbUFg41;+j=+x2!Shx5!r(5xlr@NfN8yWL0OH+Gv+kc16=uUMQRo~p4K`j+@g?~OMyolqlVj&i1o+Td~IhaT(AG-1>WcAr(BF=ftjp z9Xrl=VbQJ(I8LbWUmGO>E@_jQWiCdL@QXIZJiSng!CYQ|^nN_kf0Gt@m$e9F#0fgQ zJ332VkR*e?%)_JE(uNGGuW-Gn=G#H{+2Q|#wSW6nQ(VJPx9AnpW zSBkOG8_cvq5>>gTQ~C1h|Buh3@p;{Q-@s?z3c=@(i_`er^TIdrDPHxFcg4OtUweL{ zm_yfQpURljE842R>TR?_T&x>QWks%lPm59Y!>1l68~DA9`Kzi~xABQ(N_Vu~J)Nj0 zsmf13jyuY@yxkmM;G!XRPGm7yi#>%1eEG-Lcf)GXpkTyIGetqbhD@%!Qy@~&bNd0Yrrzv7JOz#sjYM3RaV{P<(gx5FtvSu!KH4bRurh*rz&RmAl2qM3l2rOG z`gHn>iwybrHq9?BwBx%ZTpyDEbz%M^AM@X|JjZ!l&@|pVp~rFD$O3rrhB@qF>N12FtyvcNv7y%5H!Xrx^-E*jR$&Uo!mFjy2gZ&_%ilYm)uEsQwv){~VAYHbVGwdJu+!l_ z@YPeuh6W|u`*%OREEN6pr%C#&G(87cMvu}-%7Br$A8Aw87tO!{R@2!2Q7@kq7!BGyQi(LQRq zquKhHB<&M8aX~3ZI!TPLDh*3Ur(S8Nu7R+?zlLACZmIuPt8dHww@37CrT?~qU+Sy$ z{;)|AA#0OdL++-Jy^8S?ffOPc5znU#HtkXJ#lZ%62PGScF#vg?G%#kCxOqd%j3WFkQ5L6w%bgg+#B?& zwh2^92Ykq2FbFe!Q0AR*c^j0zE75he^uAj!t$b0uhJN{L1p0l3Q8dNRAq3JuDOg)W z8gEItlz^{N9a#4BG@`8Btrs{dy^rQ}?-?ET<4l{G89{zx{|CRgWiERJ}* zo$=oe8txFkkbV`(QsyL;EETTAF4R&0hj(-mmn8;6?1LJn%K8XaSj#sbS1+Hg+T!WuanbdNJzujyDn9S9+Sepp0AE-6dBPLTMFpdgNzMYw!D# zsnnx=+Z`t4|1a~7uKy_-3l_gwzhfdy{aeOJ{jXh|uD{oRSO26$Pxx6YJd+Zm za0b}=uKM<&=zB}|DTZ!9>XVsA3?pP0+Ai&YxnY+RMGBOQd*>fV5Pnm3%=unFq*=1vo zTRz^x?i_oSVpxRP2xr!8Op&}_$uMeC<{p1xN1@ZUqNzvVhe>@v<|ifE2$W1y+pn z&(8f=Ospc@O#Fs3gacUa;+5wBu`#6e%0RQQ${3Ki^EXOcLjBx_>In$YJG><@Z2>mg zJ9#!=d}vSpnkLZNMlSFc>*ChS#YjWqzlf9!9)GZ*1I|z2J|Ey>?|t!H71<`=H{%wP zFU{#)|2eM-){<*tO`$f3>RZilWGC$eISeP@knpb(^aqhjd4O!xu=tE zq_}r5A5R>|R~5k9j!&PSCV2Mi=@A!p7rc3iAq~M)Pwa#3FWfth2iwJ8_*CRCGo1zX zxlo#R?SeXjN@-#-0qxk6_O?Mu?iTDqbUV6Qfd4c$TL+|QJ{!)3Bjpp_lQ^f;v*Rj@Ck7YHf!70xxY^!;dkzggZ7Ht+d# zvcCF#38W|y=@295zs}N)puX9u?Wncn^Rk`&z z%*5C%LYvFnTl6|xBtqlq(tFxlQa;UA%tAgzk3B7bNXHQa91mBS+g370Ca|p}&-{#% zAG>6VpltTxgSeb3mjm?jGV_gHQs!S=>|f0EFJ^fc#ks%)0X5Mf2%if7l>I0R-CJZ# zB9fPgj3Ry*LO~3#w?iF9M`G(H7>PCYdvCqGZI!x){(34FyWz)&$V{#mntKnIGK0P!F*qg&tO2?${1U=2hs5b9aGW6A71yEfOYc!Fe%A^Z|q zHJl0|VfSC`)lcAJn#I3!`D?5W2_?v~L!$(sE%bVw`u0HIJ|4r{QjiLUc5HcyYXuPB?=2Y%7p(lf<0z00ayFT93$6)DP$)4mdS&<=?`snnS1)Gapb zgtk@>z=vdGnfv>%%(_;Nse{SmTe0+Aw?Rj$Y8CObK2g_y0PWQfQx(WFM$2w>Z}?K` zVB_2DL{CQx!s$cq-+rM?>?`c&WYRDgOK~mpUAP{nw%xASC~{90xWeLQMXn=r-nT`D zSvOYF31p{*r^D@FZ#JKON2+E$%14}dzR|ro$E?XVuOAdi&V&Z zDbHIl*vYuJrK4Z}$)oyy@98%cSlR9%nOIeBdgqbGx@K8#d;S=g+l#lP3#uCL1FLpx zTd~>fipPLVY4+kud0o2Mv7W%lzN&@($brq zho6)8p{-!?46Am9a0{!FrRvVqQlxgaYga@! zYjx&~D*A}e{=;SN#_VK$HKx%-X*);t(ou-+NnGIz5XCg&FkLTQ|A@x_ps3DMehX<-7E(rGt1 zrQMpnwP3H+9=x+c=t`~v!4RHz7)Dw35O)?@bAYPSGoG3DV2P8ie@IHMo27!Z(xAWO zGwRSfYj(5rK4m|$i}MPL$IQ>OFBv7#`HO*=QxX15g^Hrl5w%0_oqO8Ku>9q5lE zYZbSsNS25!KW-IweYyI%Tp{bjwZJhT^qj8Sh4HL1^fbv&AtbZwiV%Cb`JSsea@BhT zrFfCMarL}2RT%$5rQc<}^i=OJ>w7rjwK{pwDmb87>0yJCcBBo7P;;$T>D_s1J$__YviuKQkha7K*zXWVeYA; zWEoXQ4hb%wkxs7g3!-~6!`}|B-asaf3wOnKAGz?67e}N;IZ^G^`S)78DN5`*y_~W( z9I(EKewZHbzbt=C;8p7_?PcAD$g@nWHZg!0J)wPQGKv`(%zxxW`_5PQl30bEdr2PJ zFz4PAP5=X^K;$_jQO`=DtRLO!k3Tuz3O|%_0lRpXK(9bx>g0m&J!b8-Jf!D|agXeFlo)k9-zcE$D_xiB;M>&^2ATv+hh zf_Q#&w6;4fa+2M+WKU+=i!8Xb(eI|e>fG%X0FgNgkr_UnoE7t23%&TW_|jB*Cj5fW zUw;F?z|pickcRI7-uzhw7vwF-b;d_qKJM3l-YD^d&8UQp5+4kJc zc&61p8nndIsmk3xQwt(SnfhNIubj{h~ z=lnjXDcUTfRCCuaMVqCjJyAjsIbfIWP>q5{zia%{^V^~HTI2{V(iMDRY7R&B1nb*? zyfjwSth>rYJ&-t)hwe{bzy>GZ=us}#Y*+k2fNC19WAc$~JP3im`*lEcq9+y0q$Cv? zCdJuOz+T^MeR<0nolo)!`-zO_dac+QehxPhNT;ox#>42ub8=ytrSg#ZOKWj}=)hquW~J^<%0=%0Z+e3DItC5c z)zMjP?tCUO*47V*C5L?Oasa$r6yD*}t)9`MP}g8z+1f9oc2imSg_Kspxg}N)%5fR# zv%Mpg@w+$Q3t|p%FXCslU|44+|4b4Hd4pU=os!y2G2+)O?#{uKIQV)t_&CQ7uUP8qC8b>u^^uvmq&zpA1OfW)swK0B z)olxluJjc~E2p4G0@JNG-9N3+zScEc?^1-*4cJC3l2thqHV{2myzff}QNhRtSw{k{;3w>EcC^Hr=luR+Wz>PvGQ?!pVX8W2{Z~p~6fr zr5a_XGkTfnyLi@l73FpP+N3D|WQ;OROkK#=4_A z$9jtdrPk|7-Wo^AG;5HxFpwz8fUI4b;d9otJK(I3?Cj*d;jE>k&rbjgnCqQ|!b=NO zX81rU0xI=~0?^LAbXi@FQa}Q&sN-?!u+Kuod)*Go!0+RQ47|!4xb=>3DEIKR^BUSt z-LHXJiagOfe&h+se)C5B;Ny2iut**K2UO1J=NvHlQW^bGogxYnK`b3nQ@-DS#xL^j zx&HVo{qYye_>W`!&|9odd?tGsvn&U4p%axHx!6&=68UBBKlO9`eoSf%UN{Y7#+yB1 z71>+BvR6Krs!F@!Ltf!Ru2ioovnuGHZ*B7Mzc@fMT2(>}(Ufn3KmTV1;(%?@aRJ_Mr53K1WftLv+7~n2(BMYjX-0X3YD5S7P;w{a$N! ziNQj-+@2vigDfZZygn5z+h6n%)Pf*)YoB;~VN)56(8{@OZae%tAOx({nU!v4ncNAk zR=SUt>l>>D#NKerP+(H&-dd{9RMPwA@z2u1&#@bS_-`4K*a#Z0=hCwgbSNl&S4|OH z)9e>6`V20;@yXM5ThdT*i`6RR{%YR)q2iSpf(LVW1F7L~jYzi8`{~cH7o><{?_e^# z`d_kp2Ai6cd}Kl8n#T$`$6!mPnx~V9M?n|&AAjzThaj4Ox~nN{)e;K1LpmkwA`0|i z-9#3PT{fzI3m^>Eoz9&k*lc&AD@VxqUh>K#DQ)viA4Yye%YIvRQw>hkpit-+}D{Ebi5 zc={51tmM8B$(EsJ7xIM+S-cWK@|#kD(TTH$ zN6^x_^5`j2p%{2&&p-Yg7Ha9{$uPhLQ}Y%ai`FdG)@4s3>C9%KjX6yPJp!%z9>j79 zwmXgWXXxx_c+>jSAB@R+i@wj9#Nrq&W>oa@%}l%O z`0fpt2zwW-le+8>BeP4}9qUXg!WB^p!N$2;DP(nf7?Mj#cO-b6%1w0r9t;voQC*bR zI=2P79JgDa_pWbP-6WI7l)7EiVu!XXT7iZ?kY?U5Nv-#OsrPfKIkF~x3Tb&zq0H{? z+(si#W0N;rkXtq;_g_|enuhH0g@75?f=%u)skE0Fa_3%5n_}MI;WxWedm#faTzoyN zC|o2g3#jgdo|CEiI3{-Ynmpl+OP?e8j$ON6y&^92I3|N8ikv?YRyVXgey*Uo&D^7RJorpvzHUYRMAK5_V7eN+c#3rF*qwM%6syVeFuhch=Zst; z6V1nVv6?*PiJCm+LQS5iJjYAzn8Bo?9aD84e5G7+y+Ds;9|?(1O@bqJBH1ESJ;-ST zs=yY0C*}PV@BM<*_vlmjUNkA?IrfFa?3;4n6Y>)UZ&_=PdTo`Ek6`Kh1z#N1qL~bW zrEB-|ukqwzO+(al-X}&S5gmIf660}YL?R7^_96ge(t;JR54AWlW?)Rk-jsOZ6!}ms zOTqz#N84pN1Y!2s?+fgbVFgt=N3|~+Vr`1GW=O$ECv3L8cu%Kk+v++++AgQdtli1EihUamu+u=4Ine=-9}hJnh?Y_%zA&!r#nx8;Fpg`_^pfF${6yz@j3Cun!uaz8O&S>}3eH4_rvOdL13o`x@c(l3 z6=HQ$($pPn8HDlTj)BTTk%7mcEfYpE4r-hQQ^mEl=VMT)vNXFPp!i{2j*M;r!+B z_bvX8;O|KOhVge4e@F9ojO^cbRK_G4aWiIoK74+=FTAd_?N|R{7JY2m$>4NFSv8Vf zx6&M|ZM6&=cz&-fmA7r9gZ!6ddxdG>P92Zh=nVhC`8MmyvVX-LI=eFWP1G1>1*o}h z0vX^@kR1XRkhc$xL(nos36|1dp{&r?Nm-{(KB)d%*Y_eN5aJw}l$Y@oio(6-J)xQ? zf&zxQAO4zaPTDxsZP%-uV7&+?vYbNQ(BbnYaU;t#*d*SAY+2ox9i5kn_-Khxw5JuP;_gpzi@HAC`fi z@)av^k#0Le?i#N@UX!*Aavx3kKon+^lKCghdNQt*e#r10=t~U%W>h7rWcUK8IvM=Z z-+g2T-*D=Qy@O9;5?ZeC72e=eB`fRpfOVCQ`-`#}?pO&x5NIJyByKr_?k7o9Hd>kE zoTW8X?mYPSY=6M-MRmZQtYOyo!SyX>Jos}2L?Ne?{6i1%uN?JFh##zzIqx%F|0m@C z6M8X4{Lqn4JAr-1-`H4tZfLD?CDnPE4sE(KK=|u?IZ5C6`S?#OTuP- z7n}86Y}WVZu@+t5u`O8r*o07AmAlsrSGt3P>dF6W^g>z@9*g#sl22fWJy2JoXaZz!O~aF; zGO0sqdO;d}pBK9LNViyxrraB^GVY=QX)DU$U+?HfYkt7G4g6zKcg(OO+bi8gW~S5; zg?tU?R=P`msiUHQXbh~I0^N!JcE#2U7+PU@PVmk`;3$(eHa`)sFeocaHC~Lp(p$6f z%5}2)CkNp#3$aHt07n(m<`;OhNV)SlyQ11?^nIaE;VULd$RA$-XSVnM4 z4_D4j>A}!0dr>ScYgwD{J ztXRR#S=2P?g2f9xuouU!N!fPJ3b-fxo>$*D3t{mz$e!8Z zD!LPg35u=NF3UhgjOl|KZAE4kn8Q8Wip(k~GOM7-tO67UvI^*fWBm%duCDb@9`V=u zWKczD`a5<-7kr>wMjO&9yFpF9;0#hid^{C6i=PEINTW5#&01uTLNw}120$a(9hD5s za1Ys~{8F!GDY^dp0)=hcV)EtZD7$2ZrmsRQ8r#$%&TP1dT zS;hmEugtO=&Z9l$;;?ZhI{flRo)H=VV^ks^j8HjWjvWdZgVN7w8Nb6U# znZI8fN{4fvZJ)9YXpp98E`4|Gr-m~N;u~USVY4nQk6|^cGGRhRwJHvL*~Az2^SyPy z076MgaF%$Nq31DwnBQ4hLV#MF3b@ zQ}e8v9BUw4tp>}Qb;}p=0ott;<~GHi;jdpNQ&x;~dA2iom{@uH)6j{Y{s!R5^8E#! zrWi;3_IwZ?+$n;}GWl#WAT=4*>GUnPdjVW zzU}A(*Qi+<-3mlz{!ef&Rxw&|bzCYA$m|#AS(oHM5E0@}GC~2_X*uuI<3{R4EM#3J zSXYOFIEeBBd0{IErfgwRb=iC`i^|`x4hDaJJD4(STnX zk0t&S9*Gjuh$YD0BD26Ob;B%~?$N2pai&A{3kAY(5QaI5M_%DR5xQRxpg{C0e-Teh(GAeWJnjC+7);CAeB8ds5zfUl-pe$#s!!3l(eRY|m*0^atxga%Zi_o7t%VjWF9 zV=g_OifD>c0uIUfL|5~xcQc+ z;v{01b?e#PMJTgtb9DVv7He>qm)crt7~Z!AzTZZ+2k6hZPgFUOdl0m`}q&;0(m@m;GA7rELhauF?n6wP)uu{&y%Vi;A=|hm6MK>;>8R#(f}#z7Ai_rX0Hsqu|*k1#i#$%(*915W{L?mBh3ByJg&w zw-JVN)y+Bz-)|;9#6Wk(@MNE5K_>SLe?1y`5`P(vqdI9TtP~!W{DYK&CQr?S5B}v_ zv|GDbl7QtR%Hk&V(|bkLl4}=IXI^b!Idz=oW!r3tem!g zAOQ1Y_&GOm&w=r{Df;1==8T8};jC`XffQT>FO!3~-(3KXODdJII}MlY(A%|M(?-!E6dLhH@!!oL54*{V@!1I&aXe_@g_>(Cm|p z5W$$tDnEdp(g*QhYH8U$g5Aqxv^x=gMRoGbFYhJVK?&|mr|HwfrTd-yOTJLL;C~`4 zj&b5Y7=9T3OmZuNB7VS^&ie&|vq^jc3GA$uvY&FyD?cN27NLbeAW@#Jvna<$)&Eu& zbx}@9LEF67SY38>$r~cJp(ZhkFPL`rzx$h)ln%>n$qeO;U7x>mB3iitvJY#V$q5jl z5o{Y^0c@YR6`T(~^3KqyI;B$^!rxK!4AwnNgE&kGlBV`|{5|%9fM|GwbomU;CwK^=YNv(f1;WH<0va~nCD?9 zl0munRqp#wCrn@6$7b zujq$iu)tSE{v@9zF2a@W2O15?mR9oviSt78V8c^O!2}RoV4lBonSCkv{49uktQily z6Urm9#u#Ll2KCdmxSfMyUcYDfiSvgR6bGb4tsC`aiks8g7~Q}};b zpE91~%y=Y=AiD6fs+0i*`AP=#rhXdl2Ug%XOUuzrGnOhd7MVm@-@J07AE1@SadVJ+ z?v1@j8$X?{oWcak;mlruWx&m2jy+`S{wAFE@yVah6#R=osDpLQQVC=&Sht)jW-rzj z@VsWOL|+V`6n=I|kK{4U3m2ot3f9-kS77|YuPfaFOFctDq`FhI|2}^K?}n55n=wzV z6S)`#MPW%#WJ)}I{W3o0eMgxqXR9fpsX0XK-$H%ImF@`703LYWbpeR{Y6V1JdR-K2 z%PO3m9lVo3O?Y--hqB@$bcBir`))9Jz&mKMhyJ+X2JkL!j{nQ(15@{}{}CV3hI(-R z{|z7Zyr#H)FnoA}Nl<(^#f-_|(y4TX*c@T`6eR-gsWKym@_ZvQq|j^dp^yBinIFVa z20BN!>APe~3C-(rD!Qw2W~!R*o^rEHWG>76Mr@M7)#*;z%GjQh7M9p`4+=#{?@n~k zqu^tquQFRWYEyWgK6jWsBVPp{dn>c$!%Qpk6^Xi4r4zj+JuUL>cqSC}Ffolrz7kTG zZQUf{oF~?E_H*b^aXBG;FvD3ol53^u$IMNgVl`f0NH2bx@^_tgU6t}I_5J_X*Z))d zeb?WdWbT75`X(#MncYE%P_}#jp}n|P?UU0ED5Fn)&KL4CDJ@A)`_Lccixm2Em`70G zgnk;d82||qTDoLIDlMgLAwkCpfE&L9fJN`a!dr2D3I+Nh7*{RC>!u7@yEEJuq0naG z9-FdoA=bLec2blXJw1MQ{Z8`8XUPoWeVgIjy^U*~!OOksWsz#>{dZ+gHt^|pUwjpq zg}M>M&P?{>2oTOAAYVlW`>S11=z$@q}eabNyXi%^JQ$R-kiOTLiZKf1MP-)+fpY>WaY$vBEtoi z4bK8gB@Ty}q39R!*>vS{>q`-cScEk)U+7{ly4@qhVM&N>B8YY(rJFe%2XXdb*A+P_ ze**&Q11;8}dfN4VdkfkLGc&Bs*r;B>+Nb(}z2jN|EGnXRGLgCkm42X4Jey4j0u}i~ zd^wI4ksY1KFi6!Gr_f`Ox22Qf3UMzv4(OwDVb|-dyUhB;WY3RD?fIcz&xM2p;^#;Y zpBtQ=+9r@^?M*bu-B=Qk1zuGZ_O4{b6qMr z5J29Q>VN9v!zhCf$AZkl->F7enLF4UkGnT)(O>OImxmFr{)LSh9V0q=gAK>?8NR!} z1l-aK_`gAr6?fNn$>5@l)D@saWeQ55jC41gfGhv`w?|G`QbNpBIAh`&krE;S@;8vC zF!VYl)WL7cCzeE4@6~6YV-VxP>n47}U25o!?1M+u!1y zl(+h}@AK!%mgjr2j&wL#9(e@jc_=auKbc1Ec^#OGT=G$puS`;RI3c0#%L7U**h6nO zOeJ7EyDvZ4hdy+r@{_^(Khl85Q$ioQR~h>7$=X!r0aY-0KO(0peP{_JiFy2LC3gBv ze5jaY*P5c?zhSXBD}Mtd*b34g@tZ(FBcf59WamOdoakBTEM*-(?$shQ89z$4gR+eJ zEzZ&+4$}#SUgdNTs))SYt4k9{;_gn7?+!lSK7A#bJ4+VL_qgLpQ|X@sugWWlCKCNQ z=B5RpwdVA>L6_DJh$XNVFi6LBh57ze{`$%_>+7h4tuIdLHf!sRIH^Hhuve1GH{80W zcX_!2%skMaW^hk{%s`~i z@*j9vFM!aL zS`xqeVB=59E7&$w_(jd13WbT{K{rL!1P9TV95DW1{a?%)GWrq(yT&V;4}^gU1u?9S z>a5+Yh5qh&qwYZ+SRYrA9LwyU*h-V43x_azyC+r+1;C{ERAGW1LqX~@K~Hh58_{L6 z%|_ICIZsq}xj>&}yT7~215GM)S#dtP2m#r@^CHj{vKrhU_#X%B&z7ay=HrvmPa65R zFFu71j!&b_`Wfl1A2ImJV(isF823sKt=7wlwXw`sQgsljI}j|nPJB->k9jHJZuwG{ zZ4Fw;Uf2y0&53Lf1WLTbCtdNlb2CjHQbmOY;4wuGi7SFu2P@XwYrgr0|d?}v>$Mm z{tEk?H7yGwFte$KonhO z6^;-)nK8=ZRr<#rp6#J#9yvhxJk7dF97UbQYx;4G{bjKv;N^fn!!LoW6X^iBif>%P zJ8(8wzeK91#h6#w*xHFj# zra7p&j5&-pa!RTxrps9}Ck>e1`&ae~J$`m3M+VZE7RTyUD)oA{x7c1xGJ6Ntc3VBY zs*x6OKva6{L&us=eeJwa^c;+S`257GqhF%!*iZlC&1dRl_D+SWK*;H0Z+TzLS6uY# zkPDs3OT>t!GimD4DiF~)WKlrYW+pTd4m%}c>(UKhs0}Yc^C`q*0h|%m?v#oA_(Ojp zPb71hOr&fS3$wAi$)sLN2QH9+oJ(2xFtG)7)3AfMo z+#_B&W))__;vBhU_Bc8@JS5gSOqea{k6n^Wjb6sHB)`*_eq1Gr{?)I(C`)A8*Ti8M zk|3cl4Io~kDqtc$(7Q^|j}_VO1O9aL0j@?^;ob;R@tu-LLiQ?=cWzDG|8VX-3Ej*PtJOgyfzwrl=%!PQ^X zZK*jPCoy}ABa9YzKJJJz9gIju^A@7?izI1ohuyrr5_!3I= zR&>v46baTpPv2$5ix*vR`DMqY7u9WvJe2;W^?t!Fh;gv)eqJaq9jvpsT*X>M8D{zu zT)nwYT|4Nrzho49{c?v!{1yASbJ!M{%oQ@kukBo{lX^) zmuHM9BHh8S*cJ+U=4HpHDGtUbTI(l~5$4-g3khN(UobYpZbVuDxm1U|-HFcIXQs_3 zrmt1P9ZR;yB=v;Sj|J&I^W|^Pe@6770lO$$P#lGoTE4}8Sm_iEgEsj5m#~hBvlH`k z+|Plsu7Su1iv)?W+dw$6?W*F6^U*rIH9*p*18NPwkRpqH^ZJ(a6jJPeS0OD@IJLYz z@z1{f>FnZyx77XzEx`T<`l|g;@0M}r+5ak(IQbMNeyH(ZX2?~;{4F>|9`M(Pp*Q>W z=XMS@-oHQNf9}~!!e_ z?F;>q^?Iay-?+EO>pxHaa^oOK1bn;*qwb)8YUrmpiS?b2IiMR1j6~TS{yl9`jf<+w zR0j6iSPhvJ)ohz)wJaGL-E(dvCw_FVyf;~&g##@4ui{zPFDqzSFfe*cVpjNLFJsFL zw=>6Q2gykNM><)S7*~D94EH;nSt>NTH3gM>9ys#v|L%s2--kG0I`;I(b?rUB0 z6&)_!#{(oNL#lGWFjFRkSxB2gwnHGh@;ZgAxHdHL0=7=dsHH%FyAV6L2ieSc_Wue` zH6A>uZOisq;I&T#d-WOmF7sp$+!0bCVeaIA76d269sjz#$ffam@tyX^@h&cBI*y|S ze>k_h%B}K;62`v=wf75tk>kx!2N_&py9n$1hs=9ohO69Z{$)Fw6 zZk7A^Q0*k=5!MFcH&M`Im<*l%4iB{B{k7wBH+db8jO-L9)qhK70ETsu|2A0nBVHQu z-AmJRo@qwvcSmkCP42YXt#f?J;8#UXO{z-#RU6V{1ghM0^D!B2YXcFEH;u11_7P@Q zk&|SSS>lQwKEb{)+a8R~>u4hr9IjHp7-k2Dm%!}Ko;wF&5nuZ6z8lNDvZUIDq?P`D z$ofpFKcMxG@asRq)Q|Is*i_MIk5z-Zpjz~FsuvFM7^-C@C?KVEb0A16{Y%j&GK3uZ zeG)O_B8|)r#99MlzV2P$1?PoNxFFV=Rq*P(ue6tG`|RwYdLb zO7av=CV!N+cd>#@;y+N_z937wL(;fz;Zl}#yM}C&&J{AuiguR%QvRJy?ne%>Y|4;n z2}nYfhMT1M8E(WZ0CmA@dWVH6eGBbCFIwhyhSV|BynC5KtlMT)Y!-{vR$+f$ zR5olg>*_Q*Npe>AsUL~Q0kUm&(?H4o6PPPSrn^5%K8MP`8QptYu>M(Ul#YtyLvZ=5 zg7lKQZINZ^uUq>HHboY8-YZ=Z&4ax{y5i$oaP``{Z8aydYNj-%w0}D7&u~vmw$hZ5 zA3wow-dbDce)>bdV{~8(9f*uaaWR&L^V5rI_&4dB3O0p_mVHKi0W8UxSw_mvc4&k< zv)zMl+*o%3euQcDtSeW*=Q7^a!gGNE+K~l^$QKC6q@b;N_Tl;f zzV5pcV?o_V+UfR1vWmu`N1pC+SjqKfPyCb5UlkS?Y=WP$Grt10?`!)~`KzUR_uw+_ zIDCNhd*#Ju_@cb)-56I% z=X22KW|e@C@xH`AQ;5dwwS5CX_v3%C6SRCJ4hpFHo*Qw=pN$~xUjKJ*+A;1CXGRcv zHxqo!i-ffk!bHU?XlMKbf z))s7fj5mCY(dq*R)>RE9>P|d2_v86|6fx9FRk?W2;T85@m&9(OQp~C|0zG^?z8WiL5UDFn$WRMFZd(GniVcyDuF;~({x$28S$@$TVm}x)!?(Y!xqdUOg>XF1}62LJ- z)gFj`;p1T!8Km%(I1x_HQa(^EqK7g_YixYzE7C$-)WntK77$94)L4KLQ#2mF&wl-I zwY0Y)EbWb}svefwo;gk!D!`hkJ{t{8mDNU0nHegI5+!d=a!`*pZCCwvtIq`?%e+Fx zn(L&Qk&8Z)0ER4-W@L&)V>VZqT2a;Y4iO9r7s@~u3Oz-ry(!?%GJ^!E@&paehIKas z6C|1>VeA9rhnZ2&GCyY%pqws*baED74G`5>e}{%ANb6#x#rf>)#LWRW{}2y;Er}6f z;caNskYhzoUOE^Ec`<^j|W<{im={79m5tM2DC!L%d~3 zavmixo!43H6*_x_3<;jY16i-e4>io}S*^v4PjeXVKg6*zMDZIyUwEbr@e%{QmYxwl z2j%zI)A!pCS3fEJ4S%Z4q$aHyNw-BOk}ba(ql8F(T9x9yo%mtZtDa%Q!tuaJfpvKis`{E-gG4}-7KD5-fSO3HnV zitU9`QGR@W3jatg%&4f;$fSW;Op`14ximzkuuDGj3dUD+ zA780rXHjZ~T|| z3cytf(yn7{rjnzhH4Nw&>QUJqP7@Q}hAy}flMFFFQlI>cCn8V0R@A!_$9-2ZcrmhM zdj9CW@obwO2RE0tqsN~6F341_2gemq;ik7vuWZ)On??v&k~NZ&7{&4W)C z1_Sor9N7&o3|N`mlKWw5PJZ+3wJR_wK%-N}uk_NlpR)1PWXnpBV1!is4c>hhPXvd9 z^>=b5Yr*7LcxNDM1S8U%EI7uQGH=hE%fJjhwhN=TDLxR~2R;zQtN2iv>*GW6xxt6Z zUaYUo72kx)Tv9{s1s`ayLFy&iQ{&lky<0&K#py(c$ybp=|F5)HRX+xdV;gvF-m9|Tz?j+w3Ner!XaaLu4I}dUwIcLn&2@QUY7yHCdTH5u8lqH{%&FYO zr?M3{+{IJ*udSgec~$3KVF;imwFum)7pUkjfY&GN$+0;Hmy2NpwPnb~aK}Cq;l;Wn zmsc=SQ$_ zejBn@AVU|ZyiY}llcz~mv-s6)7f$p^dOICsnx#&$) zd2ssT`C|b>v}T{fEXy*Ish%lfNvNY*g^{UF(H@WnIm)0Ki=3?+|!9pQHfr(b?6hRjA!h0sSll7?lQ!kxLp@^9;Wp ztX~tf#Q~~29^xOTq5YqIC-lZ|Goh#8y2o2_5|Ne3hBVYo7Gqhaxl<^nE?csqj%1bF z4Hp3;bR&j%3g7H2`}dQN72n6W(l_jLz(+6j#KRDI_x6X@DLZe@h;9^f0RHI7dsG-2*P_8ULL!ov#0*vIE)@w#71O{t4Th_bGi z*`5D9MGTNp@80aM%rUt>K8u?3?9&o|md&ur{n}`wv`^qOqISx3)ZB}k-WX- zaD0XJ=%^~U(dcmE16zw0k+xg9VR+3x`xmQ?_MC^cP6-M;-tKQtlZ?Vi#`|{MRfGXQ z0uBE-1QQ`vno2!qY4yFT;IT7i;5FfP;k+eO_}g=YMRDxP#Io~9aN6x}Ts>DPAXY0$knyec{& zExcUBsnQOPmx20Or5h!&Hz(|IN=Pk=Oh&ujS$dJMUKLN4iGicM8eQ&%#|Z7u?F<8@ zB!A)4EAju!vX}nhmw>hujaqiY6I=>t+i4VUX*}fHQHWprwR9cb^bB_;XaSIy41(nu zU&8BDdKg@d3L9m_^vh)?0^IU(qxmAZd{7Bi^X(YLU!gCF!iEQbf~L66p~rT^tz0`x z&-ehwa{!E;GWW2+-uXGgHPqqEERHiYps}qT0ka|Y2j|4Edv1X5oCc|aOz`rlu$_`r z#wtRglxq|YMJODyEzRCDLuBHMIA)h(LL-As!fo1xI?+#QHSSX~vFa97C%PMbwZgn= zCgTvVG}~|edjI8Gd6^jJ_M7Tk_UfPJojomsf+RZ@F<8=Q!-)jzL~Cx9ZnaT!blEep z?PpcR+A`hCOrx>p&*%OX5^TUiG)Te(X-g*_-9S5}#^(So(?3LtaGAb&!@N1(e4E7uCy!~kVL&`0c8zqe3 z32y%yKrgeFVHb@pEE+$5q&!^E*%Du{~|<3fXyM zy94u%;WIDW?aha{k73~EZ{OhPxNaMF2k?Ap$$B(#h2_-~tX4?en8X%iVy#pC zO3@f={`f@ESi5M0S8+z`079%)}HNnR$g9Lo|5F^isxoSFu@iIqO1%Kc!F8M&|sk1|Q@bj!a^=2*6dDMPd{u156IiLKwxtV^=B%1V#?ga=S@{H$2p0ID)kBvYU46Y7zV;vvxeGhZw6}3=yr0d z+$CR`O-qKcoSN{bD|7!`q20o~8(oy1I3ps~3Mcj#dQG1v?Ckxb4iQh_F1B<=?{2)( z&`fdFy}!i@cAmsWkfP7?^=q83%0QF^Tq$C0Z17Ko3g{%Hb7>|)Z9t*+B?Bkk9v)AW z!t9BsN2YKj#Tk+Fe1Hea+`0ECMR1Dyp^Wg|7>b|;@pHB8VNP+n6fbr0@tk%cWMHHd zn}n^1C%6WmQSKfgg~|OWbBOwD;g>o@1 z;0+jrTX#h&9GN~WLj!ch_>=vsZfP4S5tMsSuT}Z)G2I8qo7N_e){~b*@`aw^JSa?@ z9NAFO zI5GpMb5coUYxqi;(@--n%G|4Jy%)iz#adn_(;Syt=}vycds#DA4!Fb?KM7VPK&1AO z+cdo`+aJ>GX1jE2?3S@@J}%}1cK}okNPybd`$Wm;gdQ1`b-uEjO_4OVOr$K zl342miWc57cHZCPgWE)X!d|?YKy+E!SgoJ?)Wfuw%<+wx!m&?O4%2<{Qk*J1e@Gub z!#&P=rUw4!I?=ATlR}Tma^uJeugq=dbF?LCeepkjMKyHc6G@;eDgDt8*msMnF8!VG zQ1_RVBa#1v!WX2}JnU>}q-#(gnleU?Zfi`c`x=w#zQ&}w&nScLE~78PdLJcn9Mym= zT%ZcNjW^UQf*RVXf$hmYtDt%Zdo0WzXi?#UQ0=`U`+@cu?{vqRsPC_qq1`?bHvwE?a>e>;Hf} zNTZPK&3o_H^~tNv-c|JWMdF;*AObdVM|K{&KXFG=xi*XC{It)2#aTw?Pfsj2 zGJoJaB@{y7f=wG(%E>QG3Cssc{WR}emnmZ_eLuWscZ*%~O=Vg3}=Vf&MM?()0 zmIkV&^C1~A(}GQ}19{zo5#6fX+)H$vw*9&zkP85T(LK(6bz7OEt1~3NsETtAc$z4e zL_x1`0SyY)iI8AD-$7$m{V-nB;p)@v=Vf{--PcMDqSa?fb=`BXqaw$aIysEPuGi`` z?~v5=g!JbDDS3h8=u9~RXsceQy8b1uZEeD;ZmFF?DT`>N#MRU9dw=KT2~dV}XnRiy!3nR_l;33zA&{l|d5tpn4^oNCv9Ev;&& z7q_bBMAm0zr`bytx60h_sXUvNcwWW^eSe7iPT8~ao0%n|F__Ve#PfofiRWdIPQ4(T zh#*;|GPAH?zczj(rW?mfH$23ZI&DR2GeK?j**uZilm(_YW$xeJmu=4zS~u~|))$t} zfqlDfv-LY@**0d1`l;HBi}_c(Ch+vS@7`ceqp|DdEql~;qG`C=X^`#TdU+WSt@``< z*Vf9d`iJ#eD!1w%;or9UU+}N#Aeb*7ICjaG{QH2k+N+3Yra}+$HOJZy$gtS!t9?yx zW}lHJo|pITT_5T|4NlmOV2S-_!Crt-X1%6P*cmhQC)=rin)c*{`}jZmOxT0|tt%aJ z8~t0El`?mNs&X=X1i?*O){*T|8aWL45UXeLIw47BL%m_DY^YHgvcI1id$5UL9fry> zf9KAk?DX)!*lnZI!lF4!%pX?eUUiW!72$oGmrTo!ey}gl(ljj_`7qD9P3-iE`N%{W zXb-M6lwUXaDz{ZTOu6u!UQL``l*ep6wgk}|54athiDh^zx+yohFE?14W8FfR%*o!lHeHTuREzb(T(^};RB{=7i_{UR zBpBCO13>bdJ8$O4nJK_MJbrA_{uW$*IN>qjEZ`gdgTVIF_-~@O?aOr@l*XK;hyPKb z8o&2{z+X97R@7{5f{_A^w>|XR4;ll|3CCruI`=1SQczr}vXPMlQu!Tk6GxSrGGDiw zibWI-Hr*z4laYoqca~)L3)Yi|hx@#=U>yPEM%yADJY@VK|IM&6cPNJt=mfGq0T+7^ zr@Yv6IP9?7UVNVHZ>lp|d^VTD<#+I%s4uq`o9znL8NR-w`by5@`iGhAo#7cAT8K=a zQ8q(anfDCx6ho$pAQjrrI!o7tv z&ttmPET?OVp9wLD?p|;763UPFfO;UH=mJCNPtsWc0S?JlbX-c=-aX920X)Ha5T#L*p$~q%dkGNa7tp~L>T^3nqh8LH#A<9PnS+0zd34f zMON3bze~^j9Tj!IuoO4wH%upI4)o`lLUFuT5tC{p{@(RYRX|Qbnw7X|f@se^)AP416Ycm&I!57l6nI)Er8=DcH;ukjTv?ePtNk1%qHebz!F-sJ{}$q~MN;FSW87PM>v zkHf#Q{l4(K$1DHQao+@w1MFuf+a+o-TSlK_Z4zBBK9p`xCB=Qrky zUi*&wimZde1`&9|^Xx}|!mrby3d+e60@T;9G|Vx7#;AiLbO;iYtblp4K7<>X#N7lpxFm-Li9Y1~v!+K-xm0EFtSR&RZ)4wx!QF zp(l|8L+v`MSnZSP5z!;k_!g}>TbinoG;rs^UOE-%7CM}Vm$X3^ntlW7Sfx>?sa!8M zJ5B9+QRg&m*Na~`O-Jj+BTmx*)`eAim(x@$Pn<=---(_g4@1lH$?VZ39g~3I*-z7? zNgf`$-4&CtZ$(FcgXrZ;w4V%%;{VlB$FO9qRu*6L{-su->6+Og)!>KkhdDXMQK*cD; z*I?aDp5oucPTZUxyfdO@GUjTKc09ePcGj(!k2O`BJ9L0EdF7HY^?8Oc60w5B~jm5WfDXaDwYMSnjKhN}~ zP0yES*N+E0dQ}`;J!M=!XR01QKY)|x=lyHq$Vj2p?#vpC_BenOxqGztHAfhSC#Sz2 zjQtaMxFe7DG6i`d8}v>po<)N?f5UM?eqPWD`<~E0io-<2$zDd{NyMAsiE)WY)V$nz zl)h9>2c^(6Wp2*9x&Um{q6WDYnyr6p~~le#}cy+A)I-3_ODUDJik z5)Rh?1oykn1>%D!hop$P1`sTMTR|X<4J;ifp(Bpe=}UY|gzU-74ZL(R#z`>OlyUuE zpk=VN)H2iz~r>mYXyIjP5+1ju?8FZeOT_ z$y6Yk!Tdr769jSi#2cL8{*gx-^wt&P1L{mOy{Q=9Ih;>h!GgVZWMe`1f@6ZKrzT=8 zx;BHlbXlPD2TU#KUic4+8TIb{!h7xtu5Kr90c!38DU<}m4U0peeaf`v9Hj<44@)xP z!NKJv1m`tJR&j_pf-Sf|i8_}Ay|XRrHpsC6Y2kBAtbM`NZ^YK@itRaa;R&x8^7!`r zqk_v1Ew0-T`3NsZq&pq>FFFT;($U@D4%UAKeC9qX^T%vMcz2kj;yP}bzrnOcCZ3(% z0XK_fIHAYl=}@MDy4H?dnCX+^d7m%}r*xfDv6kJ&y&GMf?EPyvJ+|p}n(%rYtz8S6 zzQF^lqUnF2jA{;Er)ZmDL@EynTSME@C1C}Jwcztry1p&+q=10ImARRDx_svn=bwU- z-cBWgsX`B!)Zx5wIfc+&*RD?sKG2K~I)97R9o;?h_9LRZ1vz&YMvk}M^iVS=J}z=9 zvmQ)EN~Yt2=9VOv<)j%rF)6t`sDLjHdgn3&EPvG`BFhY&KQu=df`{{41*XZR+xg?(JF7(-^rq7* zVwXM^UtotG%ij>611RH%wuRQG)Nt^A#cI3JYRjofeQB6b0lv_2uHT^)&kC*6+HG(q zvJM@OhYaE_^)_Y8Q%1ecAO1!&e96okF668U(rG}ZlUogGQnyNaT-kBt5CGK3`}MQi zRN(FH+fZ(H{w1YvS#N6JdO^@RPxc@Y$vT|qUiiK$7|O)W!#O7$;sdey-C+V_oE&J| z^iKB;oh6U0Q~1Zf>8%>LUr^S>8g}N1JgSqhm zZjdW)Zk2shYLvq5nG^nS7FwiwQPYigm%RrT%HMD(x%{PG`_KO0{-)NIdj0>lzW?bv zsULa3__K3fRcV(i_$gU2WYXO~j90qbigC9&eSXmG$o3-cJ0)SDHG7BsP-woe#u?UL z=k5nqp#nJ(`cYoS;Z^25uND=j#Vbr5uh3jobm7b}k`PeOUR#W{ZQ{sq&%{~b97y_< zc&V_bz5Ho#b#Xd0KOcXTVtduIs(O+G(mx%iedE>Xw*5ShNB1nrAWWFN=x`yf~iWK^Z!a0%5;F-!sQbI&%M+hNr!1uBXm1MV!Vh0!(siHL5PBINNEQE_+IG zj?;LjUJP>@zo1W?PD2@eGTdqWP%m1FJ&Vh9rzpEExoW^_gVyx4+MlaB_$Z>f7 zQCGh9#^|e)^Y1M#Z{dpfJG|8;twyU5Y?90qD0l3VxypL6%aEz9Y?LZ;!bm6jbhaBm zLZ`2H{=8S>ZhP}1rn1P<2nZ6jBWc%Yh>%2q->aXKb5XO^?Cv5oi2hfhC*Q|hcEE7V> zIW4{C)lF=Z_-x+)f%hCL-Zm+q@LYNvy^yobmR`?2VSdiili(u>-*cAkM1HiU4mbV= z5>lA-FP*3$lzhU;Kn;CDbc|r*nf-(u(@(%heT z#T+f>O0lZG#bg-ne6QH`6hr+b#ePAtC)2}+#Aqm~ct;FYG_Q1iwdT_zWwy)Us+ zo|7jbSoaiH^5xm`RI25yfMDGN-qT#3vH^^D8m{@XS$k6U-P2@Y2kSOa+-aC9z?6aV zrrCQ_#`kTZ?YvL3N63q}&q{6dY_Iwjd75lA*L(UDPib^)-$t*~s>3t;Hh8JmV1RG) zH*h9vY&U}vO?~`)zXRB97*qW*Jmk?p`m_R*a3WT_ox@bd^R)9e{!vF-zk*-#z`jEx zi;p$E0R%VrAehK_#uyO%OhNGdls7MXZ_c0!NzJ<*W--EQt@q!P?m$)QDNcRnUXL)%}GAxjtPAD1$<+pQk0G4cnvF`aIVR|y)EGYlig z03*8I3nQ{=UBxrjLGQEh#hNDPR$XnM30Y>R5j5w(2Z`{`p>QJG8pJdnEBnyYY&1}k zWFxz@109r~S|e_bhV&B6MW0E>4=#U8=X##4gbzeNsWV(ZhX>>i>C@3* z{r6-qcs8YAcv~marw&>B`3J?ie0xf%7~5m#r$vq>+ClP`<1RD|QB}mq&z0k75}^qH zD0{Z(n9JQ$CMcmqMmm4BU{bKIijLq02kM+aNwC8`{#~!5;$4ecOCM(W4}*2*Q+j0@wBdxQ!xryOi-LjmVjhY$ z=SjEmW`&U}cQeO&&WFJ!wkYYS_>VsKu#u7Q4%7Rs-aR61Gt&2zHL*SEM{N)l?NL;@ z>y06$-GkQ$>#}sH8RgZ7%y2KyGYp$w#ph?3hPDOkx6zQs`^Rnzpo9z7y~+bge$z8( z;pml;UKKs;ywNK!GFQPnf2Z#`ax*=AxFYqBrK@*jv&Qe1D{mUCH#z6*!Zl_hO1BE* zd=sw=OWT8W-;*l*$ypeT$x?ivC9pnNU#c~bUk6LqqL*>iVK&m-HJA={@Wb3ToYDnh z@F^=nzZk63Fc2c1_Y4X)K20A{>)Map^B@S3{#xQA?cn?Rcx!<){ia-NKD$csoe{x{ zFC6Rj=ZJbg-=0He@bvHxBz5FK8B_SXT7ys@yR=;fAz>hmyd0Rb<{8ifh)gW^sehn@33qMNN7oN3h6!ivw{pP%*S55VxRi~ZF?Hip}q_PyRoYb&S*kCV^#F9XXj}; z^_@@4a$U9nB)JM$Jd6 zXNP^yHi1LMR_C6Jo}~{D)bQN7r&O*hqRu@({*yesNgw`FuO+(6x#zcfy-2VBB-a&n z&OI;dMU!(+n_k=nV#-D7GWn0GWHOzC1)#f+QGU@x$zE9 ziBC(BKkd@(bsHp?G~YD&HWZdneG>zU*D{j;Q`5V;$DBZ;d)TCIieH!H??vYso+Bf! z=&MHIyG@+trLi#_8vZTLVNfW(P^_AXN)2%>(?WxNb=aaUvMQFy*&l3B#{r+ z|B!*B4L>6N0%YZNu|55Rv7hRQI;@t-)_SaUvE5noY@=v>mQ9fZ|9&P=O!gM9!l-_ztBqs0FT_G`PP85 z{#h1^Q?xnOGdS2Nz6&OXQ5i9lG(geM8YKf=yf5v8e-D@kjGsIq^z;d#$4&_S;)Kv6 z^`VD@O=DSFwj-FS2Lrts+jGdm!c~KEb&1c<53VjxkFD7p+cS9KiB84C984|YpF&%h z7*gZn*AgGeek2Ol`c)YUkJ7Hx^@%xYX!-@QX1ba=?~B-;j9|U&V2k(Fu%QPVAEEsh z`Hqxy>l4BH8ZNEwl_Too<-0y;`DDP2YpxyLdgGdjS|q(2Z6jclww?kyoxkKCm>4Vc zWam%06#ez!=-yMo9f2K+4Q&<()o|}zm7W45g{oPj*9uy-+7IaZ-HgppSm1H=E7n72 zr$dLl9$9bi>a@D8x2(@wI!CnZ8<4)~#!c6bUT^J*?K?7f_h{MedkTYh=W=o5ritk- z*7{xTbT@k5X~9qnUGE&s8^!lvQ#~*^0O#wzM%{04s{-f;g=Ti(jmB74soO~<9XCce0^M|m3 zPQ!gYiG-rxw_Eup*!VZPzPR;%o?4NoJzZ2U%VC6MZX{bd|Xz9zquk!=1i}e>$jrF!&@pSzbYfsQRm)qDrkXfo{cA7@Z zgVt+12lMNJRg&5q2-bl~uqGHkST(zDe|VnUmtJi(+3SNm)YXmhHazPCSFu_~AR7*8# zi!cL02_#GgayT4Cg;rZ_X{9Z-_Ni?ZQBV><63_~Qk42ywEsvgYXpP#2Tg$xPwfC7z zDE9LFp1)o`A2R3cvoC9}wf5R;?Y;Keg3EIRmka0`(oK5#d(f)*Lm1 z5E}x)?UH3Gf7~LIqnz}#c5lp${9mdQq(dOGiThQIj-Lp#6@!a0+A42`Xi6@=R zu|Rr1hEr$34%w318(g!LFK949%|#pB`%cQbioyraGZtK!WX_)mAH=Pv8c6BYo~FaF z)Odf>`O~RM_&?;)1%AHJ;0m=5{CYUf3d$121uM+Xmw)lhGv^%m#N6KQ41MdccSHM! z8MbfofnD}^Z?;*sA}ZF5Oy|M8$c|8-mx08y*msIO<`l7Y-@t)B%9UN9X&-kPTP-i$ z1Ija7Uiv0K_q2^;o}|>a7y$}U42{-bNUOcDBQuTojBAD$y`7HMHM#yP$LZg|RR1zk z{kyDp|3b5@sxR%^sCKhzg_0{#IaQ~}0ueyciH2T!F;}Cd35|Pl)wCFyLXqf8NT~FW z6V=CHL`5@B<45$RQ`nGc7|dxsYkV^rF}OOjGj_V$KUglI55fn2YB3L&&~`@@0~`~j zw;k}TUHtOp&7jCwbd`v>vQ-Ge^}rK17A+La)~pb9=gEyd?U}~%j>wLNZ(5-zS%<&P zYJ8kSmp7P=`|UYv324~<=^6Ii!nJpAxes{S;~Cy11M)dBe#K0S>VFYYEa~QUZxq}Mz0A5-ZE)pNh;QnLq`6852AJ!|_gM?Gu%Fi$-z`*3-_dR8Xl z^5N=PS&7R>s%K>=E+3*>iHD)JVrg|$#YGo{m4w!i%s?;XQ{8+I(<+ zRk|pJ_9J1H8S8Y6D!$Zy#8Nr;s=jEWmwkNcqe|beo|OT-oKq2`e_y2&mxSj_Rn0zC z^V2FlTRmT)(gX5r{zB62T%KbS*7H~KvJtsgw6-hx^Qxpp|HkSk;XU7l2ctZ)Dw7zp zOsLM(94!-GBf?koME)47+w98i;X_%o+4>@63hSjt%Ob|A8yh)%aH#R{?-e_&M0w$> zxrH}8VxpqCEQNDgmuqgZOtJYzXq+h(l~K`mBM86|B8=v(U=DobztrIannh!Pe z$yg+dk$uD-0jg*TFD5tV7_CZ#9G@&LG9zge1b|ZX1Q}}z-^Q!b|Fc9tNcMkFum1C< z`yVpcemC-F`3pSM_TD%4GXS zc66GAhy;?+*c&@r;OeZaOR&7ZoAVg zdp4mz+Z>XY?JYI0Ya{Mr;XUr--EO?v&#v4VJ~VLlgqQo}Lkpbot~6e~)*EhDBl=>y z>T#A!ROCderVhPivIc6RB6HG+kT>SG1d(52ac?PUO@*UFS-9SHGBwZ7G(*II(_HX4 z83eBlmmeRep`s`OqT=bj{@6(NdI_JRHOGAKNPcg5l~0-`N5o8ITr6dL9)}-Zp$ucs z9S^_KH8A#$;fG8PKvHFBTy&z?h5|Q^3CEKYp;Keq(}BJy0aWlM4N$!X=qZusqRsxp zcMQhRz&6m;QKFk(EPjbJ$izR)C7F8J0VOg^U84$wuJmCgw4~X{}EvT zB$E*Ui52&sAk2F#K!q+qGNBy@pd$m*0s0efu-!ib)Q1zhGNQ*tMfd+t0Gh6=gvnhB zuA&0Lkj$jV0jRzgKsToV8rMt2z)~{(hU)C9T{5t2wQ?ydk}}d{(chOCD|cr9ONf7! z&U3G3CusV(+P3(n=DZ|dq&mR-(ASDI2nH4` z=1VjW+4m9;?B93AYB4cozWWS&kb?!uagtmV$0rv1=}EFjW%VxInDEl3{w!`_u{mku zgPJg3t(MlcqP=KGo=X%zzKw>k80(h#w=y;Vv9!yCdn#)NsWG+9**ZYF*e#wL>v&saS^S53DY%y-9Dy&as1ffPQ}-=5%|(F9`&CWH417MDz89pE44*ZWlE z33+lWZ<-s8i2qpp`HYCg%C@`ro1k?ANou}KNJ^zYNAD(CnAT`r0ansbny#X>e3K!k zXubGxl4K6adOz+XQBnQVtNJL*+>Fy=S`!qwjges*2&-v-V;A1*4BGG~1 zlN$KNe2#?S`pRieW%_%iD$qu zvBZG>a*gJ#ba-w{!t=6*=QUUF7EAg#$hol>JlA{)JOJTgX>Qh)(VGMwnK{yFmL?n! zP$*e%rVqN`^-=anl@okXgCw!fg^9(W*C6RtLa|?2Pgo=kfjBR90#xqQh*Kn62PcK zA*w8T(f<~(ANUgJaskV90h4u(;{&#wA}+=j^LRXrfpQlxIqdMi!dRbU0jp=M2pwh7 zh1F0oor7Od>%BrrC!U#v>MuMhF(leqsdOS?%66<_ya;5*LgkxM!_2A{%B-sA3iga@ zH-5Nr)NXssf0GHjw3m1q_0Dkxl=sblM?_7hGk3q)^j}Bg7)Au9CGNTyV1VuCOZ0{# zcu)vir71|qVXI-$%Y`VtS6=>*;S$hj8Om49T~{z}1XrWeaCJrsS34==Qm~Up5eVm% zYK7<0#L9RdV}Y33f`x|5RM#6yRabA1T_vy@t(!s8mkt9XvVqUB7ki8MIj{V?l6|ub z$U;Ta?Gl~aMc2E4%c=r1h`DXl0hf4lMu+2HsJmi~i3isVpxsfO-fr(fSP3Yw#@k&b2wLJHNN2q z%@q$oJ%DB(1M#Cy+~Oj0a{={7b9TyY0 z8lm;2#`t!#n!pG+_-2QX#)DtCA4;uD&c4%rNERizOr|m?)DRtn*3Lc;?h*Y&e-|H7 zmc5VW8jJo89r4B#P`g;|78x{2nCvtHj}|vBzubDx$tD!KDF;f zNX_Y7!(_CoXxgE-t?529)E4OxSAkY3BC)m`9yD2WC|iOUuq)TL9~#;oW!Za|eT|=& zjJwNr$;Mb_nd9w*a~GHG>tD9rSl!9~SXKAkRd1_Jv9h*t-p>seoozCk}+3V!ZVP?+AX6$)187%h9LBUu1vF+PSHyM%E2 zdp59PiHNB5i!aOq!N~PKvu-;2pMnrVH=ro`PLIE^<2+o=W4wc~0wkBu$AoTyc=+InN6fZ9hD;{gX57 z>jFGw+}*ACC$!)D&f=PV{c8xWyyL)b?>l$bZCAWg^Y%FJZnmv=S~Z(+FU@>@@l?h* zimhyhKYyx>Y-+cv-mp!@DxVp)+M^<72Q=G2v^bas=O|$hp}=l=kkS5@@X4FR&SRuq zHPWnN%Q^7B;}G+6xg7)cAolAduJLpfhsc7Z`HuY^MFNE}*}T7T5CoK=y>P_eShp)cF$S;hfDtUoWR}ftr_rMK=K@S)(ZA9wWN7qleg$Fw zBfUggPRfamuxnomA0A?UJ|ncBYQz2-h zHOG%D$K9{F$zI%&i?Lx)cRc|!6YrdX445(HA z+r?40*hN6FubMCLCd)pz%-_681ba$fOvK;flr+~aHW=2#0E6)4@Vp$)oO1{aT$#;% zZYpt3%&H6!rcHe^tm+)IHfL;QV4m+P9>g%p@9}&3h&gEzpi5at>eS@gzlzo;$06lB zpK4DU^ADJRDF(DB{W%KZ@E zjju=aivN9mxQ0#Cb+ssHpdT7K#!yGu-y}iQ^{T%SnXlpt;Wzd?fD#GCs+ z;P=rq(wo({f1YG@bz+wG((b3=N^Td690->yp6=$N!N`u_*SR~vE{V509AS#DM-UqZ z1L$D8lkpPDfhTQ$Nm;NvKSJis?o(X2dB&$IgV}xHgXt%6xKU7G=S&E12+Z(#H_Xg& z{)PZsE0SHJtLrmB;z!r|@UUv$mtYChvDew!Etm-0)kZoIIO=`1ObqVrKyvnq zGfPZV?H^MQR}0(Y3%d(D%}!&%qew|_2WFJ*dk(Y7otTpQfvYP%GdH&X(QmAt`gzvw z_78cu^^2^XI^{2X6<~-Dz%1 z-_NrqqbvmbVZhG!hCau&eu_V|r>L-d#%gsG4doV|$cIlD8KRl`3-&}OvHhmLVzaql zqnDHB$`404?Ru+e`i1H=dmY#2_F6BHnz%k!!x=eb!N-^+BiU`GM)8W~m5-B?<7aonCT>~c>& zXKUn-S@pb8!o}&1)qEK+$|{BVV+!AOo>BnTOhWUWjN@&bfHVv&D{hey~-<<_zVG|(gze~ z)h4moo(pft3;>6kaZV2|saMz|BUuv>kD%=fLjy`~;oCuFsoyUZi)&S37x zxp>KE%V#n4CA>0cds_#1_rjqqp;&~Rg($5>Xj2OF@` zEL$g6Jj4oNgz%wEW8sNlF#0V)wgGNOMR_Vebk-k-L%XK06TdmH%!rXaT_SjIL zio%1TZtw5K@ffE8Y?roC?-w4LdD6Lcn-WkDk)nspU1}7C9*YfHN>=@{Q1drfnSHwe zQP;(xRZtP$fkS<{rb&ri>cs{4;Cy`;eGTI{K5CbD`(~eazI!;ZAg+}BB!37(iHUV6 zxgoDsBh zGB~apyr#I)-0j^E>Y@hk2JdFT^=@?I3dYV&1Q@LAid`-%WkljB+aCR;*fBc0ccVn- zkuv7C*l8r%*JT{FgMH)n&6zCp?Hkom;ZAY~wtKfr=kvVgAz9ZUaF@95F{S8hFN~6d zEqj8e+9es7>)7h8HwV0Hn(1qd5I*A>%O!X$cCS$bD1QM6$s`t(q$_j~O%N2vt z&B#)##Lu(d(kWk%B9o}Y zB&tTPoB|C0Piza)SB*!+0XvZRSw-fkDaSGZxOg!w_xp->qM=CXwr`(|o>V$j&W z32!+nUR%xchFmX{hmQh+NJ^P}&o`*=RtF!t~OaLZ?&UkeWa|QmaHQm7( ziMsQpZZ5ChAH%+rOQB((x~|9`NEgg9cgav_&Er!Zeqo~uH_RF#%5n2)jWUgSos7*g zjfqx9?J@(e;pVq^jF~apl-XF{vwe-S6V+_2;mD7A4vEYCG4~T?C+62~CZd`guHY=# zBJz&Of1vpQe9bFH0rF6>M64ws>c~t?s2M z*kjKf()B9S1k1v^M!hE^Dp{V%yLKu!D>$Wu4Kv>bP2q!wgHbR_6xChcjWU(V#mcJJk z_S#L45p7qnFlJK<3o@f*jjig&z;RW6=bQgSgba~y34JIpK`*GPZc;!cs_}Oqaxc7qewg)pm7m-nb5S5c*lu%fLWai97oxIturM6d-T4NoNJX$MEPIigdM&BKsPHKP zLv&oMV@sZ^@^JC16pG=&zu$V|oU>dl?9rKMVPB<_1P48dnv%*_@Hw+??`B^ib2~bZ zW1=-@o0l?~6~1GH#mU>A=%pJi=qlX}rJTH1w?>-VM|H{$!4mNaAKTb%EVzINScbJ_ zZf0i3i@D61;>7l0CL*}IXwthmx)cD|18v=eS9ej4lI0U=Dl)tK>LS*thXXt*2>Ho%rIX!+r973s4{mKzCYudu~j*< zD>BO<4(os2ldDxH`_f5^Nr^5pTRWpV6!uJz(uTqi%P_kOw}%FyXtUyWrKI$6ZfzHA zA#wcX<~Tdgd$l0yKo1rzD_bu(r~$vyh(pPM8QiiX5BN%QkV^`!~d?`?*w0 zlnz^+kaUAAWb(;5y{n&U{~=I|nxamMDKP#OIehhWwAi+59FULiP^L3J3mzF$;zL@P|cufQ^ma3qVGXOIN zE-v;B&m6}YOybO7xU93vo5q+AJ9@?<4t8!k>WJ7?wQ-y&bIfo~}v==8`;`@>mi< za(cUdhP>6d3K9X2^P-y#;!%TBIjAp& z06k2g^=ZjX#9W~-=W`?XLV9P$B`}O)j28K9OQP{&ao&ibN0Bm}`P0neJV8s6wVc}? zOt8{qN`zmznG&${UKtlP>*BU>R3c!Fa_|)7cSNR3HuZFk`;@A3$Xq&&Z+zMFE^y8- zrpu7zBBNKNx{MjadWw7*p&@ZqO}OznvOjOMd`x|2XSgjdiowE7Z*sCnc)RMkv6Vg} zEHN=%Y2>orXRxBndhx-sm?j(3W<=SVf);qa`49bs9>N%JD}+5)tOHzF%T>11xIv6& z%o3mSwA|Tcimm&cd6nO4eBOBR+B|bBAwjY>gg-ReKkU=|f#5Ogt!XA7n7i{9U+ru9 zAhTcxvGobJ=3QP%U4&q(X|l#GHeSqakM$XLYj)2@Ba|7h@D&$UJs0|juFB2SviAla zrH}FyenpBh00sX+zjWqfIx{UiCm(A3oE-Q!6%V(v*I2Mk)w+auYR2Ws+^|-p1N%{v zu|z{S_%rTfyf40rW(waptS6 zNtFEO^znEGP%oY z6F8q;pd(#20iW?=sf>X$Wmk!O7j0Svox>5c(DX7pZlYP zAdH*|j3Re;Bxz){j#MaMI%HB@sYnB@WnP4l#e#|tmWyEV#nbd*8cXUrnM`q4`#azh z5O-->@$_jFRZMPELI#Yb28#FN|FwSeGYZQbS|MH;#kp3+XtP)*&I*}0W%dkIFlP>u z*)vcfN|bV@n&8*AOh>VvIQv2E9D!OkD<47c5#hK)x>RwTS<@1|P*0pj%d_M%FBZvi z{Yb{jv4g~U3{B^ReF+WDdHB5yMz3f_x~j+R7nGV5$;QK^iF^o@%6gxZ6niNOE1k6}AePkLU=u?edxgN8XZo^#erWf*M*y+t7+e3f9MN@(B(UdMoOPB(-U%8YibF3cC!=;@+aj#d9x!W zZjiv6%?k(1V!@NZCov+i4_DaDOQvC{ibvx;n-DcvlA8P|v6 ztXh9SM#`fWJAH3c@c`*U8xqK^=Jvi)jVf8LN(LC%t$6|gj_S+Ho>!YD%i1D))EsP# zXLl(ZUp`PER(shl!kYi`o4R7+sUS7E%P2U2D-?X;4>Aj1pLLG8QwF+R31{I}W{QaY zDV?YNN#iO1A+t(y4Hs0Gu6woskm;0JN%p88uzrD5GXP1Kz;R!;ceq5)hVl}R?eyE${ zYP>vknGa#xRl5x^_w)J|FDwUpUVf6K&*;KJk>@-iSp%pgj_VrdH`8>bGEn3W))QpM z`DQgt3--huXWtILCpEtGdLj3L;wuxJqp#r{p@qX1+^?)3JaZC8d__W(Ov&e2q=Gz% zC>fIwCEriWof0T2n-(bQ(Ji`A)moJAt`o+)+=pKGiK+EMJ^pW!ox<=!KoO5)8ULJt z6jC$GgfBQ-Tm9k`7Cy^;c}`x=a9?od7bHeWoBvmKR6UAbwL|w> zRO3wGFqZnp;VG3c^47j$k__NTeMdiOK?LJ=)`2DWO*H1_+g?Y$o`(LiK67dGF*3^9 zjm58~7vfw>ocb;$!u=JJ-cFK?tqoRlG}RK%Lb%cd;Xd3&uNvRB)=Ek7NhnH@Po%z1 zpaCVr<;{JjjBafl2aw4KVT9k)36<0>$ToFSIKkSd+?m|TR&Vqh&BhX^#Vi_ zEWbpFj)>(2_2j==o2gog8d272g_f#8yW!g^nrir{CwO_dafwH+8u8nU?zl}>Ec4Wn zZAva$JVJ8?g#(KgxG$}$h9+Hu$*|+XR)*9(pC=f!W)0`7%&3QJ9mbZ(Jdspq%46eF zOrW13a?QGxR$q~p2Ot>vtDO(Gs5r!Igo+cNy{G~}?C;*kwm;Wrvm*SJ|58<@o9PhB zM7?CSzwLE-unnn`dD-D3XV1>JL%XI3;cLYSoDo=1M2BnN(MCV_@}k-KD-`7u5>Cg|fMTjw-`k1ayk- zpaEb?jdlvd@86_^l0ow527eP z$^FRDRIk2A&SU6NwrWbXbEey?x)pX77#Uf>%Uu!(bI2my^>4Jv^DW@)T3+8?W(Ar>*5lb2YS9 z>rauhNlM&mBNa?$GF8fqS;^~rJ{*K=fIAf9fQit123 zd5ZJtPK7mi{+seCcu7yG&lln*FNPlxf;Ha-i<++X`PBDQ)R()}muxOo!Hbn>&@i#j zUL-GEx(8cC=P0(2D_pYO-8H^HREIU3rLx|~qhzfg=+r%#9%gh0F-Ll*hZb1pBcNIzmSyh6UM5ufh5jU!an=VZtV%w@?5uxwj?M;vK)7u;IpS1VM z4XUHb_HI3Hd!mythn4uwE%vbzU*a#=ac;4n5b$*yRs8K*<`SzoAATKV4GJIbGkf5x z7cu0Gr{9^GX%$!Eh?yp@ljA|AB)Jbqmotc!I(y*Dy4+UERa9CN^I5zYWSyd_T&q9r z(f`BtUfBBYwFh*J6p+G0e0ov*{vv0gDw?`K z`PlC_rhkV?z-5j)ZPIPD`zJ)UaJG-do?u4ZMyu(0aElLG%Ac70-Ekby68Z=4R#8Lh zUFnyADhwRt;9@yi#L%1d_gi}_Y~qpz^8JJhaf z51ww1dE&rs1+R5N!JfiGuFUZ6;@;ho(5D!ZN=T*kPw^j>UDYtFuT>JXe67;C7Vx0< zmsNkqv^)L7U0&DyHU+Pe7y7H2x>)Ly;^g_!NGHnZxrN(64NkipusE?9uw5RS^_67{g7Z`<*M# zQNlH;o48`cc@>l>=@CQLxqx8Zj;N6hq%!#z>VhI(cm25`VzTIjw|Wadxb7S z0e|V(TN`G4ub@YiQ7zq%&;Q!K;A%2lEwZhL&+3PXQT3#iC4NII&t4IA!bN%uDK`vtV*Y}^|d}W&c zlCT%k_4hTKj@94UB+j<3Z@@j`h5}-!B>CUH-wRk!-?&Z?0{;A!Bmo=rZ3x{0{^$29 zVke3AsLqCglU2c{_G&TLQ&daiXT?u>YRbJ4dUcekN7lajS$zd}r&+i7WHbMAtK4r* z%r5Mlb*}yBX|;0mgT2_xul?xxn17S1MJr$OV+F-}^qP3|FDP}QuJrILPLQ_<8N@?q zK^?_dq&aP~5^-h+M)GN+-VYAdUK5u)BdA8#@f>B{yUt>_Q5?Smd*N+ToYu}Dn{uO2 zc?psDO;IE9+gp6t$Hw@h_ml4~xl(m73`>LIVYc-3|l*=OfghjU1yX~lPz0di!&Q|!|%s%Cj_?+L8dsqU+?b0VH zbofq=yNIib*%1Rf-8f_6-iOy#v*4JTYL!<5>u8QMafWVyD;N{rD?WR{WmJW-9sL9N zQ-q4WhpZo`XN3Nv`SxLB35xd*2*`BzDK#cwUf0Km< zsEXts(rZdIWJ)BE9tQhTnGyos5dD26KeECWEioXOtt^X+$UXLPVwfS1|b+-0xcW@$~==HXfz=7V@a<5LwP$|15B}1oVs+2vFlBrXCDuti`Y)|Nv zJ}Tu8lF~<~^i?VENs8N6Kb7*nr1aBy{3@kOQv5n4OQn1uDOozDze@Q~Qu^zZ0V?H> zk}^Q2WUG{Yl9H`c2C9_*k(7ZtOwn2%&?$pdN>ow? z>68;y$|sU?qE0zUrNkuVBzQ*_w$dDUfBKR*@D_>xE*eNuK5$8?%yly4IkbcNagY;K zuFdp_eT@v56>LW6b({d!RZ8yoWk9?Bz|H%Yz=f(-wM72I#}300?)vxuOX@cw&BCEi z1$$%@OZ-lFxJ!5tJ#39q5Sfh?Fx*(}jKL=$!MP!O(R$Q|Db@8H3dwfftw|0r^ZkY! zi7jd`m&zPj{u5TmONrNpa%qNLL>ZJ{EmaCz>>~T&uSu`IdlkLX8uex0Rn@&Jlf9M6 zPCzixK+J`5x+$m^sp6rJbaElPZ5w_kPpst=1C`(Nt3fD|hup z)%9HI=c>q?W#==PFS?!c;EnD&pxHeK(}t8&g&>;(LI%0Q^!WClwkNJ<)mRRmMFq98 zxwM}Lq|tt&^q>*OFPY?6wd_zdX${6ajEet`E&;$RfIR@jGY&l@rksu=6eU=+45|?OVm-WyHl>a zQ?9xb-kd9rA0sKsLYHfxr#1oI@ulFoMh%7=aiXQS_JZXT1mn-^4c7vWKiP}t_3!Tq zHlTx}3Ey83mwNy?0@h716a=_k^}Jp4#w4t&dd%a%l*!H=TmG(Wa4|VX3yMN-I2X1_ z8i)&ybW?`t6ueMFqv({~`cqnook*-2HVs1AVqmDJ4D$p`!A)tWGv07MSg&dmS-_zX z%DyRO-?3`m=qOW~wAdxh-}1_4rl_*b(|DB0aE-g=W381{7vdb$I7UQmpEUOer?y#2 z@9T>usS!}Ej6`}7yabrp518r_zu~lkwr=Css*d1U>YJeq!az)zXsYAYZv|UaK1^M)a)+TLxxP7GAxP3-exZP`nCuJZ6w?68c z)>fU)-Rb#lRZznl7ga@zNo6W?D-eeaj{{j3_d{1d6~hjinr{*$%Q z?l^N&-(zXtN3+VPdUiwV`ybN28!XVP?}hri+!G}0Z!lRm*;E@}&*(1;G90$^M1M`9 z9B5?4Wq}$>kIGQGi%lI5tC;Rx*=oI{#bk8Y703aUzb^O$UafY1^Bc{kjr$}Dm!?hG z+w9dXZ%JlKxK&QyuA6-w1Gx!nZ zvsx>gl=RA=CmCn_FHcKF9S1@w5LOH|5lbPB}e1~F1PN_h-;f%#NwfjjEgY{WHjZPXFt(*roh$HA>yS%lUN1y&e9LS%8~*l}uJxxZq;J zf?BbfGf0UKo4n4{rJ$fr7Gj}=+sqfY2sWwYx6+26HttVvqbAWt#y}~%4`qj@R3lrs z!-z&AZF5dCJHiK%QQ}1Dd=Apd7=Dm>Za_z-ph9&v)hd@0H|kauao6e2)j9_!r4hE3 za_Y)s-CDKta=xN0WJg<9i^E*;)D~=HBb=XEG|4fxc3Hhe!$7|ntT;(8%HhwPC5H-c zv%?!SJ&0Gf-&sg;we^@*Zf*g=6Ji}p77TGDFSI)|%EoRmyHxHKZwJ%y_7Sij8;SCmH?gL7DRQ zs%bwpkt^wghX@0!ONZl-spuT(&SqO&D-b|?r%NL zjFJtY!wz*ZC6(LE-I;PtBG*7&dP zJ2#p5E0yS*>h!%`eO2df)JhQ{DH11k^~Qkn!q3Iv7yDd@%)Ky7(8Jlv4IjLf<2K>0 z_rq=L!v{|@9&Ph)^=~j%v-|JbFSX)}gcUW2O+#79nE)}h;R0W|25His((4H>OLLuv zZ@3`L8Nna5^ZF&&M1JyXteM$o|!KH7gq} zpHsxdaJ(faULL@LB-WXoZQ8-s{p{$T5tX5Y=MiT5D?A-*U*j8D&YIqtp?(r`enlPrRk)xnQ(p`w&MC?K)NF>U3cHlcIv@lZ2 ztGlMqQK5y=G3yO^6k^#SSN|w3?5N1sZzJW0-Bq)nd9BYn(VXh;#>!UdRKI;ocKrUF zDbzVPPJ#6J1lxqw2+ef*^t^H#$D8`J*R@_ZHlf$ucys`EH|`Fhqy(a`dZvUiCDVb0y0Es#o4Mv!P0e3ENT z;;K*vC{7pselA*eD4(BvPv}CcI6vH;zbZ3S6q~J|*Gp5eQKHv-Q~;S+&Uz8?QA&8! z$2C|k@nOaJW^ukfAwTP&>0Ol>EMx%pyygqtR1oiZEfAa^?#c{3AZ$EqWPH|ewvL@0 zXeR)K*%7>ne$-i+;mZ7sSPh;p5}mg;$C{UG?#wz895}YdIlXcJ%s$~xujxfE*Hs69 zf)rswBRFA4x#p0XefFbg%4IvX!&S2(lg(JE)+>u8dI%gdeiQU!O3!7zUi>lef~v~? ze`HqEFe`l4fXJ3m|1hUa@!}$AP zn3cI5MQV7}XHJUG^r7$kTKP4mDk$|+fmQ0GSWFE7#r>nzf{pfKId(sKuHx=nnQ5#a zPTPlcmF$H=I~KMTn1<)5&kVxP{j)9wG}VWY#<<*>F^D1DhD3>*NQf;#33tFRP{J zU#m@t&t)CiX#EPafs8zLnuZ(~O>)j{(mB-k+YnD^1QJ|Vfc2SghAtC4hT5FW23IEy zo#>{#HQP-I;^&Fi?ku14gYz^c%6%{yn(?}xO_$n>N(W$tzxa817E%zMMpbv`by8Rq z$M|$#{U~+n=C)C)w7uvMS?$JE99H3UMyx*BF;vrQG_6t5BUu7$t&d}R!!H-4fMX+~ zCe%d=nPp%nh0Ilgmr&c}`cbvcfst-Q3bKdY=BjHaO?7U*R=NhZh?@3Lwgf=VF=fOrsdi5OsuBjS@@TY5B)}BatfUlB4+|+~&Eu1`EhEqu4;PDOpA@X}H%%Dm6}c07oQ0cK=b|60 zX<7Ok5PVAZk!p62NP*~Y_@kjf(~$MK=;QpcN^%F3b%;X zy8?XJWvzDAD!XPKzDS(Cn(SP#Nd_8@S1uPEeNhcO)CzWMR+$yK9TjR|3IIaR*0X6$ z#tROf2;-}K$Y6x=5DVRAa;|wG>-WJE#@?TM`lP&>eMK4;=aX?2dozC$+EuNyOYqUu zXTfExUsUZZ`Mzq=gq^`2obS|9LK`z;c zw8~ZxxDGxmdt8`6qUNjaZp(U(TNw9^?Re`METg5-BZ!8h%>1i4zJEP zYgS62+?Ld1bth`2s@GPihpn6#slgUhm%IHbXJdnTYUD&`0U};&M3|DFmHtt(+Z+i{FM_B8IjGX(a~S=M?)YC@bK-( z7Z`C;eTMV<2NaaFv@x~}-ZKwd52yjz*djdsHGnLvYB{~8$q1jzGfW-c;x#Mtg|%Bo zkfJWgVM5Mu$42ygR3>M~_x++TPOS~^52U8k^6Z{Xf#CF>P2SMpo=q9Sake@{>wM)6 z6tKA9Bgb0w{k=@N6NeN1f(4E>aUi!J{!1n^>cru$GBgZ>Mym2-VVCEN9q468p`$z> zno$qyLpsNZI0_>V{ZIe9@Mzz3yCU1Zc1(DFKGSNu zJu%y^9TT1>FI(YGrXGmp{8F<;!UsLMfRS$RPDP0l_uzl0zDfT^eWL3qPv$=Gpt9z( zSTy`FKWl3+H+-mXsGq!L1hd13`h^C_vp?i}4$tWDXIUd8x>8mr?%FK0B==?chbJ+ebRuT;-l)$=O#yjwj#E6>%_$3F5N zufZEEQ+{JtHGddqkyq9AiORP^mHD%J)^%-G&$_O6)N`_~4|xp^v`qOmE2lTzHuq?_ z?OtK9w(rS-X5UTpB^}>s`>Cv1<%wnX>q{tXU12tMV;kX8$!XWB%d=RHCN5q5Y&F=F zg=U=~D=rga*Ams#c#-&G_{rD#Q)kvXIk&b;&aN3R63C{_ta<~hMvd=P^*BA?e=O50 z(}$`^+$r>qsWbI)SzQ^Qu-DS!N8Kc6E5eVxOXnhaj8b*#(+YnV9oLMEBmtoqewa7r zzX(h1@s}ikHflKv+!sHAvpOPj6%%QmjuJ@54|9>cWa}Tl{=sqqG7;;3XYgF5N7%1O zeX@B|f8kVTvR+TaSiE@}yUf!t2kVR%J5ySese(osEfQ7Mc(G0Cghphss@7+#AX3yt z{ngGX<6YI&XpsvY%rBfESdR7wGNtT9Pvt4T5dRQ03%_tFVARH65OAEzCz2Y|e9FpV z*G4OhF!F@EaNEg%dUAw%RkgEyf^xFxh>WHj-#zAgGH)n+sA)ZfQ-k@1f@m51q%21X+<_pzGXuqUW-kya#lkUw zMl9-M#(VSrb!1Uu>{jMt>xZT9xF%u;1Q62=txkTRj{GQv(N#E;*4-xkO*oA#f(3rw z)<3)Sj{rhqm;PBLbrW6)@NxU?M3eVei#q;WjDd5{&RqB$X?FP2 z;bdAUy|bB973mMXsr)iTnOeo4Dp4}aNAqXmrINNrUW?=jb#zd9r97c|4Jxmer|t4| zy*%xbr`y<~Fw5^kwR4)NU3wrqR_!bs=@S;P%kM>*FxCC?*7r{rz{I^fEt;AVNzP9m zbz@I7%;>48Mghl(3Oj8Ko$e{F_FDFI!9XJhrpS{KYQErW^Dx!b6_UC6Z1ucSJ;%Ya zxlqj)&4x-B%39^q$2JQP+z7*~dCTPsu zDJB!J67UREv!FoIFAb6bX^>>9XAQ|o>NyF?U|yNIn&sClpWZZW?oq2wEwHFCDvoEF z4(0JmgFr*{=g3@nfDfvgddk1*3!bh}PW*&+8Ju9BlP}J0^@8`kwCSsz0MKP-}vzo%poi}pzgi-CzN$DBvssU;MF5xIfPXnluCLPSs5QjGQx z0)IWXgu--4))NRNMRom}9+KfI26ufQvXHgfc_NX^Qt_XT$;*z*lRZUVZwQwmUp;oZ zE_7$2&@tJu_NMCAs_(#XW@8#KGF^%h<2a#Q0z33_a0>SM3rQ6FSX_)iiH; zR(XTD)GQbnN(Oz^aK-uEpcgZ8e1AFGx;jY*fo=X(jYMdaSW*FZ!zVTf9|P zIlnjDej6=gkYe_t{J-NL*{&c9^)buuWG)4~P^LNYE+zO|9&zVFU1v&#Qa{(O0N}<55*t$!-ClGVIM*H`&ljD zz4ilUJ;hL@8H<*Pfw|?pTM$1(Q4y#cC$~iV+?3qRJ*+ud1h{)7ATgLSP z)c1)hBZ|jryv#{|xj)}&ptN~@uBQlh`I{v2uB=;07%eueQOj6!D~)6kD&2V%koPlgr(FX z*-s;n^Z7l*vg->B^ht$yjb@SzQfZs>0xay3yI_kVt)25bP)NN5LKDBD7AGfUOy8_dAh>iy!bNg^(Twe?kdNi(|5g7>X6xzx3d(zmgJlqc_8d;5v z@<-nLVvP(<7Yy{<@{jg&W3sj8<_p>nXajh{%;7+p1b73ITW{zGdVJ`b2fWECtM}Wp*X2nJes~ zk-|GF%xbl1Uk|jCoG(sNb_5j^DjI}_Fi=kw&|Z)X&SNJhEv4_$kos`1e0V^Aps#>N zgEAlj{Bq|-mvGDl0)(0c6&z|N#U<;Ak2t*ovCP*md3ZXr(};{yDXlW#;Oki^E+`x$ zzp5rnJvOd`N_#n03MGpFhKN?|_SK+sZbGvH4+WEnB$&IP$ z=9j@%NOnto@7Z)EF(G;7D_HeJ&rr{;0(bOV3AUz%QLNe_1zZ)8wva^1Vt(isiiDt` zb%j)0whAQ9lngHvfvak#YL~*|7;g4h$*>6C9({+(!GZB&b;f}mtSf~#^owpKO#46OQE^8lmA!q#kuk$gwm`~5S4TK(Gh|fZe z=_&RWh3*3qB__?!rgACniosgu99Ec(w9scH!8xb#gO>x5UyT-GfXRj%^q9;}$RxX} zbyB=q))w8_cLv{+GuJA)cemvplA??FBl2}PurO9>7mIu+Lsr@y>9#AfPWe`ck03t| zYGy#>8RmZVykZQ74BT@7*h5M_LrrTIdE z*ZFLgR?@*9kCz=|0$`Or9%Ci&aSl50#@Z-{7P8j}Zex9vSCpAKt)rCnDeyJb`5EzZ z)zlff*dh#E>F|!ykz{2YEF*I1XuDJ_?f47Q+iIu3q3}xai$;2yu0D@%*%}8^om-L> zO%dQG35jAivZF4oT+>lnty)onkA|+NHh_)aQ++?K*30)0z zj(3q-uI&XCxhmzxAn)v-cVr@nsT7)Jgub6Dwsqk@7DK~mj(&rd7*?VWs8UQZPyJ1_ z>fVFq#*^GZ6K-6FxNj$mjO%yYtXUL~uHnTMs)=b~GD*1LDak~@X>Ou|PalttC0Wmu zW6PE)MP@jAnF2!9im}B!|44zel8cL($;MXV;rt6Xr3mND6=O?S<9I?+exT-Rb|@zk zwb~y%P4wd{iIFjOY-p}L&-cm8gTBzW)LV{v%L(14-tyF2UTCs<%U5stq49EK)DxHx z)&tq}vE?Bi3%AWZ-*~u1o=O77q6c}1v1O_z5XMTRUb2_12saG(7%g?YD9o#wvq-aO zDs#)_e8;jJTA>$e`$ffgVOo>awM}4F1>; z-;_%2=_YkQf9!{EO{I28>O1^d4|e0RCOXk;&_wSc*;#O#OgDr#VM2=BK#Ij~P@gr- zjtt}JyxWWKpicYIXV@2;I*B#mrdtqq>!&R}jj3P$FV69JR`7o{|Bv;zNuEc`rFXsc zPWC@KJIZ#^4#UsUKl}9$dY#OD@-MQ7TYZBCxI?Mq;rRNrw@3RE%0qc}joOB094c0l z6zk)spDEIrn`0&FbF9!_T*LWo`_W(i$?u-K+)$^+@p^hjtTkeb$RQG|G@D&?>*@e^ z;NiV3*PgMe93W(=Nz}_wrx{vhax+rsSu_OYD&cU5(;567CEtY~8?KTs_!3reyfBnQ z{MzNIZx?`hLcGYy0a^H#pdm|AtlYp_PPgp*dfn&{%9tdh^YIF)L%h+Qz4~#AGiCAVyf6AE&nI2#U%O=tYn&L4Go7 zg(i?L#Wi2ZoU%DK zO^s5b5`l$NZgf}bM9REN4RfB3{tV@TBW$+y8YaK}*pU4R!e!l@Mz|jLSWR@iWIqn| zXcq!v;*?M=Y$iX)BV?Bla^kWivCPn3qxBOqD`M^wVzPC_fs+S*lFVbYZXtsrssmB? z;oz#e^Ww)z`P4AFr|gT2&_!G^6J4q@W1Y#e>mT(2V??I;JmScCnqEbp;R&y7x{do{ zozr~v7%}SPfI#y(>sj~+ub>L6`2zL4Qazugo>!^oOVsnT@?6Tw^<})uda?YPrPG`4 zn0r*ThI;`ReW6j!)go(h-C;+w1wDME8&2>CF3at6?$(dB&U3%jEEoRdRej7O_OR-kK+=-A{J2j29z5!94?w0mruS65f_3RD3nX60S zP)C5QVkH_Tq>BdFs)+Bfm1qs=Y{mRzR|(eyCQmYVI%Q8MnZ^utHQcBGL`bkz3O5Am zJyRw*xBpo3s9CLnz+FfRqy*ywLBVk>=j;EIWGV<{v_3_P)4~sq@ic^7A}XQDn0JY| z&-oQ@YD#W6&Px4Q>%@NT5^?c5mx%5elN1pFPC?~dnW3O2_VsSVB!+3+`8((_cSi|? z6mMF)9SA(Z1&U(=&W6*IT{KM2>BY_WfF*iAPyevLmf#P(i@U{Z^`A}&U&f;2ZH%!%(h9z*1cQ@gp;v#=MF_PTl`v*!Z zQtnmb{@R)(uL+gE{r_?I?(tDo=feL4hA=>MB1Qp?8ZEV6uoA^f1T_$HK?o$oBx*sd zRZ7ven9M*>g9DS>X1j%2t+ch(R$H;Pr+7gS6~pBupdJCG7R4%6j@{EqJyC18Df51x zXYH9x5PQyfKkq-kAD<7Iz1LpXXFcm#&wAE#(XAkf2bFF&_r%g8*(R!bF@X8UVo4On zguHx93B17qvtM*US_B8Qi5VZHus}kFV4kG=#h0f3nV+Sm{&DkI<97eioBFxyzG~{l z?-QHGI+Qt@WOh^f;OH&LO7;vVQ~Pw<2CW0?22m$nZJ@w?WN6?*4B@E8L#b}Ji;Hz& zz@5YZcNH^WH{vr)P#tx(ZXiMVYgN-5r9;a5@fvs%M*8xVPrnp?Qg#nMT`Y!FILQ-Y zcA_^jwRo;_2bx!}vlw2T*6SFJwIfDm>fG&*7iecxxvpO-_Elw8?!mKYf$?(jr;*Kx&aR znMdr`p70jQ@2F5o+n4BLa*?F_TNtIB(JXG-QSkBDrDlQ*YjP;lE^0uthg%99PV%%D zwrxnU8#<9IiV@=4toaXe?jhI$hu`=hm{IYbjUVOKp4AMic$XZ+?q|pdEAGe5P0mOn zI#yCf)x_^_Z+jPG$k82VguC-TU6m0zlo1})_9==$&V*a-tLBYe_7SxJB>lCnnishd zP5_0cZQ+54r={>a=nmYsQFLR70eY)FXTPERl4pv+AB5+vwIkDQgsp6%hN}U^CJYUkrYmUf=jt zz1|%nI7#c<2CM>d?QqjHIR&)i6S}BDd5!wPn8X!@>@jPt{Y+cg*sB`qi)6Q=>$%)) zbu)7pLMl*BEVH)Rlk>b_Ly2mFDr3=9+})59x_Z2|4TYBD)Am1W8^?Z$G0NT8L zvqV}VQR3RjkJm!@RHrl}+PK#jepBGLgF0xau}iBtEk1)scj0tB2%f}2(DWiSLOzGC z#EMX5&gHv>?JsD*D zyN8VOYfUz6DabgXo{3>TUJsomXsfsyY21ThmX;{EYF=ny8txuXcA@H{RL3HPUrBqI zAD)&#T&7~~S^boQklis^P^sKVP zvFY5iE8Uxs-pcDe@0~D6)c*Rr_0yCbuV;=D@sO~nqjmdV3vXB9ejU>zZ{upH)t&MM z?A`Q)~BMzLV175A2p#RxvMy zd4K>_*TkOQ_!_wc6qncnEoCn5vqGKM~G zg(whQ5k1r|G=^a5;W5uM7=q8{x5p#`79cHAV(MfUT8-`1(KJ4*&< zpmA9`oRHn)P(+?>m5dgNaY<75Ix=;Xkr4-KIqxc}XH!b#(NjnHS#|AKb0&>np|q6MwRGu0)mc=#PmJWHx<~+15s^M$nYe8V+;B~0 z0%e{q0fQKz$|C3;QS)vUQ`|MfeXU$cRX(IDJVoSHqoNx)-Ueza-JrX26?BiLIYnbsBJZD@ zgVs{R_r3d?@Wr?bD?(=+ktCn+tc+0dy5!f;i9|}frl53qI4I>M2Rw58CF@-oV$$f% zcQ(yTyTmW_Cp-(Yg`$c= zB5A>xKm*oI5J!8VY6|oAgn26^3+`FExu>^-_N2n_u;do;JOd*8WATxy&zwwNVUm{< zec*%n`wUlTev zQA6BZT_GZQTEhbAP7LfU9VH9Pj?SkFtMy@hzFnUm)#vH@yi%WU)MsT!ql@%;73og2 zpAec>*=59mw?@N}Fmpb4-Q%JkWz5wg-@WKil6XqbG=r7spQNwYplith1$#rtuKb<} zIV+V@y8TxB=^seT5(N#PxTY;B;V$xWF6BiGp0UKQoj3N!lAFzR!MwL?5?UBCIu(t2}Q3^ly9X`o$4}^C_QqY zAyKLcuaD=0Jnl`u@`7N*iv^cz^0c}5rTCW#pB8;-vvfanqU%hO!?|$CU!z+h=eRUJ zlvl!Q4V8XU(@E4MC~uZ)5+AY@A7ledR(4wcZu}A0t?kqd_bHv4c4L2E(b$KivAPd? zx3sqJvcZ|Xu93&&1i3e$KcTzZzuw>2;S#82^PeLx9*Xt*<8n92(Gd=fcRk@^%Nk;7vM_d8nE zu!u6ZX8bk!81@sP?IbOM&2IQU_p* zmU%B(W`-#v1j7kOf^CgL_GT_;X0*yi195K3oyg#0n7-9=lZ5(6MU_2sx%1)D5wBA~AO&qM*m07@DPwhf~d$rbu8Z3)z7j~#!F3A+m(vvC0d zdzd0Ks|SBDrX6^mYlI?zO!i3q8had)YrXrtbSj1-G?b5F#AGAj*ChXr7lQeY_Jxk8 zsS64^7Y!jqvSTe}Jn`XtxrTd+6``;5@j5=9;@I+~R@c$YB3(zOqHj|X?lr*0PA0Op z0tdFIp!vb{quea%<-fFw@2;q|w$-|R^C7sVWOQ)N)N5uJYzdzgY0MQTRKccJ1AWKt zpdoR}L9~S$w{oZeGcSHC8oy))T0Sub2Nx>mbm;quT{F&OY z-wrr-OzNe|!^i3TNW-BMoM=ME#Sy5IC_o>WPj=?m=m(Dt^63Zx8C8ew>?~eR4^h+d zXM{0Uix`z&5JK^{JIVbqNzr4JdfXQj0>bCJ-IJ4_gT;;aIni8cvWAK)n7CT^`=(Xg zBH-m<<_eB8+PZEYAQUkisiwv~v7hwY@909Ta0lvZw(YH9V+XPeAF6cH*ntfEP9J-! zXx9u~{P+iee%}5^S?cC2@nbX-t@+TmZTt}6IZtmoG$a`} zX)Ej^6xX*4v*wiVgozW!_mgkJI@O*$2ZJx$ewbe1b(5OZu-0k)CX&7y34d_f_%tf~ z4Y0>lEmmWx>b;xO{B~#NPW(=IGEXbK!m57IBGTu~J!n?JU}Zgb7VSj$pWS#dUKNVF zNK(FXAVj6xt?to@7IL8X>BT!!*$2i0&k6nDF4S&Xvj_m#cdz-S{M@%@z5G10=3Rcg z`yJ^TW-+p!QkE>w&~qpZVbfMraZsYcfSdF4)CrbtK68Td@j3AEbQmoeSovUn56|&$ zD67tsvuvtJKp*(Sj)1R5SoMrTg-(2c?ovu_PDRI%C zV+h7>-EC$~+FL@1Cby$a4R%Z$iwlBD5!8MCN6vf2+_Qi*NbTyQ1UlKh$Xu)Ou zAADM*w22RrY`R@4^=feAi6hYWj?qa@l;qmAIS?)s z))wR?7UU)t40kcYG^eVD5jNv8AG5_D-GYFN!I^xF?mrm5*1hmb#YwqZp(B6NIuU5m zkZ9kb3f3*x?Jt7)6akFibV{;2O0p-|Qv-HQmVKGENP$?RKm?;XNdU(9V7kSb6HRk- z1cQIWUYGl=HD%YN)MpD}`s8Ng>%x;)XF0cJcZ|<2b8gSEu++Fc+gg~HxGhjK-HT|V zM!;$Cri(|baGIU2*?WC*(% zd|-oJm-T!eWftHf{lS5^KaE^(=G{FL#`>){5EkdRH@zHe9t|e5^sMmm8h7~@I-7LP zsmOBXu`C)!qb|+DVDx9&MdJ##EE>)N_RHon9WL|AaSGkohcr?sTTpo?>cJB6XTX2z zCP5jK{!0j24e9^btLf1@#+~i7{v3>QmaP`NnzDsfE!vUovPO0`_7Z32FRPrHomI*y zF0XP&4-v%4BU1qCC#d5r+e+z*$|^TUzk$4Y!~-kX5*p$>@EV`EYKfmHf{Ocs6U$df ziPkqs##)=`HhT;|E1YL0@M9kco#tGX-7z7%#F{WlHiHRyiMl`~;-SQJup>J@z-(0I zZ7FYQx0?N@b;c3)A{`KfNukR=W}2;VwCb%x9G^Ph_{#|eR!({l_kd!N zKmriI`5++vm$RN54=8|>z+GDYY2-j2h!!5$%k=O8~UVqaJ~(Ap5$uqSfhm<73%UYEgcAAIEH`e1Na_g{wk)TCPY$^xRMCTreqqvJ+YFg9MNh$q08(KKIv`dLl(Y=#ijg`${`#9A8s8 zsIEm${5eZ-;-$g$nW;{kl->y$Zzjczn)(W{$Ed6 zAhTQ4y8RC5G&?Or*{NzPxNXdGr=lU6Jo%^KqvcclTR`qGTG#zX=v%iQfq4`b&P^Hd ziomA#DnMn6sklDv=9`?;$+E@#i1eDb?dInl^RvtR?2#WF`ElR|y9o_}8 z059jBU*T4na#AE>il_);lqn_0*oIqd?xPBGWd`sFE0{tjL?LF6+Fm0dIQ9eYtmG`a z{BS^|YQ)kNVM~Vy5Nh0y-cNpSmG8mgU4%d9fyL1c*?7mj+^?OqHVHW?-csRy{!f9o z5r=f^bGFF3N9i_{il;$t4yW|X2gjU+k*E{>4wiwA{XPDoi0?#i;{hH6;sp2f=l-}8 z65)n0KU;(Ms3v7&Amf1WZ$IAq6JU)~yz*}9w_Z8>Q1sB4=f+TXu;{Jmp_3NmT5m$h^A?kjJ0CYP8mEP_=AS6CCoI;Pnh%pN#*u)O@(e3TZ;y9&_e&3I2Z#PaTf zZFNhzs8nnAxr2$1XfncnncX-^myO6RiEl=pe7#5}7UtRGN3xvlYs>8MXUQ~;uaKLa z@l&{Tr*l=cZcmLTvqxVobR##g_PpW1u+}|fJ{YeaRc=@Ewab*d;tAF9Xl`G0o0By# zgIR)HbvyUI^|@R})JjaBfV)snuX%7GGjkT+5<`)T1?zWOJ|z?8isYy@=Uc(GMSPX^ zuQBc4VH!MplT(j)HYeJEuII#0sfhhgT$jeAAydiFWF>qJwp~m;=Z4*L!}Qc&Gnefz z;I8^i*Qzu#OgjPlK^^<3L%ZS4k9?PX9yVSi0Kw*`>j6@^A=OB^AgH6AdS9H;|@uv;4O65P3`o#3pJ~r5-y7G(s8QX$?{Igx3 zYjy8%Gq&fyzOM&v@Q<(IqjJl>ePX^Q4|h$>fEP#-9Qoy?8F-Pe;TNHD!846<3e4sI3PM27J>g zoVYkH@mn0rmV~+I%{`ALbGi0&BwllS{SSNomj$B6VVVdlk8cYacxOpXt6p1nn1@+8Z4bDA^Td2f4Z^5|>qwYT33 z)4u9lO3e}1p*3?y!VAa|)Qj9WNihpiP!?CpLeSN>$((lbR?ZF7cv*}5AVQOfMC7oz z!5Y$?$Y>_~C9yDqO{bHb|9Vo1x`!YZEL5*QRyDh%Qnr*To9^aJKux7agE>dTx~l?I zu1r2}a91AF4*~dWx<>#)VyIW^_BUBF$TD+pq9`Xm zIO)Hc*YK-O@lFhXyEuNkuaqbW07XUq<+{&n6mvv$UG`+Z<^R|&-f2zz*e^Q3)w>F+ zhS&GEs)jo`83k3j@|c@JP?YL-GB$FFyr-a}ek}YL^V*cdE+7BqOS0D|eO7SN&jXyA z7N4I4&+GXKq-ktk)$dqEg7Fqg)K%GbQEs8c9YA6iQ7Zr8?el3$xA8TZjJdU(UROG)iD5o-Uk|1h|Vk#?qt zFve4%{nEFVbFwM{5+kLmQW=4&3YcH<_a*D1P@_Q^{#4(y1mn}*@ok=bPvbAq-|Ip% z4HhxKXQe-MNA&i9FBBH-oGxc=(LQ#($R+$`$Ib6C{H08H;sSTI^sQPX_b@?M*kxrZ z>l~`4gISe{&@O*s%&yva)^cD|DQi*X2?6&HY*|`PbvJ@-;y18p>~(><$LI#Ov`r5K z69~08JI(FS36OxuRl|jkou21RIc`Ay>jfKv6Ly@vU257tP^ELh(k)}J!Xm9ZSfUJq z3}kjP`cT?=j{euu|Ib>|`hO;l8Z+Kf{Ok6_bK-hGy`N!FfoMg6v9|~6UXZThqOOZ* z38FqDsCiugg#_ohqBVf*N51`ltQz;()($*mVbuo;xwg zpQOCYv4&BS!+xz>VvdALnrq#Lk96O%2a;**;!HuPYLl{C?ZsmL~LrO`fL7V`xymd1=gz3AalcW{q`bu!P9=V;L_BlS`zeg4LP+SQ3inrg z4JA^&6GT%1bC_m47jP;@7de2Ol9i6$)8i0Glg!RDXKgtX1Q+Z)jD|LF|~&M|SEH>O}y98_e$b7#;T9H+TC=e-#Cg|u-rK4-V+|d-|skOJ40eboPz;vi44_ zV5D~snY>_3w!8m*Z=$q+wtmrhh@H#xe*?kYq3=c${X#e5uoX{qO>%TG&=jF7tU=Mo96(Jwq!6!{8G^nuxH`}yLdX#~m7 zG-=^jS`ZDe%IUE!azS|n%3GNTvIe6dCF*wVS?b%-$Ze+#cT$KOspUc**Z6*c6Q3Ed_~+fgP+8SVwMrA z^OT!J8%C1d?oxJzHKlkK_p>NvEeL}u6&RSfx4efMimVb=?c_YWNY-T21>`B%LR6Z* zd9T#Gx@sl3gHe3RPs9evi>EUCP?`4JDuHtoeHFUB;$L)|kW6&@Ms9&bCo9$Mg0yZc zJugk`^4fQkT^?yqMG{GeLZgwHj!MgOpXT99I9Iw^l?R(Rl>VTTF8RaTS)W!ZAw;@M zkc#3zpe82jNYTbu(aH@LZweN_OJGbzFHskRdqc&!)5~5&{xf4DprJa2So3SFV6V!V zT}9+$RB&8AiRfwXlrmQXx+(2)mcF=ax-l> zEw2imrinH?zn0XNe3b7h2~#T-^R%2a;`%ViAIh?zobcdupztb`feuGMipbQHEHc%1 z-tJFk{6mk)z_uYGWvy2E8_%*Ma=&b~%3r(mreuk86tXwjrE`)g!!>12emen-%sMP7 zLIX+HoEv|O$?9{T3B}O^3>N`x`>RDd$7xCUh;4_2D;a)-|5EakQx%A_CD%{kb~Kk~ zzrgoIczEyk$BBNH{(WYwloGw?IjzsTU~?_GQnbQ&2f)OU!ej38ZjTfobmL{R`V z77uq$`4(=9o*q6x_9g9Gu3xDYl0sKW36sR_YEk!51IpEc?!z(%$d5STS}#gHKn8$8O0+2S)v7 zWW-NjJAmASjD7=Z5zz&}mwm3*Y;u6dQlAON&xW-ny5~QvZHxcrD`Z|LZjha$pE~v( zgwJ!Vp+3wTv@bMt$KQ9v25s2!(V#a6y=JWz3;y65g^{(T41cZB{WsMeGrLn&EH3cP zevTXPHTTOcvbEj&Y-^jENz%!*PBN*RA!~nn9pXTU&o5oz^BjPzX`W9~GRq*Ek@s=F zsQNbag$s37LgzChs*6(%Z0BqN29*_7V-vc$|72cpbKTe^e4}C(>v?deK1n`XeIr`x zux6A!xj{HV5hX>`^N26l^e`{hmW=jb^lE0p4V?y8v;SDqsJ{9^yK#lxYJdz%ti?8Y zj;LT)qJ*2RE#66Y1#SMFBF?fO@@8Qhu}pr;D1m_*52U;#4>(jQ%QD(2&&foJEqhk} z)*kLEaab^A5Cn)E98+nx$#k~4N(!n6zLXKeDvH7{hYzXOLajZoD%3kZ?M5Qw9 z(1T}^4|lUJ3>VLqda?cD)l{942%RGI!Omn=$^A{DKD#1OC4S1H9sX(Izscz)yo!oF z6f4GfDU>M!#xU7&Fp&CUFt7XtRE0R6Hf=fva6WLQ91$Nh1F&%yvs8NL+^di*f_uS} z%k;Va3Vb*jMfvCG6M$MJFr7~g(K{M^1OjVp!m7k-7H319#X`)v_3$omt^>j9mqh@)^f1Qc8-n4U8^-Re0hqJ6tCKS9}7mtmjjpl?i<>Cy>nL%Fb6Wo#q zo0`CKAuKE>|61k>>=vFH{;c3&ctofAI3stWRKayApJJ~H|6cxt<4loi-cGER>hOP^ zn#u{XiiLB)zblW%5wNXQ!A;y{mv6Rddd<~42)?qVV24%S7HrXj_snO4Yi1ns7rYg0 zX<;a{(Y!m=u71YOIcU$^JiBw^8z5&w$4mvY?W^DLJGpWWz%R0RSQ6RH1$OmjduF?x z^R_+n8LtS1$!`kAhw*5aKOy6(yEP`>+RSHb+#9nkTA-MfbI5kILTln=61cfpZkJ1s zU-lPNw^=XGM@@9OHEst5cCbr5F@9|M3&E%;!;N(s=*avt)yGBO`!1#>+R-lw<>p_2 zVLl73-R9Ex@Ve*@m; zUjctD{5M z;q@x{Ga)N-W9Ao;vdoMGPS<7zVh_Q;s4r!_Me&##i#pMd5pM{s;7qzJSkR+{&L3<# zl}?EFuP}P!YiAcseAgdbGFa1=(^=b(^u1s^10SlCk~(y9E(E|W^93hD{2WmibeHS$L*Ey;?^&isOOHDVEj&6W-v zCkSgC%?rY+8~SYRfFdmZ(ggWm7@PBPusI_5FI&tD+N0TH%O4E3+(Kd}t5N!fzcu{~ zCE7uXfFoM`=;7E8$TNGa07Gos|33_j&cZU8^UlJF=I2uLBZ?U$7Mh=N=BL8^Off&# zn4hcV#|B@@$|7Y~`wg-{i)Tmg-0t^K)`Vow`x$l9g!eEI=DLf?h1oMW_ zj@QoqATC~hi)4)yX~#Q@%z%r`fQt%cG@V6ez{YW6XOS6jkr{B20?JecoJIhw|mYH514CXIrH#mQu4=bn%r6+Uw#g6|~pIS1M@lEk5f_R>U+}gQZ!K@3NSS zpD<7?VP7hEGq_|S8eZ|r-lNf%PL26nW1H|WXLwcRG0hRK`SMR->9(ZB(MWD4e$*5{cGNa*nm8B@C%n0T(O~NBPZyMftTCx z`TSNi7O~176psh@$?iMuN#d{V+n@)u=2yWgdG6=KHRIsorg2=w){_Rvz0JeyFNvXs zWo;TwyRz-fz>KH(QFm)T+F9x!oA8EyYl7KU#BN!(ln347t^K|479sBF_XkwY)}t2* z;UV#JL212HI0Jk}g+TE6K{uFI%0p=>HX+ZNP}bRx9?-uDg3=QVN>4B-J;9*#ghDd# z&7kxIvxX-al%8NvdV)b|tuS(xqV#kFc(gTp!CpkG-o~Q}H0H(`!O=iLN!l+RrA?KZ zZKpKLybU)$Ip)V~JEbGdo7r|u^gz3`3<-K<+9=q|Y5dRqH$*MVvRHxw!UjKJ*V`Emt}ckQ=*=io^o3UaxhX`$U4x3JDX&HBa0H z)VPC=s9<@r0tqV^K#w>ve>iH0QbCP7C9Q&~QUP}H1Wo+fHNMqmj)m=^qVY?=GaYB>c zjK1ruI|mytG}|71t-q5i!WUn`p%KvXLp%i^J=lN4-})D98?g}|UUduUo~Uq)TSCO> zWDgPBXSsTrt;#E^hFT$tfxWrtpXU0t^t?CMIZ~Z}2|~U+v3bi{iU|Hhvf9&g5_O^n zicibwB5o(TR`H``!%hhe))y|;*++m$(hyB57{fg(+Ndk^?Ut8~az^paRGGG9nO&(e z1H3X@w9F-@j3}-e`w7OYjfU;`{YPIP=(8evvND~ef`86BK_c;8f4~k}gqgl705fWB z+7ZuB6kOM!N;mT}?W;m|)=!)#`2y8Mb3U$~#=c710if(SX7kjzU#i7i-IQ{KJF%o+?0+R&_f$FbTf3(R^?|`xX%*#e?A4S_rIbV&6DZ-ZI zI#XGzC{Bltl@K);mbkm|u!7TuEO{lN zF3Pd-M8sVw3Z?*FAR1WVPpUbJr*Ev3qzrJ{3WYU;ZC0oQ7dX8tm7Rd;$<~bnG zu*XkECS4rS^z6_dB9ksE)aSgApF9~(B(op=8$VG^DUQ@1NV|U%187EO>4Dsi)PE0_ zOJlyN?U$pXbdYw=6LgDvtZyjYv{sK}A25O%6PeE{Ep%p`1u$#e1EU3RvK&Y5zObdj zHQ9-G3K`F~W{ncxFkCMkCfaZGuCw&EsdS`M{tn9U;E0%Xy{yHv@s`PIkTmNxtPOUW z)WwZ^aLIAyf(sWnx*0swpX1Q*v|QQFATO2EaR~iRgup$A&@eYp~SxYb}WhTf+|;L#!cbysUfZOnd?)X_P)ov~r*h^F1)%J>X%^)9pm6;aoTY}{@D+UQq+c9!M{NENQh_0(CC zMMFL7n@RaK`=I$z2p& zACmr=fpsw)Yo9d>9k;2XYT6xayP3u_HUNuo1913C5cEQs!Q>~_OP`%_FFE5H0C0Xk zI#eR+t^hb-HRKF>W6-DgHfcmFv3=nMF=2)H;K^2EpTJx)L;*_dLw(MX;SPF(+`+b; zl2WRiuOLg2Kf3>}=kDTrZ~{TQ(9K6_$j!@B&efheykJXxmOZ4ypE0=5DjALsz7mN} zRhhW3!u{dbbp_fb!#gHsV*g(nU{jQ@i3Qn-@MfW5+hwVh=5VZNzKeG4l7Kxm+iH1` z=B#@j<}WDAoi8hJe}7TPY(7i2_WnzKgVM*9i=*@^`H2J@&VpuYHtj>5qHiRQ0< z6^kvYHREL~J2^L{+*$%1Ou459oa!yWRP;3gDTxNE1V@9K1e+xcvOxG0et}&ea^O6U zijf27J~=Mr_g`*pXe-~+S-eLYz$LZ(*l1CI3r*gg^d85Ji$*$QPD01y&wc1YBHd!9ImgJNvi5=jF)z{UZnag}xm*m|;K^3N^hRY~D;|N${A-O@XI@s8Aq=UG6&8 z2eLrLFP+FG8Hu+-WmslFP3P0a*tE~-XE@;8BOp2wP&6AKiNW~ONqE~2ORgWwU#26Y z!!lpq&DdximxSmvQRzK7+5y`m;H==vrz^3;z%sT61r@Y%-r^_t?1sL5js1bt&JtZS zvHN&V?#G_}!}V_DyHM48&Y91S#XYniqXzXCr!)!iP?m#=QT6B4iW0MXJe^c6mcH~i zNzXm~SvUkRg@_T2fqvnE?)!Nh<1clG(GY479m2xaxX-mKgTgfvIp_!m%d1N zjwanKnnsG#dhxfVC3pe%9Mjm>QjJ-Qw56eaT1wjwnU9{E0WP-4SGZmB)UGZ9e?&9x zJG|5NKk;L_-dTbGg?Xdz?ecB3`y4-J)Nb8rNdWYnPxpQ)FVJF+`>dC~^M^fP!2O=& z9q!&JKjm4SrEEzwFi`&{MG@Ku5c6Uyhys~&&xxTyJ`^SI+qiUrKl0(>z?*Fg{6Op* z1+UmxT};cu(~%ie7r{^C$DneKlj?3PT`7ko&izd2tmv>CF1&YtPxdcqKSuwyk~hCy z{ELassy#~sY({zPDaF-9m5qbN;x6}*n*dIjvz<3-MeBPft(GwI+WgX4G@mPqly1G` z?{IJBCy66n21jtp^z8ilK|Z%avW&LzXXgJhFbsf_MoH=Xjf?sv%{h^@=I4?LxO^LH5L zSCpR_`z|!OS3fOHzg*YDB+8-=-@6{%7kWYaIY=w(;Y>zn*277f-927f)WzqmhklZt zT6t;XOVOu2Hwt}PdRs4jTAuPhGDZ1E(ccyRd)AE3)+PZR|Lh0a_{*jqunQ-$!{D0> z6F~h8x0!Sy)rEfk>B26cVY>$#=uVWv%G(LPS?P{wF#aMj%ni1E$nI&)+!?*A&}TwG z13g$|8ci&?p~5}ovs6&k-;oo_=Pxd~M5=SxF`+t5e8X0=nLX=hgqX%li(+u5zc{ZhF=ewD1R; zh~F-;TfQ{jf~r3KpJv9Z`k35mu=6#y8%SJ~HnN=;nX~;-N7hO-71=QvSwp6bs;-Ux zC9S!qj;OdKm4RqsWf|BMjoB038PAVe=!LC2ukl{5)fRR+*m{%+Ff$v)TN# zo1a(B&ldBe9M+Nc_BteKQPLjT1iAYj+w%)%a@6FLK8c%D6BIIQ`k;h}Tbw&g4j zPq$2=o&)1Yj(69})PR`T@iz=k;{gXX&ik1Y-9(ON?}tFAQ;PZQ6$fjLozdFgZGdeX zQ;V7L@!q0C;YqT9u3x>)d7NrzNw!p%5)0~`2fc;M8~-aD^&whiwQ~NN%K1!g9{h7J zNBE?QlpOVJiCAxv3wx81O-lr*BQ4ZDeQox)#a-i2>{6WmmK>gAaJCbh;U$`iY*7C;vU~@a~PV^hV!ExldBJr#&)4AtY zx_56?R(8D{XxI+gMD1YCv-}~{^=iqBJs+%=08T7e9j&Xvz5f}*GZPl8mCO(kAr$>Dg+THsSt<#sPu8r)I*U$UnpR!b+iOK`6tCME*{ z{jMJ#LiETdX`{-$GW|ofevn40+@2E^zLd~jh9__v%)yC{fI;@C`MFgUm8N2afLHMYT5(<}U>>_D zE4XABe6zbwRvRlHg9MWYW=Vfkjbl~0p%fpr?Sa3rS3 z{Okm)a8yy)4hobnckFIxvQ@s)u`4y@KF7XVA8-&kNgp2O;Ze!+gkw+Blt&%={Ffx< zL2G6^)=Uzjv*~89tI=6}!gw3krSnV|WSb73Y=^fiiVreNEu)))bV_=o=^q1NCO^9W zETV*(x{zJ&s&H?=+v5a`TT3iYXfLEr;?vsl_YQYBr6tSNf`H)%@fdBY_CNq!n{&uQ zhv?V%*sth9?|v+3QM{_c-TS02P^{}@OYHsbby*8DXv%6U%WK>TK5tcoF4LrkYuxiw zNf&6+qcv`BD(ReLQwvQ~FNFF=HN(Rja;Ew`}GNCx&_`e`OiM zB+8$~YXMbp@hXaPs28jJ@?DiR6$!cX%F||>e@y*};++&VsK>l-2HqJSB!bQFa`NDA zxp5~lS>_~sZfrG0lv=8*{b18ycz0K32YjlzX|e^I#6yZO6wyyvA+_Rcg69*!zWB}h zcsWQGCrT8l-ruTEE_!hQSS1T)aTkR@H=zT&+K(!8Y4cx1ZU z46gZWvg)BDLM@bz7-x<4>$2{D{JSNd-=A93O#DHWSM>2;B}dG!*=uj9fWDOEik%o% z{)j-o!rWiZQ@!PJj~0lmZ)c11!Kk(n(28?ZLqL>9>Vg4ZWc>#HbWCLZMtLwHR3dCX zp&&PRlCAMN5QyWe-7-%L!{shJm%d2*m3ejx$9*}Pos^#Hv^0<^r62m}5Qj&;_bpZ8 zKQaj^j2KVKX6)7-i_Am&3h)H_!ZdT2AoF>Hz>|tUytcnj?%^tU=aVE2IgSCzzS%sU z#Mos1c=TG&&!9@;*|pT4cvePIlc*6>jm{QHl7AjgB=F--QX+0C(}jwBI0xgwEL3ic zM=&+>%=YEcQ{im5RS`K`IzO-c$E_U2bbk;LjNS6JX~1lg@*c(v(Tug_7|7@W3}$;a z=7k1!EZ#(Ku=O9_v$0TKH_NNF_!)jW7bkn#xmf0r;Uzj3Z{bP)MV^zAKI^^k1=cI} zJ&#SrR^%s_t)p@@g@BIOJxYXw#BtVJv}P?fvl(oI5>-^+8;UEMg%o-98>d(5A4!GyV4#_GU?X>wLw2 zbbx%Rk0;E9g7sGHc&YNmuEb#^*zcj+9-m^jNS|$6hMLxMtvN7JdY)}X4YFY~6i61g z-s+65l9BVzX-Q;3)iFMvnPqK52-UMOJJ@_OW$pFx>j3|YD{0VL?edqMx#a`WWM_U@ zQeWJzsmC>M(YHO`+bZvO7r#!k{58PzXE66};p50j^mKhbt%wBCG37zW&5#1~?Rfe2 z;%3U)`qgo|r5?|m_3kV&X9Y(H;N12T#6`h1&Hv=PXI=6zz1LE<_S?dCd86$3j`k(Z zGrjcZVz7z26tKazUsBoSKGKa$+-Vv8d}>Ch!WUaX2D?Q;)4ZQ1(}5yg46f;o!Q-sf zP9rQmG@9YGdZgs)*`2LIUNSO_xJ;y}Z?9wIr7TykBTXm5|FQ>2WR+mkx#W)JkOHqo z8#-`Ibdeww(4E);nOZ6d3uq6ReL}|*dyg+>*jxh%_bR26Q{q-nQD6Jt@KV6L-l@2j z&@4I?mYiB*zXu)dW|}IES>E?vT!| ze2xal)xHv0ndy=&3%;zs!IZ;yEi;S_WUy@%%^Tc58agx%mMJ85ciU3`e}fCbW;x&; z9TP?kNymiysLEhM6TZE;*cIeC8We+*zZ#0i|1Jr|h(PgD>ipkAab9T>il_8lFABvQ z*BU6^{@9UFY?x)rDGae$mj!T?r8Is}5_VI`@fGU`-7LC)bg1=c1!kosSJ5?8<-u;9 z+y#9l?B1B9u)De!0eUg;&me}uz?A~KKgq&VtQG?47zzZAC@}uZKt(J=uKva>ekGWv$uc`CnOYXm zI-KPCKZHMerEbKNrA80hQ@G*!YG~igf`pa%+R>o>JrGEsz3`6ME&ms5{pE>CAe<*l zwU??ZmcFps0B`4`M*{El8Od_UkdF$yhcnZF_d77*D}gsuYB(zJrke>k8u0!=jUMoV zxTySU;GM-fl%0LOE+ioa1`n0)frn>-7zSO%$Ru_qe_#qe^mE?0w4cF>@QHm<_fHD* z_}58AsYJF|Cvv=<+Hb&NpL-jjInyXQ-klY}q=?gU>Qj9)PfTX+T}9u1gb-UPieJT> z^_GaX|6Nwd>Xp)FYAIE7j6s%VWr%B$%=*FZ&i7#og$=jwm)_Y+l}Ebw2p;KH@Go(k z6dW%+>MWS4A#i_5&d=>PfD=QJADf5K{#$U3G5VXg{*dUZ!hhCJ6P7eIp0_j@{JNJ5 zI#poseY&xpkk*OVXGr|g&p|^Oh5K-StzYWvul1RQ5gO$_3Os1p0Bd&dPOgw0Cbgn- zo`^j}t?ILhyumf)IpJfIj7Ibv_^cdtIAJ`MBp9pv7gEvTV8Bo6mJT@QlismdcXg== z^P>+0Y#Gw2A3#~jEUfoy$wXn?c@`Ae_6rZOc=gzvSG0XYzYHG=x8QT{|D{T_2dkZ+NOaCC3Uj5?3-F1ISMw%L@Umnpf1Kf?I0|aw*aJsXIK4YQH-Okpl z1Umj&_Xd5yd3qN5a&k&XK9#)RH~JQO_{DJ+ssX?J-IeNcBXJ4NasZ#xa{2G^3h`4$ z%#BgEC-EOBk^v96G0rYNZ9WNYQ-5FiMrVuS5?PIm!oEii%1Y-96V6G$_n6-ckP`$T zCka5#by{1W2>4>#sKb2%)uh;;ctUxKL{@I{1goK3J6cql5?L=tb02aK6;#;E)-bq) zlE~`A;%ld2uK6M~X`o4&)GO3Ln`NqyaydG?m;F=;TUoNsW1$z6+H|f8Ysx!XL^hKl zr-?koL|l55io`=U&DIbQjGvr(oh7eXhTJ%`nb!=kZ(c%7Pox zuHdOxevd2<)qTzrhFsXoB!8!X$*jJp8FUzr_Spry z>a#j^?F+GsUvc)9f?W%+tU&!R)ln)FX;P}M;-#h`$8E7 zRR5j|?_5_JzlLo{DNOV^19go=Y9hDEBKoPo_uQXKRh~YFQ=DxP<7%(1A{}d6f0Yxl zRB?@*H8-KbRp%TMNaqR5CqBTOc^L)o23thgMwD}j0dgquv{adRS^&@ect9N?_KKVs z%skU}!MpQ`6yI&HxP6@Gh47e_tl~2P9hz)%Kga?mkWaQ%zL!p*E2y1days0<9`w4= za2|?0W|$swUB<-5ug*~TA#xwcWa;Z4pr1xZ{WCSm;x=^L(lI2 z33^^gO=o{>y`AxihoIV6!N>KF3ARiZ1l^!8$o3Gl$8%zdqJQily-TB?w<nL$FE8GW-GwG zf(XrD=VmZ*2^)aB`_D?|1ut(+)ALWee@?^CSx)P(8&&$7DR=>T^)4vZMpvv$z__bCw|VZMO6tT| zD0C$`Z_=E#kCF3jS8fT&d85<11Qt}N<`-j0!S!xeI3Lf2S1OvsFZF8b&GshQ^qU&S zbjAJXlegP1yLvr}-j0YnAExBi7+~cKZ9$l8lnz`Yq87`=SSiEf^4dp_Ds+qYseb*w z=t2GVMqSRh%aysoXZ_OBj8fF?-$e!Y;Mt$dzX`R1Qxhmy(NS|?xST3by>ch5fJLnC zjt^g&>3?rr)`D!*YM;xJt)+OFOcLE{nD#k59`Z_JutDkw-h=lw`!uv$_khVDtQKM6S5p znV%8f-%*m_*A{_9Rqkxa#(Wy;D4%5$tIlg`I}E#y&R(%Rv@#2Xb`BrbVs@{AY8*djxp zvKY>+|G|HWKq&dn_#fo`SM^;$`E>m5%U{lN)(l-}Msz}tp+ie#I>X)3mww3yU#J>q z)oZT0h&+v5GCy|f&q%k&t*}Kz9Xj5)SQh=<#Ewp*4XZ%-G6aYs(>3-XskLsM(|WHo z3&FYblT2=sy9JKUXShG)x1QhRCNJj$Z)cA@Jcfn~^CXP-k@rRHQik5kCFAoG8i?uV zPSk4HPa7`b8qbN|%L;SsjeNr@2*>E}Glgcq#aoZ4j}YezFR^zZH`ARju8e;4i(e_D z?|!;N(+x#DQ#XO!UvvLhF?YE8XYU&VPSJ~~bvOP~d9yyuN)v!Rl3yYIj2^(9mKPSX z1c65uy=FUT`gfTIk)5@a(gFGM33bYs-}A*;fA0d|M|9fjO={cUB|nHdVHv# ze=*t5zI-7?1@FH+Sjz^m^m2E6 zst6&QJr~}^-38J0e4l@*ZLj0k&RxtFdTx{xC{EZUK0qjk*l|Ei+|gC22?Dq_xU)#j zlI(hvOu>Y;pJ=PXHh_cwc*r2rZ?`EjrN^7@?Z1#t3A>x*Z{@wv-|JtVcftVXN`mUs znETm|fUKR%iI1u-9w)wrMUJQJe8l?K`tthJXBUp_eW$11l50CJ9{@#eq1SVMCI`*A z1q4&5^qXaKCO5qJ6~z2*!=>Uq5T>jyd%^w;=3f-&0{H%wCEoa8^!Zc6P`O~!O;nY?)rkfeD((`UXu-GT;bA9Q zttl(Km`BVQ4!zRoj~zXU8tfd5xMj=q;TEFlQZO=#YHzUVn>?ZTV^4q#S-65}dYmj) zxZN(#we#)gUmiWkH|LK4HW6NlGeQ%4Le_XW-LV=sLoqWF(Z6xldcnEMSZvjaB1tVq zFN}6=g?k>si9BtR(Cp~pFM`cOsLn2aK_js={}=7MkH4l=DS@Y>;?2fWK+1{XX6ZAY zw(v7UBhlOC{{KvBhGPOR5zEwQ(dz+MP@Y8>F})hd9-_!fm`9taJf3>VB2ld3&}p(o*>KmWV5U}FUYbM zuoy3Lo5|NXL07lel(ml%c3C$5_QGpJLu;_`n(kCTN?=7bNGjfJM`ely5>|10(vjun z=>GS^XD54G{)BZn4SwUt+Jch7C5Yz}u{Qxam~%MTCW>AN>zn1&X&1lB?Qj@8k+2EU zP50A}6hwIEBVPNZ!6o055A7Mo50|c8P^^N*s~!Rc#io!02d3q(QU;rlOCe;OhA?fa zacBHPE3;Wn*p4j7#t0JjjqrXLiID~P zhJ{hHzYtq#ASio|@QJa1qg7-#YXiJQ4+QFlB7AvH4y60A3lxV(J6zlpFr>L-#orb# z<0}#u3pDdmea^&QB7w=0$bg)zNzTN!e`*WiNwEqU^^p^vhT`#ylYI`i8?3$zt}I3j zY2-qtn@uvm#H+xIsy*1^82qSuYQmwLH!nlj@p#AE2zeW~&(GZDzMZSt~Ah z>qN_cX-NI^d;@_D-*8iYPqGJ%NI5~x2i>1^nW^h$(OhW@Vur@rKlkv)>R|XH@5}bA zU;1baQv>0TH=7Jdw)*p84YY-tiVEgr*)V75q15XgNE2^H*D)S(`_nJGxE+Q{`f;%u zc^<6|)A8TC#eW|t{uopIqwFH0R*l>$$8OB+ORwQX>_)LdC3YLfIkA`P&y`v-HcJ}5 zC+q8#-++h>GgLGN`?w15tIAD1EdcHm7iqGxJTuA#++kb^}E0_$u&V~(I7U6`X zfDonKb#KbCVAZ;FAkHFJw6?*XsIwgwak>c?-rc=JYGP0Fw0e~Oi9A5mzp;h5&Ce8# zvPa~Lyg_M{_ztLw>oh_?vIu07g|+2gX2giTliX}N{B&QN1?-(Q_kJIq)NKR69;MM0 z)Os(N=qwxh1CK`$YjpR#xW}}H=QH4f)>HX9{}y}MN&Ld02tw#gNkzNSE&gw~m79{> zidvhqjO(wHH5@AKvwmk{#2RdVh-rvpp-2lK#I&n2zpc9;5Ii3qhlA#=T;KY+|K6ck z-$(kKzV1)xUH7*QbQh32K8>Zn?B%l=N2L$|XIa5@=*^F0oWnxLtnEmBmw>1NbJ5}Q+)n8%A{@?ZYMEWb; z8l~Mj+WaKx4?_6H?4-P_ZHcIVl<#rceytCC30>zzo|0!cOztK{{LAjUuSu1i@i|e! zWV=ihE7`PV=-cA1DM@|CYlU7et~wL0w|TGJ*-}@xz4#j!NP;S56=#W<>ogJ&u#1MB zXc!1xk#kTM#%$Imb!i|DgqlUes#EmPoUmyhmAY_9^zVB22I6*E|4LSQtUP5az9A6asfmb_~lH%cRV_PsgiaJ(OU$1haLMHM0x z2L(a*5!x~!*#6N6kRjC!Bt)*~Z^BlcH2kX?lr0&%S}vXITt^`#5FGq|rY|*gcghmE zuQd~4%og@9-Yk=)nBq>Oi6hsu+@IyS0x)&qA|YV{NsL*JtsX+YJU0d?JXXKySfY_JXtq0GSBND+wvs*vmQG}m+Wc=M# zB1PlG(Y#Tn3#B3we=mumav?Ju-Xp7Z#gD&8aI=avU%+X|kxXaCQ2`_axI!^^->v<8 zW?6FX+9e~CVjnLCG@y&grz>*{l;makER+Q6ZoDFKb>;pGQnJ$*I+Zg*O1~HLgLHbb z)6kRod!Q#LJFS=8n-UYiZ2R0r?TN%o!dA)RHDXJdjlT3%?=zt-V)YX`-B^(Jwg+qK zUu%$|6yue;kJuUkcdS26rqQQy_@Op)D$5ZnQ0*CV$$?H7Q#~65n`ZKeI|}EjECkf~ zMy3k8;Sivlu5Ik-d3>Tc>#WX zz{#Do;e&qtPr_K-9zUG5e`$1+@Qa-L_EuFon`H2}@GFlySRl4!Jlok@F$72ZzHw$Y(&)eM~FsCtk zS}OK<6a14o1ui)N3oS8TcH8Cepl_3(zdJru#m%+^2W8C0t9eRredPQ{yUx;?6Z=o0 zoRt@8xR2uf@-oSL>6VxA-is`y#RcBW9=XHDbsVHNTgn_)I9#46a9m-wJni9+hVCsB zYRt80bn{taley|1j1a6<XneB`J3P@rdA`wc*}CnWGQM^k%!XNj>2prp?LQtNAe@uULe{I7v)t^;r?gDt02X1 zv+li}*qMc2IM}x=+-X!L7L3M~S4E-%yTUvUhKJt|oq(B7fqowC{-sf8*Pb=nE*&HF z*9UMSV_YJOnbIYi%(>aasyLET4gtHchWj-q37LE;=Vie0;V723;9p9#r|8>DFX(Tt zzJjPjI4W0n?;{FNv~#4eLK2Y2Zu$AC?3XZmUiike`?qKpW{`-?kXH37d{1YkxH$Va zGtj3!=7)1`9LCH%!i@r;G(o94`3iAU`n0xT+2r`o8T>~gdJl030A-A+E&{|@h$ zl2xva$VwiXuW;AGg2)_e+bXgk3~ux5TJ^4_J`J2Z?wi3TaR3l)-02H0`;4b?=Lef5 zdU#BxK^ks7Wtllr&%r4W_36np_Vr|2F81`MAwUz|k_}Xv{tju;j_~mU^AR8gTmDSC ziPRBxRf3h;FZzz~n=&H3lmDK3=58HbSfc7ANA~WBw2}Q>`gu4boFiknYm5zMJnI{I zc-%L`1LJ3o4ewlZI#OlV360JW*oN$LI|kRhQCT}3DP|o^nXXY3LCamKs+f2<0}w1Lv~_mDFC@Z3s9n726>nkiL}~oN z+a6pNKCWX}&dgNBZUCw}nG7~~Pd=r*@k)iUQM~v1lQI0Z+<$o2*KQNAo{fh8noi-; z=JO^;7-2qOSpIZ72b-39%diKM@`$YZAxb*O-t*x}c-OdIw1L*rGlXNuH;iK8%;rG2 z@6V?nuyRI<*H`LtpLt8Zht4+&icZUKsFM3YOmUo+h*v#5Qtm^Pr?deCE7&}HSJ{2{ z*Duj0tUgSyO|&$nGmmknWNpx@nzuGwNR}j5<>rQjVP1F|=O23TMcWbl&zd82je7Ov zJmQ4sH5z0RD&}Mi_GJ)HzTVT(TX>OMzY8GBHsG{AM$Oz+^>fdqN^l~2s2`T>zV_g= zTcTUPh#op_t?0k9llRIhB49+XyeHKj&XiMQ)C=i=j&YO9cjUUQQpT6oqXTux9*uMV z`sY-SE=l(2r_cWD9w9`bYjip*d3rmN|4Zu|&NA_Tlxp!L_lLA75LotND-o`068Hx? zQ~RSlx4^Sk9}pIc9W!fAMy5b=e6kja!Obb}E~$wy!|m~t+!4uI8gz3iYwZ4b@Kl77|nBK&P zycEVqFsKuHHcXoR+@p(Uul>j3*+lJ%`}wqoKwKj5Sbi*-xj^;F?cI6a^V$5;o}O1y z>ly3Kfb7a2ggJ-oLIz#`f7p8$@TjV*Z+s>hV1U305EU^>5VS;4h)^X>kO|2o;SxxQ zNl*!1N+YITAk2Xv1SU)-$>DH-swi5iw6!g5t>Og;_XKDXkZQQR8U!&Q)ia%_0c^M_ z^ZnM^=gdqHTl+rW|Np(u_k6Zw&N=(G_TFo+z4p58DE)K9sb{RGBq5#-ku$4NoR!erz$%xlKW6QwOH;#i@{|Y z(x-LY&tX;od1aL9Idm$SW z>wUD3BAzqu9K*ZXV-rYy^e?**WtV`>=(dnf`V=Z{jo?ecxt|7F%f0>A$a$0 zd9|EA9sr4gehC!hH%|n4kJ86T;O=DdHOn3tp0EG?Ns&nB^n!|`^Ktga+3(gESlNOa zLWKL}K_+H=kbj83tTn!1LQ3y!Z-{U`iE_nAqQ+$O4;!E#0&8q0v$C;iBEk}cj98B= z=?(0KczeY|>`WBVvfA}b%P2~@NLw08dzI5{`Fgz3>}6WIK?)z_$2!s%V#W!Z(|ZXl zcio5i3oeh9kK-%ERHfr-II24Lq23a&U_~3$)A=`&WQ2j94NwS!&AmPb@KDy54iMkb z<{!KhBOib<5ejHkZp;Wy`(Y|d%_ z6bwMv{^>c(gB4;EhO;3&#Sxi`ei0j2M+%7feYL9Qa%|?gG{l7f1WDi7Aj8KG_=gEF z@866nw&Kt)<33KiK6xG?0ZytN_7A4#kMmXm`w8GKA;8F=2eEDbAiZCc*i_ZW+}Ko+ zj&1dk{=po|xzc--PawOZT?!_b`TBe+z>GAmRK$QjiE;%0n%5bA9!bVRt{HvBNIuTn zJtzlgZJaz5eV}EOFW}!p@UNIlwZU4)m~?n=g_shOxr8=&hL(ksmd=}+^~r1+x}Nv-mn%qac@}p1q+@8 z@niV+0DrinrDK&(FwdY>(SZ~(>9r=w>>)-Y;V3x2Y=-q&K%VcX6Sd|UN3)wHZRJs@C8ddvmaZLU($QcN*EtVl5oSMse;lV1E`YD36#p-5 zJ~$1v?}~tlrhI*nK6v+P;{uC1yOZt1INKapRMhbT{XEweRe)}`AU3}D zDRZEz$)~IOrV12tk(6RBUiCliqb~PCCnc{Dsz&2$Xwc5mAY4if3h=T$rn$!er_quh zw{>6u);X}qT#LD5SIj}RIZma0zQfSEvdrq1i0X*g_|}P40!Aj_9||sOFtO%Jy&tzg zfQF#$S)d^ZjT52oFtQ?N008jP_-H1}rijBLA|muGGBWbA^W)-IL>NA%DKltM=J+>% zhkjpGp2xi1m{x+U@74CRp-ik;pF;Ayjl}$CHIqE=bvzQKYJ#B{xqIa6GoyIsh{ZQ_ zs|FD>B--AiTGiXQkO$Y0E6x@d#5fSS%@)((?<%@c2s3c3xWZ^SMi9 zNXGi82%U0-5fav%=J^Wqiiu_p;pS@$xFJl&eLGQLBiF)`vU7WeJz9Pq9l#L}Y(f`8 zWf}tQB_FZ^AoJUaBBsp#PEIAkiC-H~#|tMShQv?|`?< z-S`Aws&!U5iR6@n@v3>oQm<9&bvCz~!|~Pihq+vgoQRg~@>I=pBXal#Vs!=qj1T~V zW+@+IJ?VE)5$wxq60-Vx>NlD1KgN3wm<6c3hwC%0HG1z`heEK2b+)njs{bbai+buw zj3I7m^St+M*nY(}d#ea9z-bM`!L&e+pUZQM!N3Y|9Y+HE`^4bgw81q0fI%GyX*BvO z`lovcEFw?xax7yCmmiujhQ#$8vjS_u3UuKsb#P6XIVnBO8Rw0jG1&JAs({5=#Y^aq z=5e939mW%w)bc80k`M6^z#LqS--W;)w{U>qpj+9E3}8~KZEg}7nA5k50%$V1oj*k1 z^H(|>8;+JS4pk=n_4^14Vqp1zq2mAA%{_8e#c_7i>HI-)bQ z8H7ZH7LaIdcu>H=YI6+MZTbs)xVM_x?m|~du63eM5Kd(S>CL5T+98!SWDKBeXB~H8 z6zz5BGK&i>@Sim*ri0>m5v7I*Zt(notTRcopC8~V^;lytaLif+whW$#1$t@do9lh$ z`20owhcFaIfpG-qo@o8^-C}lxX@W8t0g!TX0re08wW=|EU6ZofT#x!^0V9sizYCo= zeWv%$6D-=}zu{2~OZnVLnIcjYEEu!xzfqgyX}gCXqE#^n6iG+!L9~xXU2H%_$YJQ~ z!sJ;GVA)~D)wh3d!+i9F1_<1ZP2~${qToZY&zNi|gPbiv6F6pg0U_)7^%^6OIKB1L zkMA-j?hs8J;pkvN@ztK_Jk;365mG;dj6r#CG9w51H>xY!C2U@Kjo7^0U*eHAuUgH0 z_BO20vRe2y3@gxoENBQ2xeyZ`Lvk64Uw=3VBWwAMy902a0AZeKM+7-d;i)1r!Goy7 z*}@n&MNfT@sS>XDl6xKSdp@;$-tF!0!KA`JqRt=T`P61^bxq*gMxsI{^SoL~Gy(b<6!Gz!BYgJd8m%temi=QXdLh$eWhItUSrRL~l-oxTHE^rwFf z`i(g6PDoE7)UmI(Vi{6XL~u*FY=Z6$m6fW`f%yQC1O`JPO%8tAdd6$8I_?T?2Tc01xj03GI9Wl>0$( zueoW@hU|d%>?eB|Lr_Fa>M-=9NLdi;BX?A;2Amy69oGO;z(-nFck7=L`U*C<3#dzx z%KZ+uvle`AR+Q^H-fP@61V@ldO^sP+b@lQ;N)Ooa|B7$eucx-}p}y-8o)&a`0$I3c zqeJ?SyQNJU&4{$=fbv24XFMsF=@<>m zN%WWoAp>|kg8e|!h4bfe6!np^ z(o7;^ERuF32_4vh^NVnZUl-?++INjBs@Z5Q+8nS##NJ5M#iC*x#zA8*3r9t`IsG$4 zfZ*QyNU4YcRj;S$s5-gC{o)T1!gW}=18~e-37pNzhF>9H9Z6Cy7gmTZAF(KlL-x!^p)jp04MCt&5;*Nh({Zd?-iz2P3)_I6qh~u7_dRhe}UnkqrdUxd+sbY*bdl zE`=NP?3pD(DFpcu8a|k4?u8puPPCFuHXT;{8%Ne0!la{ccZ0)*fi|v<2;OUK=WpV& zQ$5wd5{IDuR`cNSsgugP_3+(s>`fh{`VH5z@ zF-G;=dKrj?DFlZxV!Oag5@-Tr_JCe7 z4C8dQ@|$lU#ue_hG*^0ms;lxaqDi3bd0J%}=oYtD*_Zl&*8CV0{np=o19gU+rLTdc z9S>>xbFX!xha`Q%E((1r->IKmV5Kkd`inEjX--2^!e(0&cE*?7RKf{d% z((7%aX(Og(n7qu>8p{wrplv-!n>WM>3jha`7Vkv>&I=Di{q`g1_#_Zbd{aGl;l*3K z_(uQGpuC9LM`Yx*Oqg2sO4wVqOyu0_IuSVF{}`T{>ei1gArg{j3Wf&?E?Dm(>Zxav z`3CVge<(uzG$!wECHc7OG2Vj$^)7%B^rR1D9LOdXy;nPIjUxH*Du`umn8oM;sCz|?L+HW@f1XHOGL1tqu$eC)@ z>leZ4tf+qi)GrCxl~bGS$kt z{$8tACZP#j-wTTZ&^e>a#@CKEMkfAG6!Qz=Dx(|vg>jwywN1<{Ni&;(ittT?poqo5 zuvJ*;hb=FQhyKWEF=1&gq@h&B3Q9qdER(%VJg+#9NfqCsmHlm^VAJ zTY~fVU>+G4NY&%<6+9i?q5+i$gg^w`Bhh44ELH!KYH}WPXU4_}(5WhYhEcQ(sic`R z3f*oLD#B;?^MKJaY&L2?JGd5sC}Vdn`o_O15R8?CN>>51>*KB`Dq z%~LnGQz3hM%8gd}3!}a>s887i8D_;=B;wj*uuZsrS$WU%S$9|$dM-!GH+xP<;96nj z0?D3D?o)T7(=GjRTIsL5jL0_?hYfH6Ow4cV(Hpgq#yzL4RA-?8)>Q2 zZ}PN6z+Qo7LCtGU*juqzF7&i?fh1S0D1QrEwY4$Ol8Vm6CGM7%JOv6|gzkIy185Ca zm6#pas_2jQ;HmM_r6BYf^D(j~!n5%#>*F8<@XMG_Oh5~<5ayi&LJbKUP1PMl47pZl z$T}iMdM?Mz8E#+%DM9DpldvbP1MsYj#n(dP>--GgpYWN<6xKaKbn{tYFBb1aK0p~@ zYJl7T^EdBww)hIsLxAblN}+ThQ;Rbdaifz8%EDIGj_!E4_<@ z9ZK1Aco+<;a+Ter6O-+T2Y$VkNSEjQx3Hr`zyOdXHqAObM);uCbFeZwEKZGn^c|f0 z%>U3n?jM>KuCHQ$U+UjO_>4NE8Y-uO%3_hQZ7SbQ5q_Q`#c&PhkUJOpevU%e#KYt@ z9n*&(oi~}F{c6Ybq^qPyh1EadJLznHfw&1mzA;s;$^EA>e%hLqh_^=@|EdQJ6+HTr z4kC(q$5EBKgt-0KPE0b*heyF{#*+-w*Un=o9l=_N~~X!f4JV&=e%W_J%~OqAo6Se-6rnQufTuE zr!W`1#XYFL^6XiR4-`sm>Wb^|s8#)?2wO3wX3y*kKDyYdXs0e?b+M;7_0{!L=pY)v zYhm=#ZHw`vt-!`^!KKIzl}wr_rILbUh{Ojead|Y}mC6`YiNoTL*G0(l=_ujVQTI&P z#A18*zR8?{?{_HASgUr25JjpOP2fI*#Dv<-H(K2AN2Qo8b8q(F!t85^pRBLw)Qak? z4v~W*z8om|hw;_o7){Gc{?vaD>Y)fSMm_!fHyZN9A6CABVMbMS2ooJpPQ%R%XQF8R zkMtRa(VY=zZgEmO_tz%VjR#uQC5$XxEGw@dw%(QxR}~sqzV5vS7I!d#B#Bv$Poig7 zM^6IdL+9hUb~u#h=zseo35*elr;~AlN766+7OF z%c$M=5&m2;ABmSGPhVtI%W2vneoEL&LjAuJemM2EQdDJ-&r)NXn43Ql9t1ay* zd7np~c4teZR6(xBR1xj^xM)-)rStwHZS0wN84+RTbV7pb^d!nguFz(E=@n4cPR0lK zg>F(sIv$imb)R;MKLp*|mj0;k+(~KUUTYl=GC0#@jUbo+K-N_e*? zq1*nOvCZPt(x2yDT5=om_@Sf#N7xo{N7JmrqGQnsl4a!S`jAeT?5tz-7>7q1%y)6r zN2)Pjos+w{YzVB>3By>@hV&)PlumrlDY~aq7~Gii2YSV1YO3m<^(DyE)#JsKw+`)P z(6a~Bw|7&<&P31D3_NO{k01UHJv;m*x+drubL<+X4Eq$c0Qe6F1SVVRQ`Ec3_J*n; zO{+3#nzE)DRcPu8%CdqfTNR-=opQ*&1_7Grh(qQ}<5W&rXH~Yhpp2YPD}c=41o6Np zgZfpyCa52&wuQ$`XOMQO;tUWECt4(utj5c*Gs(bBgp^LE_kIMb3MY-%`TG&R5j{f# zSD}aa`UC0Vzb_AZNSOe(vf&t>NQ&WY`wAVSfcx3Xnp60gtG|Ij%f_HAN`~;BbJ|sn zMg_VG2iUC3tF%7;862=Lbm&(Bt(xqcU!N}Ko=`UtBlD5v>C zF=Aj{H>UghhxX45fA0?aLq>W4>j-UiPkevjTYg8vUe8Y;1pW$DdbZNyx5&|0yPg_; zmMU8CMfLDPXtADa_O#6K{S}{rU_It+Ys7nGw-?V{z!9OWb+NSUH~4^^MOA57y?Ylu zW#pzVpy>|qB)vtM%JQ{}t+WGb%iakeF?_&Y+hws{5s_J3u{gT#?d?TYYscIg=-`dvDr-x>1L z4(Tr#>8YV~p`U`2scKD1v0;NKn*{eEB|*8jJPO*8K!mi6!U#_0_CSlZX*E%k4+Jz< zjhM~ceE4#6r={gAXNrVotGm+K8(4h6M}w`Ay_!wSYk>e|N+8F~`xhj^yh!b-r3Bz2 zn6?~u21ntod#-S9&LZ3^sG}jobHf>BqSaK`&4oI5~C^C-|2x-59kHro$`cd!*@b}gIqrY|Efs2WU zlurPMw9JKdYVHkJ@U!N9s%qsV9n^k#(KN&vn3q!=XG)QA(3K%EMJ7Y zh<2nc&qrsK%ouUQrMOKtOuk{B7fpGPr-;fK@r{_)$LP&tSS>}t`|ia=aik2Wlphv; z5F`#+N^KM(UQdiV)$X}ula>sjjKeW3xy6I>_1FKv)Jq7DC^C=rtieAh&GF|mLCxS+ zi8|bit>ffa&v{fps$loxh#B&=zRq|w=>ww>h7>6;8wH;tQo?^gQ zI=dr$-ZTb8EvwP0@(8+40J=7vKNb(xoDFz=Q@mnDvuRp^tIJN-% zDgvL+U*rp1=Uam9h~s7WO7Wz3eKjc2!1^%OAKm|~R=;-&OVFKhA6kgZE{??#6igNl zL)PnSapd7}8=?K?%JR#(d>1M|;0Klu$$O0}sE4XG6Htws9s^kd3C8*EE`Ipli^9zH z19+}h-=$Cg`}MJW2WRFnfCHpxlpt>rY>2`00FNI={y(cf|39f8D})`EqI5bh39I$eP7uNu?$$MT(4h^l9sKX#rB!Zu zaJ+KhfUoNTqUaG__bCVJd^YiB7jMyB52Sc5*mls8lrm1kL%v9Qvi_{JXvOMtknKqR zx--%={JXDeE#A*aQ>!STC)r5Ue2o8RA%~xWo+=2;iBaX2K)zWAg^E*BDb$#e2|4D=Rw% z$+T2)5~NJa2*5)ZkyZ+u)d?^)s?&)LP-Dum`+82?w3Ue4p-;UZsfEq1o*9YfYNyuU~xweeb)7iI-xJ^sv~zGxQrUL*?&(6UyxHxeqJeSq$sG#&#QC# z@+-nS9m6YY2oIeE5Z%!@LVd}NtgJYO`=b?%Wt%$JK@nZas5yGALA_i_OD9=z&b-T0 zAF)ztsQbKAe1o*3jx+gR;Y`-^IH%(*Dz|WS-Z1=ykOK0ZO*zTsCoRJ*mb!mLS$7Ti z2=}Y$7~fWPWR(`xn}z@bM?-K{9>Mn_2IU3Tiv#lxi|pVaM`FanvS)bDx{jk7ExGF4 zp#f)={un@YMBSY>+#pQydDSq2kY_0 zUtPH#2mFxrC^G%uyB^&y|A6)QfXMWJ;d%^C@0IH@m|)Q1|LyBhoZlz_3W8;mLctg5le8MgUm~T0>o!3yZvnY13Zs{lV;gb==jIe0Nu*5=B*PA`{8Ofm z{wVA2fd~zQww{hwnu$mfg}eb2Qh`pn?T`+k`W&U~6cb6rp;-w*d$Kw<1~Gby)Xe0f z5m|csUx&-_s>4BMFXJ4hcf|}K2C4;kBRib8t(VYVQelg0h-eOqPa?8mEoQ8XaJ|Uf zEokSV7H^v?LhYB-Plju=f3P|>8pb^z)&0Y!9I@v2iwun+lyQEIVNp&i7xfV|qFGfx98KFSoN$N;c-Q@wKiV>kSlWA{4llQJ^&p1s(?Ssd=Y>0%OAX1?OSuw-|;NX>7gq@<6#c z@dNUa7^k!m@&QmA0KE%et@w=`Ctog_$SeVH>Mo*p;wJk+OEVS681~x4$yY2vE3i?x9^TX zujNy4AUFt#@#eQOKj+{tqX)ydHVV#+-YHm)5e-2+9o@8;1m?12m$ zvqOk855**eT&GMQjqv&YKZvgb&i@;Hee(JL6kn53B8>k0&&Jo^z3~6=)x_!l1Ydvf zes#xl|8BpELXI$e`TudhTDR(d%znk=3Dqgb!z`qDe7s>Tfz7Yl9s3pTPrPEkG6l(D z=jHE~KLh>84=*1}JV8H%W|#2ZOo#>}15DgB>;<+P;jk)(j z7@rN}QO*;OVsy=wNKDG{x-V^{F-%@>J&N6ow+!rOC*gJbp?n>01oYbVLpmTPzX^dz zU>pMN8PNek(0*ZmhfbijQa}iEVcb`6BKWyq0pCW zF&F`e@8nh*hXW378bR8qvylQ2#H_^7Du0Lkha*eFs;4v)nBOWRN*jhTlDkUYzIMF{ z_6`Iu!GO+HljkbJn%`^=Io(vBi+j)XbBG>bWR$8SkPDNH-WPWzqksLyB7vARA4L>j zwYzcW70LRZztaxH*w~f^F?(4{v1JM(OIR_)1$ytj!6Ak-hO-5H{I%KybQ+hT=s#P= zQ^|8|!yQ@IqmSsh{_!6ff8d)MfWOo{l5)YF+P#`^g)DhprJ>gI+O%i5b(z|wxuu5l z^%omM4I|1OH9RQTaH|?@cs}kU;6`VPM)Af|{^D&s?%n|IMNoRtKwpMIh?%-Tr25X| zTljv-(q;J1k}Q zPpdD%cf2*&2;D7+RU21wQe%~bUZ7x57LByHhKcC5Ve(KF7cy{sTYW5-A08?{lFARJ zW94;JzTQSQqtoJf@PvyDh=)nMut_n{0`qKy<6n#xV_jQ1g9fb&Y~syvdwwj? zQ`=~F7~?i2pT`ZB7&Y~wal2ED+mPV6bzdqbn8uAf=i%F|SN(y<&A81kG<@On#{(FL zDY##q6ss;Q{|13X)v3|op2*ytlwW%9WxQ7=#y30E{3vx&a{Ru;UGi;_d{?Nj6@}G( z=~Bui_c6xy1`VOX;gAps7}WGMEi<4@N`nvb!W+bh1#5q1l!zAfr}uHiPOUk^=J>@@ zq-HDy>=$J*4Hi1TQs+kK4?MxEQ_E_GUNA?Wwu`$;1hxms4IYSA7i7Zc;BMpmt)`}_ zu9|OvD_}#qK%9UcBZ40!8_iI_?WpC_q&X&S{A9U_j0G~|U}--=b;ObqU}5z)>VuhJ z>=K0jAG79K-LXExU{T+bW_|L*6J&}}JP!5A8$6}Jwdo0aRmX6uGPzpRI1KZl{>%Dq z3f9+4)R%(#k}^k@Z178-dRX<^)z0UdJS|qm%Ig&&D2Ipv2@}bf23>CS@Cy7S|0o0h zP#*r;yh1scKxv-ld1o|mF$-%rxRn&-=(p_&Vxy}oR`Tt@NV+txjR>kzmPbKO>0Xs4$_L5OX&0%F0<)s^4UN15z)l5D3sHX1 z>nNz?(??<^A;Zy>YXMpgWt=t_=zJO-0g883Q%0%|a4b#QY~o?^_0H9X%om$KR<9zz z1N!S81p(w9yrNPqGh4}eRdXc6WC8OJ=vV%u0lZEgqI!%*8;bL_go6nI-zvggxfvo8 z--mcq%4$kFE6vIw@XbxI_#htyuokBxGi>St8{~`e@LJjCE)5{UL7U_yk4Y8wRUkB{ ziihRupHvca2m?X#=f%?S9!3U{3|;fKKwb^L`=^k7jGB_B#;#XW5&TxpU57BTWId~n zjmBfeukct=OF-9*Z$x;G%$hs!1GP!gSewK_XHaK$;LgB^z=x<1pdeBxHUwFqFP-yrzg$Ml$MMFaX`qFI9A%gX#m&y?8hMbKEWS8>G(Ur)1i!&KveyupB*veIe!h9b`3FzjO za}62M@LYfyP7C;vrhxovfpSTIX}v+AT&WE}3P!|F5Yp%Tw{%zHZdhqlJWB1pLhY`k zZ>OQsbl+op*Z>7&0W(RyTVZBXCz3rYf)1Hv{ZOLM_i8SYm{1M;PE%JHO-7 z@AZ0&M_>a2YJeUgWQezR3k~jO`Xg47$c15o^1@OF}!FgA(zO-_ftF5DG9X3^%Q2>YPw5Qmn9PSGN~r`X&5P zL1& zxPSt^R)mlZlHggde1`;!>_mc}H8X<*Kkvt7B^5N1#(q)Wx(v@|7ouo?KlC%WE7b>Y zIWQs~G*cPeH@6P|R^wkauGA>S@@#N!qZH!?G|glE5eNx_`GD0Rca`>89@aE!#PkiJS}NekF0%X#S+F|& zx4`zO8KD`t&KTVP2tN~J?+e>+)WT|YP9{eD$53&DpCkTZ;d(Gf2LEsjU|vUH5aeiQ zVa+!IVjsvLbCP_(Q?}aT$|Xww99dM3tX3BhH!>=yF9%DcP6Iyzg3J6!hx#xQLyh_< zg6CxU0M=AWQr7B{H#}vpSzPH<@w)Jehg_|`J|=vq@7N}SPo6Yc{x4D2YbDzdNju4T z*d^CH=nhv9#OB0CZ5556RC!b^nc)8G9yLs=*oBW!r6JqAuY8;F0`PHa%!p>*16+t= zrL&QUA zjzatJDko<9CCCw&(#b!?yIxEVYuUQ(PC@IqMdCl0b~Nj;`pG89S zQHPD{`r59IiDyfOc=yUbVhWLXcHT`;D|*fcaD^zzM#m+WpJ2hLFDkxK7?y^e9}Rgi zpIpDMy$k;v+bh7Ga&$@tHU{Q80`naDJW)F~wHx4MnS2Ywssr#z;egYbQpD4~viy+$ zs619&SQwSH@XPIo@EC}+>A<5Mzb()M_e5-J3mh2{%9?)GjYH&WxPX0uKZspTre)## z0p?4r*QGe6$@Zn`Gf2HW=v#YZb@~ixBitdMgn#O+TG)@3wDs4j-Xf|ZJ-MQ2yB(i? za&x0qt2$!=ZqsvwR@EEJj-Mm7s<9&P3r}wod7F@zq5x8Q6Y@?mpCgN;Q85RkUe5z! zIL$o*oYGd@jK2t{=xo%|Mng%Z@Ft#}51Dfhm_ z<-|p~dMNzs{{72%<1*7&1}Ct`pjXT=z@pn8nB^d`)0%~Zn|*`!=3(iXlwS7z>0JJ? z?@#CQ>i`24-jK{md+cFQWYp>7B#V1^yeG`PP@VfQEX0G8`T{FJUyYXTF23 z!)&x5#NX10Yw3@pUU(up+p_f+L_AHpX3cdsmgr3KC>NE0^N0!*ka0P#x*@ARa(e^1 zWb3>3m~_VGo;1UX`9VodeFTgiY{j$nC8f;K?ZgC<4RkdDsHKAfpzO86n}|dAWS1_=Qu>>e&Xdep4x%>BGBA{d?)=0#w02?`0I0-j<|v&-J;SBOAc4SI z&lU_3VPCCP^OT@IevZ&Q&zR4VXQjoJYf)=M<$C-j)j7$3FgAl~|uHK^1c~dMBm)7#WKUZZhjtJc=x!^cHeVFI zs;)b>AmQn_{T;3o@YC?XhcsJH7E$Y15MNCTt|5IU0jy2O`T|e#8p7XVKSfj;cpjM@ z_0o7LYbYG4x}8Se6X-8hea`)~sTz%vR^A)3VNLk}f8j5~BcN3+zk|*+-So;l9<`mw z7%+U+NW`qy$`}M%#UkeB&gfv9rL%ZKzQT0C35eX>T#xzRuluUMa>Nhj2S*q#yT`72 zxq0_55x|pW>CSMafE=(L}0DR z>IND>Eu)ntNOK?y$^P1ExnTJ{Y2&7(s;dYNxi2ollp3|n%W$MA$))T|qDCOjWLJJX zO=Gl_#s~~!H~lHmG6RV|iD}B#tNSn?qYAKvi{E3Y+(%(0lYz2Of)3z0|I!_UnX$II*9k7C!AqXoC~B@LXEkLnMH2ne!~_?b zlhDV4*npR&NJ~~mVL7a!0Rcsb#J>p?3My+oG4AW|nmUS}h@Vd#PEQmjHgzyPHPKTX zJ&~9p6&HoE$}c)Knx1L^wR0W*Xaq8LdrO@O0Hq+=_(Gtm&PJ(GVQ8VGqQ`~!O2h+k zUNxsXTYnfaUNF8;>6|L6tF;#?IHNU`e@<)=g=_PYOOQ6<9_6fur#MooyxUkuBE+4d zkymn#?t4;5+8k$<=V?S3D2gQE*q$AXFLPfJVo;8UcR9h_-v zQ;b3vt-GWp4Tb$9tiE7qmtv3JKX^I}((d7#I@=$SjZLMXL?W^qcO z7a$W?ay)h0l4Y|ELFuWuBY1nju!=Q)DE z9JAd1R|lCE9FZ!P;7yxoP4Rj0fY@>O6xG#X9J8L+COAUFR<#$ibxT09SVq$yl$Ajz z$<{wdc~?(GGXndm{yab$->e)_-jz1JU+3$A+S5HJ&MSqhA<@|@C;CPrg9(7EyQePG z-xYbr_&a;*D5JWDx`gZqkH3M&jbejaP)19MNo|K^_*!; z?TBeOV3rx~HObM+Tz^9YJXsH8f?s#4uz9-;~q4js!vAiJ2r+`tA} zjQYKt`~a-b!#>?~BuElaOyy;&G8#(N z|J4O`)zDJ+1Z*YOhI|Vx+1I zuy%nt9{7`YMXHN5-{#&jm3Ea^U{GVG$|pUSK!PGsx0X3m(YB$hS~aoOiuN@ESi4xe?`N{AtgHK2jy_nX=e+CSNaAJxiZAQ129thQGXQ-Mv$sPN@Pna$1yC zG&1-!#hI5XW=X1`o8<6mQc9Ln@_qpgvdTo!Gs+?lzz7635NyTKVv*?|KOw}9z?pgs z2gpW6Bq~suMr#hc!V5bbJ7$jNB}x>m7hA6^2q;QcJPk_PQJd1%knS zKNNKHxK#1{dG2EnjC2Ex9tIc=>|q_?2#!Xs-t+sQq3{Kx!r&PDFX3R`v*#6X?07;9 zM-UF65Rp%NU;_=0G4ZcH9-Md|ki^Op6u+GiO7ccw^s#i@)zv6z_5GT3KPE;5Hq;;$ zF-SMi8qt%lGwV^@$mVmy=vnpBk_llPtrEgG`l|o@=VpQGd&xi=7*iEju>hXFg3sy_y;h<+bJxA~5tNcc8|;ssz|e08EKu~(>G zUgK0>l-cP&;WXuY4)ui9eG8qi7Es4UF9RFs;H$UcUR1C?bW%@)iZ+F;IO zKG?-W0e*aMbR3s_8mpOT8O>eP;mf3PCI8Jj!%}0PVGWZcKXwm{&b^1-LVNpjV58Fyj9Hr1`@b|79rmRa*&;gUBBH= zv(2*Cj`C?Ez95+t7uwwuW<)on&O}`nE%k8%+=;k^YASd6qdE*?P~WBIIw(ZuFOhY; zazv+aolrOVV5RC=@DOg&rO+In1yiv)6|QX}R7cA31RTTL)S4~7gP^dZzDAvNZ$fRA z?L|}){{vRB7(-lJYfqX!wPY6*(*$k7V=zKF>)FbOZaLPUW`vz*kd~9Ez({l52JN{C ziO^qqo&%hSX&bekg0B|Dr6;{j)s%dud6->C_2)q_X^2!0jUgbNivGY(Y4g?k18Jb* zMmBZii$JY-2n7uve+nGPKK=$G0JG?o%o(ZL)WqG?AG=a-Ak`9Tb<&JzPkj`!24k%L z@^?g~VM!p&mV`VK@qUB%i6MZ!u1y-5a5Qm|V{W3Fo~*{!z&vXhsYTOgsyK-nq5V># zI$Ma;5Na2;$=8{|4aYU%sB?{>`t{Q#nH=+Q*8wz~)yk1NVb&H|gfWNIP=3I(=poCZ zYqj)=7!$MZRgX}rKMAMQqplw}qzdw!D#&xHAkV3SJf|{wCMz2EXTQZlK_wgom--&M z;O^@B6$+@}*}>CJwu%(HS$r3MVL+p81Tv2}RUf z<}(ygCvjx}^1jfIhJch$$a~O8Cq>j5^BH*~{tmjiVi#%`s;7|hD_ltxu8`ub@AAXU zs)(to2xu?##)T=`iaYW5`;<~#u3nT&sP(-{OK~o4G>|H2VtAuzD~<%8edpIK#e|aa zdcG-r73`|)%D$!JXIN_8C%%QGef$h$M-T?+$g}mxVD^5T{kdTF+Lj3SiA%x!5hDMg zvqtrKr|Wh_mTSFLY?4?mAJV_C%!n966b!?E5D96c zV}?@Kx`v_e3)A0HAo-6l?dTO- z82;)WJU0-(iwJ26K4y0eEr8N!>Tdyt5Xk~=LqEsxk@2*abJ=q-vIMdgyXHQ2jR2%M zSpWh!1R$tEsU}Ge*~tR1@2p?g=RoFV)LIBBMB_g}%-pH3kc_vMo?%b{`!_IXO?aDm z7{}yneRU!8q7B{(e4`O-@U9F#Eek%a4n92>e0n+fv@ZDcYVc`&@aeVSQ%&&co#2xj zPqd^Pyw!N3{~Ek&@r1JkzU?>iv5k>;Cf*vnrN%cHArcGy7nJ4&;Y=|sL!^oq@lABe z0WBKjd6bb9C<*O5>DG!X_U8%7YSf$UDfigqG&QI1fQz`5vIPipx0)LTwb}5b9Q(p< zi{sVY=%k#edEox-f!Pj?p~==)OylK?Hi}IAO;4;Z`LpVE0ZwYykDe$zs;YMuzA0WB zSItX3*EH&3b}n2!a&%XVVYez(H=~Toz4w%sg3%z$WNhmi&8en*0VGkhJ$M%TyTb*? zVzo3*SYkE9=Bg3@YVdEJQl=O2O>6C`*acHF5#JjakhKmR^Ce139mXu=R{M}%2+}Qw|xcU*#Qip8jP@TGu zhpH_QsjMLsRM`+TMcaNDFEck{dSJ{}p!dk)+DVLEI>DW_){5B`IGe2xpve{@ZaLTe zQ=A3b{SyGM%Gj>CCmUqvMFHUs!Y5I`e~{<$8M%L0-X%ufCla~69XL{ec0sE(aRPmS z*pGnJU#IgUPB6wAf)-5Nb406+l~ekn`#At|aDQa}n-}7AnE$rHzzWxQcTpV>J-G&I zlWk^KbM%`ha@{aNzSX^=2@4YYmmgP+;2!e&K7tUuFQ8-g-G7tk{27pPO21&FzcGrd z;H&0|+63+U%UhE%SOz_S?4C7IYW0X;g8v{DzF1OpNNw<<4qp5Twe3q73|tY7?kO5c zKhy|5g=0Q*9}u_>VrJjSSb98kI&?&$oWb>`j@%+` znx2fSodY|uww3hc_Vh6ixw@y6ziV;Ohv~_xYYT3}Nl%6*aod6efejiSV?mGSkxUXHZ~d7NSldRd5%D28%N_MM5-)3Ag!dd zSIEOjA4O+r+MhYG7_o|3VWIaEHc_A!)hF#ZpgcITJp<}O*rh^QO2RPBz4&AN-9Tc& z?A(0amq#-J6>+UtQ#ctcAlo%WZU>$4?4*&8G>Wc_#`Qu{`Ulcr_Zx5EDW0`|${JF3 z8}^NMh4n|EA`L7*Mrn&$>QFP&ya$z4G$CT51cR{@H$A|3ElDU{|)^QLvNB6H_ajY^yA@78mMQsT5IOm`1M5u(LHwctjy^M=_e+)KU}vSLV1U$7HR)W3uc^_d zUeZ~krp96BaaVilAo|^}r4B}YP)9ap>jztyU63}VVnrB=v{UVS9P&aT#(_fAc^qm` z$6fRUooO!zw5QReGwtPo_B5Jwro9}{o<_4Xo&(y`XlD(5gZ4C!iV1*iy8a7zTWuN`nDHiI@O3E_I z?1aP9P-}L=B>|COgt3cdsL|Hls=#Na6%NcVCYG=%S3jI5=1-WF@H(-njNv6+#llsy z9qB4Bj-)xTvHS!QL!cTh$KJdV@e{yswZDR!XJgFO@aRI8R2fwE(nrTt)XhqPM%$VB2t#a9#`tuC+!izoft;zLAn(RR^FBD+5a;Y?53L_;JkxdCGu zoC($nUUepB(ksfEJ-y2GQnbVTC}AEbz!+N^Z$9Ho?+` zU|7gOcJJUsrsG7NCGT{2 zulRnBKWN?Lnzk{Q9HA?>GXVa-=m#b-vkrn5q)*`2IXA!U$5^qWx213Y97H{VSMBGJjpbv+q z(DwpLUD2K+B;PRnpUI?L%V1IcrpcYbBqz>u%tbh_WN>oWRXUspJgpP?FaZCfDD~}I zR~W{eba(C5&yB#Zx|S%INS#7&O>>oN36J^sSoszYDP&8x`^nH%e2v>|eihf~HFaXM z|89Dhp`3uoCFYf^6UFJtk!4Isc>f`9fqkpfzBDgdojp_;uFf8$%(APq2P?Cp)Y-$8 zS#S~PtIR^8U6~bwNGLYt9L%_Iw68e0g-()^^Mmq$#mx^L@2Vur_xAG376(rFcKo)G z<@*-;@n5&avKBwlxKeTlnZ9rN0)M2m50vb_e9d93niHdB$ALXnG6&J%3Vs*(!1mP1 z#+eV|@g4OV#+U9hYH&7M@SmCkq!5W07~|LIj$ZdR212lW7PNEe|6 zU4xGwPULx~l(KE)yn-vxb>9t?JC1TAT&Gk`6i<=&Ae0$d9<$w>D^eYgkf=I@#*u1z zUxWmOU!@aF(~DI3gMEFhRsn34%WPta9KH=Qg`2nXI_LX!ZqfTpKvyYGi;-u2Jfl@8 zlYEpM@RAv~z!HpT$PjY*jKOFIw@L`Pe8zC`Hi~}K%JG;j+CYT|A9^5e_u1fIo^Vtf zI~X&UwoA(&3~n#&18v@5s3_CU<>yX8$m#4H6{7%AX1?BOU~mjdyL0%V+*phPVyo>} z-0r3y&?0>0k(W7206zox;;6fUNi zrG9WpgY6x8iU8%6UF9c(rgk;-B#qtGwUM#$J|*iguE$MwPq@dX&Bay-kL6_(#9<3& zZcZIH=_X_4U_9!+!cL3iCyZq1kle3gcqlpxUB+C4)NK7@ngJl2bDL6Dt2t}5tYe^Z ztuV!vQ4X37##O`>!t_fOXHnkp(QZ#2Jsfs7(l8zRJ4@#E7&V^rid~EgZG*lspmss!BI^8GMwz zy}*$`1x7SWs<7cj$gcB-#5N}9QO)!_zojS`!1VUtD;@W zOYz_-qKNM5MIbct-Mpg-0#_&Yk};cp9vS@}H6@v1*FqbWT#W@Q`uS@M&RKmhuW%hk zHskfa^#R5Y5d|B!p3QB1eduyU?s3tW{&%NRWdu!2I5Xt{kc3s?9G{XFC= zG~DnNO7h>@F%yjqF5$bM_nqO8W~R6L3n{Bzfht0CgISy0zTGjTj6-nW@1)ckZe zeS*Kfy?9u@K1R$D{L9f4?$|x7)@;Kt5#e%Av%q&{s|^zEe8ckulnBPE;I?5x==%b{ z@aKagJ9#%R!KfqfB>12OYH#HL77;)c{c=5qs43+aTLIpp{^b{$I1hz57%;g839+y| za3|*2;vcXRh-JYy2hw87FH)D}E<4eZ#ouWsrkMmiJLtCnw6+u%B4K6(1QlPQC>{E- zxwfdOgpI&{Sbt`UwN(!cO)6`h`-IqENSo^bLba-~)k$;G=HzRsVE1kLSa-VqEerw0 zl#eM=QR4__OZ%ST@<8{(5t+l_`vDzpUaL-__aSA(ZP#s(>m-)7mi);tLB*=nrNC$0 z*_wEvTs;YHH?+GqR;#;e}y{KvONWQpA05E%15fRC4Luy_U5Y?E|3<)3|E?DGdRtB zqd6zJsbY@+naR#C(45B*@mf>?B#?1q=QAkHqXX1#O{`b5nk3JY7;!OTMBUhb7nCJ= z{T5>65+|q4b+{Kw7@9;agGMn2A$YR&O-@)OXEpIaaz+_kLdYvG$=S@F<ar;2%snND3JvS2T!WdW`ko|X6B1+=Fc0`eYx zWttdbb|S47!(;Mp_oGBEJYi%1gjF>aJGI>Cy6Xq&tq-eivDBh+jV%%}pgLoe!SUm= zc>kkD%_Xm)mn5DylHf-^(TG4pOiLH^`mP^f0YM~CF&fMcS+n2*bv;c%^HtyRlj zC7QNI-55lz^q6O+f#0EH^_vRh_RHQ&xD&7kdHf z?BM-_+t6ob5~hRgQ!D#;NXC#xRbxrEHF#&>5m}%~BT*AQsg>PvZcy07QZWT}m67;H zvaM0bMZY-L2Gsc^&-oc3DA2!23@YXtPziw5D!1U$NNxG!?-*{|zW$6jThCL`GQ0Pv zJf5Y9*vdt5quFnUpeAt^7>If(2MbbZfY3Vr%(H1(ZtOSb z-=Z1?L(bDDRbNjviy#S^qag14jtCZ_Wk{8Ahy2ol84A3bUR5&jcO7o%QM1<5g*{oT zaSOYeRgJ59q)lZN$_2rHV(WBcI~T{U_lb8(dtcdy(8}P_#NH`Y^xz%ups`&>iLF%f z!W{?UI$FROkqJHY=VFLGm%c%G4x|Y)*C48OKru`JbI>+@!ay+#T4)w>^hzNF6$hB- zP&-XQp&LFKJOzJu7%Ne#&ZLGyLry}PVk;I7xZQ-?f&+dR<=Q}rODE63sv`RLDjZyC zWu^m?^-4PE@oFU<@%O5gbc|45h0+va6l=uz?82?eI8Ah9o}`Kd)E?xX1Uk8*1WzK4 zh3uQ{yH$V+-o}gIDgobzkWS;JdbQ{u5MTo#vOZ4YGlfDJY<$XZ<3aL0fvn0UUSyK@ z1j_rKp-QkvHR1P%Q0L_@EaBslL7EAe7pb1{_`_>4<{Mgz5qh84&|0K}pl}zw1&ncO4YSuQKwiTvE2}h~1q14#NmvGAh@nvGL z{L&Tf>I#mS&Xu@Nn!<3T$Ei54q%)=9)gX`n{=T>}jTRzZ5jcln_hw@Fgls)qKXgYZ zHBXz4lQRaBGU)e}kc*}rf!U-6X6zc$`w|+5a=h>aJ8_Dt^vBNg8{!=u<&~~%Aj(GF zp;4(mVxgi}(mNX&xeDN<>W#>vIV-fRYP6x{x#{FjC-0}C2t#?Hm(Ef1+*h8rD}v|k zYMi&3a=SX=xQ&nq|MFjj*pFb}$D7eql25I#TxiIrFf1Ho!><1q z4U!lR<0ws55#a&}QyTF=cZL-V?~^2f*y}x5gPaz~9me9AiHlTpSnNgOh86{(k~kb( zCpD8sWUux#ANDV5xr2deX@|6_gRwHwnh`P*d?M;U2IvZ4P6`g9kJ(69_^w^li!c!| z2;yt0yW`Z){<7EjZ%jCfFi&zPeQrN&Nc0gGQ$s=_OdIvFKj{*TfAYA|f5^OK90*=j z-IWWl+d5z7{rGA^I$38iuqmc1vy&uL&B&DLPHZ8Nd+-ln_9)nvcx_q7I0X$e&?r|g zPZFYlD#3??XCd^;*Uw>MXsn&f)Us%$Y^CO`*0NUPz_B(rM_(oiVR(C}d8@%Y==Xns zMs5H-)ZBZ{bg>j5AZ9oHn!el=hxk>qURGIx3p0Vo#oT8mV(ytgH{}~*{-;yaKitN` zB#92=Xh0hWaP0`A)|R6$zl%ZM3G}2a)o)T3631p@PpkaL@-CLM@IH+ylJXmIYZ3n4 zx4icXzO5*$`D17E#}q0K_l1M$fAx6=kSci`l?V;`1U$jgCd(d@55rCc=Lhq&jJve3 zQnOlFK8HXaJqIybQY|FDQ)EP^YgMN^2yxRO)_(;3q@kSdK%5>UyazVMs|amUo4W3U zWUNTZPj*kb$JTL+aK#6=hhV^tTX|D3uBQ#b%VZHcIFmocd7BQhET=#q4~#E}BL*R# z;tjliw>U6RY=Xxyj^<&ZAK=f25dW(+nA-2?^C-o;R*)x@B>qv>OXJ<+W<;m6+LU~? zVK@sRFh@1GK9O62AGbIfha0^H@joiK{td%ih+4`o1YW@f*1gLw&@SQXSAK!d$ng=O==o)l%eEnCiXxmEbsUzeeCWAtYEy#_kUKQWL+Ejs8LY zyYg4WZ0G4fS@-jJ1n1>!A;V%s(uLiuo`{W|;{$lfNrS#rEsS7WWXZb^UjQ|ZA!?aU zhWgH9u&LEIVj|V$yp9W-F!Vhs2>Sc_?W3T>1)qtCMh(tpf)PSuM6QaWNLdgHQ4lK_ ze^L$aPz}zugg|1tV_t9nBPRaf8@|k)qMSwiPe`4xqom_xL-#=dVk-I3K#JWZ4-X2R z>h!22+&GV*dA*h6%4t3EAT3tc27h;)pT{DYo^ss3PH8ZDd&6P$7I7|w)Hbvq08<%% zqV-3O`Ks3z5aBA&8wC|me@Pw2rNI!SAk+nnJArP|`Y1CyuA{*1&!X2Y2xFO@i|Cd6 zjk3}5=5x`w_VpD3vK9*g8BRu>W7(7vV z2l^=1#{(P>H417U^e11OToLs0+>Z@NOH(L-7Dv{-P0&{;4Ar#qZ+OK6m0!TJF*?;1 z`7+VCd<<;EQP%+KT6aG!ea*A4wF~0*f{tfF7L86Y9sig3ZSLQ+c{Qu~t{p9(O8lGj7!5gNN4W{(B`U#_@lzBo-_&sl7s5w9?=kiN5I14}I92uSl{+bM@<|wxrlTyPrWiA{q36Qy zb~nU*JaDBy!&VHF+{7kHgsDMp*G%j^V!UB5FmfdpD`{GCDL!4;7I7zuG-)I6PTO{3 zfn#2i|0dkj_2@oG=Ey|*r%0sFZ~E`!&iJQ*DEYI(^i|*+CMSozt0RAb#^PC4+Kp>% zn&9=6|6ApIZ=Kw#$E{#pxRdObw z7M3CWhqnN{bX*@()%8Dl0`95qk4|>6%&hN%CBS#`=5zQ5oS$9)i@NuZkD|IB{x@WS z6<0Q3s!^jxiwc%1SX5%D4dkava6=%_PeG|#q-ZPPE`&;8VH1*J96_rswpMMm{m^P# zsv=mc2CytxY9mEOrHYnMJL{%x{LzT0?DIb7&TJBYJl{V5Jg?`AFEg_s3s}36S2MEuZ5w88+wjFUnFuyF|q5@dy)djnbtf)Q=o&Y+7|;(u^0u zSC3J8lNkm1Xmr1Gwie^F?riNGp(yU(e=oQYM6E^Q?-C*Kxxiw%{=&R;X9vSRbZ2Yk zI7`L}-+3iHuxrM{CWeT>s*zf+rxP;uOC`^aJCwG%vzO12NT{o5r0-m{$f^>0(I`$_ zY;vzdN6IcOxbax}?kvo+78Ti3!*+O$6;cT15?G2|r zd-Vs`p(`ktF=3ODJz%c=*NfQq07dakb7yM>Q|8F%o_kuM!ld=VPx{M3@R;@XW@>j5 zC%?|*A=)x|SV)+V2Xu?PLPGZ72g$pn%XAAP1kkczeg4^pZ!ux)|96z~LLyO?T~V$; ziX`R8*}%hd#(n+^%ml8E66zDoF0!S3g{9vtdPToVzXG`Jh(xsfZ1N}J=PxOT=)DwK zeJ|y`&CC$Omy|9o9+5erm)^)h9VF3v1xe&56hr)3k7xO47~Jp(L9BIBA7rsi5Jt-(7F(rNq^jNdN zRfzb!%P5P89?dprpfEW-y9)f_f&dzvH@W|7J~U-PWT!d`WM**SHp6}MEYsZbT3}`kV(`OFNC7OQqV7!8Mi2^nc8Q2z)nW|5 z>kCBiMcfIK4Pz)?Z|E zc`gdB48NED`1EtKOLGC*@A7n^9{294FaDj79X-;14un&5h;(qtIJPdPb_hBWuP|v9 ztoZMURg7JM?WsMVPSwnls-2qaN$end#3-^;N={FGSEmnn!SKJ3#h3@-9cYNva{8&OObYw83Y`??}}IX?;he^viV>j790CY z@A$En5TY-tU2I@a)5g)-;Op(yukpCB(;%J)7d@XT6Z-_&tGxmTZZ-v$zNVcIL4)K~ zDmViFu7JC60NTBUN`Nx+o!R?jL;uzp%o>~dCLSw?2YbI)>*HlNQ%djKYD8@y(+H#m zn80k{>H11;-(0~|^fVPEQ}b-qHknK@R62(QP1X*Xdt?6DSDqNH^Gp2iurHRiEnlEI z1k_}0i@6mw*}ll;qs_VF*bYSEazx=438G0a#LPU-!9Nl8UN8r$po0YblwCLAYX@DG z@#Fj4X+u4^BGNvMLXpk+lDl;xrvhEhLOJYdaPwXeogbR#csKd2a5WX0L1i<8t*=> ziLvd0&RoVU+2uuL6-DuK&rwK}w1*$e%Y7I-OZ3a6B@^8wDrUUFvZqTtJ*k(ev8v1G zrm8QNK_4KONFOu77d}PjEQW$c%$8}4y6ZICj7R|?_mR`Q{Xuu*rQ`n-Q<1hI*C_e+ z>_j|nXtXLt`}0F9yM$(WQyyo^JNX$fUWqfIlO~YsB%Tpkz;Waeiz%#W0Kj0;VuES+ zUczdGiH@{?$d*7>6qdc99AjTxZpg%zlrh1@rD;8$HPVX5@}#Qv%CB60f_C}UhuM{7 zPa9pQvLLjL>uCcqN*05|QEyN}R)pjucW16lEoF%3E+1aKj6Um!U*aKqlmypXQ+~~e z0kIR9XyvCV_TWmtSlATn`!d_?zZ9dfR8_k|1WtAv_>;?d5Voe7HSe%gsnV+T!6M$1 zVk=i0G`*IknjI#+a^hR$9PRZ;tDGK7){u!oAy-&*N*D<}6!i)$(MsSPP&Pl}+bPEP zwf5Mv_s1>+Z)-#!+#7b|2d6=1kWnPI`SM=#Qq}HwfzC(qI?^sC$-?;v&Bl)Cct~jL z)A9`CJvk=CUz;}!K-6={*?mCnM++hAkGlq9rlg;Kq8_l`v*WwT(}gXcPk-nAoE22T zPG2OQ(72Vq4a}K)+H-TQDHju$NYClTXhF=hg^ zXa-yEPC5kwfex10iGPcR^f0EXD?VAVUc@ivc6JLi`_kl&k;&~NHE;==)Jq%k1OP2^ zN-UXAIQ*WyA1V@Q{RK~~IK;^122;|^s=jq?T`kx}ll1S-j*_itFwkLR?VH1J_g5$T z*e|oFW2rT6d$6qR+tpw};@qYU)klVmrRrRUzkt?W$Pe&;KKBT5i%;MU@hS%`~L9aL~m zVm(ZwjLF~kmVR&~tJ!wcNXMjJLTl~^zlq8T;6d9u{wlT~NvCtbwi8r{8yFmZ`cY4a1z`Po(N?FTN&0yk6jh?^_@R2v5T5s-y+zuw|AQz! zQ@!soeKRw(MQWYJQ^3?lEF&@1z8~EDx*5P@T5;XI^jZ`em&`*~GE9~cpb+-q^xqE* zWZ24LqyGciF030PtGZv}8~j2J87>puOQTbtMKZ$~sfREYcEbexk+#zOgooxPuf-o} z*+cjvnH&6(%nklX+@R|yeM|k3hCAVh-rLvD4@tm;g#z5#5zRZ;pC8mk80__jQF+7g z4_}jaO&kPrO0?=&HQ)dsnk*z4+KbhheUGD>+ClD(?`yyXlPp9scfyvlU5g!;JHs>4 zQm#&26gbK`Ffe&27(W#bAbDWGb1wTjTX2-bkEK5ppUd zy(tkp*4=gZh@6KFm4J_Afe&Vmg8H4jJjs+!(4<+^KPfP2=V6EI-%OBs`WzpQdJw-*7PXoN^p%e zFTb$X$5#M&8+#l{x_R&xV-=?$7i$kxD$U`%$n9L*e5W!n^RaTCMk;q&b+o~XJ z$c%h%KT-e@RqBa3LTX{dZE2#J*c_y=)|G2bk^KV8Rxe30?8}^>o zs>pc8S~EN{;RujDmZ;L7FW*1wN)fKsF8_v59yuRwTgOOpeVc2?N6Z!3sg3RrBR2X5ln2p#w82HM*bPV(3Rx%FRH2z9&7;2>TJ#H9o zTJlUMn+w=5%O&LVoBWh=3uOOl=6qPB$3E*(yd8?SL>`?8W7Fx<%gCc0^8?IIJpe~v z?o|CQ>YjD8^tpsk0O%vJR>e!HOHQ1WZ51&i7F2GDJ89D>Bp)?iINOud#!v(nRU^=s=lzrOq(wr3;NVw}e*H)s1{@KX-ALSk(cu6MT| zFH(p}rPM{VH9gTLsQ7FRciaCwyN`YsXgO7)#NfQ*EwPeAIEu83GZ-3-{=rjf`vp(= zpFuiKl=zpC33AQ%C2)z=8P02OlRG1CuM{LksTv6oo0l_8NRS?*xitCVkO`V*mtT}%=Dzw|4e+CuW1}g5OLW6;e{mJUKDk_QS zzoS<6HO?D;T4$leS)iHH6;I53p}Nz#wu zUOzC{q(6Q9WqaqJ@OGlAL1~>hX&N+7_8QWvBBC{!MZu8e;rClQ`Rnl9a&@4clZpd~jmaRCu=}c;>3-wH#7K$@JA)F&_ zcoFVe?z0PP$w%Gkt)*UV)jH7^Zz(``K;CIT-cGWsNZ~=eu`o1yW%E3>IIB7&KjPkx zZUWxKPi6!>tm@`Z9j}L(&>V7lfY#5s^ z-oXEp_MQc29IGJL-j$!)p5n8yUxL3Xvh6poko{>NgGj!?t?WZa z4Y9?qDGzrX7&xK?)-*%9)-JFa#z53$2zRzUe<}!>yn#*#+9T72W#x-(_aJ_+uQd%id}ma}EVIk6=DT`O!9#8_o~pyGYemtESLt+Zdz-d~zWs ztxnryDbKG#@~dVvx4tClKKx74*0qiH3Vh=yDpR#TMh}?QHIc;YuMMf|YLD38eUn}% zF2eUOv8$jx;@CgAmi~)!f-yMpP6QRH^ISf3v)eyplWkgpcoNxsc_F1#H^=TEotSum z$X_DZ9RF*|z0x$vIwDDZc}oTI{MY}^lLG^<{9C_bKWXj`G@Xiv`b-rEFJ^nD0kKcA z#h+R|A@p>@v#=nTfSkR9jU)i-=#?Su&);O7Au?o7^PCOh1 zaazZ)y45g9#E6OltMz(W?zq8WN!#cijX19>)VGZGo;RpnZvh|Jwc&hX5j+>bD;)oX zp8P!PwMeTlrXK5>JVNZ2h3o^YdMCb7RelQyL&ATYkN#qlFiItWZ5hrWH$go&3btMz zB4H7SZZ8n)fKr8zDm%6EE76G+mql7Rz6}TmoOg6Z=*wL5rO6&1CL($El5pf%OAm)q zHO0Kd)3_+i#h!g{*~8bO6N{|=Cq-qmORm{HIFR1OFMNp7e+&tB6*>!o&OI%BK+D-p z0u8qcz6>bXgS;V? zZNhO{>OSGLb?E(MO4`%!byiKFJ0@w0v+6^LxA6gTR%P^lf>gNbM6%6U8ra$Tk=TM* z@dqsp-6Q&2dr1)v1veG++bQwAEp z%W=dIzCLQi04}5X8Fe4i&=Dp0FMMz~($WI&j^NOK2t5IxIcjN+|2oJe00Qy1TQ`lc zZYk?x7_2=OmICz{|A>ow7P*zpGm*vD=v8;m-aNYQM( z-91+Op^7vN_$jewFw0X-JF*K$WEYlD>Mkw3u)v+W-_*I?ntr;}Pjc zq%Z&8vz1WoQqbPCfWPq-!u|E(?-|#;KuLfIOYUznxtf|50QjCjiJn#BRU@Bz5dQ;o zl=k?p!BmN*al1QkhVG@UudMhL%Zxnicd^nqK7xbHlzm2f6MNfR;r96oSnye-Wi8-H zoJqzC7L5)yV1|lz9vvX_QVz=W3=TzF|HPcyHEct-+chJ^uD$ABd*g)=qj^6Cl-W&9 z^nU&bP88KH<8c{`Rkcopfxq*99{M%EPzi|-;_FR0c`w#ZSnCVR5O3FMD{It|GD5om zmK#5oQO{U+ETc+$`pqYxoKA3XLB}!P-xrA7EJ|p6RZ`_e+G=gF#F&V$?-^VYY2CrQ zv}j3%M~Xiv;&Yt#(pNK!GK7Q5pfLcw7Kw8i_yJ?vOX`Z71tqcD)_HU+4$? zLkn#SOzYjBeOFP>uDV$rt!~HvD&E3wMuEocf@|FG-J|cN&o@hNgo00n(7^vP>`JPi zA8}XyUAQU4&->|?25ski=+HWIZy;>FC8AcZJPCwa-vJEvAX|wagm_g5AuCN@xqwPj zpuf<`th$GBKCG=2z)|l`i+HBJlt#6qAN|npX#3FyxJm-z>)h?cEf#`SgE@0cN_}-0 ziO?0JxNxs}{je-7@eSD|=wx*tU6qKm2%#4^8S2DhyEz-b-O=x%FfDH8Ro=^X7ike4 zuC3mRrSC;5j!^Xsirnvpay3ha5JlB^BKc|{ulaTnOs3x~0QIVLUwK37E3h5y!%i!n zII7!vHewQQ)!iQ5Es`++AZK4d35&1#{!Ih)Jw_tLpPpb z?aN%PQ_(v!?!*6smUb3}`6@k)tMziv%ZWDzM;_faYO51G!B%HCXWZR$Ba8PCcCWgd zKSSq64sYZCXGq8>4^|9K?kGuaJrsYHJm@FZGR4`JHsKV?$G-Aq@oHW4uk>K*Mr;3( zXr<+3{$3}so!u{UmeAZ*^;tVZ=CSH7YmC(tOc$AX(}Mdb7zMS?q_Y5p%~~)a{ciy@ z*x7Lnql&sk>vd|qx6DMluKJpSMC}~x7|jfl3iBzL2C*V&8t4Hm(*6K7c^mj!&!rU^ zaPXYbTVRb8Q074x2@ZPd9!!;ocu2Ac2!LD)%tbg7eih1vpgL=Hk?)G(zU?jWs24v% zXlKhp%ynT=+~U8f3gHqKI1EGl6wxA7Dut8@GtA2RmlY+f*&A$+xf3JOi*Sxy`SfmD zGphLbgPL){QY!Cumy)L^mJdb2XZhJDwdC@$Dc)kg*qRXGR{pO3#xQWHniq$UL|*A zlYh>R+L3$(C1C^0$aQa`6HF>j=JA7(c44CIYT4K3=gr722)cXjRk2*AGhyCIKbnGm zCkR;ZuV3Ukv5F$1qS;T=7n`QVGh@^d8e}hZg0P)G)cWzOE2@99i-YxQzWlai|CC580L%sIIlJ#T* zuFTb2q&Vqxs=7vPMY?oWOYfZTNl{eF^h1#7hf}=$x7%qM1)+1@m&jKpv}iK&X2@N=r72klU_>5ypLcUF2ip?INBif__al>xZ{j zaHul~*)7$&?_JM-KAE~)#GlCo7PeYP@|WE?`4rD2IqFVI$+d*%H0WrA=y|)30@!YM zo_4!ua9$h}PlSjEo-$;wJW(t z`}oAublTY@1Dr9xaH^25=6wP^-EAx>%a`hy4aPiV3l#)u@7ynCFdhjxkIM{7A?4Q5 zIemm=g0iU5+s@p-=tm;8F6qK%!*PU$U>uAl51FK z*Np}4Yw%8V$pD-DU}%KNrOc(C)uI*h1{d_a|F81tygblvhFx2WpB0g{(#;; zr1xEVzen#6>HTCT!n$Loep{)}!+L*?-tX5k9{?bdfy%vgHmM5G0<)e@tOpbC~M90Et(t3tWfg^Qo}x!yY9((OKV$k!L})_P(Vby=40R4UT)D+;ArulI^ut#hOXg$BYq_k?<&OHk8I@(cHId8XCFOG$I? z$%?VMzP`wy?b!*EqE);`%MBEf==knMecK*IT1;tAxVax`b0k~7Lu#kD@O0Aks5=-R zbSBa|WNG1}&^RR`tqbXbts{u+v>gG6HL=jXLk2?#2SgZqlT0Mq(S3nsldSq;Yhj6r z(9eh2%mv9qZ>Uv#q($tC(~WS=W(F8zc9S3~oKx2;x`f%muD9-x{+pF$>r|Q6vC6U? znKKVmSgLT2ExbRu`FJb>z#T?FkeOZ%T=ZR-ceJp^w2&cxlhQ(+eg+@4pHMWLQ6fTt zPB=&0a!)iBxhXK6&@tG$U?$nNtp3txBC8(x&|u{gC^pbawnk7>q*`lfk^`KvOWpn2+6ygrKg*NRH4%)H_@rG{#rY! z44p)WT-?<=1#e5#HQ?LHC*S4KIJ3elis6V&v-d z25}z|2n%7NXl0+GQs@LJl%$Y>syrGbj~2)ynH)eWbJjaW1J>r&>ukugRxU_IaBcp& z6(6XFtx%0Mye6UmPa}^O^~wo^cM_tsPt=CZ;q*iCmN)6q!FN#?t#)0~*$p4=*(Vh51&QTK>0FHtg5GhE&^?u1*l*XkkGS`0_+ z=^Ae9Jjo2cLeo?p&HccJ$}l69FxWkfnBczHpb_@1lAazKL)gv zvYy9FYm-oE>qkl~d^%?BaJ%*xny0jd$R@pwU8RkQd@Zdx@%4@FuYYg4C6Px&Gq=@x zyTQGP>G1}^8MH9FcDaBh?Zo~#JeIbxzt|)b;y&?Cu5k?v*eXwXZC_Gg*N5`9CF|)zz3_Kbty7k3 z{_W><%Dbv5?bsJ4Be+UvU%U_1-tG^0$pE2qu`IU z$fsr=d$**7Zb`BL>fHxc2~1IQXvf^U^k;#6hfJ5PpwD~3R?<#niOxX2?i1YDj%?Ky z#B!{m*1Q&l6UtS#qrlR#C<~OE~Gp{Hw*ATmAgH% zJ3ACBsLi${AAu;98`=9UK_(2=ysf$fEXmdcvo(cw($_$VRf6>BVbMSd11_g`LgpeZ z!nnB2FB%=xgHle+7-Xvv9n`(@Kfuo{5HcYaT z1T@Csq0u-z=u=&G_v9&l+m3wHx~u8891Ug5!?_XCt@aye&k$YDljSLT5>WTNNbB+* z;3^7mm4eylg+(K6C4Zyt>wC3}Qpx$$FWP5mC%Z}bNZ60Bev-5|&e7-IjycnGB&D#Sqz4~c*IpWk zXZ^b9jMVS#p451p-PbVFGlmki;5KFkz{x zgj7T*w<~~Qc&d9W(V)OZ&X@BC3ylaPfOGK4JLQev{Xvd2%@#TVd2e1X++m{#_w%t& zJN<`JLRh)>GD-kaNsR}2S#L)}&?Im3&!ff}ZmSj!Hn^jAf!Ao7RD6~m5iTWpQz%b( zu&c)Q;B_Kf;&=uUofp85dIs6L5`-!`_>6p~jN>0Aw2%@>Ynvf@ZqL7TF!@RXlP|Jz z7)2uL{_|OFt?b5-b?Bsu@Uoxiqzaf!?6Igj`6~tthWO_Y`o_KrTvsX&|>A@U84M)jfm{Q!j^J#M;?&{|&bvdQBMWRsP%9j_TkZNtZuXJ_uywt3VRRd=|eJ{E|7s)<3zfwPv6xoV9LqHXY(}O z#xo}=5*=Sh-LJf>DD5Q0B0vD|NXJmn^$=rTkfXxa$q@g&MCN3M`?c@NE)trL4d0j_ z>#Y&9oz>H%-5KtQcjy5M$yxc}DeB9Xt-cx|DbjMnTf`qby5n`yv6UxwNoKUj<_6?$ z*uaET?*7Rr&;+GUq^#KB#V)@(RVCu+071d3^(2$gUMC< zC^?m@)|dW@TVsqgWRlO<0zlh)=U0Y}2c8}EJbJM#kNwO~H){XzUj2BC`xqQNk>QxIqh7|x-a zTZ9A1SH9g02m8AA+geyKoV{pLTUL>MotP`e?ys~la2 zBpm)R?|PTAH!{bXE$g+OPax?{!m(7xxRiDh}&b7KQ*<30GqZnp|YxV7C_#aHH^>l=++WUJB1 zmA-qxFYfv|LHX68l_{ZJYI24_$SvQ5ZdHdy%4X!1w6)~e zU1iDB&kY5($gE&ngC(KPk00{r6Y&X*J@!mApnzAD%J)Mgdh&y@qn(QJVtdlik%#e* zkW%?Iuxp^;gI#`&sQNrpA*@JqCNs@0CMjYfBp`CX*COUQ@p7zw@UTBeRH&!6$Qvkt zOMRT^ncDhP(f9jC{XVwG6p{`+g4)2-+wp60hVD@JmS0deAG#<1Q-d6Rp(lSp{8+x? z6S4APOlVvGB<>~h$UUbMgB^;$`;S3z3gq zDx|&jI+nikZCoH=MD5j|Q4dwLX%(?Q8;!VhWcr0H=+(aQQ;qzp7IP=}!8J_0Rwcil zBp;Bpn~-*~IMV0UkSnuA&%4Stb zNG4Y1FnJ$8$Qs~)0N1tbqq++Z2H3jvVx!F~^PHH??(Y(2=fpE2F?+PSlcBjcQ48$V zA{>JtL>7|@qwdA1yA2U&-7J$|6T-|c7R6BCI~YAQAkuoXyoq-wmyc!-UBQpB*~by& z31?Et3p|CwMalPrv3YhO=B-`scX$QU@zt8-_Hfzq(To0)nIcC-D@F!l=fGgS!tC@p zAGT+V$a_2XIr(s+`LLuSxudY`%8`o>CR1a0ZXM1L%%eNGZ3MBfIO7)9L5@qVN*jtw zL}9jtPsEezoA0!huEgKpnS`iTF8sDrK}4w;1T@bIH~*!vpwY^BmA={K2p} zk;9jNWzX3H_}5m4wK|X7lVg*dtFjs z)kdvBs09t75mQkAyanRKKn9slH1q+6k^cHO_GwaM9!$I-OaFqrA1hG;`ji)k<4@2p z6VFQgQFFr(D)xKowAX%T6vJsdf#E2$=O86C=69SYWoLSSWrq{i#1(HjaX z3jleVH%V)MB_oiKzy-N^%BKHF@uy@@NXyPF5%(CQP!x5aA0gD{!2dv1tA$VsJ*zG< zH>qk_j9!OQ)k@$~)iRzys=Clz%n^2VvH4YGE()+zb&2^k+FVAO%Q$lxV=fcSWxTnt z>ZR&(bD3-|wdN9)i*%b5)Eb&juJMfJV+!7xQ1lYtU&B2j{Gh1 zc+TD~hCzt=67%F!@ym+`D88zSVu{P@6L!Tch^8KNII3ut+ES47TJ?89AOu(BBW2bl`n@qE9okuvdg2%19`EQHecKghfgRIE6oIrj3hd`rOk**#l#Llw z$HlNqmW{h`!T{DM!{>AcXc5I;*2D)bY*0`pk;q$j;T#=1k{T@=e+kDaO98EH9%9*6~j#2*#$ z@T|m5B?0xf55i=Tjw9Pp2{C7W?j)yU`)zz|_7BpQe0KxC_~wknO{bxP`We4u#C*p` zd~r|3X_2)mE3m5-Fm0QUCs$ENtiq9rz$RgEWOG3-WOg| z5SZ&Fwi36EX}7krNmZ;fIMXT)mzgo*)>ryB@iV8Rv4e?a1G4AF|6*TOAn+C{qg^To zKX#@oz|6-4J)v*7(Hx!moc_WWC!E}V4gNK|B9+^%K@xXmf@i=%*vT+O4`kl7O1Vu{ z%%hiqRK+#svcOz~Zt$?lTw;1jCgj4uRK+sADC1}DTI9mNR8l}B|5C}D%?)?!b9cAr z?(WUq2^o}sDLpljyU6B{b=fkbfV1?h)3K#C)~U`35c=x3V0wrig$D~B#}Oe}$MMH1 z{r~HLB!X>EMHCxB8C0ZIe1|kF@s-CZo-oQ$JW7w@kM7SB@uTl1YA>9nl#0nOv+HM0 zxvpoj^{hY&Oc^H4kZX0qsb`?`* z8c&f_^&I&qRXxjGX3E8RQdXmL_apoj((tv#MDv(1!o4r?VV2kkB~sp_`Qs@Pkd4tJ z6Cr-Oj}tVq-yZslA|2%*DJY&AhI#V)r|`sgr+@d4%kdZVKRvv+|CgQiANJqh+ua}1 zAL;*JSA2H=ZCC{M*9CuP$Q0eVTqReTj^22xIet>yRLHOk*M8>(co#+p*9l*+JR~Yi zq?qdHhCKY;2{tm*bJZX`U!CM^9uSupaZc4i7|_rCPQA4tLc1dEKN9Lq0+~l^ukoC6 zBtFIK1D;E3V9QZEkFJhNy<_6T(l=3-3PT&n2X%vd$MaBZP;zIG5_Z0%0wud}VtgQW z0aVOh^Rp7epWaq=&)~rPF=W-_vuJk{* z^z#er$?|1BFOtt+W5V_Gp#OPsa(O`@a(i{jj_T6_&hinWp23X~4eVe4qPjl+(5zjs zOyWIPh=0*&IlE2pg!qCX^2y^GjTS3}bMW=A`daTeMa6siFGNdb)B@2X$(?x#JUZ;g zk;G;e05o^mZ3DoONLAb47&+;z?X`pS_u4n*_Y^W~zsgOdYV8~PyV72Jfq8!(7i&uG z*j=UDVneO!k%_tEj${UEe|v*x39DaqV7|x@!xw#I^dC*9B%2QeF!_T#B&I|QbV?$v z-xQKDpFi%FCyr#jhtuTYbpCuM{tLS+>b4yF=Ts~6_t#h8Kc2em6!71$fVh(z7H~$% z|9dPT*5Y6pD<~IIuGha$iCY*tdEF(mCfk#T?6Z%O5OyMnA@#KMeizT;T>KJ3dMt8gOH+b9W)j10>2Wp4s634`MqV0;sYCiTzuz zGTM{uTjF6vXs>Q5x}dzlec7yjo`$VcGlNX>9DGV~ay6vu{A~77iAaZXdiGRLY1R~$j6O@x$V9~W(7ogFBiYno>5W~z?7CYL zd^Osx3}FapY7|FqpB@3fx+^?(4?(l$ ztBsBLx(=g} z8^cQkQ_`39^Ak-QD|h#~4nHXxQiBT8#g`)Hzi` z)@O%lElRPb3CSs;F3L%^0;tw2Mtho#4WYWkvhk?)LJ;#E!SUx3RYk4=YxzuPbq*D# zMcu>86cwnfT^tG2xin+z^6-+FvxG z5;o|VOMU#9Gj*WUyHGreym`5& z6xfxPkx6nz5i*$z;>8sTi1ChvVzV7Aeo?4yFuSu>n>Q zu2|mI=uPXtUr@SC65#`A5l*nD6w;63mz3^|A7f7`NKD8(H`4NF=^X@J97NDp=($X! z6`NEc?@^&V@$PJ6IfJHDYd59S_wpz4q+(WVM!6-uizG8V?6cq5Q)ZEffGV<&ZsCo@ zS$|Y|-dokL_{GTN`?Bgei=ItGkNcc|OewG%XW7N8=<$~l%h6$c5gXMll8)=NlwDEI zYN(gBkZr6qUAwayb%q?aA+l6bb3-|786>4RvHY|^{A;pnOwAR(r~0%NwG@G}bAT^8 z4DtmKDsS;GbYa<3qI_8?5rN9%U-mkg345!F-*eY7EsS~lbJ1F<;&xeoFYi!sl~)GQ@DI zPHC6*2lpq7bl+5S&QbfMcrXeL>vB(s>kH?K>r<;+Xh;=Y8Y`3TD&rbgr1sN#a_cYNT*FXFGU%}ku za#q2KeVIJZn@{{LyEDh+0P#(xP}D=sA=7d#xl*Ltuy8rdxN+3~7cRy2cr%kido6ey z!prjkCFmRgm>tNI0d?JF-t^<;&P|nLhe0$^BG)50 z6iClKJ+VRDj}<_AmjcCd0Uyp6*>H@VlsX*yP8b*Mk)ADv#!vIGJ56g0q+de(=z+#8{mTy zv;P8X)}X0b5VhV*{{2Yu*}Rrr_Dm$j_pAj`d(BrFL8NNUmjxKL6YPg(>+gpq%I^i` z_Cx2J-=+Gy(tgM>zb*Y;Tlxp~vf7b}IpdC~cCQaT_VE#bv-yOa=I+KBUd;QZv%or@ zN$^_8+n<$$#D|-Ll=9GZ>He|1l80W$)0f{$ z#?-in(Q6Frhsh>{(t>z(?-Ts+bCj=6rh;Yh@S^9@i#Wkn=_I>|HM=YG4V|C#u@uVH zr-LtS@In`f`lGdzFNpsam*7b2k`o>eXsAa!xW#L=(PLqHo4uPaYLYvGWzFG5&!Xhl zO5Fx`@Uu#~@Y9fUMnjLm{@{2}s*$0dPC>$yY^Yai3txRw{41jN4vv>|#$ah?>^gH} zZO@!ZfX2G6*f2hsQ4jfh;E!PPOAKE=C?0PWmumeo`qFqf{(XGeXLk|!F4B4en}OK~ z@d#@^U^wUo!#^jFye``kh_}OM`9xg%7Tf8fFl2e;aEE|+P zSC#`O3^$H1yK&5-qO^G9`ZnbHj0g`rB6w0?c-j@C?c$B1$eg1!#x71Q%SWr9S4#q@ z($t~>BoNl~6gg1Dj04pxG5*Ve;TeeM^_;_HE5?(SYs{ienF{tRi8aJ`H}1^r)cKD* z8Z4V|Zmg($mCFF%6MSBu4A%OnfC~1YCYA_yhzLQ@;09% zB&+Ia&!mL(e|E*lv3trYiX+KQymu}eZPo22R;9y{bKPF&7S$WqbvSD`O@JQNbxQm3 zoh12zEt9Qij4am0P{60%`*$1h9sX`ORSDC!m~*b3*hUcqmUz1Adf*MKR!i_*S2n)e zdckdY21I#V323DK3)0hy%Cd^u8$Yj+6(cQ4!KrAT)llgK%bntt&=&%OHm5&;8d*mu z{8We%$wQ$6u<3Bm;jp8J=*x;o67C@%uU^UJdFPE1ZE7CA4`nCdNbizREKK}2k}!XSvLZ7CkkvQ16R$Ug2K7Ir6Zb+Xx@x|8onO{= z6)H5T_r@KbDAtv18XbsT%Q_M& zYER$Sk3QK=BRSZZEN$jx;~j4CmA;W!%a5f(C}}tPJhNX&y$|fvdJS&Mq+qDimD~|7 zn>l*XLmAS&?88Br(8IIc_&iXn+^QHU$hGPj*uJrQGSfWV^jzx{Fl}9%7k|1+gz%baDo9lrI#yxmSVcLF2Y$;MFw}WJNVFUoQ5H_Oe@NG>FX+|x`>0<% z3wZ&ZR3!Nk71>vi1w7L7Rp9E>=2=r_v3l|(NJvXHkAM#-j815>*Mdsat)QvqI1GIZ z6T;Fp4vy>tYUIVZ4Fhck8 zMcphS7=e5M-3<44b3cZOCN8dE;|%wP?|hg||Au;@FOU1n2Y!2&zkIeY9PD27Q)cDz z=Q4r_D<2K{i^#FgAerO*vikXx36MS0TS#zv)ibRt=47j9+0`?zn=)&%Gb{86P;C7z zLd;V#S?PInPj@L(nNG2(09k#Gj>8gc9{3ddCtXjIy!CXz-TgIhJ;kQTS~|!ner_>!yI1tK(=^^X+-E6m zMyj*R$<%Vto>F4{Dfy>7jz>1+Nj7PIznD4G{mFet3_ux_tP&)*6}uJvnLzftAUwmY zUZag(eZBItqeZ_CFG!HRoK=H;F*@hS<_pK}GDn*Bq7ZTUBAcfUu&)e7Hm?wq23O|i z3Q-q7x_Ka+bqvFXWg`kOZji9sK?DOa55THHj@aG1PZE;`(z7WD@wdQ8CJYElcgEDp zNBEBKkfNRw_^Y)yVs$a5PnWbq7t^6^pqyFwP6$3%J9GsdTC6q}91%VBXX(l^x)S@$ zt{h8O{MfMl`7_%5H2ak;2|68!9X(JG=hKW>`p73HzO2Fql?!p#!->mLxwJ_Yvb+3L zR^-}tsi@BFPk)yztG#aDXzRVa*CH(&DAr#0jy?I5lCsICgyWNdmbFqU>6th+PePZ8 z&4^oDiuq#YDTQ)>^GtIbdi&Oafykp(@3e2F@$^|#WcX#umDtlxA!+NHiIT_spuO_1 zh!^k#=t5V%!mVmTBb#f2y@n!Ib65Phu{{sxrGG@*{rXExMnZ)I?nSm+1Q3## zmu-Sbaw^!?r8k9ETesd!u-e|`rl+PpFZMa7?GX3Ql$Z~|TQAECtlXi%-z>*dsWv%l zVo;)Pv0jyRI7;a6`TWVrZ+c$;3HyiNB&gaqfvC6Zmtg`y#1S}!O1ttr7^c`bOd&${ zv{fIX2N)UIyeJ6CIKXl_*0+j?Z0^Y!MjQ{Dgmk8c5r06RA}3!TqeoV#*&8fLBWAUKDC&`|_Cyuar+1U58r_1Y z{oX1pWmUJYAEKmZ%GLTPP;xeo;4fsf(Oq+;*)jbS#71}hRrG0UOvc|Q^wQ%lSNE? z$+tl~MCFH@PPX#_-{~R`O4!Wv091-ICse3nW$2E)hr`BvX7#fU8)MJP<~_0Kx2pE+ zG$w0=3~RleN<590*r(hoU^dgfC(?4R^y`vkmtMDLwDl}bmGJ_ch2>f0Fu{QH?a9Ny zfR%y)hNBNasYZ?({1wc(9QnXwM~gRctR$_z zimGF2Jnv=@+`8zV2g)E}f^`dsp~!HXhg9g+oV_76{ADHKUUSK>~naPMKzO3+5n1syd`QyI9i(;1#s!SIx{I{%Lgu zDV+qW!n!db7yfzXljg%Ae2Cr=4)oFyGNVqDki;8jamv5?cwee*clk`&e;wt&?y%qCQf0iHbmX~rf8KtHB8O3@{5+1Dx(H--)) zwFXG=Bg0&(Zpvig{MmgQ9q= z+MR9y1s_MQ&ZaxyeiF;d^70fLk}qLM>t>em?To4JU$*E#(`Qf`YqvGQ@hHEBw7@Em zEh3OPZ6ky2vMY*}iRVfBcK-C`zkFfZ6qzGM7V;-mwUfVr%-IYoENOS>!NuaJ^%%>8 zr6`K`+|D-}dhDvX(%Xi7nxDb;5^1UBR!syH>B(?ZOHEwHo6AUZDKZynnwT{F zrK3=wdAYj<-W{Dl^CCVqt5#FQzATDvWnMS}Nv1h%3PDM&bl@MzM!7xQ%W@vebMOX}t&dpiLizE_Ak=yeUkg z2aRmiQ`MChX&plC=~f0R3=i){X1;Ap{ASUlMcv|gTHDGG0te{C?NUQ*ij*UTG4b4F zy%57Mdt+@j{-8Gh_`QOwCE`uvHD995OS-W`_>xt1+LtUqx45#Y$g2|N>rr!4I{$$K zwzvlklw}ZE^%r`U>=+PPwU--4E4V}GJa;C30Y2Z?@&xa!E3ZclY1J&q1s5c&+>S=~ z&l=P?JpXzR<7T*9O_<~U;!u2;U30xq`pd81(K1-tK9>jHEo_O~GqFAox*>8!79Mel%LN5GE)hyFXTZ{e#=wFqi$I|@xSxE66F~E(# ze12ngA(m4A{!KpmV$@s;$oS;+7b(lDY4gt|=60id$2`Nb0_Av-_jz!BK6=lnd&1Lz z4YpXKk~F#xG#IMSi5|MHzkMKKvADDLbC+&qwTk%Hd!E5Jj>d;=bYDN#fLWAet)nO@ zIEFPPXhy8RFMY1}ZTpvb3uf3Aun_z6c36s;qf%D$f#gkv=w=?JF}{`nH3XR`SFShG zave`S`T~2>s$?jJ8yDsTHx~7lTPsV{96Yp2J(4qU_+vtTFv3kX!K1g@T0c6H-R=)J zDZ+x16ZokpxzjunLA{QGpkQgm80+Q8YO#ga;rEW;zLfKal>#b!is^Hxu^~IvGaYCp z{8~0Kp^PPYGu$l}XpyzJwn~NNmn5XRGaCS-9t$ElxXu-?=a)b>$q+`c|8IWX| z%8}-ErVviABXS2>!^iGX2bMcJMs+G{-wz-9j7R;Gr-zW}7TJ@;kb4Rz28fQo`N3Q8 zgVVd_uCp&im2@Y&`nmRCz$T8xHKM%G8%_HqPr~L2P?qP|txpPzcmFnYgYKKZVgflh zN=Th{d5H&HF)a3s{62<%rhgJPzb*`I@^k>8ZMfe3+CvHnVNyu;+Y>_r9EP;J72fj{ zSv)uy=lG5nQ7h%1?Y-EM31S1x{zM{|q6YU^eJp{Ju&0YQaCFacz8vazxyVyY*=Vzl zdgq_>Jujchm3G@Vy2Vz|z5yhVllS`h1;QnA@MvuHw#fX7W?l~(RJ(NAyr(E=zNwFz zOysJpAUUt6t5!?Z5%ae9DTkRapvy+Jq#P~zd6LD*qGVpGUr`*(az(}5X8AnK9l=%U zCi`Rw$$k5jV79fJu~`sUr|k(?;wWKXyWC5EZBQ0l<6cy@0jnTayO; zn~;AKHaCrWDIk{3#~kE+eTcuFjD5=$_T4A`3s9~u|2FuB1{uX+SeBJ25JhnE9WWcn zfFWXuK-*b896nb{gKtuhX92h3mjhLu=tZiM4Q02 zv2UR7Hi%yZcI5E=H@*1Y;N!d8D89>$;yW&q;5$DR-^H~-@SRhsLl4ju^`YeKkfvms zU`~&DQkVT8^Oc-g<=iVjxjwJYohQ$<+iy7xbn4c_Vsdkd~Bkf&txem3Rr@g98*o6I^m z*vV#-sk%4n&hzitd}jIg9mESY_cPr8zFVpxtM?42>Yb?T=Ax0ee+0EnG{5tC44Q>u zV5`PjK$(LB)~jm^{Q8J zgBA=o5&$kod0m}VFCZ}w__qOX~7ajw0u_ieATe|zWmZEw73&mZpl zI(jj4Y=4n?Hp3M~9gvnj0l~SZM>E{!zHJeFJ)&l zeu~QY`8nzxfBaf7+yFDSQOA#J1_pug8%3saNQ;G&R*=W8W6((23gqj18^Lhe2k@(z znjCa5^-7q*Fzt70^|{$TY=*?Kch${JBW3il(|hL=e462=e%OmkSp}!_WHkXO`~gU$Y5yycSl-v5P6CeSs1R0>Il`c-BV}*s!vBqm~%euSAEG z`2FXlM0}84)xpsa>c^ghHYy2Fg}6E2y?~Ek1>7%)vvAPw$kp z(m_#@x@nNX%hL1DYB6|{iro7)0%Frr(SLJ0{Q&fwL_pGe`AXzv4;)+g%3+{<^-Haw zOKxw=`v}n|Q=s%Qa})$ycSrSmpXJ#Esy~zRBW#_d@dw@WCsL=KSGH(o1teX>#E z0$#z1g3+HcdV9ip7O!wCu!f_5?z4t?HSiFAG2|ZaKa5SRpgG#wnJMb`*}peh9m%#Xs-{+w`S%2hvF{J4RS)=Z)uc=#% zekhyeeY_TH8gK}u>C(a{A(~PitD7A!_`W%!w={aJ)9=@ct0_zv_tIAv?d26NUr~3x zUmDAZ*kyz~B98!$vhnVE*O4m41wmVF`V#aIWQ+=9m`6o2hk3fUbVl8YKhXxD31@2Q z%&B_uU!Sh8VXnH}B?q*7Vr*gL1R3S(ZzzC{b5B@h03^!T%vQnnPr-M8{~@0w{y+xS zsVX!zkg|#J=8=}up_7tp@{-WlJ-zFtbi%EXmO@@lD&4l|ZLv>Th84!_u!zbB4h!{+ zv`g%A@z(=Mzyb*Y^|Bj8tdV!k@{T8UzD1x2io#XHV_nHRC;l{nD0D;?FA~F`Y{;4Z_)k$WuX;##?Kr7h~OtclCvb)bCQ2 z!RVc`NJ<6J&0T@`U*X&DBCx#ivaX~d67;wialB%loW~PW`35gPul@Lm2U)^Zd!2{> z>lzkV%-^EJn?Np+6$Hm{a70)W7-#rN>DoR8H+uy|s?dT5rQkN6CY$#Hq-VJ!8@gCo zBb#+%TLKOU&Fs{BUPUXek5 zFRx_gUj?*IT?b;2J2+$}znyOMR2P@ir&w@D@M4z0BeYi{rzjik!ZkgUic4Y~Mjo_- z?K^^lv8V%y)~sTMpg|2_hBs9k{j_Z zI*^Aw{NcRVmqu+HyDKqaXn;oIovGk00uDNpST+=o%AxYC@)i~6c$nNep!AvebM)_6 z{R9_LK56$p!HO4#HZ#?j4UFwbtAHn2;-Py>dLVX(@=oYTOA9LIrdzmEUsRG@3zdA< zt-l*~tvmB=HSr`y6|x#p)+8YzLabpexbYx8g2E)$da0>H=ZJ*VvCo48b)ClBeYkLD z0(IhRl+rqdWHMfp-lTuT#Nvz}$4Q!v@@d0d;J&F1X4Z-$r<-ZdosVjMP#77FAOSgk zSB5N9sJYvTze~7F4uGqC2Du6BcvlGF7|G4C9JOpxIREJa0SV>a?LPC05-ZsVKRth| z@;8S5qYv8Or)Av;q-7MR&E2$&f6O2B{JTVD>Gs*60Bm5+#`B9!)FiW)7Jledu4EU87p7NG z1N5&Wwlvot0p$fzi#(P`NFRRANaESOFBZX_K+j$rWJIl(fZIaw(R>Tc=bxj(4ZEBj z-;yeLNFknvutvEp$1mwe4)?&h2b9~R|drJ+SXgn^xdvdGq{i`LZP&E&q(VZX97S- z{O{k9HL+Xh+(j?t=KiZcs z=U(cH)sJ5sE&dJ$=739-Iv#%nBGh%m_dINv5M>!;qg_d(f=ucu z5%D2awU?EI>~N5C1HR&vx7*#C`{rz?Zl^Q7ivTilj8z{qPQHM9xM62LZ*iom_97Yh zaCOXm9^ng=>&v0&^C$Fq2(UYeiL->EJI?*)(mwpkAC+C{-T!@g*~2$6cJx8rpHcLM z!anfFsbKnkR}6s#AOz`w)*ld>@K44nG~u9=c(L7_!UJJU2u$UjEm+5} zS?3QhHuy57Z_AVtxS_VVL^nTp&}F=rSER-fHYvHBli^D=nY^L*99_WjNI*YED5L%Y zU6&8Uj4p9mak;!QZMtK;x>oZFPo?mpZMyfeTSi*GE=|{U!W#DhhC@zUh$5f(N4W&r2g_}N=uA9%*8 z;O1 z0jJ>|94X!T7z+15Yz~$_FrPj!PWhMA+EkwF;L&wmbjx%l5IAb5^g_xTCdM5)j$tv7 zQ_;Rn?^Y@wsqM@RF;*Abkk?@YcaDfmI4TxwVaKbX;*!!-WYssoNj!`JA^GgU=7BZW8iQ3j3E0yY8iciIj`}kfit^XW>EN`x4J&e zD#yhJyGRl@$L33ghyMW=iIyxrJoDzxK4_~a!V5+&n+}T1xHs)Dfq3|Gr!grk+FC6x?X}IpTPgH^(U{#CdT~+ znY>qYHx`7-l}G7s2iHU5{Y~Q}(`0i+*_Gi%uj{aGVE>lhl=ven%KY8uZ)AKg`{R2q zH@?&-$M-mh88GAP+uj2i9pW(+I>haZUd=q%H<*o2pC{{5#$PyOKVJO;)Gh)`VB6m& zakEvok=->pms?RUY_RG&<03I zZPk6kaDGE%VL{@mwqSfjA!~N0lU#i=_0{c0pUH+epjE|bE2RTtcE76jtfCLT<9n)o z;i(?7s~a@>rHEp5 zWVZy(T8t(F9>huXd}VN;L3THLk@i|=HbayQ-aXB*MU%0h&nv3Pl)C4{M47^U>=;e> z*cm?qol_>{C2j0<)}#ewxBZeFc#V>6?~A4i;gQ8iY|44cz&TZ0qV6QU7l#y*K@Jfm z+GN!#x|e+y7RJYq{_{5ztLU-2dL{+&-uoVMuE>}hhwPOt@)2kKrPDZXOb-kM8s>+x zOU4*iV8wS4wb+ra=978K&Z7Oc7c&eE**pB6{b==7#*@~RP9HaqOXaiLFu%+&Yn2h z9=ATZychyGMpOmM=LBN)$tPvKAqAf-LVZ<7a>r<9w-E(t)P2*mV$S=1Pbm(Z%W6WA za*urFXsFqIl~HAm>qXnH6fDF*n{oMgH9zD z_S&3)L39{akvDVkYtvP15KPUJe%poo@LS#yNz_Wq|NMBnjoAxxO@2X}w3d8EdtcJ_ zD(s14O1G153~ie9;#Gz=wkN$w2D}1Pn(WjpVA25p@7#?9_EkhD_+4!nsdAW8pDl|9 zZ#--38w2tS;)64%Slg1@3hdz%ty+{f2X+KIud!mCs6x80v8HtglTRsHVp*8lA`O5} z;v+dTS8sj)dMEkymiDW+`{VUyPROlySq~F7CRfOMC<8gFnar|+#cX4P z`*p+}1rPKM14J)gpHS~G+5?mEt!nqjvgb-AWNi_4CvMF>mFa%8yE|w5ZwxFyg99b>q zte#RZRkc$FkvYYly*GW;`(W}WunF0+cjk`D$a)X$Z3M8m2-NG*qe@!`Y=|QHY(QSUCH|nEdvH;|DU`+(>@j7`(Gva4XtiNaO(EU|zNpc8r70P%S# zaf6hQNeTdK^ZW^UK7;4xp*GYH|4p&)NwG2Jb8p6CXD7#pWNiC0M<<(Dd*{mU&J;PF z{K|0v%%%@(Z%T3xFO!G=^Rb5)$iq$^dK=Wjh}$slh>=dxU!>i6hv1sB@q_G)@NSS= z&y=fbC;WRus%kg&Ll~5%irx#SvoXA>u$PV&hIfa3YVxLHcCu}i0h-~k=4IbldU6EEf3c%mNxg3Hb%ouudkN;{-NNM4}j$(clrYn3# ztmPWs$y1+NP2;x{ylLeQgZN@fMZ5~tX6=k(pxD*u*8eZ&-Ud9X>RSAskN^V&Cuqb_ zqr{2|NGqsSBd7r~fJ$USB=IX?ty-G)wiIR{DAB-V$Q(`&phcxtE$#KT+}2uJKS-62 z1dv3fB_dbj$JJD+o^-H{)*>IuyuY>fnaL#D{_p)i@B2J2&qL;%efG!NYp=cb+H0@1 z_7zmOtB7NYz|;937PkjhkCaN}HTN}wT&)&&tOi_Uc7Z#Y<^VqPD2we2zE!!es~@_P zGt#+c20pT^3B6j7J1?+B`|IV}1gq=Oqk)EI>cMv;F8TmgZ}!r()W&V3tHs5U6y|?N z@s7Z13_X(#&l4PhQ)raFsBubLXt%|;D(5wn5>D=^g!`D&Nvz4zRiy8rwho|+=Nz?e zI+_#DdEHvJDhJG^uoHWS$&)B0i<5sUL5Mg$@!K=+r|2Jj@tot z?#%sThWuMkEmLI>myRz!w(!qDB9m7UGkqdTjTNVpA+`JmU4}pQ%_B7YCBq}-y-MB( zr}7|xw}`>1O58gTO7#Txd0RI}cBG9EIMsOFG=(o@`!&k&w*iptN#^PT<@MQ#@i6U_o;ZbM^6I%;xv;W1M<3zyoGC^+p;Ti=sZ)ANt%w7I6x@+2 z2o}TVFW=F#fX;TW&M5mvVYbB+=fb6+Sl#07Zg|@^}1wWUF-O_!?KD`ctbZ(i8&JHAkt~v zi->)|y`dYV?2hp-kV}Zfrx_#ToLQrz&EC+JyNeqbTNMU$dEsbj$b{yJk%NKznw{Jd zK(SVd^Ybxa_dPkuM9g)-2F(G=# z&A!NqO)~n?XAE~}5W@}o!hZJB9GRekK6p{3dn2f3ZmBOzm0M=surwbFF>^X;wYou* zMn8sg(0(3~Pd@=Et^Ir;h$a&O-Vs+P3qUez*o;_9xoe}oNCUm%c1y+})hk){B4$j0lT_LL-awnuL$;#_t)1@IGr!9;xRmeplSZBw zh~a6N^g1gtoCv0}sh^yqcRbi59Cb#nDTR-P+>ypj(%QY9Qfja+PIvf$3aJ)g6Qv|x z%6*kTT5foRVP@wTM?Gs=iA=c;RxKD>v>82!AI`9}Uhp@r>p9YU?B`v<_jPvD*cKFM z^)-`GWn~Q%|B0DB5vMs8OAO#bP%2g9`jA_6vg%D7xq(!pV8gHO*0CZ| zJ!*5frY2Xp7nx+zMmW0%vEKc^iR+0wR>~1C4(DX=1k8MeQZLh4PcD$ALll-54tE<=^T3z5RIWTU8^!JBn^dR!EIGNw5B(~#;R)d9!#cTk?jc1$ zaJ~6?)ckBPKkLkoEJozqXnw>jhPNNc4`2l2spjPctNS#N!42{v;J3y~`K!fa0cE0g56-Rd4IbYE#x>4oJ05K6I_Xq>E7)Q z+J?-n5!4gis%-@t9;B7%))~@BAT|zYyF{hgssNnNlQt0fiPYJ+jtS;CGE5WRKsnY? z?(X2kO2$XxqJ*a~(P9b8*o^{)tvP#uL3!?*o&0`|cUy!9jvZ+T#J)?FU0AqrZ%#uB zve@kcrZoFAnnehuLHEnYwLKUy*VXaqxzXuQ15=-V@3Q6uX0=(4bkXZu zLGRsjEt^t|;N~+_g7%sy(||xXYvgiCA}!f#8ufvcJM|&AwIol-*uq}E zpaM~d7%mNgcrBu{?Oe+zTPf9YWOi6FE^fuW@G;-gi<~vF66$vjkm9U)Sf6FaIBTBP z=Yx`yJ3O=q&Z{!p2Fa2oHmrx$SVtA`R|?G7{1GdnsyQ$w80U^!fD_ZA;GW3&ya}v2 ztK!xl9lhX}vy`6`OMwC!;Yu#ILyH!;@?n|wcBCM)n&%_u_Nv2igdvp}TpqlR&U|hxx8um4WDQvPAj|Zhz%qKv( zlMOewMB&LMQ+@XLI5RG>oMn7>X0Uarx4E&Ak#uBTbGQO2mcs+#HyfXXP%U-)?z3MD zHre@`?0(oOMGuz*8g62mEywVWbu`d0ix=xh@!tvVo!a}2q7(Oml2 zZgtoTZno=%$5_ElT)tb^<_q5vt!wt-8u^-iPn-`NPh4SjpBvm1DYag6CNFTTCQ`vi zO@4XEn)9T4>K(Fecv6V9S>jf36TFB?qPYl^vBN`4HHc75D9Mrp}P25WNt* zPilBRf(=$=h*&V;VI8?X5z(*r1)n79NpKTI);%|<+iFM59TMSXcf%jZ8=2K`C~|et zoF}>S28gNF|3dxItVq762{UO$nl?%*mYZco3t#WvQES8}8D8r_;Zoo8r*VjyDRz{! zw7%57;bz%$Ef>s2+Sy-#S7(LrXV7W?POv9|TnpJy@R&mVCJ@aL-7_Lz*$Q3scIACwbL4%kc{-OySS~BwMjO-a_Rl`rJ*mMhL^$GPujBPY;9@ z%a=UKr=*~}%H)dHJxQG}(~NMU7x~rtl21wAnpxnA0^j9BR#_tHkq>=G0w9Oy{Vo&mh zUXMu)#Ni>ADOJRNN9u$(6e||dxRPDBQ!`E1lqR1NR^fg+L}gB8Mh)|&XN-K9h@R}7 z(Uc_o-cxgh8(FLbBn_7Ba+b@abTl?vv~E)l_ZwjtH?@Si@oT7euZ>8bIMCjug1O?+ zfNFrL7GPe3uJnsZyHe7gBkhoKpq%j64k^NN%r&yVlNOT;OWlGcy$DYz*{8eLKrBKP zEFORojH3du%QkTy3TVn8t+F3Dj>vsh*;*^OPC_Vf@w|8lJ!GrAD73zX%Iy0jUWRqw zeE!;N>}FXRM@foOt)mod#cn1A!!~IhBstElygQLNJbn*R>c2v&Zsd-=V`75rCzM^J z{ZLC5nqO2}jccgZ6f(_8Q8H-hSH^jzV{g(ua`yAH_Wtj<@xja7K3O-{w1kac%8v*9E-6agVuP#{#7tiGk@(Vg$hY zHl|eSVkhF>ZELL%obUmxYv71n@0cWPs>sHHhMSoX(WP7i68kn!UF9-AQvRZ>bONY5 z_=Jq*aFpc08h097AYr$0_u1l%&z}hO-o=@GS)qkcd@8hJ)ol^SXM6fMPE{NPq)?%K z-OXr)N?&k7Gk~b{WqZ9$mHxsm<$Y&pHui^c_lzqtYJQNKr`hwy7r$j4Ubu;1+4QMy zOQ1oBi>+~q)E=#sQ%#Xl?NF&Tr^(Zoi>BE_5t`?L9 z65(mZRSYETDkl&VZF01>6v&rJMg*3!{S)@tB_;I0E?nzW%&-^TY%WxU`If$7RzPI! zvUa(&Eclpc{=@UFIa`Df7r_0U$+cQvJwmCD3qRkg3PD~#_Hq&z~ zAty9D72|-t4ZJtcPA)3+s`-s}LqmSpbG8KH1pvsRJ}-I)3-0waXT6+Uh?a1_`(N}& zSDA30O-ozskl$I5D~%1Eu+KC1Ab4rBbMHQPNUf&MVYn+GRY_3p|ckt{PwV9>7&D*bw&>(BN z@b7i}9xBN}PF=+l&{w)M7V`iv4jw>xF_NSz_iLIY9Oi&~{Sp0)++SS~K08_mL6}=b z3fvPivYnsGW*v*1kM8KJRD?dH%DvJIiQ0|DaQl??wIX@3dxp{-8`3U;2~c4%x>8hQ z9EJcuYBvShE#NYVfe$7d0*;{S1yY0K=IBhy`4;7$M8YvICO4G-RR}AU}40akEqg zkcZueQjgv4J^H9X%FQ8w$iidn$xM7&>%L_|YXTRJ9i7|+$2ntb@JUHX+eXNG&f8<= zM-~F!HkqIO=12H5iQ2(5nd$bfH5I0Bt;w>%{A9|HF;>s|@C8HUsB;;KN_Xq0f_Zp= z5EZ-&GmJZ~Gb5=bgpruc+6wC00up{W_+_C)if5w$KdydQEmUC_)M%~IQ&x5Sc52S<~iMdrJ=%s8HO z%ATYPGrmk0m|nHSNNo~-#fwu3QyfH@IeG5cse}p2)eA&;k&qEjf=7}1UqK=ehS_Rs z1W~3ldidHLt3ctdaBo+x3j=-9y?T{o<*~^vNj+|Hzow7)%Pij|%*%8C&)}!y&_gL7 zx{+BbC*1bC8)e(`=0CvIAaTDEIpB{s2;TjKeBAYQqYW3X5qoS9Q~2pesaRHmSka+m za{eCDLhi}mG<(MAkf%f+Rlpb2Tl{6xMzcv1g|kZ=@_U$H>)}GaI?+nBsg5Hlp~{-` z%H4HeGTL3`Qg_hOe6fkbPWUOw<2)s8R=SU0XH2*S*>j_H`M&Ta2=6hia{WW^4Z!{! zr+y@PJ=_dc7+6E@d)$L75`vT~VjrHr@KySos`c zwnt<88|7=#)~>MMAzm9y#cuKtq^PNMkKSfb(;F$hkl{p&$08Y45d=?>6LK8_NTdL* z>V<+z_qSDPFl#5m61;xbmr_Sff5vPrCP7|d18%L{?pEm*^y!~=MZcV$?q7vFJEvE_ z0Y(3unc1>-$`DMT2m;Tn1_ zV5*c*Q#w@**@$dcsx7kfWZ;xE+^^iKa;&g%acs7p5?W&SwpA#NTTp1hsX*|Ib`BI5 z-GL~k7nT#!K^%3By~u^Ob>Ut+Z0A_vy?%cE{O0kS%Wna{dHfdfo6qlPeu>GycRati zsqDQZ+TzED_gN7g^TTI2`FkZ$cJAs=I@0o#J;6FZy2BrB$tmG}b3=*scR`7cBPa<$ z9x3mHa`!iq%0`Xb2YiinE+MSc76YE!-CZchaMs*s2xWss9jgt$~*k5$r zM4?ok*r9Z;$lz8jCPX9i%_9IWUMKSSGHl2^{I2ERT~wb`XuV}WEEU(^Nk{xdC8q~r ze{`q+n#jRKF{hHS(htF3%@7ozQo#N5tvW4HN52MfrwOg$79}(sJ1I*1tTbGK`1f)I zqN2byg%1a+JP(fe0>x@4SQYOYr`}Sy4#>NPipiDEhHw%dOsbqd3W zy~a>nKgEHlclzMKQLelE z*MfsmdcXXBdFtJ7>3^?&4?R7j-@~QSf6?!v+rOaSU7!4~$9{0C-(9zSVZY-y|I>a; z6rL~c_Y3KM@BVzh;d8zFee!7;{XU&a?WbhCGY0vB+q}*aBo0o8nj}pMy~$oCahIOj zWD{mtv~cH=Ur9aCP$W#!Ok0oWCA-`Gb+6-r7;b54q@Qi;T5bDmI>}Ni6C}A{l>0zW z_PvrlW1ieJuLoD=-~tNPOSim{G!rNMjh?FQ5|j{3A4j+X6D1FF$+crTZ6F*w)-z!~ zKT+O1H3M;f2AC(tc?~h$&4iS=uqk%&!8a7Vc!!xpunc7nb|haoM4+J!F;S;@cULKW zHNXbqvKdS>&h@u2pqUI3GzpIpHrYq6Sba;H3)cpf{oz*tTsk%C&+H!H3z;S=-EU-M zHOunydFjF?Qy<}DxzQGB?{qD3fAgt|#i`DQV5K4oDr>cMDfYBOF%|24;<+_cWI~bt zjPus&>d*O~XT;+N_?q)7-Ph)Mo!!MkT0G*r3KGM8AaI!ceKU))&5F!W+(3fmM%xGyFYE5OvlAY;wVjD);dl zbvl?Dxb zheh=aThI3GQts2hAXge(ToQ7tAusw(lIpJ(m!u9TMrA^>7+m8HX&`u=A*2XKaM82_ zOQ+&K<>swHbgpN!iznPfM)0mea84-4H+~3 z2Xy>fRsAA_ZL7_l?TCKXQcD?2O-Y=G1=%=iv)M=YCSk4qwmeO@wKH*KCZY6MkD|ar(4}QvtG^yer+O+LO^4*(J4@ABrXTK|!@%J=@z(_d_C9 z>tmZ+d8af?>K^y%)Z+nn?OLgn)OI&!9vwZv3%M6nX}@LOh@)?-+T2J(SV@_m|F3Bz zJy9mpq(6_j%Tc5nx^XheeIU$5ctYIaa#3~(H9n^Mgg2!-$}?;Qn4oC2wH$yPnvl%q zhN}^Y$r?y9cQ#DCv!cdcen?adYFFG{Zs1Eb!e;S6nDKY^q#=FNw7!~0lb>A;lu$~S#Sv~$)VD7MiDPDw~ zREIscM6dM?Rk&ZhF2ybj*`!pMl|0q<1Z_Ky?9;)5g7El21%Z2GAJCDM9Yx5!#8V8= z8(aIaRH8?xs=0KU_El2^2gJkuSoMd-vwOGdx!tx-ZqEzeq`F;;3jV{ zIkmBWem|pyrc2dEhq-d00d$BVv zk3=CYm4FbtB-bBa^6p#1Sap|4*O+Qw+pAFoa6H)M*grPqG=f4WB*b3s^7=r(M6nb7 z&M8z$bp#I@PBU)V1;>-ypnD=^c8!7C$(?E^y1%&aI7U>7L1MxY$*vEeaaI_wc>Ghj zO#rU(8B{KIZrrWJ_RVzTRROT@aUxbI*}P7c`np$rVk+&g_Y>+HLySXe-{3i>du~@I zlpRVpsf&(k6ruf7k8!b_Y3xpEEV9S8$AVZVS~Fbxps}R0*f~n<5>XD*C*jwe+j1eb z%!JD+NAN9k8QT*#@Ip=rQE~BGJiis)4g3X|N&xmhrqP^yCG^J#zP6gR)vDe?D2hC< zn=%FhVJc!ut~BR9_&DnVJ+7UMK}An+q}@{0AOD+%Xz=I1lqfJdf~T%!oQYeP?ykly z{l^v3UA)`@2KJAb8auQ!kI@LkWbt)RW}KkCIutE?IK;bAtcxcL%yO*m^ zo}|9__$5??trB%WVj-9yXq;mtcDR?$mZ>6>Aa#DlWb@`r9S2t3@`3s7M4uvTyM$YU z+n>~640AXm!^5QZ9FEX9VB@$?#6(fAuQ2L$?+~rq?HBFmOPt_DZ_GD`$qUCD9tJSR zmb=&a*<%^{-aPx+zu)Vz;MUlaYzPIQ*4W1M(_`tU4c?Qo>SkW%?^i|dxN_xG(c@X% z@<==@(JOXdslp6=?Ky-exa~00uQk@>RowLrnTEn>e}9tc z$bWkIWST1XVVg!C_uUZ8b?X+&aqk!&1cJ|!95%?SP8N*suJ>eM4)?bsRymbDyA}A+LcMiUWJP%#nAbjEensOtM;v zyg*zw{eZ~^!S6PFlu@zBIDAMxB}kU9i@|xi10rE@=%kpkVw=cf>(E=VhxA!sZ4G*Y z@dhQ0KF6s~nnX`%_5@>3Xx?SMHJhJ3=BLg4>^DEMz`}9fG(R2Y=YaX?G(S39Fy5sj z|Oo|;n=O^${J(7)% zw?(p|ugOy2}U?mIf@e3Nl=_nSA)k!tQ% z+X;_!CTSTHH6;+cgi}aaUu8Dx`s!?zo;Z>9zdsr9|Nb8menr8=cT)o?L&yXyh+dKvVHcLmZSC&Hd*Q|!c_uL|*6i3P zGtr#r2k;H?V2Vi-w$g!DdF0=zfh#FdmPQ6R(G{XMj!Cm#n~{ljKYIZjTW$wY1wj*| zz!*^Ml$3(tiAIW{AV~B_NkUBUrvzN(6iia-G)g$ZD%yoBGek6W-9{)i1Mr#3{AS;5 zeS>dZEY*GF%jm(;N-ozkZ~D4Z>TV*XVn`V{DF02{Idm8rdsBYIDdb|-0>bK9Gm7M( zxf?Pm(IaP9o^bKVi0d~)4*WH~-stL`&OKvJ0Iyd2GXrpZD95d%bF8wBCgvb?Llz@H z{r?8ur9%bYqBOkY{~5dmY5dyv-1AeYVa{Rju-xKNW)V2bTfW?TaRrBGrf{hE0&{s9 z3c3eh1%j__+Wvyyr|`9DOeVg_lEPPJ`@?$LAC%dC*8jf!%eDRPrd0dm|5^Jz^kv`k z>kaAt{|Arh{y*%!NN1Pd=e=|aGQN^RhLVvIl%l0m&>~dTgBB&Dmvd!U7No)Y(dbOH zkR@|}&;BZtp6q*u_Q2Oa6TZ)WVt`fn{^7m+U%_{Q!q?7)ZidW{ob#{YGx5}{_H=|Y zy~EZH6`b+HghTkG*2CLl!oA^9XI@o+pQon$MpB69S>|{0?dT-i7dZ`XW4%OpJL{;L zM{UqD2bJ;Eeh&fD$&E%QMJZJf5zb`2n93_##)ag@Pl3x#stKhEud1D7_k&|yWe>uw ztJJQ@bFi&im`7CD+R_fR$e-ioD?nIu7i-|#=M3))H zEPWnm_P^1ClXMCZnvfev7hAFrZ4sm8Ze!TifyF$=ZJFE(BTKPCK`StKw60RSDkMHv z2qt9?u8AAKSGp-GnUGttPrumHN+jkjw>JknJ!VLZyn@@&u6S%v76lY5FE^>o!j5BK zq=e0+Y#h)pi2a{@ZZMziYw{%F`*{_ZnzXS>HYZ=zb1E;}2eVA8(i;;O3?hi-`~De5tkcu9sD45N)uH#tNjLz}$S$fC$hCOwH&{8; z^btFGtfxZm%Kz3lK-TVOg?F>i-GGcCx_&IRIuQ8YLxf=%BwE}wqP@3U(}dpCeq)#W z+FPcuc$1mQr$m@KW34H z-}h*Rag>c167ZSPEBZz764gt!erHr70w9+Na3oxgYg=NH5=aNH=VK_vJtfn*N-0tx z&~ht5E9Q(3V!>^w{Um#!P@43x(%ngRl0lJonQjAZ_Uva0tyh(zZ-`!z6*-S9t0zt- zB-v;v)}DX}-7u3U2}o8>NV9t9!j+`O9MZZ(*B-rFF3r22C;Vc$6?jg!v*LlL;j41- zgx)aUqrcRe7mc<@$bq(aQTNoE6J^&MTSZ#ee^Qq@-zR9>i|P1br`S`|F}#Q#R!**$ zx+GK&Q4i`zuY}t4_Sc$;5-NqD44vi43wp=%%EkuBn(9wZ&9SrXt8<)OT>IkqNk@iv z$sIa4GO+QM1GiNCsp^CF)p=P*KrnQ&?T<<)(+KcCaS^PHm>B0mP+dO;W{FW*o@4#7 z$WV%R@lGi#-K~~+8G4%>V;D+qlnCFoodQV&C#OLwNyA) zhoyduRf3JGW~dFR=3j~kAopcss;Dl2GsK73YSTZ>TYn%DcYWh_U(HeHt>GR8lm zkPL5$1YlwL4FvHzCvW3hPP!+uuYOL9e;GWhhjrKyK;$&lJt%S|e0+T{hN2KAekD}#ERroD)sc8P2$vc)w~mboS;(!tf4 z`N>6j$wj%z3y9Yi5XyzjiLglkwMbw)`)m9l_FxV!rzuPYd#YTz*St+y=BnNWCH7RU z)UM?zpXx8SXOzJInGcu2QpN4BsuKG*_h(bYUqiN*9EJsR@rt7c0KZVCc4gu;t5sv! zN!(`&M|M(p1fNfq&sElL_ZG@)VXHgLjZfAkb_LFjv3x5r%QFs~)HJoO+kW=adf9+pOwiH!o54n? zW@svAf=W~}-w%+!o4AyO?+f2n8+PnJilpGD4cxJvs5an!?+SCQ!&DZ>H?7Rn8>%@W zRi)H+KVNSr%;k5bzQ}jK^*zUa=L_l^nX0e$_Fi=bdg?NL3tzpv;8sIkg@xu@r~%-vikDiPa4?z78}ClebBu8OS{?oj$DGE4IyXZ8C&kGk;F&Jv+jl?d3O)a8mS zCul@!-f0@O@WO(yFcv@Pe(5rgWR2{!^4nAts_EyRc&e^3X5_{Tv9DaqCk@Jbh@gA4 zAkI6I3B@Dg+Bi(Il%O}pVwzpTIj-siiveQNjsYuL2J&+8_6n|>lo34 zxePp{)+43YLgg>q*F?Erd^W&Glo*YDC663jm@w8O7*LQ?0gxaE#4Vlya`@#UWU1#biBYi`9D$fOgBarB zK}z?`n3+VUWae^_R${8N^1EvX`VteJmG{f<1ycObM6}#16J1a~ZF&byiD7jAcsfbs zb@!zL&NP}+D|MgyFHHY&YdI(fXOnY<^JlDClg*lSU5Pze)~xeby;!im3fQM;>~QAX zN5DZ@VRui{9E--ea+ea*F>$h-D@FE^TlD7nnp`MX#%!aE^&u7Fqh@Cj5D1qHXZ7V= zjjVQA;I#*jVz)@WKKBSmRf76^c>$-w0)9@C^T;ngW%N;a^hZQUlzX3SJ`wLcGQ@f0 zN52F@K3(K}S|AlA!zVI0C&)gC0~qUASJ=>#R69#s;sc8$;x3!i0y%wYgXAc~IUC~8 zZGw36J|U`A?qvHsexXJ9r^h)(8{T%QP$|4K?2$ zJm-Ado?2o}&$Xu(Skv?DEHn%>?Vm~(VhqboYwi$z@n_JvO!&|7ztn!13$al7Zn}Lb zD#|-$5WIL#Mnlj#IoG7=__R)DrDy#2g~uXN_2d6lvZF5B zWY5mS1yn?}jq3CrAXIv^uE`e}nHWwm{1MLD5(bbc4XJb-fty6mpo)R~pQY98vhU8b z>h?%ATh!(KR^0ZYb$fi_f9sX6L-V2I;tF}Wk2NyLsn`0^PSh1R#J8>{z0((=l}>2| z?otIuo(Sx)A#+d4nW+u2)1+nV+PuahKjbh~N+njgFJANo@yC~W`v>DFmM1rgaYOt* z{4r7Z$o9a0na|gKMW9h`DgAxPNT2UA`Ll#@f>w)Mp_;>DLq_!H)-m?FH(d;Bj#_V1 z5zs;YvGoSYrAYi+mY`iL!Dx~@n__O@~e$K8Bd*OJRK z>KQB`1sdMwyI0quR9(C2dhfad4I)wf%h0V#9!R3t%gZGg_N=_0x-nOY^rR&rr3QMN0%z$VW!7dXGgf&^UiTgV~aiNwD?Nx$m8 zt=W8))Fn9~_Y44*(dFu4v`sk9P4l;kpziB>fQ;!l?*H?%B=7XdoFz>IdTPOtUQl2r zMQYD#CPgwlR-N|tbMH6@=LBH1XGvg23EVr204oRVS^0s@RqRaM#Mi#iaxtx?YnN6g zG<#aL3D2jrZ5ni9Ju^4n+fxXE0A^QYz3$8dGuRH|nNIK(u==Qi)Fenj7lbKGZEh5o zWorjIt3YY1WZ7s>$q|P`gnKL=D)@d-ObF3$21<8GhR4u!uuqc99dQkxbHJG*Tz5&f zHRmC#t%bwl&MX4AVRUq;g<+Pl!eOulSCuv%54Ge4Vxn$4)KV0Py{-=>fmkOG4bKPS zF2Ay~2(A-xEm)5wmoul$scsIH&*nbhChi0Np~y@{7V+r=@m-p|TNa|v!!a(XIlw#{_cfVkb{)4{35`i5U6K!C&4*6N%Xzrl z)l6DzaDz~e=|_Xu-n9nfveIfaKj~A$I1(j{Q7|q&Ymhjq(Kax|YYE2Dybkr12w}(R zr&XYzx%fQZg}tL#|1c4p`b&<97&F`*Hq0m)4spjQx|Fg``}by!AUR32@f^9`Uc-*- ziBDH6pk(%(9uXG093m)_ZdB0Q%P-X4dR>itjq6E|fs(IC<;znO(9#LGhT6(0LkKJI zqa}0#hQBSF%D}p26b7+1UC|CUFu~Yl-@%28=qYn$E1e7%PS}TNGmZs+bn#v} z{M(Tjnf|`~h-@aG5w032eaYKdwp*24^A_E;%$Nf;cZt#M=hn032Y&!~LMMd8L&Z%j z(xx9SWJwb%FI~?xejDQ>S(qE^TTQSsS>#$%cAcH_F@0Efz`Plq`2TTc8wK6XI$Im7N?t7CrwlrXe&(m0-4v$D_VK(QmOPI z@2yqeHsIVzZPwdPMX&n0DhqGHn{lj6TChqHd)9ai=ZV!kR`lxj*(MLt@vgu^dD?o;dd%q03(e?+=OWB9@#19l& zKuj&Ln}#fa7}PL{8Dis3%cfGNiYS-A=>FEUJk02cD|3}Qeu6F?oNMqZV%+!ts3#cp zSNH-ACMJfmiw^+FnU19p5$lyA#UeH>e>oS9wCg&p>Vsq6X3?su8C>Zu2Xa`AhAw4y zJm&9NJ7GJeZ^zzvW~8s)7rtOs5Y=t>C0XHxV2LQrPLAJt+mqjk*nCNS%O~|mPFX^X z_~!%v{=y>vtVmZf=q5_VeHwOt*D1vG$1IFVUo$x5*6bDAAz^L;04rvQD4(~rOJDe2 zW!dmNp0a>iS4_mW>T`kU|dH&^@HotUBb;czd~=li^vp~~#DD}DaH zc2xUZX@=4}NXvSQ5vJo+?j$ob#k&J5BvK7k*mBX@oHr+~c<*}yjUpK~mXi66JWrqn z!Ngo=<=OnmjF`Rv*W8tFZ8G|bL3`zNC}*x{I6eJ}$GPIaCQEC*{FQ%l=~JO*R&8j# zq^0y1hCXkEvzjTT^W+LbrRiQ_q5bTG|7JF-Pkcr7E2=GmK9eTROt9etLJ?4B=WN3Y9acc5izsq7Am?8chkpuMm&TfXllS}q*r zZspP>DIKMBrotpWe^c$H^ab0#B<%s%)!JV8RA;60w={}Qq;u}|gN`S=v@uno*eeJ8 zb|9dICqha0_v1Npe^y+$Dm+jwi9N*bUYz(=9`(p($5)VXwnLl7jz4o_oPRsW1G4y*B$P{8CooPbHtK@JlrczuX)S{Lj<~ z{N2FM!PnKm{}Dr$Tz!bY0^uvy1An$PkRbzRfuC}bmwQI6&v=PWgKciL-(G|cy!a#g z&b$#vmJQ2ZVI-PJ$*fyitpy43?!W}EOv*AqyFR^&}QzwimhhLqkhR5R_WTm=8(m#yv* zZObk}1kY->{uq6Q&L1f5;9$t=J~f!X4EePnii&}JDfx_1cKYI-e4&8W=>_s*uGqQt z9L22FVs(sZ8}SO74}$z#OY+!r&e@O7cg$|C*&Fc^>O}hi0mozD#UG6jO~(Gf%#R4l z*!a=o1ASTDmi`v2!WlBQy4eB;yBA#~!`;JAxZdkkRLG*0x0(D(4iZw5tWYu-1?JubBdaW<~4;350wVPa!mt24daX`FE zj;VJwAwyNIO12cwTvywN@VZX3fe^A^~20uIvV}wu4E$Cg&T#^`_fk z@SZ&{2Uqs=o$P#au}n7#Sq7HOHbb~{7@dmKkL+Bppk z=3jcV$4hg(`*agCqubv9m9U2|J1gJdftj9C`iafCAN077jS^*Q?P$nS7rs)A9Q=Vl_?Ny5`4Bpyn`mw7&6Z@xhQWD?tCV$_3n<20HE)CS$==BOq=d3AwQ`{7xtylj=p@dfpd^KR3fYY#!$`h57(lu=M~ANtbQp|+ znVmmzR{o;?R;yS8aNH7kTecG_$=NHzzXU>pST!TWg_nYhl?yb*wT|}CcQvBBYv;tJ zTTJlq+Ji5q*;~=O((TR7pEyt2`-G`ypAOG{I}zwT|6VPAm1~6p!RpS*6S<`Q z=)#8qwAd_T2#I4>hXe-JfPEFL0cG86<_89XuW@DX$^yaYB#~i~tFI*&W&|8d!i{h5 zK`e98=eA~fB$uM?o*jVU_a@$x((pVqZbl=jIu*Myxwe}lM;jlTTDVX()M<>+LyRRJKGR!T z0}YmTo=4O z)MLYmjqiQ~yX=Mls4>C2Qz;rAJh&c;x8+qyDV6dE&Cs5D-KH6Ypi(K1 zNs78|DA}$s`%Y^Bvmr&h-}Tbu)&ewtQ1DHu6j`bqp<{2qiqc673et!-n93#xiyBht z%v4IgW;2w1LMpKUPpK`Oo_-;}win20t22foa%TKa#|_Bkke{@DaTZ}x2FVwRD0dVn<2lzzp&O5 zF_jCZ#KPq;jLKNJVELP2;Q|ALabX2(l^5_qEX#*UzC1Z@QHx-6YrLAGOAcd-E;)jn zs$^OYqj{CRY&{b+y+2K@cPQiL=Ck0T4e_Eg9op#vM{N87y^G~apyrTenT7K%gO1k#6 zg4DZ;yeXlfXE8GR1d+h8pGtO$ej~LX(antb??d3?;aOM+LO2t-z`8T1)!4j=pWoD6 z*=kJ9OV^z)?+IwtUKKe0RJpI7YATtiMN{=SE2l89T9rSes+MHpef81G(_V^{je zytJI)^vS!o%b&oMBiX}YL{;3x5Gv5sthRsFG(T=rd`_xmXK(og_^1!^rOFei&T1XA zcg#_$z}DOSmg%HuzpwF+Y0ExAW=6SNWWXMCmp@%$db~}2f+)YagEfErxwDwgIda?Z z2(P|@S>0UEs_9}i+5RO(!PX>538U|TmT z$lC(j21@F$NG;wSel0OQrN7&D0iUl~6;Om=TX;e5`mi*Va*HSz*w$R!9sWu5@K?hR z2A-akHJw=Womwn4x)Yi&9XO&n(T(7PK~1muX!fu3L^EEUI^q4olim8_^CHvj%|~xg z>kF}St1O~^%s-sQ7v5%nC-$zG6OyinaG1Aog+ZX-~ zi!-yafCcyRPq zbD@L*U&F!kspg6*w;!{*s_i4HSJyU z!j1|f_us%pWxq9s`rTzeVd{s)mgOO#!w)KrKXf3zLt2NL<~&6700AX^U&VTPbAoH7 zHZ=~(9p#j*cXtrgQ^pDSyB6Z-dxzP^FnS=Yt z=>Q#ECy!5zeYWTqPaqivs28?GTHK%X%X~AY-1lBuCOS?dknaaE1N+I`|zZgg6R%EMW z$m(35e8(J8(n9-{#ppZ_;ss#kF>+kmhCT>$OcvJNmrR_IGdAz z!%TqoDm44cPNgw8S!+vj_N>`dxm;SwoMG-PdbA%Pi4&7nJ2)Egb>;7v+0M2V{0#(KrOmQO2{KBo54gZ@LY%E{aGx3?KpAhBc@j7o zo8@L|=F$d33hKb1tlszd*8hmh@-5&@k>K zsY==()=B`L0`Bj=q;GchLz=MB{i&DGgY28k(c$2e1lbLOg0y@!Q}NCDN}g>`yH+^m zlOCtcbT_8$F}D3eg(1@)p8r~3GUak8L#9QEg*qC|N~6Q^piv58?MxDdBUyW`kXTuV zh(1U(_fPk}^W{<{zAfrkBlLX~VUe_}Kzx{*P#OJU z2EC(vVX-Q-*X*7xL$JXcg1#jGDoYMp2Pe3Z4eeE-6bA65R~tbz|6<1WsEn@wy?J3S z1Y7oKrL%blbXf_VMt;NJkb45L1*CssZ#NUW1~C|s5@mVL16Ou{={kIqQq(926naDw zcyFemMS!l9`PjO`dMX&LhY?^JcS7c+P9A-5yOY&J&vKk@wU5GS`0a z>GJgC7o!Ra1QCl8iaSk`9^2gGEMN1g zu+8QCHEeU{niO^k6d9um3o|<5j*za#WO}32)FXWJ8~SCxkS?g0JY0}V5bHGaY_FXL z1gS_9dAOyO3q`pIY7nF07Gj=*d}AoFLnskohhHO&kRj1uIBYwCGVFTO?H=lDbLW*v zHmGmEn{OKbJf|HR_`>zc>|f;qLb13LX>Y~js@js^_#t=B0qrGY%`%A2zbJta%3<9| zFz&1##$Q2Kw|m-Z4_#DI>3+bVB1?0zrn`Te@=`Hv>1%Hf4dE8n|F= ztRW+Xf}@pz{X#)m{1pmnbKgLq00)9imN&4uU$Sv&bg(@nHVW*DC!1Pi#zo{~aE~|R z_HvA%W8n!a`*9Vmy+Nnk9-U~XbGy4{fa{NCKSgQbXdM-9>6wZn8OEisGQ6GKuYc8` zO(0-}?QlaUY4v6fO5G_WV31Z`q!VwC`(pz`#>6wb6L;MZFrC)78T{VJ7EFv0kw6`k z|JWnw;0NM=rRy>e$__+Z#Dq#M7&Nn9%MZd(G=(k*z*sEQU za8G3Z3UvkIE2J_GE;)g14u6;XRgyj99eBF1IC|{7$iV3YwfZPA+M3gexkvq$Fa71~ zD1B-dam{)0(eQwHAvdABPPIFI3i)10Wb?Q?XBgJY-O;0?>4jXcqpiyZfeE*c>50qs z;N4lNLrQ_^yZ?zWekgL1*Jt(wfac>K0OQMTFhy9WR*?9c+FaT#= z($ln_@xlt%`lHN-IezcF$SB2>IJ*fSBg^9V=!}rp&gijE#e1Hlaa1QP5H?=vZf6gx z-xC)~r{1W=@G#HX8y(mWV?t`OK1A?j!ZxzUG4%-Hb-S;6R= z_>GOaSU7hAj(FskDLu^IF1yY^!waO+k!%na?Dou;dgwv+zA{peZe#nmQ=Z0d$?>i7 zqp2BDf_@Skr1~v^2j>ZKd@t~{zXYXBLbCn)vpGKRI=K>#G%t~~zmX<5{qtbf0elk9 zl*HFbjWrnh3c4SxN- z&yr2D4NjSKG^v-+hf?yp0uU{7N+u*BBnx<>18j|7O6&IwJ{fP$)canKqr=TvPrmMb z?q2@V36)yb_d_5elj0)pE^M) zP4IklzK;Q^5DIix3j|7_Cfi+_jTOmt7nu@r{%tH_()a)xQLc+rS&$tpoG%8e)JCkV zJohrKP#5p?dhFSQVT@QLFxKDv2hmCuga}D>`JZ)>lKItR52pAYC-`pHMdvzcZBxs1 z7M%f*sAm-}RR#BpT=m*>Ii?dJqDH4=E{+Ce`^9B9*QwqEXeduB++l5!PZ75C?=WdCfa2uMYSTkyPrRX%0H>Sm;;U}e|ocjqDJ z3#^=lK?VEWdAkj)YCk%-M^ond1=bXQ?K@td5k|}#uhsAN8ZV=t*YPs)BI_6XbH6#H zM+wNanv1^U_uc0>GrHWir48hs*_C~4|? zEz5GgXP0o~cwqbV{BWSS4Tlbar4HmJMg%suNrisSWTHoM7M`h}PUMq-S)2i;NMZ&U zC#T-Ff5{CD&JV|valSB%*~urPcK`=iE0^mUWXaNd+rZMxj*hi7f4em;-=0-qT~mO9 z(z>RIs%Q|eYDL~%vODsScMcd&-?RRbcM>Ybj$On{PAbN_zQt1y(pH+%T@|Ey_)60Y zP6gY`^SSk5$p~j5a%aw>VNUM7;O>r)G|3E4a-Yj1oLL!5OEc+v>-$sqP02&g$`O}0 zQ`$iR(u3~#=n$%s>?LPA(TW!Yk3-xKJ9W6(Sg?4jCbI!+Mqk%t{-C|mmGrbXjI0Ra z0`V@YGuq(j;n54{feWWZcJ*}VIfDyXA6JqquzALC6mDEgq%Y5_ua11M=M+Sb9uMaR zw$I2feu)I^w9L#4>EtA&!p!@ z;)E~;;+1M=A=cukp~zownhi8Yc`TR=x4D1z$%b6?LuvWTN4YPMzhr2H-{jYfX3lz0 zjnbvj1W)R-zo5Qe`#0VL+e>uAr~5D7?Gim$fz&gmK!bRy!M{b4+RbDA<-S0} zRvu(n8qcT)bwujE>95LSg>dRq-_CC{-%3*7!r#*}7klZW)9G_HeaudiKQEnLrsT1Z z*K6<{J?szM+cHD0pT4)bs13_dkeXT_l;6+PQNUj~*S`Pk5~e7=O)O^3RO!2&zz%`! zZ4)H|tv^!Got#=|jU<|AKRI1!_$uOESCBt&LPUF9BEzT1+=`8o9dPnEH{2(2ks5B^ z2vvlwf5Q)`HZd6b^O{&sCkej;e6bSA2zygwh<`hr?MoD7jDPye1($i6h~l^9W^2OX zoK8Wsk9oy!>%JHdhc?wo5cO2J=tPA3GJj-sS5&%`(l30z{boL=TlwIVf7bpJllr!g z%C~p>n_AQDZ=Rli+3}?ElJJ1rCr-@|ue6FeaCl!DOA6Vq%>E`T%U~yGyWOyI@l1Fs z{-7eiwBoA2)6HK>#$9>4gMR}!ytBu%Jz+)Ng1h_>x79>6-zHX5dRbz$`8e`;AS(Kb zZ6AN@qO??PKcbuuXD zziybWXUZnkBp;J%a?r2JbYaZ~5oWrk>9O~Esq$t0{gZ?m+BLoz%jH1&)O+z!DE;oH z2hH%^S)~2iUo((yU7c2NvO`|vwdLyTa{_CYlLM`A8XjjxR!i4N zxvB1@!>n!<#J4)Chtd?-m=!+3YTacbvFLM7K$U!Ne@PVChNKvxKJZ9HaK70d0*1!{Q-8+J^2NmemyN6{p5?`Axj24a`%kJUqsSfrl&^@H9wxRf!S$Meq#l)86zx?^S)?mmq@nz%Tg8?t$lZ z?fK`&i!2%Nd<+}-r|>MHik|wbyEgZEZ|(E`KBf_#RaJ^#nEeauH&P`mtI+*-1uJj) zF<9Q+vSq?}>6o*6_jcX<0UIGzliZ5{J-II*Qg`Fx!;1#9M3&$i)$D~F`6JmS{!3!%WMv65Wx?l;Dy` z*!&j2mu>%)eM(!~WQyqNK={%GD+_kEcWRD)Zc#>#3~W7rxnj#UIMUPn)5TmzhCsE! zRAR>zSM{$^RpJSE^xs*>ddcsp^HfX`5YvOXoEogCoXns-IG4XxH72gZf*s=aFNz0w zX_nbChZS_T`-{T#ct!5y5+t#SZPxP!$s^|i9Tip9-YWNzAzntnuW;+{(KVSB`D~;g z(M1N^tg<~~Y)Om~dae;p{cZ>BQ=}c)o#KycN+nK&2g%{H-;JlFGLZl#83lMsK8L@7 zL{UPqqs9tDg4PflYtF}3*1l^m8}OA4}aL-muR*hc=derDPVfdT&kTvh6z(1 zLb0Dbk*u(gpYn}OfcUksyZ15nq=W9=IU{_<9TCnzx^dC6s>MNDc7%%hPDO3CXGEu{ zHxZ{AfAt@-1mp@^U%gkr7l9UyIaUr`<00P9$wzVk>*>e5z8xa;l6C`ag`B_Prw`Yw z&*bML#E@%W|C6 z_fo99hL9>>`kS{Kua%2OtV_C+16dA7QdrF-MUHR$om7AsWCgrDuh*goy{Z+VpAfF+ zPRWT3(XaJ);IQ5guKx67cza*@vj@K-@599g+C-1ZiY&6@W9glMSN~gf_wzfYg9Ick z>rM_6^tT!^PKFnWnjAINNWv!Vp6+G1j8-kXI(>oS>6V@r<&%y6D&gwpTpnsgO4$8 z+KPx&GQ;%7Dy)aE{F_b=*53Gfc9BG05cnK9E0Y7Qhp*+qE-^vPIA^&sZ^FJzdb20p zV=u{@@Rogd?ge$-gFXo~JVh;2igzp&Jz(JJ`bTM4g4@t!nOLbna9nwTV`M+1 zIAQjhBBysOkXQ5uPTYDM?TNCPXF1MmjPj_SkUWNN#k9aIA5Z^8XBuh+(yXGQY%o>ox-qln(-^7QI`;SwUK}+Wk z@I?Y^2X_f_esag%R9v@z5)FL%ABPE4PoDI7E6vxE!y<% zX&}(-QCeaR&~Qylc4 zjN}BHbMstT&-l%e6%A7g-h5o^ZKc<=I@UB6G&$nF@0Suou=Zxm8C%%9?89Y6Y7x_b zTs3~rp|E>}D<%T9=OIV1s>umCmeVQ_*w zYGskP;+b<~efd3|PZE+MaAoZIyZ8W7SK3HuA*vD7X<8^0iNNXW)!j^W6h9 zv?tCXX4}gY(Vm?zQLPDk{!4CN*MP6}g1yi8&kOS^{d0&&M*j}~ImahM$Kz#;+yDFh zOT)#!(E~dvF8pS{-eXV4B#GALCOM))&{BgKF{ha&;X235#0`F2GZgXKf2T3oYL2`b zt@~KanOCimWupF1$NepFeN1c>=2HL4CK2fdxfeZ`G0%UNx&EZ(1M!r+OTyM)3|+Iv zX}F*X`^4|6bp5AXnLOh{z$o&J_meNd%GT|$ugO2OBP()F@r%xlSqooIoW9ncQAD;A zGPB+1WedNirzI3H!Pq1kxfsV_9+g3lw3oxhV|HjX>-I@PmiuUGMn@pd0j!S(rx)*C z_*yEGxq%YLfm}~t!-Wp^%pZMf4~i}w?F*ONX2PMa6_kTK&IE8lPjzb*Zf={tC3!&B&lOoe1z8n|>54v+vMq(apEnz!qL?5s zb8^G#uwU0I4PpFV<$m+?6@gUIkPdRctwoETMZ&>^Fm2h6D*q-GJKTrVAC z2h>A)dFLlSM_sfcoEKx)zZ1%=EA5_q;T|+9w;8vta+L>{9o>WclJGRQ+l0g zy=;|jGX1b{ao99WfD(JH-bYWOSx!dp6h^LokdY>2c&=`ZG>cR!CKaAVb&6k3HT*VO z%k;X%o-qpUeWMYTxF<*gW=9Xd6TUKf__J^+G!y%f8lrVun2PkHCcjc;ud_h8(p0#p z>pjVUjfZ}Cq(;z_N0X3`>SL!*yfc5{szjX!#aeDFF#KLyp8UC%&y$wN!r$)HR!3*F z`WrB%twtg}DDC*PBA8Fv z7IV2QB03ImvI!HxHwug+IXQ=5E4JJ)o{t2XD#pOfZ1aJ?c9cd%e=B^(J2eI4DSa$_92lZjC^Y89Vu!y*-gp6w~@q}1~|Ms#=N_9au z><*nd6X;9ZMM}?}0&g(Rr8_WI( zD7tRfN)Xa>nOC<)PIgLyZ~G7Th=CxsHE@I27$GjDyOmD(mzu&TEF*Lp>;7$lzDjb4 zQxU!y@S44d9e?JG5w7B;OTJJg7o=*Pz28)v7h?Z2y5bTl{FyG!RiHF|fxHE{a_y9k zuC&I-@LvLA6o~B+2WI{~<+`f}{h|4R-mJplx7M;tbe4}>oLko!$#wZh{X`D^`pk*a zPM<)&X`O68ptCoxRO=iAge(`aXXP}7Z}rw-LDvK1!_%~!r9E%HU70dETxRaZ5GVW{ zf!}HVBm-xj3pPogD(Ua=$C=19$}aag!Jc~W6J1Pv|E;OiGux?TeO#q;30)BDQLZ?h zVm8Dk0)H~Ua3=_M80$9ApP@?+b^V|W$rHY3dC!Yv3vYE*@*;DUBYCZJg^QTfccozY z^1mT!wI3L_##^dGUsTjn@@&m%wfc;!I1-rR%zn2AYwcwbaDztU{q~JME%T+g4S4FTubrpeNYb2V4GV&u!UM@-5qfp`89n7Zq>P=?+Jor z8%@9Ai^qS=U1?1KKUN9*E%-55>_ls7qdO$OkmkPy`hginST24DDy*N#RxbPZiPH5x zx?zO3kYb+HKr1&3Kb67{aQP{TA2?#Ph(Vu(XPKa^=guztBFek41i$M_=cS{k;0oKK zyB50)!IqQoDH~+{t|ydh6xNfLO)Opx1*QU^@6$~q905thV!K;z)PK(oc5s=r#%cH$ z0R(jPWqWDPe+V5t$lsdzBbAii$IO5ek-5|-3*Z@<#M0*g0vB-F>4%bkBmAJ&{aorq zuqZ@vs*`FoEf7S#Sn?&BI!ja9&OmJ^$HfCd0;6f7hHm)ugXm;|FxbNWd8+v)Z`I-w8 z$jk)QINyw+i(I+I81BnI2T~8-2{LQb1Rf~7|mm4rfj>c_gpgtOn3s9fwR zoV(+d2QIKGTCFS~9ju9|n4tM@iqVE5$dxe!x%DuU0 zL3-DRK-PKmZ6P`yKj-?}!sOk)omo@Taf|ir>%>)87HUOlc2lcZ&m*e2^vkSJ5flyh zx`$t+8cni{+^}xH;>rARJ@uH+FX1nH@Q=mY55`>6S+B@b{4tEU$_+k({#ry&m7dzm z4&Oy~?k&Sz4U{d zy_$N+#NDNJY__y_x-6A-F`E9s`gI!K!k?$=-<0TUUuZea3QYqXw)NJNn2=Xh&G*6k zyQbq|8J##13XW8qp z>&nV*tpAz#8j-`u!vy$Xz#AC1=jh66l#$4cKQA+2zJc`BJW3u9-aXZs#N{Bn*_q@y zE%p2zlRw<5NRK~+Tx-Q!=L^gEgtDCHoOe%o=iOyL`3WRu#o?cNB<8=LaY>AxcZbOg zS3k+-2qXB?NMLMC*i%=)!Uq@5-7W#xsV6+5BN9wZ21Q)5k5chdZ-bnAxwQJ`uD^fk zt8$MC$4SOm>Qu^a*|15ED71(x)R_LsYUR*YBWDdZ4CipL?AC zTDP#`*nhX`WI~+Dm%@96Ubo7e8lmG~NER5+rvU5%>yyLr&=( zOfwjrC%?g-gO+>enSqiLBGfRHs|87mjx!lDy$UA$S1zau0!nC#x%2Z5#hiLi9X7l7_^l63ve z!}#KI?GHP>lO0<-1L6Qc%mU8{BBw%}9#%B+M_SvlYt%Ons&*G~G;p=msb z0!8GliSwpLLtITte3TGq86`h5N`9o5+M_tBUc?9kbuv2N|Krh}+z}t$(^APlGdg!z zH_#ssYL-r~&b-m23qg^nas9s`{$?hB%)l%ifTeS0Jt{*>A+@Eg_A9a-!jEo#$ECIk zEk@UpLC1s~KQAN|ZQrH0@UBv$rjYbmTaT1-FxIDYra7wf>#C*Q-6AYZt$7L~8h%wy zlb9LHo<$?pQo#}1obtry&~21|fqSJtI^}e@RM%k+v|ENX*DTM)B8Mll9NI0@W|j}b zc~fX(jCP~-6`|W7A5l_dxl6=ny&@8RcKmme#MqPi=zx}4YE<9pY5YDtnOyYl}4a%2KZCip#19v zQHlpaPMr7V)*VO@d9%J^`^{h_ZC~U5jvS*<%yX3#Z4$RE<>svzs30($_O_s%e}=Q% zolZEMi)n};Y^#9U13&sVZ}(Y*D@R)05TV3omRlvd6~?dZ{>DfGnp6!;BeB>IW?e9_7g zys>LGIHKMjOLwKdMTGWtCb%{|L;&pPash-GlERp|5P#zx%IQ(PU`v;eVljFigTK4q z-y-aK=!3qBsCqaSF@(|dQ`WFK=c$67uL^`-;|-x63E_i0Sp?fzHJ>tehS$@)(l>odtM!Rf3#YhoS~Fl0h95aoKL`BoHH;sT1zkvl~s8MtGDS-pDR z4`>dbJ@bp^`|z9MF`4b!6I3AAgDmER(N;yCdDB?nHt#Vvd!_gjs(vDhiN_NHvk9Yw z3JWVjyVI>XYh2?WOT0-D0kO>)im{_9cR-Mr*!TI2W#buYm+cM^-)%)Qv^8LRs=fkw zq&Gey>T&GO6Uku8*yMD;*mlImHY!xl*uF>}_{uf&eZ;`p{GWe|O0sLEldKQ%dbT)| zeTrVyJt&*Abc%&^_E6xf60aN^xS+0s&<&5V4yRe=SezQfFC?mp(m};;qbypeV z@vMkH*dp5@2chBxw-qzt!U!%;R98PixW+bO(bZ=X!mlFN#6LP0VkTvG6z9pPI*QfX zrJU2BGQx89D`@RH#*eQ4E{7*ly58Vd2v2A#-4HXki`OK8*|nBb=j-%@^^?%Ydj3r= zbvSkgMo?(Y;-}U z^ElN~3Ck#BL9Te!Uw~iDJZo|`Q3MK)nx716Um(&eA_UqGzx*&T{L!T{gqm8SQ$f>b z|5C;gvjK3`gw{j|g+8KZPQmYZe}oObJ6A*|l{x0?1-qHQK5u8BvnHO3!218xG z5LJ_Dh&>c4$JI7yB=H!rf5TqrtJ_+z1#*u$3?Tplh1kv(?nPmagc&+7hlv2~qQJ6hD$ zu~EquqlT^Sn5bDcFdft8e>5iNAsN#lMy6xx^-ql{X1~DH>*UO`TK?8k2ohShrUxMz zA3!o7mf2!pmX~sWCYJyAvHUatsr+najX$P{yY^IN7sF?Fzr%k{ruCB(WKn;A(v=Dk zG*&se6+#d>hW~^P$w53rKjhfUf4-65 zq3%iAe+ky%iSav1Hz_G9-R}NubAR@@Kb{k<1Mb^C_eZPnV(P^_oRo^71KIB>_vd5x zrxjYx$;ub3meEz5GAE6dvk+F{{fkG-lek(g9w|=;|z)(U^i(2x8(st56X-4mHV+-aR&Y_vq-|qbN}o_C$5YIwJ8RwnpYEkpcn7`bfcu-g~2Bh)&ju1BafeZc@{z|Zhg!hABJ9+9-Z zN9FdzH!=Kq-(~NcE|HWI7yoyCt)nnI)#CXRJYRk>LwkiRW_+{Nzchw2KsO( z&zw4Gb4kxBSaPYzN)26%8{347*&5zCcSF=S*C^d;mT`wJ*DNcR_!z_zoNG=ko4bC5 zq_rb|DzQUXG1uIevqOjUA=eJIqs_qgxE&h6Y9i(x?ibjDkx|*9AM}=o!IZ+G3c@Nv zaO=Ye^5n>uQGC&dF%<7FUy#mK0a z9dWs5O*X%;FAZtyCUI7ZHyIW_lZ(+?=13;pS#p50TZh~of97_~+i=$~N{@@F{O!{2 zBE}x;GHRMUt2rZsE{8k03Zsm!)!a+Q5Z=QF8AjC5VT8By4o2GH13b*z1}rO`8`@+> z(Uz^X!<+bwuf7@ci?Ou2VymFbFgJkS-{>D!Qg#jA`E9yw+frAh`RF!&rq92!%6ToI zhcr1r@0HBjm^HPi?O?Cay~Sxk!+NY2y==S=7W^z3LR%`07ivnd>$YE!?qE;g%Gsm_ zVO_bu4cbMYmrjX$dbih=&JQ=r3I)|Ub9f~~`pNHh$~-2k;K%@>d6;_CBXyO&W|U1b zUYJ_OBEcYXdR6p!>3O9y5lUQ5vrCgCIY7sITE z!Qutt)JR|-yn|q39EV)g3|-8li<(6qYW@u@2Y9M^HClcvAaqeQw=XD)>eC3XlaHl) z)ut+UgiQ#X)8;W}2p-C$*5Kt{GrvJK ztslf<_3tzxW?O%lBT*i_6)~%~tO!??EDhM9t@o#{in)JeRcw@1@dO2FufODzwTw+y z;fX<<~PQEy?VN!#z=Oyn~_RbLxA zlfK{{@$w+b#T8nl>uG_y+amRqbJGeE@k5tHEV5F8aq~U_M%NXTR(j6!#XNU}*U+T= z*Aae-Cu*ch=|zWcJkR?ES+K*>j!YX= zTBiKJW0@ve=Oo#73t8<)oA~SO_o!0+U@I)2T{N=7_v^C&o`|^{6K%grpE2K1tTw`# z0ITa!bkxq87tg(a7?c076TkGq8CJT1{hDQcl*vlR&uvAnkhVj-3H@Bvfs~!q0+|)j z+*%ud$T)}0nO{s?kS}f2Jy5{X16;AJ`BZ0zu4{&Cs(?AEoOg;%6tPFengsJ?GzqaW z8=evx*sr5ZG&NF>ZmiQ~W36@O|62DZ3XAV9>S<&{7N$UYg8a5DeAGnE?rgWdFE$TUsQOV>Rh%0Th*OTAE<=vc<+RC0o{T*^eX%?z3RF$Q8VpcjE+KfO$lYK5d@k~%0QEN$dR`=eZcHIdC2Vi%r3A4A4OEL z;sW!ev2LqGAlF?01;9Z=#Sl$9>lc|7j|hOWKo5be7+?BMf?@ebfQ+&dmO{a))zKq# z6ZpxkEej9l92DS7TFmjd0(`<=_MkBG;|JTzhRTW=KT_~9lPCZlld)3y7&XTUHLOWD zKQTfoodp3JuUww8r9_a&^ED^&mHAC`20%#^5tvH4BD3};`?}o7Tq47mFpDW7o~Mfl z`12)>04^SXM65G@aq#N`TEYO3`{SAHFmiX=2tNRzQet}<>!u?l4SjH5+Xw!vqpu2b zH|;dc-$Tymdj@@9Cb~kPTeaZ2#eA^Gh~S%#ba^%Qk>)LPn&v``m0jBpdg} zC7Yk`Eg$jRc4$!6j#p*>?V81_NS0+naK&jg+%N3e=GquKev@>(A{3JsmJ8yzN~!#u zwKDcM1tfAm>Dv&(dR8)u^Gxg67t*9-D}i0;w>%2$TE;y*gA9Q?66qM&f^6(_FG-AQQ=Ec zNzB_I#hh23=CHV~R}#tAg27Qrx2OHjbX(LFNjCBKvTALu;1h{*$?IVBaP%jit zvI5JWiAM8}*PX}t$FNGD6z>DGo%RRe+`*8i?8dwAixXHOrC6T}KQ9tpO@1(utStQ+ zO6s`mh8A0gE7YNV8kZIa$i5nUimUcab0TeXgOrHCQ+;is)H~op5;Cfsq~Ck#=3IYwI|~&e#Mh65r)b418!yVC-6YNbT3n%EHWtx zCX>s(!{fX3w>-nkG=NN)#<(HY{lB&-EGRH+SUVcx}hL7wdAB@aANd~x)s>XD{qnk^>jY@=4iN{u}uM4Dst zpGap-eK$th1CaJPtAy`CLnRqLo~{{gixGC=x9+A9`_X#-I+rp}lrOfPmyc55lC?tI z1K+c3VU!U4xB85bH10fZ|1J6&-=dN8yFyFJq!2Znj|p8cM_o36$j?`mTMkWD5?MbVVrXxBhi)pVZV16AbbgPRCdOt z>#$0R;78_wG&kOlvY;L9t7GQqy^yA^mvl(P&ADTl>a z;>r`5&KXVw;ec=jbMDvtjA)xk?uj09f35StWS!Ak=TAr7`Qrj`X`>x{gdrm_t#Q73 znS9Tlp8>d^*6A1V=?aUbK;(cq_gfi6i)X5%=mI5X!7C@Uo~BlFZ(x=+f!bD@4KI66 zEQwJ@$Sd2FOM1dCOn1(n)aEwb@@1m^Ue~~Dfp^ru^W2}Se@%ppGUA@ zgp%{^gT;Es3>8F;t5!$y)eZLB>Pi4jTa#mth&Nz_w+n&c;5^b;_7abwj&x($Gx7j7 zF&6wG+$`V_PbANmE7ZcR3N)kTQL+KC3^(*$Q;n0GuN6y-Lq+&n58>bKnom~evR{b^ zwQ*wmZ3^; zjonm721I64t+LVlOf+67^P?geWA$RYFUcDMqfjb%${h2Vo3_@6o%N}RF zF8>Zus`UaoS7{{JXCw0wU!O<}C2}JS?^o&KebP}J)SZ%>xq-{A1p#Yfeg5Xal)|&d z#FKVOhN}IzDOd2HayH3kXuhMq1@-wS$zDJ#$I!+lKu=@YR5@!V>uidhmT{xpqO8yM zy%Fgxbq9AL;M$zHj4b-Rg#Cqt$Fa+G2qk+UFC9x{C){u&Z7%<{T2p(4Bd>0KXU5})@8p~vTn0p?&P0lAsQ-As&(wc;j zvqooJMXfc?QbtbMf}NpL`9`<~)~NB`^ec_<6rPNAJ&jlI@Acx@9%)EWjdf){h_Y0^2v?%NX{i*Wm-z# zCD%D!>y?~KtZiFL_mL|zwXUq>T;I}MeVLvtM@*MQVq=OyR*wdOiRuH4jI=O^cqt)->(eR5rp znrmQkuG=)%VRGfA<{Ffot59?OiCh<^=K4Z%uJbh42jm)@n(LzETz>|ATS`A9*O1g) z1cFWAgoq7WN*!_yOU*Srk*mJGrL>D27pLa9Bq>KtOX)}C7?GOe(xewNz@r9td*xM(|Kt@`MF2@n|Pz4NxZ{uw^V7YRA9f9YLrrvbz!mEh~{*ZO%m{Tl(8ktPqF-Hh9YOn7-`W1 zW@>+Lu|n5TlWlFf8|l8-kXOy0lDIu1y8;*D0u^>y5tUUsf4SQ0eEoI6&9#@nUXgMp ze6ckEls2d4+SW6ya&s!4M33piFp?l|=G3tgRU)yA#qVoTxktlGb9EEUi{4%2G-}7) zs0`>%v+=wkB2WTD=kd$t)%>eN0tOuSjiLYZXH-QO=DOC3863^z@=O~}=lpy{x4-ab zE&*@FVf)`0SHz7O9peek-5<3->Q9wzRc+vkoHwuahL7OuMAs}vi_|LAI(UKMtiI0^ zylHp@>){K%o>{BEOV6%I_!Crgk|Wn30oI%&IC5x}PNJd_6-=e`#=lEHactF)H^Zs8 zTw4_3@Wfp6`zSB`Gt4;-@O znq<4uXV#Y3{-q$_Jza9tu%?x)&y<3vWf9a3vC2zcWTMhe9=fNmv*TX42+V%wbVn+7 zIPQ}*L-Z%MX%1jiWUDPcvru`&$C7)eyHI?9iVo9#RVD?q9Ny!zSh7J7gT=ObC zw5l839y-^Y>b@ohX~n|-P*hkYJpo7sr@tZLTYS?qiJ>`aE(Ox0iDHn_E1RWIcP+do26V z<==*hEpb&vH?UMio-zyY$5cg0-mYBrz4-n-8`@lChwA*y5=A-VODT{!&AIKz8Uo9W zl8Lb#Zlb_Ct6j2kjIfZg@Q`g=7#{K<^g$n>4-*jen$t$u*3X1cOdAOe(J!MQ9bl+A zZM1D2(uXm&^>tY~)5f~=zgtN4SMXgApNY>b4Ll`+haYHX>QR2UZnS2IGDDpwMkZS2 zlR(Lf3*KE>xMw|mOk3C!)MulRx=vG<smpsmyr0 zv@(?$->F}i@v8(YrZVH`1$bb_m(e4(4~)uX2vbJL-j4+D03tNOzAL3K1qf6{O%eDO zItg>7^hiN}IlMr8fBhWzXCcy?NLHC|!5`rN*5klmA&(U{n=xp>UvB=+IS{#y7Y~oH z?mHmafBAuGLxzZss1G6slcFFFi&OO`i+gpcw2%i3M(EWa!E89Odf0m(KJY-Jm%-Xs={ zopO!UH3Hy%XORxkx#aO4vHP8&Znr;}2oJM1%$3dzl#5SXujOJ#w!QRoBR=)kv8jsan+}SnJpOe zkAZ1$il`<*KVtOVrMI(Wed10F`{-2*rBb!;D9!bJG#UA&ow7PBI*~i?bccX}f;#6$ z5qbA;9h7_GNe&;k<%a^GMy4@IUW33?C(2R_{Bqy@ER0$w(U^U$H5XInypZ? ziGt?i-~f?o6$|EZfRrzRzc^`+iZiIsqwg+%$@v1!z!9siGJJxaHE_lJk+n5d&Nr8_ zfa!@4Dih}=GGSQrd$lF9fBPrXFuw1rtjJhi5mSc6|IJRTS< zk;5`)R5|@9uC)?iSPRmM+>GA>&LE<+8$W_hY354j5K2&vjgda&G-p*NFz0i}Q)IrC z5chXl>%aa77vkr*E3?Wfv4~*B;H+iNHm)ZJuEJ<*h7(+>9Sfa0qt3s^0baXUcyyL0 z!!8@5$>Q;5cjQtpWL@N9mFs%cR3_Y6`7kzqZa_QN%L#6;lnKCdq(l58Z;N-4mN+syQiPGIZH{J}M#G=7X z&g&O>rGi1a&lhnq=7im^=GQ893~puR!gO>P%j(&t3tFWn3A-~;=c3bYoWfiH9Ovez zlXeZ&?Z&nscl-=d%+ms0U1Cki+OSF~Jz961Kcl5&!XtZQq)Gx_c5bh-*R}p9;Ue-{se{B%xSX=pM2{ zff<)I@GbuV7~o=f{=~xLb=#$O{9#vQM++();|_&}tbF_^o&8&In6u;_+*qB643rVK z!s;+%@B=juX+KgV)vg>$_LJCs6?prWvpb-FjX%4cWpiHT{K4@HB|W*oGYDcU=gxE1 ze?s0(2v>=xKFV7E64kh&)P>bA6R7G#p7&4=SW~VYCe0`3VXfu{%0URm;<|8a+ehh3 z51}x=A#^%t1JpCkn79=fRn7Yq&&Wa^QYdwlW%7!+NOAx+ue0a$S0U|B+~-nzeX)qq=c(oWPal zJ8fNltD4$YBx)cdYNas{*%(^i9NUw zPa;UXo+IWdy|0Z$lF)a7&lf!S1ls*q!+GSk3w(|lO%mb{vTyu+EB;x0r!K*+i9*U} zN|-Rf)otYht~3FD^^sj4l>;wxf8f`Ve#&Hbi3r!+Z=S;T9T>GKj9yFU!Ch`KxdgkLqI{^CsZPE@w@8u*eKLYanFe{Z^zWAO&M6+0Xt0pM+d>e_--@ zcKEbi2TpEBCN#WF&Rp3m?Q(zQ%Q{8562)-I9&GdQc)KT_cQ|6%ZgUJO)=V2)qw)SI z^qf|NTQRd&$^PWB0bJKFJkH6?Xc_}y)yS&m{w_5xiTQ_;faa{;ej*urn7&9a1$DbY zU6WvH1!Cxbpbrz+aAf!?7kD)}Cg@fagWs85krNx!gLkO)r`ZlOr007)qk+F*+N@lw zWS9SHDjvM+>N(k28`)n2g}!5#R39m9ca1~M9Wp5mRQjNuJwPUfO3SD{Q8B z;nv_Kk$*AUJyg|i;j_~DitgZzUY0RPh%zHb<1jA|2p!7qu^fXY>pY+qnKe#JSwdDgSXBmtz-Uq z5Nf2mT#Sp><|%t_G*wZ)?Spi-ks94baJpXUjIwkm!A>H$r|`&vVk((`UNm@kK7P9v zcmPWDB5kDY zI)sa%KDoqq*licBx8TSr1jj6fH2chfCgqQ?VD`{5BvV$+@U6O3p=Q>Y_3pxdNr~+H ztkW^N87BBkU;8Cos+6V8g15$ONXcIuJ}&a(Zri{9wZ;QAE-6Xe|!^mH~Htvv`Xvf|7Z5s4=6|Y%*Y*>T);ZbL6eyUF1^@M_97P zy6ghu)klmku};D}>tQ8Mvfll>4w*-HbYY+;VOac`S=(96E&kqIt!Oxc)rKDjhwb!! zm^SzT1395j^6RdaT9^N> zhT&xC<4Zi+4?IFMdPVz=&uM^;{?C4L8FrMF61Nv&7iRo~tu|hLuHS5Y6{89Lats0= zn5TDiF>GU9ZttvPY%(pm{a`4{W%O^G?)aC|J+sYT`i6ASln!>y2CZWBJ$1aZgy>dh z;%Y=EM6f)qV}d(76WrOE;LZ--x*8?bSXWeFtb1bY{QW)Bn%=FywDo;|=7q+(B?ZV0 z<6n);3qzaJCxp(9ta~#yB`y1_g%e**w{%Lb{>EpgB#HjI@(#f-IgQTA1k1jt6Jbvt z8EO|9*7Pc8VAy4oOOK4CYa4R;BY~(gr_XRcZPKK!1AG$-ZZz$er|KhEf*$aJY8>BB z`>+yQz`A8c=41YPn9msJdOR%T~gpPH?~Ev zD|y2GI6FObK(e^`CuD@${eYt|csTg9n)EoV?9jop4CzwF2QrT~H?ym)c;Z^E^FlIF z!HQUUpYL@A18buj_A($PGTG5%88TvwRlyeFJ`YCz`kDPzV2Ho_o$xixu`b=4jdfR< zC!t#_o+ymYU|e~j4~!L06zKCThE?ZFNuHISoSs2?dTP2qIlTwz8L8<#lhb>V?oUn6 zOis@ty+>+#@8tA8r1wls&rVM7OM0)=^nS_dOix{AYI;s`dVkWhQqu<{r=Lf9@6`0% z{^uDR-7bchg0_puy(+4M~Uqrf*nm!~seJJTUsp-R# z(}$DZKQ;a0ujF*dbsX2d^sMCc-lWHH-AnJ2oX!a1xbCI*O-}De zdJNaSbR#((dJ)HUFTH|=buWEja(W)=Ft6ar$>~E#kKwwPJ~TOf80j%w_tJ+ar(aBZ4A;H%OOn$^ zkRHQzFa6Tw^e-mix`$Sm39dKgD2|OE>76Ya1z}V7U(p{rk8k20PMbYGPh8H0q0gJg z7qia}L_QONIuH5YRIv8uJgM@L3-qN5@=)tbO}{WX9r93{o|-;5IUVv)n~|D6Bsm@O zQ0q@kAC{aBd8qA?ntpL|I^?0YXKMP02YW>3veuuSiaZB-Cc7rjJfehXtzbo0@)Aa{ASz_e)J5lbrq)(v8&g zYm(EiB|RrKeQa`iA?f{7)2~ZTA4mFt)byg{^skbBo}OA(JaN5?U)Lw6-w?U+{}uAQ zxp*XE%YVRcTgzv^?3#!@U`<9wdr#H;e6OZwtw4y09$l6Nl^N^$$Gc5_m=yPKRl!>Y19JotzHSQq?Opyu z9j2wKPip!F$>}gHRovrA9)Ak_p-NSKQ`2KqN#P4ss_K`T9-~T{4ppi$QqyBpNzl-0AiqD&bi3w%h^u#D`ZL?s1iN2ku4$l8+Z>Ir6+m*y#BAle5KDvD3_; z*^|KWq3&VEr!VEKv68Fe=N&i4ZQgmu%aRf5NIma#(<}$+_+dw+*DD_BuN4l|lTNI1 zkw~)NPoPm@vC?c@a{b8O?tPkn>dbFXx!#A(bpt|I2wI?jl#}DN^WW41^(Z+|!!eCv zF~>g+%*;c&SseO=^R$TR5e(rz#uarm?=RzA{ov|yPZII&Og&d?=jAR|ocK1;(**w! zvyTu#HO3J&FQDHN;|RcQH*^w7YvWPT#i4G)rlBKGY>l!-`R!b;&zbXk*El%?)db14 zkHGF`lrlQbuY-D-J>DKL5itWxw^DAC`}lXG+yrvH-l_U6Wq$r|^V4N!W!Q%ZW{N`n>yUjdfTEf!R;^-rt5*J~Esr0+$H{p#??Q2WjwP zGOT#Hzoa)s>n}sdka>o?*kktu`bUPl_Vwl)`XM-=oJ%lV@cL> z`hV6d$GFDAwBTKhi+yRqxs8j{(}K4*F3v~`&Td>x9MzePEZgAJMlRz8Cp9kal@^@P zxEOEJMU9KI(t_7CF7C}ehsMQy(t=-VT%4U29MQPAZ(49jV;aKKnJ zgw5zs58w6|M{=YN0j$7qp%aalGD;DzezP)JmgkaO z0;jTNmC-YNp`piVe0RK9Nje3s5^y^XPgmYM2pKK{Pvg3+5c$)gvutI#0=(e9Rc!}) zs49@X%GZW`%V_#7gSC9FC|Lr_uFFB)Yu%e!c&cueS$)8V8K;DuWl#w)JM)Lt0_DmW zl#Qkvs9!3s$uv*r?^t-g0=n&>Kp2~jSMGMVf_pI!MlX9nT}t|wo{ruJF=)z@vaHQl zAL%bWw)$mYZPjt|y}4#l6=c2Kx8#rW*5C)Iw0%fL4Q_%3Wh+=~S0_A(1Q z>u&aK5#9CY4!$aStv7gdhDOtqQXyzoD{9Kmj{ddp>gZ)RCfYcrUO3d8=8Zo1WrEE! z{AfI)uf+xEt zBy5lfX~t(4ZZz(1C;LS6=4^9M7Xg&S7*}dHnts6xvm!N`JbvcB5ot=LRNm9rcP+@A zg(;X`y!pKN@l>q)k>9NJlT)+A@iE39#P&yk)OZb5qCV1l(Zo7Vue(!sS9F^@SDMw^ ztzJIaHVI6DAyLt3HDQr^xqja}cD89}w`ej*HS9BK{uT;iLPcT*iB`2-xR?OMcQ}(n zn{$ae|5HmE7H5r#4fdw*^hk?Af&Ql0yY&05ke{R1bC$aBe_`+PI*~#Df3$a5&WITK z|H9ryEY_?-ROyh8UkG-WW>2&7hMy5F@_xjS1cCC*Allh%UBi}dnGKF>yD=xO|90&+ z#1h55=#(8Dv&wnlq)sY#NWSblbIBZM+?;L#k4mP`uUzal0?$WWbCn#LR+ASf#;!x* z_Fyko-Z(Zr+3Z~Ij38D2$n0g07*Y6FMYbpFM`ZbyXO1fudlxkJ$@VU%oie{`?{e6M zggBe)z7hPb*f+dWbq(ex_TaS8`$N=v#C!+)k(*refTzQ62l|@ruAZXn6Usxp$sm?M zM))W49z38LX`v3Khaub;P9*3##|=P;{*`DBDNtPR+;buZ#Znh`R`y!s=kHh*hm8qu zT0zHm@{)#qG+lb6up>||2CQO{gQC{lf!TuDX%D`E9!p=!1ip_-AF-IJI2;-7n#YKt znP_viN(xHgQYV6mtGdf@;&Y&{ z_A-vk7y-A98>HU?AIb7lgD!TZF)MxV3d)HsfS??U^=z=yU4Z(Ub(Tpn$2`PR7R#64 z2tS;F2i+ShtNS6HWmb3A@YB-aH{8|D#M*Q(f>5-9+ijE z4y#2MJIRN_SU^xgPb<@WGm>s`MWOIbwS@6jy#gHS5ZRhoKkj%dMd6of5A)6cl|4*; z+#ZJAHdl>b{zqGwMj#i5|NpH$%!^Qd_Ao84q}s!*B~M1>B*?o_`_NdNHWMC`69=iCH!tGtU~~{*=O?L+oJ2ylQ$2id`RKRXI6N zNNiCvk!HmPrc94(349T9Q-qI`1LQJ`Rtj~ISB{hWculr|Su5Vs#;mo-D&{Zypx;)- zZu0`kJP?}~QPx>S?2=;X7BhG`6TI3rc!{0Y#NK7Mn-^ZQ=;@T~#o;ray~|qcUCxNT z%O;U397wizdC!`&C+vULJOdBTIZ6h=s>i-X2;)9Abm?UOC^kRSv`a81|w{^jdj(Z1NHmqcGmu>%qxl7#M#XbMv|2nfnmPMKs`qeMsw5+{f;h<;p zp=#bEIMR;a&F*-Wu}LJWriVd8yLlVlpBO-;GdZ>k8ZF<}lhFt1!JLGVs^MgGq{gD7{gtZ7> z1b9UtrsSEOw}+VQ=9tZQ(alItqb1v`B(#A_u*5&Cj#DZ=zmg{@E8BOE^$xp**?hNG ziNIdWZ$i?OcqN&MN-m=(qqQeNmbYUz2c+aME%UJSUdIr*M>;pmOHHp|py_WU*ZJJr z@zF`0Rc@W!%An4AsZ-*u+ab438B*k;4o#q9aXXdVq*RQ}OE2e!@riRXtAc3*4$h4) zyG=D5NUNV?H-GF+8)o1K|J9qeV1eB{j8>T*xzx8M{(X>ns>hT>!uMhcfiKBShQ2IA zBDT)vVr`fPYn=-PhTQ#OuXEWCa9XeJ{Mp-Y6ZY?-o)i?8yKHX95E3}0G~#wg-mcX* z>4Ur-=hi69DCb=Dfc@%XRrHE$>xn&+jD@P3DRzoWe0k>2kZ?{~EKTjc$Y^?r-x z*De`4%$_nd*L(|=!Sv`tKW9v%N%=mxUtzS|qBJJQ_74?)YpIOMB?`z?DxJVbniU?6 zd&aVMS6qO%)~0lx3R*V|O>2~MK^gMUS9jVIPKHhmTr|M=dD{Y1SQnHv?F>3yf1nR+ zG;L0L+o3$)b}1g**455e^Q|6fK*(73CY9}QHV8j>@}SYEd+Bjg;fltz z;FAJ~Y&Y4a&o8NrJ}ZEZR;ef_B+o9XMXb?6g|evJxw}Ut*g2t>WN63{0;F0mNda@O z-1ctdE7|?EwL}klMyLBH$2`W^Xt|c$6GI&(csyAl6%@W+x2tQQ>_+UKB}0kSjm3O- zWhEHnwf8TH!uZol+ZroGW6783 zvrYWP#`sx*0KX5*NQ8LcFfDMAbHnxOO6D?gC3AzglDXI^D)RhnB3-91L9@nJbsCKD&v>yOkO2@u?t&2r|27BtPIHgnECueF`>=_2{muv>g@`nX+$<+dE1 zD-HxNz{qoF2=Z<<>^8zp46EyB{K@YWap=1nN_Z~V>ER<|ETRv=#SvAor-D9oSOaWt9=aio#0QsegrPDmP-|PZY{B9W)2H|a#dabaX-|ivV5H!s!jjn6LFg=_f?in zWQi)i@3R|MLcNHU&AwHIZ&{hRIoqt|LR;A;`#4kn6}_9j0)jmgqXeca?Jfqcq0<+boi8$I(Tze)#xahGZFg35-(^+rF=zJi z8~scA+{zv_vT(C`eBp=~e`}3twib>+MnAxs+5G9ax)H&w;=+xK9NeNE*EY>1eKO6G zJ~R0@%Pwlp7xg38WD4614O`8DrCIxBfV`r zo#+7o(4L52G~L%W7HKf649w+dWv53#Bg+82b{{F8%SRErH8cO1Ni&Nab5VCkxv;cK_k-Qei?dyr-u5!%pW*z%eH9RPlBuKo zQ^{+WKk3riN@uEOAmr&%FXxE>SC94pYk(Vm9(qqS5Sg9mqDP!UH#1rrr+2K}wQe~I z+(Et~PU$hX(4 zeA{~F?Nz*0zicn-l@AfTfCX4N-_K-5pO!J0!A;Q`A%Ck$~AooIy zCgHCOT3;;YhtpdUzhyljRHt!7|KlAc{bftXr%nGO@>^^@pg?LbL6-p_1B(uN`_~mv6)73_njA0BS}wIR5I5>m!#29#B*A$TNQfbbRmzh1<(GsOWjG73 z(%!jrl?f|sTQHjW81tYtbqw&ni26833sN)ejxs&Q$ZBfT zvAr|CuublR#}J=9ps6KvNz`8fp^UdGWkiL%rNec-LTj*5Isj;*9o#dc#yR~H4|Meg z&=64PdZ2bYio2Lt|BPj~GS0{f>G?Z}kL7$+mq5;YxWxJ#`v`ie#Pc@M1RQl15ugpy za1mz#@g6kk*e4pO>#+$kGe@14Pd?+#E{;#gd+E6LQ><5T4B~A0_!EeEUaG&dDcasG zXskH}gl4aCJ%8+xm+9UM4s@J9BiVQ9GSmGhnzu@ks^wzgCAW1E_lf%#LZWZCEAR`q z&_BJl%DK7tEbR>w1o>VN z<7PLkMbb+9-==*aA#oo$$Jh@`ATaYN{uNGp2dnyGY7kcdPC7v{6#eVJyma#cFpx6x zeed=1T|9vwc~`l7`S_=Q)yxH3BIkM8cDY}4u!0&>6gA@h5psx$>ly?_M?1e9FQtK~ z#{XF_jb)Ug_f68LdHP;q*wi1mLcy6KlCZ_Z*P^4bQ)Y`W5+uW+5g+ic-nfjGr}Z;K zaGb{;Rj`?DF-tXEKu~exp@(Fn-Q7{ThrCdSee$C%aZWglj=s`)!fi|rSiv#c3aoam zQ|-2+pD$wiP;=SlGXPioSPOuf2D!}mMh`rzwH{`2ccpXcFM?1xgd$-2w1X#VwA&c} zAq5(xkn{Mln7$<@?`*(Xrf$z7Vh-(GDFZm1>Oa#RfB>8R?{jMw5knA(El?t%)_L?V z+Ms^EP%y*#8AFeCz9Y|b=iqhzL#>3)BW4`uc0O^OQ~~&B^!40bM<+)-KAh5st03V6 zreZ{haLc~Uuijx;nM00zB3t}dB z^){bN5906=#T|Z@=bx<=j~0Kdh>x2{Ld=&p!X8ug`y}x|h5RMQY6{IJ)wc(`8(kln z&eySZ=)!RsMUdo89_CWsPe&_gY;JUv` z>-r^iMYx#CD-y(7=dncH^*AWgWxlIiI4T@%<7i3aQovG5)D}VJ<|%Gp;v&kqD`7R# z7Vz&Z{|H#h-QgylR6oTOyIY92zV%%;Ht${iVc-x*t`Uk9@$s3Q;x}6%6*m%NNWMM) z9^ddyhkB99SCr=#oLG}#g!k~0o!)|{1j0LlDEP9=lvbVJMWha7W8vq?Lfuly5%7la zoRYz4`muh`v>SKR6FKPP#zfAmRODqJF9^6%(C_Uihh_*VkNbE8DFU^4pEtsPp(=XK z?QK*fQ}FHwzCxU(u>~`{9<)fP2*^temwPj9Vic>neoQWUX$lX~MOaHR0xTK1TcZws z{eDWc!T8{|RN@E4{YC!u5M3w1X!@OWgdWOz$sU2MW#(HV3G?bA@QDULk$&AGkUZ*& z7{xfY;KYgXxxV0KGPw87GEP9~)kJwIu^3UK%(O!a z#iXvyl&*<0!7C){iim^T|3Hu2NhL6pP8gMMld;J}nU_gTy`3NBe?~yXg8m$OqT7JC zx;z@#I5}6Y*DK}U*cD$d^>f|jrMt!Cs>JuH7Us)fbhi_JP<8}dYaOY?f7A;}dE7(! zky>ZEm^sB4LAOK1Ki=8IjyP|7`B@Jh3HnTbWA;iYjlq}3<(BR=?vd^u{PP6+MsCyd z&_X|lr3$!+rF%V7U3zi>wBE754fAzJ7&9c1=1V!dLIq$ zah`Sygrkdp)%6Pb2}kQrQ|a~uJRx3e0QQ_cGn|LG#32Kufgl=}%o)*jf{0GxKDS}n z^2EcB@E6;i1qbK>xkb`AOGqHrRWqDF?vlLOGh$``?3Ja?`l1sPb2EYuNX<3Q7-rjR z%rFHJzNxoeAJyCOe@@3~JBV!c;p_pXZI`!j!ELrxdb0y1fie%YZi!0>0#;sPX{>CNC z)*5|R$?|efvK-3%2`yH1FX*+RG!w(;8f455sEk1{e<;I|nPbrgMmzhM zAfVk_M9de9h`EO=MYeWch@kf2Gl&G$Kl$NHbzh9>v{K+N@w9~1G9MLgA5Keo>6_sg ztfdPdWua(vL?E{GJG{{`mE>6u?I)zBY2QT|duhKsSx`?2^@2r!LS~B{i%?30Il%ou zbh;nr5hl7x)PrK3ReIQ7rE)na-$lSXbOW>0gG8|q2p3bWWNG|Z_lLC*Y`ge~8D{Gv zjI1`=GINl0fbA-3H!hTCjkVNKs&a>pSaADIbRf9$qL;9z)Rg7pF*R-?dA;CN7Kctv`h|2A{Ql)?mHhHos}N=jkrCS!RU4_JgC z`#p8?1oz$E_uGL%nO4alS)n7OS5MT?LnO34<>kA)fP<0#3Hszw_6|JSGBLS>C@b2_ zvDm31^jc;0#*i%Dd*qr707)cLdb%H6?%|Smc6}At zBf5O49~B~P#E9hb(p6kAGG8L0Ya@S50xpMIyVa7!dR}VDf9vEy-SOkms&t^v>l5)- z(HgkJ)Hq<)f?>!3s$0$N`A3YhHt}cEqi}0oxfy(NoST8=SK%xuLYon)|1>R7$+`UG zJJ{EP%af#k6`e+tEL+SRWhhwxr)fXCp5sXtZ%V%lc6vRBaY*aRl5v4d#n}11oZy@q z1q%kvmouu-(pxkQrTS?zY`UlpWPLO3&%xset2az@9Ej#f+8%S#r@{*DN{h%Xf*)w8u*3esctQ-e$EI7sK8gfsViHu?R9%eDbmGEgrq3@I#J(IaX;weyyaiR!2z3n4Dt%5m*DKMvOzB+d zlh|N~4**)9INU)h*y;j4+$>vZhcIncNhZedPsTb6*M*m)tXI8Fa7*VwQZ6qa zYwANsxhr|9Sncava8cJvL9q&_>v^GgLVqMP0bhNcb@k%F?gwJQg232cxP8$#`B1n* ztWg%7Z#6vG_E#h;t!*Ej@B5^!t9Rknh2^3+(?+}=T`oP6ps=e6^`>xh16jxhGT)oK zN(`W0HpkO#UF5+*k)T)l&*QapVk}`<7@B(|5HZJ(6@X(HR??h3ybQfMq9%^t5yr5okl~=|h_H%ON;fgxKIv=*UY3U(7ut45MkAl#ED8os}3o zovsz1ibI)3Qb=NR$t*mA`=SYZ%{i+e!5EYwTg-pY8Vc(+O)bryuyU*kx#K402B)D~ zKshC?t+{+!wz2%)GXnOPErf#gBO&IjbW=VRk3~^uP4{;-^Om5mE-ujmJq%nCsZ63= zFEYBQ4!XWCvFb{<8KoO>87sNs+v5xz-)FfzuUc_gu5XXJd{UyAw}VPOwq z=_nQyqg<7Sg;V?3G0au>fpw=3xjxpfk|kF@MrLcy0j}VM$&`oC=Ci@aXn`)3Hu6Wu=SDO0=b2{(m)DOM@qM`u(fNc^IJL!ob>dbNW7aqj zzi@p5h}9<`fB?2H-@+%XiUZd8VH{*%H&0@N9@?Clbl$*OC|6l{U>GQyqGEv?#93;F{^Sr-+KbLYn_?s9(*<&0T9 z8JKi*lz)S|SUmm>qQCZalGk~z2!QcLGP+;(^F`!y+xdmY=R~fYyHZd8fbxF6h3=b| z7Whj?`8=siGX6$C($_GKWuuWn>>hUGslG7MF7X>cKId11Abzc}gF|e*+1O1j9)*12 z68meur1>yUn|qPhpySzWOgLiQH=4t2M1+&>!8~p+8nc)Fn)SfP-^W4?&&UF~73IZi zkn4y=P>;Kh`gzobGi8r$^g#JHO?BEi=Aa#-hg6<#$lJS ziRyyAI?6}NXgdhLE^@2l5uaxJC?7u@?8XQaFpd;@qXtlm#)#DFxHNpms`GcadKAc@ zR3mbX3Y?)=IUoNY=H5Lps_JU^&Ljg25IKWHMU4;@l_&~PtHhv&OD=+ea7)mNwpA(e zV2fb}B668{Wd8~wm&Z%u0#7%w-;Jr~Ai9YjX7Wh*e0~^a)_b@dmaRdOFru$0;Mq%e z1N0y^tskGFSC9hmHutl!(jc@iuexz{8(b|>!`_R6$8}`gNS`DV-)+l*hvVPcmLtz- z7JO(HjM(M86+ObWY9uP{(9YUqoge-FP3gXrBMzu*r#n(tplvhq;&ShW)`zB_6BCfA z!~5c^!2(hHr9IM=*w?5UuXzvkSE$Si^5MFiq86Z5^Bz7)_QH|tStzKkp1Ggdx!MY^ z#^87fGn3bY+R;dzCB?tM-Do zwy|2s#M~LtMpiG~WM%%Op*!6b7+Fb*Jg3Pfx*ZYJoqJgikGejRqG-GraV8^acW5XS zzGrG=(V|RTRj9YT0$aNpx_YNr1ziv7M*gr}>GGpc(B9DF(jMIyBQ_jDieICsX`l5@ zTnU@1x$!G`srb9LSK^Y#Fcg!|YUMY%V4G?QOxYi)ES1A)wKiVT#Lmifs2aP0T~FAjfLMtUaaoQr4fsl5QZ0FjTGNu21AB zg~5L5(j~6vI!tT}(QlAMbobQvhmX-dZC6dI!MBC z^2SYe)j*~D-Onca&|uNl8zkX?w^x}1OyjS3Hp*i7FN++RCMP*??Fj1nIv0P5^cgxaN>%kMZW0K)z_h8kn-*dEd|J={r#V!h=*#RXao`P#d0iQBn^?}L`$?2D8J!e*Oic)B{+FVMQJNma z2!dY~#*@g&cZi03i!wQR;-_6~F7+qv>-?N9=wYV6O6ZuJe*KsFt$y(s-=rlo+d0tt zGfY2Bic^ydZgDGHb%!X+>h}c-Xl;|7ZMNi@Q&4|q+dg};KT)aou1?>HPhcAV#Z_-E zIH%zlBg?n&JH!DtMz?-MBt7%PWzL#G5z310s^1f*$CIiJsx@}i7P~hmkZ@R3+P4(F z=$lSMI0rUiP4#B>~3Gnp?5kfV*5 zjFjVBT*^B;CXm{ZA8^#=>|qppa|K1~TZ=v4~vU5GpF>1eEYgEk$wN2*p;Ztn#3(a#`hh zluFUw%pR^~oK3BzFd?mK=Ow8`Sh@QWH!{_{0SL8LoBNty6VRdF?V)p-2&}m*fly4W z6{3j$51^yT)eka7vlZZG#3- zAzxLV?#2SfOPiuLGIgVS`7ZA?fd6?uxNxT)`BI8VR7-MY2K^O6qNQNmQ3^%we`%%TQOzCnf)*=;~i=ja)_MqH9Dm|Q@ue-WR_{v|^I2G)212x+UOASnK z1Ug#2lb5=Qs0-Dgvjve-^PDR@w#e~)wyM)(j$1P;2;Hd399KYlbb#RrdI+}%XYV5Q z2hK||^O4{>xmHR~u65=2*{1=@efWoJNFvNucICR6T!~Xy77YYO26u9;w3VI3bNw>r z{52_{gz!@YDs7DanIGL_T0g8>Y-igk+dn zppi<^E2cVXR8?zW9mN%^-E}FL!;fpu3-o_9>xmBcx?P%ESTR>M^;IcT^I6^0`+lIB zYOfW3D*dyR1c^s%MFOzoFX86ihjfPWT%VMgnjp*0)$BtNO?Us)@w!79H1?zSP>Ykh z*;2Gb*NofTMY@h~N{BYJIgh`fCS@3?qUFu(2avf>)N#~0)%|`_xkHO$P9_#_L@>54 zXLPlRdJicJQk9Du|MsI&zUsI&+)S;ebuvI}-5*`0HK&^1VlsjW`X#m4FR4yY8Ql9+8Wn%?HBHd9AGWYH1d#-o>K zml1nNUP;Q-z<-&6?^tR6o|UcmyOx0HsbpfN*YeAC4%^af*gtzsT9Bwt_7}Y2vSLJK zEnqv+Zo4KF}8xrU1vB&5{t&t&}NPib8?OhPQMtdiE?bVHBnY%q? z(5;FKF_kdzx=A;Zf32`zU54$6i?X?4sMX%EMMO%aFScHi;YjT|#$8<8*A$aXyy8wg zOSz^&#^83TOp9?*ckTPb{`HMbj%rl?~yh8>+sX+8aWK~ zfIbX#Bef`9N`wshfYenSkh)$DN%dUSJ;!wx!d7@a2c??XpqaoVjw!ZJmdoJOF<)w? z*Q!>jmGK$hN{QYgPu8GzP>pAe?Ef65E*`0bV^Zg2=Gp`8dJgj0Cu_!VUlxoVn4%Ft zE|Dt85i% z=J+QgY;`ATnbG;&`%i)lV0&s#Z zqn8-`7LBvBMI(E?9}k{ncmQ^?x7^{l6%iSgDOOaVL@Bgcnt5w}rMjzs-kQmVi;m)V z?3o8nZD0HgXMCkIMs&-v_@}LeW|~}Uz2V;4c?@3}ksQ$hgrX9ll{L}$Tx-lgt1jPK z#ELI4CwsDc!Z%e%V3X8HcIO^ZeQb}-EtGTO4iC=B=|6$4IAG-Kb0Q^XWZcKg8BIvpfS0P6@&u7#N#Z>kJERi@R!dq zY_BUEeq9E($D9?XwntAh4<*AVx%&b_??%(z6ff#YCh=+Dhn*J$!o=5<^BJA%0_>|c zCcfjmkOhC|YzyqidCwR-LVfLPpZUTd0%S*`m!~@}+Adn{M_L;;`$M)+ zzz#gRb_yuQ_EUSCc;*&}t9N}3p{;QA{@nP@?|rX$8VKS{4-M7B-a_b`OM$;+bmfxo z`Y44BL?YI2U8VRHgNfZ0oac-#82w`XXW-QBgU&v&!2102KS-O{uH8{wS;?Y#>9y7& z<2Pj;K9pVlDRg$OyNqHeLv7yYpy%mQZ@4M8of<=fFds|`I^UCKo6Dy8!b8QH>o2wa zn~ZG|CR%LFPGl-|(kdd`Y$}n$h9$1BD=OKuLQ?3|@o$pIaN|}7jBT)%v&BVipOtNm zmw-6Hu-BdNQw>8)$|9UI32Tuu^pWC!p{sK)+k~E zh{vSiEJ!9DRm7zADZfeCPo{#PU^Du1LOL$>XVsr3`uXUm9MM{?>=ZxE$0A{T@@Pv=8a1M)3k5YkEmX?1_dUr!v%~XcccA^04@=73 zUukLFc`IZB5JN_Xy|T~Do;Uy?u)7R616MF?8%Scfm53LDD*K<8bgn8Xv`MEEOM~JC^Wp>y z6nYrFASpS(SQ6J3IOTFStGg0pI_33p>u?JimGq*`8`__`TfCcGyYaiXQDIpJGkN2; zxn&wBoPb2m8H6{b%opt0VK(DDu-E^JhKc`JPZTSvNnB>OeBs>tC*C_@mjj_|++S?d zo3C2x@fZ`is>W^FpWJ zyf9Se(VPVZR=YZ5x2}iTl0E-w_qjt~Bo+TkoZBY&B0N9|0D%JWX_OaYCz7lC*hr+k ztyV|F7O77OANKbz|GKQIV}BuwM<=AuolOq>#f0;5&Zc-ff1)a(lQzo0TA`?P`T-nr zFxct+7kNV@wBDnq;m9GL7nSW4N!8Mhad>FLg(0`A`4(Ak6L%xaS$ygj;j?GK9p`1W z^}6W4ZoQS62*YRFEmZmr)>j;a-ALs(vL(rXNs@WryxGxSQc^DGe~*WPL}_6>8(R!w z&&le@%DOTul9d(yFG!hef^K{OaM`gY8rcssto1~8~;)}EV zX~Cej;7wXC1Fn8+Tg5zH`s4t1q11G(@1Lq1T`pEd)cvh{m7jLv%*?JrH8>cOWe0R` z$3v=xDyCEXOsYIyK2Y+a*5AuqL|}IGP)UQugJo^Ske=JV>iA_7_Y=6988YrGW&-wQ^ESIchdX{FiS=lro@Go zVs(y7SChqhhf!d)l|$*f-9Ld(sZ3enMxy4xsY2WyV6<`Bn*uwN5m+WpAa_(&LnG$N zdWV`oAB&OHnOdnP1$v8c*+`^2C9F>J;>qre%%rmIu3@XpD)!h)f^=jX_pFu{=9W6S zzsFON1y0${(Al!PniFJY?OR*zzC{U8FJFL}C_(;`Q|s8r%d9h3Z)Lwf%XZR}tFN>UWsXzl;VQw8*Qc@=jt=iqFclCL| zh6WdPu2Ar;Hd|yqWM|%Aa99MW@{;i0y8Yy#kZN~Ep7N5Y71rn4It7Gejh>AI%uE%r z2;zu+D5^ZG}xlslxQ<6MKrC z6`rKn&NSH0EdZ6lb_iee1YEAKUG+%A;qxG~g?9-5+muH=z^sP$+aGHX;U>K)I&q=Q z_G6wol8pbE@hiz6$V|SzE4gAm?x$a9Tu8RQWMfmkwB^?T75{I=j`lkQF~zgt+94d> z45wtXh2k^0R43Dcnikxf#?r#gQs3Fs$9`dCtT*jILvb=R>1Jzl_>6`-X#kN7R4^5@ zmA%0S1cF3g>%GL?JTR8$oXEegHpv_A`t#m&+n{U zgzfgWvyAP=wxV6dt5YqNAaZmD%e#~ z<6d)62_y`x>(Wc{TPcbcl?WbcZ@{a>PPYQqynM3-nMPRR*hf6MS=P5Kuy#5PKmG`= zWqru6QqPa>=#qvdvV$^72GX1DLjBQfc>a@`Kcu#}*)RNd3X)wfY3|Z#No7o4b5w@D z(X<)B5cOb9V5Hhzd!pCK`g4_lc_kn4k#e8X@9~;5FoYUWag&d?@FOTNAOACe+JF6% z2k6SbeUXe?d~_Ox|ERKIduJ9a^^;Z31|g&ALX|n-s68Oqq0R$*IHi0#QGEiF?|rP* zbi6x8L3TNsc1XYXj?mXGDZA&AsujIkL)XSXRCNHxa=_5yWKTS?D9i&^_B+Q1@B?=d z;iQYZ7_py_8A-M59#72+e{7kPE1?}+AHaJMMM%}Kq(y>}gcq*o!PmEJ%avSn!n3hk zGeXNN!#84)mxCwN0v(}tvJ|o|sG4==CKKHxyEBFV&dF2dKlux<{Q4mrZ*EV_bH)YQ zNx^3lRlASttTK%+U_2;Hzd#dleUq4!7yng}1B)IAi}gG6(XR|unYZ}yy3WQLj+nv156GnOSbhZ_g= zMH#uB$l(R>BcIZzsQ7jY*Lj88axlH{KfVymx0Bu5(^V%SYB`8wvr;Hz>iabR@Qn@@ zj?OI{ou^V{epm9HGQ~4kXXI@V=2G}d-7s6iKlt&@VJVZNG0nt;ii+(`5-cuY)dveJ zbFCQ|4!e{)U#ZVfVj~Bvhpw>i2$qjmeX~)5LJ|-1#-w?)4~O+`{@grz%ECd$Q}4|` z)w&~SP0mYRlUqI>mkpRrJNq~VE;ZR_$}9Ar!jJlDE@kKVP^?pt;y&Sm(I5)6Ri=?u z%64+yPasQt4%6uBvUgIRTHnbkszT!e4mb)`g0Z2$xoM|)r1wHOLfe`C8BB7DxGn|U zQ!qB64}mUW?4Mb!7fcFT6~V$uxrLKF+<411<=Xk0@PP!&qCgWEP}s~E4BV#l1FRv@_ylOXEM1e~d<5r( zl}V9b8KAM<5UX8L*;(qxQ1?4|s2Ygk5^XET8;PO(Io`!~*|j0<{w%tDVLfd+IEcM) z-fc5G#1+f&57Onc#Hp4Vrsq+Gxnv;0@1VA@^T?o;B$HSO5w2M!m(0JIZKA%8qU|Ni z<<0y6N2laeEVfz!lHNF=3Sle+$sgL8xP(%MGwY9*W9K_cCWVZ9kMyb=$QG8ux4MsKc6)@63W8_Qh|k|yF*^K@INR~k^LL7V71L3^ zCJgG;_W-OMuoD_@FOgx`GiP-ZuUI-=XMb-Gr=GJKV^(N*gIiC3!LeTM9G^@t^!&Wa zS~vSC;lD!U?3(XLyQn>$Tcy<%VlGugn~9$kedVXPVxEdW z(38{i>>yC2L&fZ;aLDC=T#urGk3rV5Uh70xgL7DLC zoPE>lQJvRp%QiQa79R_*i0uLXP*Lljd-#^@3l-vIZ*1r-#rBtCgMdKos@mQJBkG}w zliKm?L;UK&{y=L0ic2VsV~bp?2>5%5SlGvlE+E9{`PQ0&9$7LzMW!mP6zz|mU(|D` z>sj-255G%LM&dCp@dS#Oh8CP_FPL{*QU;!N(04R+3e{y>r!j1|hpx6Cyh@1L>Yun& zNJP5@@S&$RD=|u(rmgQH`9yZ|s}5y<>?19rv2uep^q}cZufWTCl47%F2-B(x6i*H< z7-(NJ@3vhEir@R*BHCWGztpUQU^iW%>KK=*4xUy65*0;SfJ1X*%X5Lfj3kb`-jh`>`~^o|I{?*8Mgqc+v+Go*?Q?LARO$+!H7! zLq8()Y#taQ0uA0lC}+xoX=CR;g-tAYWqD%aDjVprFK_y=%09Ep@{!w6_2L?erwR5- zptw|ow$%EI^40jg!FpSFx2XQA_Uj>tIjm?8nwzS?2C0h43n`dY&)S{{i=U|Wa5fgi z(@#FQkMUYwZnipl2u|vH``WeAH_zSjfv5Bp$?XQ!RQ5F5&9lo;=H7qvo*r4VCG_c( zYC>#?`HxvY^m<$55Y_UUsW3OT9SRJc=|rSx+6#ZEK^T6|kM?%DEA{RKP&U!Y5pYaB z92nE#tdPV`bi}Qary^HFdxk8^*A&S+3c=UFeV9TBq)kqWnVg&U#b$*flfrs^S)(s4 z`tqW_Y}1!5`m$4BUe%X&eR)$~_R57uJ9qCpNm{Vdxw}K%JmTElaV7r6kDIT$_jeAb^QHKCn_^J9C+8}%$+Z+emt~j7&f((1(=xl8UXG~L`Kj(6 z^1r9M>1EyB^s?@5dRce(rC;jqf*N<_TVL+(8%KxTLU@X$Z+?yD(A z1eDDF=;G&Tf0ez0?XrD}k;BemTkX!dMX!8|HyB+1C5Y9tHgiBGPJswBZImIo8LLU@|Fw=A|G(Qg-I( z*|W34&$6hq{A&e9w2q;e5c3DF?-BtBY$X2ZRY+^@Q+Qr}2zbqH*_OINvXt3;viqY; zRsFX2*{45uByrM^R@1`&_miMwo)`qt%z)-u>gEy0{8ZgM!6$aTGXoMPNbpp)l7OYv z?%#KLP)bt}4Xz|C*m9u{R+09iY4B9<%!yBp>s$C%U7tF4g7YhQx8tC3BQbJTvN-Rb z7)t{4TQkJ!%Zt#Z_9Xm0s4XY~E)EiSUzuu^?m>tuG{Eho3rKmsMENSi#+NvUS=c)4 zE(HQ*?dIc!goi8Spqf4LTDrrtjU8~B18>or_b<8KJ5FMcn#a*}v2wkMSOfG`{9H23 z`n+skw$KMLPK;TqK9yp2TYs_`|b18-GjU0@h{Q!vj>36C{ZzK!zqcjZg5sv+-B_ z`iX9H@6+5o6&g(b*{56#PbPv~Y!ccS;ud$m!L@t&#ALUV*Cua398k zU9L1a;lcKpfnpe>!HZ;wU<;h$p*@bvkA_`+mcwAMj%v3*ars--rUL_XmJcX3q7GFO z;MZ;xF--VnqljhpV;%Cl;WK^-bqyR?S%2wFUrj~A+Qffr$-Y|ay{Q;#(Fw1qcB?SK zD5ZnZRL^j8s$O)aV_@Cl%-lvM;@9I&s-kh$Pob35E znwHZPX?YlT5b2W6(gGj4t43jaI{nib>FYUkM0JYfFq$h1BJcZPssWs`5~bo{#4R=& z)w#yAlZP}M$=Zjsf6lCu>LKC5l!xMXnyE+?I`2md&5=1_Z$_~vR^kP|Dkpq{y+J_H z+%a4!2N7+MS|u>=vH}Yu4hORxk@F3Qc`F$9xpiEP*}9|_UEbc)YxC<)l+)j8)4X$c zR^0+~n~$(TpcKiOjjE8ZI6&41HJw9Iv0uYF6XPJ0#MRyjE+_9|$o;^+%^PyF)%+f` zH?Attn;_UeFD}BU8C$fkaO7SYG(q96*Q&J%qw&pbf2gV9)^-_$x_Tpe7c?O(bhKZA z5(~?7aaQPtRld+^szdU0hv-pYm!f$Xn4pssIo>OTXzl3Dc^?Ntg~i*#s3HRdndEJ9 zo#4*>YXgG2I#35j)k{Ma&@DB$`7JfHyT(#%4FX@h0vNi@|DvCXtfDwie~VYEGU!bY z+P~W(5ER+X0*@77At>@^#&;Po@?AmdeOLTt7`n1Fi=hITFk0a736ht4Bl>~RvaAC8 zXy0$lT@E&j-R@~{8yqmy?7T~c@sb11VY6GP`R@~XqZztX1XZd zLPgC}{E-iQ@Yt$$W86DNSu3t`)*(@QjcaB5WZ7Yhg9P!;bVYnxlABriFw zw`w?NH+OP1Vee|~@SCi>_PGNm%UCSXO_H4wq#z2m7%up}*F997@%=r%uUGCH;hkqI zdmV0`@jmwV+i7R3+uQ8O>D=mfuC=m_aoenW1u=>$gdQ|)xb4flu}3q}j)70mM$ik%SgUf7Q^NDTu{fzfLK@ZBkEww;bD#b70&C`eQQVIy+M|XaWAF5v z^6O4Me&88*j}S;0e5zRLqTB?6>6=o!^4sb5ai*)OHQR3Vrf5S^!>D0+0pWUsj=dx+ zd}e3kYO)s)S^ff<<@@2}{UfCN#9)uHJoB0`mZ7(LjK$DW ziLi}f9@}VT4p+FMuZ*ZG)A+6X^*p{u=5d&ZLTLOop3?qw=7CYx+urc{y2#A;2r7Ds zD{buO;Kn94T=__3or)1+N98A2F;wpO304%y9Y4W}fpW)Bup%gT`~-XPH%az!Oq8FV zUa+wDrF{FNOLPd52j1U~W%ni~s>wv2wPUZfse* z+(~20cFLVJwrrc+Nn^`eM%~S(zX`u7K#FaGj8wPHjmHa_rWaRCVe%MM*ma@%`i1)y%zK z8kur7>c+3T{5xmJ_OsOqPLs1SFySUzQ_!|NDox>E+wzFIa#yif?(B+rUYd$}d2Xu+ z>B~I1*cH?CSG(dCeWO=R+`HdKIN-=nQpwYGJlV@-)XLM>hklW4Q%_Qgv-}J1{lS=& zS*nY&E5_-YPPJ^n=^T8D?Zqya#RqrEeW)16rS>BWePekbyp|MtqutoT0q}5s_GS>S zfsSij&kOoab!u6QM_?jFmF>jNh5&TQgL=`Z=8?WKCdxS0lZ~hpXfDY|E_j$bWl%@b zcri_z9a5tb$M#7erWgOAqeW9pJ${S(=z8(7C-Aj{^IiBwRT=5>d>#*1ynUbhW|rzj z^XQS#B_il6&{~iLu>e-P-+#aZ&TjP6dn%9KJ;A94clr}I;+}`B##~gj4R`VB?Hud% zhxtR0yxL@o3R5vz@QkQ-b01g6EQ!;I+h<4OEL`;3By@6?C2I!d-{wA+nI>Ot6jdL7 zwlH#!OQ;eSKEB}B8F$F zc=R}S@0;KSC6i}MK{d&R^JMW-0I)R{V{>7BvLeJFy=_uRzB_9I;(CX&_L~Hwp*6D~ zJvCc_jF%`ic9Vj4m6*gdy7f;b!W2A`hmP}eZPlqn@kc<@(`a4 ziKeWl8QJQ#>(-?4I#fS*q4p&AXFG6b`hY?(hOs*%E111DSrY-ure~>b5x$Y26n&e8$3yo#paLISm`@w&y%z{~BPEAC9qtNmiXdSi#4J zHu*(H4R`oHwSowk$%rslI`Gm|qjU$Vh6Miwhwt8vD=Mi=RCNE&-%Vb+)b-!V^Hpgk zQckAFM#^5K>E|X`nrxTEtdD(pduU2C(KTkmr~=Vlp~24b$oG1n!*aiUK#f<@5mGMT zEdO0A#?4bO-b_q?U_9|*7av$!V*_CouEPO!dHSU06H-#GL!g?fFBnFcLI=BRw+VY@ z&scZ(W-yV^fGqTsoD9WIGs>TRg&#fToS|tY8N%8H2r|lvlP281Jlp3E*v&NYRVEsK8A2 z#HsiC{DzX!(t-;KC@`rfC-{BSO!k#nRsK1B*Km~ra7Y)(Qldd~J zbdH9#g!){&?Tbu%nsDN^Qop;YUDoarlTc~3!ZD#!4OC=1Knap(fHb` zp%hZLD6uv!+N7eE$l{V@A6p>~uXgpy zd1mV6bfrD^4h);l2+HE<#@CGzP`2Z31!Z2s^ zWLH%7t|U~0BB~MgeZQ2Z|6n!0;@VXZ5RHowt>$Vgt-9`UM%hC`+Lj}PVnj{Rcybur zF;=DHxp&Oh?o<4IxzMJf1eM;1UZ+z!W{<5bhV0}<9Q}Wc3CA9jf6(|Y%KDIb6OqSf z8E8{pLS4OYXn zX=yJnS#?*k69LFNY_?WQ!uCNtC|n46EklW>NpAiXsPX9~ab z%>M|0C&1Nj+@EUp^jsr~Q5B4IUdMoo6@V|2H;fdHqq@S-9x+-L9bw-zkC-UYC+L7~ zvgqb6V&Z#Dh%f#gRFEl|ioli@pNzY_cFFCh{kN=$ho(oSU$^(7xDBzQurDIm9*BJapQ>mBP;_hu>?hE(t`s$4xmAS8CNJjK;teq6~`|D0( zBsUZby3@l~J`T#c(Qic99G7*$ql$Uj4@CJe| zq)6VxX6 z6?G=nKuYSfE>ybjloG;P zn@6$p&$SmWmW7l=EfV5Y(mp=1vXC-j&Ag2dV@!K;KEo5HBoU{Sc%CBMRwEMP(;wpY zR}k);0_*pz9lPZGi6s43a(*bV59G0qGvdEJ1j(wnQa|MmPkrjoYGY{fTh6GKi@?Ms zPhXf^d6}9WHlOQ6@j=sUnpiI)!Czi z7a*c2zkF4W>f@%K)C?0wXY03B_u$X3sWhpUcW@t1hFH3jLexw}d*E=)Ts~ttVVvYx z1pPj90K~4LdA7Kf5(o5cxgV2nJezgp4F$qc9}~u}urBbe;0ew1`#tDBb8$a0q|Aj; z>aLy7iQ-zGDz#J&-|uZlS}R?uxX^W#sVF8`~$^EN8@>h3fTF%VnLLl>;RD&${% z<E{`K~SKww~wd3u;!)Y`ABhadU9;u&bD#{IV^vj5fiV0gsinPM?1@9hIW(( zgt<}f8S1U}2Ej=@myz0VZwH04I9tFT#6INXv`Qy{1qoQ;HIK zh~}W$k0#|^nTv9(Yf{3)y{V-2^-8vQ@)u0qJ#hF7r$5}J`bI=m_uc=|*^_JKvBs@V zC%QuAJ_<7C^dk4==?`a;yT<)<`nf++gLI0P8e$NULgU)aDX}qrju4g-vh2s7AZ2_H zKa+Kp?o|o`5onbl6~gv}K&XYN!ASh^nP5xj!!KbJU(I9L;hR%^pv18$?xDS&ToSrN zI>?c!$Z6;;qL`&bu~R6eXis9QDt!;I#cv{sYU6jMTNV)GidgU~IuxSgGud!QxZEex z#h&)1Vij;Lv_y{PzFtFbt63Vt8TSTI^2_=^=t-1Y?T1EEWumHU=7MVzW9fa$Xj2P1 zZU8bq3s}`4iC-?{bSzsR9%YQ%?5+D$L7D=z7TYcjv@KsF+4+YItB8Xm1=Zxs76)V9 zL|=L2@bFM)bbA=JVhTgnC19v}ay750>ke}pn_L!&&!)?*+ zq0L$rFWfr&Lu3^_Kh#twr>JQ`fspD+BYGL7${-p{vpsG5VY@!i*05d!%H{~`jZnFB zJ@8HNjrHL3bX-~tKf+Q^U}`DcBx#(lXTT(Ki4luX7H}=rST1}c1For4(u|IYMK3t4 z5dxId<9pY>Zac`l~dT(gd?U#Plb5GT?h%cu>Ws4D;f3 z*gL#Asz64+mNfpAA})SCL&44ZQbwil{c06#yo|ck0P_nEJ*LEFc;T-EjwilI;iRop z%O9m$HYru|M_Z|uO-hweGOMlhVwx{}oSj7qlWnCVK}}X$>81KosxPDTWt?2dbv?N- z&pQLb$pw`IeU*9kLxLasZW$eRvvj^SrqmigE;4>VX-6^}&5=cP8&3tHln*hJlbx+? z4Opg6|ZEwTOR++qxChEPwc9G-LS^U&`Jn_jb9mqtzDJ<;spGH)40gO%UIa zw(@!kMSKkD%RISo=k z#;BCUzqZDRx=LM(|ms4Zd^(dy~+L#9?GrOx*{o-Ce2F;cFG#<*Ay|aA$SZWOlEq zGxeqZ_KaG>-(br|s+3;}yg9)8{N@y`jHYL&y5se;9LyN*X)a^uN1_j-=+^dEn+w69`r=tcF(e-y~7p|}I?1>FWPN1yNt=AAWL&YqL zY=VJdhFW>riSRAFP~_ZGEEQh-DLGz?~SwkFF!|( z1y6K7LWL_ME`^HJ_(x_PSFc~ zUggdaufk(MtjGNz?A)rNqFozB9aQ}K>C+D^K5LdWaRi`>!0DI|090}zo%i{lR5lMV zZFT7uzXdp4sTupPhVS8E7kmX7@D)g^HnBKQEU*hlacaAI>&0~05`^<;<$HEpJH9VfmA%cD)SZdhAQb&bJO*z zq~W?GDP#rT$)94f=jaBC?J`^syDA9RL1J@!Q{56(CXN>S<^jLFjYs+=N3aX8{l4$2|Fv4Z;u}$EWn9GeyT_9+aC}Y zQqY$;2UV8H32d&$U45CTT~O22_YJ$I)s$A^^vyi2 zde~KS?o%K@vzFoVcKJs?@n+9OFQq=549_WQdHxn^EZ*_Fzz)wLh^APgUnIGjDD3xD za>Z*1WH7yh)d}8Xo~gGheu3&QI&3Cfu zboIkh)#qkbKLCnT;1+JOM_0}wY-?BSfaCaIMt>s5(9S4oD zG@mH8u;R1OZQQ^?bZEzq8!7n8AYG}o$WosWSeU5pn9)=SN-4i?^$y0y>9Pm-2N}@Ux^`|YVSo0 z|LykDC~pdA8h(nj5og$7=Iox_+NEn_wq)Nre3FhgJVW;D zFsGE~s~C9*q>}ZP*+)bmo{3kEMAeh&>B(o&MDXdwi=-n#) zg>pX(ncjE3>RF+4m2RdotEh?U>X}_WcU@ul4rx zf891a@*p2^st%eiw?aOv@x7JnPQ*?L9l#R*P+{ZRySHL17E>BBnz_Zl}M(4EF7 zS#E?~cXroXS)kixTO`3@$-1lnJJ&^0IcJG3IiR9s+TnJJoRd|nmaV5lRmcg(hO&d^ zp*}`5M-qo$wOS*s8#f^QB_oGVs~aGXk8eQuS%Sd z(O$ey_->!sj_EbRS)f%1a3=vCdo+ZkPbRM9w8Z5bcvn-Kydz(^?^e%Me!Xfi%^(cq z1ro5Hv&)T`crezoQ>xZ|WQ~C9uXX3^`lO{lmXe7mUQc6VgGB6OWenyQfq5mDx3#M_ zDw8ibbIMj%yXH4NUtuE0EmZdz+n>Z;nLWw-te$pR3-PP~2AieIO7hut8qRWm;p zqyZ=LqSS@2%l)Yr5Az~%O8Q#@*-WP_eN?3310;@r3s^Iq3)AsOsL7M3SU;BqlzG~@ zZ{G+B`WX6d^8maHZ)=)dXEN)+LdUMsmOnqQvotKtSHs^! z_zkxUddSPp;`Y$!$`w{?@jDCTgquk5@X)8KqQZBv-d14<3-^~|4apb;xv{%!=2@8W?>q7T);ENas0YueXXl$0#SNCN%6;F9&?n%|1K8Sa1miJ zJGfQz(?-=~vvfFJ)`?$ezox2#SSGF!scyk0qP>pmnJn&D(BErc2mRxGQnPC_wLrekx{ zr_@JG!kL@Z-hoVbp$8QYPw?v$f$wC)oh8$P$JW-f9d|w^emc#Ky!c2CX_mNQRkgq zbx!teP<8I2&dJ#uRGqu1b8^lGRp&11ob2D=)p>+E-!1Blj5>9=GZm!0WzP!~zqR1f z$l@Xpa-kFI9{+eNda23)R!K`GJHa05gp6a6#m2GWp%1marCa}`#vf4;WT!@RuV{;c zxg~T}WLXO4OPVWu%4QmE0p^Nq<#oe-UUNmxa|-4bVCL+44f7~Keg_mpMhzaW_`-AW zWr9z>!W4g5Z2O%T*II8+nKQiFHRgHz!)OxkAJ|u|`!kTh{3*NO65#4S)_%bM;QlaES>y?qa!!tYo*!i+A zRAX?aZK<(Nr>ThU3cn9E9>oIsGIUYe^f8SXj_wKnF_CTU*qWWCXznvLOnCOd0800Zafz_(Nv0|;S;0yVYn z!mq2eu;429Y6jj09F&sg$ZR4djNs86nP)uIlGS3Y>o9-+59S^_CXI6X?#oU}=|$ zDIhe6BO!qJ6x$F7-{DFaoin`FJ$k*W(e6b+$Hv`9dT5IvPBiIwmzm}NtCD`3S<<58 zN=nHSnf!6-3w~CDp%Y8Wa_65AS=ezn;X_ z&0w|Dxpcl$evFB?Xb)!;dHNp=zQ#KLz>=Bnk}F4@6E3!n!6l4!;|8id|Rvs>Qx2eu`$SD!=wQ{IM_RPgX^bP{;&J+}DZ;>W+Fh4~Uc z_3$UQSD~Wi7t`xF&D{SJ6%7>xuvAE#z1kO9+G}{|baN}lFH&8hQ_W4K!p%W?B*pJi z_7wDM%isM0V`LnQLgt)Nq^HR9EKUt~mVe@XAy7H?;Vkz%-~Xb!`Qn8DuT{l^obq1I zeIH2%F`t0mPySnq3a@&JKB^dZ>YNtrBEH5v2b7`a+ z=EQNR2qaGO_H5~0E$-g+nwhir3o|T-Wf>SWZcN*5K;3@tGexw7< zgM;YiDH78Z-fl$2{lePnzDN(qBf)S~sEgOtvS4B(jTm)IfFX2ZQ zpCjeot1^CHGOB|bCQ7+j!hG7b-&&*%^mH8w8cK#Pq5O%BoiGPt_ z*)tY<>r2)z%TMHdX}XB@%kn)s4%6GS>qoX37Q1D#tjZ3Ja8f5Rh}f9r-aZK?xcsMV>k|g-EPqn&$b5#%ymQtH zh)|wSqE|$ZVMN8Jz!`fILr&h`CGX1)MD9B2qHvzEZtTf0*jGng6b?l0IwdQ#Y1Rsd z@RQ?UV-S0uwAu(*{QD<_x5>EH0 z5-(yAEP%=RcRC;t#POzN;PNud{n9c$WXsYjf&EodGMpNV;Qw z3uTPV_N1M5^Ob)jhN3&sIEe9)lP=6d$&i{r4)Uzg>GrG!U=*XHRFA6xik36ix$mIV zLd%@{esyNo%=FXyprxOs^rzy}6;L|1NbyDClbR>{5TApQBNv5x;~{Wob{631m73lU z?ajy63qL0->(8af%w*oebL=(G{~Ubz-b#Mt-2ceEI$%MzTTE?`=z08}4cE zeX+~INKJBtyIzZy!p#(bOfi}KO#7Q@PY-)3yc4C=140;Eg1$pK{%L=Ai}M9rX{67! z<&YZS2sQ3K*J=*XQvd$cIFX@dIPp#W`PX&mffHVOMD5wh6DMj z^_bH4GfeCc|H=S#_NP~3RlzxI7^rm@X|HIpTeHZBsRXiOF=Db`OoI7JSss#8izp!luMesJU;G^EW=RR*njXQzSM* zH(BdF7v?5TR{TNqgSkrIl+veV=nK#Mr}{#ikK4nAiQ>phQqOQ(tw5ay-&Dkq9|}Au z1~o_|l*obp8c^}wH1UjYJvNw=$jOV`B*W!jEu8ABRKwL0%rrr>Qaa#O9RC$r)k9pC zbFS}~I(p_;jW;zP65leQbUWhYc^|W^eO1YGZ*dqEc;ZPG(1ao{4-{`R#%#lJIrf-f zQ*z&b|(V_qeElm_RPs&g;P0CO+P0CO+P3o>@qJZ$mqU{uVrFGD$ z%}LAe9p*>xnOirS$4*^%g0XJQu`$t>aNK$~aq_4utarn~$f9Fts3VI|4*3g@Sbu2t z8@|^Gwi(?9sIoh=jVlqWj##bMK~Y_wk~lR3A8BWC@lOA=@Su6r$G(80+2L|#)iIH! zzKg=6ijNRq587PNS5?zveDRTme}4h|WO36gQOWayvFg*`6D4HpE79z-5+h_iN{x5~ zj2h0IQn1Zf*W%k;{Hbh9@K3FoA||p~zmSd72ZYz{c0z-2UN85RvvT@e;)PxVOOGc6 z{v-OF?IU=+C9WP{yvbeJ;+7QF zY8|Dq{Sy6|-&Ffi^YjqZd|G&vrV|DKs4qN{hFq!}Qp;^2J$+I5Y^LVoO`-d{FtI6x ziA~1x+huM#|0`OY2~hawX@H!?gK2MtuOii6v1dS$D19zC*{aEK&S1b(vlFRqW~L-2 z&|Awh=E>d1%_mBqDsc$Zbnqk1v#eHaRofnxmE4@H8aY%;rfIEkrF%@JLrBdB%=7A` zgCzr*^NSA|V-C@0wKY?d(+kv05+2b!q@>w@RdoMvhyQMP_rTgRPR(3RA4uBpn@u06)S+D*%i77o7dun(3G*Q;Xr(!mgP)3aS-+Nu`)L3_;uROZPIuhQ?gtAMuws4zor|ciuq_}BD z`Kk5ojh?>;E4q&6EEzQ`g$IZC+t(o0w&Tjaq=T_D-Np82y&?2$tjp_zxKurAcz8(U z$Z$eX;)CfoM9(rk*YWp3PVF|nM(#9XD%uc^B}+QW$2N~M(C)Q_pDk+nEoW2jrKRyh z5T*DdzwPApv8KybMBg905Qo@%aYqU7FJ6KL@B`8nPbVzcJKO+3???%ZN`&nQ$MKq@SAO(nTF7S^Px)?sy z{cM$*XRL#oU$=w{5<|N1Uy55U$*SGgbTXC-JyEb{g+EeCVyolx_vf8xwdPbEsOxL( zFbRHZnw0PQW1c1@G1Y6DG)y7I3h(n;sEm(rgUA)b`4l#YZ=`RH=m`uBr!my1R;)yM z&vAD}yTr`Y@{^`lFi=$Epx5f!$!=fO{$YvtB(Pr<>oWfw-xSm#)$Zi63NvV?#uvUP z3X;usj<1c#Nj@UI9w_zlzx)$D?RHwbLnpDBw$IjazU<+s-Fz2aWVYl?4F84ogf)i2 z8eag6irV9IxzqL%#uGFgYgvjqB;eb&B2vszfa0^%DW(wlTg|CSUHB!vCtq?fYQPbH zYes9ed+8VfHsCZKHJMWH{X4(-zkc-Jy018CRU}I-udDITkUGuonO-|QD+#wMjn@v< z>@VpHMUBi{$9lHEHGQu=kb{{;tD%>Tp-S_rWN2(`&(f=%+|x4oP2`HK`d(v-chq$z z*wV1yDF6 zKeAW2%uMkG`?+$w#6V?HPy ziw7Ics1-T>gBlM5M$_pBCU$k@uyFtiMGkHlCfnf0i{Za7<2#CZi%YspgX(t0Jl9!OeuERJkXoa}WJz zxfO^-nkcnc&*JDh-IZOAJel;9o^KSPDPNu?-H#7vy95no*F->H^7I86SzhMr%Rqe@ zqAvw{}$nHD^L z{|<9IdQ%S7vs6mM9_&oZ!Csdm_PT^0i`jhX>C4?Ex(BQZqSS@P5EQ9%b9U%Lr$YQY zg&~}Mm5>Jk;X0g#UJa0r<>MEgus8fX!lUe)g6^Ux{8=JrYBF7z=T1-2 zPpG(avp@W;E_+u!nwzP{y2_Igy81>AUlcBn)Sr?ShTXD}F3-(RWeoq(9YU!}BP!dD z0nusPwG5aqmy!17QU#tC_V4FA=PR|KB|1PkL|^idSJqL~*;x_H4xPby$5Mg{(W<^@qDGO~FKAzEFUoa7SNW`>&)?2jBxf3H6+xOGGCnfm>t0N3-SGhl&7{md z5L!sMp{#Qoq~@4-Q*Z%gU$h^{S%oUW!%Wi@OxttPL$nTQSw_1w*J zrqtu($>eNoSt18$q}z*vjhKqQPYSi?2RcI>iP3lF{sr51a;gx*Jkk8gEC3!}dQ@yY z^@dZnO&&Sok@7>&13*!ydFXwEX{Bs$3Tay&1!-lf9r!|}k#+&NbPz_!f7K}Tc))p? zTp4LvpQngA@waaBs`dx+_M_0rjyZ^iu!g?NP8np_HLS=jJ`mOrS%z`!G^aut$Lw=S zi~G@}RNC;H6an45t2SKZEAjZa@s09Rj6XO}mvx}XEyvgb<77ois8VRD%$-A2WA`s3 zR5(nTCtA%VuBZ+Z{?)$U`l8#P%OY;e^I2>e;226o>v21JS9LV^6CK2p6x3PPLF{c= zPjlxtqLV1yS?V*Mof$;*=;9ZwAEQ5!m3di5=N4b+2HC@0VBGzXEYEjDHoY4;a>l}| zjCH%rBPWEnv{ZC$_4QcdwiJMd3z4m@Y?tinrJ4o8q-e2(4)m{NYwO8CnQtiEy z_D&-3&#}U{XcR^y1X-s34z#07byQ z&+CR0=w__WiazE7@S(A=De;I0%Tb7@jt*WNGCU0ZB)$YV#9pO&zK6e*e3Rc5pP8fW zWFtS?Vf+|_);4pW&phG__k(TpiCleA_>4IEvMlpRc6fkr5_#1}v=2sL;yTZ7D- zi%&`N{24}-&ej6`Twp}^tLIYve1#ExlV`@8wNKh|B!?I;a>M8~e|M+a4O#2n(3k@h zDx5K^-~N!X`o1ppeN?ya&*HqKzCWM(p5N{Ji>dD$Qs2LbdF;uE9^oTxH;?%1rl>+T zr4qeOq7)F}6L2!}zdkBpG)hnem2hh+;jbkjMTjmtBjFoTa#gVNW%!8N56fzOdWXYF zG}G~iW*?+^=%R3`_xy97M}0e74Y?{Nu_Ft=zkHOyk#_7vAo zsFqNr5$g@@i*_JgpF}pJJ|h+f*yvJ?w7!J?%9-ouPx#5}K8{@kjDF zKYX?Kcn^;RotTbb84Qnz-!BAl*l*lzann30M}{+mw?wf!C@jQHdc| z5H%>3AZS5Rh~g!J8VQpiB`_f*p+dk*Rm^KGh8YcFFkvzzhvN~vpxA1qRo|wqwX}j_ z6-a=Rpi~1=jYuUbZTC2-#v2!*%=dZLK4&tC=-c1>dH?$Pk<2+~-_~Ax?X}lld+oJ8 zpktdr2dCseVI!BC2|{`w26A|~E%;XuE*=8GUC8XMB~$GVMeqf&B8LtlwfsW0aJ5Ki z22N!7dIMfH60#0uZwuy%2N-THH~#80K>7yMrem?~@@{rR#)F8PD* z#LU1~oc>~(^g6zKH*b3(iC-G=0&n0Gmj;Vh;Gh_OFTm@+g8e&vwhwMdUl#UGegOAN2bm3Yzfqo#v)3c{l1gJ+m4S8_uv z*BI;S@F*%pZd<8P)N|rR@Ei3BBK~0edK-I{iC*Ek4E&j|OF(ycoz7PltV{k0szkz6 zop1>fEUS{3w(T8jbOrDj7`_*uyF?>!09tAX`$Y$XdEqJ0-)`hI)J0`M-UYN@soBn6 zIGfK}Jc~Xg^tY$^bQ@nI@lj7 z!*uE!=LQE}<9%^%TGAvKkGDmkw2r!ywi>&kE9Zcr(#8o`8#x^5d|P%l#sI(jsC(Ff z{CIx;e65Gji)-9o8gj|HB((E=2?hrfu|e_p_U6PtA}V|D>Z@JBzIoYiRD9~_lzQxc zocl~TV(@vIbFf}O|HD77X2*3EBu~Dj@dxOEo`8BG1P3Fg{=&zUtUc!V2O&ZBuD;3@ zOr4aywc=BRsQm-dKnKu@(xC7rzItXc8OK}4(zH{PDT73uC6PO+|Gv%*qgab z_Zl49mCwRvyF9&|K{H~0C-`JwR&#z@4rD$aGSH$ityF#d(os>2?g*XuH{#+!ttv$_ zvA{($RzaNze*qqZdGn}M4kVSQLs8?KkC(Z@U>N8#khGux6C!~`vo#kdQA1d-r83q{t4?!iBIJl`M?4Sob9>8p# z)m5KBU?SRJ3NXCv40zk>l3i9_CLgQNq5q|y)8@R9Y_K^mQ~wC+LLw(8=(8Mtr|0)< zb4@t_B2%u;xUIKq0nzF&AEQ081BHR%j-Wo6%OB)lgm|qS44%Ls2;;J1(Sch?meGEg z6}HE&E>~NQJtE?8DFQ_lpw4(``T;sL{Zg2*#sdm%Jk|mXAxJDNIZHEb47~`gg^i&( z-}}GC5br|U5sXf99|OcJ5o;FWtQE)OA0~x9aAT`5War`CDZAmX45ya${|$h>zWNn} zd)05`Wz_@t0l&g3B8C=-5{ik)`px`wnSW{MALifRU;_?&ik*x5URgoL;L=Jt7W`5jYG775Ov;?c3r&gqP0j~yH{OE0 z?^yH~yb7>a`}W$Q)6IMYj@ynpp-ykqKP~(T9mx?om{)OLlj@UW_!`XzzSx1?{iEmO za&GzXnQ#)Nqrn?;r@J;A9ST*wN(+y`Omn&9ec%_jfKaLTEG!>`*Z`XO^B6(jK|tsZ zIde<$t1ZATx`E)f##POEG9gUgtHwAZ_?!{!hz^Lyy6qrzV2zjvez+XVU$46_XA=b; zR5Br%MzOFy+!$K~Q-puqkfia&!;3MPA~AFQLMKob9^P%d4{e6| z@Qh{>%EK4qCj|%MYoX&Ve#Q(H$>-2z_%VD9CQsxscF>%3mK1jNE^vi?G|}v%|3B&; z(74eEHXAzefj9i$eX-sDBi_(My-;h@hA5zuTmNACo`y^so&%xY)lHdA^#yN%L0UP8 zIQ@tfy74e%J>L^{_0Bm+84gGq4c|Jh>6ZfMxNHw!0$udL+2O6_-Ft{W=E58f11-Sd zltSb^P46Hpt9WgR`UH_)Fd$fQPS^Avc@=rFK*i}RkQ=Jnh#J4<$ded5)o4wO6yOgE z1fr0MVR>Je6ANxEcd7gtLfH_97e<_C;g*1ru>@=FCJv#1yKd{T#$NWZu+mqw( z`O|vh?>Xc>8UD85yN$ode+xAef4|o4AfY@Fe|>T82F?KdT_2&WPQ2|g-W49?eRiuD z7QOWk;0@PXZG?3K8^d=KYuko@VIvD?O1!uObiU>FeUVb!mePqq0G<-Y7x=P~1+?|V z7q@tkeH`P0?TDgUfFapVR|LQtM>JHm&Skj~5wzVZ*be{LWP1Qq!1F${xVOE^Iq6 zDpmpXt80YZ;Q4T^U)4k81r;YTb$>J&c`@46Rd10PP=x*nJrnX$7aoACSp(RX6cXHODk$oq+y~}ByA2E2)fCcc21kdZa9>qMVvncRXZP9`YIp!mubcmg@oLVT@x1>W>3bai5=pWXSHAv@u~F zTsLG|J)#B;kzOL&93mZZ_wxv@c%q{MX&sL)V!rjT5QPDjSzB`$K3I}kV(r}r7umUt z2y}&eCk0y*mHvR69-?!R@Fgk6*Xfg}-jtJ~_k8tk>kSU#k{<#y% zIx89@m#|%oXkPk+ybJ_Cn4ZQVv@kFhhcMl8*KDT51B8S*S0Wd%Kwdhv_E_K;`2a7N z^RB}mz|BPUB0M7O0c!l_V6~UKvAZdZ-IW#}uW85*cl8ug^D<(2=_a11r(2WjkK3&V z(<9VCW;Hrc)ILX!hl6ZL7Vb41zi|voTcla7_~wxV0>pD6{shD9t9Mx|ryHHTW4Z}% zO2liM(SrL6zII_(UHth!nR6qG_YU6yep&3XvHDu%0PxX;)w6A^5`R6h8oVz;{`Vai z9S($l8%Eo{iBYa3-;L2zqPNG<8Mxt_sPt&A+l9)&M2$uev&Q5`btwZ*;-StwRpNrMGJzm9*gV8kciOd>t6If>*t@XYuWF z?hKy=USv^+KjXerK!7W`VW#Q5H%x6mt6W2Nz$)+d=$K{VXcD@RMN358VnN)cY9xJ- z%nE5z?B$20K-k2IRgneOnRQ9FXVz(DNgLf4jNd(IAi;DyC|qs?sd2!*=^RbfsXUJ zZy)VH#*ycPae2Ni)J}O`7AA&?rX4H}OWvF>E4eM$mq4cf@ze6@!+XrSyjLjy*PVwS^QEcs^3sL)NqNmEZZLenfZ+`BB^uOnx|jvm{sMEP?fR+Uuas1U(XZv4-F;i`Tlmx zi~V~4U>59;aFdwzo~>_7%+Jlkz3~!fN{Is~fi@%0ppdZ}cI=U#@(F?8Avh%0e0U@l z8cWgh6wHi}?#)Kf7CE!l#Nx4IKtd$%$l z;50L@g{@{P!jJ`@!ScJqAG_Pl`~28XKo5+3@Ir1N4lp#2`EFE5VMd?|4vHX-GDH~- zW9@Rhm<6o{jbt5q$(yjK60skbjmOGKG@?UvM=XkSbz+wAAEhh3H z9}*2mqCi=O%!z{iq>#ygB|$#?=9qRH%{Gw_C+<#xdyMwLX}Q_kDw-l$B;LgRjFuC> zClXDd%9dudm|snt|ACV?FMW$(v4?or?5+M3$-6&A1Kj>q3pORzFtNG6++CU|8@`Ub zkYtRd34$SHc?j}DB2$s31^FC2b;)bZP>*-C@%wqD(H*?o#fe22QVZT%A*&e z)C$t+4)>SU|HLXqDe?DEabuPvPokV?(*>qjEEty)aXAT~8JD0+NTD3VGx<17Le1*PiOO6e;@xTT%yo#j1 z7Ju-SvqsB;_wXwZhSjGt=yfALPelv_uWKc+J#IaKmC0atRdX?`$z?SStft$Hmzwl0 z@Z_RtH-I9bj>u8`(fW0LU&SZ@3rUBQBOmDJAX}$~1S*QE)a-jwy~`^(Z=gBJabtr+ zr8LfoytRvjBqh78ubbpC(>Ed`4EY0tj3Z4d`5dl^V9CizQTHltOpj9Sa!Bl8ywAQb zzi)jcyX!CPweVf4T|R@_r7fie{>qCx@+aJrTJdz`3p6JSP<+3RsXJon*u8UB>wvnZUWFd*NO7F29WCmy^^tnDqtM0Zl0x zDGMD<;X(G_yX+~J{8R`-j}Y{Sz_)uNlu@B<;`{5k5JH3xgmMY@4F3~+PbIzw4d0jY zT5uvn9PrLdaK>ab5jz}uAa$f*2iA8!1^-Dsk(yzTzthW`K)KPplXY>Vplo1IlqH|M z&u5|@Y)qYFF-QJ)&X;*0IO# zm|F-1RP_J>+t8koCfzIo&5e_KlD(#V3&Y~9JXydUXT1TwH0SD#FlQ(C$B45B9vk77 z_To{Dt5uwuUFf;156Ikfufo|4|BKHz)|ZeUX3YO{e&L*GKmEJgA0#!U-_@__!(PdS zX@Op5uP%RHskEntkkk~BgA$yhCBX@_H@p&@Iig(xO`t2&dAKM;yO3V09i2Bg^J*;e8h@)eVl^~M}Ffd9Zv z@DHQSach!QV&53*NSEF1JahTIpTU1O|h z7bGT`L)+7FRjAu|m12Lc&rj#`2-%nFgg2!~3Gu~k)}0@3=1VqnIL&G1OS_pbyPA>A z^zJLCo+tN@iKSn9Kz|D+B*egJ=F3wNF$VS*8JeiW@NE+OTtng@$38y=y_%XLQ*K$6 zW2V5n>`~rzttPmdo=qSH>q0^5D$Adi{o39AO}`tL@A%k{X+h=Ov_*dO9-Ri&W;X@K zn1vpr_z2t}CDAOW)AW0cLJwYPrITb995JTwjn170Qf{%yzZ*Ui?!(Qtuh1@ahhn`d z28NoGL;pPP{rypM0Dw+Iyr8D!&qHE20p6p}ZNe3Y8Hl;1< ztKP|nzn-z?s&WLZ0bNR@BGd-O45w#OV`c%V^lOpB($Ra7eG z=;$_Ua#9*P;b8F_^R*|uWgc@$Pk8(HfEVw8_fFiZ0la>5PIq{}Pk1jiSN-YNHoR9S z!b@dRAOpc`0r5Q08?VzQ8GVeb&<=uqC_02-cUl1rwp>j5-U6|->N1i^;9uS0M+Kpy z5UT$h#DK-gyhpk+=$bCv_d{O>L{GIAyD=Ch-nuY915|)f=!X33^3a(%=Blq7?9SYG zZFl5f9Y;P6X@v_&aui4Tr)c1CZ6AYiUI&+g+xzn{WB&h*Cy3W15(6}ZZ% zbdNq@RAT?!t)pAfQKYSsa4Sv(9Dl}S>IxGC4 z#-xfL;8>nSQQ=15PpC97C3hr;{sE+Qny|=~DcP7DYCjHVjCgm@_SqsxejY^E%s%X$ zbV6fppt@$V<6=mUo@t)(D@`H~Kb4<=K6(-hylpITk3MWHiPL+sF(kANE_c&_yoK)3 zZ(DQ65qS`Z!aGH;oJ#Mg?n0OgOuL1K&Csi+Vd9)>x%(5trGDd0brDju;^y5Q?g5Cb z3k)VK7TW*0>;maqA#3NM9lZkmtb%l-;JEiC-j_(Nc@3n*#fq0;2cx>s_KY6u1IptP z6?SiK|AM4Gt|XeWMQ*lpf`7t22Q0J2IVY|VUMwkON_6gu4^w|D8r!&^PjPvbC@;wR zqpN^9xA-I&iAqqzAm^PJINUa*G1`xYTJ3nFsb!kuJ?mujLIajyDlmVwHW;(l2lS!{ zzLK^$P%b`A{pBX~<#Ko6pxP!+BLe%PUQ%Szj?vqKZ=4@Y{f3F&N%%cR5>iquFi$jI zxGq-<#8UQfmqNpqEtmyX7H6umczZ=od+J*IsWl1rcvzv_nnqKp)UfFXJ*BWr_IL^NU~?dk#%X za|2^jQz!JRxZIp1rj~oqHtjFr$;naGYmvkOTd=Q<=QxI7DwiS`ylJVt16ECc>_y zla{csM~!h0hd_*DqL(}PwdTdXnGcf{hAonJ=>Sw>Ok8KY4>cCl)~piYL{itma04?+ z&)k#H4>pw^Xkg7rsXU(j5CBsL@=yNmBnGm)wfpe`LC$uVg8eo=Pp&zRP$lUj)#RI# zp-Y5D68>sfvWZ=Wx#JKiK|Gmvy16x>9vk-%WtVH4J0;4~@cEtHdeKu&e{41Bn;gvY9l=gt^c7da!tF?w};V1gBo7 z5SsCihYw+I9DE!FqGQlN3Of;~IS$LPL+nP?k1&A1leQ7Vt%1H-d$?&-sMHv`3R;F} zyF-fdEAmu^E!_E1AuH9~3^&6RrYKd_l-V!zj#*P|zbMMj-$#$|k=X|3r16On0BFNL zkTTamneyOG)`M40!WoUR_6@gdCj18`tG25|t!2*-vafFQGt|)?p1;DSbR3?)*e?Rl zpY50bkMR8N8p4wnhiA%n!vk@9q#($a4k3U{MNh9mp9ki#;}AX5u4R{}^G_f69zvG6 z=BjB3fdPJERbPk(%ZEe!n@K4fvNo2kiPHV(Whh%cIiXYa6ZMP4`&l(!zZAFIZRsXX zBR3t%eSy9|WkUzqy!!d4un%?YNfC)2)QTm7m!tHsW4sgA=Xn@Itbd^%*|4N5(q_~GDD|Gd`1C3&YzT`Qwui?i^cnsN1>RSj#!@U}sGu2K7*x z&DAP%tQnU}GH+oUZy-a73dB>t&-FPI>0*|s=EM_dRZ52nQEcl{qde_p5E05^b6GRJ zIH(`%NBf+)8^_i93!!grk{|AFj)2&`iOt<|r@Gd}D zTUi9I#7YdK?MuxoLb0UaX*~LwGR>Mg+nC}HZOt+KvnUl?HO*I(&}v?HN|smo%P%j7lc`SI2D14Thzp{D=D8yl06|(&srnV( zDQz@XR!|_G@5VBk3+GY+#69Iz|DsryU)^YG8%1%k!5eH%b51}LL)UF!B(Bf%-!6pQQeNe;k6!b5MlidxP`Me*eIfJg6L|@K@pX zgEzbb*ikQI$ncTa@Gjd=l_cFK5D~$HxZ_)h`Km5?oMmAvETt>Aa>C?faG~UNs!;Pt z2rjWZVQAEW?NVzDJ~=4<3POz4tdj1_FbHF~_jO z75twDgP!jAm#JkVe}P6Uds~T_A;>=nHKky{e*ckv7xXQj8s$+>0(#$mED^nn&*RmU z3sh#d3{3RQMEF6!ftNf1&6oR-I^^w zD4ZLk^(rhwN^v#Z4=XRhnzw#0PMT?F92l!3qQ~V~SpE?e<2RP5;j?Y_;;nxc+4Cn< zy;{+3l&$B40NGd04c(WHUc(_Iw7Rsfja>}WKfgNqxji`E`VB}ks-9!oqG>RDR8Jm~ zH0)L&>W@G)GfXwCB<|SV*dIFN=>ax&ReTsd&GfZcIU_^c#Js!>!*4~6HW^k94=dost1dQ+=^J%-ZuFYne(Pwh>AYclK7C0 zWbuM^pjRA);_PD^h!)W*rHK#fTl_87?>%lwS0}Si~VXW&ZX_K zatpwo@?NoEqx$E=@?DSJSQN?H2^U3NELX|+?820>mU1eWsvmr4Q%f-2n#X=%{k&WE z18`siwhO%_loi_}G%tq{j#0LeG?-i(8%KLz%lCv|{RkI9ZBTxS292tgP}N$uc8JsL zYXk3a>~_i_sI7dvW^+#tA;O;3IU7+Xft8mFyW4ZPtKnR-Bn1ohNefW}C zl3~zJhm{b-7pU3Ty{cB%;^7gVAhD8C_0#vI4%=rHC&UVNwqO?r*}LpLoSR}whAJ~$ zflIO9%t<#Vt_w9|et}rdio=9M2VM$nRKJBp0g&<_yx;_8!orM-U4rjMAOR4krU*MR zn$g8bh)W31^tW5p+b2MVDo<7KWr=`<8N7uAYP=hH1G!**Y&1u<>nBNw(7OXZM}9Ar zKo^NhK1L;&z7WpT!@3^H%WUkAQ)_SBR#SCWCrXR4msXFL}xu& zs!&&h;wCc$4yde|ZqUHBHef)|d|<#q(7h8OO;Q?^o+jaq-F$AGpbMk-74k-SXPgT0 z`1;|jXIg%q&F(`I42;22ruiw>OZP@{mtY!&|Ap>YF&u4)XcFv~KViw_iv1AQFIIyu z;?-(g%tZiza~J@ix47l!9(+Y$JY@2REZnV;XdD?Drf<_nbe+%G_uEF88_#@*$Adhf zq?M|3PMC1l3?Ok+!2O8GyZV0UY~G)Q3I%tjA&TN~7$O(62!V+p)PfH4<$VYjKy-BB z!gY;%kZKZ(0K6cWON&Wo>`&63VDgG z3YXKWK~XMqD&!4l9pLKx8{k8+;nX~tmOF1*lP>3RQ`>aZ3;}TQ7+2sDUYzYP*RW!_ z?{>{7%rCPqF;SF>MN>aeS%lYu&b$eCj;YueYRbfEwOYxFcx98N&74eIuMul^6dbbu z4RtJ#%>g!OI6y;>$$F`#!4Ee|_>mh@@w;b`*7>nT|8UabtyTZ*(myr>->cuKIYJg` zCGN_uQ-AExKS%V>m-^?p{#lDLLpj46<` z;$WLUa6_%m&@pDS2-2!+TX{X!1uVe(5mYTYGX@?aY7{X%H!Wm3PITq4%EU$j0u4fLpc)ynNSB;I4Zn>{5XxG2;(iUT3y=}-Qu7yd?w2LZBE)@K2ogW?3gUC5>y)_Rw zCbKA_@TMxY03;+oUZ0Qxm!|*-_$~a|TUu;`vJrkc%;^~hMNhgzRM-DWQ>DmhP<~eH zdZN9z&^)vY(nNUx@R1%|WwCZg--w=}xj`~pW}DTEala62D>6_=?98VzAbQDh9Rd95 zTg*iLfceK^+zM~F94%r>Ejt}=m{Q?!gkZxFZ0h(1$q#QH$uls_b7Ery!-6mkA~ku_ z>1JOZt%P|o)yy9+&rs<|Woam2E-OWw#%j(hYefUcw=ZBa5V$rLE0h%vy3z1lylE~k z?l36c^AeQtWGcQJ;o10W&303n^aws<6c(()Z)uVG)fAb-;w#vc+~y`$=B?dfXB>p) zVjI{TZGxnFNNJ|UI*n_nc?$mwS)=D#E2;oqw2!so+O2R6`_Kx6G%NJagu?febA$?{ ztO&v0@I-0>T5Glw!9w3w_(!M^W4z#g)aF+o<_TcU;p_1knOx1`h4H6=^W=L(l6-6U zL*kO`(m8CsUV{q@!U{oOgPUZ%%>G*sa)AOR8%K@RlTnvnz3#yWsusQVRD_1E27`GF z55}er3>3h!HgRmtFtf+Tm8$C^LWL~w0P>k(l7bN)Dw$-os*`~Ze{2KGG2~{OsP3c* z`frswNg+B%sq!omEV0Ikl8&9%_urVMa({S)X_ z5~s-qf}tTURja<#OvSF_%Vk@DP%do=2F7faO( zUv%r-dEMc;xeK0F8=faQ@iaU|YW1CQc-HC87pW%EYNwe`3W2xvrbH|VU_qQ8bb;~! ziW~|F(rL7gzUYyeVdF^CT+J?2V1`LXCIwz+e$}xfM|#0s8CyP*tjE|J9uIXQX`^~9 z`%?ZrweD;IawGAm={R~mGB`AGaE#7o*xASgbvE6ScxH_KVI82r+O_R(tjryIaXsGE zYB=VSH?A4j#K<$@b)Gp-oaeR9b6WHA20Zh>=H<`m2RyB{pGZP5+Lqc%D+hKZ_imF&Fgf&TIXJ5?k5@A8^v?6X-DH_+bN?YJDRIwrxoL|B#XY$ToimJd)S z^u>#@!H>V-&fzrq9T;XT1Y-lEhLQtk%3B-8g>S9+CEA~4CTE%#sYQPm`r@RVj{!5K zPIhM#ipvIDUVY`;*wZ~;||nWm(sv{d#t!^}4P4tHI+wIt67 ztuC0fRuj&}DO5~_8T1q)M|vW^@?2}wQ^<*9mIhdVYZr_;(4TfPtQvZjabz^^z%4XZ zxBOVT2LmRg)jN2N$dN!7@QXkFpRrp!CIP#KMcxk_d*e9v*3z%&x8nKGSptZh0!B~m zj=Qfv(OtALr?DlTW-Osa$j9#sfS@1!U+vg&NSG#6H9}usVkd$2lGG*6&1KjT37%r;9p>G{W>O5+(>t6=s~$9EAQv1K@yn z9>9ywUZ;^WKNo;VQco|}4KS=0)#&@vRKN{I z3>9#Fewt6ypt`aLz@T)H*J3<^^Wmmd-Nhq7Bn8SJ`yr4`vhA8UVzWwoREMk<4^ZGPrfH4$tOxST&<=gg4LB} zv=~gg$0mr|7%HfG&ajitUc|HQT`AcYy;Xk8mHK^H6km3f4iTdUL5#DkCckm8O zg!hh2!n@?x4!moJ{73LYe^t{#vm8P2b%@etmSvdB2H(pSdOPPACj$1X%_5tj+dwdd z5-sNIePt(;dN# zgKn)z4ZBDb0@y9%)Xi;L#EMnZ3g|84_TOPx3d{SbeprK0^(#k^7`?$-wh776YdC2w ziXB;diqx%;+mMBZ#g$iwHt{o7h{w@1h~5lKwbiW{ZOACmfz~o(J-3msHLwM4BY$-IAU4-=FeNMbh#2=EqX^Nwj)`Xx zqV4CkPM);pIuPx;EQl$h4`JGI01h59k4|XG!3)e+CM* zObrz;&ZLix)=C`U+FSo7@FHA+2+~M{DT80#^?gAV2gFHFW6ruYFyoV9V;vNi@ zmdDf~ee0F^#j4iS6U0bI&PX}R8#}Bphb|#MdG3L!869ZPvF)oezX=MC~(t`dr z#eNcaNg|qym8gH~n#|RtU2N%%UMrSyNKKh!uAL+Q?P;l(FU`xi$p=~Ew4numNduEN zacUAtzLwZUeigkl0Y9{lHG?h0x#(`xzeW==9-JwM{wpD$C}|{Lsd_D*Wo=>>LWEZ2 zv|E(~SQx=?*$*7rmZgh|26E!}u|&OnP}6fAXIz|h;zR}eZ(+O(Ga*_)(2R4NnLp#IqW*HJP$^Kv7!3=mK|8Sx zWSAwUXdtv5h*8H`4TZ~~$gyOXt9m5|J4xp-??Ro#ky)7u5oQ>waX4Dz^KMspf5bR? zFy6}PIo-h2J7PF8A2h#saJz7^IR|7H`B{kfcN3g1YOkMmjoXqqct6%UB_*bCJE&kVOw} zJ)yzAa0r+qqUC0?NU9WZMtox>rJw3@E?xyKh2^74rNr@!gc5YMmp~(PkhjRm_*P;@ z8d@9@mgCl}&{|fs4G^uUMI&%fWG!2Y2f|dMergvK{a+;t8k>Y9!xRw=+450U;gEj| zsR13`B&%Xw9id)Xg4v)&bQmKRGA{6B)XFmy;o!8OKpCs9ocUfPt!M?B05Bvm>(k7- z`5FAh3j8SkX2pO?&J(=~--sHFFy#>Q=WFp@&(fsVS$&wW`BnCAnQZp9jai+P`3HoM ziY#IJ#_kd5e7f(!w~rOmzTx zhgtKJrDPl}_yTTLb1UAss5jyr+bsM=jSvx3{Aq9esV)ArKmOEiKM_^oj6)Cx_onc0 z=+9%cR0&l%`qP+w3{Wl_V7cG3+&M{Y$u(>7*$BUi(m3_PT(P8WvHzcWu|^ zUV?zV1OEEeGyi3aT1bWZ1gQiIwe#vgU;AK`MfEgeA(eBdl%Xzv+3%gjhB&dRpGen) z`mcU6x|`7ubYbiW2DwPxVk_e}u%Bww4n4{n2#{JKaDpEZ0ClhPM%<`7oHyc8wO%B= zN_RnR)o+&I+^?Q~?Px3lxPf#wOMEql7oeDa>Wn{ei1fE_4ing%z8*tVe*@3kupy0JO#}YFQMJ6jB z$LY|05(_A>rI__Dy7dTf_BNhr4SGRh^R8(>rnMjMg zjO_6qF%x@4sQs#6VvnY19i$Z|`8m~9E=cInxlRs(i1YjNpA`Zyr8e}?%IBJ8S%S7% zFnGD}Jek6wO${jE3J!8c`YRZ=8)1G7ZINx9anu`L1_BOkdX72u^g&3^nuF-25$4Cx zrgc&Yw(-~nwEp;O&R8ypVSa~Rjd{3YW))%mx_)pM8tP%C0)&wj=Af`~!rUY?cjaT4 zxz=Oz2V?$1ew$gM_6^X>BqqPN9yjG=gzM^=ZDl#KS*zLendPG>nsMn?4T&Yd-s6MW zj*J*g&38DxV;cmo7)MW9Ke zptjjZu?P$5{rYE>{$VC)YdKaE%MYn35Xy)y zxuo$kQV?d6ubzfNf6EZ@Lnl>BlH2m#PXncT*wm_$ zI27hZv0yq4Y=ig5f{&;v;z}-4Hv%1j%e>0;ts<5A*7((V7YNrji)*bFMX8{lhyGfp z?Im2LYEz{qHUS;tlS|)pu&P>Mrr-Jt&F_P2)ZfSOk-IWjJ8YEixXw^()jTo)H5x1M zS9UI={0mZm+rknxI5nZ>H-JCDV+Pk?f1;}rBh0g~3jqQmRPxv=6ymO+rAI&I5IOcD z2VPz0RE!D{3*$Qbg!y8r7A6=ihUngr>Q@&gwDm{qC8OibvM1#74)K<`MX!UwdUZ(& zp@j@|zxw!m>2*mo8LADnU*6Khm?U@xZGP?*_KbSao9G63rpIISck0h0LAM9-=VbPB z0LG?I1Z($opd09JCx2FmwlM2Z1E}->-W!t4zCqk5^H>l5DTS!LBn)9X*fA3%Bf7pq zZ1E1?gkA1P>#>a}z^s2r$XeD>Ql2!EZV^7aQI7znh&!x0otYuM{p98^oF}N~Os({T zX~O>0JEw!$C8#sU!sjpPS%ghws#}BAV*k%&^sUhTekk(= zv|d&4y1NGKHui^I$O!F9q?MZ|y$*&ylEQA&cfVErHHwJyP*3cSlDAN8lDwLehIzw) z4TJm45syfGsvrn65L8C#NMmOEL#P3GgGC_WmN(=LwkAz=s~rhFN=7C(I74}6+6IF zx_aOSy9C-1yTMJ3>^sgB*Xsv1{_-e6S!@F=l^x63R1BAsP1HA&Dsk35zUG<;+b?Mocj{%4Y%Cu7X0mwG_QJ;sc1k9<`MB zD^+=Ci!>y9oZ739wgZL-NXjf#=i5mn#o7@}>O=Y}RhR07(2-HzaDRM%V)QJE+Hq?aHm47Eeg88DZj&BGnW)XaT6}V`Ji>#)g+AthU%i8sDdwQl18W{@|`o43(%tl@n1)d|)RJsSxQ0h|c};HnO@ zms|fWN&(r0p%vSbSygY6$)o4LU)|}v3bm>miyj5+kuM;8)$c^}_3y>#mA^0ftDQH!RR z#gE15g-Xddz1-0CeGR^wGP#;HV^5$L!{SK}BwplMTu{?KAxcuy6{LkrROGnO!Wh1NpVS~Y^n(u3 z>g~68wc1Z@MpghCb%=PnG%d7Ov>;Acsb51U#wM z@zr>$fgc4nQ@)rQko291#+>w;H8<@bE~DW(%Pj4mQ{V80k1O*T!I|xhGkTfRY^E?A z)-BhCzxz;G+swqVcM|-Kv4uVC*KmJi)kWptJreS>`aC>RGE=Z9;x8`N!nwm#&4A^k}6e~!9|@c_~--d(Ig-xWSCAn zGG+Yke%zn0ju&fK0T6}&Iu9FdbNQ9<6K#m_p-noL8@J(uuiEgfGJI>}x8FEhAm4Mh zf}i#Lfnc+|2AL_m(6)vhtLL9J<}zl_dT+uq5(*~PqJes!iAQWTf4UZ5jpA1Ud7=7! zRQf?~yb7N|=hpJKVmMd?Eq`%H(=zm1V4;u-pHrDI?&74N?1tTDlJ2)Kv9DevuCS>m zFo>t7U*W7-MbBa(u%vZrp_IqtdUdm|%CtK#DyvyoB54_LKR}UrB6~+juN&d%_f-nF zGo&uD!|>MMDu7{Qybh}OXG^qnBxe%^l7fP5X4R{lxgNioyfZ%C5#i0rupSaxAw{@w zV$G*WGP=A@{YAdp*K5*#DgDQ+fTlsxU)*bO)%n$NO-YW zgSQn{JD4MoltF?GQS8f@Y`mp5*cp5cc8T@)VC*B2!EhD$h7c;K{P(sC@Jp?D31}v+g~Fj3*Hs`;gm8O$mqB>(S?O7M15TH3Ibk!f1aS(pSCe zt!E@s$UhL!aV^T%0-BrLVuDY9k z`_Ax}rvbTzv4dlz^JG8Mv+6oTY zi&^)H<6U)Ye@tK}fw7qW#!|-IBq8}aLBS8xdY(;J4nYbp_~oU79m#dNd$zFM=py+M z7!Watp5X7hJ_IlD!Rt&~Phsq!qlo!Op&E!zJMxn7uNVF$RQXH;RQZ4^A5i53s(e6|52*41Rle6{EE916o#+bm2`$ZW z1pZ$&Jhy>c8WL_z!ix0W8|W4^}Ekxwrq@Y{LZpgy@Bsm^)G60D;9ovl9gqr zb9|lqF-UJe;tt_AKy)@0_K=6VkB0{9{|e#%g%CUm2)FNR13tJ9!d-vx z@-!;m)&&|H@=nGXa$HJj^>8wY{P2^QAe+ml`2hM%O&opMFhv9FpXS8d~$g|AcM9K%X z=YsNcLHW6S2Ic31@^eA?xuE=9P<}2bKNpmr3(7~RgdMq{{9I6eE-1h5>q1BdLnY!d zFslX0Si6jehKFKLF`~Vs0!tDg)w~ZzkV8!$1TFfAD8xWu3tO7zI2MZQ!{JX!v4~jAI>Ep3Ra#X{x*T7KBm{m(ir0Wi_@#4L?#o;(0)yMAF*fsX{>XM9>0|M z_?@IaR7}BILaBkcobiaa7f&B4jdi6@k-^da1RBYu?SM+QO1Rm#U4LxVKfCl#oBr9W zf7YRPvl=~i9$^(p~>sG{3wYjo#?wvX!R zZ&3TQnD5vn)V)8ClB$9nTK6^{DSEb>PxYIDHLtGYklVGO&;#XW`H!%q+RL6S5>y3= zS04IFOEu&>sd`AucLH*Av1S|8vR7d%7>sBj0M|uU1Hfs;8;?XcDGe-3p*<1;V}u`ZniX50G7GqS~t43V3nR-m1IN%?FQF2VW9+ zfPvH=U=<;Qth!||CqP6=t8Nkwc#XVtt8NfZZH&C3R^1=vVIoT59M8zhL51>=i3+{^ zG7_cI_%I6f$io<`?(B4a8E4haM07+WZ#*6{_;9%vLK>l|qO{lUS1G?0X)kuy6tk*B z-Y1&(-`O_~!emM}Q3jId$LEC31z4_UGynTul zzA*C-pdDWaOwf!A<5=KA_%N|v{t8uS{z&GD+s3|^*(?>09e&l~CP#QSKIRE^MxQ7kQO_%!1Kaa)a z_P*WXzixreCl2-W^`7|tKh!ZzsC~Zq)N9w0MLzc#X!LhLu)jQ~i$#(<-o#yS*>)?B z_7k`vPY-#`PYQ}H#&9AvLD99#uRiN5&e`quSOfq5`-n%54Pm8 zY6f%wDd3TN0=KT{1#WhOalqJ(fYUg3ecijcF?8gr`!YgD#s)_i`=TRz(4#fw+0fBm z6{m%cTpjd8y{ke;&I_b?U(8L)1wm~M@4=KDBugqh?Tv0pYDEMj(5XzjHU!%G9CNs; zy$GjhPjAq)BpQGmz==Evxdv@ssd~qrIg&P9r&+!RtDpmGb9Y|Ot&!ur5FMbfDT zM9uIwXVWOlhBMiJI5e7qDGIL|t^S#M!$^&wH%wjye~4Cf6kv%i61D6H&*Xi&Z5lp= z0p!G3m{Y2DYpCGSQl?6$(d<{&A)6Hia&RFFggRJ89Q(r}uZ%XJbM}2bUEruL!*dOXvOwDBSj@| zchf+LKxbt>m+0|mhn|Bm3-0#&)pJ+}!5bx=9;(gaHfzO)T#2T;trdfCSHPI=u~wXY zCLdCbanN1BJ_n3wmm2P7-!bTWRiB>`Gl(TKUY$Rm6}q9?vtzB%f9*8kpK!1JIpkBU zM>QS$v7X8lg$pu@(B`_Qv0vulD2UC2>ypreE!ZVCd`Z1Ul(XhwMfAWC!#=P%xLAEi z41&4I$pJu?#S*B<__|2t18gntLS=#?@ILI=Tu}TfPtx`K)jV_yy*CF;DCi9Kuh~wh z1XT5+n|CCg{YOnlM;E-1B;by(`U@Xsb$BRSCGp{&Hy+`at9kNBHvw1Iq6+#l2gGW_ z5PJ;Z2QQT_gSg6rJ^q-I0>|cDdL1c96Q4(Ll*C-_k+_J<>I*#T&m)*G3QzAN)yvQb znRdfa(}!eoU+ob zLnEHC2wEEmh&TK;U$=RPPEDr9Hr;XeXr!p$-V2{XTpncrt?G_tKq9aaq49xT09}3L za}o(hLgRwnPeb>`W01b)to9^fT;rql`9=2CY&**`)E9jZZsnrrt#Qn2OamihFLxqi zoJiF9Xec@b9w7x!Hc;n(s)5pdVoZzmy^qKEyT2EHcYylAMf*W)=>xO)Lz=GdM7RbvXo)!~KC*3L?E#C#X zs#M*jm8O(ctk8#};3*R+b4%4`sIs{*9Tne>u%CEJcqwW=9nCD{By4IrI&658(Gu;u z1>hxm5pwp!3HplJ=9;P3P%Swo0{No=`wYJ@wL}pFE?wba5yoDhfv>6iPZicBy@4^* zf9T$;=X^(X!d&M-EsiM-N#SfvV2Z3?_re)xBRHws_?*jtUzHD&7U?PkRsnOh9tX16 z_sBZ8>J2M%LfcTHF2Jnka?xytUdxf&j3qkqdV=1P5=RgI@qL$JtHPBxbh@H+#w zybm5_pvd}{e>ER_>LPU`s1svht!w}x)-=nuwbAQ4in^@jH-3!qEKo%-g)-jch>nyI z&BTae1s6Ga>r@#_+!<%E2Yf_Slqa>!0*St-{HyWh!1ur%*ePoHeEBVS6yN~0z*nr{ z+v@rb__kuayTMoc0-Mex=cp_;%eW-nlHX`71rGRDPRt`Kx*bsvmYS$+8W>Z z{@`|-p0M#Tr%xwx=ubYBhesl()hJlY-!*2=WCrhe4=+n5F;FN1qrcyw>)Jft&aZ|yID3j_z>L2V={u>@zgKRRv; zZr*wW$sCx_CG$WySldeBk52Gp79WHwERxSwhkSMeWmf2yio?@dYP<;}bdt~C{~*JI z*6MGutMjeF-Vy%AM%!n0w%?0sOos3OSq65T!B%G+OVsDuhX<<|B~>JhB<=$}W{;$| zzPF@eG#@x_3y%m&?X72QPae<|tc`C9UIpmTrESzdjr;)$tl|cE%Tgb9*r#LO`WLuX z1y!hOJ=UTQZ|x0uw?ZB0B*tPv4e)E0JtDrYZAaHM7p=VqxfXY!O0R1e z3mHyO8f<_=;K(QOhT1g*$Q?XbqOSi}Jb_mKU;&NXL}7>jVpkDLx2A6+j#vSD6q6I1 zEbIm70>UNbA&p|2|Ak*QIfa7#yf6B`a37x7YZ34((kf2vEZ-`4+8(9;gqzHmNto%y z)m2}lpu@q-oLV8zYOJ6|oMBppvFdw0v3_3P?gc+(M-lL=MC`ru$6)=r7sVjhEA`IT zHZd(87{%2iaEd>V1OjlIGT1?S@iicJl&+XK_J$jH=m6IAt+0tQ-rLgGf zT(=w9I`Jy0x?ER{LZY>?jV;^NL;Ab4hjYEbkCP%H&-asuG{_|_q3yTJI@o=Fi#(kQ zu|%e*KItx+fGHY24!dnF*8TjqQ}IDAl<+9~X}n>&hG~h;-!zDsK!z3{Y_WUAQ9Xwc za~ww7izgdTdMMy-L-}|)7rxL|3C6}R%oPI1c614ATK>>=!o{D!1=w%p;xVqu7Aqkm zr}12wsGB&rQ-KIvN<^AEGTEtmwlGKDJz#)NEXDJU{uO&{JUN5*2HpET%4^i8}zHH$As5{iT{S)^#k)IT0+8j znE7dD`WjYe5vj3?F|mqK)}(a!sgtGC-mk#ElJ`O2X(^!}naAvYp!%V?6XvH^{6U(| zl%{{Fja|@7hJbVW{+yCB@`ZK5zUff`G14E^t4|Lni$U`@*5hdoKlhmCQUt?;@__vO zE&OGrU>|k0OcX6M*9qU*^C6jQJ4_;<0h&3g zeMN(rwgnL3%o~o}nGY`NVJ{SHFCPp0h2LnjBF!ghtuO|#(_ZUJ8!c=JPKzbJH$971 zO|nVDTe}C1S)mOdf$XHD=uWM!!W~G*xY&jz?UMY)P@B1X>*aKwYwVFjq*!PYpgU|- z6CaWWK#;hd1aMo`c}|nOnCC9O{ZVmC_FL z;F>zvxfpsow-ssv*u*F9IDfoXMiiYSx;U^@2)I`ZI}k(6Bahh6Se`nZ=XHM7F3)KQ zZ657~T^iJ4df$CAd2Eb~KhD#r$TaJgV)JbuFWiMk8FKT7ldZa&OSB|U*}WCSWSO#_ zZsX8mD1Gn3%Vl6Bq_jQl$cV^e(?)WC3k7n!y%!#foGOfQkbUkrs9(4j*`5Q}0gZv- z_Upe;wWLGlrFUKc1>NHoOd0NY`=Vo1BaE@RU&4IT`UL3vZ2k6p^QBpr+KL2R*WvEg z*9gk4dj^l})gp5f8ns=nrZ8)1O^%@2E_!r<+p=0P?xz;9e? z87PdM_131LB^dBZ!C46f*CWTvNMq@#Kjmq?fId4PFqZ4a>@hhhr>*x4Uq3C=q-!4`<6z#H7 z@rdKw1(Ps|fryknRVQNAOOoaVZ?|%L$!;4M{GJU19dCrTotOQ^qBHHyuwe4?c99r)~9)`N*~riX@bUpth3F(=JlEjWa3$E6L%NeFtlKKux8 zoJB1#l<1@V02u|_x!{NP?*->AQSTjaG^)Kr%~QlxuoWtJPtvx;(+-B3r&$P2fzwp1 z`z7k{T4|{@!u5bdxF!6c4AoM#?1vXgJALjE4&S2gjMsJ#f>?|KgcUawhKb0Hik#c@4}5fXaNnP+9H)^x7mkUzJBEA6NLe) zA)U!kPF4frE`10&`SdYn-sRaXi*n4<%zIKrA7S~Ej1qVr$ZkSJ^Xa3^p*5I4d4B=+(LfIGX{D}McYoF_2n^odp>TAAp~m{BN0 z{ua36Q0^#C@N8(-ttF!|ho;$c-O=KyPY%o68sF94e$a7tb47!+8O2G`c+mv{l3yYv zYbRuqHE? z|Lj66usNBSTQDMlQA}e09Q;m%HL&APP?a9x#sLdn{Qxey^plS5s<-xiAjjrk>#vQo zvUjHwdULwpTl-foI8`35#@<>UGG!g=L4OPoz|a@#QAlX+j?lKzqzLvK5D)z{nW&ge z#pQ)~hUQAU{~wN*>}Kqbp>Xg{YBrjIJStsLkOGK0MGA5~IGBwSC|_qqFQct`;^kw# zwT#W?*f-@N^oN-*DwW{?!JOgG-r-%wGoMHXvYB;5pa{`-*Xjo1k<7Er%$tH^Z%h|0 zDh1mhU6HAasI(6{M~$o~(IaayP76_)OMP+~r6ydxV%0$fo#b)I{5tnBjZ9s!sJj;y z=o#Z(-2~hH$Op*qt@sNdui$S6@dsojeUgBzFaP!3$ZAJAsBrK%kQKN%0YNUbAqc84 zIAmEEa&2g?*_wSM8ok=Y{Q?LM7=!_&3XF%S;IS;e^o|y;oMmzI&STo0N_3-L+7e`{ zzZypod$;nJp{fod%3Hfy3{|BjtM2w5)!fZ$Ft=gria#f%=b^a&pe-m6H)ASy*J6yb zd=ef-T9zw2SkCUAtQxcy8RG4j|Hs<9fJaqb{r?G!5HvbbQBkR2MFmAm6fX$YAO!Fd zNsJ_3h+wsrQZI-z64dCxBqYP}2wE@Ls->+LYHf=Z6}4y(N`!7xcp(K{cXE%i>Bx!MD z$6}qrcvLbeU7}-U!6AQ?AW$Ib_5JmBYCQjm2KEaU&ssWG$82>F%QO;uA#CAXPZ#HB z_Nq?3QW<?;65S zN3dwKjR2SEFWTd}E9x&eIWxXUFxHKaqpCXiZj&8<={?LcDPG-K-xV|WOqHR53*NukJeJ(ZR;h5=3T*4~0YF5_ z-1cR|(YVemoRCub*gINp9#D!2xl*LCX1SLvv=n*GVy_}RnvkNUPJVorIP<#zLe<}# zE@sNI-Rm=_0|mckB~}cynU%pow#tJU2Mc|!9O9ok(Ztvk_`utW;Hd?+UiF(}C!662 zL$d~55KJYO0E71G?hlPH(ynSfud>6VGPudr%)tM$8sHEA_Qwp@cMe~;RazDNtlh>8 z@dYp4VqNVDugn&f(~2$Q1&(=qF!Lqaa35lU>tPC`Twb#N&>roZ5Ygn|Eqz@fm9_%oCFD&8QeVmdNvaw!uD5P;T3FLn1QZ2Am zST!K0#~oG>Ff9#A9lM6a5Uu}%tIv{C1^g%v8gpy?CR1xgn6++2(CAFpXnPU706h6T z;9USaVn}?HHw{FimleSo)=Ob|rQP``?rwGN(;#d7LW&h{R>1=)nBFU_^=#OdX<`Qk z;VQ(B@oJV@iN}LS9T=P~UEv6DSy)*fBm^z(hOnVF(^z5PUmE-|R9U8X*{qD+=<6ocJd3C zQ@t{{!+oVS`mYRr`%y@ILVM&K`V9ts_%-rNVd@WXbSO=Lc3um*UZmsA@j{}1*5N>r zNoIlTKS<84iaj=K5=EM=?1nR8R`HdB97givli|+8AHCvd^92dqeK{c6j15A0{H9!s zVCm}jq4+VbM6bB$QrE14ir}G-4DP8u>3v%IfT>;SJ}t6FgJ~>nXHXy7`C#e`ZD;Mo z&u8o{$puG>RNiHz(&6l;FrHR)SZM}*z2ti%Rcx_{$Xh&$h%|BKMSqv3rmXO0M~DI` z_lUA3-dIdDBx$@qeu7uJ!Y_f`7Wm%p$1A8r&;fvf3cL0I996Iq>=05YnNGiUSt#I1 zzpL^lVGX**BrJ^Ez<}Ejyk1#Rp1y@S(p&sWq2^5kg;a&8Sy0O@uL#H&>N=Ra7ZP!5 zO|(HbprJoXNO%X2!9{DZD4&@b8Yh7+byIU}4*uU}#9ARY((}~IAMG2FCsyK%*M!nQ zo5?o5U)MxB9@qhkxIuhE>KKxX9qq>tuWm)MMKJK<_xlS329DPcw;C9{Da&_Da2K5L zs&t%7iK%8Jm-RNq@L+csBy62CTEL~j+YwVU>LbI^N%Lj2!OtKA-;WEmn6XL*?No|O zgP%Ixp=#BhY-qDI_*J%Ko$aCf{luvZrAkNO6V2`jY!|kjKt}{pgh~vB%-AvC59;}> z$a&5&zZ8F=eZs-f1^%819Sl&+rRBk5dqyJ%_DKXS>OKe9TdnCwg2nH;`O!vl}>rLtK7Jg24t5jJVbZY*;c@%xxeNRQe zy-uE-C`h9HdRz}3E=$TaaPD# zWB1R0PsEG3Mw{RV_cx-F8S{jjRSK%IiTi{0?4YW4teFqdS=zBP_u2HzyXq6>bqwqe zO1b<57m_zceocw%4g-n}1NAIudY6`C72_AnA!*v2@YZfYj76N?dYZ%fXwv`$iqs|q z&!-A0o4jRuUi9uYtN+p`)iA)-4K8Hspb2nlYuDmBC!rTU&87-!(fnvLrv4ReqWL`U zZjHyEKYP8QR)IhNn5hoQB<4QX=1O}HXr$4mHL9`7`a;3o!M>47sfLEJBtIZqpJ(&) zn|`VG{Qhb?u~g3u5uSU}E7O0_&I;SrXp8oU&mlG|<>ZMG>fQkW04YS@*A*N}0$)08 zD%LQ}%~E(>%3GyOKF+=JC-+bJ1vH{>pP_}3KAxDO;hUqcL{&d|D3N@i`MP^bC7tZ|L){u6Qdf|uhLyEdv z5EL|^>}m&9f7WH%Xp_=qP3Q*hqA{r0P{+K@%u_qMi&t-POA>85f(pEMv&bUNqIa>$ z_=aTjHjw9r0Jn6>Zk@N9U+mU~?OZS<J$Oy8$4w_OM@3*X56SfhouaPR6;_!TcZdr_$O0r zNv=ov2_N+lds&Bt46@-O8N4)Xb+xV!+fxNiY<07-VP;gg2dtM`Fjol>FxsS-|+>er$ExX{sF;}Qo?Bs4_ zYTMkKEOA1o5asA4qw(4J%ojc2$7<)S!h`H`E%+lWxbMcvxYp14j9(d4y>SD2+ox>* zLFaEf6`=FC|0z1s+#Yq|RmKLt-2@s~N%uazuN@CzA^XscQ%BIO8hQodVGYDzOl_aH zR&>kQfbQXpVmJ;&rq^#$_RI=N^&aF3<9l|Aq#H&W^7QvG+Kj?D)#7dozAu@MnNa zbQvX;jP2iki;$=8%}@_8i(fg%;ThfylZ+{P=N;pe^S686ABHk6=SQ%PN1bZTVUS$E zt~o`1^(y&VeYP;9_0guaI&-8iXs!-Ua7?ncv3!PXVl$>|Vwm9@ejn-=qV(*Aj@`-V6VD>x4^kg9bdI^MIpp&jDW;L5wY4k$J6@Cr zb5GP83ojK{ED~=2w+16Gv$nAot}7YJbu*GKkW0hr77<8Btn+1Yn^$ljD~G~;JFrW0 zcL3}D=G8iieI^ty$Vp|9|pJ@xzE#G%@&4;>DgKK(rPy@|tlA^*Q_ zx4&Ka7k3{KUKJN{%b9bpfZqp1JItJ$GS_j75TQxDiX%Ury!w(3SlndJluoA8OWa6* zC{9!H4$GK5o+c&~c_Wv26KqgX4Qhf7r+P4(Np4itgU5}&wEyh4eM_euJpM*6&=4iJ z_kmr>kY0gz7M?)d_3Ek^VKCl}zwag9^A{7R*-tKRW=YO>OX5;rtuvFXZXE5QomAK9 zPZ&yb44^!C8}D`-Q?%(Nfwi zAw!*eDNz;?ouMj!Vh+6dQJKShJlMHDA_qUz1V>VgVI^C{D&iw}H_M`7uIA42hPhxp znf->MzcPWW>xSX@r0nj(qEmh3o`=BOu16yfo!y@pMgO{?@YA>Q|8;#I@5~}E(sXHf z!EUGZ(Rj7K1<3cm&aCgDUg?+FTl4Ow?MRJTD{PAquC*AduWxU!Y@6|g7VZ#;cH~$fR%sJzO-+a+!a-Gf_ z+tX_tz5HkKwo$J=$DHzRDC%7n*b|shjmzD_tC}*TP8-}DmlO+GfPnQfh^_@s)!7!i3ONGx5t0PAi`ul>DzY3 zznt;nkM72M{p%qa$c}g4;HST~a|RfNBffo4jrg87ey0&@xZzlJTjecoyI2MW#<``{ zjdMZ-N|Xm-W&0RyoP2RctBF4E5pDN@Zo8k%2Zo=%b60rEJF+r(!%ZDtA_LETgM5uI z=YoW{Xl9WhdZNbnJzR0ImQ@hzz*MlYw|jtclpA7tHS0$_1Gt`efj@DCKe>QtC%xi( zYsAIn0nviG();+;3^PK2kKhGiK3nOuMr#}4uO(&+9FyS~~eA7J_ltCS385M~>9f7kS&FU0F8EpWD}{CK4J^>oDB zw|Ij;YsC2#Rb3;3L%{Xq+Wt_wUC%G*+f7&kX_YOxpSzWTI{C}s!&SMb*Dmx-K8hT4 z6fFo$4ImyNLvO&hc^$)%ijAwdR2R{1-=CS2Y6q>8*AG2VL-Vt`dKx`zJqm;u)k5?< z?3M+D>Zb@l^IX_>mVwaUyyC*X4%-(lGZR^ImEOr`EkEx$;aqh5%N$#!FMA7qZZf(^)sP;H)q%!XaWWHQFSvnEfPwqY{I1HaX)B;P66srD^KC4| zqjoi%pRO!cZjkU#vN;v{g@eu^PSm2)0hEkdcQ@m0MLmc z*LB1=@W1rcjUo#)P_dYsAXS-C3$@h3P)gpuE@*C5v4mJ`d z%;tz$8bqJZ3Jbi!C!wytE)WJKC!rmjxd(=jJ{t{Xnb9FL^I$!VgkWoTjnFD-flHDt z@?#^sCK|&pkZzN@6jbSGcNwGqYW?l?w$ri0vEB& zTzWWQhV8{}nB>Sawtmik`BHS{-hyo=59>bCf`9O+DRXb#`K>2L>*K0ftBm&@0}m*(1&glMfm(9&epEB%jfO`7C74XD#aC?25WsT*Ip z4-YdW7Z4OfL^NrMoKs)g5p7Up!)>LV*j_ir4~3MNcShsoPmA=mX>b1g5nE_AKU_=N zc)NWwve@XpxeoUs+~S@%Bbw`+kwSAg|KXLkjur`{(Vi{%_i)=(-Q(kY2D;&d3z+aF zQAaLUTNHtY4Yhk1n;j${b=;MSS3T;3-;km1^N8PY5j}o;2ztgu%imG)t_q->`AFyM z21@7hD2gX@vl#yeE@t);6X#-F+5K%M#+$ip*52M&*L{!v8NY(h&6AQHJRj(#R_bX3 zs;iDjh3)z)50oIonb|Ej>}0Pk3=dB@mBz54LEfUUA!UuUTtDXr1Fa?SVJ@peJpN9C zovh5h!*v87n=8o!SB{an^MFt+tYv)|W2Xz><%q;?`!|1n3!l$K26+}voQdT0e}AUU zxr!i8|72-9HQPV2EWnhHl&X{dXSuRwAwNN4M@^?LjhaKoV6-9w^sGDv!BHY3YX{q{ z*~(zjzBX<-tY!$>PV{PC$Cv_Smp2S(*h7BWM+aytc^FKS&yX|D#r~VT)TkOZ@i4Oh z_VxQ0g-nIs?2f5;rdVo*r?&GswW@=Ep$v_~cqgW!*?x2NiNDsa9$+qDt(F!#)Rjj- z`Mg!CpTk_JAwN<3q;?qoS@=Kw+;-TD##{_`ZRy1It;LYVczm|e1*~Nd4(qf$IQ4RS zCq6=#5VQ^r8)==nJ@Aw45YUeCQDGcp#)6{k098(RnLTtUe<+w+qjXvxRN#B>2nrl{ zKO~xHauiHTaMRDQZ$T`&+T&^tdfA|vEKEcX-6OB5A-SJX?TL|Rr6MLF86F!p_aoRj@%hBe@PnU8UYW?IIX zWF=L-WUFfYd(L(G5^0=1s6&b4uUvH4FZ)jlchE*LbF4*eqK0aA(Vh zU~ehKwfP-$HhJ}~{yaboq)?m=c3L)5iZLGh7~_GiBv-$g%g@OR{y)>dqL8NM(mzM9 zpvfWqTNctkSGFhp3&&;j59()So527Qn4RT-nseQ@tb@(kR`WST%xl!`6NMZQw>|R!^Ew6 z`QEI8?81FBdvMu#cy~ZC-FR->C$n}ZsrOZSkM419H1ql}QL^N?N40#_!4s~y6M2-@ zhpXX;6;wi2Q_twq@;rP*yH6KHUh6B^qw;?^W0K?0Wu%Oti`5>@FP$!G-P*G;v+>Wx z70t*peBq>dt8_FN-IK<`PcG!7HA(8f@3-}NVVASS+6m8+=~p?LhS5M;7vFj-589_X z;s!hakSK)M`47k1J2&^+d7Ikq*W%>FwN#NR?W?B*1JI|Ux@&|G=R3a=;tYmUoz}4J zmV*sC0<)uSphB?xdEBkeNEzIbE8SEb)y)vVd3e+^T|e1Hz#FoWQASx!$vVYTFv#iN z-IZtSKNyG$78Se@7aWN|eiObp5;1($PVyVB5yISyg-EbP*U7UD4K^9=2YdS_SC1gA zR=TgZFYGouVm9ac0Boa9qoVoDU-_6r+Ic_D-4l*s%-*MQ`c^K3BROm}?x5EaTS?$E zM{q=Nggk9651xBWt=q{KZ9-XW=Q%pncqjg*;Wwm$_)V#rK(W>83Um2;I)Ibv=z2Ru z66ZlkEGz}Sd$GHE?5*@^b_%4=3zmQ^91a#b`bb!3bXx>G%JZfK{=zGnoPX!l$Kn&F z=+O`S$mR(9vE%({=?>2#D++nagP(&JBwHY;MGncIW zh0WS{`);aY@lk8q`_gnbf65{;+CDYyBY3?V{k_reUEzJ_J(-Ss!uxF3v#9be@O~lu z_Wu*!w{}<0h4)Yp81a@cJ5f%)fglc$hE_ z0*+digMb;+X^4Qo3cm>;HyQ#e_*0I2`5*D`+V0x9@E8D6eH}aw;_USA{QJ-l9^Y8< zwea|6*!V8+=!t*cU72YUaG2w+C`7<g^($+x z*jc_bf`z^I^v{SHLpO;&4-**WVq9<}UUpT;HULBkGAk`pVKBkE_)qet(|=qjex8eL zbp=;8Y~UP9d{mItf3)fMd*Sc(shTad{Su?Oz0`mhfJmW{R|gMN+c|+z2emSu5bwk$ z+l+cY=cEa_qZN`(j{F__IV=N{a2}!!1LY>aY>RR_Je>P=e-kve$k13?bfwJkf9CW> zjl6K*#OKFH>wDV>qV=Wx4P*RL5RDBNe}<5Lwu9TS_#XC?{yX|~MgG{Pbxo~f7`l*K zqR+$pHJ!+q!=v*brtRnp+x=iTP9$MLZd zi5(^JbH*GKn>^;G_|MzFPu-sSmSop06pp{q&SfqxdF4@b$e81uzNH=S5?8!?ea9RV zZMcwgG{HrqXua-bh5Dm*!US}sUQNBsREE8p?26nnXx@!q9Dmidm&Z{@ByQ~bL2M7F zBH`Xt`*jW^P2cBlwB8-#k?NVpQ~_7$om((IK51f$y`?yIb0VFc;E zF!k@$tAg(!$`Zx`j{;~a^OdHe%5B#dI z=i&|Cl(y0H)wgZ1Xz9OX`(CD!J3e8Q@iRamue8li?DvR;-G~I8KQv;|;PhQDO6e7? zueG*~`_H?;8c%)NemO7kzxy=)Vf%$V{s$!LZ_C@gURiwNcGjFR--=x?6q>D`Ug-31 zS(oe@GH19~)8?&s{yRdT_uTI4`Ut#<4F-eaL&1olV~&qM-9Cm|i<3KU(PY}%#k%up zZ}95J?T6cs_?-?b_UBgyD{kgF_42V(I+LGAZaF;l*1WkHoOnGkS2$tz5mH%1+qVGY z)LR7Qz5R8bfc2SLn|a_qYXk7`qNtjAjHmQDJ60HmzyYLQOTPb=Y%8y&rUWdkKYky# zfcxZU)^0PcwcpA=POV7ZIxb3M^nZb&DG(m()NmnhoX(J7>kADPwg7AgS}F}zr840mLKnz{G1Ciz4^T?62F)q@hOm=0maSHrwe;0 zKAT36=hZJJK0D<4eM?4dpZ&MQ=xMROiJM1vO^Y9wdK;QR(!l!PiwMgF15}BBPpA@1 ze9ESaDfRPc!^3=MsGs+W-gYh%ps21u9p;J*+Y}pEydnB@|Gg5QPm2{MUV1U{`61Dy z)@SUf)w4gM$7uZlZr+KTdv{Hg+C~kvm8THma=i1}Duu@RO`HuXT~p2PY&+Ia{sMGdOFSkp)v-R|lIXJ0g*5P08VR zoW42~9m*r4DT+~HEB1#6%V)DIiuaX z!;N}&`iZI~l6I?tHLkdm_@;v$+{Gn|aA{j~JZCsJV}jJ@;@%5`i}*+*q2FH+KY}ee zDEJG&B|tBh8D~}=0Iy@p4J>!*aWW$e3SRu$GV#LnAXv;JWuu=%XRaMWy3q{rp;%_} z7yV6Cgb;XMO$XYu3r&@E0F=W^oK1LU7>)n69_xntjUeUL4Yf`9l`)+uW`pe6_W#xZ zdC0D9ht@}pknla<|J=c^o7?M&UygqdmD{94ElhUpb@L$B%TE+N7|Q#5_zsmJGhOX} z6iF}ZfB{0*6tJY_zP!z*XvWCHApYLj5iXa;4#$*1F#B)dtdqjgvt1@yo}Kx<-P5l# z3-DIK*Mkd99SYTo7DD&YQ~$~=dVG&0RbjvVXmP|fV z!RrNI`n8tm6M~K(>1eW&IW3&uZPIkIB`ZaCpuHK!PUkWEF<0IR_eW@M^O8sHz%|Hj zS|<2_PQ&fxd|GOEA_uipbm zC_lXZ06vd@4I8BYWFBv#6aF0*ea?zTd~f-WDLAFAysEn5{9wh!YQX7d<%Js-u0h?V z4cQeN4$5(>_i0Ap&l!PZTxJtsG{qoin}7hCUw*_o&?%d_QcZObPIHTSuVk*OF)=cGR~>b-EbhKm%{8LauOgIiYo5|K!b zxZmkUzPr%y^F zbg%Z@%~`S-ZCa}D@vShzI6!jIHxlok9u|@ibBffv*g^g+Xj>6>6DK*}4Y=r^S<8eJ zC7t%n9aYwJ{xY{C*69q{R(l0jX7qK*FLuQD4|n?@S3(zMu7e7pxP$k8>=$2krLPfg zG=6dqP(U4ibfcs0+C9lNSA+ErYCoiv*@_}|GKWr;V7d+vUMk5Nm?RR({v*T348Mw-;VniYl4}m3#p+NyGYdw}bLyeMWq}zl$5+MVvgqR3}aSkC_NuHFuZM70>MAn1RPSZd15D z9FH|6hsXMySiJuijM(po4kN^$g>^%u;D8z=hVTfc$ieO>p6X+>T>fY%mc{m$2B)A2 z$E@xdEzeJd+u%@nI9pv>-c(Iz?RVwov3#o>hw1%V zW{1cp|Ep`H0VDYME8boi|Kec`qZkEcoKQ9q-8E9(Sd#W>Z0>0`;x*8#T$kf`lG`?e z{Nz15y|2-GcPkVpGviy&v3^Oc23(E-rrtRj2T}Qb?cPDOx8}3@4wI8zEw1E=$I3Lq z5cw&O3Afvv^Ky>=a#o($x{yFASU%zfEhG`-zm^H6*>o`vT1Yg=e@!ikPxBXETG+Hb zuQ~CTuL{;QU0RqJb!>c}#4Gtc`eWs9lnRrPg&Xsg)p%{VVTsr;td$6Yqlc1 zj7ndhxq+S341Le0cUlE$-0ZT24H-Wi;y!nBDPf1awm2zbV;DV}7@Flu_w_&L!s$D- zD7LUUHW(|#UEGNv1{2zuJ*WILffD3^g4NF=gyqF&rT5gQ=K9hgc7=iJ2S5~9TKu1c z9RuEz4&2%(sTP6@yU4YS1FAhTyHK)YLLJ+#!u74-_gFv z>1eF1M@81yyS%c-(tY)(>$*sQNiv`^r5JFDn-&G0H6k#9*Dm~-EW#*T29_oy?3I1eZTXuq#nF;b> zc`qyf(*()7MpZ}OcJB|yNLb-L%m=Wzc~}4Z>~}bcum2wL$Z($d+=G9oe)MUwXSU^M zXZ?ZybNw9t7fF&BOo zAlgnRW&vj_hy*|eZ~;~b#jRw+lwkEE7A)~-U5xdUD{s%9V5leaf+uhO!bSbe93k5# z6h_b!2-kft$q6l;zonKDb{hBTT^b<pkB_bCNUi4Mu+{Wor??tqQm>rxSy%p_xn30fMrGGbP}>jjIBbpG zv1gJXnO^>slBgj{bS~@n;U%ASnOc1(c`OHh1UonTm+NZj7zKR;e&d8tyTEVW!#VI< z@FTw`{I0)gXZVc+e)}PhXgqE*4rsgqT$dCGbQz!>N!J>4nf~Sg?cN7>1GM>i`5%FH z&$lx`yHRBw(5~fi7oc55$y}gy@Vk8!FsO%)`I^26`rH zmUA0Q?$@DT%jJTzCy&w(ErUPV%;}x{h6kOj;LuYHwV6e@F@-lVpEYWUHR^Qui&V`L zgwTcK3Www`Jg+eE{*HpxP3PI~UWxa=%KnHX-v1)|qagAAr}hK7F+&C@0-kl9n5ugy z!vcv!5ZtT9Pkj3p4RC3B*Y%O0xha$xQt|tv^(Rvgp2U(19C(^wOE8;JO&tH%N6PJO z$s`By(q*F?4-~-bb)P@E4*Zk-hhRtKM9{q${1@*Jn~tM}ac%zFtyij#UeqkB44xQe zop^Oi{Km2L0~g5&T3(s@B6w?Jwx^`)Nrt+x8$yH8hte+u*X-Jjm)i|_9SCqZ$#vu> zS0EIHy;KLYcj-eBqj&9N&ukx(+6@p#XZnDtKaDtNK;R2qks(|KK3pZDmdGNJ8H!X5 z*T%Y6aL4MQ@U*93w0;xVgYe|(0v>^$qV;$3f@LDOSvm50Mwq*mSAOzsS|Ha1@m$;o zUed*pe)5PYh*h?%ydpiwkjSf9VR!wb^@$x8NgTt@eVp4;y=$^mkj+U=5@faJAXYC*c^9-N+h(r z_dBeorD*#g-ygppI!)RB=iHYO`%d*AkawB6gjJ$;zTCbPRL(32`p+?DcBPEEE+}>X zd27{)4H9utDcE8i!ME=pXZ(CeiSBG_e#Drc+@NL=49PUi!!M^P%C05rCwhB0q5=Sk~be18s@#a-+5yW za_#e+y!oI)?)k+IA`@UyDz=`&D=<~h#+LH9mk=zNvmzzfeJpelI{^C!{q z>%6^`Ne?FbT<5%Z?cF;CFfjemfDrg>-aAS=IpC&jhl0;Lokvk{U0#}ZQurfaN#n%2 z0tvULCKd6?%mFed?mLN?<4NlO4JJ z|DHI%VgIXm%=Z6O_~ZZ3e;bkX{Zw18O#g#--@oDC%?5&L@arw5Z6HXV_sn@8a#Y0E zGsDISJZdC_NnWDAi&OC?{Y`+`i%wu<@N%96lxV|Z)xD@dVPlr@n2NhR9f{F-v5QoN z%uJ{Wxz%ww80?oVuS8AzSMv^qwl0-#@AC5Co=}IURK2|B&0Qym0AXl>JQjRx5=79f z`6%?5l%E8cqCwpC`v#}Z?%vz&BiPgaq8fqX-Wosw@4!+V5Eju=wC}AV7ez9o^Q1Sq zP=u1CAr--CS3;O2JCkyzw6l0~J1hitn5A-NxF|x{NlG6hSGJ2F1CdHBr2#rUZAJpx zG}zU~vJRn1D`~dUKT^rYV~ASoFPg)kW~2d9#SEOv$biY=!&Vj*bQgOB#98zvV_05l z+;o2&b{-@HC4jw+`+;|a#{`K5trX!^VE_^0&CoraMaU#gk` zN(V)z5({KLp3!=x#&C0@k=QiDgSA@gvc+<>tq5*|iMQ2b{v0=&907mJ0^Qbb%dBj) zX`OvTi3}hXgMz^YT~?13cjIe%loH;Vg(Rxh@vW$LGmi`>Bwo%2r=aa<3+sK`;_Q0Rgq8ck(|C_c3NYv178e1+VREO4Fe%zqq@xFO>!K&xr3y*_!< zaJa;$=pgl8a-EVJj2mkG+}1U6WmWJSkje_zo;z{$O~Yru-@cHdwzTP+3>mn*T-LE| zY*DZH^)`h9n?gcU_^p!@R&O6vyO&p*U}4(jH^hoDp32~32N}cCwxG0K^M!mQ%7e2Q zq&+v62d8JAVJ3_1xd@>#x%OtqtCV)2y~#%&G+RQlH7}KHGVnu`sL^$tgW_Q{|bJmvf``a3+Nzm0$Rb41Zc(QT3C!fz~? zFG_JJ{}LsWQ%BTz9YwUN>!WuwKo)08ryMkjKe5r^89fOZ-Y^{{QfGOv>GSYI%!Tdj z4Bm2YxGVgsQ{pW8^j2um0oWu^wwY3@omfH~W$kj*Sye~E9)djyp!&y&$L7Nkiqb!TuvB+v4i(BZL$c!k%C*g8=rIoaBG!jg*ZMJ?E!h!6e^_Q~_ z)^2C8-o1y1uWL)=)eAq-89W&l-posqIe}UE@A-`N3daLPtqw*9w&x%dOw?}E zjyhIg;ga)m;;4b5!HlcIbM-j*sN{b8f_u7fjtjyR8itkW8~kx*_Ys?6u24cHJBmn^ zXOT0_`hk|^mA_h}U}Y&Cl26+@!H2gQ>0xVikT&5Af>Ha7pIk@#@XtCTbRbRcFG|G7 z?m5O*jd4YW8Pu%+HYhnyZLd0ch)|EavYUmwEk+5#|cw8A%}UB2BRd~ z4{cD_Yy9rVYdx2ft;9WyXqhlo``MpRD3#Ir6uBoR3>Ia%Wq4j}6l4qxOkBKCXy36D zzE2>h$x2i%!FO;k;;%!EiKA~BKKn1&HKceN3Z2*AS=R1IYqumXR=iWYrvLONj0xM@ zZ>RQ3vh8hJrAGWoG+`NNcy=Plq@mBt= z1-KmfPN+47LP57m7xc9h9SB1xz+@*zTlnB9yyybz+Iw&OjdI0dI0t(Ts} z$r*!H>gHWaiHVNZ%a77or>xk#U5mk8N9#}EJuds+*y%_V-n=Ft>$n;Agbs&j7?LOQE> z+hVU|s25r85eL34`t*f`Gmm8cj-Td4HBks7dF<-q=51?w$^5|`ZcYaBjgSM%v5qGv z{?aS@^u)p;UlnY^ddPmk^%p9+x zX8p-T!si&eR1rZ;GG4--Wqy9+5g<>hZmVCnv;xnLmre3TWolGxX=N}sQxnHq0 zs6E1VUuE!5w=aW7uh7M}Aezq2lY}Cr&TB>v-{BHNx zJicn)jr9y1mPpF!ieOH$5m$CY(|!z+Aey5a`>X><^{tW`D9IQ2+M!lMyzA zoUW(1uGOzEVew~90!51u9}5);UjGhpV&U2p)cmyc69=l)7X6)IYd_4g6Mbug17@mBoQ;J+C`dNlk| zdnL8Pxz%fK`BwgqMs%HaINC6SxwQ}CpA@RqXwzUu7w#{07H_QzrewzWYB{wo967ukW+bHamuMS=qqW`7g*QpBd5dH%rXu6a5xOdG$It3CgZa%oC9ikGfB`yP35Je}@ML zOb5e4NPQs^1QD+aUd=7kH|U(E0DXpLwEnZh!a*_g+7fZzsZVh?-$wjMTB__Cxx6dB zF}TWzw>Yc=Cybth3IQ6QIyJSUxGN10(V6a>+F@{@RpH&~@2FAZBZ9H614}EC`iz_I z28-vzUGzo!N4yH{4}3BD4ugT^p}@PC5P9gSytxstY0qXI_|>y;DLT^3dXUCUphHt- zu&7rmI-~593PDm8Jo9em@EVQU3eC7Vn>-!Y~c;JGcc)H}u;1ni}3KggkkVl|n)gV_qIia$LN9_&ur>20vVUK7LjR?CWt8>N7aR zcB-C1RqCO7SsCn;{)~8#)`$JR#ne!AAvFVh{Sz7-eEot;y2s|n16J08a{c5`n`c#U zk3AH%k7w+=$Wyj{_@ZR^QCi+*{r0#fTtDKzumOyF?Xi9izwxh;aKZ$qD1O2IM1}O> z!th|i_U;|bC7}r(r-Hwzl=e_V0PMyJ9{qc(^0AD$6^|R%WL)dM!RU^7)6+y~pMb7Vf&7z{n(qrz#yYhn>c>sB=X~!#Uh%$6M zMTu=ZY9q9Pst0;euFgaoluFN=Q|L__?p2RS_bGn8cpDlvq#*MJ+RN)_r5>bID!xTj z2MYJOS36ZPo6FkH7qeCojI?!ich)YK(+SCy4>ct2gzlM6=0b-7AV639YKmkA#C`VQ^*inEm|ZBEPA6_CW-V5Kv7^1o0=|_!W(tnkjXlE9KmW9eQ=^o6P@Co6uRMxw}-?KUMb$tdEa>yu!f#6~>C8 zNV;_Lr0q}Q=M;G*(n#s)Z-+R7^`gMCad!08-qBGd}L2o|KI zjWsF{z8TU&DPt;w6$jcnps8!xUqiF?I?ee~oJgeJXPut<-e&hj_gfrT{4? zm7keb!!z{K{-(NWd|$)hx`HvB6~U8%>!7)Im}`8PYy6u#H$E=YczSATb$gSw)uFZ) zZRg)m|ElGwSSEL;JrfC%lx;~%srG1|);dP` z>mqhlxuwg4_+r`?Q?MtOR$ zKmQPxqy1G^FVz1RcR{_RXpL`3)u6#?Mc%<>jZM6jKk}@Tx1I(Ryb6bvdI_Ue(;R^A zoi|n1t_RiH8}iy?gUZ)U_3606&`3HJm{S>FQ!kC6WHwvW66q=b6q8R~w8;`J*0tru zPAIkmGYc;SE-$juHET6~5O*~Wq2Y<6>)K}j31$GL6Rl-D9kb)T)ml%z8*OTllrp8T zWx--ig#Toj;~r+7+#aI!+JQg;J6zMuXN>s6LVZtc(F(7Z7eUg8Y^@MDXuI%8N~@0| z{f!J^AWShprcSjuU=wzr%EY2h4II_6My6uH)vab~Y#PSr#Pgw4=C;oK_SEH zIL12q;>hgzZosOVp5iaOe+HzykH7G=3mIA_`|tb*P_U{Wh9W^CXg@#eiFj4UEaoSk zpl(=7JYjm1X~?(u6ME{OJG>==0L*7SrI^@+a&P2Hxh9_Z28*wp3I(_TqaT<4nShRH z&I{(Ur=)2ghDIEHdSs9IZSTi*1@1Owyrpa4SqaPzRdZydO(x1Ej zUVpu3f6|}3Bw9;q(R0^qN!~;}`JvPvSJ1P|uvotJS{ubwSvdRMjLENWXz(Q^rl5X5 zku#EYYx80!x?v=2{fUs8nSW_>sDD3G;eUhM}Ny{%V<@!X&%SB zH{lBCL{z=pL%@KR30D|EiBuw_0HSSE#27`JE>L0HZT5ODr*L}-@6_hT*X*z1*I>gg zF6V}0Z<`g4-LlYUK-iPt^ccT`=X|xqH4!Zyga3$Bn;OJ9a~M2-e@J5tzP*LBuctg> zj0PfzPQHB|W!aNSiS00tYWtIcSH@nDIp5H)aSiSsk!7#(*Dq;HnWF6x9(4qvXxl2V zw3N2#52Ws-45@pP-~QO?h#(n)C(g^Si1=eCc^8$)efF&J@M#dgbRp3yieKj*khY2# z1qIxnnO7AIBsG)RqmS*50FgHC&F4>}#1i5-Jsh94HgGDdj{7jt0f)gh4ie#vJg{pS${-#tX@ui=PbGMr}>!OPHkgGu{^ zyk$KtUamV>4*ptGT+%t_X60{pz7ediz^e}A_Y zYrH<@hWKshV0XeuaiYm@9s*>_n$R&-1V_AL#kGIdu;^N)Np>E!@XPqtX3GwDJ_nIj zjdH8QFUb#vfh1*1VBwl8f{U*)jz9&Lsz6;cTDRhiebTdpdU!ur3f+HnmzA>!8>xBr zpFjqzLwHb>7R38`O+s~2^=Z9kO%KkUY|!+)U!!(Nm2Gquvg9ND68fW`Yu9U>ZoAiY(n{w2APN%&5RpYvY;{1os#oS)N_1aP;18?a4^`q41*a&E5b$j@||B z2VBYk4ZeD2Z_qwS7XU2DXoJmK5`oy5|%ly0Ohf5iRa zYnM5udcSjR)>ewP4eytf2b+JO<-_LuvyFxjVFNEg#)9Ij zd!tBeO+#d?m-ZKdB+ipw=~8c`S|GDbaO1-nM5@>NONKnNWK`*!*T3x5yy>xGuNH3@ zwTY}GXO8g-m%t(kVQ&~-5&Y}F!iup;R_OxDwOl{8C;ctnJZih@%8KhM60bQ^F+OCX zs|n=Z0t9;~VKtYA-yEkQteIWkp3jJSX6?0kW41e@P;0IkkZF`!gHDiJ0tU#nv4B8&@VC#e-*+~)29qekXtm8qS)vSvxskcI&>^Q$UQmXe?P z-p4R!;?V&e9l$0#zx&It449ynfJ8;%hL@gJ9 zg(>V6dQP4Jp)??IbVTbf;a6(PVo{#5gg<2oE>9*K8s#AxzShGlUF;_&!#?_})FbpK zLH^wDXX($eDpr>eBegA*SCxDh=#N}p9b7jvTM&I&-h|Qd#OyX}^3^@^@m7X%wGI13AYcZ zwN+Q}9l+oRl2`n?sOQ|0ywu(5*Cku@8m9A1(xOy@08qTGn|~h5{BdAh?9Ds$cjA7U zkiO^b&!Z@RA{73R`j$D#Z@tz_EB=%kBHzM>5Lz+3sv_ZAzYe@Pq5A;Tl+C4Xtq6VB zQ^Ew_kQykA;)dm(6wbwz+66L`a_W^HHH9lu!Rx-*5 zC_`&aZ)+f>Y(+>=B6#;F20^$WKxEfj%7Y0@?437dae4;DbpJ&!KpNl|H2q6t5aN~y zd{+?U30o@+YnI-HAWUE1r7tOxjH(TUs)?wMgka{Cn2|UN=YN~R(l7PRDa5$Kr4CxJ&}u|7 zh@bymhse6s5r0leO+*BZ=S=NLw*c$(OKkHHbysQ~LiU(o%?`>t?#)2i}Wj(}<2 zGqWBESyHcYz|-26iBxH`G;c-xVrSasF$OJF25&T7BAajLfyBADPtVIUK13LB81X^< z#@nK_Vuglkuud5PZsY|wHap>W8;;kYSNMr9Ssg;~_T^5e@diaw@p>4_WG!xk^;1P} zwx#Oc?4B=LRZ;@!7i-l~YG$BWymDHHOCG@^R(jqPXh z(lWm~!Ts_OW~XSvD2Ym@!x?0h4sbJSa59^fdjS1V%tagap`g@$$M)o>Y%B-mG`wfn z@O$)!m#X`s=A^{wuN8gka^(<5C(94lb*gkNy~FH|(#aK3yHJDjO4qt2 zxyoTjaDkYy?O(>O6~IkN){y!1iyvyW*5}3Wi(T)Ph+R5Mtxs9+oj-y`Ee|qmm!+#C zwOA`t9NPY^p5Ph(9ifyh0a-Y@^*Q*~^dCK|Fgl;GR~+%?VRRygX-nw}p(MB7G&8&H zwrClfBn#1ol5ph5T;`Bf+B3{g(jCkpPp3_L^=Yz!n(t)ZMC;kXRvW_2w_UMYH&Y%mo8-x3%;V#+`Zrk7zwrjW_TD!Jm zkFU3#9*PxXsMg-hKQ96eYiJv2m3~S+T(_F>mu>`vh&+N~iI${hZOFTNHA|tkBcCUs zrlg7x=YRJdhf6al3oo*M_Mb8m5&06=aHCy;67XnZl50I@>H@d~Gu!!1DlnmAJH8pK+Xo@ILf;SekRO{e zLp(SfVi_|kTz;O3eL=-%j{^&z=mlvAJS%mm->lG*0=}4*>y2y%&oxn91a&d=D=+ z@0{UK0&hyIcYefnb*OuFw86k|*F>kwBgi(()Z{jMX3IQtskTh*&CKl~R&=(PzQ}c4 zxRM_JpdKoQCs#+bIW7^!DY9)2z0n$kfIh)`s6Azu)-Q6cAEwr4{{qN(6Q}#W^&KKv z3spr(SDni;<;9N7rBdhzvpc?)b4coMO6p2s_gc;1h*!BLZ#s8{BrJ9->?F~);gz*NhVO7xbhrX063x}Xf_@)(?cx^%00I-sVv;xlLX zhfu#+=uH}mh_?rG4fUHQ&Uc@`8U3cS7f*xn=y{xoPb=$0KXu{>Ae>_WT{>xe?Y+jA zA22onW7H;e$uc59dpS`q$@0;)Q~k!5c;_!lPS*W6B;?Lu+wYBAHyi2*DO4LDqaovW z23H0Hrdw@k5yKGUeOME9-X|Mk{F95_8`O?F+e6JCvd}oAOC-;p>Q5v*3Lej$WIMjp zJeasHH2xGESPFdapmJ%df{6RT5tDrPet4;p!dOvq-FDwQx(tKg1{fLqDAs)${#I}y ziwYCU`rVPr@3)x`Oc$&K>7>vw%;*7c#*}QH(d{pxF(#S-5q8zAzA>Y3CYX8Sw-N3c zz1X>vc@!ImlDJKOH(_e8)ZNDO0F~cZd7c!Cn{=mf|9+-V!H*;KVtMIljRy`MSeSNX z^=I297MQ2UNvPua82tS-w!NIsH~WoOpy-X3qWQpW^HCZ$FP5pJ96$dFv+LIRYUNP- zDmL<7BeHnnyjU6wZBT(yDOCnH7i3pH{v!HZ^tc4i+1@*LET>!iOq<0wsE{6FZQ`}E zK3Kob>JZSD6OlMg#D8V3M{7u?KVBakwLWas`L#42uWz`3{QA^x>4Rxk2LH8Pb1rHh z%kVS)76$*@dcc2Phx7~%g`7sEmI^JUTBQtYp+S_caGLk>AogYmT?yIdf{X)2^7+TK zaxzdSpX5<1*2Z?cL_W7w`n8M;9BL@pdM+zBrA_y!F6!%6uFh5tU*iIfyY7{1D-ZhG zEYK0&0+wmnPG(gknDviU;&7XM|4&-E)oR!q0{+^{{p^(Pl@kh>nxQ=SLA7lpuWkh| ztAjD2+70PSATaEu9d<1r7hy7U1K9xqS|zTgw8LDhib|JhI_qt+p&>r`4qXEuZM^Cr z=>&A>ohV){{?7=cg!}B2btCw0D8A!HXCE-pucynP=C9$x+Tfy}h8RnY-u8_3BHDDk zt&N01)@Hr?)2cs)LX3OPaao*E@u)vLo^)p{#3 zy{2j0Ju7K5HU3TTO>U!_?@!mX%(wT)d*sx0x*IWdT~E0p$dkjIjOjL_HB=s)w9W8R z{ry&aJ(Q_*Db9@L!Sg0>qIKhfN3@}ikAAWM^iGvNv|1qh}k z!$ys;ml-i@BNrgnCRNs~zbjK^=0PeIAG+{|xc`ax#qz@HH7OhyAcr5uJM*HDW*Rux z!%UV3cRSjVs@qZ>T*MhFtawUHlRtih{LN52Q0iJMWerAYFbwbdR7~Y`fAQMx4&~iJ zhunS@xmxMbuo0<^CPohihcv8LGo>~KZ`^LZ8c)2k`}M$ZFi<&X6?@3=YY*2`*o?NZ zO$Hy((c=yOk<;RM%y>45RX*Ri+8sI~;%p8~j zh7G^;e&X@EK$7%q)4MLD=^1FZd$3uMftW zYOc^vmfF50k5=E{>JuH&fIULm$dtvuI5^QY2~qAMlMW8V(WXcE4juVAnqV3U@Q!h@ z`dxFTmj~|+V<9q3h3>d&OBrF}W=DQ`aC@aYf0oMFAf9k+VN zpr~o>lDF#GZzpR(9_i#&=V-TV@snH6*26L!c)du|wvs|3s){oqAb>Z5L9q$e2Vdd_ zZ;*<8+e_a2BlG&1@kdl5UGZh%%~aO8zORi%N?9EY<-x<<17+LIy(WEwLm(waJCe&CSruHJZ)49;#S+6>sNxnYJ=uL_F^{$nAXOXK6`TTnqMHzMwR?^o zJ$ZO^{t!lDy#kXD|J98-?_{3Aod2?CsOH?VWL-T@Zset~X>tysP824LY$AB1-6u`G zLk}1y>Su3NyWvz%t8g1;+uZ%ySA3SqbIkHT$`75TW%ViCEXxw9g7#nVs;B*^C%;L~ zsseBRr9aoYh`*U%#iNK*VByHhbxsmyG~&;{z7#TB7wAIDs64@p3n`oII#^{8{K~M~ z2x@ikw@#aSWpJ4@2m}Y8piAN)sG^rSX0Zo9=J-X0b(vU#kTkM5H@>qs8S~+NWV97_>ebE>rvW@2L1Zss^#*JjNPT}Hy|JJ|#YTh&bH?UM}$zumq3#Qpiw{aFuDLM50V zpUe<-?r&!+m5k66n`_^ap?VSzP%>CgZF(A@r%ie)($jkW5zmklO6F9BlDU<&^HT{} zJ{L-6%5iosghCEQa^`FJa;{DJ5`~yb-trUe@8!-@CV2zD=)f_ItpJ;IR{p`kYe!@c z147(Jn-t?hxR!k6Ogb;)T4H=i0g!lvChSjoCTCWTa=pM=3eTWSlZP2}Mb4gB)dFz9(Ex-IhF(dX!+#8KdXe$@0C(TP%Vze&v@Y#ub2} z1;NF2*l~}Wpl9j>i7i}C83*k39YtQzk zEKf~gtB0~$Yidff_96TjK~(S89;<8B`T9BDkQ@Vs((SWhKEp@llFKfgI{E4AT?ILfZo4s zi|>85K@V-|{dPLvN;@YCL6XgKODRviaegrDO&JZrIQiXm+DFliEgJu?F#ou3M1 zJ;#^fPaOP-hnWdJ9-cqRo2JXOWlr0r{@en8?1jkq{@4;RjOJu`s`H^M2G|)V!}ypq z?&Jmjf{RBxJ^YL+uGD zT^Br-61{0#>`fe#+To4CiG-!S^--aCq&oGfSK8*R^5aHNE1CT+U!`U|0~J5elsFI@ z=FcfC-c0?WU{+Pv$R#T9>&M+5q2~lWQ+YW4*K@A$Cd!qMYY~X+k8QIo2`-*Ev*L2$ zr$LxFq4s<<35ez=I|X1>u=n3GUrtr#u+6biL`OGg+>HN-w2l^h=*(=FQa zR(PB`g!3kfg*r*xXpVn}HyM8EzHMVMek$g4S8-MFS$n3>wbT(i%KQtsn9WGb{^7oL z#g-vOJmgIt0{%Y$1iI#oAdtb1PwaEr%lda@@WJU%73?s1D;RJLf%%wCF(FayHqcLj zmUm8xJZZ^&fx37j8mesyqx^Y*YkUB`Gh zPg&4wAPTl6p=sX(`kV_E)UdNUxc)7D;yR5tQS{*~hjl0nvsj0x?Zh0v*7Q;S;*F=8 z=j!5_L!oYo|5}l`7<6$o$T+A5E(UVf3GI`j@WsD{{{dV30fv*_G5$) zF}h9DMS_}Bx=s#!$F1n*jSFF)f$uz6@7By4VF{K0D?Fn$uLAyrA~n*6l1+xaB`FLUa0iWwbs3Ac zlt^c9X3hs6bR`btLT=+Ng>c)^FpRoP<<0Nuek}F4h0~+jGgH5!cx0#I6(h7_p}@5> zf2aT(+4)y>&)=`WZ- zPg~dHcB6mKu@AU_<llE=|yT-TS<&#eNA|$rqaSCw8n% zhq?Q6!S8sTZ|3^xA8hZMm|Rmh+RDz}Dr&y+xq7S%R!BA(VxccstA_ZmWkIw4@L!94 z*ORwkDgU~X-hzj6o|ol3Kc4fvJm*DexB_!1_ z{BY`HEDo{cIxS~a@Ct4mEUgq+Ey-qT=)abvfFv}X@elribk8iD83`Lm3gY0wk<_mY zE_vJPBLSrbEKIKF(~vI<^PB96&52ooPS!bfpenEgbVqS__bepA8G?|#U+nBL#MdtL z7VM{_80PlBU{4;!M78EBz9k%2mj`z=8gX?VtmBw6{3YxAX7 z>*zXV=C`VXnWmzHV?sInYeo7Zd|vRO)6c_ZBu+g(K4Rgd{KRM9itUy7?D+T*iP~P@ zihrYAwTUM}?X=?OD<8!vmBDSyRWm9e8qI)<~8zyQpPcu?=z3s3RcZy7Sl+ds8B zF=o$i#rk5zIjif|k4LR`QORkyzRil-+N`(vQ9+)y)GlSQMZ&|7d;zEwfmp z9+2Kszohg})ieo=iB!!J{aqY7IV{81qltFWc1m>A1qgj!&s`Q>Y5+gR4`Ju&{!pQg zHMGKZ^wCgch_k8qcdPxNipY9SARTG~X{WdR(OcOyD;MGGqpDb*jbo7oTGS;}-E>vq z_7JWA4YGG?)fkPmMcIN|%=7Cq++nnV7U*kyEt-MdZ6nY8j~SQsA?l+(bneoJC=#wv zx+-UT%Zsm7eGjXLdoI~YGu<{g}E zWtLJ#pAWasOY)-iLwFK|C~~wFahot&zk^YvYT6{&p}xT;>^-9%2(ba_XgGjshJQ@0|UYpE)v`xm=yjhv0w5oqFBRV`*mUXtK5E_ z8vYt#za(;~WFCJl)J21oUH<&!Nvs@@bgpe=hn#&X7q_@(kFI1XC4%n^Bmw91zxowo z)w@K!)y)jb|L^eSr~(SF!>1<;`8VIqb?aHDUk=>Q+oOT?|6}jX41tTX6 zt)MAG#R`f_9GTQexC}xdA(A){wANBgX=~wL4Qlj;o15ftJU|sJT2Y*F#sLV*kN_pY z5s_*Xhp4pO*PCio3}L+Q_q+BvCpVz|JUVAl? z7UH4-!^@WO>WTS24&jddqSxkV+(S|s9=!`cRGoZHVnm3rk6!Ca=x~s2f#r2;CF@y% z{hV|v*j@eQltb>d$Fc4#{({i*O75h1Yt*A&(bX(^y;ro0Dn!xPMJ#h0%GCR7(HsbG zwMJkqv(H-t(M{|mS0W4eWJ8KLD1sbV`Bt~`hzutRq$JeedNS%io%NqWm~7@(Zu69vRus()8tk!N`DA42;5Sl@Oa<9NIRgeY75Zh-S z;UG}x#Wg-MOQOF3OswlpHm*rdU{i$c8C*@Q`+Xfgo5fH_wbw8WFDlJS@*UN6o+g1Uf=NnW#goFu3z(B3SMb*UTBEVND=Iqf)=jf!C)I)weS zRuJLVdh$Q3vR&F^K(}OOVg14u(Jj46@Vx~NftYTlWT)et5%~f*jSa;%3s(l9Kq>%= zoruSN@_4obA6Oi!Oj5H>Iuw_&;IU3XyB6*rR0|^c8t@ONQ6^XJ0!n3~^Xd8zIOANj zULj9zZ^y}#O9;c|$)%$+{UO9 z2Wb9S{Dd$rVfz+W#lY3>PlV;$=-=>_^!g6A5{wTX{H1dm78(y0nVliLz4~c<2Nppo zP>^jT6Qy$0$G37GA-Ue%y6^;C29?<^UxyBi40Ove*5Y;W`&jCB!mdccZ2!(&cP{V< z?ugIqoaEq!=sHMMn^1W?`X6*VYsbQ>1^}3}0|DzAswIsT6t_<|a{5ii%0`MVg*mxV zW`<^n6<~;b4^k8jbN~v5=I8^c5F8U^J_yI*i8sdumQ~d~2icN7thHzjJd-SFUlfmf)B_{`OKXu;16sQGX}n4N$ULG&Wwrf=6L2dFDz$egO0kO z!|!v)prgJ9e5#gDR_^X&*W#?!RS1!A4=S)1i6@oGkn^adm;j;eOYzv{) z1xYEv94rxBw(deMi`Rk}73ECA;B8Vwa7W7-`=(pfiu)N>a6Z$;yR_NDl+&9R(WaUmUyM@pQyg_|Kh3;}Bqd_Qsol z)fkvjvn8zw>1mRT&ONFl$7zD~^l5Y)hBi^3ruPr!&CLS<|FYW8AZ!wL9I5z45DZqFG^&PF0{4+dd<4~14a5^A znw@wyBP-=?kH~U)x=a3F?Yt{>eplfa0>5c*Ln2=de~+?!y1jxmP`{p0pazxd&0?ep z@5o}hf$^GaYVgG46HV#HvdF*i0P~*NCZ>n*2TApj4R}R(?ds2;hoEFv;Mt74iT~}; zA8`E6j8r3?=pXCvy~-CH-71wO2TzNyVUhS60R{VvIsejo6c3KOuy#1Pjinj{>?$HY zl)}j@7E@~>?_wiD@+t!t#;!wuC{SnrS$f6(j6^+TZ+nqrsv$m0mK5g>Px%A7`*oMe zb=5`%yU0no4!@?o6wOG)m$&%1W(gkaBMtbUeK+e9^cm*Sg`F#EgBj4ni+|rZV=bNo zX`@F5_nF@hIb`R=FOC~H6It~VilXfzwF7hs@WX9@j=Id*$>7fgMRr7e17sqSUTv22 zZ+pcr_=f$nSNt1|7ZjtfJ~_g|PcYVv7IMGTX@aXDbu18p8q&wb6I4vZtf4i;~9loa}GO%rH< z+KmKk=c)Y~(WWpBjlIYgX4I$(OcEBBc7l8lUTj4;JQCHd;%UHu#`L&ZlD|mppTi-A ziT-)8h3LJ=QZGf>Azhfq#-txz+k!APc{rE{9MBIFI;EG=H5Nc=WWELJ-8b2Pi2Cet zp4#F*>d}2!9y2V>amQ7}BbsS z&G?JQo~!Q?fY{|(P@v%GAe~w|rZ~=427Y481FxlvvL5yWvllMq-7YiEGvUZu@ z(j`U=c4}2CThwY=xBMKT54u3n5ssJQ2D(5k^%;o4dU4n7pq3yUl&Qoje;rRGm|8PP z$0Y16y-S}&MJ2k%l`@dEd5%92hyfbxxLDheUXrKIgKr{dJKbM@Cu!V_*?hiH`SPu5=hq?`y4)|9|nu;2^PAY?k-k~CM2wLiEL46f6WTZEv znt}=)FV?TZSb^Ct#eyRO$rPHWHT%;=l`4tp} za3?^-8KCcpJ?;d=wet>6I>DWukiQycD}q4mj8Lg;F|mv1Dj}s;ZD(nCW49=~TtEWk zfLOkRaH{q90(GZO2))g7)1)^^Lsbc97N6OL=Va!z&p(Mjgic{h3)RQ)tk$fetJRsB zfZA9mXUg(sP@V@uR@NlpO1*t7Cs5)(c5jG)`ii61Y&ei;k96ms_V2ign*A;)+JpOX zutS2TjR98qwE38Ya#*GOawLUklg$=4m82CFs7E+V+E=@@K~T|>r~YuEWr*@>PG7f(euFN+U*(mDEtQTl4;DS`#jBB>PtbWY8rX5`>pVG#)Bs569)vv0D5UU6$xUySZ9BqHso)8o{B89Ow{;Jk z5ZPmHso`}+flY9mm=By3fQE`xnWhYvbZ>`7#LhkvZtHf-FJy&kj=$pT2G9yh&M8t& zjV={mQM2w6@{<+>2P-;XXjNA0nGbYwmwYSLWNh6f!zd1BsdrY zZeE4uLdJYjnm6c%Gw9S}^@Z*a_2_xy0O-Xx0em{%DF_)J1QMdPyV<=Zo=m%z+#N33 zEdM?>{3$j_fF}d_%I32Gv~WtOx0lQ1MMY(aW{ZQx!5Be=;5d4BfFhA zAFn{^c5$i$eg$6%^Km?NQd|t_X<(Iaf!@KHhOZ(i)6g!@>;rm5P}8{3EG>;&plo#K zqgNv1Zqv{Dj}-;%DD*Eu!Fw7b7fPrLDCL5Up0 zJwMlhUNS}6fG(i)e~+IXtCzb%V1fW5)A4xx>G{q3*sX^SUay0*tfe*_QV-@PNp^=^ zf@@cO@pH&-RDt7gSAhg`77ZaZDSc~W2%*VR{FmS^(xE*Vxvda0Ip;GqXIYrr+g>sU zQ?+7;U0sb|!~Z(t2z9foE67_yOXXc1g@7b8c{MIuZ|6_YH^E{g6V08g^ zvcj9^Vf-U~AVWbI3a`TxNFb6ynF=CtWB?Mg-$dy=)iyw6XFL2|IquoDnI*5VG;zB&hByq$s>p@Bmj#kdczqBNWkas1?Pxa%BTM zxpO{rh)_CKZGxU3zCzznf<%~~!08L6xAnqW7gPgMjEs{aqzO^>P*$XEvy;=D|V%0c$+WI}U3xs_$Y3-qw~@ z(uv+X^vHVRP7#a1QO{Se9>rA}6tap+I*EjO)vf#}0#*<%2q=bynx$^irR1Cr*Y07Z zh)#bN$}}tg?NT9}iw98TsJizg*rU2i^58qEyjC?ueSVmCcEGpTUA7YE(@>0-`2i#d zK^c8ig`$nI@B_k#h&{#8Pa|4BE@9sT7L@}X*cD`0E!pn3w0;cRP&&kpP}AYQ-3@%< zZ7(N3d@@Hx_ToD>LLfAs6;yU*|Hq(!1r0g06240ZpLu{}w5bG9;7u{{fMhGL#}g-Y z9@;iH!kJVoS_e_v>NL%>QU4$A8)#sYQh56QH5$sq6s#n< zlVv_Z5+(@@VUnu58LkMG$p8}(Eq;{%>THvsn%~bqSN#V#Ug(EU38L1B_n6lqSQ|7Q zKMh?0b0hvFYL(1JMKzLM{{(F5oEN0yD5Czg z5EHqs4nFD)<=aR)!f=kQSxv2GSLZ*k-am9O9(&TEH!OqTA6obecDBUwK;|9-5c<4N zAN01~f0)liGgL3^&9`tK0TG>K$s@f;1Z>!$*+?h#XEdU}slpHB^oFQeWC2W+f5Od! zHIV}locaPmh5Fv?Ts6jrEa#z(4?~;>+RH)%@ql2e$)qY((*xjz8zF1JK^!p3J!B{H z-L~P!pXa$LT0DV-Wf3BF?tAj0azz&8T}cp*=ZTL#*9SJ_d`?xF4TBh+$o;z6#r^uhvH>YJXn&D zGY>f%)fVJ)8ks*iT8L~}t!yW_JQA>Y~2zj%;2vy6!!RS(P@3hE$c+UT^S1B7}q^ zhuEu%g+@dq&m`^w{bb4sZ8bn&(Ec6kEt(J_#4ZZF`3FswazOlD zJW?^x5zMl?(s42Tnbq4WTxzFM@})y zN2RS>2N)II$U4dpeu}zMbgOxfv6KI|>6QIM|F?g6rc!Q5*8r zy-ReCtybA;^%PKo$=m~UbYj*Xf)SYyvJwTY=$G0~@NOP4D!#(BdpTK}TAioPdPU@7 zRH}OZN$P|$(PW1!;NQa)SzV6mt+H*-jZStN?imDL5U>p+v;1CYtBrN=2!T2yv=boW z(0zyft2OU1wbeo3(z=Zv`AR~mYEj0Zr)ek>+1;nvsD~)xjj1t;h1S46Y zdcB{F4^JnI6*fpZ-zGZ5=0Y`j9MK2i4}R~^RxgRBq9wYGY%?Nl0F>vtaS@e0TEND| znZ~+eB{GyA0>SOa1RS&K_Ce`bCNoehNqz5kDhBwG=kbOlLt^|2nIU{qjKul S0g z+*~g&f)UNl^<;alAnmqNPx>vo+7cmdJ<-ZM!TkaBaEN=h{5~`{eKoeo7fn+i zRC~Ds7o#yzaNhl*kS5$FaUZ9f2BWyuO@opBQPLu!-!3ARK)PD}3qdWSs}De-Qnos) zRYF-sW`Jcx)4*Cf(5JWG!%;=oq1&olaRVt?LE@-fh9rfGCW$)(iNn*vGf)*&B<4qq zN>Y-fUi?n?0=9Ug`b!eL-}e-mCYGIg^54o~-8hGL1II1-swbpi41;(q@m5B&4N;%J z#LPs-9bFi@ihGu4Mb9ecJ5(wJ=2RpXy|k#`CuZ1!3|Y1N{XRAe9k||oqDl@cj{G4W zL;{S|dn52tagz~ga%+BZIjE9%5VokS#F~3~{UPh7#DTHLl`yCm_r1I%B7lS)!x=;0 zs%(8&EckJOIs_jfQX8;R`YY+&Yv>$SZfWC_J2WH1SHLlUhImvV6@8Sj)t2@bzb#|Y zXV|mYi*kWKbUPpGz}RnO9oP&;7mv-?XvQK3|8rI^btji;hDKR8(n47`{bE^S-#><%wLT8#)!p-tT8k(fuNvh>xu`AujUE2&O{o;?9Y0V}3_NieW%yDAqm;*s z;I+wcR)+KZBzzm85+Q(eu9VmDzzP{^je#`~K42fl zq1|swYdMGW6{4V9!F{C?zj7VqL0IbAQn)`w3#YSEs2(zAUgId#6894c`pB8wQa}K% zJone$ggXOCnQ*TC7L+G^6`GMEHOIkqSzN> z&*iv@ni6)~X=6PmgT9v*Vd(PIk#X{pK@6aoX^9PoJ%k*H<98W)g+AE1&9E=vvbB8l zij=(F{eG!Db1ip_y;y+An)B4J^e3copY5}Ha(I>xjLg40{XO`P=$B=?gX3Z81UXdr zM>6Amd4>7vHC+`(d%CDi0NOq^t^?Tn%q{>MBA|R*sJ{Vb1PfoGOFJ;{Q}!jgzekVM zz{@<&O9QnM``GhxTK{z|_FrBM2m#Tmy8BuVRTFq))j}jWR0!_g!a-`SOAb!7tNxB_ z10X}@L7Np{%VFVy60Q|AV3SfU?v?QAU^uSE!Z-qnY|F^nfiKJIpirUJA@YROhJZPA zkm9t4kjG#FZw+*IW02GE1&9}W;jLM?n2*gezE;(EA0gZ=@&YtTh#wBrAbbn_!(=Sb z@=jbN?2E4>aJZJCKuv#Ds0LVuX3K%BNJHlI4Zc!7gp6;V`&^8n{bIZa2c@~-i_HDy z)2spHrt(z%w<2(XpxmkdQ{&C)?^J_fpEXAhdr`jHcCkZjkO6<;jBK8!U=nM03sceG zLc0fsezcQevCe>X38Rln9&#$d>LaAFc(fk<_z{4%NfW?+e9Kco=gZOk2!eJc+?6+R z*2Plmj`k;a5Icvfe@~dd)Q3AAu&W;by~C#@tgNt|qo@`*y&la`Be6Kg;S)i4iprZ$ z@Wx)eej!RaUY@aZs=k81w5xvka||%0sT4 zEmF_!Fb)tRSSRYB+!Yvz zJ0OjSNN5PYgh^1fGY-8h=19I81mzlTCFFakFZrIv82M!0qSqZ7z^;(bpW?G4F3f-q z)TtjgN&ZcmBL%~dbJ=>Cp|rY)jw$qT1AsYdRh=>UOA#CzhUfNuOq9lx+$A3D>j zy!slCqfbN95uvn$1^ZGAXBu_Kc%l|+`3t5BjxB%FsLHP=LUyU(%^l2F8AujA%x~Ic zPJuMA8WZ1S(VO74>R`MPu-cV9E64+QnRN?w*WG0?kegtPYKAsujXDG#YEXZ0iw94F zru7Ce#CGpQBVtQ_jhi2yByPZlb{5e?^H)y^s<;RS`z-XsUqBAzqtznSO)F^R+l_YR zz`t;4cIK4~5G3CY#Uk;~l9OKLB!i3wSW1$e>uEk#A3{+kSz>1hRmU!Q?F)bw%j8&A z-UKTN+TmU}8#neM<7*IXwKfKWIO7S{4>q(jPvuEEgE3)iTR*>$kRtQGUs4Z55~f#PCG1v-!HC`Lr){#^-1=d$F&3}%^JR;j~Z&%YF zE8i!suVs3DZN-fMTwlQ>uNf|&a>5yM_mIOYzjRhgFk5Wb$!uenI-dq#Dn&dtJKU+l zWwV1XlJCM`5jr<;0Yu1=;8wy@noCl^Q-U+RR_QASS*zLfN%bu%dZGU2@?Bgu@O>gb z1OLVONt{qrL;>u1>DFss!bwZ)c|za`HoLKi0|Xke!rv5OK1N!8&}P1W;|WtTqVOz5 z+K|A-zP~6J{|7sK+96=b=I1d#btbh*7k{N=^Ab3gEJ-bxn{nPT7@bl#|S$- zp_vu2`uvi?d2XiDx_ZjAAR;)VyYDaV?7Y`6;B$ll!}{dcY9GldK&g3;%0x;qc1~E3P$`b$f;p)o_2n?9C$TeS<%pf9wxuH9@RSFA3bPzlA5l)k`&kjm;Z z!2hC#zepu}@MEI{c|fWCnm9x{EK&n?o3Ty;uea_?}KI0-v%8PZRubpxX!dB8JlZr|I~GT+Ep^uTo$Dp zO{(z>kC;lYlVZ46TU~#qe#;HqXvAm3$^j0FeuLd=!4ux4XBnjT0p11Glit+B@z19A z?Ij8os_Rqq7$4PDs6hgYm@$-E=?#`6eH_m(N6Tb|JnhO$o>=`c$<(SEbA^k#s*y;_ zdTFlGLIP4%EtV7cGLS_uZ7Dqghb$Fv zO3fb?K6E5-A+5|%KAsK89rM+^bD=HKd1p(KH-f5SBq>#mmWhR>3R<5aN`y<(Qi5~n zZI+7wc#ZbNVXpjkCWstwpyT zoUk?EJmO~u^&uQU8qLRqfuJ>(d&}FTLcBF9M&dOj22{`+9fn41H|z5H?ObWfPfOFjc3GwP9^-n-zZjHiZDC(%==_MV)l#YLR4R{flF~E}BEiKGa4qXlx z9qjpg^5I@Q5RiUXLQasw=3@yG-h3RwX5T5AhoWGBc6fF|eWRTEPK99_Q=|{8+pp8< zOy4Hyz}ZZ1E<&YFWvQ&JbJmVg;YYI5l4>v%*iF`j9S<*RGh&T6KjQM=_IQq0TGf~2 zgVu8)3uc5aM3S_QE9PW|IJ*h&=y)>_g?XN4SO581Ff>eo+@^fY?#G7dMG~_cx6>jI z*k;Mm0(^P($YGJNIPY&}NiY$3k%Fm);_Y8>v4RiXh3rm_pw>vCv^@3fow5L8QsE0P zr$nt@OH^P<_DabP1>jzYcA_q8!dAT&yB%RBEJ^|Fod?Jmu$@#YO*g={4jd*Jc-yRw zp3M?S?p5DQGQ;$=MOgC3I`&kuaFc0 zAn{bA;@mBGP#-1!3dpg;kA3TKl+lAW`S3=i*p5g7o)*x`){pWz;rr2LchXYR`E z@EZxAVeL**+nvu}Nadd=e1=Sxq@Hv>Z zxzl&vXEjy61P0pS9tm$p;H|N?CH!_uZ2BhBOsvojFS@n8SRY;Neam?a+*3Ckw?ESQ1@O9Qlik4yU5=y-4lkJ1w!+ugLx^df zd=IvyhmL-HlkYnW3QHI2m2<9Xaw>fIa~#Ujn=QoR11MKPjKT)=XH1`VI3+2Tm9SsK z%dA$_I##lrj3*Gkk3)*zH2fr~SI=Rv1;D`aC*IcUG)uC05Eb_q%Cyxd9s@>&8Fn1V@8wVZk?co%dKF>IPdva5z!#~;C}hi#)D8- z#|+3&C*WR|tUV|AYpA)#J~;#sL}{Hc-(3F}9wxz(Ri0I#onPqhQa;3a;Or|O=seJH zRNmKlXd;ix!noq4j*#1jDHL#G;5Ok=Lgi0DmL9O*gtrZ54BX5AgYKHcuvOJDaP!|6 znN*fq$>Q+yW8wSDv;_D}=Rx2rcOC@3`Od@tF?>&RXJ;=Yt=Auipp37~h`j#dsv zQqwzJBlGECG*K&?FyrT#!MzoGYLdZ+)+d9r8vX`&6;P$YdnAA@JNd8XSy%Um|oCyGV6MCTqBe zG{|=N9?1qGjrRyJ?i3;z*rAtN9G}VO-V+*V=ZwHt4YgMt;}MoO)5Sm#AY1bAsTUFf zOW?WeZ*gv0_3mC>Nj%ky0>I6k7ysL01_JG=)NB%im#_vsXOLb5tuy$jlSwjW)AoLRMWiR)oa zOf%&Y5OW!Eps_=6t=z}#W#aS5+w;Cc**-+jfy0; zk#IjGbD%VPk~|c-u*-SOnlu14%ezmu=}0}L7llWq1gCWP$d!g@QmbloCPW~@BZ3Pr zox3VZVGZ)DoG8QmNeYjGL)>C!{}3HUZGo4t@vJ@HSU2fP+#mwn0HY#A4S{54;tFz#nN!jjamj8k1 zgIJ@`3x3F2%KDfY4`aWjxF!YeJHVu5>30`{^#~5%8$t^+DA;o>Cy8r)RPj%9o*DmrrV2GAWcV_ zm&sM{XFj}iXqy&)JT1{bR0`vX*vF5MbiIG2ei999y?>Q{BBMl>)%u4W!xQ-?ezxhK zTK)5;{%O!ZJM~Y915od;;Ez?lKZkR@$#JLu22bR7jhGj3*22}i>wku9-#?DfX_xtakxk_x9Ev3TY~G~a`p(Y zcJ0;lC4&CJvmN@noY#Q{%Lvqk`(*1Aa1Hi9-^$zX0>3_{mq(82w8hUZ@loa$}B(Hi^Iw!I58PG^&H`pacj?ZX@zBydKzCKZqB^0!jdH>8L45U3&>p zgz8g_1yHyk;+av6jT8Wf)mORm_`V%3yZD*@#;!iL#C@5BmjvVP9~{PNBIYncYk9;G zKHupW##6Q*ecn14kM2Mwy?LM z=T33i3hodiK6jt*P$jf^uLv;u4%^8?o%h9>?rWL(BKPG41Xj?QH}HLb_x&)-pUDl& zbZFP%YrVlLu0gims3HS1L?T&D>nj0=j0dobIHUjEs zuG)=a#SG0-?`6Eni)W-JWB(!0C!KYELZbw;4%7i#&#%26HJ2%?<&zFzgKk+EF6j~0^mXv ztB(v~+xS->8Rn&id#UriRJNBI?WHDosj*%v&r41AQdfGZE4&6QZMy@m!eHhmchtiFE!Llv6uQQd(M=- zk$AV)u-y6qc=7$?;f+i13WG^H#16!$pqEB?<4(RcDjM)$N0=qNakqZ8o8PfJfO4|e zZfy=h=s2?7_rTjNF%6NjH?kEukBh?e8zLBX>y)@LY9@&Hd6FnNqlp(_}2b z-47YuA)oo@Sm8L>xMihY3f69uE17bFRTvqG9M*So>FFryB1u;h{wu3NpdkXO{2}Lw zJyIwAM{Dc_9cto9EDI!&r{<}zDg-XeS#3P=pDU7HtG@at*D4Z;=<~~)tC5h!N?*|= zUp%SY5yzJ@wYvs8;Ziw}qu~$9nj)j|1`veN z$f_;hR*gJVemzJAV}1f1npS>Yu~n$LhHH+S%US>be|#Q`&)fDMhtDaW6Q4GOa*fZl zEyv@tUEVEkCIQIkUj@SxjZ5WW=!;GN10qkE4fXz7EV)QN6ck#bj15DIZRW7V=tNc8>WX!`cKa=eZHgvk{-=;Xx0;WFV}Ks)jHEB zdM2oHb+YMy#d%@pZnLLvC`rQkj@5C|14!0UtN$-h{X9YN4o4eauHW?5lZy8dDvCE&P5839a zewvp+)i)RK<8pWv`xD!bQ$Y**NJ|7IFcYD84j~lJi#}Aig6bZCgWHC`e`?&N(N)rV_SOn>dd^v)HCz__tPd)c7_Wk$vA(7GW9&%kY};|7Eqz|YIwT8*_V z8hkHW&axfs5#a-O7!|h&j5GB)o{j^Y4r$&S;4vs}`D-1>YNZ##9;FxG-s!e?d@p>* z_F_NmV&qR6{>y(1{(;BCUx!l1z+bj4Nzi3P9>Yf~cLUBdMeai~8wiQ}S4VGP8Bf1l zuP-DPfU}PQ*v7pZSZ^V6jawjHkr9X1uX-Y@_E#qZ#bv8;zT+Bn9dYLIDUv724NNld z6E5ux4L`?-Ttx^d0OU4U({XiclDZq(N*9ynGnnPk?=j(>6%6p$xp$f0;ly~JDovbJ zZzGdCB(fF9th)u3yH!;`hYWzlD!$9PZWuEICU>Fl=RXsXfnAt~Z1{p{i!+cb^HjmF z;2`_kA8Y3o4M;W?N3WH6Pi|;pJ<4{F7{#TCU3W? z&ibw8Um1M{Z=L?aD*>tp^tXzzyIf`?GDv^HK38Ivu~(2yS( zd<|DE-n!TSQ(1>2wOHr$c~TK~xsdU5lKa`H_!@oSH}K~O_&mhQmk|XTqe#56NGFQm+QR?qDso4&$+L_pk!$H!T+U0uc%Ky5h-@|ihyo5L~lkCvrn6Z&>Z-j2<+~}xDtKfuGtZVBshh`#*bmBfD!JEYeb;o z>^+2|UC!*~$pSbM;pNR^G=ShL>1bK{MX?9!IH+@OLMjjZSMqo~eHozgGRlg-6!Fv2 zoSv4>7ZO>j-sr50ajiEaI7miC^o;$*OJL&T4S+R}7M7}ic4990M}4fbn{{vmJcF#H zB*nBT%j657zikCNKwKE;OR+H)1}Dz&=O&&pefY-|nC zV_qjH3~8x4kRlMqP8I|T*elgGDVpIN{2-pRTfe$SDgpZ{y+wj52FBy8a%{|c5IoTV zJLxMjvhzNaslkyg&6P^GscS!wci;`4KL!fd`(;msISkoA3n`Hwu$7Fyi>*G6Z?2~_ zV{SFZei&{$g#RI*%?Kab2O%)X!$g+Ep0-0Xn^Kbs^GZ^cxz^pF;~cY!z0WqmGB>Ce zpYAAKU)@r9D8)io=t4L(@EC%@l|8^7^JMIto3&6P@r<(Q!a&Jg_MHGtlN@X-dyL49 zfHJmKlLsEJ=Hn}B$_FWwI6V2m)pt)eKOk>`efr)CgaWf5ptV?)wL`cEs0C$L)*wkC zzXk{Yz@sC$O(n_dkG>b0@0io!&gTeDaN=zQ*V)!r`bKuf!>(4Ub(8jYZ&dfC%cqi~ zJg|27AI`AIkTj}~y8zMe%fv&FjG!Ss3YGPSzH2+)nz?VHF<{xwC87HA)t*v82pf6| z@PqJB6HbHWsTUfBy@lHb2S>03?(-fjhrddvxKi>!9t{UjpK4&I0oG;BMQGFW}8>O*-=P-+^_rMJWaaOcUmdbn#`o5@nlW9^(n{&YIt7* z4CxANp|L;?-|U#|c7HiC!RZrNk?toYbRQ5H6{V!{C4$+QseZFNCCRhrz`vGTw3N{3 zE_dMUS8z_&4)M1%-!`|{V-RE!q37%=$;PG`Cnbju-4XbAc9Ul0v2q(q#!dx z;1fZnSp=DuJoWl!N02FB-ZQ%yo37}R9Nw~1 zmag!@uD6_P2k?R#{8U{r&Yt2%+LCVhd44P@|E74#0|2MhZW4ZJWImehtN4rsj;-4*TBT%+3;@|1s+Gb>7_rYFY$uT zmgjO7!dz|ZdpkyV$0PC?)eOWy=N5U7deXQotL6-`GWd4~E^_?}c0eFuk@=TJ-yw1< zuYDKWbQFMH3)?E(H}T@Z_-1x5`geX`^ap--91vz;FQMDJ2j8sX-MB#ovG_fHMl)6Q zyD&M?q7Gx*45(U}KUhff+7v(|hB4_dy$fio1mH<(9ttr`61ZsaLg&I6qX&#*9&S_% z+&dw#_;&{Hvw*bZtaz+PIR1Gsee)3#UZ>6YAC_3+QN4n^8Wm~>Py`XvwQ0fOR};P3 z@@@+4S=yf$;YD(Ld)EAY0Evvjh6y{k5BGNF=S>5*oboltTvV*Ep_ca0HaIhd2bPj? zIF!>E@nd&7OAOBc>a~=HG&$4h&4;0!4fNB>&%mdVjPA#k|=Epqxp3AAQF&Sf}C}@3O=ZpWXcQB|foC zEE%-{yrDwK9(>xL@+ul%{b1+Kpe*O6(0Y&$D z$O4c%&EmbrSTeZ0{37@~dj95M!@+*x`ZV0V0CPW2YD*Z0<{|~pM)H5GI^1)D6DWNy zF5&pANB{16KH3Rxfk<_=*78>}u%xGQNk2EzYL>leR4hk75K~JJKI+vjs$}_vsts!} z+vEARLiLe6VLQK@$LBH+ikl^uTfHv;M7!0^hqd!%9sKbwPWt?ZPDWKV8>qL(Cy%Hz z7I5(crnsD`g@>3IqUEop5H~8YYL3;KD+%W!%zr2B3SzLhRYXx)#Ej~nlgR{kT4is# zFh?ki7OJsY(3Qp4R}_684Q|E<$P$DDaifa2f%bL;t`~Jn0>60Mh3h-rGr@9!+AUCG zPG*dn;FG=RDHGDmx{f!$9r4cG*Cp0YfqF}8pVTd<2{mb(*9ui=qN3&&>%rle<7kIx=-=*6_y zc$r7PJXKIEz+n1RtV9XYUY=R6#z}+eMQkR1lTQ_13%{@fn1fhu%6#+hkKH_I|BF6f zUG>y#V;%gOb{gw0&%|lo^3RXJ3~#4hHp?87X^n@E+-}T3Mx&xc2fn>K5BI_U64wkv zXci|0?ltu5T>~A31HF=Vo8u=4h624}r>J#LIgTYRQF;7Xb${cy{X@8!@d&XLInhJB zMNBM49M$P9({RfIUU_-pBcZ&MXs-stBUGWwKl~Hr6V6BQK5?#ztGAy3dg}~^ z$L5P05p}3Q{W&fZ1uS)8Bx})wnat9_z0|!(axYbjmB_FrUa5@4?xUlh8-AYI6vgwU zzmv{6l9}ay_IMfWl7|0ddj9q&=<$D*o?rZl@S!T-u~n5b3V5s$dkrVIIEr`q9~ZEzdxY==L_FJ*J= zov86rnU8^WQ}}cmyL}raaFN^pjAXl{eT;u{!gv$km7P6&|HP0x`1a(%L}J?y4PYWy z{Sji@zO5s^wY)#mdT=4M^>*cotG*Is@d z#;@mGbrcbeslPJE54S7lN@6rkyawc~+BA1ldiq1$7$PD)gak&Ex|AE6G01I=r(3t$ z4?Vr50eo}1T+zz6m!WoNXvS?xPC^+RLXl3n>rldZTG-^%?U|WNxOEzS3bv)(o1fM? zE;}Qbfp<9ic~I42X9O_%wvNwC3BK6CJ*l9v>;WJY99E4t>0b&5iR*#8pP^5JBUoTJY!^4jdOPu+nrGE#BV^>P z^6N5vM-hS%LRx|P!8L>jKDEbDnufj{cY>o0dmI)MJie?uX^&%&0Guy&AHg&6xXgWo zQzsrP^C)!g8EmI%i(gVp*!_T;MMK!eV4zXMhVq$9M9%{cU7j++xj@zXF>;oyR?xf4E6_~AX;s0D}2 z_rf4x2OHY$1HfbrnwGHPK>&Wft};znrzi;x(;- zb1WaXErA}R=Jz(gJ0-tQ*}t9j!0mXjfiM^mD7}H#x3gzex2we?4Eg;UFqB9s%EuP$~R^IdWc!mkr?kpn17x}XN%Y)PE| zmTy-5W&OY|2zT&X`Pkt*;_O~N0DT*6O&es5oMm0xZx-~~opNTG*Y*n^NSQlmVt7kh zJN}N#vL$U|@GD*W%j`>MW8DN4gvSqu#p&>`JV?i~lR|d?Xw4a$LafNd9t-P)Ls6V; zon|nyJTwk_MEW->!Y(x_koACB7z2M+E9R%M?rp1Jkd?l0mX#04cLfGtKFiGSXROas`R7L2s$vVc(8nJzD?X3D7Fh4H#4iO#dDbbe!(dm0P=CId*W3T~YN7>-6^eb?` zZx%VYqr-&*eR2By7h?ZO@b}dGpPI{Km_NMqY~7k-teY~xh|uVZnQc^jiUiIIPUqxFoF7n~;?`Ajzcpo$ zl~xXpZf?z+X1=e^Cz)t>gGY(*abQ;FcjnPRFLM34Fu+5Xfo(rD5W&-h6VnGyb75H* zu*mL&dR%8}9h03BM2L;%>{+A64Vb$ymPdAzn-yPTtgC0!ndP&>lQLoCf%+-fqSj)Z zr0&uo;oAl!1-gK3p9?TTlQNUt+UKHnyb7qa2IbiNy(s#J5B`GkQLdq^G|GBU28T%@Me+lwq5Q}VbTfE7tnt}?Vhp;=atEy^{ya->YXrGXV0#=f>m>F>0 z`uTicbvbiGCE76y-y%zo4n=)-ems0I%?R&d_E#2f>V@4c)ifkoxyVKLbkILGkLd`1vkfU!D)ze=I!0&e8`(xz9>0a?E%22pk>E?a|*I z+k=t12U8Q@hliuX7vh7lEGc>czf_%zC*TAc*!(m$+!b!BRV*8&IkLUs;iUcTg}m&A zyH)OmAm1Q9`YN}N|CIa+_Czw`(SyXC-Clva9hFkHU?%z!ir7_q)}b}pQ>}+?JpgE` zzQg~t?IfWg-mBFl+cYQhd+oR;T9c!QI)V}Sw zF9*?44#m^QeJOOxEJ^$#2vOw^?dN8He#b_}=mNOpzG@tj#|&uCK@JC6c1%D?2Z|C4| zBK~f~-_!Ve6MrAzZ!m~&4E|=|Z!Z2;;_p@b(T9$Iu+b-djlWJvXX5WX{7t~0FrS3; zm^eR;!_yffKAW2vyEK8nf)=J?i?wnDYh zdxgi_cpFt#3Xokv;Dg<3|UDf>rf2I$|$A;}rzwoRVMC zrv#qx&2gNIr7Bh{R9XY?V$WNkZqn6rVK9R#FvMiAW^?=gPtA{vwcX%-_-m2hEsuW94sUrR84jcpxT>NYr=Hdgbo5UpW5$}p7jK% zBM|N)8}V8J9XizwZ-z7?W!AMrh1em43NV}Fut_m0ObF6ecX+Y}&VrXkV6f%y1KYke zJ=2`xGsmTyg&B2U^|#0NJhOTn#Y=NoR&5l*J$r*21W87k#PA%yIn8;~ek-%QNVltQ z1x}(TpxiO*Yl8ma%B)toKd#JLKJq&ZeCX8|G4LfAjXaJ$)M!L!{U(abkVz5gB(3BR zVq#8@4|6Uv>;jx3M0#4uP0oj#0Fp#t8IRr~_KMhk%-3PT7{h=z<9*iU8RpcCg_rlP zp4uDwu-5ju=Ee`^xD_+f%bvh2Qga_zV^p042TlM7j@Q2UdHi(YM6m>zgyjOhok#nP z>hHW3KyWi2n$O5_V3;H@O!^TRC=ebeZ%wANPW5?>eLe;QZ zXskY)KAt#^3DXjEBmG{KEciY~fB&So={sX+Zqut~b#=Abu>Y&%*Ug=Es(; zR4aAA=?I1>GcR;RO|zgTRS@FC_tW+FPl^!&aA3tA01z<-=4XUQ&G;XkEkC*3B@^|R6izN9(W=I@5c1j zKNJhV<6zYd^ffls4mpTJhJ7sJIxq zvxo5t>~P4=tQ|{2w|9$=4xBV`L_=^Nm@U=nb?tCJ>s343wiTN?#K3JWPD_M%|pQ1)x^MWv-W@i5_<{dg;oC>3o%X z?nINrR6sY07%j>kJM8F`5sksUZc)vJlcB@|OGgBPCO~8@I^!F(eecuHgTY-47oKS# z4#r21=gX3jYPKQf-;kETKrDFX_d^aj`Yx^!KHZkHM$o%12Z5ImLN*mQJ5Is@CM;_R zGVb^b$_nuhh%5{OJ_0(iak%OanS)qGpi!0e0YL3Vgo~1k;mC(MAI}pQa?--}Fy1$g z_`nDsL0|10pZV^P1E3o7eS7+wCEcdw!=n4q-L603Sj+#WU78Hd-gicrCbxw~=)hTl zPN4&527iMyRQBa@DQ!=0u!Fl<9CK~dU)|#L%8ZTWG&v94Dqe_%C5?=eiHv%LVZpz8 zbX~?y$S};|(_}ar>x$zkn6=~8{*hQdd0F{^Jy1U0ncdFOe!t}g^X(zq!$(Kmd4`uQ z@$+bmQ%=T0qk2;B(4}VuJMC}8BakqLnj9Pfjedz;Y&*R|{z_cGs6s&qT?mpOjpet- z0AJ`Je7$BvB?y13_B9MFjVl9OS!$k@xtZLCC+r=0HF#crq559)SlLHI$C2(t{EBto zOm-gYq8DOO?P$61C-nIl)_6?a(w6VS^m-TvFv&%ke%6boOQ_$_Jii?}fO)C<^Yxb8gd_PU}% z)PUuR>)?g)i_}xkNQWWY4(BUK47a4IrQXX^VR^Eqrk^(@{k(C$t_{In=)kCP8Nm}4 zj_*BkTyLDVp)*fHywKIjp#uZwo*b(CG<0C(Exl!-x!PE}BX#M*pP_&8FN(Kj)xzGf zbNb%+w6xbqkgRn# zzL;Pz)k~Q`z#K7P%B`N}c6B$VsELa!*RI4@h?v;PQWNcM*k5`gnbyDw;6HZg71jU% zH%=52;dy+CV9t7fk8erpy;Uj59{2-zsU4bnlD9JkqeHyU2ttAF2N$s_-I`uTO;iIA^yc&%_EH}&Vl0HNR@gEYL&MJg#U*|MYy_pHK`)l=?qOos_be@~e^6wcjH-7c}hlFgEA>Fb@2 z#qVK#<3~wlbNAS#t@1NTs$bFO&=BMlZL7h{*L3LV}j6raUEwGqk*0 z3TtK>{7;(@dpSN`p>|5arQIRYq>s9fmCtiQO+PUHH+!A0& zo&vQ_Ja@2oL5{|`!u~OuO6{s{PeSfNZ2#p8DE457(xPmgQ#M!$>XZ)a9m;}a0bYDH z5rmBmjqp!CCM{F%O$)r+U+^Esqg2RiQ7;+kQlh`drmZ2gzi{QDv~tXfgiFYTbF`Ms$t9C%hyCC}=PLvGMpTvbB%L_D4I8$1S1%HXfp%w<}ko zb`I^;kD`m)#mG2H8mDqTksiR$%9}aCged5;WZxp$dm=komdTomTey@|(Hv<%^d{f% zgaqn8`Aa84yHztaSV6>MeuTgt5J zJd~n_c0DwTGQG;{R}y}3xxpX`EMx3k*GDi8i2?Cgq>@F*eq(#d-}Ly})kKXfGn!OW zzThl|*F%T>5b`IiAGnOgx6q%C)5sO{5x4J5j?i#}&1gB@ynrH zft8_ryQ~-J_&eugy};Wp4~x5ziUAQ?A@4ysG!e=o7s@IB1C(dWY9{vK4)A&FnZP%G zlynO4dBlAL#N7_xIe@R-&}WBtKiqNNTw3PLo7kQNe(20kh`u;6pc&WumvLTW>^Q#Q zl2(X_q0EYB*Ixz`rL}4`-s5^TyGk$yiitgx3`6P&xqj&8u2z*GI&C%BAVp-ayv#KT zUX3uv5XU!F6XRHIr|&D@&br|AY=?4?n8s*a|3Ix+^H@d4{k2DbSb9>)d-LNrrK$HH zA{TVvPoOu(4+7XD$v2beRjlnJ>2&vsq2M+gA!(wB!^LD&>sp^f}I1Ms3VIdRmK`j)y;xO?c{HGb! z2~OY>mTpz%e2S5a^hO!jG7#c7G8jo@!3k=f*U%{*KGvzBPRe@luh_+#E3)xSN9o0Q zf=W@2$n$qN-pg`x+A>jg0sPajbl8>G16q601BNIbI;)>+pf|T6f3#Z{G^?YYvSVZqdWtj__ zQGFQLahki~T{f3)%h_uPIFL;SKH?k%Vb*t%)e_vIfDY73@U+O^!}g4ACk;m2}C=*A=QiT`cukmGz(Cb{w|~eHh7-!5LNg zB|Zhlp<}oJO@?_4rD<6{&RjlA%lEb`dGR8M$z~2sI-_b;BDX zG_afdptZ23GoX59|F#tIm|xC^)18Nvd^pE>Ky>B@(37OrEh#lV{I2I#i@tRY;f67- zThffNb*6u%UHQ!~aMx850%a^GV%3nrGDTzvDt?0o!|^Y0!7^IEnGYB;p=L~29BP>DESsdR`=fEKhsBg*`}L7I_)4J6;%dO^Qno)t`7fAm+8h*|tw*$;KTpzu z&V&@6K@kp#lt*L;oNI@m{5(RKV$3wPR6AKJ&szzC$_;63gEVK4_h_mV>UMYJv+iL1 zKHFwIfqX`PBW&?ts07P-Mt;775;fuw^$)e;cxuo;+w{*){qv^&VaNz%S&2rV zB7^ZXDQUYLugBf=5c+=Nl&HIX$mA7cO1T9*>&1qk~{c?zw`HT~RA zX@PEty``&77LvPy&B^@9Q-6Km8&IP$f_J}U5ZR1Y0R0@Ufx$U_7otc5aX)$(2K z1j+~uc4R18_9n@J2NFTNjzDc+!B@yg($7;TUEt9rPZgWRWFy|xTpmXF0ZpJr#U6Yo zP$O{?XSr~EqSr27ZdCLIT@b&OOVBBtM16O-)T&Dk!EwE`BD_6Q-lp4?OOXpYB8oE9`9pMhbSZROjzdW&|R*jrRd`18@H0(Dl7?t_21=FC{!19I)Q%vZ#D*dU{Y z8$I7UPjbevm|}(4acLG;y-!&f__U0!I|%U@JY{iYXy5?*@V1(*1Ho56E4D? z8Q_F?z){n2wz0nd{m*!I86yu62m(3wd1{14gl3wz3iIKNK6;Bj{-G6vi_36)!1_NyPtO&6B>k_AK$wKd2|Y{s zmsYh1fo_m;z5<@E^%Zio?BMc3oX=+-3>X1{q&0JkCuuE22}oM4Tas-NEA=`L>B&m| zzjJrMZqNdjRcEdJSU)xDpS}90N&hJQBkOS87ir-yt_#1OVopbloU}r4*!c*8FLV&y z4)d{^vE-QZo8ji!QUf_cQ&EGL33L zA3zGS$o8{cpCJ3s{}18gro|oc@$z4Yk8JGGbR5*fbN)ws$bNP*&@DrC4c&!ap7#z^ z=K2VxLm~}&kQ{k2ky5Y)Jj?Ro2!W2PXa@D|BavF@)1i~1H{%T`tp2_T+Ltb92RZ6R zWRWUmYU@-s22H0JdQGRe>g&{4FGaSc-%a*X) zB>#surnBZizO$qTimgZ{-az;G|FHHp@KF`l!~Z4(2pHXf6j2d_qJp9jjYtGF2-$!V zOo&N*L)2D_X=@R7AymNN=IwgDfG@SyTC1&XX{{| z=oG2k1i$C&i`4BkSl__rwV8fLCR->kLl=&ExA=uee#N0Y`ZAX)k`;wdalJgAWgbuZ z9&V^<(qk5M5A6h%xmu!&_`QMT|U|xO07A=(O7C&TjJR+4|$hTO;&@1yq zN!;soX+wv66y4n`GReZR$}bDN1xy`frJ7k==oYWC#r;8w+u5Eh?nE5Vv3&G9qPPXC z4ySml94xPg1d>coLCGMNzBQ{)x<1}l~W96&bl>xal%thd^ZoAtIunskHSDi?ailf2;PKFfp~P|Xt2 zUFKI^aaxoJ`e2{MDl&;P8qr~a+n0-!l?JO@f}<3#Z9P+D@vG98KHInkFu}xJJF5t~ z1jEW!bd)^wb4{<3Q-vk5v?aMbYqTlY$-hee954F1gbkC9Ptr`5j1jZ$X%HbaIoSeQk&zIsM?KO5NXV z&KnO%bDUXQYJWf?6Go>%tfRrQ(ZC#Mho`g!%p0UKPV}xjr;@=L|=--gD&t1}iS;!Al1y4GlU}KD;nbLJIxJ$OgIPHNpw5xTA9pVK7mtdxcJADmsy0@2Pf1FM|h|r`LIZ;UUBI zR3h1g{elL66>@_|AZP>H{k%ZvW;Tv88roR;WA?6=w`WgXi`=!lW@<-GOxi-@nmdFQ2_ zY|W(xfIrr|sl`8O5f|;PLi(~~kFW*$w;FA)wB8dxbC6DRY%fs&0(hn5lU8HP^EMDekNQ#*RPR6*<0yDACq-S47b7lR}w+4 z${3p_=pmM7WsWSCG02GY=cqLwb4^im5&0~*QkWre1ul7n3g^NR~wc=5Qo%m!Nw#V?TlB=n*)DUfv z176jl)i3ir#X+9hGT|u%iFBEFaSB$<`90zgr_iV9t2u?!@0`1TcTne~?B}Qz*sK|n zs2F11qB_8WIUDBNXI2aoo`l%aNfX8X#Xs*g^}Vj2x0B{nK7z@+^3W(*~+RQ*?Oss#ZtXe|O)yGK;K2vhpd4VEs>ZP6Os?EZvSI*9Ox8(_Qmk=I2*h8fMmF zR->y^$0G@%RNynOEGEv=cXtR`pXyIHB*`EjO&no-#i2eD4{Yh64rIu39+q8E3^OF7Hqy{PT zK0zTd@Z9`{)$fmCP4CrLeUL}q!@YULLL83@dZqXoqidh=R zZ*n%D6c`%_oF{)G8l$i=und~Q0OcaT3c-gM9WGWX!iCwF9Af1pXhj{W(cfz!mZ~ru zTQoSD_&VGVGY?MBflZk2T_NZ8cJF#AHzLt;MFg07tj`Y?^)}Nrxs$2eUH;kgG^X(s znl$Gl@KRP&fV*Vr_C&dO&8-)BWSolv4Y%Z7lfIMb-TNj&lDAyEh@8?bIND$&>y_n! zId;&C!e0I0t5Wqhf-O!za^`MY;6vB>qSwz+62XewsM5Wk?z)(GMtofKvyG zfTXQqF_p?4ExF-$w_Xz&OGJ^{({{bYsp~m5#!Pe{Q7L5)CMNn7ZD|)?Di~|Ty6A5{ z^aeGMLPXk=;GO~Jon@Z}>PW!X{=@9n5Bv1n(+{_nZg1lMXs#vOqo1;#>Lzwkzum4p z<;ib%^wV7bH?Q^6zIxmG&#dUDS^ah|18bRqelOF&elJE}E^;dGp#UGq`YUOIZOA;T z1>A78H;L^ToHkanx7>-XF2cp)y~6kXEhQO)bp&WwL?A(SsYE4N#@Z?|cZhkZKnc-q zJ++W8x{sjVU7#a84SSE4p?;|p>HIrw=Z?8jaIxzp$?b1#YPpG4kP4G$C-pYjpm{`@-SBkHalyMNb9S$NP%$`(Imi=T4C z@9O%7&(QAKY<>u3*!tqflAqgnZ*e?@MPu)iPu+mR3w%bi>j`p${187(9piEfCk;~L zWX}6osykX*WT*N50Hy8Ni>z_PJ}=47to((sD84xO&}Q!{$rZ|AVwaFCE1%&9yF8<-Md-7w~J-2SN1!$(Ujl&Z1I z_DV9oPz{x2Ahu8VC}RIyW=kP_4KI;W`3u1ejlCvBUYSGv^{eDIQ@~`&vG7N|9*D|; zB#DpL)&&48N~%4sJ6zn1q^LD?^I3x|l2=^Ebu5r7x)0DE1 zR+xbYm2@d3iLBOT+7n8F1QZGM6BGct>>F0*#E)4UD8lUa$h84zIi9mN0J7q}6-lTs z`nBV_eT3i}-}ah1uRr9$$2G8#YDy zDRI%8qj06{w}w*b+AuMCoY(rj9Y!=KaL!baV~$!Nn^0nEkFd?(1LcqZ|Lbd;EeQHg z_4ULvu<`nW^_Jj<$eKUrQM8rN9=93XdL?;syX)qRz{b9TjV1h)WODW5%HrzH)rU*c zvbp+k_2)W_D~IcFt|PdDT)A8WxCU|^$u)@UTU>*=j^Y}^bu`y8T*q<^6xXR-r*VzuI-Tnbt}$F=x$?Qr(id>W!+v5 zh|++td62vbHMm8id;EtmrXu(aHo+H-UeL$Aa3t}3B(a|ESNc);Fh}O5z?H%}nUMU@ zr?h<&ZTk=lkw&7oy=sNgc6s=b|Ii{2^ZbW3{?f-6(ij^oS`Y-U zDosO)Dz^Xp+2eM~iJk)BbG~F)v9q0@}ussmDNIEO}FqO($0!g!D zhGNPtz(=o>nIv8qU1H=|i!iz)a)&kdR>}Q@pBp;~1j-Jlugum9(^MmAxDytqu zUupD$zDQ#$RcBr3RA)JtWE1pl;Y8d~aM;|{n&CFThx{L$(!7fw<*w%>-T*6Vw>?~_ zWMNJP9-v3DGUYXx%4sVRO-Nv!K-JUDJ?m-udsghXoWR_(ekWeBcCOe%(1pu>O~7lB zHh0Uz&;5sPdHAvaV8jmL6vhcJCEEZIU2}^Ke@e+XKxJ2~=yfgS-MMo<1nCrUGML?i zuPs$P`%^WPb|8N|7@lvX!*h5#JiY(l;Q6+~vwC|H9y9%ah3A0&D$R!X_hscsbiQ&X zjJ8S4WKiQICOO9U6+;kQwyl%<_3{Ui@45T3B8{1 z6XL_X=A{XCr|XUbHdJd++4KWoJIMH+RVw`{&baC8Rdvoy<4+Kd_OHy~Ufmt@WLcGK zc3zy`XjaX(2$>I4{$*a{+?}Xw(!4|;yGcEO26~NCq%lktKU*#9?3Cbj2>-HF{a)R0 zTb#LuVsxpV(g$1qIa>!EbSN_7;mC!N8@ylK&PRkg{>4&$y{7$Nh!RP{^qP|`FvqID z=IO$=FV1#^_HuhcgeZXG$9YYIXs@r7XSxrVeb|-7tvdrklN9s!ABc}ok|XMLaKLy; z>wj@>Kr`6a?JFbTaz?!O;MD+BVSYm)Is|L6zRD)_=+Wf6!M!BgS^fzbfT=GqHNMaN zs!UE%1r##eC{ckMzevmQ8TawI-txO|rm^=PhoH(rx~5m0)i_J`FmJ`faGW)c(-9Oe zYis<7ujF5wR$%X>TKPwux*x}fwKaa8$|H5izc#H|?r2Db`P=tXrZbk#($@>Nf5czb zTX*#iP&#phd4dn{JQ>W=v#71{Gu{g8aUT4fyZ8{^o=UCU%RifL@4oQgNf~n}1M1kc7{rhAmWxhGr{7#Vi7UUgveg0ep+Dcd&%H-90x$a951G0|ouf*EM70g5 zr28bII}=%&Qs)Ryu$h_SauU@##f3(~xW8|eA`&5g&IZZlN|7uztFyHfnF~Xs$v74A zYU`tuohvFvXGV_ae#EmgW2onfrK&Sy2w{ZvCXXb&8POIREAtt#hBhH^>uq})$*1(K z;8*E=w6cuZ^tZ2=xAS?ss53Frllpxl5s=NHuw~_m`J)r_N17!!`U4?6+?_uX!YVW0 zv9G)pV`&oJP@p|h!YHhDmUM{*p(~3Bqq*^mR35rjCR&EZMCLXd4Z*Cg(IOr8O%mbv zNlq-xO)MNzWj4)8)c`LfP07aOn2uEU7@ZqF^wab}NnN=8E%Y>i}~;E!K#38rMMXeqWxZ3u76CHSLv zFN|8|R`b4}iH*cyLsat+dt+o`;aKxRPg3OjQY?ka`weODFO}9niDS)g)83vhZz*Q1 zans(8bZ1)v%QnX-f#op#vn$NCJ$ZulY|SXe@a>WMK8w>}2py9r)5^AR_Og9{ei!eY zlg;mnb;e}_2|m^Yj)aemn4%Q!e-dXrKs*)ZM85{v&jLZ&g3fGWqS3-v7Oi7v| z)>Vso%FL0Eswh*WgZ|`*{}#B`{SzDj+|M{6F$sLBd@jH@OeWD6=C)poJi*RiS9EvZ zV3VAIx^@mF%282yUi5>WdKC80i-28p3q zkazPL95EfS-v$i8J>on?;kV7dXi)qz3u6j3caceuT`RvKY|d019n6y(D&Xr|#F`*9 zUIv|H+i{I#n@E~G#q_Dj3ymjU+^%>H?@|SyE(NA=en~pc*U4v!^F4D?{irzq=mLxL zd&z-37X8tUsdUBFi=?Y~F2iT2&YO1pz*dxRvwlQzGEz^U3i6VPu`E%>p-Qaqc=VR7 zq()iO)KU^u?z0${9tW=f(&TN7uO*lW+X2a0a468}2npv}+#X?mN+*JWiwI8>FQy{= z7R_lkTMrV_nBQ}=E%S4K`dy#-eR{sn{O;GJgY+W@!Nd4o1_Mgm`mFp3UigLpNbIH@ z5dnT{3!w8-;O(Wg2ZMKqUr(x!(!d*<1g~Ebys1g>_FZk~wVuVwLF*@pM*txTeQYDI zVkn%2>^mU36t&Y8{E*^7QuLto^2B+TUTz=<(nETb z#{>JbM}83fqw=Z4;Zxwq=f^&mI*x+e5+QtLK}X1AYqXsjBmw3GJstWWU>7UM^`%cne~$|#@UBH4$K|Nray^KAXt*)4CU8Nn%~yHOqx ze5}W~LW{Q^_l+-JZ$Y{|4J5nrNE4`}{bf4bR2XZ%`avY6y6gG0=E$;|q4@V$8A*0o z;3p0q)cf5B|W^%rD_O^c1d(__G zy4@M?1fR~BRNoTmI&q1S(#mq3-K{3e&AQFYxgh%CF!pMZIo~oYps&?%A zIA9lc@fS@K54L==>A=nLzO#T`RqlM6N>q z3Hz@N1$-<)a5{^^sCgi9yXql)`?Np1EZsA7fMX*#q zlX)k0Gk=^fVj+HnB2)5eNSKyPtY7rJo>EmGyfdb7FmxI+( zLx60{XvSu|e&Uj@!mq*wmW}zvUXUu5%+P-Lv3MU2t{&)orJk$QCnK~MdYJr{2}`h{_b|(#Tv(|8ib*0#1@dy*+v4kq+Fg2MKW?w1XzYeUY>=&jx zujmvu`y%I!H)8$X&?%=M!FF3?S@tR0KIQg%V^VZa);d{@1WR_f7iZlNylLak;L;W2 z|A1p?Fy8t_@G7p$n~He;B6wNTRQ(-Ly!vnaU%JMvK<>!?5jy@t2vVChXa1A&>K{nE8^gH<{W${xRY zwMu6~x0f5)QrJDeh(c)~$HBwa>s<0_!`|?K(1b`wWSiPg+WCVWOE0U*y=4%w zjn>Q9dF#`Dd)zpO+E@2Bxao^Y~_A1ka8q)X?M_suED+xUY>vjrOa^{sj zc8e)~!Ac#CZ+!$%hYecmWvz9|M+~JUQks(+TsOGkO}Gr)pYauvNoa&O0agpTJumH|&g@rTg}&^>@aLCt{_e*%?a( zYY)g?)UY%BKE-%hYrcAG_)cet9PEr2O-JF2^N;fB+j*aG@C{kdaYkx=5Edd0hOy*m zQ%kqYO{87WiX99Vl+w)vEMBsCff)UKqpSZz7dw;1Fe))W7g>za4oC#ibNm$M=XPDz{$&LHmG4~*# zM&Fo)D$k$_Dys=2qpE&f7n4G*5iKWcPMmblm8`PhgSnvm2A4G0nUv#9!u&W`e?56Q zz?`_C!I9Ay|HvVd111e=n>3mxun9L(eo!4bi^jH18YB;(q}=>gDp0wh`ADsc9fGYW z?;_n|OD*fgU!N;EWSBPZ00W2#(M`DUX8T7k6>oQ=yME2c);-SX=iIWJQ{3S@ETv9j zrQ8lcFEfArQjBxyDEObLTb!L36FJ_yl$i!@z7f8y@8yN2dD9Z%Pw)oJ7mjFt2O7Zm zshpl(yxDUHVngHI{WDOk+u64~Z@t@#x6`!hM0Ekx$aZ$H`8xm}U9u$*MhS^=vBVOF zG^_%VU1>CSya&KCQ^NTivwb=W*8fd%9}<}g%fE3D<`d7o;x#rxmvjgv zl+}!>Hh=CdFw;Y|)3o#sv*TxKu+%JvJkyGq|5TKVePH+&FIosAUdIX~5nrS#4N|RxC04%^n)rI#9F5;cMDYqjj&YnKB7oH;HIy=s(1lqXUG$-aBAoT6e zzhY!>mk%HHqQj+X6(@A1C$%=%TH~Joaj~ri_m5gYOyify@oDu-65-RW&2}#v>o!*X zQs}RPVZml%;|!jJ1h>i`G2yPcs@nXtTqhG?B}f3YXfU{#@SI{v3?mmEAA3Q%TCjDO zX2sUhlvS6TP(TSn_1qC`!K$9HABn#R#gv(U{X>zPpQzs!tjF3w3PF*Xm_OFsUy|ez zHB`zQ{UCf=vd5bbC;PH*7kr&qkD0ER+Rqm*Wj+e{R=2_WVdQWxE_hZ>lR2?$h&A*J zHf)1bh>~OvH(R!er)=lqg4icQK^17*I?d;VX4aNr;QKY>!-o?|S zE$o&_jMT!dYCZ=-SV0v9`nA$%nltlk@%0f4XuBdvt?zpDE3*-ZkwsJCjQdR0aK=js zXWWpsbaq)79i=}>fo*T+`*C!ukeoTs(xvt>4lItq2SzK3h&E~p>>sqesxW3Kx z9j@!SZs7VZ*Bq`JxoWt+$Mt=#A8_5o^+T??TsL#g4gEzgohqQl?shYI;$7{0n1 z$sT03sXt5j;>bhA53%}i{Q0b}4>oXY#TJawA>_Kh{5h0WDyBiv`?>X}O;wr0rxtkb z$?Y)u%8qh|+DucrUx$eeog1lPUzigvU>6wgdAAT#j?#hw}Kx(B-1a%j1t8+lZCY8@MY$CHkm2odl z&ISmNG8-V!o&J<%?6QeGRCWpJswT~+Qvs1mC+t;}R7UO4{PQSY^%}CnL%R*Q$?F26=?g zPp#2;k%a=RyvDbm7q{Jl{LZ%&6qo;WxGaV=;?1aPp!|#1YyNIZlr-q*+7@kQc#*Q<$`*fo)Xd z&U#WBD0+~#;ts#w3bSH{%v{L^mNQ|c8koiU+i&2s8`Bzi;~^W^$etXZ(!ldl4Yc!} zmhr#0Z(8zWzkU5|`=U!;Vo@T%A_)a!?{H&Z{e`;}6b7+^1p&OT+ys&Z1si@x9(<4i zhVw@@uq9IblD|HdQ_djf%@DICVu(eBh%+&yr43eys50~SDD5FZ5Mz;!Za3w3COKMC zf=EPOsxlX)7#*)wdZ;oBI`!ik3|x)Cru}&B=RT5x_2MxRXIq)Aj$kp{)s(;0uS~anRQwR}@olj^UR8WqVU9jk`^PKoz=8mIWbF_1*%Es-a;-CK zjUb|VA3V(|eco%nxk7HX2S?Uj_XsPpQN_*iT%R6QY|C_Ju)EpeP8AmcD3Q|vd`k`n zVgsiUGR)vE7||5bI5Wg(!-!pj8gJ?l6$^*I!Du+s`g*uC3L?K1!LUIMCwD|!dxWQd zzh;G}83nOs`fR1|W3nt+`WEx-r+(>Bc^|1^ZjmBvjmaBj8!Ee%;#O`}_*unz;^OW^ zUlsstP`Twp)`_G#{EMWZDnml7`b7Se!$Po*D2NFI^o7p5$Y z=UKe857#A=I{tbk)1$2;K@g5GEB|6~T~dI@41#Jq%?6d#=DXJJJ(jH?vr4VXV-ss!d!rqaY)Y7l{8jNl$n5&{Iva$Zyb7-8B7JLJL@Wy1>sW^fXQA3F<2w zvQ~-dWx;%grKrddpztp7VHjm$KqH(N=y!?5aPKd*9kC3bDdPrismb9+SmytYnk16N z|4L2a>i=()bhmArP|^ti6;mHAF#-?@YCPUj(98n~VzN9YJ`6Twu%Vuxi0$3&Kfh_8 zU*YGV{!YqgqkU;}wlipiX(QfZ(hOro!QH})MBr>1&8-TYDrv4*gTe~q5e*3B&FUaJ zhFDCD0b}N`J2`8WZmGQ#Vq(7=B2{CI!yhDyle`}$u{8eqKFfR(NEa{a&6?PnIDREcmyhIxOxE{V?z#nc0rwKt^SO;TajS64 zpUqGYUZ~SiUnKHP*Xe5NuP0sh$Fb3OF<_#0W)XoX+Z`L-h`fs=T4mmxloSAOD(n{W z3WWdS?D*;pZ%RgnjKk8+5}N*^53Eqs+OVnik75Ef8SgXnvzt-v%B0pIK(t7a$du=# ziabHUDsDlheE0V{k0Ec5n--~WViRae!Zg2&Aj+q_f9N7%swO?KKo{neKKo=Ob-{v$1vm@xwQY?SwXcGy2x; zwl8+XhU-W{frr4c?P9CCDjKSzNP&*ODx6l~6y6$tLDnCz-YzS%#2-6oza**eU6Sn^ z^7^9ouBLWcMZl$H{3sY*#FzfS2at)Xc_SUF`0uJV!z|lTtE=WSH33nh%T#s92Y4lR zqOU}h^=7qW%x1=L0yDr#_Q=Adh_%EpwuoiGcV*`1mTRa(OHsT+Xezq2*fzKP*q-Lb zM4DIo;Nosn&-QZ>B+Qjbz7zSDLfKtmYI~|(^tv>mS=$COJH5Iy0T0jyQ6QkHzV!R3 zIEgu7_eY4ymUSN_L4S!6$Xp@>GW=2 zPdmK34rdjiVNz~8Mw_EGj>u2?-{96H+g(y0meOZfk&ZYlTju>;d!rqB{agh#4S%z` z;{*Nvl_9kIAKG0ODHUc~r#|vIkbNNC)AxPbpDfrc8|s-q;isTYmbs<6%$r(^frNi|qZX`PaWR=86ZyF>ANV zpk_v4fIp`98b@flH9eoTT9~XNXqAwEaXYvvGX;Zfmx*<9vxtZmYwcj|#@G+F zlZX?8f}71QS~CZIoZ@e=-<)k4%OO5n3SP1bSK3+cSq3A~lSGqQZ63W<5#z|4u@scQ zEfHD8@`Q@Iduc^tKZTD+uwlCeL#tX&Rq?xhnxr5(2-dv*j+QPU%aGIVtHXaz=N`fm z>`x?g$4_=SHb7Hgw}vg1B>01;FkqH!u0neij{LZ+irsXE!`@B4keW3VMM>G4<%8T{5b z8)7K06O>cLCuPoC73LEKhagO5{0SBu^)TXaAjW|8jVP$pYh zu@4!N>HE7$dCc+y><`)V%66ao4Qm;qH9^|Z2f0-dLjGu=z&URtY*`cGtAN*hG+vBl z?b@7JX*5W)E&JuyYRb(aaMH`OkV&@QKCEuv8Nr5^_>2wViDSY8C-V3dk9A8k$Jl@u za&{|@c{Tv6A48DMa2aOGjM}{=?Hn5TmbvCAij}zuJz={TIm(e(5*!fo$t7i zkW2GV)3W^nml8BeHlO)&ei_G0?h1d)@2o9v0Rr=jPt@-)SG{%iOwM{=*u1_}qV3-J|7& zzYS5EMw@{$Q?-CGUwtWKWd7}H*n)C$prEuAsVa*BR|2!H$*Gp3YYsc2XG|1R1S3-h z?IUT0oFQw5;^*s1pPZtjX*CwXjI_=1{zT%n_Z{VCAV}3w$NE>M6!Y+#GVblX@MFDa z>~uSQB*>gaW14@0mEXi4%WVoZf-c#y%56HITSb%ZOzV!cs@9{o1J1p z_;ZI@2yh2&fiqn^hcONc(NKf6*h_DBRo!{ zZWK0gv|u1SYArk`P}uaQJPcI>(!!?q8aJlZqIqaUg z5tF|Sru*X!8W|K`!s)U&SC}iI0?mt1i1kI6!>=xdKf0YlfZ?;(?MSz6wETZr*Yl8? ziiB5)i`;F$iVBI!BK)?WajPTRdm?%V%J>&nG1ad97Jaz$*WMHF=&K@mb&S5E582u9 zZkvo+-SZ^;^T zpoI5Sdetvnrms@p?EEz*N?zj%nQQE3K%=OS94sehZ567RKh|75NQMZqR0kr!4m)Ob zJG(=8!pe`8*x&{nmU1)1S^`47A4?l%mNCl8&5Y}Ws&t6eo~QOSFxK!XPDXqTQCGa% zPo=xPyY@cld;OXjNA%EDe28+5pT#w9ANSQ}_G^~9Ip9$6uL9*a^(7)ah@aFTW+KoL zFyonzXoc9+i9Ow{*ipaVpC;c+zZZ?|vA5ReoP(Zod!Bptr&tciBEl>FGO+-LGS~7O zR==mn+osc43c(`2G+%XTvq(5Xq>PLzBjf;L_}^|Q9kidctgA}^7wFZ+A^I`Coykyw z{uvH#bTSdch$INnMJI48MAuw*!?;_;BSOYd@k26kz1JTC7maGO?9ce#5)A_p_-05L zd8-{NZYFC=JM;`}&we5TfR9G6^a1A!(-nk7w6r=Yt+?5Hfe9xeQFx`YePh&Le!3qG z1J$^A(5~TH#pXLB#I-;*yoQs=CUnU6wAui^tN2<*vH4!d-o&oZxVp%tUUcwy^@NXp zdXD7^NzvkzoW0hlK!S=>>%!Rngr`j~6JHgTl?}ufY-j~WC;hx1_?vh2H6jqmck7># zSj`V8M^J=4B5&88CGn}zfj#UN>x(rv!wHI4`6p=kFMp*knR=h34iKR^U*l6+=#{Rb zEn3AL|3VgN(@CR#28fak05M|r@$eXUP;@rr^D??|x`KwTZ3Lj9Av~71=JwI3UV7rM zBvZP1^G`g=%(K9)U-m=puVz;~4IUjYI=ZH)y{bMB>KQL-{zS87 zU^XpSDsFzKj0``!-?6L+L{5dS;I2qPyBYBN4pZyAz8XJXqOa|iG18mE zcKD#RBfE9?@zIUf4BseXfFBIwp!HHZy-K-e6-B1;V}&oTVUrrF1}|wn*gr1i|07I2 z$6G!4eh8!PqgyqOO;t^wGT*;iYES8#ho{VB_vwUvdd9E!G)MTU~5rQ>d)Piq_VbJ5>FzW6*eD{UiQU{fDL3|0AvcqE!9&_x^9{ zml%}E`5cX!Oz&*Mt4N#*2(9UEbUq3QHGFIls`?&J!g1J}K&7a3d5J*&LN`dZn5#B5 zrwHbVfS#Xi+dX~d6TjGjWZG3St_ULx&?Xf`{{q%!Adb#bY_F5vj(sMocX#g?2;%OS z?@0=g{nE2!`Viu$r9mso&AGc(pp(7DEi~chUL8DGL4<+r^=~zqDWJoylGIP&~ zb}v>|L6ynRviJ-x*lj{5^wi(*2p`Kjd$JG0@ZHG@W~bM`glw3RewFwk-dNnDd{}q4c7h1hu4U%-2W@{8cPOI< zJGC#04A%kr#lE9K>_)YZa()AGmv+*K_Ht8UKhqrdY7VHR>?}(qeKM6wVw)sE;B4Ur zr9TZ5#oJz<%^G=?yK;##$^BJw4-zH9NPRru|+ipWALT>wQ}lD<%2SE|hDMV** zs|ZSJ`fe3DF+T3eb6&I65AdbE|O88rcWo{*`qho8TbqodZ*5b`5cmX`w_mW|vxKl}q4f2T?N8*-WPG2bsYc^6 zlq6P5)VPRSOY(Y1jcS}W=OQnPmUgMHg8IdLISeg~(W9mpRi~eM)**8E>8n_&%O__G zF^fu{;(X=x!;eaugc>`KhKoi3!Jg?bU_K=xG;R{i^L#`peQAzg$Mj361BI;LtTcK0 zZT1BD7==XiiMi4aS-?eq&#knBO|2Z1AZD@M#{+6u2XyzfcIKm;+NklZpS`uM>0qTMd9ke6gP;6^|LM3e|27XF;a6P;g#9O1U%|P0tw-;wG zyFn)@P6P0=8lX*hZii$R)|ljnbbNRcbv~C(NM2!|_smIdF>#=8wqNdSlnD&v=K_AF z70FEDas93?i05M_CEt6YYox92ov@;E9CQ=;W#-FrB^dC~*BBZd&#Id-u1@I(fbV@y zTNK*^TUP~E`g+Z$pUO^OUT&JK${*E#PvBP2jbnMYdo#+X9C%lS8TY)F=QaIvBt3%* z<$k`b?Q3boh8vEFg`EOqfknax6AC? zEYBHs3Wg~+Bk7e__~s^f7)@f^UMqs3t@UiS&H~#eSSsd}=-kt>U zE(LKZAfmx6R}LAng$R0-u;+Z;jGARm}u{cj-cgHd!w8Z6hHEQ9n_ADm17GdTUy!8uRBc|wY& z^90ksnkN&-_6pY7&I#E zOcUgYaY7QFcsg<(zQadO?TjQWdCsH}@nh7+BK|`;jD(z?r>J!v;qte z;>DVTVFx9nL0>kQapF1a8N%2j$Jwpr!#quu9?|z0T}Wu5o_bfg_{3|1i$)I-`byuJ%yOP-PPiJMV?oOHe{187M7IZWQZ`WGRLhFrQ^8nP(I+_Gy=$~JUHfrQH{ z-tM&9#ids@od6`mH#@H^`*=kn82G9+5XcKeI9oirDHk*pzZ*XdmY&!8q38-v#GBji zw@)7WH>F38SW`qp~apsfohF|51xL6 z5>SAwwm*NcKca)+WsCihLCsUU{dvj$Y_>n5<{|Aq>D#vAhrkAnRuA=MAK%)NNTA6q z3Pg@*{Vdq;Eer%Mip?Y^ev)|>5ho(|_zL>NY}4}A1fZSxQ76fSex6MDYwIX`O#sdu zoYLBF1KNUm@$8gCu87I~fb_XF-q0<_@DAiAwdLp(g1MeubOs03wVhazc$N1ZaM+;c zQ;P-fUO9rZ_AFmy`{Q)Z-+UKBp>*vJ|9utj{dGY+$K3ZN@BRt~TfWWv@X4_=phi#jkCor0iVw3P=bP?ha0Q z-+#aP;vOh^n}Je2Q47TaM#t@r*Tq;O+Zh6Ls~i#@x$DAld6BD#qDXClHmMWS{2cqE zBZk=B^2CA=?bJN77e&hb*hp=CG#|c{{7Z#R((Gd5Lx-vomM{!N$O3y+a_tf z6cyPjabe1(s6Jd;iaoL>c}!1=UnTbsaA0F$*mMS(G6t$>SIbRpV{)P(icz=I3%%xu zwq8=R*L0mI@K$6VFNSTR-JG~X8N4!#|7O3!uW!MewED9Dm-@~gO2!p;4NKPdYWM$B zefK8olZpAhhX35YMOxnpsrs(^FYAMGJ?Sq%uJ$>L+nE0y5ph=Iutsk*j^asV<5lvf z#S)y(iQQ%9sXyCgI!h%?$AitU%1B05Y<&A@L6qo}vdhi-1^#5uJm0K`vn_evYs>*; zr+AIE=h5YCr>;86m-OUrIG+Mt;%c2Es|Re+_YYJ7S$!eodEAlqS-d6_3spCBC!LCv z%s6j2R>5Iy*&-%5b5`pF?oH14>aC2OfLX!r`^QgMQ7Y2nN{e-ctu5UwHDaoMhpiF* zEza;&EUc@{8P*C^1TCE5)dfse&kdS22md(9RH*u-Tx+9_;QXX1neW?3g1#yf`=i!e zkA-MgupSi&!@k?CtDH#)wNe9kb7GLLC`WJ3vXZJQerZgZ`HQMQsEJ4??B73`Y_apC z%w#Oe8`px}vYL$e*yz3wBbjoHECwCVI~o2=A5(G5+DsxEIro!2F_+_|2AJWW_sBj> zMevaC`=+Y0%UjyvRc=@B!BI&(M~Y~HyG8&{t=DOxtQI892%WOsMnDkFjjZ$WAKcFQ zH_!M``~G#mdt9HDv}oeXj|qBI@pj2AmLib6rmLz=%!4gqU%%)VSDG8$(|bOa9}@UzGW$TSA7&LknSC$i z%`fokvzK!NIpH*H{%Y5Ha7O%psA1Q!LM6S->1j3CFoJb29HRte2Kq@Hx9m46-5$xt zm$3F^nb*jG7WGBbUZP|OyD-sxy@SzJG!$E1iTYxd&T#H4r1)}kThJfBA_s_^;t;Yd zXVm5e1fjv!)RfIEH{E~GfkKS0jx6tvzWt>+&-We3Pk?B0EKBo6WpQp9v69TCXrNFP zF#hY7_9i*Hu{SwbI%EJKhARNkC!jHCTTE?^uyXpU?DogOXF%nM525*2|`JlxQcx`rlHEzrW{n2cJHoZqK=qV0@7D zcgQ}5`_^xY?2HdzNu=S{1%2w4Cawy1hOhwJ6gfJ6McR63)W$z&I6Lsi*c6^jPnN@J zM}c3TFYl%z)PIR{#N6p&U*`zF?vQ4}InFUxRrz|OV1vYDlyD&ugg5@9gWwAvY4KOT zDLmSTF|soaxVQxlAN2$EL22+|)S&P=zxUybTxDU{TA9>cRd7n0ryHzTOXdGg^TG4H zx|i1?7wI>-C z$N%A5psLzzLiF{Er#X?M(u*oLr=@?_*F5kk4YdAa=uv0<#&X=$^eFN-W&4Oa z{7vT$a%N*Uj5hFwjGX`+vWLGMmHCu_%`M4oe- zwv-5dy9giWHGOZ8+;^t;f6X{FlNFqq(xsuI*(_8!VtZKy!p3R<=`fS~O1bPkEZZk5 zuv_~Q*D-NI_&~wp2 z&r^Dy1xIQsgz<02W&u{#o+_>MoWC$MxtL&iCib@_BfRDNj)dYXyUQzxc#*YScV9)p z#VOhdyk2$h!uOnagHhSzUUorv(cJ4J9FkUdYgS&kx0)`2d^MDA90RIj6J$)v3Zs`i z;l(NeOjx706^$3}>fvR%p|Cv|mE)E*-$&G5)3=NWn={Qly_K{maj{pzxtg5FSh$(a z3P!illx5??^RB->a#(%~q4?@<$?D$&KsDJ@dHmc-r2_rz?n22FAwjQtipHZ zU!bMrg%8svO`+-Wvl$A`=1~|GWR=zQuQpF)CEGU8*)VFK^Fg#NV}8Cl>m!sJtX#m@ z5I*ykzsO&fz=xYcQlO{xg0{3hBSiV-+0dVSa_?niu35wwomq`^l^8&Ng>0gJ1s)k@ zS=bV>6g=P7?-EY+!igKRhM@QBDncA=yRe8BA^&9;wmWaluc#Z}KRko4=0thxHA)R- zHRxhH?dhPCi&(hTe;=4+05AWg0MH+0y~b}RUfiWJvBAHC%~Q#vtD5Y#$y20?!uI(K zr1TSR;S;{CKF_FKDf zHtY9Fn8QbhIw6lix%^q90m9E%|JOvEZW|~6H zDNSuhKw*)sEW*uGjsQ<&#EF`SyJ|%;*Ly)3=T+tjU5K#%|1mG5cdE=UlCN&kSGl~p ziZ~0Pq^5tBX?;j>2*$Ao_@&>AwMg+Gh%G=24lZFR=y<9<9mpiY7u}8xCaK+KApSo( zLTg!Lq2|bZP>Vp^#nqqZFMe*jC>j?4YYsDy|4nI0*G0)i(E<1r`UdhLVk+ZP_vtE3 zs_|q!2u{ZHUDkC6_g0u-!Rh{@7p`v-X|+3P+~0IdxnOvu5c_;?1;fpUu&Vb5N79uO zrM6eBTNV}X?6=Ny!h*yMO#-*(%BXEZr=78tQR`u*{+{`4x7`8}_}JJGzsZz0%_A~< z9(|H1|DB!dAWaN6WUj#6J-EJTP+@UL3#^qNjO9Bl9jdmggHG$(Nw zFO#W&ckVRU>-we(K%gqaQQ^SRNzof^L3K9jaVam@FkB{Ltf2(|s-n^EWSU>*6xaJD z8aTH5Oj?P^Hnv2$(Gq)0iN*DY6%X=b@kj3CXiISy8kNAqkTzNc{6oNj#ywXiOMX?Y zY=(@5fvWl8cV%jbJS5-k*zbQQo)kC$M8yk%Oo&{O0dDa_(t63aPv6T6+I|EN82A<9 zhk?SIe#^!FLp?ft6np9*LCu2zAYk@mMp&>^7tfIqNQk9XDLI7~pN-J|sz z6|J!k@Sj*C_)PF1c*Xub2`vhZT-MJ{IlGvvG{is3PUmNE+6* zq;Uq54TuCCh(d~OOtX(pV7}1^3@5ln63P7-QapD@f4J@4Kff{4hF|FQu5v5XRKW?Q z-S{c_tv3_*W(2<3Up77qw(?nCqy+|+U1hG_<4Ys8SNq}6F>Q@V#Cp%YjVg(NC96PU zZ4(Ta?@G6NcN0i7A(Bi3JC(|L7s;Fee@2tSvsXeyEQu0cW}>!q4)bYA26ai-*Cp4h z;^>WQLRPe`f8F>%SPVRf`%q>EW!gn!t8NFK?M7?PwW6T=Y&J$FVh~$iZMD&0OSEWZ ziE(CzRys7E?K5#-SUCj!9s(cbwhi!#Yw01t0vVn=`C7Q1pky9RKNLz%V3Y_-=ACyS zN-q5BV3f?Y6{MrYpI@Za`+cF}{yicTFi|Jt)pNcryV(A!&8~l8ljqVyrjx#IXko{l z<>?GGd8lL$Sly|9I!XI->a(-*n#By(=I`(~_(wwIAN&F3t9&-ypS+6k@7zN1?80uf zKP~b@UpX7XmEJSg(i_5ylH-MrK)M?IiBDSW%QI>AuQ0Fe(f*{b4li;x)J+IP{u&>Q z{z3=zUu|NBzJI}aj{--%h`W8T{zK~GYM)&P zr>5H6`S&CcM@N@*3Y2c;cC6$jpz@Ns3;IQli7!BIXYQJ^QD^2(!DIX?$&lLI?v~cZ zXQbp^FJ~;W@#ay&IauzXGAK7KU-@nGF3Si`VZHTq);SYT3};X5A8e2XL|P>lh*28~ z-*Voc_h)QGP*`RF&JKX!;$5n29pa^Wdb^t%V zy$>~&La8B6e(4_{AAGtGcj2)U`-evd*R|KT)E@3maSMj;M$`0heDF%}Ge?RkH~;>Z z4|U{~+e3+o{qdj;kLOcS$cy+jba%4H4l8mtPKb2PyE{IF?-}hU*`y448@z3iHZf<^ z#v)7+ICasUXU)E>x8i2)uGQX(WqR|Zw_!1@6@n{w%CdsB($L}UF_C=Oc6mFM z^DLLcB%Fh?L7HRZPbBe!r7b6S!_sV_aS=Neab;$MO#q?w0PMpWUGluzdeENDRL5SS zz!E8nO#nMsuG}EpqqwV~#jR|o4c_$346g`kc>}}w;1r~f;>~_Z(!D+WJGw6;Jb~@X z`qdC;bYEupjEkX;p7grKLlXVN!!9OYWM}@i!kzPviHT8UQXeK8ZaIZJgSUyC<+R?O zb@ap&IYR}W<>ed=U*o_Tui$8C=ZN@p!M9I8MbOVgOFzfCO%_wlNrck!t?^^+dM=5U za`T6sNqTw?dZO_ZLF|D@PzGPHK@LWYSucD>=xVWU@BYvqpuze~0HP>1Cne#Xo`e_z zHvM*cpq`bl2qXfqK;D_Zi=$ujwEo^q-exrQbG8LtmcOZP@9B~0@gK_m+v~w~Ey7+o z)MgFpw^y-i@Zk(Ld`jV12%pSn^>5ZbDFdy}wsj?KrPSf=S{6}hS|Y<`k79*_(;0kv z%2+XU3IrzRG0yu18x|xJvc}3tY>r(oFE}HjJAQ*(xw%(myHJQ*`cn7=T>J|+FP2T* zn*L~KD$El}h{zv4r6_(T?qc#KiQ!S0+jOhOR=8+$GH2vnWt%3q0Vc-3m>h|99rqs3Anc^GlS4Hkcg42xHn@(%!ukd4=R$E4^Mdtr_!a6Aqd}zvC4&wXac&`}ijReDhUafyYdpKDC6u(l$Vv694$FpEpvEeq~<9+H`JO%3q z@;I@7Bp7Ud~*`y16^`X;t z^ATq5YpC#Mz|6jaw%_5}7IlEryMyKID<2B|J>1@+DSEQ<0j8zf9?Y=!xx z{%aBcdjOhC0`hBxxvJ5oK!)Kfoqf>_vLGOZ&spP6q@riB|0OV>lkd$x^z%Gte~-n464W>0)h-f$8w(jnY@3x}OKK1s9pr(t zMXPBQm8KXRlY|s;HYK;nrZ?_VWoF4jRmx$ZCcOfo4fdjA_Osw)^KlvBJo&~yXv;1& zgg*TJaN@@c&aNH_Ccfoe0_xb^tuU`35ZIb-h)xKEPhff`!%@*T!7aOG$I{UPWM~Ah zCu2NJ3?5W2oPL5*?X{EqHAd|yuS80Om33E`g|sqPtti*Nn=;#Ke_@Nc%%Vj>@uBYW1@OTVaSU1b(bF(VUw{3JY zCzQo}Qa{ip5`oI$6iSig8$boqPc|g5$}dZfmkic_%6kd7UfeBaC0Ru_PkpjJkvc?B zW*WBZi29XM(8iJZ+eBXTLUK%%I}LX5Q*;}JR}5N9GD`*iEy#8+%5`&o>b&mE>Y&(i z;`N1Q$KFjw4?7a(}b zuF0b_Bd0aD6F@1tCo|kTx+f!Y0|h4LkC09g!@8pnDo@!aDwvwggh2S*yFP@vaw|Pr zYpJ_IP}t)1bYFE($k{rIZEv+ zv!vJVn54btHa$C1^fd(ID9el824a$?dn^kH_jzJ+eR3d5=Tb(t$+jR%{Lcls#Q(Hx z8xfr76y3XuMrTAiEx4D2t*Qm#CIu0TOsU1d;}LZugmoUTD59hv}#+bZN>TkAB6;H zg33=3sp7Md^0Rl{v_`EwmHmHb&fU!hY5V*AKfm@PxqIGc&YU?jb7tn)ohXTGy{5ZO z|3t9Qf`&p^?Q$W__yWoR#I(tq{oi^>8xw0L!mq%!`);qdMn=}2B z!ZB$c4nrPG@``=h;q8l++6_PQ zZGSf1-{D zB-2`)Ctux?mMdRaNFPz0Enge?r*bntCj|LNV)$(sUANx7XP@0(Ykhoae3@O95xC{Hyz6u3ro%_#c^K5^>!seZ}4w&vn;A+0N2MqiCg))y{6c znNQXb&TDjL_*!@AxGgNMxddEz!h=28Z2N&L%F>=SxzVCOiOo&e>H-uNk$^CiGpHETFeXjJz4FO77rmHERf zT*vxin0xV$cN(T`7#MV3*PsAZ@U@YR6`2&wbfXXPWtVgPE;=~eW!&f= z1JjqFT_8{CdaY}K1E&%&@TunRr1;Q(yuv>_YaY#0EKAJIQ}g;Pw`J`oNW}RFCs{ms zDcn^_9@|^qZ#OJPAODkV&(K@$*Rq`Gf-_|IvD34o^Y|2e*yfbOw^>bhF?dE+!9n(?lKm}{jM>_Ykp?kaQw^n9yWgKIcP8irJK_E51;uooD3jAC zFh97};AV>clOaRC?+!sN>^*)gl{vw^R#W@ngOC4Oxh4(BHE$SqsmHfN1CYdKGH2Jwl+|W8t;~f zp*VxEn~%<8u@q*wQpPsGISYTxzOkMuRs%;pFZ=XK#-4JRoV7X6ftJrW-+(Gt5xvq}x zEe?Gi-x=))+8g<~j2JE%@}F2!B>&3y|Kz{_ZTSP+{2KkFod;?9g)5xpHxD!SxGk^! z0~&ED$8FWD?8H&JmsK~$ru?388iR#)VR*;CsH#}NS+M7@fr)CRDDpy3NVP;Wu!PG_ zrixf{xKJ{l+Kx-;kGNb=%j-bZdB_R1<^eHZ3Fi}|ba^aEj|@G=hCJx3eCg}5YN`-q z)vnAUY{GOgwE5jwizrf6Ybd5@VYEd#4k2!$vOe!k<%}>~#e`MxcR{v22{mLcDE!q;*dHGa zy?Yx^kAu;>)3*H|;={j&XG;IuGD%!imi*EKmRB+BDYHa1s1{Su6>eDIm4gDod&*@; zR0UK8lN9gO?NRXE5EmzsA=4_(lim1L{?q5b<*dNmxYWRqn}YVN`a{Gx`$(_;$vp|( zTS+qDIB(-y0^Hpn7s?RB43VfZVw*1dz|fYi!Fe*esM4E?00LEeu$=OcSXh^P{_L-l zIjeq?qHoFZR?+&w#>>uT`h&0yV=4!;->G8Z(O%^{`XcK$oFN#Q;4n`#-4HQ*a=?k5 z>+{0dJJ)B1zwXZ{a2YHF8se!Q;kaSGa`bmVxTSM;t9psph4D8J^mmo}6_u8lZmAPh zlXK_(zX6PEb-jcTC)X=q?wlsTMqVR}6(j-}*l$lj4RwZo1hI?S*>|mTfc>3succHu zI3c=wpw)UkT}X6-X<1HF^d4lG%x#>Rwe19>#z4eZLiqQH-SnAZJY5ld3XIl9G#)o} zutEz4!H<{iHzu7Mg^v$(%r=_aU1$Hj1MmgfD7F*PbI5g_Q<$*W z)QSPS1BYfZO8!P)utAU8T*W?fDQt%vjj26Vg1VTfqY$^b<& z)0Sxs4GxV4e@~-O2V^R?v&bizG-vO^s~9zeXr#oz)fD$0#`aXCjG@w_+{PX1h>FE( z2JKMb1?@9=nn$KO@u__Yr$}Nbz?D{^k3+n%e>I;OJFtE z@rjogvyWZP=l>S;pKwWW5YXTJ`y}Y^ldh7W7elE3J-j72%zuXWi~m!2-@yX>3wWQ2 zg^$2nL@kB)V1;-12f~bY*=PIEe)kVR`~3dUZWHy8jItrSaA)jc`5^!f4S}BRjEP;f z8+}7?jHLyq#K_nSJdUld@OtripfPfHJl}P0Gl-}L!fy13=p_6qAXbL=+VA%e5Kh;; zMn-|EZFF+;7CM8wiiJCZ@Eb(P<3q@dVnx1Fk;@17Cnx4REBgw#F5{kN z{^FsT&aWvyJ&Y5T)=d`a#bP zJay?AJ5FDV{1thJ##7B!m}ZMGA(vC!nTNe|${r)j4dmK;M!Yo(D;+5;xx>1&7sE^JYk`_ri_xi(4oBwSQzJb9vFax2UBQHx5PT z5L&5jm_P}-{q>4T_>!!$G;6J1S!j@!ksA3jS^BU)b+#njc74 zdI9>1Qd{IEJ)!5wnvA zg>*|$w2V|YoA~jcX19Ve|C8BGPtNXp`jJBb%8{tczVCMyy7u396e{W0Njl^r6NUrS zPfzlJn(D|-c62`-*%OAP-wLDazLbH##($%M(=Yi??zj8nyWXCJgCNCq944LRIZ)+M zoFd2RDFW4&AO4ZjRX&QgC~#|f0r`ka47Bd?*>3 zVrpDY#!)=A4aa+kbp2Xa`Q?)1F35GSxXNjH#MC{eUlC1}Qjr;@`y;=)ov;1kku%~k z7!u^w6Zi}Ha3c5PiQz2KWz2$Q%Ij*8Z~0%Jjv(zkNXawCyC37MgwwKMh#r0%E2WTu24 z5iK&*wVM0gCPQwidU%&MNO6W6x4K$J3;E%H{e+ve@f-SJx=M}8T{BENTq9%4^gCVl z{R29+4(t?S@b5cK;gh+)zEpH7m*m2p&J8$=T2S?vtNld__>_aL+l*j9SX@-)=F{G1 zzv=BFKE05Lz4l-1&ro#ijRV2DIsy zmbybqS*cQ1lQ?ECE-%$$<)zlD3v#Sg9Sb`MCYZ2Ry@+u}edW1g5)>ZgF4m?e53`y- zqY@6%o86kL+{oGQ4ai75(@s+2nbrJTm3ZbU{>0=~*lqi-WJ8%&tFW2Qk^(?06jQi< zriGi5&|yqJaeXI5B%{H4gpW^&lK*6rX(VMk-P7h_+EDb{+b!pC&t%}Vyb8SxN z2cTc6cp=D=pxaHk&g3A3qh!qdthvLT`REBzOP=!=!wB5|@WCb{nr0R2i81yk9Z}}| z;E4HI@X(nBh3#UR(I?N=;Ly#BF1gN}Kx7F|S7&4j3Hxlx=ZVGoGow9!K;(ljgB@-9 zQ)r6nGLrgI_9O3;$)cNp&C`<>+mmxKi+3kqWmj%?mui8^CU@y?rDWw+cWJwRw7E;a z(2tGo(%~$m?TU+vyL5vjy4UHqlD5hfg*)B0cWjn}SX*uXwNKoiZg<=29@(*I2&eN6hjn`&lPwWEbvsy6Pem}Z< ze<&Q2NQejA*W)14*kec?MW)6+fC&S{Yl{V|!`v6c=sYDZ!ub($!I5Rb#&vG zGQ2lp-=jFA!B;|lcgCif-#R)!@rhWmNldiL2qhH~Fn<`)L}263W4)xKcA})R@hill z&6&0%F?)7m_6^=_84Whott;tY{ulYRpxgQ`ZAud8)@r&CfW_X13zPHQj6R=gk=t@I zLfMO3rAq$5u>>XUq6~dF6D9~*3IZ?4p4B8~Zx}&Y%}a&<+-L8S=(v%S4>6a*PYN=b zTjVYcz@_~nTM#K=tM~V-)C|fg$#Q0oQke66W3E%T!h3kV?jto*xT}LnSK~vzW`dfp z3Dvtv1~ag^-QEubLkr9#<$SSQg{tZ}tL&vhXq^cc+qxf|;^}s4J1Ozu$@7g%=HiPn zhUYLDC&nbjrTjDDB7XXTA9zFEc7;*SS5{Ddw>3Uiv0G%fjbq#*oa>_uldT- zn}nezL7>@HVYr5Kf#TBJ1280To$(KWlPT4swn2A1bN-lxb#_jbJ^e5P}aB-gmK&!Z&>@(WsR<0%Ke)4aVG=LgSgApw90 zUVKaP8hfH)1}h4y%LVChUGpp3-R zLS_+ctG$~ZQrt<*&to4ao>p>Mwpt>fFTFv9+r-mCHmkj>uGX{6Yv7p+rdHZ46cm6| zC7u@gS?yivmk)2M_RiG8+;m=-2uG^DQq9V?p9X3PrlSLrflcRk3N^;jT4Gfjv!CK> z4lIM1PKY?y@U6ttQaBNQFcE%4Uncq3mw3D4LzDYQ;|%$Ay$3GW0k4)?Vi23hnW3=X zq}7*QrP)s7YG7TodK^n*HDyu8scT1G|2C5PGBi3U$ntmc*`G5ZR4>tU^RWZhh_U? zDdX>IF6Li~W_0P>F6QeZKTTcF;Fs5ouv}e`Ym_uT1RI-9AqruY&DA!k&LC(u-X&iY+asszr7ezac(& zqNT`|CZtg#v~OZqV-7SpoEo8J^5WtP%tEz)N-p~LYf>Ie+S6UZ!XD}jRL!$!GGSwB zuR2jJvWZ@k42dQ_X8i;zjX@A%Gha?g0EBP)6Q6!e4A2O}?rQGE1V5S24+t5Mu){8-M)z$GpH1hgRl4|RTA1)z*Sbso>s2&Q z_dGu$`NGt%@6*h+KsymHq0IT9`M&Kq>-}&8OKV{h6Bz%(kp`?_Tlw&MpywT7lA!TwM?=H9sGV(3X7)kkWfeq#+tBQR& z=ERgNo9j%-;i!<+s!F`3FtVC9QQm%g@p3uC?QQvE?YANwfyf7ABY#~Ve7Q}N$Bsqi zBRu#i%%my~j+o{*QZ;m@wQA$SJt{FxcNf*_T%oxKkzzay8z8~M;-KtK-lcD49{-*T;4Ktm&m?!?@^}rVgh&=Zz;L75d!UP|Jgot2qMqQ|4dKv75SAw z?+bUiNZ6tWc(xXy#JFlnzW3rZqO&d+aaeMHdO+@DNld z;7X zRo=PJ`G>K24@9#jnXD6&S)oQvZZye(?Gw-}bkR)szp#N!Pj^SXJ)j`pwQ(L}8pS#yljS zgRFmfDSPoWLml*L=QVzR)6wJubY!K#2JP3#FP$sKvQOU$&2%P}LR3z~@w~pmZQTHX z(=VZJyUV{4kDu=>7_I!L!-M7?*8V~O4t0V|up;9?JV z%16T^mU6d=4h?Sh0Q(e)59W)vX!p5(a;66$jo$!1&+?yMwOvIw)~X6a3PVG!Rqf}h z+U9sOxr0)~y#R1=ROw*{gwS3WSr>?GADh2ExVcS}BYVb%A);KR5*B9A%P4qrs3MAR zt4Z`S?t)U&ystbQk|Ma~E{V5}+y%p(^5Fo0hij1;FX&dr)nwzNwRqAD1%^kur%xxF8ofmc!~wr#yc}CSfeXSFZ?$j)g!lfV{zg$NusSO+-OwNx!7{e%TLVXT~wTOfpT7S_x8})pd?{%8olN%;Wy&EhlJT_ z&(vD4YMTy}yvU@HnUoCsfe*KYAE!ZK+O?ULC)PuC?T$9Kc!4BweF zoLedUCYm$3ktrXm(GNnSSa2fKK)<_rTrhlgMNwl<{X5C! zcvYs@W=F?DC7*@GNvQ8-{Ho-@?k7KX4e39Rg@+WjKP&2i_-QZ@ zCp&`>S-|d(D2*F4r>2(DZL1TyX|sR%W;?>6C5bF>t@SQ`4-QNGwf_bGlV!i|<1ZW# z5fY8_hqLA!bjRAj2Tv*CbiUra{5;asgpT_tbeLV<%jBurOURa3`8jJQChPsi)N5Wo z>A+fdr`P&GYh9YGH8)x73Q~}HU=b+*+^TA;;csqmmiq&%_9kdi0+3+gP*q*)o#$6= z4>dT;{b5vlCz@1wt}RfD{e5q>cXWC|zvpUi&yzaO^nyJmi47vI+gB_O6lLX&%?p3# zw$w1XcqK@-I1rSy(9tm-3`6VQvp6tV5-gR0+?KPXV18P`BV)YCk?@x6wTt(Bbk~cbf@=5ma4H1$nC-rJ-0&6ba+|`e`cynIU-y1crD71&?EGDVsyxr4 zPo&O4Ry0Rx+iN1khP&au3H;jQOdlnV?q$7&iDj|@1EUEny+`gZ;iHrC(Ojxzc8%Fp z{~i;f+pNsCal@0E!NzU&UU}09H`B(P6$8SDtq54nM?go=d5;?&Js(M=hWdr?EZf;4 zw2>iCfVdKZVx?Gho*K>;B~OM`{)xR(WE=*K2F$zi$G-T)*sQjxLXMj*mU?@U!tBPM z!AtU}yKsvM6St{L(_+$#2 zHXdbt%DcGs01+x(YRVDiTGQ9)xp@n^9INd@KIPr7JGGTh$85Hm)efdHhq<=B3>-|n zhS+uVB0D&B|Kd!^Z{A`x$*i4uqnvSha{35b;9rz&(1Dxrz|=&z9b1YjE*su9VyJ^< zMcLM(=pd}fttMQ5@HyCk>WEYHw8BKn{(-OsvVL!w^-JCNTT33H2J82idL!R%tn#K* zDxTn4P`4qizOMgQ>(5Qqr?<5E@M=uc=t|6wp9LlvU+H$NR^!o|d4FcLx{C8|L$(vrWi#O}$BjOjEi zV$8wLWg1=#M3d-+4kU=c!X}EysX+&1#ix;AJrhaS?EbYuHM`>PW8Wn$i8QjDruy2E znj$RA!h26%sH@|5fo+1lS9ZAfQC1f-A_y_cDza4*D4~!JPCFMbL-=zU4 z&U4!CA)$wd*5Xl8EA?%(qg!pamFV? zJmJ-=G^ASsG>JJxI)1z>_7HoFJw%G0ESQ6?Wk2>1YBhMagi@!C*`o^I(c$;icLT>C zXu5J%=6b4)dAa_t3M(#US|=LCPg#(g=S-|nzs-^BMt=AwvtXka6IVpknr<0|FExdA zDq<{d(eSCU#J8*3wgq=Bo`+SBu3B&MxYw@R6h76xc^KZDTvpw)e;phV z_j0~YZ+>poRE_MjX1Yu~FMbk}lX72QZ_4@E514GXVi*e}AZhtE4dK8x!)$$T0k2NU zKwc*qn?neX+p?W+2_$iiRt~yrMxQ$%1HZmAv<}W!r_l*fl6a-E+B;VZ!QXB6PIP=? z9mZ{&cFxvfXfE<7ceIw{vN%Xf-bK1xqK4WH*O6d!}iV($W1T9?4WLy{g>+a zW!hAcOlwYdRW&Tn%gDc+xo*qVk~p74Z?z_6@2nWkYi?TMG07wRBiqpKs`7q9fjIYd zw7f)G_LHwNfbf%2UXihhH18 zcb9z3zvz>zczW}_8U+W~a`!D*OD9Zis`W@C6bJ+E1U+HZt zv+UQ~jR))Plw@xWU>S_;R{S4*8Z;1}rIt_P15$5&q>RZ%`VPLS`}UDO>Q4(g=jBXMc(d;uDZ;z%F{K`(Y*!gyiad zXXtzs?@j|Oj0bb&6Oa`BgV7iJw@(ZaN!eprOD50+HgKQ$=OMn6HfA+&iFh!J@_0H6aUr@j4M6fVf2nbQzK|2 zymn3ly@6@7XYGS;mJ}*pBpPPR&_XCsL-(HgYm}eE5ig+o& zFL*w)bK!o;_+PEpf~HK~2g#iG7VKizIOR2EOYIP_iz_Aog5lrBnS=@ItKM9gV!&?C z&yQ7-D^8M0e#z+1#s6yu8@To1KeC*%SF2{t?sK-03wXJ7=o$oGP-?rZ6(;ws5F3rXEzV#2dLE7abDSW7W6p*4H*`%N`w#)O})+6;J-)%iZ zKZauq+CH60NYtt-FXJI)%Jeer7!Zj`+vTI|LVT=`Sj&78ak*)!F)oSXZf|s8{rEHH z3l8GzqJ9pT*73yWq$<1oVysFqt4_hg_(xnp7f#DH#62(qOUtEv3c=o3xMk68w789i?lqJr*MIVyX?;c$ll{Ugn0~VriszUo{Z4(^y$+-&&gRy zcGP5_N?3@V`dDQ04Fd=eAe~L5HGXCmZi$azvOL=}0X>2JDeqI7(Zo2G{j%SrtU}e^ zoV3P2fIm;}7arFQMi(&qkeC#x+$NFRwdCgI`w}HZS6o+rzt}MKzyC_&Yh5t4aJ?*0 zU)T`Q?ZbTh0dX2E73SknJ_VPz38P4~!MPKvJooLCLCE*m{p1k#hzO!(?@2nvdbL>j zIU4p#Sd;T8h8;eeRJK9OiELbM6)|%^qsD}K!(@nI_^+B)1kJBp`4he6IyeGR0t+c_ zk|b^_uX0AMwzs)g5WyLPxe0DrdzH7d&pbqIqS@u>3%oqw0XdUECm8Y(G>3uSjsYPd zoKow-xDxY5lGW=yFPZ zZ-VKx3hv$2ZU~H8>#aLa4=d?WS!nH1jQS4jvEfHfT`qbp_Jll|v9-!O`wa!OOgvo8 zDT;0mWsF_7QF*&ff+c{c*Za6gXUmf5gtq`W;(?LTa()Ut;UlR;4e_l^zJ5sxv-hvb zRm1FG_bx9=O=`WOoM_g)d*4zR^f?No@psAnd6Cb5R}x~U8$f~j4}C1Czfw^Dem({D zS1=R#yBZf`0dd_5jXgIwVTLPK8y73+S&$V~-i;@Y7dZ9cH0#7#6~HGQnp2(raC5N_!g7(NRq1#8QYkxF2z zopHHi)^inPEvn{jB|es!7^QLPJ~O}OJmH(3WAanHj0whgF#IkoOyiFD^`ye9S7>Vd zG6p$K;?tBAn+FVL{?Q-b+|h}tY8Il_E+eH@qI#sRdIRwX*|Xc^v0V8-%T69!9La#! zYf;7a#sh^|8Y%R?)rCpfb2ABlRd}>Gfjvs+z5?^3jqb$LT@iy-f#4QRBK3_~?l?aNM6| z;#aLcPEBXMWe^T$*h;5FnLEPUmMC*qn}_LwM7yo@%8TY?)xX81thewU#?aUk`91@z zNDVN~!gN)b0ah?TNufSj-l_BYZWQB33QC}on0=LfhEsf<_;+(=2;-YPe`${i6MyA~Xm_TG&uchs z=YnFJI4Tr9ke{YJmI=5lPT*0wB>la?r@w1zwlQjX+#?m^Y_)*gX*m&dL0cZ5&Tcu5 zPa(tHUcBIpn_y3CS9VZYC-txF+(w4 zGxL)9Vg~d32dF!6p>QA(56f_O$k$H=Sj~xkL9nhmvAaM%YoKThdcq4oKEkPJ^bG6<`bgse?l?-_96$MEF4?a|OuF@V25AWQc98{1A~TA7zYPF;ZsE zgs`6!=-l>G^Z=k~_#%6Mv=h*4>JPZplR{Fh@teF-q*%0BD*OX!S}NT1^?x%zAG%xa z6n80Yv5U|6H&Q~DFHt4~6RJ9bg);zYhNDpBgtV#a#VA9Z|YEm(S7jHh<2c*m#K<@|SPJL#MG{Tjbt zvua-?>7~!CD=2zN>)XAV8J|%E!0J0r=nj&@(!k$Lf<^RPBwOfLQCW8QB)4^_UqtN6 z=4wuI*v%58K7PD!h6dl7;oW&=`n;NlQ(z7MX;|;1x>x=6^!yQtoL%_Gmt=!yhDV9W z&hP(%)FjuwuuH;-NB0jT>@07(4)!wYwnZ0Yfie$EXLVcs8%eot?UUaK953=<{AAJ>2Y zcF8Ee*9sP_Xh9aUslQ!%%RgOKpB4azQ@8b|p~M9s`7ll15p561Amm;J2n}b-XeR0m zlxU(v!Z^#r0vNjL^l0i1LpoxFN zdiC);a$mQzbu-}0!~(4~!Uyo+=0@y~MULvyG?LM$T%IA8$;c(ej~UM3h##eK26axw zt#0K%k@n}0MrO-4+*<{kQ(1<8+CP!jVdiinGu$3C9!^hg%adf(x=TgD;QmC&N)=~U zW(E(uKTt1nV_u5AN{bIF??E}W+2X%2Kj>JQpN#0`8qm2jBCYU5Mv{eI$(~%` zIPYW0YERB3dXRn$bDZt^fq%C;>QBa>{hFW@&LeQLeh}K@A^jMR`93JVxHzzQscfVC z%*Y4(aTL@aZfhG!puGFjb(F52l})@+M`bKS0n$S}c z!H60|I7;<}h{ITfT8N8rZ4z2H`o=kjq_t4 zJxSuPInPyI5zEG)T<^LKA@y#m^~&d%VMDdg7m(s3SDs{Szb@;9G9BW)NmSRpZrdp= zm$*2#eOEuWxozj@$GdJ@^DiU||HW~df_`kJq(EfLHlg?gMP?mV>lL_q(I7nC2MR;g zKpoeYDlC_jJ*U}E7o|(Rdlk7sN%4=#L(WkFc zHP5}oxm7Y+GO%$kF@j*pty(aUGEQkTE9frS^h=haPlVV`8xq^71hLX;lITJpmV05T zo}UP$-6M=9UzltSZ$@0%%bjU?cJ)>Eg=6J`%nOTUTcBA3p2R$raZ^#Xs7yC zn#xiE;$mTfcgVnw6gHU?ktTQ8Iu|#pXM^LBh`5sN-t#HWL9mBXRibi>G$lud_oEy3 zCGc>dTz=+$aqWa5lhJyA%F&~7tjTm8*_kUc!=tgc)8d6&qR$J90^MoiUni;q5UAc9 z9X-Ha7n&QNXm`Y~c3U3)6$@4xy(udrG+KmrDRX*s^q}x5a0enJNGq7Gz&>~nu&G&P z1AY!6(|dd|dNEp&fhEHS{b|M?V@E9(He>Z9Dr^_K7VaQ;?66F@eKSiVi3kL}f>wGW zE`GyHZd69?R&G{UDrX_RdXtU@<+w7qPIl5yDFUYuZOF4T6m5vhGG$aAzg=4JBq!gZKZZqL!VQ1^ImVs}$rYKQJjaR97p&tk z!ZA%rLrGI6E8s)D9Vp4gQTXI|vAaZp!dQHuaMSYp@9lwK_6vo+QMhxN#A6?}Qo0=f zAv~IDNw~6kxBf!|B=0h|IPyd6N!X_}e!lnjXf2$z;n8)8AxdxDTw9{3VOgrP3DJ8WB3L%h$P7_*)IOeeDZU zA#{?mr+xI-DG53O70N{0%>_bMeNV@J5hT1jSX1G0M607+vo4T)zwOAc1&#F!-P)gZ{L`j&w$i?WHKA5Avm{sRwtk;zerl-6{pUS^zye^WJ;7MJ;x4= z2biv(ipZpsDyknmX!xDBYx{_0oRd#gR4X5mDV*U%R>QN9|i4g9Ud1kz4A8~dj{ToTeIG3J6CA=(!>A6 zBJpCQ{RZ#wU1+acxLwF=Xk4VRH>07*{?uBtWv!%~bn6|XP)UY{M|e}P;Y4fAwBCN{ z*>trxcW3DxXK~ei3WGa2BO?Hfu~G5#0z7@u(9*C-&QGLMbbEn}lS&ukz8wy9mc4Zv zIO7-kJLSJp$mp;;_T|a|thUdjjE>%K=sv%pceqj!otnFJo>fF(!#(yox8)eAidYgf+z@~k3L#;`-IfCKV)ycCzd`y;nMRd2 zVv)~aFyH2E`spm&cAA-vZK7bCl2g3I!W6?ZlyYiipKND}_d#Fo5!%YzrzNLsA4Wp5 zWVN@dujHZ9&H(;#TfXjN!$nEz_Iqn44yCsKo4GNO2a1_~xizBQHr)`3Bo)zHIbL|Z*NAh(aLJwfj zx5<99BXNAJh##r0qi4~i{R+0=ldk0a*lT~HdndLU1WXlL^bP5ENpf)a=-?#sYrnyL zNkZS?FcHYG7vT3qSZ~lmVxwOL!0oqyR}9vo|4s^}kbST$O@DmKzRky{&eHQR_hoeoSe7rC8|!a4ePm>79MK(urgj zyl3Ih@gF!3Bq4pRkEnaE*F}Y>*XN|$RUE7`YrLaToa_-hvVXn4v zCyH~4Rs;f_0@U4NPzco9DuDRO4L9-*4W7{FFo=|M*JIE(0mVYw2gS(C%u3HIh#kxD zIgZ?h-G;(Nk0Zg0Uy6Orv|b&V>=U^s#ZRX#Nm$HO4y7oTh*h(KxDlv8pPI@8nCW)u zn*a=p>AEc!NZ-0)mctnN#N$Q<9*b1zkL*r5RvhexC6CP)fPCUCOm=H41ivHQR&M3E zV@oPoPjx$7x-FJXDlqQKI8*>B#OeE~-t)fFyKaK({Q(?d27q5wVqO5x2I1#65R;%b zFV-Wb$Iy{QtM>_!{>mY+h|c=$i@T+q*%!gCK?m6vyKnLLh0?8KWM{-aXLh36J7CgR zlT2u8ovz+!HJwfCT?4bs40R5-r6yVQ0|l{f2w-1`SPn&uy~qsY&1j;0)$eh~?`CNu zw;qugYL)U3uue^G*8!LxvVLn7t6;jUz!V`#s>-C9%53+7!4yU7?iDZ(8YPW&MSIy9 zD3H0J*Lf$FOJS9bV?$(SqB`w$vx08JVCb2>al~%g;8oLF?=P^1K3aTV&<#1PbA&v> zDIk~Vp)#)X_$$^o$#G#9;af?32M$w)!(s3X(-KsS@YOn&#?AP6?y#bV(=Zaa-zoM# zvrJJ0PL8r(LAU)Q_TWIbQF~Q02YRhMSg-I&Nq~%EDd@Wvrv79a>;nbyV9JA?fzcVU z6X;ovYS9$19a&<}9%n2rdjSK+~N`eWA{)VbliPt zIM-P|6n`-ALFA%pY&=E$mX8)qFJ@=?vQbjmm#k5ctTD>}py{FENBxStDXVuD(&3?@ z`{Iuy-$36y=ASVgNVt(x{)|3VtbBuB@3CU#g9bS5{v@d%yj-hb&zkKl?__mQQNx+9 z$}CLa7CkM?Y8FA*4nJkrJvipgx%0RwciX$!#Co+QycG=Ga9s;1i>gecU zLm}$W>MEQUKKoS8`m9+)2yR1Abo^;_G+DETOMz;yT7RMktoBCdiv6YRpR%8gffXGA zvQ&(Dv;JWwBppX~(Xq}c#~Y^A2($j6b7&FvIL%xkvv)2xDwYJd0N?1RuNKKK>)Gg- zjL;#{BpX$J%Pf{WiZacvRQs=o_>>E%6@H9uLYxzp=v{%TADyVPtUF^xFl?;|gieqH zr6qU|dLx|E`TXbI9C4K^U~mriM^~0@t;$%DNAc_smm*N%6a3u4-g_&Bt+Bv%sZ|_4cISoxVN|W*DNfmnq85R6`1+V|Jx zKDT9bs=$Ku0tBskT=Pp(`BxIpLMj&NHzYb%hNJwUJYvwmty~Q}{?RK)fad!tci{pmV>RbaTRpYLegy>0@e(IW zB@7F(rCUz}ARg0+HWC<3-v`MslMfB5h|PgO>6MpR_NE~a74L~qrg6QA^^o09|B=+E zf}YDid>Z^d6iv>*U0nf9<7&)0$LOH5-Ii}{$z-9rv5-SDK8%s%zM6FlLyyago)lG1{a@YZw@MMC;ak@r$gBcUm=x_}gq_x5F7o6LH} zWHt6>)g-gFnXGG4Sb`$UJNF_wZB=!vQo#)TN^ljEGH+lx>!DCnm zA8LbYZkUEj6R;gPl@KwpyT&^uX&9;+3tAjuX^W!5!}LKwD-U9M<7X>aO-C=10Sd+j zF|+>XPZ{_yFxojJ7KcP3^F@M($glU3zs5y74~@N={B=UK^RQS)^4Aek^2y|{g;MgD z=GTmc!OQ`YdpEy{rhc4vQWYe*Az)$!LzDg6#5iy4f+ctA)U&+rOj04E#@i~EXPmfE z0giyxNQ7&3dthB@bkKeNFE=Pj!yo9Ll|HlJw6?611#D-}bd{;@xT|a#aDd9lDZ+wg zw=STFEG(z#N=b9ugls8`P`Lt{O5l`ik66kw7G00F8xdh-$Ym=f1d5mSs4;*RX}fI< zc{I+7Q3U$5%w0P9hpZ_Lt@Q4EB(0=HNycS&xC?~@BC5FyWdL^BQ-v?O;&Hp#X+4Xn z*kupeC>yxbTUp~>i8wC<`NRz63$y8Ev{O9d(rVtGarVaN{%g~wO}n;td^BL;b~x4Z z-N2ppt0TIsrU&SPlaec$467N%cm_z*EbI(p*{M2eBFY`hZ@coh(k$np4}v{{|G(A-1oEyDp1yxh(24j*&Iwi3;_B~~ZL0E~^8AKF!*3eG zDPuLCX4;nv-`Xl)Z)COQk{W(4cC==)Y8xg0+fy{(soNAS3RumX=$<9T$>S;SXDPLa z{X=j&_B#PB;~H%@CdYNae%*?H7U$s!Rkf+XeeElQ)0nKrVEnnsslh!=$KgN5wE~^JY{@9tIJ5f=rrfcQH$N0bcYd+C578A4OKIjAt{Ql)Ge3dsz*oxdg z9i+)!gC*i~Eb&ADarVF7SY5ZK0pEvTyrN(ngR6k)Hk9t|K)H6;-SJx#;8C}Jq z%;Hbb{K+wYvdy1d`6KQbK^$yC--B`y9)mW~6S<4FKsW4#8z}*~vKI>Na~App_MGUm zO6kLe$oT`u<)U^uHxsM)`V%-1fejQgJMkv%vTY%GhpMuwb)nQD*Dc$CzU0E<)Un#| zHADh&s@VYkn8>bzkD;^RHmIKFuf<@?f}xx)^?#zZjIM|bO#UZ3%os#a#JyKe=be!z z{w?q=8X9}k;py-4@I)Ev++gBNLKygFfYW4k=LW02h6@G5ct7a$i78ZT7)$fv4n=@$ z>Zm_TCpYmDD+D4zJe#GhhDaP+)<-1bhpf>>CTx|=$x<`l*mo2UlN5)mKS;DFOfU-R z_C>U${Kx%2pg5Vs5-X2x&bA#@-nI|GL_-+$bd#+;P!BNNX>Pe7HD;^r@4zAaLhL2} z=*YXPy$j8p#4(n2GV6)aJ|&z1(cJ)<3(DO?aOnwsTMUiAAA6H5`weG2TFcNSBKI(o z8cxb=t~$BbiJ$C@!+a!ko--*xnDI7cp|uDU4}Y1&yxCZEZr1VY4({=Sf7kKDf!RA{ zTOOu63r_rFL@)}*x=HZH14iDpmL02*le>l3XUW|Jy#MQD1MlCI^zC+^PX5X?Jt5OfZuhPGlS5HLowc8A)S@9C-6pB#Dt<^GNy7 zutUc<?V+bGMcLvV{09PHoa*q#eH5);F?%JVson;>Xy+HWK+zhKp z6#Zgx$lC{}G%*=@4I#3K5BFBa;6_GEVp&^1dh3+uIHNE#Onj{>S%@0x634)RzIbxY`b zPb|_fDr5BwruXc0{;^6s+|t2^+htAZy?y>(zup?}s`a*OlJo{+Dcp2ZT4$fDjF~IX zZk;mFFeTxv$bwNBA(U@O!L{B|n#?|KtM$5!MC#}486XvcCTMxB_h?@xTK;!6GaEPY zTx*fUQ>2p9xXf)W2biuaQ$@I`379?=O9*Py`uZaS%%e+I*&cC+ZaR`X9LF^VkO32X z8?kGOIXSGh*SVFBHbycu^1Q5IBr${&Nh=U`XI{Yj@j!LZ1hcxVwhdBT*ZgMW3z?_Y zG@Gw3ecc_X@^u44lP_Z}XqVmY800S72wE#vieTBUon2@!1OC~G`e)yn?9$s41+KPJ zEZgmQ(?JOh_h zP_)>rl~dX7PTT05QJ4^~3K4kH_=_65vWZyo(i#{G65sNU&PYV2rZu!LqS>FNA1z}y z%hqwG-GvpEw-Tt^L|tK$cX?<2%|PNEfUplf|1s(e3^zGiVMM3h!Lo<%(8qJ4>%=;O zkbG^h)bVqbdatF~gqb+ePA|L;xU(`k4#h}{d*Orr)c7X&}<}f`%R(dKVib1<=>UKiSpdWZv|!-;2&c({X#y= z1K3+9>I)K23$abCdJ#^Ft6dp3PK@phm5`qNdi5{aVr)BiFe+{>4tgRzd}%ds;?UW~|K@Q$`~PvzMA0 zNFOsP*J`fj!!6IUce(RN(*pGEN(RRbu2-QSTu)*cb~_aRd^x}xa-8YKzB@{vy_^$R zI^r<|MYc)U>t#9P zbBVKD84-AjYEcxbVOii8ft9mz74*e^TIS(K9tQ%pZfJ?WIX=f3wtCFXrGm>D^RSW6 za*B(^<);w>pzRlP=icOuZIeOHFR<&{U;@3ZR~XWd9}{k&%RBhT{+*0(0Wt5J-{7lF zAIO<0P%;lMh#7*TV=%@DYZ*<#T!-c}RokuNcULB#8FDGgMPQqIft(&FUHrqu}2JTIzOTVHz&=`M}wvA5X?U`L2@#CYPfyzypZyDehRYv9p$8=eX z9%F0qH`+-zysY8eC!lwqP@vbf+2Li*#A3N2yD5m@OvRY4`j2C3SUf&QAdV?(S(C!7 zMy)ogh4;4CuVsb_i3GNfR=Wl&h_GVXsUhC z^zs0n!h{DJWVDJ!OwXxnbHd9Qo3&^%{W?EaG?G)SnPn) z{-y*Plo!shhIn#y(nX-w8?{~6Xi{{4BFwEBjQEKx49BSWqzApvH<~5v>f5LeTUT@n zAC2xKfK+t#%&hVT?$N#KGz;J4WS~(9pCAu82xFJ@RIiS6L&|Mbx|`+r9)Z&f(JLxEzMjdOw|T zl~eys8oVHfm$MUdhzgKSRh5@WDV~$^R1zM9cl0CfU*ddiVs!7JR;$CjR|Cm}bJrd0 z{*26*65E}H_uL11+e;cSO~jlSCbAc68I0NpXrnJ>+w1ijQIK~qmAXn`LxChl1P@c3 zcm#?0Tv1V21qFF0gV52P5Y%9GjW-F7Pd0$QvS8V=rv!ImkLU+xMzd}*Nb;w%uuk|f zsr?4@m=37N9}rO>bT@UF0lkQ80;Bkyj-rQAFmyt-;!aMFBFBvbc>*(kpUfwU5}cf@ zByMnw@_4Kb_>*e}%cE<*s7)K}P2XUkwcd9IsoGzABs$h@feh>J^6v^gQFDa#%ccR7 zdl~n?`|lg%|DOLYq%7+LXgq#pOh-WNB1vGv#plQK1r!6l=f11^MZ08w9n`-1VD%sO z>)-sJ>PrxUuiU5d{xFsqCOjEuNLNJ=M8UGAM@aGlGsan`bHxzP@$=Xf#SB~?@a?Jc z7ECwiiHLupDF(C?aW*`)u7?o(JGr+q^w$~t#F#7d!uf6mqDDX>9TAv$2gYhg)Uq4* z5H^Da!Vsm*3k?Dm*YHGko$#L*X{N#T16(Bi~UIL3$L`HMJA;%rzIn_zozc%XQC%_N?{XdPJ z)|fR=VnYSpX)vKVwcfe160)KEJ zN8&StKT%n4WOQD5YB4K_Y0*R?0i%@4nl+T_SS!|e&zpLzU70teqhW;F9l?9{M$Q=; z{<=F6bKKrBd*&a(?V^zTh6&MiM;A>C&ifV+!g5-s6b-0IEQEMA&Z$%LrzV?A;~%ktgZlNCB(g;|Dr1b^#tL-^rqX+SSPZg@WKpEehU0}H2>%o4*`L&Uucy)nqv@l~c1juKNXOSC ze(=g1P~ez<@nRnVqV4(hhhXbA_egJ7f&b1%k_<8{c1E`Md(S`tNig(&GG-Z)Fy}@^ zmieQ{M;EWSX`<2CRtz)0a^;UbKTqsSWxLgYREeqDe`o30`5cI1DA*ov>$hK0@seK= zN1N*}!RWQD8x(ctWl6$BNhmepBhGu5Z_++wOd?PA5N&X0KmQ#G{U;?#DIpdXH?ZP` zFP@uG4EeaLBlFerG2x!@+Y((@alzib>w`Ht-iN2}Nvvgs5{x`)pN!!YF`BS$mcH>8 z91m>lLFgQhWpjky&@gUvEVQXcWj&F%6m+r?)F2Gh&9QX;Fh^-SLGIkj-Zg5egGZDWZVsjj|@muau?N@X&1BZ ztd*ic1>TI}UTq3vNcj;LD-}-KOee6CTbWG4HX&>Us9P>U_Ipdl?6Ve~#n1RL#@?+r zfl+&zr|I7$y)Y4bg9iKFKk(_D1Rnxpk$VLVoI#>i8Hy={QZcKnLvb}l|FinuV{s>e zD;%H`=U^~3k8pJo%L==s*S-`EGY=||2py@LIxs7T^dX-r=c)Vh#IMBv9pvQPOE|>4 z7%57iK>a_GIBt&2T1*^UMDIgB2j~kv+Otxl#AkDW}QR-OW zsI}^t8Fscfq+#9)keQk&dB4iPCg0n+%(tq;m<7X(L+cHfbk|6w-rSC~XVnjdED3GO znR|qH85smugPvTq5@u;&hl{|aKs|I+>C`slHkw>lO1GUJPmj>FhB`Mnm@zkk5is!=x|>=D&T9a%C=uKh_zZU$lz9J=<2^Oq&bMhW-&!(5dpPTR*;lwN|}g5<^m5#`{xQ@?50st{ z6X#$5!6o9aEZnP>m0#11J`^3JaLUV05!VA{_la&KF%YdL5p10K!^IeyXB&>k^XE0s z4HUa$TdY+VwG5as=Cv7C#Y^%+Hr!ky)WRb7dUs!>D-VW#J=&F}rtlARSd({+c=@$B z9bi8pqR**~JU)Rw{WDtE zrs?9gZ;g3bL-Er!3|+5xTUytlqspUQ|0Gm$`1is%7+z`D`_Skx;MJ)I7Fi`7@xSWy z`|S^*l$C@&8#86(ydiF2YDf2gf#Zmnk;F%1A1+wgFcQ9@z?qK0W|AJTNsk8{voL(h zO3V#-9}(k9M;yu$KxlmKcAlV2?e~N9FZe#PuRq0ClEl{B`=Up#Yjrn7fMhBjhtVhS z{)GmR2={bV*1HIMRUjy zCOGI;_P_(<$H{viqkR6Ehi=H`83ITEwlG%IgdC>ZdImTJ5qLBU?Kbolh-# zInnj`!dD1i`!kAk>^?qq_L@Vo-+ndpSC4nzqsnrkTTl_%s{4w*#HU;%As-?~KYr|9 zHV>33Bt`;m^!Ohb(P~$|5v{O5($HzXXaz@HF_Xf_MH>*zayYrEg~+mEvmUX9@5Hz4 zthjDKnCnnDDlSNc+=H5k+uwT$Kz%}AE745#x)n1a_ZWS-(IJHqR5o6y7IFE#+) zW4<|#Mo&ClisHS4)}qFn^QlU2{tZ!&_nIjg69;CL9Zk}Hik@6iR8gTDlUR>{qc$;jrngHTx-cig1N0%_wA${L zF9Xs<_yw=}RRJnS9{2mLNhDj5RCkw~=GJ4=IcAsD(#;MO?cNdmow1BAxJU|mAydm~ zDAqBoH8|5{>42Nso*@{&cHZ+@`ts*j)dISd>qva)Yxlz-(Rn zmouP}qOrq@5*Ia5Gj8>@dLn`}O_t&WnH($ zu|*6Xcc%<@Y*Bo0r08_}FX7Az!NJpOy`Lv%Dvyb6vYNyYXT-Ld623bT{%ut?)?X%O zm~pvlCS4w3+T%=n3e8Q8Xrn!~l@etNnv}Me&G02Gv7KuBEq6K!j7?VQTiknMm&S|Y zZ_msqCP0|CMf`Ae(c7NVs?2kwRt)e^)w)`*r z-+V}_NnM`R2JewENfBd{+JMAo1NpAu&UB)y`~Bl$Ubhm5*{OZ~%Lzjz>_@A;-zXsc zA)J>!1a&YkTRFoP-@m>wywtav0&5UuHH6GsR0!RrpxXCt6b#Np1otN_%KNUecK!vZ z?QY$+c#h96G7K)R0ev1tp%psMYVVgH`4g3J+1t_>IN7C@Ktn-R89OLlCaktNBb3u6)dA;eXig$9`@at&SszX4MKHvj|Y? zMlOXOR#!p%KRjN`lbZ-*iRSl^oDomAHExR^sr(Q{(&xiP5bIX!{W+GL4>x>$^Kr1} z#a7_WznW?Ad8_%Pp5MtDs1ag4bVjaN3dEf3^5p$WYO;O9WqdN=?=s-nCDieMNxrbu>N()As+KDg&^taUdn7B+Us4)6QEJGVLHn>sSENi{F*MVwVI zESs5#YVOqTAYT5bZojyr2PDc>g~Zkh$da-!QavIgSdHOqcUt>a(bZ;?=UDJQ#Ahow z)@Mx{i{T%+Hg_zjt8^}!AoH47`Ug=kHWE46`8VyksXXr*(> zYuU9{#r_FM|1@4$K4R|EB99^<`G~S9c1$Xtr4IOJtBr7JOYM3=FoC?T zOVnt)!ME+u9=oP>P6qjDvC8Sky|{|3F&z_uN224pu7I;N4JR{xlANr;y)?&?B}3i* zNouGc*N^Uf9SYGhy4p~1`udZlS02}DZVIj?q;NYAI6}7DH4ZB%4RFpi*=$JN)3$o~ zA~wfTVN+_uInXVKyk5q{ zXD!{kkSRbUrt&;-GDZF(0Q`M?0$M^jiH_@helhY3wm~fkrO|WJo`gLsC2=iIv@g!c zSa|i~gsA($kyw$Q=a+ZUzJqyUhku(|?Z|`7x%gCVWeWNhC&U;KI*6xP@cKD@Ah{VB z)twk8?7@6g1TSGgK4;QaC2)a&k$4M99lhoiM;)uuJN&}`e5PybD8hYF6yWW!#x6|kq z7RxB{S5!Vi@&EXMP!86F9`dik*1fXXtMYQyh1a=N`1jWP8IQUu4e4Othz{}$~pd#5>sXB{tbJ)=C^mDkGh94-E+2T zM6;cL-Yb=0`}8{3e5@v#y5JUmYDaqESYwyAlvmAgPWj!IMF2tHgCl2i2nuB{bV<`6 zGi@&`u#dyWAAG1`Qi955F> ze*zatVQtVMJJc5oPE*Y7l0Rrh!gSEkB-;{S@*$}kO66$WulyUS>Z^tN=+Bl3WJ!a70OT3 zc*8p;eSF205yvO?|DA7~c$x(f74UXOuSh`UfsU zIq2`h;$}n_tE}upJ8~=*&3KTEu>d3^8R~Fe)m1}=5(&_&x&j<8hecw;lE==#5SOHYm4yvwQnCzNa(e4~9 z?9sblla=0y7#r-PI=D!&ebvD|dfJC1ya;pxa@Y2B>PW9~IZe2Uk`vZcr(7`Il z(48|+V3;;P)I(L7K2+6X*yt?crs9p5h}#Osk5HQ6VEV1Ma7HM>(3zj3E_xY7*bH_h zL!ZY7IzLjMc;grc!8CSb&W&FVs%JP;H5^KAiNCe(B0)&SAq-yfWG}y&>0>H?(fW!rdDb}{*b*#-$> zNk5uXev9RmGo0uRYFda5!|-8mIBM27!3kDqu-V0>)~o-C%&z|DomFWo&+T&OxlyS? z|A4t_Qe;bBVNDMHq+Ib+<8b!?`_TA@c9=)}E%UCxrioYaM6tl)YJmlI^kOBi$m&`P z%(16XsL8#7_LcpWm{1)_`|Fm6FLLq*qVxsGRB+TS7%Go_pZ8sVwwB!)RHBo;YAdLl zQ;1KNVtnO;U9;@DvDp{#iW>M!YCw0^depgc5?}oUH5mDFf-z3 z)IIhJ*7edgcHN6r@@2JMcj9(=Sb^c4E|`IOf}fmkPemn&7991rJTky44O_v-PsY!Y zJ8Gh?YmC2D2^{YVl%h3;EpNTqYzCe%D;i`JTaBn}$P3BO&rLj%>m09B;x@~4W{G$$ z&$+(bxo=d`+7w+t=CpVcMQ)B;bdECC`*xg#zQ^8*^7mkfY8&5@#^01b+)04tdgD|X z;hdRv&f`ILREq3riya{a=zo@T5eQX`2Q%-B=NPqX;H;DUogioKD{>J?=uqbT-1tD3 z-np%VFLtoEM*&jlyiN=NDK6&1Sx#xIVo$QNZh^z)cQP1NTvUhAZR2j21+v(-Pqs%F zSqomqS1Wj>HCybKvxvLptWcGC(W&;9JC||x(JI|T<#cke&WnnGzVv-1Ye5B5 z;C0E}$5%b>dc29@1rddTgY#}uRBl9N#Xl>h3s;N11cepsOWuB^O3vLv4eusNUyiFK zNx#_$*VDkRuOKBW?9#dHJ=D*^n8V_pqVb;z%|YWee~rdNd9ea%Iyrxg=;ge!0;ksB zB-QIFpozbrF}jc830`h5WCq~-u?L(e9(&!5shNN$1SgzG77J#j6HJCH;v9{qaB z=5_uccY|s}?$7ljwoSJd$r60k>lBQV$%MT3Ds0?M)6myef_}28L+*37xqPjg87L-@ zNB`Z`KP3w&^O+QM7wnJo6`C;7#z&-<%)eb)t&Wk+3zVc|euw~+KEPP+Sx6K%l$H9Y zHzOr0enB_8HOM&9oI?EFzfU3FqaQ)Mt7f{${aj8DJuA|p z2%C-_zMchH^p#ehni*I!g#6vyZ%A(0gLNJ!IfV-q&wL!q*$$HAxK}KHe&vYhjy+B`5 zXcHF-9$>_YhjX0^hRY(2Nlg4}`0U6ex`PKh>?za8ou}&4KETSsLF?m5{c9Rt%t zN1?_>p+@#;0&P{C{qgJL(5Abc*{@j>WT6mb7`U4Qukjbg^cogRHQ71acc|5Ek*lBx z|FAj)gi8MjG{W!o(fOpkJXxk8Steyq*sv`{oj+8M?ELPrmP%#xEXjdquY>i~{e*F3 zyGOn|l?q1L`oZQ?<@}w?5|RbQ5TrJotT9T>5QFS^DL#8W7H8laO)Zt|T{>323>3zL zR`YPVGjyMtnq(N1lyO`M=MhR%Ms4+pdq-kSViauu&r1EzGdIOP1w*x4&G$GRrcl<% zU$|of8v*~vazi~LSp`n z952F5HZLCl%_g%|i4=$s+2ziAh&qB19kSzP-keJT!L)aBf_5ONFY>RyA>HEPh zCvt4j{0`3+^L4f@63w;vA&M!4qp^qFC)sVN#iKc4zH^YjGW}Jqg5BbEf2Vf^iM0z>$PC(|Ov3;TfsIbHaQ^dM7BPLn?nVYcJ))U_f z`B>3!H9i&^o>qVKTcILjmG~7*>S-_JBF0mM7?opAc1c1b#ajQDJyOS-zeq7F`WLCu z&KYbzDWClx+Br8aoWvDwt0pV1<}*L&(QE4+X}ZdJ*qsfvQp$|JE|tYZj!f^5`DCNi z*)p<@>wNk`fqcQ`X%nfUW0@7TeKsKX)k=dk>E3kkx zkZPChL2bwS2mUGLrBZtM27JCdz!b zKB$MvdQyhU9^H#zjzRysB1-sMbwOiQKBeLnWt>x1lR?!_Wo%C*;t#33IwAhU(||R% zR5Ee;0jY_`ru<~_uYd9zntGR!$!CIJwusK+c7ss`2mMw!|uK&GEdV9Rb zeC_uFqo>pVA=gf*P7?qINw0P*;_<@q>GT04oOJw16BsUFxpcxjt_#sX=4*ct;xzRS zlgFN!ShU?zEEMHeaVhTWQ4H8J$H2u|h22PFX^d6}yqbPIkyyN0IR9DptC6SPE5zU& zSqf^|rih=R;2m3XMs7#E0E)ir?R{Uaxdm_lL#9=AJo+wAqEbnvH zg^~@E?MzfB?z>NXpmIro`8sX2MZL@xy@H(|o#rZ4oF3V->lDUQ3~-qCD>~vAo;IID z?fDAQ1hLI6D;`;(wM*FX_%8 z>8`y>SG^#|Y;*UQrY$>ZW-XiS?^yJWnezsS=jt)c{!cJFQaedKR)G_Bck@YnSYld;jeHX3OOG)u+vm4ooT7bw7j}?VMNe(Xn&i zHm2aR7PP`HxA~)O4D&$lq9*bRu9VM%$RSwR!`9Cn$G}e?9 z&fZ@$UZC>6B3yzx<+?z@Wn{CWpewIh3T&bbZqfUjdXN*&+?fruYHn{wL=? zQsYH_#8eIkxnguu|4jEs3f?Mbv8;8+*=gh&ENeh8w_sn=KArVT2}ImFQ6&ZS?lo zFCXVlUObJ_5(0+=`dMHB=O?87g5B%X;ew%@H^{xvp4S;Ub>aMM<2N1i`cLpzWQSt0 ztH>KZF`TefC$0^Z7Buq1MlbBOEdK-S{~T!`LtUG_;6e|vy2iZ8{uOuhj12uid-vBI z%A8xZyvp;Y9Fqud%L^Z`4qmL1;zjuthddt=c4TXCYvkB4W7&GKElPnaBge8sm+2x@ zb>Z^qp77SZ@UiMppGb4BNZ`;ZmBztMW?|_bBl;{1f{oFmJ?(Kq@u~5V{+Vsw)^UC3 z;|AaA-@c$UmPLa}dM53;aYN=0j%@l@(h6c7Fw*q$q`y1vqPhLe?IfQU+a+?&rmg<% zhP_2{)?8!zJ)evXW9a-f#)d{Y9kybSY!r9M5$nY~ z`thL7nzTG~B0h~DfQHQF6BBOEACPRU<*vRyQto#3)|kJgTl_lBzaUqiEL+}(_A4e8 zY)#_F*l;P+aoX6n;CBgRfEe%A-%CN_$Pu2-^8^xy+b&8w;JxP>Yd0BdOWX6C#6DWG zyw4<{TPNGW;s<&;ZX>!cjTAH1b{QLb3xu!mX0rG<<~PZetJ>vi`J_a&ky=AL;y7D| z-SN`$vc{L9`r)DO{Q_e{rd0PsRe2-0axpNI57a~hptC=`zR#qICH|)1d%8U>lIr!^ zJs&FJi7sccmg$o|9txqER9Dw$Qd#ILC`(R)C-KF2>hf5;@Z-HWhi>7q7aZ)u?}D>w z;9oC4s}ePA`9OAIcL(z!upauQvG&rj?}z%A7;6WPkM2hL?qjUon7_$vyXP(eLdhGH z7kd+Ac_qb9gMaN1#`An`HyGO%I&bRu5@t-?*x>1Gi}!|tdgZH%y8D}=Puc!2X1(Sx z@LDf{u(OP{xqd-)7tvJFnjwTg^Mq=2e*Tuwph*z|1@A`WH8zYM+xaoWui}fiqW@Xy z7no;f0b7yaJT*UzwOqEuu=RzBOKZzjYe<{&Qj^x;ZH(^tNqGDG-q=uZMuVyPQvK2N zBVf-L(o^Tve#%q+mU(>?tB4Q42lj*%Z1CVx3r@%KuI>e<;fw>X!I4-h0c$L`H&$ z8Qp5sUxNo_YUJ|XOlQ{aEc+hfKFRno`2?OSXLfh}##+Te4j}|`nuFW6q>*k;Aq}MC zkNeEk;b|nysyY2ColgwaGqvxO|Fx$H(XN+{FhGYJTv9rbxPNnDUa)vV`rw! z*D1%(Oqs1yPMn!CQKy_dGbLZAe0ye!p;Jzsnevw`h0(;BDf?6kmy?}72pdV@@QA2Y z&RU+C9FgYiDMoD}c2K5^(7pIT$!ypd`IK4V^R$X};1wZ%uBC%x%lZVbNe=$k{XH2I zr-%NuL3A=C_WX~7+4Z#1SK63K8)c!dWdiA`1Bo4pOXgsF)B&Q7b*R`9I$1NN&<{G{rOT4zrEgkY|y1okK(St^32HbKFF){ zvfjNS{^2!mFB^0Flkr>Ck9k~uN}JDCFXMNcni~5XziTdNu~!u3|8f6Jd(E%coL}>p zz5d;&ez@}|k&WK65dH$-Dg0?>!O`$>Pw?9C@m|3};p3U1i69QN8Eb>}y_&vY85c|% zYm4hWO$U8_@fq{QN%xt8TNdK_f{ruW8-+Eyh1;YHT7KO4lWp-@VNd54H2rw%cmMO1 zjcy8?z{+Tx~{ zKnkq5pZ85l0E@t-9l7H=^ph%QXX^6<>hsLa06~7#j$Su3jW!fVYDWg+su~b7llvU9U2rzeAW6= z(FFA=*eAL#)GvNsefZ~`O7KkZw+267eo@`v_yL|Wx5%oDJX+AmpEKl>Zhb3xJ}H#L z^b+6W&^HJHqJf3+H0Ee+M|o8x2b6B}3FbzML;-wsj}EYoE3d?CvGrx2b{rew)^XmYHtXChIuI*BHrK5 zxnGGOqeN@ne@&n6V9Sl5zUB<7AhK(Lv0?qFXQUy0(VY?HoV=EFf*&HinOfL(|6lkIntco}S?54+Xlh>@Q#?bB*;dH6=cad@;1? zi{7$PxOR#s^2x1zzg~PSOa^6!GbVnG7l;a>8xvn)Re`>7a0Eb z=xy=)B46}r`hug)-IZpgDsB3-ci(L^mPuoFZa;g)K%mz+l4u@=3vkJi+N0GMnqM#G z6plm~lD|PnHQO9%cBwI#LARxYZ}1O}&Xg>2?W^TVpbY+0k2^vcTt^0fbT46(8`j@& z&JScj7_4y{P}qQ9^oK z`Czb{~i$=qnX z&^9Fe*`m7HUp0N%$87HVVQ|X3w2DSZgoi|AH)m7B+rxEt-~5&FQfnXbOgA_6eLwV> zef!NFod@70S1M8|tjU@$$DQTO;kr!44C91h{7P-IpRpW>Ip@jiF3yme;KETC=jusw`_(wpo?!pXd$tj(mEGM>bs) zk1iMI=Zwxz3D7v>U{@kuXg&Vr1cB0Pn@~=g7T2%cg89U26___POS>7(<24S)D*{luZ4&=(yg)Ag@L3mFC0YK~xl^=b z|8d{k^VLLIe4IF4|Az1Ehr7P=e8^p$i#HT$aLqYa3bV6Pq{m#CWo9k0N{F=@+3JZLJcUz-F`>yUA-ueRqh?tAFFnUo#V{<%e$f-UT3r{z zT`QINgY}xL)a#kF=)A3OfTH3^i-+2*0n&w*xupuhAbRfkZ_8X?e9Y|vF~~gIgV$Nh zu5r7t>VqrXF3d{n0zTZJ&Aim@224ew;%0G7Q_hoCaYEncEK(QNo`5Pa(3<9%r7u&^)y*P?9M`jX{a~=x?S#>s$WsX}i-Ym-! z_N*yRqvq@6cu71!Q2RHr^3R_so}9vpo;4|bfsTm1R7LB(P0Ya3J)c#UeYD9F8kUA* zu1}z!Rc>u%*$kaohEz}Rz^tlSB&vH)=Bs_m5pkb_GzoSR-juyluM~^8RPaW`B-xTI zVvY*7WV;prIqiB8Ja=N@y;*ZVSJ~rOq+sgs;9lmCWX*qT{$;UGSi99;{R5d^fseY| zyg`DXrP^x{ML>^G@Z6HZ`Dbgd;Oy-oB@m}Akfl0Hs6Y`BQ~X7(pOA_SQCXI1osmEO z$W>E=m%?!DtaWzry5!(+hK)^R#*HhWK~gx)iQ-ZxF}FWq7vPRu`n>)<{3`{+s1t>3ux zrdNXCDB{5;y2pq5t*q5%7DuYYF{Y|ggC;F}m_dNjthxV^I@K!YR$+tE4nyW;NjmCAKu)h91JFWfmNPu&dBB?9^ToLB|)WP z=<6~k%Xf7%t;(!YVG*u>y34QKSbF|3^RBY$1{Auh$6I;s>VfBXx8!iGIfljAnv~`5 zn0Jvi9Wq>O9?svWc#sciX2UT>h30&?4icU4OCiK`e&MdsFbYN4=6jw4^Rk?q+q$$Q z9G_Qs%OfMKx?iz#q?WOgBp_;CNUme=>vf?lE1oGM5z4Z2M%g*_wznbw>!vSyHGLvX zaYp$}=bqy(Q}ks%jc(n!S$v` zN|EbWEPw8I7t1S$rdAq8C%IToQF0w6%#ZS$9=X7(qV**T6>`f_Ie5DvaS0Eh=k11bE|rJPc0+&l@PgeiP(8e8H(aP5Ua}i5Q4bAv!*|rf zYj#7vdRS*ST(2Hl?1t~EhxK+tp?YA?uGJ2Ym*>D5vtl(@;So#y#5F-*l+A-{`y*4} zQx)*ND6u1hvyHXK`CfM|BY}gERlIKWo1!CL)`ES6TYGRgzk@4Nh59xcYfnTuS8?Up zvf{m;RmFzDa58iJo9vq~GKNpwx#&`9dt&&+twwYjvY+d~lv+Q+C+^acj@U`O%kS}& z6f}*ZiE_=N4wWMFY)WV=o@s<^a zR?qDlzJ)k&H&I3S#PvqBFAq`9B68qmruud__pI{3r9=ysmw3kA^YUfEUUg0QT$UaR zAG-`tjM{f-b9q@WzOYH6u0w-J9uP!Tu^Kr8u`7UOwfb=HF=*^Qj3+jNFXRCZB}TS+Bgeh;l@hVZ5M@c-CUf=^47S-t>;-#Ls~OlK2WlNUCgxx^ z5n^(Ff!O|x{K7lKixM}5Znq!8#NFG77BJ*;xmWEIJT%N^8z$_p<|Hz2bRX`;(eX7i zoS$n-5!a-rCFxXiV85_(slTE_P4@Vu;o}5>aun>q%8pONU9zonu7-mHk!{0_pl{r{ zM(rwG>G8LXeG6PAW4|<>62kaJQ(hD0^%w`5`;~qeJeNv1Tw2o}d!L+jKRp!XyhMBT z9YW8zy%pC%(wNAFq?ZQ{1@AM~?!zWPqtGm24WQb`j<{6IcRyh!+7)=5`!XiHS4e>0 zl4G3iHxD3@C?9tjdMcE%41NxUlLJfrq36jqRZzKoxd&gQocTYXRynp3UEB*D$kRfh z#6gX;=Vv(qXh#!HbP@Yr`upZt&b6uUwQK-nNYqPi6~NO;y2bSl#r31#$^gr;8d6oZWCM$6ISx*I)ua(#zNb+a$ba@InoE*-x^?Q|@Byl=2?_;{XC zOGGqUa`?<)-q>}tpo_gY%URT2O#G!aw0+5+4lS=S9pq66=A~KA6kRG(v!fq@Hq2eh zfMiVADLbIM2qSmn=RS~4osxeVcl5XI&S9Ow81E)0r8N^PKs!Oe#09+rHI3=17nZ3Pe@HPyp@4rPn|h%rQ^?uFp>c(08Kv4gp-_lxm%@OaXYqL| zdl5kVSUm|i_a>`|%Qd))6-#BysEm5_xIHPHLeo@W3!K8JeVeug_x1dy!>HIpOunkh zXk040iON*hGBv2ITf}S%97B|KJOXbMZISw$0z}a1U zTmoz**^1MslU2Ja4;@K1u8hzr`_s5P7mgTrSMY&xcN?{hz{Cm`h5rVa(7sDp&UNxV>3q3c5 z?qvNn-&4L$Lr<@tI^Mu4J&9dv{FVqwsFnc5eo|k$6l{g0o@|PJz$-TLJ_TE2+co*h1xxMDD5!yI6;yDx+W#amzBlX# z?ndLu%~M{z8;||EPpBlilBBx8{<_jb2wO*^w|u}kEno2O>)waZ;%Gjt@&5c_8LXYJ zT0qNl%;N(4kCZ7Wo9P_N7P;Yx#wcrDPK;}fSh`OEUq33X9mgvekhUah(Igd}lYXW( z7kXSthrz2w*gF7;$V54dTv)_mdAg+pz2z6mFd)8A?>&rCKLn9zg&Hmd&Ct~4rTblZ z4cMc_Bml&u?lRZ##n%%0GKdc5a z9)FXviTELO)Eij||BHVo`F8`%Dax<>lkg(R=j5*(8BIRR?>PuL$@ePvc`3h1wIpee zT%aU1bs+^lVO5Pre&EICz&eH}!&-UiEuvgBLPqHAOE2I}RQ%`V&%quZ=2rMc3gAHC zvzP84NTFi6H|C&dIrCN@MS|W>=j$Z)m8HMF^WBqbqW-M=)AAeDr`o&pC!s+1ni@Os zA~iJ^4^yUI=keQ45~YGVjk@c}YftjxH5;jUEyIY4;KKYOZnnMjho7*&!=ns5D`?<{E@6c1NR%^pQ=D7(moDo)dITfX|`g;QD*5u?vN!!kXSJk z7V35Gdda4N zVx4ld9G4@8$9uiBblw_;hld3KAp<1bal@QxM1=!8cZqY-Na+XPs-F`WobcG|LU%5o z>dO%OE1k{TzojKn^yMToo8XRf8F__u=txPU z088GwQg*l=_T*_`*S*i=F0mFwObky@FAzl*^C%GESl7k^CXbEs=b%KJwb2^Dj28+5 zGxyn%o&OEByZCx`te$ST)n(X`Z69~1MBNm$0#X{;8c&v)LrNXqK~%b^_Gn@Qqy=rZ zGt2U*#jM$Hy?PECWp-p#HV{H_GC`M8jZlJI)Pk0r{)!h2h_ourcB-RS$5PZ_&t;_(jO1b^bX5 zx$I+wT|Rwq_>)t1EdH0)RBcd19{)M%Oz}9k|!D;fC+7F1dXS>r!E`=oial>6~ zIa!kgcM3cId&H&PZ^Z0ycMHy9@6-F?tXEmq(w~iysUeef>HR#a$tttGVgI+xfnbF^ zM>l^<=jCb6M?8TVd+GO)-8H%u!`PJ%nq>yx%3hK1*=!jYiJ*k;C_G4lJv(=Crk_i; zFR_-|#3MZN-o) zzpKsAI{9rt+mSNO0V&Q;qyE{fe$>s#`bp00=%?FLPvxnnyHihhq@I41db%(5B+N$F z@<8e-n0k6B^|T=MRGoYZL{-5+SpTfhKXv*?^g_ath^Lh-49&G7u*;K7RxYtP<{^gh zWUp22(@Sn`LOTDVS^7e7zA_nK^<7z9SqO~iua$8LGjinnYCV;2DE^{n6EK`{i7g?A zE|0dTmhfgBM65aRf&db~){gjP0Do~O16V#|CZ~e#-=GNQUEoT@UZ4VYQ&OdNNGYTu zJM#8^uF(v&mM30*kxvq3_>y0w1OcONu!b!WYIXi_jT=)vG!#q99M1z{f{}!Fj|xAd zR>rzN0-h2UTBWXC|BzPK4w8D7d?mf4+>s*5QfH;p=L$FU9%kOUe;`Rk#!EI^>C8_r z$_05+)DEmBoKm^79j2$G6e&w=OpaQ($DnSn*ks*5aV;(jWdFZNzs%O$_wtOcI{wA`~IXO!4XAQU>Ex&@V6^X-LfL-{kjt@OtC^_eP z)n5O<4d30T!*_8vd~E_wM0yL-S5u#W_I7=$zee3!a=4()N(b#(zDvZVGeB!6wo3}M zhq|je8|s?+o`$;cV=n5d$A@cL5CC7&&D+>uxCX>2KUYmlg&h;~DMmdt4QDdM<#Y0! z?6d@p$xA*nZaMmy3%#80scPBHUhkA89~+&_&yGVXeBJB}Uai~Z zHhAHST9KBpV;yq)Q%kIzCA;aXp>a!~As7|TbvvPS&(3aem0)EB)<+t}an&wulo-6_ zpGp%5?6uq_Mf`i1fdYHKOtVHND!Z2}?i8HlX^Oat94P)|61WR;q<%SD)QLZJimY+o z6q|q@*vz1oJJx@urE%2_k(-1aGG}CDZN()S{>@IWeQ5*#4jFN%QPO{MVz3}KQ%Y!N zzE3U}kqu(anuy*G>35(LxL{O&M**4T@Xd%H832$s~)I; zX>oq1`4;CQ`B3F#>vqX-FGAETq_V_(%9cBCq?IjZyBnV{xvHYlna1*nK4q7-$@pbh zstMwwrSk=+-1%c~P1(}6H#~i?hr$x$-g&lK1C^3ZQu?sg59I)=h-k}BjiAd)dQ5;!$JjElXxNCDNB9EYE{EVp|c+MKI2 zP|0zqo3F3}mT!@;?I3^<9x{g4>#`f5R}n}3ZlCh@$tZ}PcD{msvMwJVqHN{y^TIzI zd`cx;uM_mPyB3V0FA?mxel(?@%X?AUeWM^qNlqdkHU~}$#Wx4KV8#-omQ%k0pDY&m zq-cqdyBh7s@6TW)%)FAMgjTyYT_RN1Ii~RW|5AT%RevMbYiWt|ioa36^54+ob*~s# zaN$_?pVy@5>9;&;dfFNsYz>t2cD16FTi^2@-P9}CC-x>U60wH~r!Ur1r2GCOn%I}s zBTC5xP((Mwu`ox;Y?kr8N)1q(GwE`*yfMBI99!!UT$`%oKQqE;f=e^UiKU5&Z^m9wtS`>*xt@}no~3cYmr;_*; z5;+9IAd!PYBG#(1{N(IdR>Gr3bt5qYMesCgg|wg_^_@5c;{7E|aF(N@hPn-ll*wjv zhP~{fZw1>9LF(saBf!|`(Jr=)x;^Aj7ZBi=KmjAIm?U%XYPdVez7B7B; zGaUWXu75i8&o}y~OaGiyKLh1&q$w}5r7P4FJAsFU|6{Xe4+lv@x0%QDx51x`m52Cj zZr8Bc^Aid>Bl<93JNM!r(5(-j24AF-EV188Y2t2~ffYDZU<0h@jh`2Ie5 zDX@kIvtqqfkteRn6_|)$#QE0F8H3-B70R={Lx@X{)MFQ&Gy~6rPQ>^} zi+IPpX^9xX{(9w{b@x+V{{h*Rn|7j*kvLJ~H&5ih zUr5}O6E)YFC(`W?1h=wA1OW<~8nvZnJa5Qf z7#1TkNQ)+06)lAo^$W76#xJNZB0;~`bTk+LLP%iI1ph`Mnu-=<#g9{?_CDP=TRWlJ z9sIP~Sx+j2)I6X6UXSqz{^F!H?H6AEPJ2qin6}g02{uaG7mg_mZ8orhhH&lBL7U z+{X(mUK4B_1RJG!g}IL#E5#{Buo2kNO9r=@!QD?U4O=WFG2zqc_0t!t^m$0otMMi9 zF97~i_9EavRanz*o>=HtgGvuhEWEBKe5wBYGL)0-Pk+@PEf3`%5YQJweE|EEd8Frn zrVZNunrNivYHqS+kgdQvCSU9s^dMQpnTtUprK~H2HHPwxm3J^GGV@9a(W8~xb@sSg z8IE;G{0TY0zr(dPfxep7_(c?p$^I^J9^_FLSa<)`Dt$rmqP_XsjIvhC`>feCy!46u zUFOF8y`EkEW5!A`{}+}L!tilGlKd0M!{Lj+>mY|od2_Hwpty*+M;6$q=>`ZAec z2(g!0*^$PRWrY{oi%tf=ieJ`)KBzy=D&?4gmy~|hz`m#MCCx`RDJm$OebBJgeLXNX zW0eHp7pe#L(w4%~{WXKq=t1y4821f^!1gMff=tD&1g%aItvi$JpH=gsc`W~H!X|bZ zWlh$&S0NZq{gB90YHfuYnEUGsy-$U1xQ))*-ah!6xY&xCp*sAP(PI_9_608#e0gsZe0jmw zCDKU4L~IfW`a%*!aH z#M%++Zu((~P#z*K&hVi<>SEpd$xl{7_r<@@a?8p;w}QA>de!eq5C8wxe}obC_7}Lj zJ`UKxK=7LX19fC)!S@-N&Q?4H*~IDGrM~I#Ox^cEvv%VN-MPE4;*i-{lS#Nf&vE~@ znqD0KWnC!q?C#ua-+tjK2GQSYOoPul#)#q6-82-<8J&)69*X zd)1>#st32iO1Qjt+)}o=xZru(DS|bHHv3P}2=%tu;~w&C;e2cvF}x0u8fiQg+1QH; zYY6YQI)A53mW{(Jp74KAGf;#OM~yNLEhAwb`Ns-&nHL|$ul zL(IoVw~ST#6506JO#$X9Huqv{$yB}mtEntw z?vTi)%(=u6^)${Mz#1^O@0+ZUTtolxdCtWzx+er8Zs;oOsV~`n5Orwf-yQK}Ja9jJ zaz;6Ft~x^~n!_f_B1}~?TzEvu}E@cdTUXp_sc%f<@RQni|;E!I;}auds@-Z-I{1bTxlWLngkehL zW2M^UICtKmpp11gME9rU{kzrp+`*2usJNoRk1j}r$7V=0W5OF2a5r069>WVbH;A`< z=qUKG#*ZdT@O%!mB>7=@!C2B4k6h#XfW1`>H z6N&xH={UE$xwsv6P`b64SnT*H1>K;GDs|4bRl%}0Wptj9I9 zM(vAaI}60$zte@-y_JV36uZFa7VpRmen6a3Pe8GYat0>YFZmKWTKH(L5&e%W{QAgk z-|NOB>c+qS01V%l4vRrj@)gd=b>sQv^?=vh7&m(08^}vv8eY2JY|ZcRHyO2eK_=Yh zEbbWtc7>_za{)UKc zL;5{TJNxcFp4cDQ;^+)yGk-FSXbUg+Y6;^4r-g7;&epG5llB$YJU2c>b6^M4B*Q;7 zmwW1@1Y~Qh6b@refYRzB)xHd4ohu%d ztycIR%>3FVw@6%a0U~~WJv>Iat#WhTX4yT!2aU@M z-8!BnXYsKXJ}$U1ejkc0i*%E7iKiuUu#5cpO`RW!3|Q>*Nz7^qN}SBzCtd)5U?n32 zW?{L{SRp%}ZZDa_0?$Qm)9%-JA0DJBlHJR{nla1spBs!qcr5=JE7?j`43`(Ph5k+$ zDJ-_Q?xe<-xJ(nelE_zWr{fDr3w)Kf7;Ce9(XGVmtsZeUY+?V(k3B~%fz`~n3~dVNqLXD$N=i!eb(x^j%D#C_miIF43AsX}|U zoIKI=Sb9iB6i=03=c1cz&UwzrO0tTA2oU#p*)4pwj@4V zs>hujpOAsR`~;GKxNaPm2bG2Hn&6^pW=!;t6n)NcUTSjjOTp0gc!|b`+3M0?tHR!X zO@I3}{p}|!mFgN76(hw#y^RWYvhN=6bANpV@7bA%c_3>K$dZ_uuNBdG;rA;f&`tHW&S+$Hfe4))!JTP}wkGVICc z6TBxr7;=SzFsga(ilADx_FSGxrU6w+Q_ z+8Zq3_u=6}9^NF<2#1)PJUCs-iMT_v!;WM(7!xd5R~ttd!?95~7gO(mM`1VpUG#}(r$jBO#8#%BfQjWiN6 zcjY&!g6<5&KQLL$uw;y~*%Fte3a zcKk@Q0-jax@~nO2OYy7}{eiR7`PE;YUmSX|sYG!jnO~tFq_Lv!#a<>YZGKJTst(1! zz#j9f@~raZ2wDee>j4RES%21P&~ z`%g&*6~DD7e{=bhFMgH6xU3L66w9jE!_;(9yXv3SlsqV}Ts1TSe;k)c5sO#@44dr= zaIf-{L7{$6if%=xb=ev5hW|g|yGB|R?yvb-+uz`4`{9~t_&z&7`y2Qce%5kUe#XYz zX2EUHkAt=JKPeC9$bj5(8b4dF_}Q3lekNDDfg8=wgtceH`m$b!LBrp)u)nH7F}%L&QCQwvn&q(z(4iofqQT)5 z6yc$R$UlMh!oZ8hb4|vYjrqHNvUMC&V0gs~9w|Tv7jad<3tZ%foF`hJmi9`YmqmBQ zWgIVw{gyV;*AtOvdqIqURi6Ev0%wtDbIOEzlsqfy>i>&8i!$_r6iq5a3SZs&5Ee0_ z5*w@T1jT9NC3=BY2d-piFxHMU0>M`w6yLtPl^F$wZr5FO*puNrq-y7FjJ*9I`Bo`! zwpG2A#B@!ckg5*-I)I=&!9pW8rI#t3Exj3aY`2YR+KnQxd>UBu}|bSHgO?Vxhdl zYfhFh1?EH9%|$YqQC)AFQu~o%ink!6Ze|l_0*_bi<%x*>u5P@YivDPBci|ri@s%gk z)qLpg9iczRx1WZu?s#-C9&z#>V!eE#OCtUigQv0D#~2r#uFzqi)GouP;XBRW@(!z1 z!ofry&B?GE-eutjxkhor8^_SI-Vuqn3JW2w89wK6eGj41)WxVcM>2EwaVW}=Cq`9r zU-?&JM$Af#B4kCTdd{|=JgV>5AhB`~WM{eSF?C|JM z@Nbo|(&K^gIyIgLQGOZEh3=p!do1IX98W~~Bkxi-xZaZ*PsSTh2NXsbZyK<|Z-6QQ zcE__##&f?ro<{V0!W!@rL-=aXKQ3d6bNoYDW_4;zn{Jy*S4{B_l^CMuDPEFo0dqU* zA3+IB@kijIL2b_=@B-@6Qa)Mpy+pjod|muR^>I5jUd7Lz6!hUyuk9@Tr?|^h&_`4p z`!3G{&IkqXu%>6%Ze2LTn(vcJLa(_spkSU>e*5HP`C*0kW~=h?i@N8VGPNV*{mz9C z&wq=nP3f~yEAoT7)^6~Oq@NXLAr-k_Uz^(?xa&E8Epc+0fm6Foh=h48^k*FE$MMar z!MQD<;3?P|M@Q;F$F12P%1e`ayoJv%sSM(au<1+Tx{07>i&&zz+%ZU#2MC7p? z>=fTf$|!NxA}r7F+xS1rzpLil$ikcq^GN9PxPd**9BEx#yU*+-q&(*5+M{9;qv-FX z=l~%=(UGltyva?|4$MO7{6cPHAYOEtmq>!ghEL66uW-@4Le7via~oF8W&RI?0jn&B zn=w1zmYRdNvUi(#4`_;iSMd|ST;vlRU}p^)KHWQfx|E;)U4byzC$lo!d_O(_*PBjG z6Lq@rodAlBUn1kpJ``FK??;q}-lWS-g|I%j5wR(|`%ya}K#(J>0{Uv~L1fqLn zy?p8y-w?vLpG+@x6t9ircrE-}C&%*mx7v-YVAhI{wiuljic3I69S#rnJMyhLutI9H zSDMelU({Bmz48k=3S^6FYN}~zKkM+NxmG5({AWIM2Y(@<@+xzSa~T2|U9fD`2B_~P zZ3OCZM8ZkHdemq2HuvUllUg`w8ZB%4`b;O-hsDMNv?m> zf*T4K-dA%?y;T;39n9f4+S3wiwYNK&4Ra)!Cy|F(TnqM6gd3=tX+{1`HRHI?!Wn7@ zGbFyDklkeFlv~9t$4XZ5=r|8PCOMEY^28mv3;v+SSA5MZTOiGEG0JwD>QQ&0w8>K| z;KthMQ0+eJN#R_^N}<5+`6ulaVHaF|68H4l#KKwZSEkb+f%~J4)kCc1!({}E7ZV$z zNEA+{($M&o*aK4buyN=|x(#6^jlsSp-1)~Q@uKw{p}Ezb2U~Z$MlUpiDxLp0$3@Vi zmqbqVGLN`Gs{Q$R7G0~ziG2jX=Et>1*YV51bVzJ}`JPF4>Zvp)39vxbKgPpYxm+@8 z{%w`expflAruOKSf2wW5fITzcyCx0|GNd=agrF?%edRjc6v{#p(S7hH?Lann~u7;j^Rn3q7RI zpDO3J%p`@4X1}XTI&rb5vzp+4zQXF<1>&5MP7g`QfGGAnRg>R(MrM&!8U@>)(3O^A zFOsfyvDHwR3Pn1jGTb2O01uQ>7hIl%e?lmGtnjCj zpygf7GK)L*98cnP@fmR?pItYnO8z4yCnk$7*e)FQW4y*n!!?ek-%#;VhO|%cIu;W~D^t$2Y{uzGCnJFycb6Qd+TAJ^(exUvGP`G zvD6xql2?3A2 zW#M+W_tlE4(t?Ma(7y{$P5EbQ|8W*~pXFW5K(TsQ6S83YIMik(=0Z~ZPsmBRopD5L z50$e*UP9F$8y37e zCWbk+)-a+okRzPm|C73W2yzngPU3(=X} zkJkF1TwyO>BO*F?^lee%*1bmbJ|7HqTV{oh?x~}8iKKaeD&?kj3IBsK)vSaAz9BFP z;i;!USbq@e(;w>ekJ9Fv1NHh%QATrMwSId-|2(gM*65!X_0J3XN2m(-$_6ZLX5h8v zTH!@1MbW2z67fWy)Xd3pb{A_*2kMnGh1v8z_WLK4qXG_gpBRe;2q$^&KAtm-YrHzhoi#)r7aBh!d%BS&lmg(MK*Bvc?( z?!R?8_d26)d1<;ei(T^@5}uMC<=e?_z479g+I+I=u{}6S$PN&@q%+Ls^27x~Gpg4_ zczFE|dTK=fi!zWKgZV-*a-_eV)*IJwXN2vWPs*}pERnEv#81N@VokM3fO_R(JAex|4EhoZvB}p&Xfm znkRbc0^G!rtNgsHOwRu1uEHxY(<)sd$Mp_lu{6Dpql*nnO!Uf(Q)FxI8eaN>nOkR1 z;F4Q5R*cATVdG%S#AmrC+b$j>+Z|L5e{1!3rA}P7$tQP%)>zVkgd%*D6PU$5t{4|F z$t`x)5-MPNgDij|wHGNIZ+!nt&qgKwy?=1>Wvv>=R?cEs>;voN8l(lZA{Q*z%F<_h zpJ55$rCk2b-rr5%)&wv1+D8UQYF^3+K5WhO$$ee1TPe&E$BYzzkDFwaaV97Sf;aJI z{Z-QM`sF9B+n+^x z&mw~F+^o=daO)HjC`iopCFXkFrFE=sKwS;;BzuD|$q2di8nqHDC$^BfHT<1s*YLm# zY;+b@WXtf5UX0aQwulG`QPXHF-41MpH9ljhEK_EeomKTz$(zC~)kd8F@C4FeQBr$7wvMZ1OwXUqY(d|m`#|c<~?!XW| zNARB|GHQMc!Wu~SZ!{*h0y>dn@PKWdH@@&4p?3UT<}QunepDoaKzumh(j7LrGHbZ& z6a%_~e%S=F0=;DMO*c=d@uVW|NS{C$-t{O>CHRxcjtiSO`K=~w-^o8lY;m97g_wuX z50iRP%HUHQU?{n+vyHX9Vh>iFDTtb##xjB|Fo#zFI5bp`Kj7#F68ri;e&k4OgQP)R zv-c~aHEMr<5@ZkSCboCvom(1JmJ|v83tu^wK##eTXz8uI$@DU!Tr&d2uaOOs$VtJj z>>I!KR^rw~;yVM)C&hZp0%2qROeFC26p0E$E~hk?PEZ&J6S1XIu7*HXnRDleJUfx) zZ7fb*{BjONzj{28EhqJ3FH~}G=%e^8h{00kMkOAl(ep&tDU4t5NXpAA<(nxlkCcCe z@&%1));w%i0I2-uUYCX4QVX22DS8vH%c|u*hgRr^Bs+fYhW|_1`@lzCo%#Nm%m4vH zCu&sC2t;g48oJALY$ZZ#5R%}ZU{C|t8ue~n*Xz2wh%EG1)ReO9CkKdw*e)gGV}eOKhJs2 zbDs13JI~QD@|cf7;&Ts4-R~UFPLdn?CJeEN+lTUsTJ6eR)@7Nmz`n~mx8&aB>)N8K;_XiPfj#hN6f$;r+h{Hv!3^ai z9@OOCX)j@Tu3SK};~J83dslqXF6XJx$zP$<`~)3sA30xLbRt!=TbhPL*GSxuN&apE z6x$bEoAk^_R2U@w+t}$xQ1e}5-@tCbNg4jmT3CfBpQp~4JI?5spL7m#KY52BJ*6f0239Yu?aqGwp^m?e5~a z5i|R=_O1Xd5L-=att0d9n#3f<=a@&^QC{9tH zZ$iQkMe7dimX@+ter}`$;-0X-S_d(!k*aOMQJe$H2hDj@-z+u=>m0GgR?V59JiK+26_YoF+~DHBu-SlW=@a^-%4f*o*VMi*rkQYL}sGq*q(43_?diCT(R64|vzS{)eCe_lPEz`ug$3|nIX+h9S<7;*h53zVunLoq ze=M$&!7oLg@p(eyI_4RQz@<_=Z;~~yz*{?1G;BSS=dI~3zCYKxA7V{N9KyNaZ@h|W z88{(%>29p_#79Sco{|JCIQj|zFl@X6uv?-MmgN+kwz@oR_F~-HL-v#C$)TyFy|$O; zd3Kld_@mN3?4|h_>=~{>0e0i!+H$Gyg4heZ}2Mcn4dLGDkC zE;DpdAny7n39qdm%wi43)(*Zmb`uRW zomQX9@tou=oA;?aezv{*So*gm3okc^=MxbZQ|* zo7BIa!M%FDcXNWPZ%*Y7p42{R*KD@-|2``Ds@8XPS5c3bxGp*g?2@&4I>AelS|{P{UeNL6BS6+SN1@!shx>0F&{Usn>V9S`{EC6^6eZr^IYhOh$r8{gm*4SyR> zYRD<#mqWFtA9;Pj0mD+5mLYsGX7}?97ynxU3(;mx*TfY9v<#nO=nHTd`+m+G+6(iL zW)Kr=5_oy6SndC?7v_5x=9Zl0d$l;0$vy2d62cDByyV)PQR@p*%B(M!ku1xTV|*c& z22EVHs_W9wZyg` z+t0hj@(VuYGh?=ECn+VHzu_(P8hERo2dmK$Dx9 zq;C7WEGA8k{dza+-*ch(^-cUW3#?DZd)>^+OoqOQ>;fw^lT)4W9AKBP=`T6Sj6CYh zjx$yFYkCf5*gOm%Jv$EoNScTZ_ge+`>l61QJ%5J#!4I7YvU=Pps_7q`$rOpNq_};b zW@M7}OaW7cX6sV$kW0bWrRU{3CJC;Y4bAvBG{X6%L)P-wIviQUy0|LvKKV`?1KM7{ zh6Ciofe*wU7l|VK**0NsKer#uu~Y2Pp8FEMTIqJ&D^%UY9tfcl8-s3dFZOvC=M-}w zsCt8KY{Pc`8@7&8>ogB0`vvtM;T`ZU%;DHw<)&z30x7%-acXI_Y$Mk3rmFZ)_ZqR{ zCmx9+3J=nx-W+Ybi8-lqDp(!lci3l&sn7xFjzUIWS?U&y`!nxxX7L{Bq6IhJH9t?+ zgG69ZEwZO!A0&L!=VgU*H3lqz%Z%pbc!^}<8l`!87P14!<4ch9|CdUpsE1x3`)5GR zZ09D~O2bb~p%z6VwBU&xXMH2R8MJ8lENQmUg}K(F8sttL!&IK`)r9))9oQx&3@Avn~vlvyo?o&#zpi;`viMV(%92tpdb+reiM-akQv?6S6sj{4`a6$~ z54eDF6gs|LP@D&yD zSzXb;F*->y{3@v<$d;cBzmg1Zbu}8UTZsRoCe1lcDZ58{J=%tPwJKkR6j_x^ojt-K zMSsITQrLRN#~ejXSDB9BK?&^psjeL5MP1!YSGv_>mem$JKUJJlAUC!=bMwFvb^R3@ zyC-h_wHY{3Vy9dZb0~K}oS^YN=ZC)`kKqO0k9^1H;f6)~7E^VRTb1yH@P7?N)TW7w zdBX|EiT_c$=|p&F@Sk)@noM-qW}HRgPgft|^<49sK>pP01eP9$_VxOD^BU7h>h*!q zuN^4O0s%5@*w-F4Ym0>$_d8!xdv{i$+GXz^o@P3*jt<<08B!LAv^_25KbdRSOe4jH za~Yn@`tKv77~{?i?)PnMd1oAh#@B;+D0KOi_ zMf6PPR&V$QySm$KR(%7Fv}Wu_c$$bcHQ7nFdP5|(=#S2wgH~6b<6m&zHPKQHYZ7ce z+`Hx>WPbDRUv(M+({Zc?&`s_-?~}kZm7YpD)Uf*3R``&VSI}QM2|(73;f)>c z1)*DUFaJ`z{DV2sd&M>v93&3V9v^)&S#lW6v8k`Q4#~tGZ|A>g-;o2=l7Z$0c~A!) zqMkNQ1#_rKiG9=eVUT+CiXJ`ft6TlK$#cYQGn{!M=|~7S5=${Tq~e-d@2@1l$+6ePxY)OLNJME>>hAA|v*fyB{{l zSu@$bJ9H6J&Z^}*s3Q!F2na&Vo(W~JB6gR-iss%$XRB&*$dsC)nf6`Je>8f;02b8@ zElvfLF)%^5N)OR)N^=bcg+4NWl|O9ow}zYULZ3w4QTiCTm5Ra>aaA;sE2DfGck=RQ za3>*tH17Uh)w5LnJp$xL;coSk4BpI16Z?*W$l2`G`8vybc?!d;XVLUvVc>m+`T5iv zzE5_FYRV=gCxjL3BY!PndwCGJGnt+q+SAqAUm4}v8-3tLHpT>SV1b>e& zV-Le+WSACXYx*+3y|st@>u%x;bnejp)@*;nA_=^(gnY4tH6Sb>ns>PZRLIRgi(|in zALM#hgZ>uNc(6A9`GwUdO^&I>TgGKK2!fr6p?^WEGit*FbyM{7#t36E0#K3!e(WJEM zY(p;C^Do%bQPyQf05`=vRolO&Jk3j4Frm2yZ`Qu3ujC>Q8vod4*wx(zV=sAE!K_v= zIAP2>xqAQLR6-OBGx&j@JwuVZDdO_8T5Q6w2Q&!`GhlU{#8zaU%BT-nPx9^KbF1S2 zL@#vV#oZwBK2*@|n=>uCV2$=Q(OL#i`>;9du_%ZzJcJc*_HN6TQZ7y|oRS`zRQFW;EY4VosjlZcjoB*5`Ow}&` zx_UjUy^-WVuY*FlOf#^rCja014D1+bLQ_+)b57F*Kffyeda4wx6Ja^@N${^#Hv(S= z$S5T6#~K(q{p&tvJ&%IjIOU_2Y48h@Pfrr~=PBlb-^EvNE#SBE1)#r_0s8Az@vo%7 ziGLED>kT$-H6?J?@x=v4_jrtgLhCyXLcXpy4d=!c59fkV$yWn{T;qUnUj~G4RK@?5 zP1c?B>Rl||!W7=3cgQHstmjp6GBN($RJmR3iAEe6jk}o!*keqL0aj;?y$A&B8ejdd{oZ%xo$k6Au%!f;mHTtN;Nj6|ys zvUbjRhF5%HaP~#(=gFKESDLkRN{j^nC6PRpAJ2MpBx#tY#bTW6gaVgvPk18!%ReQ# z-GKaeDfulI2aY4WMVBu?0@fAjk=i_B>0^w>t|r(h*Id3kOHQ2kP*Os-a`PwBPvRnZ zFzUP3&iz?tJn<9Hnd)XZKl3ijS@A!(A|h|~k-@8}-m=l9K&mt4mdbY9>hsH zyyM3HWX4P84z|?V9FAKM_7gvi*aVQoo=;_^TW76P$)_G>sXtZlxJO0eSAYj%qb`Z? zNws%ZoY&m3T}zg^d}*kE0WasaN-Mlqa_1}jf)K3gW`e^v_HaDYIve}I7rjZ#J-T@* zR^i9~fd=kf!d{e4)bS6hRnrp9y%l@|)e?@vRK=fcG?2P-rpu*Mo7`C;E=+o?T*v=^ zJBBLzP9_Z(h(V_e$_sO&zVU(gh6#;763t<iJqxK8Xzq+q!r@Z(3WDdpgX)8&ez6 zln7G%`OB50!sZr=r%1->i~s2)!G!egZ=Ar&#iANTRUzj9=BXW>_)bc&T) zk|4_Ded|8LERVe{JZbQ%w13+z!(&R-bXpvtTPrtkZmU8t79z7UF6e_K8FBVAIRX?A zoz_q6xjzKvrSTs>D*$t=(EsA`*US$ihO;dtR`jqaavXg9gai*{q?u&bvXVO2FW8-b zRBlfY51qo@z zxWdV`i6yX?p_I}}%@Gv!+=*cP-hQyjOd zj1R7Pl=$`BXaQ5y6aKO!(%XriuIGTu=vmS}^|UYEdbJi}znP`*jEiQ4hMiVl6O1(c z`856`t9x?H4Qf0d-)SxALCV0^KvOlj9L{84@;5GIa5`Yq2yqr{uuuzDv*RTIZY> z9rC$x_X^WGwCZNA;IY1wSF&&Q*LZ8)x7~N3m zG0bwF3?)(6tC}X(gjRh}WvlbOiiIigV)DSQT-`gc6LdHV?tfDt`VcsA;J6Hj-8sYjp!>v%Lh-^sziwBLOo ziLhbDKMW1gzn7fm!0Vb2eJw{Pz8K!oeQhLo>NTw{4nBl) zl3yF$n{_z;aJs+J^7&-4dimdpkgpyp>9G#dJ||F~{{<_)cpqa zP6uR=#l;E8;QlnHF9MuvCtVu{K5Dc=8Q~i>7~S7GP}e<+-1Q!Sn*}+ zB&m-!+7)h02Y(gQVSYL>9p`42r)hAeU*x1?fG^w*JJ>W5_2azq#tYL(|+!KSlb z{BKI%_+fT(JL~gVEm>J#&#EKJG@qL9C>GqmV1!k{g)F+OEFScO-!^^Ka`oL9zkvs( zc4Zz;;mfT9^&hB(`m<_+Esqq_+8E06=W|&L*?pUIdy9ML*&DRYf{4F{2@y(fdU>oV ziJZzMWTVT%H0bCJmJd8KH(qbbL&g54m8wFJ!RTK74fE;J|Fd@iqLeQU#+qy`-F$^$dbe~q5O6S?BxYqNPNbg7kYz!vew)fcz5)A5ZfCLGm7@Dxyi7=L=;b&M6ybyT>D5yP)Fb3QNfF z6?c>juO2{TV0|pOT+wV+`An`$j4rq)X_YUJE-1;CDd3H3II0r0KHQ3AnYq$RfeOiM zobcH_LU4J3z35@WRcVJ?zYHWbvU01OE6cWA>sM za~93CY8%j9)-KX1n-#NeSNs~j`_<3G%^C2UCU#`)B!c?4wDSGRpJdNCXwq?I_<`|Z zH9auFV;!7FD|7Ccxf+G4GrGVF>Gzp%pNB;)`6)O+kpC{^ts%So346)%lCHH?oY`B5 z$KSyh{fFv(_S3nfDMTfhYTuKuK$R_R{J7%B*)w_uKR0@QP}UUemuR|goQLL0OSXLo$XlDHzR)D?eT#3Y4-c_^UPI&vt7(~F9>*8Vj>wTBa#muU(n7P^h zMn$VY#dhfoYj;s=U;z*`aIXt^GTSlwX|BEQ$DDlUP{NRr?<$VCH$PTk-e?{&tjg^T{8sg%KEsfY1Na zd~e-3wf7zjrL0?e;+hW!FHh}1$+BMa=m@+Kt*X>ROkc0JI_~L0X)S53{bR#!GxKL= z2v(ls8T=Z62!@PGw)|x=g~o}+-4%OOLOfdrIznaHu`>aA956TFk3T|gfo;K zQdV7zzCRPQ0&7*vRc+N=d*KsUiQD}fM86URND(-9l2u!mnvFFf%(T%3ld?s%r&DvX zOQXLO-m<>+z8p3v?05PUTVzLwcpSdysya4;{055}n{-5?4z%m4gp8i~}#vqDdQ zVz%sX=c5~GZ)`Hv-gT)78&HFFRL#0%zGiu$2TfR4YQm-%1Z4Cd1<HK4l9{Zn1_6WUNPDd#E;cG|bg@z4W{t2bZd#an#3FGntDEI~(Oq$W#GpQj!vQUJ zyZkYgTRM%oOnq5p8spKkDv^2`a=#G%1?Jz^R!Fdbe=29TxG%>8_3 z&oz_D8)q_?PID)-iI)cTit7nDe1-m+Z&ylMzSBV7A-a)jdMj zJ&?Z`8TgoFUEddgH&Fj-BPkrKBNO8XM6XyhGMZKu>pKjrP}ZH@2g z@BsF^tM$7q&vPzXN;F}MIdnp}9p_FsX@UU{l@H;fy4jg8t9CD-AhIQA-NQwXRq^-P zh)wf~gF1$yw)&5wK5cVZkG;zW@S>9R3FInrH(*oY@=JR3yf0Qs!(|w*kiGNc|LDTW zMIio$Zwjc&y?A=r{EIpX$gyzOAp20`rY5?#$<*3HC_|UaR-{eJM~sQ3jN6abPq0P~ z#yunEVBW$1ytA+k|DaW~*DlyhY{SICIVt{&7pUaBKF)iiAeQANm*3=ALy}MBV!4X{ ziw}?1~wK zMbX?W>+YGcKJR0VDYUGdk-R5`lg-q&DrVSJs@}yJBFS0Lj5{Hu4 zFm`i7$Jhj+Hk=;D{CH})gO?F#Av*VU(Xi^vo__CAtIeTYCOPz&9{2HBG@ZQC5J%`Q z6^lziD|yPWhV)ra&LW)EdXm_IF6+q~$v$6hJ$aM$%H)?>eWbb<%ywMW(tPQ|RDYbJd@mDX!lHDvjew zM&3#BFX#L$_T3zN`?>9i+7B(TD+~wL#jJ({>x;vI`Sx6cpm#aC;lNzV%I3ypYE19{ z%Rb0zbb02_&XRbvAAVJ*Yn~{mV)8BmEGiMnU$>a zF`4$~=2Rxam%+zVm*B)bfAtCZ3wX4eNr|x7XXV)*?p4yiw0vUTb2@y~{Yp-GHv-b} zNm%o8{Qt_jpO@P)&#aJ+d3k`8)iKX3n?TFx@n4*;$wp@+WdF50|5X{AK1;qPu4Yr) z_iH~dhoRwnsPfHOk{cQ`SYczDtN$ELMOt$p@2GX(OWZ{CXN&J~qd!9d_vA*0nn1Ji zVIwB~Hu8eezp2Il)0Pa3qv>VT{Z-$RB3daMWl2|<2xMQCJiqbqUx0e^#xzbq zr&e9rBzJS)I>q1c4fxj9Y_?K=qa>CMUtT*8Csgcqs7xoZ8&gR}CDdGiQIsZlCLqw(}eR2gsid z@~=Tbq!mkH$hi^blnfX}r1xVF_{1#t{b4#2v-a$r&0CFCGOE&YxbzA#uN%564dgdH@ z2GnmDdgJiXf^|2&nN=#G4+qzj!9wxF4160N1K*Xoju}?c*Xrhun;8Dz zVl?FXn#MMbnqIg1E6EAKK;a@4*3u|x4K)s49(XVP)8DW{%^!|dc}fn$O{N{F;{xM} zjGokr6a5W3KkjxkAWxk^NP4|oEH5lGIKxeu6Zv3@J>{J-SCOLZVJJ7!qXl_3&*7Hl zxjTPvdm|$gLzCuC@Hf0Jf;aBZ3_d~HQ+kMW!h#H{@#2Uo-f)=@|8 ze}})#>h99{di%1-S=#<{#%^`Qel^C^5!g?o*2s$ffifxqu>r@f`y*_hXJQ!PDpZ!R z{-ehJ<%x_?{~C%S(2%0P=|^Bu`PfG%$HKemBzZ%&=OUBHcFI__Lni%?AWGv4ldaX^ z|LN3*_gCGBDc)YNIhB>9?)-$%m)Q8e5Uuc(mvmWYR~#H%lg_twZ+!2cik?Kjlnmo} z$lK~$KQ8nqb0>rz#K?)$lELkd3{S&Gretsqf5_0|hID;mU;(#rv8H__);Gp8;(xm& z&|&QnUXJ?L$=f_oBqU&l8yXy#LyQ#X3BLfUA|K@ND0G-kIVclY-31`7OY!wUx;zjy{^e+7%?WgX zD*rm=w;uF@H@KKJNeS}`9MeT+z9pZ!@-`mn6$QpB#jc;~&+}es$?m7dL`J5q_zkjc z`u>rbMuvQd3AcY%j`+a|k+MX4*$MWtRbPx&o*+*0JzVzHIXcg=4s^}4y2S6ACY7$A zJg?#X@R`AIwDQ;OWxxLNaL-S^j4}Hl-qPExeP%i`@L30}&Nu&zhr=I|=Q}<%b}rk) zY0oR7zB)1xwyobX_1hagSxr+SvGI|!S4I~lSB#I6+oIjtw{q7!t|)ULXj}s(IF;X? zJqyvok?bcFkuhhc!AE??w^Q9j8^ zmWa)KQ%g}>wDyG1u8k=a(mn=MT{X`-;_%a^aTV)5^9;VmM!#bwa2&yBo(tgl(GCahX~n`n88C%^gZv3* z1n-A0AAB?gzk}qZmg(&FXszpyu)04D{$rf?ckw;T;M-Gj)&V_*?6!FTk%s;r13ftd z9rzEs@Q*Fez`w%4KUVM`!%m=R^oCbi8yDgK-BmftItuK|qO}fz90m99hHk$be*fvK z;k>o~Qj8yO8W*kU($$Q@xK_v&)`68fE20~|D&`6qhOVoyb~B-A{xA9*SK;D&v8UZL zOJuXpbC{S_z|RaO9%#wKt3r*-a>oI=KKj;mjotXq{zUk9(@P^7US$hevfL-ySb*{BvmI zqY^#Dmp|lgsA>39>vs$NOS*B))+Ajd0L8>l^+of^wY6~so!47MrdFN3Bb`rq&o#b(lY$gbp;s-$z|8ieggFerc(pf>!wB$rkAosg zjDUH8)0kav+iEV@_@I`iJUzj`dZ}dN8xetf1gW$ zexh__W)Cx74qp(WYt0sd|@TK7S6_ z{(A9BU(w1^&&s*Q4@t{cDCgjpFP@fLG*y=)P(b=D@HOO^Hjqe+ay5mzQVa|+xLY2^ToZ?Uy=UWpP z9%W~U(clA`aX$f7*$b6*#z~B9D_RFa8@jS^9n5`)7sNAmWrYGRqJ~Q#S#ENPN9!g)7Xq`xcO$-otoY8^Bgu4y@P4<# znV+%Z5htH;#mNjjE`LbRFUIk__!kYuFu%sWyCgD1>^A=%q?7B_$=4rHvNg@_1JK)cqpvX_glj zW24X2-t;AgQ%HIL3MkE|yu+#$IY_V2xEoa&lIDt7$J!#bC9Jzh>a} zZ*mii^N-(RgQM}|)YpP|8QZd3FD2i*^TpcW{o3F8UJUY*^=q~=9GW=3a^gj3wT!@R z_!9YD^W)f?AJhn(8p9=~2CL^f9!8&SZ4fRB<9B~;6fUyWp!NZGWa;sl`FR+YATCm3 z)pko5f5qP!>lovGCQsSuNZGoW9L2eo*VAEj2D%CpfzIfb**|z@-8W2R z;Sf(@S73yDLU1A6O>FfRKe==`!R{la@zGdpOmu@sb<|a94i|&?JFN;1)DOj4F>?ft z6dn%@bBJd@Ix~Go8^)_7t8D?D6zi=VNVSqFb&s#YwYx%Dx9-r<)1{?k}0dr6-kf(@Q)M zE5v5u+3gPda#I72eouj}m3GP(cv@o}Q^@`ijt3Hj-GPLsm9VPHy|EU?o~IhddkL%yIYS_ zGNzNtLrhDo@Fb((?~J~o#FVeiC9BQtU8;BLc^+e1rWWr21sWy1UA~_+NR8Q zmEMKng{*gSt?1_=Vs+ISDSHBJfo08lxHEuTn-Zq^W>Ur(qS_I_p&Ac_JBbY5&D~}s z9jVzAVB72}?Bq{)v*)m0DfEGDt=T!66nUTV(?uv(5!rwBB%^=diU~#WsEA9|n*9CFFn)*uO6rjvruR`mJMu3xR#)=OdWt)HJJPJXq7IlFe3I;Cx_@H{9$wW*tKCFw=lKtf(nDR{lVH@!P+6GR*S`6CT#2n8zhSZW6bn5 zsz@ZNsa54-qqaL(yE9mua4PnROA8zO!Nvvai0bXU+0;`!I_a$L6E?z~!SGgx=oMu_ zLa@rNV7NDM*wf}YZCx-M!W2`h2BrcImzg!a1BwaOY=d+hGH_-Fe*$P?f2F$eRC%Ca-K)uq*+2ss15rPa))e zh`HVaZ#nIOD|b2Y?wq5_re?D>|1sgFY-g}69xM~LBW=X#Lbx`Q-t6fP>?=GBUvM^Y z(<%G5QVEtn5i9GW;#T-Wuxzg??jk`+Syy4Zw|bZ76uuY)4gMYzVjHe@;APLi>9W&W zzFb%eZwrR|g5g83A!cN!b*%6LSUo9*#3>;PJD!V#o`eX6&~bZdvV87f#sG40Z2y}|HMkR2(!OSQLI`+&K2 zn`hWUFe*I8Un3pt{6@Od?bh-V_yWnPMv9-Gz#_ z*CCs0a>DUocrO&FE{CiOg{W_!cnIWP2&kQei>a{=rgq5NulfzDFJ!fVDNyG0P3a7> z98B#nh&GsFh-|c~-qfV(;H$DPSlJw`+^$`OH#>wc&u-?Y-HHX&)+ra)sj2F+!)B>& zm;1r2yB!AOyFeZ=oYF;;2JQPiM?Ax9jcg2%m;u6IPSOC9>^a4ot=mW==3s@jZWCV# ztg_Z`))#h+b+R;R6|8&3d^u#Td)0htw$^PmUv^pRwwW(Gt#!t2bc#jD=|p!rK~>X z8ao|Uv}K$_M{xbU!Ln^^=R(U1d(~Vg%bul!%+PJ2B8aVU7fImMbb^f!5RQwGu`|b1 zuj~v~9%BCFwG=|TR2_Mz-&%J_5VAq9lMRCTT`!Y_mw>hEorZ($w9qj~I>`22nBcG3 zmNz-gisb+mn-W|{{Hwl?%8tN%w(uxQ2ofMGw(ulh4;b;!<6si%hTR-WaU4^(->Hj) z&WW=Fg=bYKV4A^AZk=@08B-nALP95uHs5M)@`32h8}!+p4>2u>|K55sk*MN{M z>^C$Ah=PF*yWY?NsckxfZ-_{k5zyDoLORbnY!8s9GS0eSdnNUwh;oNnmB>3{d_U3j z1h+s&I@i9@xjVT5HbV?d!%#(64T4NJ?v49{)VDlUxKUG=WG?;TZ z_9wd$yMncQwT?F?)Fz@oOt0BYxS`X)5sjNUFbWYaPLU6^FuDl@E)&q%{2M{BSwv!+ z`v(!j1A7?O<`EuwYZ9h;&fws<4KP$`S8Yh|rmaa1IEi3&XHdDb^MV_9QHwEb{D{A3 zZODYMRz&MKm1~9q204zHoaa<#xxm0+V|xP^4k(eawOwbLJp15JMEuuwOC3%Gx{%1p z5H+ZO5$_a%2#EP8dLLl&Tc7pA+SX z(BIJ%6DJ%PLD50;6q8`z*kO&ZPy_7x3D0RwjzcS{$!)?X(Ao(zL*NTrKt+I6911Sxzhe_*t~5 zpmaqr$AUxq-|6y?%bm9RVA{dzT_{pg9;O7VhqM8_igb(yI%1t<%4_3HD|-?-ZiV`t zW?B*0jl}Yb+0qbuB)VYVkV*w}l!EMNR8BX}qTpEkE>sNk5yU!H4C(`-$Lds75*s zbx6oO03d;r=yQ=Ky+SE;TWMdcB;^F&z$Z=oTY{vG6?V|4U;P z*_3TidnLs7sQ;E5Iz0L;8_L$7nD?~*ukQ3c>c0>>?O!_|H{ZjKC0X$WTGV8ksLZ)2 zMAko}ZrML!X}z30K=URgK6tN6V#mf>vB(FvTCI^^+#0$Y zkK>!Ayu)K(oha#9`R9b%!k|4}kpo%8*)H-$l{TC$kAsq93$VxDvy?k2=Nr4K2?vk= zqgqCH>?mprycaoN`qV6f3<~VAp6BH-j&8pn zt{?onPuho#J@+naznS+3-MhY{cjx%?DsudnSA=kfSti^(`rH;;kG@>sg>Y+j5Xyh3 z>K?Y5#qnPb7?%{1Ph{;Q#A7y0*VyBcRgYzbX34}{wv$sFhvIL~G6>@C0~oymdA_BB zKV8io=89mxZs1OSca(L?Ly~?>Hcp;K7u`rqYk2P^@XIVzz5Rc-F4K~@Yb>sUPX9mc z_D9~jfhrru>TyZsp{G_w?;1Oa%+XK%mD07tZCYG^oqeDEo8YDwG%#z^3p&`ylM$Z0 z;ymedo_xfUSDh#QdXjJRV5{>W&VxwI7dcxMer@2_{1{E&{=5Za@k_-0d8QBl(oTQg zbK9uszuffZ&%0~v3_ZR41@5NG;^j`gF?)(^=GIzq~`$uq0$FAxMAW?&9ZKfQJl}D1y_u))-wU5&OlM*udn- z2UEu%c+)g1?Y6o<_RBG`!O4;ToH`yO4~C@Tw}mb)7vv;V^-$nIVXSDsEHVVD_aYOu z7Lv2Szxdf^6_Wab4IHlsUlr|0U?n<0?AMbcznnUr{U%W#GhLlzb4NSMmPmz{flaXZ z2Rqb)`eZZ1!ob&>gc&bOq4;N-OeEhA#>76H9Qno6@%TY{oyLk^*shx7O6-euWV6Gg z8IBaijHp(F(}S;-z0K+t$*p+ZRyCv(^u#u57mZJj^i3T<0#a-Hsc!*4?(m~XDmA@@ zM~n8En#Jp0b*jZot^QOkjy&NH#!8n^)tetO z(@!;s!L6taBYUKB11FBO!q%dLh?}io^dLPr7^U|2npC@0J)W2x`PJ0%+?UW_G(sIw z)o|hdB3TypPv=Go=GsAN@mme5w4dShjZw)Ith+xIsfi3y>r}VfDnbGa8D7Zw&nLbU&LGuH9wU9g%^dGh!SmDZJs@& zh`s2r7Hq4KdB7m^z;seF?|Z}4fxwzV>I+{`KdU-3v;&|LaS{-b4+92;y>F^c@y6w< zuv=X?_`^_R@Hb@ehaLMkh+|Uw-%0h+{Di9P*OF%OI7HkDR5G%L7D*-1A}T^vmuL6vnIz+-_nZ(_;VrBL+Ck9jfRsBhv8n74^VyI!x6B zo(sGTJb^6woSNZy@!vk|*6gJw;&6&r)OHsg5vPQxx&rVhSlD^gCWF7?=O0idInu-u zoq?ew^cJBabV-{8e|>>-fgWM34VrFvL@`{2_o6Q@f8p85$S#Jq@Z zmmN5Yp27%g``P+8ElIY8(IXF5aC;9rosQq3sph%2jQe}m?A;= z0ZvB@NvvuIe=jUh@dKhfFyZ2_2*-=VQ8|Dvo(TDMfhlLI#1l(Z%i)P>ehRM^ixS3g zS2*0zKn2R)nyU&OTDvuUX$I9J9Zu^B_tc)E9%l^9%@1a)bc!oE#0Sqa3L$5q`UC9& zu|9*K*KSf-?WSrxoN#HiUAzc`7+PnxOxA%5R&8(5X;VjBefum`!)OIFHXNlt#Zl0q zS*2!!!yv)BP}>gKfZpe3s-7IOBJUK5I{QekbT~F4i1eiP(4jZ}?AhA?rQVumsFtvt zo_1W(j0d!8r)T@afq4qW-obOK-o_hM?~t?Fsb8!C_4Fes@nEx zs&)awc2Rv^48r(g*!giGF+T)Th|j`aO)bq)0kxnlbmTU%N|)N89R{mu>W36y>a3;1 zZ>B1JZ<4x#%7;uP6?KTHyQo8s*lhV`6Y`WR_9Ic$(QImp!{nksyG9NhX3ACng zsMVCE@;#E@*l#|GL2RCVqmjp4MLt3%{UqkNVL-ggNO-~=l8`XhpCQB%)jK+RdO198 z#1cflRugB@S_I2V&(d#H;rC*!-@%xvQoJrfdF!xh42?z`8vxFce#7H3^mooWVkoKj zZ->-P4>gF>aity+0=8bPQrQTlxQ`WO5p@UxXVFvrM)OMMH(LfVSV`uwe&vpxl;f=!spz!j5S_rPg^9 z({R4%*jolPIK|7oD&MB^wL>XE2d;QT(k3AF7YZbKD3F63Ize7SAQ9zba##2TmxSS9 zuIs2dl*>x?xn4N3*}C|V@$ zeQmGGVPj4><#q&Rjgpy*$O8gnDDp;^inu{SJLecfmqb1jb)^Ue)8UJURLTvd+H|F9 z1y{gnq5>2K07TseA`v+zX0I`NF$X}e$O)JL7PW-8sh3j9hlNFEH1tk!13dv5ir9&J zxA&<S{7~W*rA>-cWeigYGc5y|SCmm@eFDSK+}*49Ccy8?9*UR zQ0lY7{u{OU`(YnZkv|CgM=JIEV9!F`1$Kw`5$0yV7vAACfdj&Ob;7&RM=4|;;oS}D z+vJ!-wN5}6ae#_Rf?{&iUc2Ke*kF7g#y5fq7c*}-?tNR@Hk*;-95DuMW6dSC645y@ zI*eR#@Avam3ipyRd*>N?Vdk*=-~-ZL>y;e1Zl8l$kA&hC5USnO(G@zki)LJufA0(W%2jKE|7u`TBl%R zT2V2So;|qTjncEn(I6!ewWt|ML@u5X=p0@TL&Y$0N-{s;Up@S-?RQj1nCka;s@f^= zB(>cc_ApGfU7N)5LVYE$W;zlz5_?}p8E;m#VWHO*x)IE!z)L~ihyHgeaCCZQpNzk~ z8I5{}Dw)kcEz&TV?lvC7zObKh9c6s`Gn(dh)p0jJ_Pew&ggn}3G$#xkx;hT#j-jKS zgS18!H;bou<2Guucs#JhQOXnhV7KD-oNb+cjib8Il`-A=#Z6n)wYGMalnZc5#x&F; zWXg!tV~j`==TlWTzN)I)eN$qN)ro9q!~z)q{zB=KXqD3u>qk-=ISanH`4v?(l8(D+ zv+c4^IKq_hik668-CuOdK`V8(Z&4kCR%iDGkEj5q5x>QjH4)knAr1H0B$gzxQVQy4iZQrTQnQa9n zQq~QN_)@-}3Xm;lh%c212U3Zq8%&p~=Gr!j&O2HTeDg?Q2fvO4I)upcR!?S8HK`Vn z5wfSa3j%@Oku9Kf>}>orVMd3oBYdmuGx#k2NrNiN>LYzHHN5J6&RH3hS|f$sq%e-5 zF~BsZBfLs&&8&+$RoDDw><*aC95V;9Y8!@*W7^-QBOo1faKjXCUae}sP57;(jm7UecCBrCmrlj`@ygPb@{J0_UcqN*^>jS8;ua zO4e>^>V2}orDu`M%ww*9$6#}m?U-T9sJ3883 z@wzA6I{m7XvaDba;A&nCEZl41utydb4qcNEEa|z&+))`NCasD{-#Q5wL`M(z5h+PL zBFmV?;|%M$N8HY2CdptC=)jrboiKYeNj!^&VQ1_X54+t7iBOh{LrfKL6`~ehJ?$KU zvAQ#$+r{Dosx^YTB*SUS0))v8Ly4n-VjYBY1~Imrwf1LvTc&!#kyvh;pCL*+=19EP zs7rwhEcEJr$2#@meX1gjP*jQK%av`VS09E2vX3DFApaW0I%EB*QZ>VaT($t5;&jH! z(J%b<34cSzN>Kd6yHwnm+1!~zzc5rJ9V=!c6bw6e%|r`ToIOF-o>4T!n(q+Kq%Q`m zdy5Xb#TQWAI;9HzRKTD@d7<%a@l{NYYqjsAHIZ_dgj&U|+r|5Iq*RDKEbzEy&22CkbB=nD5)mPN!&<6mm zo2d#?F-NZ%CT_$bVk8%Jqb=)qnnO~XKcvMPmFg6fwe@{57JL7q?K;tnCF>O7=+~LSlNHb~WJ)SZ5w(Ote zs48-NJHyY22GW(!!?D-~F@Fpdl0Spr*qT#1`CC50DqCM_>C1#9Et#sn%Y>Ar@-Pgk zU&3LEJ&nd;|D`xg89*+^p;o6l5l%*#juMv`K#bgZ5f+WC1MZB~NM<>V`j^;1goBin zYCh=cSToQE-F%LbB0xI?XQ33o>}NHfN_OHCgc>*cW`qD1h$u^iYu*nhEn zv{{7runQ9v=RhV(lKF#~7yTt*8Zcbw+Zk9J_H~J3ELwzswDm(`+je6BIc6%PIYUhX zW@w}vZ91+6q{hV@eP!$)X~_l`W4}{Hhp?mwADm7!TwBTtB2htB5T?|Tq#Rsyu*IaT zAc;@0f|zyi|7Hcjx=~_pm-=QmNq1wDwps<=7_^_4q_J_nC+1x*t<7H72hl|v+~^@i zK1qMWHsT)8@UHJyfemRT7t@nW0Ylz(agnPVo4(1|9}NF>O#vyJ!jMX(k1M3q(mk+l zSu$j%@HQt@<|4&h3a&YVA$3}2jNecsWeRX2(=#RynMHK0#FXvxHjSt`Ji0Q)V#c^w zL07P)cjHGY;+{I&Wa789+>BnXO_T6fN^LiqzL5g4u$YJ~Y36t)a3LGbTuMH^xQhbb zj7ru-DfUl7^y+0^Bhv6i zV_+lJ?MU$c+~6~LFQHzEux-&IK1w8jr@lH?)MN zBhNgM#pUMVxcz(+wStR6!SYq(K}3IW(dyt2>v%SP&-k|B+YNl9()ix_XNAb7)=bb5H^iKa>qZO&&2#ausLrmt zoCGU_obyfP4{*-c>T;s7k-l3aBeUO_O+#<3;=_O2(Kvsy?w1H|5)jsZrohnp3_v}U0?2Rs_?BZ z|6EhWnDylon<~bxFVAhNpyZWJ6*=q6uV|_mzrOtPriuyc%k!ElE?ZxIO;bhg`tqxr zDkiQkzpAO?bL-3Vn=1V4%dcyy$Xj22ZBxbN>&quMRa~*Yd{R@zm3H|9sbjv1C`!ju z5&vfJGfBS4Azf~yyzxZK&GSK!#Liva?)9|mZ%hGoSF`J};XUeK)5=lF4sS5JA)n0I1laWz65hA^r!AnQPwsAso@ zW3->xR5PX8hZf$K0b8Y@XEAb!gKjX0vTMv+=D}>6a42y@wrR^D4X8)wgZjPY43a)^{;F9zO6E`e8sY>ugkLV@%#ce^B*#}KpW=^}VtQhwqh zB#(yItcT^xGgP6MzYEyV9|CsO9{_gsX9TvX4lex(cr!%7=51!voS;&+jJUHzcQ~hD zHK!Pk&A5y!DFt`KEgG7*lfvt#a5$$GON!3RdpDci5aEIZb>@`eRD&W{=rE#ClQv2O zCNv3&8y8_I!0rxZcwaO-r!g16S@KL9@);-`8#mOD_s7~r@x(jAM8Fi#)*crl#7K^r zzb4^*$wX`t(S&t0%@R#npx#r+p@Sjso3E&);|e)Ke3Xj=3e*Z&RCiz)Tbw3&!P= zrX)jZEkp@3z5jT-O0rnQ#?NKw%#>t6faI2ZbB9V|vr-(@?;la~XC9G4PCwg-T2%5g zjY#KAKHG>oRq`{9Xs=3sra9_T$d znjzE@BwP<6rg5j#&YKNXX^{v|11I4qXihJ|B`_!HSge7H#m^aNj-@6X$!c?s8sjvp zb6n1pVKJk^?`l zn{~zpvKn^w9WyyXIEVa6PSB)4?bNR0AQ}^hck^5xdu!qb>;QxGkd@~z-<62eFxgNF zR#*>Giw?x>H>YFvnZq%=y_}2bw+AoU9S;R?O*x>gD&c+6=k9^>{z5dm$GL)VI>i+WOt+*FN;JvFz)V%G+Yr9P+B&5$Vf|v?L}T|M`X5 zLY#;OAn|-UsqTyo_+lij+7tOtPkozdX3xr%Yu^bFMwxDUYW?mD!@v4fAx6;c7~%(f zYkC z+us)A0&b3dNP|0KC$0}1iTuh_-$A{p_4~uaCr%U&7ZTveO$XW_5fCZJxhf*|fcRhv zVt@Ufo{xuz3yG;Ec--E&)nKS!g)6tyC4q~if@!{JL|OH_j~{t3nS#b!|898g#~%aD zc5Uxu5s3ZTr%2N4ksUW{H?fX!B9jp_utoLzjwe43+jZJIxX1)g3aJ4=@|XmGPfY&& z%!$H;5ks*01;bsDU*^@f^U7bpZ|%yDhYRI;w1{-J;O zuTxZ(9RB&sgf~ZXnKUBEe zer}WCgqO#C$})TizYk?P-L zGHKpTyCHOyg4jk?JB|@a)tYitZAXwB#0?z^n3Y^Yu6H+Phpy7=<&wpB-{BVU!r0dJR`ur4<#Jw%2M%{n47226ZaOyItjE}!V2x9= zvL>D&<7Q#!nb_w;6CJz`_e6I0Kz_rq6F3Qb;bFB+fwPehvJHYRoIfA?a16PEAcPB6 z^@hOV$S<>pkJayc=bhw*LVWc?b_rC+8S>6@$PpN(YVhip%#iv zQ-8Fg%BGc(bSuZz5k+$F!4Umtj?LRmdJl3tDJ&dnYKM~_Q;-wY?o+F5Q>4!)?)};!RI9qk19Epb(CCtLhC3iYeuR;ycxmg`*;%hAg?}V_!-5LN1S34SdnhO zDwCmfiu~3TnU}ShoXCHc*0;6rqi|3C zo}{R%?aZ!M%zDVI#^gh+xi*`F^l;TNfi4!q7^rmI#CMWOA}LwwR^=-e?5niCwS`3r z7t|^>nHty!OUG!jPfW7b%?6A?vpKUuS%|Dd3~Po+5^mcb$RUY=ybq4yv`gS={qA?p zt6jDW`Jz&60g|400(cx*h9mAxVx`&jt%4C)lIPh6HUx$vzsj!f;F+g>e^RUe2<*ZR z@mjA+Dab&08%S?q@LUB>6T#Qve1&jdf)ygi(F*TC&5f zG%mW(0DR;$Z?LmU8m!iQr5=NS5MPyKG@5>&BGv1G47(5GcB z!JIK8Fa}^_xwgV&bn(l#z~GryPw192Wt*}?0p(k5x1ZG_m*JgtpcQr|HjU!pE4k^A zu?Oo#vpm@9340^IxNxR5J2Y2Prm1EI*}XNJ%>K`c6w4{=-s(&gJoS59$Wtl7#T#EIMeP6-9qvl^J?eT((o6VL$VqGGIx@3O*}P* zc+3fY`qr#+fPQOsSS^6pGwnIyS!dew!rwU4J}tcHOnYhg+XEYgkZ_K;2#m?!_-zUf ztl=Z@-oOrAL}ZfTfXF!JR1-t(5LUD}!-(}=HW40d9!?AWINha+k7uTwH>IJkkWRor z76-Da3=EZuZ&%r6TLPT`mz$d9t<%g1Ji0m>zwIkMdIrIfXFwfaNz97UvMBQ6+!ufoU`WhK(R-j|JgFmGPHw;6qOcNsP z+O46_Gf}G3Nu4YCo~qL=EV)(KIjB;a6{;jRjv3!JM#by^g}%*Vo=DPVs0k*asoBos z$?2x2ai@s7nG$F_)8=vDc*itam&Fx}&x%q5X2X~kn$A3HjXkS5b%5gXMrR;q18{*t zN&~1YPv}nkzKV$>8w#D?9IR|P6Dtk>G0@2>xw$aL#U3KjQLRoB+3=fnLfp-nm0187y4*PB1n(AsTi8igg$gbr^mrs6vMr>kM^7Avz=PdJi zllh!&KIfXxQuDdMd@eMfcbU&B^Ld~7TxLEWFrN>b&qvJXW9IV-^SRu7hRo+G^SRo5 z)|t-+^VwuRH<-_j=5v$z+-yF#n9o`Rp^F{pK@nK8MU_!hHV5e2$pUkIZLQt8n=Lv-c+OP=0Ov@NM7s zEJd2EAzMnKEZNJxL?UJw3}XgkPg1n0lon}2tF*|HC{k&a3aQXyX%THIS}1w1bI**_ zuYSM(^E|zu=Y9X5=N{j4eb0TLbMCWV=Q`)U&2Zx`Kkf?St~lW?yBJK z6x^MPyLz}g9e0gzcQ)>t7azt_to>!QH92tB1SOan}fUXXCCp?pool9qu~dt_$vZ;I23B`r>W??grs*DDF~m zHxhSaz=a=lwN)QCo~4JPQ;M;(|ZrGT*Pi5R*e|i2n)T582S$K z&~C(v5F0`40Agq(wRb0CXbZD<6Jm1^TZNcAV#$a_A{LEU7Gj}@p`U&0U5wZ*#L%y0 zgmxe{53z5EnIlHv1ZIfXEX1ZFrU9$SUM0k4A|{8}e8fZ%gY03w+=z)IHUxG{s0w0l z5u1rvH)0NmJwy!sUS98Q#OR1!Lo5}s8pJjsb`r7uh#f(!60v;5>JZCDtP`>Ihz%mP z0x>bLUV0M{n~WF@F$2Vc5VJ5p)XYH4M1!$Vha!pN6Z1SWr)p1 zYy)COi0wyA2eBH&R1j-JYyx6Eh>0Wi2{B&8czJ<+h2KL6l}7A6VycMsAT}MbcEsi) zb_X#x#I7S2h8X%Sh0s*QP9c_q*fGS45Zi}X17bOdwIh~^*cZgo5mSVfS8ozx#)w5C z=7(4?VljyMBDM)JH^hn%vqP*7F;m2zA~qc{PJUpTh)qO{fEaqqu2%*z^!w|*!ia?- z#);Tw#6E*19a@3d8^qcXdx{v30I>UrO+~B`F+0SrAm)u&HDaNNl_Hjc*kQ!75z9ra z0I{uzRUnpu*j>a@5qpVP9Ad+WQ4te`ough7Vv2})Bc_9x6Jm1^vqEe>V#bIO5z|8~ z5-~NzRwAZ=SPo*6h!r5lkJu^1zQN8?=w-wP5W9=m3&frx)`{3R#O@&`A_VLPVv`Z8 zMNA*DO2jM>D?-c_u>*(^5!;Da6k?kYOGRuIVjB@lMl2VxXvB&T3q`C3vBikpLd*j( z^t;@>^APJr%p9@Lh#4ZrCk$*VFwk3ne@w=dRaDi~F-%hn)7HWC^rsn2pJ6!D2!4V9 zKZvBjAaZa>C?zbM8bPB+MnyAXV&mcy5|iNaV*h}@xt@%ruoC(22~h3-(t&Ysa&hzU z^6?9>q6rEKi-?N-K8=64{@*M4_d9=tjW<>SV29|(g9qc`;o#)q;Sms&=H=oMm*Io| ztsHX@(kfrW{EERW1*=;Ob|%s47Og!o%p8ykK)V6|F9yJ}_4wka5=GyfaTVAx{!#?r z#(}WN83zM<_iqczownwI=z+?IiHf~!TqDp-7K>9Ho>~OljgAW0*YuQYw(TA6`NJzkZikl(9vnJcK7*Q5I`>{( z)dTav>SIr+t8 z_N`r65;dv(6z{>O=kg5hRQBwv<4c%62)~niSRh+2N3^R-By5@XoCyBy)SxU5-@xtx z*YI!>k*d(DM_%cKk>0=F#!FptkVF2$0RIZFOJX0cv=x(GdMhMfRMxCZUUT|u$HYe@ zd+qzu{mISi$qskEcoRzn5|g;X_#cvT;I#9MAQ->}r~zLrR< zgS_C0kMp<;1CqEcF7^da+}}lCBz$XN}33%Tt8TmTvYrsl^>u=36k*0&jFRmaofgn>w+meNl03&@Q$2fvE3n(lQ1s=>5WZ+BFN|l!ymQ;eB~?By(kfYEB!5bHSLW@_A~koPRrEbf zp4{<3=+5otRdXNTdH1>OQ7A3#{-m2SHOm*No&MMrUrdj;t&r>X;a?LOCN^^2gg4k% zh(lr|m%NcuMEcx35>B*kpvojX7R-NhTcpJ!joYcVjB6HAEu`R+OhBWfEyeypJk4}o zSX0qMpL=b=LLKIBOZly#DV%PQv)FLBC;`fb&sYtF0@I=MGf_@aCVkI#laPHm)KEcE5a zuOJytyXda1#eJC?WIYhSbX9@Rf~(mU&iol|*X*lmn=*R(hU(h}o(MaaA9GA8D$mqT z%WY7|S?wxWJ5OA>&AmBtAYrpbAJMa=NM~Gk`OKE`9EI%kG@gYy@+;&Dv0V>_w2ODv z8y5Qc#dj-EsUsa`7I$(*eQxekN#FKFI&VF}rnG<`_ zsapMgu~`ahr|0u+`cj=IduBtrXkvSzs!?C*?2*KNMvYxh*i!k+7PB?my?LAy-&&=R zdRJ>Z*IrTZc)*b%z16%*bVFK?@}b%`qjMsc^Nkz^swQtN$QHbny+KL^*@iXSMYFS9a$4FY3U6G!J=FDTOa0IX-xgBz#O}oK_HqyN zymaS<-jbp+Lfr&FTCAr^M zyU#D%VCNRuPEOSCO9}Ya-~Iet?eMqctj4=@^6PI58D^wa@n!8y@Te}CMJ_lzKPSyZ zurNodZm3*fO?{ELvtOUTD0RT*rdeCWdePb#OG%%8PGyT17b2+_QZ3?JZCebt^LA@z zUM|NDrl-qSPsp%{T2$o|n$r_++15t&QFPXp_D?Ys-mNXK{zw5cmBeyRyX&XrZz2_~ zYjQ8&EOU9_k=H=qrL6_EeRs3lKK54g6&>E7P!Zm)zgx3UbLH#A@axCyBAe;*exG$T zZMwP)+k^A@E-wr8=NtfDaWoiyK!X*QaQjCg&%lU(w)7Es%;TAlzVp`|BvMPOd*Urw=PvsNDMK#X zv|E3# z7THYVX<|Y4LA&aW!SY!L)HO5Cc2?KF-@BplC8>S*ymDW6+u5$_abFt?M9k7M)KW^b z%ucH`Mt+vAr4kAmF~G zm0wUhS8$H4uTbQEH3i$crxO+9_f6867@&AeNLPLr@%4n-j-zrP$|>Woy`LdDlJiOG zkXngEmIFh4oX>1&Wxa3Xk}@l09G@o1cG@@^wM^YOD|2(5$?4BR#3)^TQ%)vmPHI1+WfSmKBTCS8%78+Y_QklesXMQI&^f+u zrtbL-J0m|m_l_!BsL0r1@Gx3IbxXXKvuj-RJJ}fPU3X&>9Z1eJ;0=_{5JG*6o$Ov|d#6e6^AlsU=6wxpcdi#u zaN1nq<8bg%j$_WwOExFo^4flMGPk~(^Pjgue3#;WY3x zt&a5)xL2`Y{rS)CRY#279*;|Qxtmhs+B561Plr2U(W=+M3rkiX@SdLa(vRzlhOdt` zeQ|{DasO2L8C?}opE}<(lss-b$avygHoH5#?c4KdA(hW~M3SBw%~R_WBRqYxAa~y@ z;y}Rbr;l}en%BJU%`iOr@~kiA#oJ1$;j6cszUET5e=Fqm9GNOUVMsoy^~>B#xr4Dq zzMt)SvHoRgweQvDq`#H$vU#`FLSSIOR{e*eZ5uw_9C7{_;Fr+mHSeRr0ZYTxBPKx#C&mERN=+1>0nLFKmi zx5by$x9+}_qIv&{y}8`g8wvO3)^}m&L2MESf6)!BeYcAwRaLibuoNa zH!LGo-JH;TzCrsm=PmQ>6It6SOn!oT>?qbE%ruz?tMVHk7j8d8 zIDCsc_{bpbz|rJ{mqqg>HBLw#qaRnja{QRw@^=NgFAWaGdBz^FFsnFtN#k>Vzoqfs zBg4u2_iV4(*T}e3{(L;|$(jQ5Q)_Ros1SZ|v(%(Stc)aPU*bt#R~)L;Qsr+aeTMg= zd!_#FtkWkm+TmHY!rA+aea^j}o`e75COM?Ka@{q7BX3TWOL}c5ZJhSDeda^|aMjaB zEqnT=oV=Xj%)d0K^DLcXHAhS3xqI^-wT8Vni0|lJARg$Q=QZACNbg|JxIFQpsL#jd zUOT^}<9NZ<5KI2(ST*{sn~}?oZZnb((!-TmT8T*bAt`yhVCh?n| zn3lijTBclih>2h$wz`yJr=Xj6X;-{F2Qf)XWn1nsD4^>iaF1zD}BWW_OB6Em{9y+`LdRfSy>6U zwFV~9ws3t?GYQ_bGi{BTZq{q>EgBvHRwwoOJ_~moc2qpm@b1v7j?LfJR_fS<$nNss zj8uPBW%o9!UDu&bFLm&N=X2}8-T7wWgICjax)TYv~ni4Z70mH8%WS8vO9mCWBB&LV2dz?#o3<{ zXK6Zb&(8CE|4#WC&-if1fRvUGnN6hUFHg1myJZU0&g?BuYO}#Yt0z}CzR>SjvvEP7 z9&zxV5_fLc&a;Qk^0i*zIA=&ZdE8xqUwWrg^u!U3TL&dpEvbmm=nq!(a z661}O;|`|A2486v=ST|pR@4x^tB!G9>D>V@+ibbM!db_MZ!DIu=6&NB7r6G_tqp2c z4|^;=2e~Hd4o+9xVsXDj&HdcHoiBT@43@3mYb`_)eLJ3y;;^^Ib=T|%hU)1vc5Kde z`KF_@axqgX$Z{kA1lD%C|702~2Pdq%o zg;Fn7DjI*(cW>?KSyxgxQoj}MezrqeMaVGUkmjn8Ss)XC|@mRQuD-Ti-6{ z7TDHZS+c}lWWSlwa?OXDNM1~&Ev9-NUIv~9oWgEi9va@Vxxl~<*xISYcq51$_< z4JKuf>t2oH@O2L4rM3-;%?aGVFY>{JM!4oc5np^az~bq?kf`X{Tu+ zpkR6UjPk=nb4zom531_!9jhKRpVmr!V%^~z`|zGf!_lTW3)R~6j=8pD#@AY0Q_nRL zWhS2-C|^)^Nx9+7wjGsc4~k9UtjzW2S;K!txUIBAs8>aop1j&S)Is6`apKWa!P;}; z9$IYTco4;#bDL1zcUN39s$}I_-c#k1^3FXy*i(7OAc3!LpBOecJzL;#W|wG=+_Er{ zD*lK$+F3!=?cIUC9O2=v0}50kX(d^&^*sr5qVjHgEzfaq$qN2~3m?QTd6A3Tu1Hq& zx~!|IeDU@4nq<~Z znl42&-y8U1N$CxnPHX#mJYH6PcAH*Bdc>#WO>C|Uz77^ zsK;MdrV)0YD?7z?>alQ4$?csl?%K}Ub36V7_X9O)#zUF3CxJqeTZ2r}MIypXlfrxs zKNW2d+9EKrM-VGgU&@zT@>Xn%)oT9zw-q_whf;WJzkMQk`K6LW>c>+JqiEs0&%fP~ zk6YWU)hT{I$tUE|yc>h3JLs7;eS@+UHI@OznRoBq+uyUdX-kSxYwacHj`wa&RUz*V zReOb)mGeHbD>aeDj&Y$!E}^~AFE)xl{K zROz?#-9jH5-Vl!8RwZQ1rNk+7+LK33_wpH&n$ojEQ?yR{Z1yb+b!j?cdEAu|;sV0B_+-QA4w6zL1qXn3vSHbMsa_u1p%Yq(rMo z_>{cS=G&ROp53hxNq*Q@A@rbQ@~Y9N#5Z zVH>}O-=}*-EG#mZ*W|hchmh|^a_-1yQW1q1KGG~hZLrQ4e4NlCa{G-Fcbdm6uCm&K z5H(_BfXpX*imjt5E&f4KQ`o$=dp-}%JA{H~wwk;xtS)kIugbk_TiUQpuY9EU?AiAU z*U!{uxR-6wQ#rZ+(3wU0BbttMm(%=hUQYZ9OSeGxMTw z=3XD34tZ_Pz71&nkC)fCm}W>?p{4D9F^GDZdujZD^#Y%QRn8XKSFg2Y@Hf>~*$?&g zWIP#Yt3OumEL>ic;+UJJow+(kpDepfa~AHx3gwEmhaMCf*6-|&_wyT}QWfr4n04Ir5zXC}uCi}^p7fJ~QX4`|VLb6& zPuHQI{>JAQ+tXC;UoIv4`4t_pvdMc%55F-bE^?SMOFz7bpy|^m#3wLSQo$&q!^W`x ziXUI;>qw8NfpD^3m1h5^efqVh)+%JhZsN2FC``D)U3iJ!$8R+G>sRFN;jB8gLNI zF4!owA^Vo^4NSngMc zhoSl{(WDmN@Wk$k<{stk3!T&RWJD#s#iW(Ts~APzpQCKCi#!}&kPI6DUiAX1PK`!E z99c#Ci2GT8_E*N?U4Z~efrP4`@ek~u040RF)R5-eg2%Z48x(F zS$tI`)gB3l3&^uf(sJf2R37uB!v@AGrE8K8hjvV zO)-T>@SOmX`Dyy@>xxL5HkZ3MJsP+ybE$8@tFN|T>&Le2yG4A}y%h=@4)4})4_^rz z0N2A4UpGhE9sBGjPw%qP)Cq1k>{@o2FCUiwfsXxTCC<|RXYz%$2lUdjLNxO7)t+81 zsvK_58@$(l!?>Ymcu8tuc=e7_pW)Ix0n?-DM$4uus1(oOlYXbDX)}#aKb~P1*>%!2 zyzxVlO`2h#Uuk^(P>a*;u5PhG*Z}BkN#AfHTXNp14a!1$@*}UMS6Qs(Quec%U_|B9 zmo~dJMO1WUh;z=|6punK&%~kg4y5|!%Z)Bi%26IzTqatu=ZJLn!)G3t{8wjvpB55n z$E`&7R{JhzS(l-d1xs4Aw~=lr+|k~UAvHa_%573rPZn=}TjS!C{#Ul-+T&EaELyC4 zzOJ#PVUMx^Um?GWN0@{eSu49B@#)5DyMqU^aMdQ1&v?TGSbYZL!=?Y1#lG#sDwkQ`oqImKt-jl00iPj*Iel>$X2 zdnNPUW|-YD*rGBVjmAGmZP-k%^gA?8o0^4u0*4>+*4Mt|-jH0%<1DjMRLZqdtjT1f z$o7@@ggyJZ1SSjy@waYq7tGZb6!Nv5qoB4wa^llE+e!Q46%_*}YRKyf9h>l)xJ&M6 zN9}k@`3K1v@2^RH${CR;Q9C5gaLAIL?K5uNH$7#U%FHC$q^FKXjy9dMHco9ZsoR`s zEcE%bnbn)wrmND0W}i29o5SfsHe4+0J#+U``i%P*4X4W$a_D=VOV`_Ww`^K-_zMFG zjz=ot&o-$RZY)sm)BmQXy{Jx^t=1`yNU>T?HyUcE4Q=WTFJDCs zi+{B!RNsx0(r+|_bYdBQV1%?8QR`@MK<@=t@}ZVHK|yDq1S@f!3F)M4uxqI&*h}w~ zo$o%$X^JdJo z@7AyHFQT1I`ey*lN=S754<(Kc8RkW_+Z|C3)Oq*P4{OK96VhEF!pfEDV0V z%KO0T62F&O(|t9*a4n`=`}iN%jp&*opW68;s^W1;!<#3JgKgcj%Y2`IYYTr?88Yo@ zk_bbLFG+!0US z!l4P`Q@^w($q(jUn)}(eD7GISp}((9TlO}6j@mmLFNpyGi>)8(wf2A7ux;q0^T^G% z1iygRGc&#Je_bp3!1T$i_NWil9c6jz9(|a6`{B&_&sxHTTkjPH_uc7hJ#|;Rba^A` z0C!XVEraIn$gtZg6Z|eO{w98D_g3{Q_cc?l%9-2OdM&tdaog-K7n)b>J1^0*t={p( z;p-bO=UuB?a-~j4;@u4^zL=Y76n@`;h7G z?Li(#w<*1NzqK>W$zhE+?!KQSJ@HIBehGvYTnNNrllL!&d^&w z-=8m2q-*iUhIN#T)IG1(&HeOXEw}xOHCL3&({=`}S>Y{uE>*F(d-=orP3c>1c&v0i z6u4Se&Un?`XpzFljroTOXSN>+=Dv0G0Bx}7WkT`^4axb(>Bl6G9lxSl@NT)>A%mB? z2VywtLNNe>+Vz-2dU87NgUbPfqDu%I};(Kie790viDH?wzZAAJ+P)vm@TXJ5YRq z%XqK6o`ZTrL*jYk<{tYT)v@IKwUDa?$77@UEpOhUt8F{JEK*xSPTK51#h2A`jkyyV zderwZHqI@+LO8~sWLuX%?S!dZ=CwtFCL!getFcC17bD8{SN_5)7ruQw=h^nvWq zfq%UBjg#@mJ0i-_%Gl!RU-a$nVGtIT(>qUU`0+B~x9O|VPKg8MV&MNg|cp5if|a-g{H zih}T({mUN|PnZ?bvP|oCLe>`AqyZDPPh4p`Hw9wUXiikv(~%s=+zs1~hT!;qQTC&RtM{ByOb`ku+XlT>ziCRnWNY&l`zTYUZX z!c!)m&zct7x}+43yc&O(WHOn0f3=OkwQ0T2BQrBsOnIGqXOrt-$%>~7{EfZ!jSDsk zq)jrQb&IUJz+Y~BDB`Sn*8!fdt1igeYv`W%;52WVQe1yVu0(c@R!st7d)vf>fx7wU z?TU164|ALkvj{%;DSNSkv*xTszr5`2&y?T2cMKoT^Pwdr;5n%&)4%=H%UXdz>B&Xo;b=@qixyMFvzQPN%q z3g7Hqt~KfEh7Yng@0g*Z^UX!gtR&s4I9U-!UaxU0HYQNXpE@hI`8_jA$3t{F39=mR-93=H9}I z_vl@FO9cDJDL$QlIB~gDJ*DMnylCm^+P%IUDOYCgF8r3NBE938VZNbIrh+SNRj^Ef z>HVnMsr2@#TbobY3ve%gTTvEiCf!wc;AVN35y5{@eAdDe5O@l}6#Nh2{_?P;Fo~%r?J{U3jF$Ty%y3(`6U7-gMS}Lcu|IbIluz^kKsDX&qBa>@NZ_deghl0KYc)&wxbzX#>C!{6i2QwLj`JQc(Vj ztoCPsAKF3S3akB5ohpO>5J(h04PXiWZitWCA6_)(hk6#sX0`tk@SA}D9;^Ms!4Lgf z;1o#IpVk59ga0GMN9FMX$c}0Mc<{rEy8^dZ?H>Yub?_H~ME6?_um%4ch>z;i9{}T4 zAeYtt@QM__8Ti{-?N0~4F8FIeqW-iI;0*q6|1kb9K>Dct0{{dFzZWD1NClXKzYDIT z_V)(Jfj^7Y{t4hW0)G>${X@Y&1^gu-QG2Zc*n$5Y#7FJ_yYXMgYX2YzqXOXzL89>K z04wnKLVT2-FF*nOJ6P?X4F1{RZ)3GT75r1de;TAPU_HPA{DTl5wde1~|7BMDlOT)| zgg*$96R-j>7yQp4K57pizy$DbW3_)0_>IATm(~7Z;MW9yIY?BW8Gw1<{{Zn(`~PnI z-(q!tV#k0ay;O0RI!Xj`Fh*FdqC{ej5MHtoEnCbq%;)1`_3WEx;c9 z{SY6u=kLaUJ*)l65JnZk9|ei(YbC%M{4XIsYJWe#MDXuowf|D^&jJ4fR{KYQUmN^Y zAVmNh0FL1Q0`XD%|8D$WWwn1Ggi(g@1t3xQG=L@epF@1q{)+(e;NQ+_|0Uoz0e=gt z{lmep1^x<YR)FJ!{km!D^0k+`pgZQXE+2cQt)&A`9 z-@$5sI)u@M@aI5^0X71h!9RkD^Kf9YJRBTSJQA2Z4~Mt}4-Yn;hl5+1#{!$k!(lGY z!-dJg+m+*ZCSwXb90W;thk61J2fqx@a?BjEF3!UV@s~sV@hHBW1P>pI&nwMCMDYW} zdAL!0u5mp2D88N~j|hq{EW>kw8UKG)%KxmCpR`mp^vVHsf(`N9SJEIhF1!UxMG0oZvF zf*ltzuymv_Sxg?AgehZMm;q*jSz_*3AjZJbu>IIY>fx`SBwGG0{ho^^t;f z&}SU$BaJaX;+P|L9d>m%VTT9ZAMN{yK)mtTWK18kz=+s#>;lHYv7Cd0lY@(cn}e5w zpF@~KoI{R-z@f)s&Ji&7?(93V?}Y9l10PxV$iZhkd?vt09zF{2nFt?q_`rew|A?E1 zhZhb$IQUtI0P7I^=@9zq5dMclv|L_p|4-aTT2}wyQsc~>f!y&^uWLbyYPsjM5 zjtT#8$p6Ek@E;x%|HEVS|IhdZ1Ox?zgiv#$CPU4Fs#ctJNU#n`)*;0@P`!;kP#umv z*!9Vl?0RL(pQ`sS-k+-bFW!Hs{t5q7{lYNn*8>~?Hvm%s#{g8oD}VxEH^3M05HK51 z4M+xj1#kl3%j>YYfLeeOU>|@4cnpvPYzDXiZUd$PN&(S;_W(ga24EiGIzSU}1P}&z z0hj>T3Ge~j2N(m+0FnSh0A9cJ^(}j8vu@gn*eRVaXBzWHZQSkOm+PK$d|l1IYl%0ND?+AEXdSA&~1pt^+wA_fyXx`xi zxfyb&v%h3qXc|3<3EZHDC@P00IEw02hEBAQFI{$k+j< z073zB0B?X1AOXM)umY$6f&k+H9)Rh97yuWfkOr^>Tm&cs_5%U|PXHM7U~#+`^FZ1> zxGgXaq%c4MzzL89peI5T0K5PhfG9u_zyXi|2mri*+(`Tp4PLG`qJ3j1MLb*{(F@b6g0ks|i z?0VvWbrqBogSuk^b`PN*{__Ln59JNrAFKt~))U|rUct8*yO@BhjFFIPg#1s_WcO*d{CD#-2_nMN7qD+Jm`^dVBQUVfFzgPXA0PoY zKwk*&#JW+_$%RMvQOXuD9=#ae7GlP0)f{|$rs#T??lX74Xf~t>e_5hlu;$QBpM{cJ z-<>;bAxKk@+dJ{Xd*2(eM?ZPw4$H07JW%%WlarIWrR=i{gSCp{j=RbOH$~Z%s!Vy3 z;+i(@#IyV79vbP*6~N^Jbd?x_#gTU?p!_aQH%%6VQ?*cYk$|Jho^P2-)%pwHAA z?sYlOPedq9^Qg`aA8DAsoKtb6weWTZV=+SV^byhN zdWQ}kd+>JNQhH&RXsM+_2k(T6S=9{=J^b0vcil~%FpsEOvT9tWjaPolYn7#Q#6Q#p zRY@^Q%xkaqyeyf(DHBk%=xmftIW_6P zd^Ax=r%m$SC6$Y$JsZVj4HMe;)0>Z{tkg-q{&3~aNP(33mt5`|jXyJ`_xO{vwj?J% z{#&vimq-l@9Vs}F?=UfH(VoI7Z{Nh!ikO|>b*R5w&sB+oGUWO&jW0Fy{;}ZOVqO)& z3%*{es^*Xudv;{Q(=uycmltnzH(*lVW-Y9gOIvSQH}h`KnHOf#;fsT73bbz8$K`E( z%riG-(w&d$C#N~QcYgBu=+jNA7UM0l76VdNc^p|^9m?pp;NF5HpnnV{YBEq6O7kF)ZkqS@a{++WY@`5e2qM)rX8^Xiss zA{M;K9xpntESJ!aZap*i#5CJ2^5L)iY3JoL@9!uc=3_WcEz|72E-*4t{_LSsp#cu_ zPv4R5T+3By>Rr*bO)E?&bg13!qC(JWqnnNGTWUn6)99xoF7Ll_Wm`k)58JBJzp&hHaD!4%Q*SH%z0qCz_wM90@%gI8Wx3OXkd~NE7>| z2hI{B)A=X86DijFs?FnMJeU?dv&~RWB~M6I<6O<6zHlSP9WzQ$O zQTHm)iOUNm3OsdZ9f{p(tMyeWRPEt*nNEHQ)7MiDm_L>eAoiKuoutv{K2xQk+y0=< z;^4!Z5qg1}Tb=AoW#?Hd?wg)=T}2`DMHWdcP{Wbaa<{>y?GxndDo&8Eq=#G8 zA80ogiS(AlTwYU`w|QEwAMBhnPdixJR-`%HWB!{33&R&p$vgK5+ng7gA|=!4s%S{o zZGHTN?{4ja#QX0yd$%;Ht4Z+e6;)6j7rE!yG5<~L$4_41ohPs;K{H-oVY9>R+3M4V zdiGBEbZuNvoW-&EONirVoGs6rSiDU$@Z6y{b4yn(njPczXk21+XxQg3jn*F?kWCE4 zo=BPME{M>kgu4*z+jYA4c=NtI`#K?Px~EsjxK53|=Yu(pbv7^C-z>YhsDB?JR9%Ii z%$F7SG*e??Z_#db-J}U(N&!YlnFRMsqO z^;zwpuq1<8$m39{t8J09)BU`JQu0mx?VLi-Bs6(1AMlV)+d+}rKUKCp{)kz#*CY$K z_5zy!H%ajwnp=&w3Qo4!HS1YO_IQ`^E;sM#`@Ifyei-y1pvj7+D7&f0a6+-4oyE0y zGl!m9i;US;l+_CFWO=vQ8wr(vwYf=5qMf&B5O0VU(yw)^apqoS6e4hF!}vA2GYnUX zrP^6O;0!zoy97$=XrdZ#-&9+oNg%G%=ccqUES7Q zuK&Uk>E;-otv)w2cO)fx_!o^NyJgPfOjKIQ8^fuWP*{ zCHf`HUmoZ@T3`L@K-bW^jeY!G8Ym39{;Mz+R*r6#_GTX5zqyX$>QL!{;eT@-h57N& zvpf(vN3dmoj~VlPrx_PKR^a31;T94U;1?4W5x#i?9Rp?_Zr0Xr)}EG57LL|q)A%{B zx{*Z419G%~S&pB>|6N*Rul=jW^7o|)E9O6ZZ`sH{UH?}z@Lvx9zw)yeYyWq&KN<_< zn>Q_BHDU?)VGJ_Qp%8l3X#WY`MjkWvQdwggUB@t6dk+GMLL){e5+aE)f#~aI|E1&q zwtn?Hee`#_^mlQXHTWFg$RAA(BvazZ%o7-P zZSLYFOEEn-*p3101JGg!;5C>QN{k~TrZ+2yP9qD#ll=eg@ponZKe_hPw&-8H?0r(U zMEj-aV5e=)J}fNE&EfCogM&aIh$D#egAgZtzX6;i5cmnqKG{r_soPF%&uti;SixBx;X2 z0W^k8i_xZ%X(2J8SWGmL#t0@yYm;e#^dJf?1dELfi6#b-vB1z+S~xif3n!B!wTV<1 z1Xv)I&LCs6;XI8FU(1MDSvy#JSYx)<9+;iAg%#%F?CycNczR%#&Q4C&mL8b1i-*0l zlRM_&W?^X!XI&Oz4$hYIF~|9q&JLKP^8#zk#m(8p#@-1c197qNu(ZS6tu5R@csk)> z-K<@l-8>+Qg{6o60(*~zn5CVy<$Pzjjia@jtu^MT&5GdU>|t-S5OepO>u%|0Ki3*k z_|BP0yLh4)b}rWb&hs%wY+xXn!N9$ibNwTL6GO=UBytFahQ)-E33S?zCkcT>DwPCg zHX#`Prwi%^B?K{Jqp9rhKz|o1lnm7x?H^1bQ-j#S$DaF#cyUB(EcvH+__@E2$M6rN zM?_M|F+auqe*SmyN%WvZ_Wcn5T{w2V{d}LF&;K&Mz0(2<2YV}jYiApOcMl8bO^ldm zGBJWcrUj9M2*eopzd1rIjhqk(9U4x=P$I~9wWAJa?dA_%$j!#V*$a!I(+LqoS|Wj2 zr36x944FY-kjXR?0zHl#9ZaRi!~gBY;K?u>&cWH;+RC5RSD~L`LBtp$fu-@`-oY{O ze|qdv1p#A^Dq{jZ5(umk;;FF<0{L-AX;Em!}@9$vkWILuL$gi7|g#&ARAVnPuIy@Ri!A~7~9!8^6DNtENs_w6n zW@iQ|kMGI;7=t-N+2e&B<2PrKW(p=o6VSu~IS8afwLyEZ^i*Id8BVjNR7fErG8*O~ z)IzKQ&b~`Lg%$)V40Wk7so*M$nFfsvbsYpv4Uu7~iQ1i|NHHuJrYmN{jh;rW$kcdv zgF>2&*x+DFAO*%E+&h8}Ns!2_QJ7tnr9BC#eyGIgknjD5eT6{@p@Bk-{_7Q}3rZjnx)&HQu{2;% zbXF{rQC&fZL8->TZG-858xCrm932NqFu?Br%gx3l_+voGIe`S#8W9--6XoCJgI!td z@{i_}eS(!y8Zm-QVAeS_2Xp@TU075ocGzFs`}?UeY5yvde+h`!7HUsgV02<6t}E!c zK=V>86^1jJKqH6HV<@QBF;;`KddiO#$W&%inJr9*iQxOqSj8H1W=vx-HO6Qa{PhZZ zxcueHkNSt40Ol& z04Y+aNU^Ytg$N=HoYC>i4h{O8)#$jQMP2w8m%jIW-5_$DZY9WEe}J z3YZtbe2Jq#{|t*AqH5Ll^QJM`7raVky)h zT`GkHi`r>y$$;rKQU`_@829-86ot%SU(;no2kH`OkS1zoWJE?#VsrxkOtO)Y)I>-t z8ng`ba^|KO=yO;;GYGh8*Z zwSh(qV%7{w1q?U%UIuC+G%x=D0-!L-R51ERlZ(JpAFY4p1TosYtc00y@Tm^8H6;R8 z4c}8>X9zk8nV^~!i{X|47_!V0NJWpy5Gqb6L0y%h4tkOSV~Y%}O-70!2%j0r$Z`+D zR2jzK@4(C>s6cYUXg6i|HdTm5Bd9X4MQnq>&)?s}&C}Z7|A$jH77p$|pM&L+wFiXz zBRwZ3CK_58Z$6;@!C(mx14E%8-Mub2VQY_f)@HVmzL>qJBN8g{y z9W2DCWXR%o6+od;K&erY&4xeJ`F;gAZANp1cTo&13KHJ?V7_F0pTv+Z2?px~x+H57 zWh*PZV>9Tn(O~F6iP;JsKaKhlI;s0p(HEhc`u(vM34|s=_`SUhL}VhEZ_W57<1CL^n!&Y(bMVM@{& zGe*ahA6DVaVuNM@(=9Oq6l^%IO2>r9ui=#m`jAdw<`yO%Fl)iUAu}~EJ0k?9$wh+c zHZW8NVWajc;O@@dj4A_AC zAuVPmQ2rUZXaT{{WpXr=g6`D)GcC(3e;~%Zn=#~oIU#}ahB}1FNArp6(lL3()KL#nM`IE1 z_CNGC0;*wlDv&C4&DcmVX8wbI$8J4K+_DWK;OgSnjfd9=v*DPrMms+`37LSFA6pV; z>9xVO3=BsbJa|-g?n9zsnMx#(V4aJPYu1A1kLVnHJqlU}-VjDF2-`7V35K_R(Yw71 zyu26s{QjrnzW?f+mhR~6OCmDJhSOmhjEs#L^SgBaPWqG43)kq?V{Ld@+tkb)ez$H( z^3s$aZe=usbt_+0J%h1}(x_M%zd>U*ynIyy$1IM1by+nKg0QWKUj_L2A~HZR+|pnz z+F+c+ptD3XJwY|n7+I^J*T@mbMuT%fQ{fD(_s~wNAO?LvH4t@#DG*FUaEy)}V?*Ha z2+{G-A;PhUSkUJ103wb8yErWU@Le$?^A@*ZkxqfT1%^YeAj@FYjy?0U+50_#|AX{l z2L!irMw6$L!qDE!m^=PW`mC&jMa_)Gnh#+88%c&a0XC!Q(9h95@W&ru46^maFM{CT z{|3uy6r92cC4|75i-u2{?9BZc5Ds{zv8)b~#`iqaKHr z1nlN#=M}mQ8R{nnDPML0S*L!eGgLPe*tEh83Vhwb)?Ak%35_d^E8Bnfx^gQ?;9|2NWOj%KuRNMk_n1dA(i>X=~? z4A)tyqKR~L)y-~m=G6MjM85ANF)u@PK^I2P?(t1u_T!=-Q$mX?*anZK!YcFo;tuUb zvL^A-0n9Qp*+wPIn%@UE9{!hCz_g_?hY>1Hd^9X4(Xbs&6`jHL5z}NCJNc=0{5cJ#VINPAM$_+i!yaD^u=*>;?p0$V<3pMNm4Y4tL(dFmE+0^T z!gnWFb3DsJVZbvt7+j!bU}27iDV!(5sunCYNCWK$VL!+GRTQSN^FuVWR)7H*4I7M< z!0_*i4?m@i&S9!LGZ{KMI&fR&V_ttpcUufR@bK3S9yhtzTh8}K_7t2GWU2%zymK*{ z6h4Mn0~dYsCfn$uF}G{KR~ZIN4EFQh?{f<~Jacasp7znm#$ydAhAz_tV(6-(KV)UH z4RY{B5TUO}k3Gpc0}aZu9Mu_MOa>EUsj%L`&F$~=5ZXOp1`I~kiJB`IEK%m72^tes zJU;cnQ?t>6p$IXQNcQ@Jsm7Tpv!eVN)y>`pgoj1Yg$Sy#-}8;vHU?81JXa5ejs=go znZqiANQLo$cC?t!Jg|_+5ZKyB-5Y8Ho)kiD!DNcIKt_#z<{lSbDs&$7owLE@U`K%&06T4XmN8;1=<#R*t6HF;2pD>%hAWOSY5{*7 z28&TN$KqAav;xM2U?~aaWmt`(=V4GMs2Nz9L-`K|%@1Y}e)I1)LcLay@CVz(p9%^V zW>l7~f@k2ToU_V-_8H;n4)hmzGDDcQSl^J9JH{W%4(hIu6MT^4eb*m7`hw2-i&N~4 zL4Ul##|D5dgLVvA7gVX#AY>1dq5i4x5(=tWSgpt6>J+WIz8hywo(>KeY&7{Zx9s5x z6&Y)=EsB=ZU=uJ06w9g`drK540)`|dj`)4Y5=|P+7|>%-(NGNb3FgusS-bFL0J6kN z8dWh21Xi)fPBsz5NcOD8+-xAzVk4L(8Pl_veGk`RkP=!;(b2y3KZQd^K@2$rRL>Mz zES0M9Hz^uS(?-uw+2LU;7Is?V&}2d+gwkQGQs9AQBEBkRcVR6VwDyx z8JHpQdCgZxN9*SxtmiGvqC?FvW3qG_+rUDTCaOfH@}hzPNQDR#b=26{cc)_pONV?jJm0 zKo5_ZTRs@8nwWQI-Wl&7F<@uM!l+oRv&c_nibk@gmf4b}zVNLh%w5;m7&_WRW%|f; zDwD7b4`h(Q)+}@9H4qlDOh4M`LJ#`KUPaag(+}f^5d+VM(M|)3O(c=P%w}@1u0cP* zrW={{po)2#K@28;&jpnp0tJW3j=49%$^@*F&}%iJ!9V(GG3*n;j6_hd_#z5r5Ix^V z%WYIPR6ynfC@h{BO~Z)Pcw*w8R7C#BhDV!-fuMYmHP2GbP)eA22tiB@LLxJ}K6~{4 zb67BH(FQnd+5ds(Y|I|Qej%|&;-SF4c#{@)=fY>k7jky=D2AFdovq0?G0Qw8GCu??O z1QNmgg9RFx)qk)#88l)fBb5H99%v&q2Au;5cw|o{;7`54&ZJ|OZtxmgJU$>`QwSCq zRCvP#?WqyqJX9M#WBxzvy?K1yMY;GtpU*j2nzj%W?sdWI0a}{2WT7l#p)~0R)h?k; z1?+ONH<2_sW}z(vJXi68ikPchMK5AhM6RL+MMc@7D2pOSL_|f5S6r^521P;O;_v-D zGxPa;PLh`8#_u1$S5G^c&+IeLJoC&m&pb1;zeu76H*I=N0;?+cCo)JGFw+d2mGW>hGTUqdRcI(zP@*zs3tUj~5t?isXvzhr_TSl*F_OGeSw& z{BA*I!S6bIXC#4e3li_2sT5W-lF(V!4>IpJ2W@7E0{5!0w@TL~KC!HlSRm~u?**1| z%A&ZLMOv}brO@4`0>wR%V#4DKzAv!+pXzaC1+EK(CqQMWX(v00lWV5+CkXZ!m0VP5 zbj3!eD+!x6wzf^whtR#+DVqx2bfs&kq&k_U#%>vcsE8?xzgzfxloPz#k*16GqN23E zD$`_Hh1d&$lP}aV9x8!~6r-kz;MQw0I$A~TTsPw?=eJhsVlOMw@+{ld?TTV+WZQjy zUxqQAVYFpX596%sjb)Qze5(e4|;@#sl5(tjaLYIkml0Ys}m-jy>#x zCs0P%innHj8~`GyL1krS8Gp*0qFJV9WDfkA-4sPACb*XBL zF5SL;aO-I0-?wkgSKhXLG1G1@`^wz{rmZU%5hhJOVxe#R`i-l$tXr*Z53oUTA3Qz=;`+(54s*0_v+qQ2#Z+>kiz~==ZRe`i)op9q*L5}YpS4HxU!I5qR#jx<&MxeCy0N<2_2AOMt<|TTx@`Nh zefL{O|E@0M(D9V5r*~}MdTiy1+Xc2&i%zw$+d&or@O@|UCiGY7c}caXf?d6qj=|QR zK~Q3_vwcvsgJe^qr+v^47*QV_>|;0(4W6xM_n>YAEsStM`VExM0$}?gNUURT@xsO4 zZ))J8ZQ#bq+Y|jw4t8k7LxQiWHjt-%P1m~Z%Li+=?m4S@g&hM;mF;zvYY5X2;Jpao z%|Cj_;IbotU}fdtw#C~PGZdCBXE2<)9P8+#2e0@isN+5dEyA6asNdoq zYeQ5EVN3Q?VGju|YG(s+>GSFOWRV1H(}5U=7tpooQoW#VF56L2ThS@UiUdw9T{>8~A9|TU3}mpZ2S6OT)%>8|zjLu41XW zY2(=zAk$>DOr$?LeNsE470Y!rNyWA&Yso|l4QWnN5S@IXGnSq(vsN%9lWwZ3ldqqk zqsg~&YwzwoJ)6!vYh&AaeeJDXxy=JR&uMPyZ&<UU=akXm#|_0GEHv&rHxV zS1*ewk&u3&QbMg{5|>WcR<&Gam_^m|t9Bd>Ek9xqDzWUs!6PmlWL`hzRJ!a`ncnx^ zS1fK=gL|e$$rp&&{z699n_d^u+a#>^MQv%>a%!ifmOt7^TCp$gqj#Wr@1*+KUHQUl zR@4sG)(&o)w{W?e7xqmGrpNDXpxm~Vm4bQO)?-yk7dYr9=8CxD%a+MNIRDsVj=Mm* zZtD@twqLmKW;Ay;BZD#(wXS;GNqB)`__p)UuQ}#e`@MBXX4a9l3y#@#)CK2XIG=H# z^TV?9FE|p;Vu#p5OZHug6tRN_R8%nJ7A|ta&_P6>$RK(LVPN|gZd;_~Z98A7!M1I# zLbc?(O&FGFTFt`(?x(DlT+UB0)06w9iFs~O#k|4lt<{UR!wOVXEG-D4%RE=`{0P)@ z(DH#TmPOv*98b^s8D6RRwnboK6{BjOc-W$6b9{>{m{N7(^sJChto!AMWKYO3MV5~m z5D`qw8db zjGCI6Uy+pPFyL5;2a;vl24&wj!DHCD*v1jG^en6_H+7k$)4C#Tt|J#ws0!D8Q+v&I zuTI%f(XQ-*B_eso>zaL&vE(RtK6G~ympgd`>>KlC2_Q0}T)(OC#C2Yh{hr6tfO#+? z9NBsBJId5MF2pxaS;~E70U6k_?R;on**;5Adbw2pzQ8QE?ucu*ZQk~Z7nWR3(DZVo z6oC;dbyZk(svCB*ZN{V>vhjqhBbJ%U=HH}~6hyHy*XR<33YKFTt3S}UP}C|^02s+; zvbiSCnY4Pv4t4`odj^3SyNi?5$7ZZ0JKMVDREe}kyqT#H!S(vXb5q5vBMbk`sIJ;>GIp zr_nSbVnjCLkwuGiIa48?N zd;Dx;>hVmff~p#-RQ^H-HanfjSkvh~r)wK(e^T|HGPY-StAe7vyFh#p-^+Q(NxsR1 zWk%1^ivEk~K?6;+A)?G8$K)H?%FGITKbz_&2N}tK%T6W9 z1)_m(Kjq701~XFWjA%w>Dv2Ss>gt>Mix39SuRN(mjg(V)(s={+4=#UB%tFIf9$yPv z2e8OjBhhV~6tE4I%J|S38^1DJiHe2_x1|qgsx7pY*Hh#i0w)u?-Q5-Q`zjVMbe>vi zq@DOxE}Xfs*)Kza`fyfJWaKistOBdx166}i3L5HW3Mj5B__B%arP~sXLryw-%NRxh z#ZnmS*TsPDXKxW*7_xTPAILCNd`oCD>e*qdJzxj>9?3aU+!u#ES8TOd>6s;a3_A=P z3$9^^2|PuL!lR7Rcq>XY2eojy$;=+PZf`@T7D?sfU7bTh`Ry3`!yRmxXI?)VJ4FuW#aEi1>HmS_~zFBsN^`qQ_qFU*3$nxXT=Ao-XPidU z{;QJAejl}VkVDfB&@JHop9LBI1Ff0qV(^@Kgbt1oF>z+-JT{9^&h^LOl}msDaz|C; zB&tPbnT^=fUc@9LNl-yKkvPx}Ha%smF&M=fBUVt7^TsB^%{&B<0AWNQnS@mSEo@vO_4L zW<}x-myD`Bx~k|V;v3g>HtSUuhUFadeO$6{gV2k3|0<@3z3kP>t`@y2C ztoy9&=0?$`2~`ELguf8lIECMXW>cH_I1yku0E$v}#ipMrR3%q1b&);a4>HE|nYy{6 zvXG}G*|YSQ0GZqQlPRO8SGHJ*ZqHREB8jpxGD}szLL4g$^mNf&Ui%4>4)Uy!LR=6k zS&-nhruP(p152JhssAKp3&piW+*mhXV^12GJ}0_&0JhbZq+=->M)5dHj9tA<2t*Xn zc-=FtevEo<-0IlzV^*usIKQv4utV6&&UrLx((C+SIRSq+$Sia;qALl&>}om(6%tQj zEVgPqT4)ceObWCkH8F_$dpP2d$WbE{CQ@Re%}&I#U?_~3Gt+^8< zYK1-Pl8EmPz%l(ObR9`E0>?zGX|PeF#~GuhB*&N(?5*4d38|)k0ImgA6w&nV;+u7g zoV(*%fKD`|Sx5B=Rf!S7)hbG*l@s*{--#}QEri@ykQQJJ>mf&J+Ki=v`wVsq3|Y9k zm~uqYr?y~;kq$P(-5xL#Ty6UR01%EgE&{C5qQYB7n<6~d7UmDC5a-V8^7W@v0pF~ z?bqpz@)z5AZr<8f*yPMS!^gZCDqs(^h!Wh@D0&*z-HcLIR>glNjWVNptt=jtGRgTa zWqtfXFS*JHeo^mJajRU#fcQ2apS#`^_--m>XXGMTj*owm`R@YNQ-*L=wo|K^VvVf$%@)m0Bp3J znVbm2u}f5j<*Yho?Ip{sQg`E>OTA8>Q;e^QmxQW{#z0R-RmWZyF zS4Y%I&2n}k++?ODom1o&>@!Z1A&7%S#7lS_Gw74}+^13WwZLfa;k;3=N~IwqcIpCv zdZHiY#u&j=LzOXP?+%XY;@8+VH<6AKgvNp_IsLVq(L^*g$PMpAfE5?J3rUTvUz+;3 zgHx{9QohpNBF8z1HqOB_>w*@MN;2`IlXc)Rdg5|L6Sa1cr5me`=ZYC2Wx~Alwhgo> z?u$@qil+T!$o(D>=kGtwxF3T}opQJ4X0Em6T9PcYhNX zAZa{zi(h|Fc6X~4q|fh(2WjHIs2Q7NbR8$0hF%M81v0j$?S0tv4ab@+O411)P3*;v zkS!U~Zfwb?#Ey>Fu(Jm>l&jLFjV5s|qvPVS+EZjSj6zhWx$T;1-^EcHVK1u{F=tfK z);*@GlRxpm^f+T{t_3J}5XZ0!44-u(sg;vN0UQvcHEs@8RD%Hd3Td9ZdzmF|LGf5f zc*dgunhqq`5!ea0kC>Au6y!n_-wR%E($9Nj4J+dix?Skexr7lT@xl^P)Q_=ol+N z*Fzlk+^b&SZ^gZ__O#3bZJCWoSS#reJ9#+zIY}n0`N{B&WWqB+Iy6^$M+(#LND8hl zrWu+H3HL4QGYyfrM`QT=9FE;rz!G~04;lHJZS2hnGWgNmR*1^xg5CdM^z4iM)Z$Fp zN}tbCj$X=S3y_0Fk-2@Sjysn;}bKo+i_vtuy8(yN((&z9`a!fadgnIfd z4lTXPU1DLI*!LqTQ|D&r&}>zpy<%cXGLA zf#@zS-^B^JFPvy*$&1>ZOo)4f1Mq~O-NOE#=p*UZ*3Ll@WF>7H;dsGcaLpwwaM$vsD8;(-al0f9>)_V%RF!tJ{Q)iSC|cDXDb2 zQfEZB&XCmuY%S-ydi#w70<*F%H53>`pus{VC3BAWw6)59r!9tcxL#SOQ~bs?n=P|s zBDP7ZEWPM*CKnVpG+&urBx4ZCy`9sJngx&A+3WC>S!-fBm8po+XZx3N2}hMsalOOE z~iX^fkvV+z58Q;YcxJ>e!<*M%6=4kVe`}lGI&> z(zlo0tX(t1=k>J8<+xxZ-5Fi4AlH*IOz11SbdpW$m`X{g=b2@Rs++_2|N)7OpgyrgXvHkFQzI{*#%y%n@A&VNoG*!F3inJO>7@JA-!{;=E$2A zS&dM!kX-_GLV@+#?Z{s`(1XIp;j#;xt1etT63OzxFRkDgqa_^3CRdj6NCDXBhlpUV zU5Ln%A7&cunuXH`CI;Z<)9a3Pz@h|lQ`By4j_x#)RYP@??0a&L3DaLBVo_+d$>K*= zN2+AzdQogS-C7)0(~|9u79)kQKb*JC^II7vV}AbnoE?{d!6l0aIy$5XTy z$UC~WLF zk3bWJh{((nG68B7z+QbkOyhhRwg@#kG@j*dXQT=3?RN1UPvi0>`w}oOPGQocWvnup zxS!bGay&DvN~fq^#S3s{E7;$#OK|xs+c7fH?=zCGY6sGNR_t8T7H5}S&qF0wNoFE>r0wi6MdjdElH^S4~4gK ztPiHkwnb#$?s`^)I`+vV*8nGYDTv`-uqccn;@(~k^h-0*1a_i8j~9*~=;irC(cneH zO=lUe;OUqQTbRhk^)eQ8tB}6Rm9ZiTfvDjUCLQsg=3#v9QNuhJ?FjiyVF#llCJ2HR z5jAkcelpi7_e03MtW$%X4~#N%cEij~6wo2aPG*O!) zre;zd-8&{xyh60~D@451e8Rqr{TJl zRkAJZL1R`nbX~v3uvE0v8^b46J_$L|j~eKfj2)QWTnq6|!Z*%!(zwmoE6FEIA9RmP zt7}}CUg8hjm>*VF2 zq_dDfQE_GRJZ2*~mNJgz`^wchE;mt#swnx034h^5wIifti8K`h6$Ziq8d0^S|MeCU z8H>_Nk-oz(+PmZ}T@>A6IhtVid8S6wxz-H>u7nYd=9w9+QgGrZNWlg4R+Ow7)55=6 zMqb-uJRdB}0$oMZo(0h{f(5b}V3~P65}+}xX7|k1TBk`UO>J$aGU|b(_BUYeLv=;! z#~m;tgqLS1WCf{BvPV9Ix3LkdpywEqS!^=3wMLe^f_1XXBk7YlC-aI&!2V+C?w7Dn zx|6z}^h`rcnaK!=eKt?_qjpR=+cD_?NPM0{1N3A9uo5KHQ!Yl%xR}XDI|@&Bn1r&C zOA32G)zhgU>H!->NYdRIIZndVor6~t67RjiCjTi1R%{IMicIYH z0UxdN^NJm{Fd5rdG|?fb*R((kMTI08bAAL`0jGPI&7o8>o(E_mmb+R9diNX=ZA+(* z?v4Uw977Yaey%2#x+zDJEX23Z#ZoqCKjDrgO2+Vezz9g~iKQuH(6=}l?zc&$dsxRO zsE1-Ae3|S-uvis!O;ub_@`8*UP0wU>-vA35*j~LuLYT>Y$5LXm|KMXHS%e%ElYu7X zQ&U9qcnGejhuN0VEB-9?b3)&U91%@o8Cy9$oC86W;^m4yyT$I&F7lAV1S~>bgsup0 zUobqmu@TvaM61?{C=885H5pM#93rW%8;g2mNup+uI$M3@!j-r_;9*=D$ZBhY9yu+^To1sa(gW21U z4*F6_t>xyx0cAd{W`U2B=(FjfAxhNOBP80=>S{yxGLubEoT{SOgAext~cxI8w9jYt8{1Q zk`rp0#Df__-^|$A`I@$7@p(<_lGn}@%hn;fufQ%TmQm`-##96e!UqD5ZRQIw=JL$yfaHG>r~8+D5>(? zOabo7cPZX-B;bk=8jJa)1x@^0esE%J_wiR$15mPS>h2TCgz5y!X0H>T+h&1O`c}oH zEF8g;mb2B>B9Ea{S{zArg7@|esMZT=jS3g`^6h(V1%QB5I&q%cdjv?#grY7ZZEzE= z&|X&7sLCaamL+97iZ)OOu10UwSvji2jP$-xL)DUt38b!zl`PVm)KbX|ZTFi|k!(li zze<_;V1WAdwJ=pC(dSeuB~WKbG%UCTSf%MC|hDUncYfk%& zDadMbiO|(LjkT6q;XA!DLqL+YGe~Uim3k$ucc|Wj+10lbU2lVc$~eVd)3U3-N)~6* z{;YyYMu*a8Me+zQ*i!W~0(rFccD6VX>T}0;?D^VNCh9A4OQ?)b>9ncpMTvLAbUDOO zSN&1h^N};(iEvR>W9p2c9KE2$AdbZ^P6la#1s~{uMYg3mW2;L` zL^6q-iIKeufEhE|covC5 zhYUZ-lSiA`;c*vyicnvXRxX`V(zMc^=toE-Z;!_K>tDEbk4Pm#+;$>bwz1+r zOUjCCUV!+r-D89O`4P_`$R3jHMiYTUvdum4iE$>$NKvTY%hWAHt27yv3Z?ds)Tm5A z6`}QZ1RY~CpGR?%?2TjcHF{IK97CEK-$W_h&ZR(GP}JVAl&MgzaiNj-Ui5y|h1yMV zDn&p?OwqM-bV#?FHMbU|EPlayN>}943Of{h2if(Q^p4#F-d_wR55yN%;vrAk z$f%sbC(5~WfK3~>aDcCK^QaWHHqqS|?h}n;Q_;k7a4-5-sI1w1G_@rXQn#$EAcg;u6RmWq z%S}b3^27pjdUrQG3jA=Q`XWkD1?DQ1Dp*}+*}!++?(_79hWgD}u2VnjY$M<9)1fHp z)ZMDQ7_9_t3AUoN!0fOdybQO9tJ0Yv{fxtYDB$d;*$pm-Vzv=tDkH4D@pm~8JQRf@fZ;+g5khJadWZI!FL z?JvLXuzXdL8rdBg>B7Z{TDp6b5>;Ge=Iuy;BgbJo_K4*gCb~wxZC5Ml%~EfcF+`7= zy~q?|rn?MD-s0QF8bhjWqZbsZ86>6`shNhn&ba=wVC7>Z}nT3~+goci&H0vcxJj9$l!jVuI(D_bz zVu#w=pD;FL?sF0zzpY9Z!>UHDu4cGfvvJef)9h)ccy4j}x-3fiWCKeV3@&S#&vY7@ z%6`Lpum>U2G_=+q71p@S$?}M0w_N-ZS4nVDR+08XtLlWfr7*y|RD@BjX=G965?f#W zJH;3E@Hed9)L@&}CvUbQaOo;zQs~9<_iCed>VfCgBbq%YtlM0oFfOpbxy`Le$WvG%z+-33c4W0WN<#LEdyEbr3 z80r6La9}TJ7ZG11gR62HHtud7 z_#(X#LOhhsg3=^VD;Ux;haNri_hDqE@=@>r??kQ)YqWv>+A} z*>=j^$8Ef;5)C=0h+Ks_*xn62-D_g0s0ds-`>SNRga)phjX@r1ua9L@GD1I;hI*P_GOJZ(F568UtXsdj3cW6* zE9R&ps@aXL?&~N!s_dvty}SV@qRw6}AC=da=o(u(Cuv&-?Eb6NE@K-anl=y#tw|(M zBOm;9sJHOs7mJnNPPl`Nh*{-YDFrjYg#|wcaZ@I|YcT{(Du8V|zt^pcUj z1}t!Jr(bD>LdD-Ta#Uswk`4qQkj-Ann}YRDkdv8#let=7&32khkIJmmOj&-C#-Vcsq}zRetS-mV|U41C4owY}xpIQQ2vFn9n`R zC(0bfSZtLHEBboc`xk<7)S-lg};?xw+s;UJuB-}XHYkW}~-3n8FGZy#p^jOv6N_{qBaplhV)dyZk zvMi;msA6&TA~RqHa%}N(_P|V!dtA1@P%wx$C_sFbM6ndtQe}~#r-qT;s5l2T`D5(4 zF)L(}jSQX0y>LM;F%fY0BO^D<7i~4vz>hZ9AQ&>eG*+7AB@l+S`7U{Cy2YuT2peH{ zf)eww;24>R9>h!mTk?WWY*@G1ACZ}|BM3j!4>IV@1xWC8={hsQHMdF;Y1V!#!1Il$ zm9=!{*m;YIm*rVA$yZTjSEN%8FCa$kLu*dnbCLUXHnedY0@&Orvq__fb25$kf?A`0 z1kPt=-Igpod>Fj#bc29NDAdPF?r7ICa!28YFMM zRZ?;LWj&EHI;9><8BL_BX-`x|z3BFeTjZ63#6ezIVoujYsJW$^>m%a3bYz{Ekw^OU zanu%h098zK`mq!vYLwM$o)I{yAX$}@fmE!+-_)YFD7d?#RFsUw%W6qajis`y!bmZ- z)4g0>a>NOBov!Rm@(hybp=JA_3vRN~39~@4m%P{wm%FiyP;7O&D_#7eO4nZ+kch&h zqzXE+)h=1EZoy^^4VSBvn5d44$hd+Sc1^jE-58NL8rfoR)ib?JLI@mX-f`@Jr}lf> z`lC&A%|F_hv?$*4vb3V|RvIm?h^esuUnMdO6~}*+Ic=ugV@MD-1_Xslb$NSKDeT zYXoouR&UvUMgn7QaG9CGt0jPs@d4zBrSYsu4jGM) zam6`hjS|T{>iBarwpp14NYi(7|FEvsnb*(=lg_hUri_$}2x~6Wi!M5Woyu=*ERYd~ zq(kN_^m|2jqSd%V=z8=~lF5-C$AWG|@qP2=b$%_B;6HV6*}h{^a?dzgH++k_t&}r? zYsg21u7VsgA7`QyelyfZl4)PHErY&_2RtoS$vmg=`LxFboa{c1>|6buM7IY;h_$>_myc<7fqZvX6__Id2azFRxY&B{FD~plA&lNrb3}? zkl)~tTiNX9P?Bj-$f)R4kuq9V3r$eA-J*j@B8u<>|0pc6XXG3W(}5YifT8Ory*4RY zxT`QLdLzRMN@eU@TJBSNijy4ka^qf<&@z;|!kZ)$jiV?@@h?fpX0@E1g}!TX zOVrh76I@%N6v2)B2*@VNUd8fKafGCWzT%<8$LEcfEuGdDEj%2o3LE5Ar)421HH+7g z`;G2JdrFQ#Ig2lLiLFd^RAH6x+nQK`?5staJMY3xgyU#XN@V>co=)( zv9qf8wC*(ZaxS%L*DBF3_X0yx%@&KPtFO;)uG_F`#m2J`1aD}l;|<_V*|n?8=^NLt zo*De!+ecRx%y0rN9`Eei%?;OjJ0^IabOVwBU?DA(wUIe%)oD_>HL}Yf)vB^Xxf+sY zst5Xd5idd{#aStv64kzmT&-=_ixK6D7mWoxzQBOCW61*65=zc!|ff2$rP zg--UH2{wg%={5e!mBHFHplPpZroY_APJ#!s3r6BAVSYnk06D zcZ2m4wPpdZedb<-+%l)(70t~{X9Qyzpb$VoSzeGbE4?Bnm(0ns9<4jhepEI?GE4;m zr(Uism5l(IR^)J;lg7OV*rSa@5SJ_S+R!TQ71|v!P+#dIZ+;4d=s2EC!srIxC}Lnt^00 zEwNIwj73--01}5&kWm4NyrXrP=Hr2)38sy2Ce<}jO1$AJ66+YQR&QxWySJ}evR6C= z;{c0Fl3}^_v$_Ny+~qFGy3LHdEm}SG3FW6=LJizXLyikAOGv{+3t@iE@p~Zh^6VIl zhH~MeIg;5@FOM0soBH~!2ua%@@@)yvL`?QPb-(zQ`fDc}X_5EDp~!3d?|^ zp)x6gi*l>0EY=d@TbZC}Tw+y-3;?n%`Y*DYOCX`K3pR)0da@-+I-=Y5T3IN<{4@V< zV3%2yV3@4o(h*h|xoG6!N*94dk7a zB)WK3(n8a`CKPOrZiU74z;8qd-pHf$;7#KEg~U@zEQE1V8Bqn8*+g*=wY;cytsI_H zv;gVQbjyf_RQ0h{$IeCk2ZB`AaV0@N^W^CaN5K>PW1z$8+6UDm@l;LKl9Q@xWE@v7 zsj5M=h{~6h$&j#SZW(`d05hj(c`C(DlxatIK{b5IJWJST>Ubt6M@2-_!%^(&J@R5? z<@`QW;```7ib$f?KI5VX(kGEsCc~}+^&?(eS;1R8~!4ZUM@qsv!!jB zG_WAbWDkeI`^}&*j^t3_lb|@#AznHxLt4i%c$I{!8$7Z~1nwLX<{-$lz0%Ywdz_px zkp1!Lqu7p%R)EQ31m|Rlrgxn(y4(|U!bsUA)l3s;UEx8Yk6{JT-6puSOHR6}KBH3z zqE1yc?epi0YL9QP4zoxn04VAlV0HwTI^P%;;1{w zu5th>n@~C0cO<{M6K;!3U;XW_F||`#=f?O{>JVY6U6INf#$aHa{m7`A76cHg}Hn2X&LHLSz7Nd77-9010co*1b+%C9H-F4v9#T zO7u?Jq$Qb2;o=pAqd+t%cw-_pxkZik;FDY}R5E}_85`wtq-ZXPjkDHCJ`2!MUtuxK z?n=h;2I7Z?3&#x@jNPr3Cmw%J?4rDut^tB%0V@NgTZwJP^tAUO+>(pIkPvjrEQ~0m zms98HNx8bIrjYL>+b_CrDEzFvTMCWizZ~CF&DEGGi}H>u7*#s&XGGNB0eSXop{ z(OqDGn+68D4q;utKvrAYSUl-{#XMwk!G#zUfMH+Iw*C1iIA`$ z%cat*x(?512YJCEoR`QoHg7&%WwdI5iKGu1I&-xpA&hz}m=|1({RDm49)k7hMcky~Nvl8V1o66cH6O(~kK0Zbl^VWi$IBiG64sP2>m8c&c=wX%hKuD!p4t<)hMS z)nHmxy(S}!E4((F&4@|R1pxUZwpJYYS)mHcLdc!Y!&WU)E_`vyz))p-v!oS+S)s6Q zUO_M^Nnr!2lyj9VLiHw52%;)M#DIjil+(F3GQq%G8m>9G`z;e-cU|GY?qTauOsgP{ z=S(5Eqp=+>Xok<7%H1gZoDm&TN6ecFK%_}}kxslFq|JtzaQ!Tu7ElP#NBDo)DOR+x9n7uEiiqx+xwxD66ZCs_@&DxmhdS)){cUa#zy3SsK5jC^Fu zGLegHVN){|GB8npwHhbNE5>o4hhQ~)BdbAuz01X(L}=m!mc@JS1Qee2HPMIcyv7Wi zh&zMoYUDTLn6MKeo>5noP?!`ZPgzungxt1E)`s@1OjL{>H;VSeS+X)Y^PHI-H*~+K zbE04i{jxa~s1P__IT_3H)slTg^L$z4slZjDR|qVHl}}));-m;OG1PoTW@zMsh3)O^ zHS)KUEO++ypzPeYx4VU%(jIO`$n2$QQfP?X$n!nQqBzyQ-uG5zaOcRYcN~RSClFkP!wwz|M zs?sc;5qjvL%DTE=H*jaRvy>B=*({ldJ4Lg3hI553L1)OcY+Gi7^oibfCoDn&{4>L( zI*|KEjBAcva@_GJocNlPUTfTa_dE=Rt^^A;&rk1c>TQ;H2R)-AYXX(|MA}o9QDnU+ zkDnv8a~Ia-p9bnfiFy<@*#Ef1anqeZ#_uDRF1d5n$zWj zU;aoFP8?}cwMUtte4a6l3r#Sx(3qM^6Vz53Gl5-Rh5xZ8$Q_G)ya|S=Ncn1$YCMe$ z-e|&_t@vMTQo|RM?sAiw_zz=pA0*!o67NeU%zw$4@h_X8=0@V*WK#7v88ddX2{N~s z)c7s<-%361FhTv@*xxc?`L~U!|0U^vNxI)r?xV(x{N4n^e=+HaznF0Buax(MNsl~1 zSx*=<{3Q01)bnqY_p}LWpEhRbX;U=uv`N=KLta6Usu2*C1*uF~U^26VaCmkQjL!~I z<#Pg)KPU(r4-QOuc@Wf>1KJ~lAa^AGCj_a{6N2=}NkLHlTEdqHLF01#mJ?PR1o^rk zHBuJ@BP)Vb?aIK6tPDc4in3M(!NjV-46Viey1?XK9|Xg%4@_eNX&M4E{Kg>2Y{kDh zC>m+TzdHzqx=H`;AT{xB?8}1G_+^2a7z)DNzXzuNy_EUhAk4gv^zS3=eYD{U>T*S3 zMz5qDS5nr8gJAT-)bS%hQ2UX<)C?0o9E2mo#2*e!{(AEG0&%}UxnB>$v9AXyb9)ff z+#Z;*yU6=)^1hq&-=ZzwqCVfk@7t6!2294N!+rSON4on0)A)lRocKWy)ILDk2ZD6@ z5ApjE;XeX)KMsm=KgND2NDnjq;1bpuRW^$FUnr!t_{47?hWWVSQ<6Y7Y*>p@Tz{d080b zUKSejiZHBsMQA3lbFT`6p;v`wJQD`y2;v?Y2E#{&sfi;)Q{F&+4a7S$3?|Md-L^2u zY$KmHg~8~X$nzY=&aN;R+eNy5^6n2!{ac9puVI*fYZ#2YH8ge{{cp;YgVT(~8vfKU z25w zpFqB^H9`4O#>*)t7(Iotu+oI1tEk5s@>)Y4n@PJF`%DwoKrC`wO;EFq@J8$=%5FA6 zuEm(qo#fMDQuz)Oj(70gNt!n^*4}JPrq_hIUh2JvdhWpD zd6=|6!w!PLq#0{zaHuEM;`OQ#d+Z1v5dFl7)QqiMMK9kX0`{R*+KqoK~UR9{O%yk^aMd;Phc{A zg!L14evoQBAKX5l@p?fJ)?7&Vg@nH&2*%z)9#;op{U?Zb9pzj{*mczJGeOFH799U9 z;h$qXd@cwku**j%XM}o;;D??60{Jp#C%zb@>c2#LZXy5MXv=LN*}XwHd@uHQY0DUK z8IQw1AT8r?jBz;p5cWfq^HbXVQ|j|8^7s|){8eCTe@oim(w^T1VfmxjzYhZQN7DW= z2q*qXy(R)v|9B9NK2F$QfXQD;`$S-JPX)oyQ?&CL;`}dVKN|$)&oahSjEz)i8X1oh z2Q%)<8B2#SZVw5~=pkV$_Y%g_OBu6=hGvAZI{Grkp^Vv=Gd^F<_{@YRKM((TjK!nF zRO8XO7ltXbC=7=e;a*Ihiy5y~jMM7Sj2#z-nd6CbVi=B{7@FLQFf3n5nP(9H4C-`&CpJ0LI?SDFqXT+V7!|=dcq*z13l;q!=XOvdLi|?kb1p^eBMI5 zd>ER4#r_C>AEDggFjf9h%K2EBs{a^qu*W_|ojy)ou7+M*9fswf2#vW08g)%*YCahT zjh_s|QS9+gLQAg2eJyqRJmr2K`^#ZC{$=9bNI732%~z;5cFkAAu<@&Wf0cAMVc$a7 zt)UtJ7O?s@^?f7^bB|EoBZU2m_`eR#$nPlo(J-iel=6R1-F}Zf5rz{JqoKLLY3QI{vF!;{2$nlw+74|e96FjfBydCf`%6SGogWKJrqnVT}X@>Doho=Vjm zk}|`ufcJQ1%G4j83P%o4nTexQVeJCkRjF{aDrNG=rc&d_LKaU;1+}N8QX{9OjM8^nK)ZejY#vMnBM%b(lT<4A6a0QkJszfhKT8EQB_!U6l@Ms?sKZTsj;(j<6Hbp*b;~ zsy{JpCSH>chfYeH@{`j+{mJQ6{$$ELC7l{NB^{1q*Dk|<8Tp=>4u;N3rzg&$tT(2E z(Kn` zLDJ>ZL1R8`MlMPR;}@mVHE-wp1AKoVZAL$sPM3cO`yHB%Q9k zo_2jc9hQFq_gBgHCcL(!xcrQyo&Ty zMX5&Y5o}XkWEx*f+}D!d@}i)2d65~dEecItk*Qr#6x6RMGWDy9Qsb+zSL45?$PBM3 zN@q@^j7>%9#?6%5NW3QEHy5Rbnu*iGcS}()j$OW!@^=!qgF1E;g^iu$^QNM3=uJgt zyo(99yC^l*O_@D>=LpYHk3s4?NI4f21;cMCN=>|l@QaFqiHqhblW zp!{~)@!g_u?7Kx~FGuBVDpxu?kMY07%GD9rr5C{_RW zqG06jxKqVJE>&zMii(5A;^Nd$ad9wFTnwLv|D0lznOhu`A5?4_%ZpQ^<;Bcv#X-$W zicQT+i-X#i67SIBAb)7FDL;(#hZURQ!;1s+s$w&KL~)Rrhdm$r=;CnXXugjr4r?n( zTZLbBu`x@EQ#DJ9gZd@KrvAj@VE9DJJBhH@5_dIm*O2EL;%&sqnq1X&tn?E7-_F5PSsvh9OSPd-nGT4@oTB?e-(#g|5Y56 ze~Nm2syJ2tY0CR_u^GiKzm9f%mhwJZY{sr9kIw_ATZ_}fx03!g+BHf&zE&JIex1B; zr%ksL{|?%C2ktwI!|^-G^KQbwMf&ejzwZ`@8JOz){nY*b;&lBFii4pCic_Nx(2gG# zr-pw>T_2>K50cN%sK?L9|JTJq?Qf~i)5T%UGo%e+5K|?lzNjP^D=IOyWhFtbtRx&S zD>3=mCBe|_5*ElMVf~zvAU~(X)ErupYCM#sw5o0ig+I_Va_c{4PlRbw8WHuoVt9xBsGFPft|UU_@5{VYCl1p zu=Cg>pP-GO#{M*Uev$IONItifq#AD{5A2#z>i0FizlMD~X}?ht4t<0Ae}la4pbmGG znB1Ku;mDnY-Bn^nz771oO^mi9=w9O9OBwf3ulq{O#Ql`}1JXQP5)MC1y&k5# z|E9eE#_v}pVePL;^FO5hZHXEF9eMqZJSWIwq9inrmB1^Nq{bd2pFfubna2rx95`W{ zCreWGPm=CQzW+vD{#H^n{I?P__P-^8dA1~Me3tKYY04Cpnp|mVI9^(s%FHS?nIlWX z+>xcGd~s>2W^t(*KfW}qIRX0w+$WX>xf4rGbUO+wGQX15}r8Jd$3w6s=w|r?(`>)vlN*-^cytkE_QS1rq z+`p6ezZ37hrD6WPlz(+8JT7^BfjWGFvc5tYUm@?CsNYSc>DsmOWEHoP36B!*<;jytTe3o9%XzF z_kE>7?f1#^`_$tBz8@$x6Tc}98~=wiza!5_vHyboS77?mSwZH|S*HH5S>e!Ov&{JR zS%KLx%M9(n&dv&Jv$Im8S;9MK1^LcdW}L4?IO<=COZ?3r( zGlG%d)%bq`Q?q-vx#atE%|)2;_3+p4f{*w?h|FQOsp*~#?=;(tcFi_pUxH7>G>ZL2 z;^o0T_p5)u{mzl!wV3-c4`Srkk3AkTU#6J5u??mX{;mcCzh~h0z_DU;-TiY-`Ui8( z;h2$~X>%6oZlJC=V!HTl#hgx@-(ViWJc{`}CM5oo56m?~uP8H(FDo;df1Yh74xVl5 zUpZULpZNA{^9|^q^CnC`=0eORnD=7F zsN0V*k6^CEeGO&=^Ht0@F!y2}#QZnrQOsX4=IwJ#8Rk&TzhEjbOE9Nk)?n%}Z^X1> zx-ok&Z^c}Sc|T?t^C`>?m|HP-VeZ2`g!vU_0`n9m{cm&3L710ej>H^;IT2Hfc^#$! zvjfwC>BS6U{tYvP`4Hx6%x5t-V!n>K2lD`C9P?Yu~e zFlS+!Ft{%^G2h2Li1{hz=a~P&JcfA!^9&{! zpJPfeb1;WtUX3{#Q;9hqvmA3eW&`F-%nnQkrXO=2CXcxo^B&CAn7c9eWB!Oq{d|sD zfH@hH#q7p>1oLUkotU3tO8$F}c@?G>(|~y^<_gRh<`K-_Fmrw}$IQo^gjt8#hUviU z#rzxQ1DLBZU&MSJ^ApSjrsxsI6Xs~lDVQyoH)Afvd>L~u<}aACU(&~zWtbLBH|AZK z_hUYZ`2xoO$}ch|&A(Di?o#=NN5^Hq;jQ>*zo94m8y_-+maD)2&YQgR&+tVT5J$d{ zV5IGL81P*#-}zB+_?z@oV9dW@4wj1GeiS3Wf5E69cIzG1@1=YT1$@J=8Q+*UV|p}3x!f~2waGyfBug?v*8=YI~ z^Q}qof1Gejp1(`DCBK~|b4~rClUb26q5a~kILn0m|>%r;CrrW>;x^U>LJ&EtRn``@Kb*YN!p_x)dd|J8keCh>i} z`<6C+k?$v5oUgcV@xO)dC!PP-+_(6DlkdMd|GV9{_*#7rE+*e?(#0+Du!F(Dsg1G_nRm>>no0z*XQjhOpvn6AGgk27K`Wbfq zjKDl1_EO*KLb{S17f-!pu6Y*o!I#?nUUlePGaqvkM)Lo`VROxoF;8IR_lkd-YhI1{ zG)8{M{qtP26mtPae)nPj5c9Q{S@-&v&ovF0M=|nS|BAV06XqF={QmYz?8E1pS7PM% zpV-5guRC}1tLB63TW;|nj`KKN+*Q~(24zIGn`H|A5A>oA|iB!83Rm;Vd%876Z?+Ke6vpL~>c`!u;%3pFnM zCH;mnQ^S+7$EOJwzhpiBUw)U=&NaWSo4emRO6JbVzn;I(F^zZ*-Oj!W`x2w`vRsPSQ^PT|SN9 zKLTDG&a`FA7@GJ@iTS6q?06CyHul*PvoPV#eXhiuz2HeZi(yNn_Yga+)T~qON_WB%)8IRE#H!6l<@5?+*6G1N$x@1QXUdSQ~!k$ zb6LVYj{D=dB}`~>?gnHYliW8ux6tH9!{3h4y`IIB+JXb3HBPQtYGz#CP4F=S2P=IyjE=Z;3eX zPJHj+o9%D&KJ1@5|HrUDzSsJXU?+di7xrHm*gx%iKKbk`&N1NL_)jdivadM*Xn(nb zVDsjB)B1bXrI>eNTz8Z!yyUO_itQvI-M34lX@#x@#W6qUqlZKuTeFyk2Z z%nW;GCU-08Fg0Ii{|n>cC*_IkPkxjA1fEI1(d8OXK!Il5>)*QljuqeT{>pIUFJJ%U z1Mj`$=|8MZ2j;A&EPo*M`-hG$$=oD~l3|i>lHZWAC+p*TvCqML0`qt1hScFTf3tWh z-)FR1T$ArX{KXdY#5)V;3@P8&U2Gr6e;@I#IG@FQ`+Sb&J304Ae4mf_OS}_YT0Wzn zk0W++9M_*)R^ZN0a!*WhkMAywZ}ya#Uk|ai{ZpB_92x2#-1jiwe@%QR=}S~8J{mvm zS4f8a@v^8b$#zNn;Sb00q_4)`XXorZ{?hJG|GUNOk*jPTza?DqXe8X{wHUYjP%lgV zO2LRL7&#AON-?7Kc?G7?t?5P&g)PFr99zOF_|9OT{xT6G5f8V7Pv98BJ(_Tj;I74J zIPoRi$Cqz0`Evg78^&bB#x1sScE*K!dsxEwWt@@k=lli4$Y8_?83lq09SkL{FcIPo-%Q{c?3B-n`nvhIi zfjtkuIYc;`@7H0<7}Sl}Log#k=s!f`mJo;krWzwZ4_Dz=h;r8foVBT7!|F$5)ZPz`fmg0B2u3@8#i|#8*g$Sp=OtfU_^2 z&I(*PCZ<1+uR^Q&p(%0zX9Ye&Uu!X9KVLfQ;hMx(;3>bx133HQc>{qfJe2$1Yin9XO<1zB{_$s>TlKB-k6<#+47+&wgr9^>&Tkk$ z`DL7u?QI{39f6 zApTAmRX(T4vkt)z7|lBX+ZPX84_C4MxfSzk

5$e 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